diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java index 54b0d696..c75a0149 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java @@ -97,7 +97,7 @@ public class ExternalSubCreator extends SubCreator { SubServer subserver = host.addSubServer(player, name, server.getBoolean("Enabled"), port, server.getColoredString("Motd", '&'), server.getBoolean("Log"), server.getRawString("Directory"), new Executable(server.getRawString("Executable")), server.getRawString("Stop-Command"), server.getBoolean("Hidden"), server.getBoolean("Restricted"), false); - if (!server.getBoolean("Editable", true)) subserver.setEditable(true); + if (server.getBoolean("Editable", true)) subserver.setEditable(true); if (server.getBoolean("Auto-Restart")) subserver.setAutoRestart(true); if (server.getString("Display").length() > 0) subserver.setDisplayName(server.getString("Display")); for (String group : server.getStringList("Group")) subserver.addGroup(group); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java index e3a203b9..e5e67179 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java @@ -75,11 +75,15 @@ public class InternalSubCreator extends SubCreator { history.add(template); for (String other : template.getBuildOptions().getStringList("Import", new ArrayList())) { if (templates.keySet().contains(other.toLowerCase())) { - YAMLSection config = build(thread, dir, other, templates.get(other.toLowerCase()), version, history); - if (config == null) { - throw new SubCreatorException(); + if (templates.get(other.toLowerCase()).isEnabled()) { + YAMLSection config = build(thread, dir, other, templates.get(other.toLowerCase()), version, history); + if (config == null) { + throw new SubCreatorException(); + } else { + server.setAll(config); + } } else { - server.setAll(config); + System.out.println(name + File.separator + "Creator > Skipping disabled template: " + other); } } else { System.out.println(name + File.separator + "Creator > Skipping missing template: " + other); @@ -232,7 +236,7 @@ public class InternalSubCreator extends SubCreator { SubServer subserver = host.addSubServer(player, name, server.getBoolean("Enabled"), port, server.getColoredString("Motd", '&'), server.getBoolean("Log"), server.getRawString("Directory"), new Executable(server.getRawString("Executable")), server.getRawString("Stop-Command"), server.getBoolean("Hidden"), server.getBoolean("Restricted"), false); - if (!server.getBoolean("Editable", true)) subserver.setEditable(true); + if (server.getBoolean("Editable", true)) subserver.setEditable(true); if (server.getBoolean("Auto-Restart")) subserver.setAutoRestart(true); if (server.getString("Display").length() > 0) subserver.setDisplayName(server.getString("Display")); for (String group : server.getStringList("Group")) subserver.addGroup(group); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/lang.yml b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/lang.yml index adc34ae3..efeb7218 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/lang.yml +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/lang.yml @@ -16,9 +16,11 @@ Lang: 'Command.Generic.Exception': '&cSubServers &4&l\u00BB&c An unexpected exception has occurred while parsing this command' 'Command.Generic.Invalid-Subcommand': '&cSubServers &4&l\u00BB&c Unknown sub-command: $str$' 'Command.Generic.Invalid-Permission': '&cSubServers &4&l\u00BB&c You need &4&n$str$&c to use this command' - 'Command.Generic.Unknown-Host': '&cSubServers &4&l\u00BB&c There is no Host with that name' - 'Command.Generic.Unknown-Server': '&cSubServers &4&l\u00BB&c There is no Server with that name' - 'Command.Generic.Unknown-SubServer': '&cSubServers &4&l\u00BB&c There is no SubServer with that name' + 'Command.Generic.Unknown-Proxy': '&cSubServers &4&l\u00BB&c There is no proxy with that name' + 'Command.Generic.Unknown-Host': '&cSubServers &4&l\u00BB&c There is no host with that name' + 'Command.Generic.Unknown-Group': '&cSubServers &4&l\u00BB&c There is no group with that name' + 'Command.Generic.Unknown-Server': '&cSubServers &4&l\u00BB&c There is no server with that name' + 'Command.Generic.Unknown-SubServer': '&cSubServers &4&l\u00BB&c There is no subserver with that name' 'Command.Help.Header': '&7SubServers &8&l\u00BB&7 Command Help:' 'Command.Help.Help': ' &7Help:&f $str$' 'Command.Help.List': ' &7List:&f $str$' @@ -40,11 +42,15 @@ Lang: 'Command.List.Header': '&7: ' 'Command.List.Divider': '&7, ' 'Command.List.Empty': '&7(none)' - 'Command.Info': '&7SubServers &8&l\u00BB&7 Info on &f$str$&7:' - 'Command.Info.Unknown': '&cSubServers &4&l\u00BB&c There is no Server with that name' - 'Command.Info.Invalid': '&cSubServers &4&l\u00BB&c That Server is not a SubServer' - 'Command.Info.Format': '- &f$str$&7: &r' - 'Command.Info.List': ' - $str$' + 'Command.Info': '&7SubServers &8&l\u00BB&7 Info on $str$&7: &r' + 'Command.Info.Unknown': '&cSubServers &4&l\u00BB&c There is no object with that name' + 'Command.Info.Unknown-Type': '&cSubServers &4&l\u00BB&c There is no object type with that name' + 'Command.Info.Unknown-Proxy': '&cSubServers &4&l\u00BB&c There is no proxy with that name' + 'Command.Info.Unknown-Host': '&cSubServers &4&l\u00BB&c There is no host with that name' + 'Command.Info.Unknown-Group': '&cSubServers &4&l\u00BB&c There is no group with that name' + 'Command.Info.Unknown-Server': '&cSubServers &4&l\u00BB&c There is no server with that name' + 'Command.Info.Format': ' -> &7$str$&7: &r' + 'Command.Info.List': ' - ' 'Command.Start': '&aSubServers &2&l\u00BB&a Starting SubServer' 'Command.Start.Unknown': '&cSubServers &4&l\u00BB&c There is no Server with that name' 'Command.Start.Invalid': '&cSubServers &4&l\u00BB&c That Server is not a SubServer' diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java index a2b83246..736b5846 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java @@ -7,6 +7,7 @@ import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection; import net.ME1312.SubServers.Bungee.Library.NamedContainer; import net.ME1312.SubServers.Bungee.Library.Util; import net.ME1312.SubServers.Bungee.Library.Version.Version; +import net.ME1312.SubServers.Bungee.Network.ClientHandler; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.chat.ClickEvent; @@ -229,38 +230,130 @@ public final class SubCommand extends CommandX { } } else if (args[0].equalsIgnoreCase("info") || args[0].equalsIgnoreCase("status")) { if (args.length > 1) { - Map servers = plugin.api.getServers(); - if (!servers.keySet().contains(args[1].toLowerCase())) { - sender.sendMessage("SubServers > There is no server with that name"); - } else if (!(servers.get(args[1].toLowerCase()) instanceof SubServer)) { - sender.sendMessage("SubServers > That Server is not a SubServer"); - } else { - SubServer server = (SubServer) servers.get(args[1].toLowerCase()); - sender.sendMessage("SubServers > Info on " + server.getDisplayName() + ':'); - if (!server.getName().equals(server.getDisplayName())) sender.sendMessage(" - Real Name: " + server.getName()); - sender.sendMessage(" - Host: " + server.getHost().getDisplayName() + ((!server.getHost().getName().equals(server.getHost().getDisplayName()))?" ("+server.getHost().getName()+')':"")); - sender.sendMessage(" - Enabled: " + ((server.isEnabled())?"yes":"no")); - sender.sendMessage(" - Editable: " + ((server.isEditable())?"yes":"no")); - if (server.getGroups().size() > 0) { - sender.sendMessage(" - Groups:"); - for (String group : server.getGroups()) sender.sendMessage(" - " + group); - } - if (server.isTemporary()) sender.sendMessage(" - Temporary: yes"); - sender.sendMessage(" - Running: " + ((server.isRunning())?"yes":"no")); - sender.sendMessage(" - Logging: " + ((server.isLogging())?"yes":"no")); - sender.sendMessage(" - Address: " + server.getAddress().getAddress().getHostAddress() + ':' + server.getAddress().getPort()); - sender.sendMessage(" - Auto Restart: " + ((server.willAutoRestart())?"yes":"no")); - sender.sendMessage(" - Hidden: " + ((server.isHidden())?"yes":"no")); - if (server.getIncompatibilities().size() > 0) { - List current = server.getCurrentIncompatibilities(); - sender.sendMessage(" - Incompatibilities:"); - for (SubServer other : server.getIncompatibilities()) sender.sendMessage(" - " + other.getDisplayName() + ((current.contains(other))?"*":"") + ((!other.getName().equals(other.getDisplayName()))?" ("+other.getName()+')':"")); - } - sender.sendMessage(" - Signature: " + server.getSignature()); + String type = (args.length > 2)?args[1]:null; + String name = args[(type != null)?2:1]; + Runnable getServer = () -> { + Server server = plugin.api.getServer(name); + if (server != null) { + sender.sendMessage("SubServers > Info on " + ((server instanceof SubServer)?"Sub":"") + "Server: " + ChatColor.WHITE + server.getDisplayName()); + if (!server.getName().equals(server.getDisplayName())) sender.sendMessage(" -> System Name: " + ChatColor.WHITE + server.getName()); + if (server instanceof SubServer) { + sender.sendMessage(" -> Enabled: " + ((((SubServer) server).isEnabled())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + if (!((SubServer) server).isEditable()) sender.sendMessage(" -> Editable: " + ChatColor.RED + "no"); + sender.sendMessage(" -> Host: " + ChatColor.WHITE + ((SubServer) server).getHost().getName()); + } + if (server.getGroups().size() > 0) sender.sendMessage(" -> Group" + ((server.getGroups().size() > 1)?"s:":": " + ChatColor.WHITE + server.getGroups().get(0))); + if (server.getGroups().size() > 1) for (String group : server.getGroups()) sender.sendMessage(" - " + ChatColor.WHITE + group); + sender.sendMessage(" -> Address: " + ChatColor.WHITE + server.getAddress().getAddress().getHostAddress()+':'+server.getAddress().getPort()); + if (server instanceof SubServer) sender.sendMessage(" -> Running: " + ((((SubServer) server).isRunning())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + if (!(server instanceof SubServer) || ((SubServer) server).isRunning()) { + sender.sendMessage(" -> Connected: " + ((server.getSubData() != null)?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + sender.sendMessage(" -> Players: " + ChatColor.AQUA + server.getPlayers().size() + " online"); + } + sender.sendMessage(" -> MOTD: " + ChatColor.WHITE + ChatColor.stripColor(server.getMotd())); + sender.sendMessage(" -> Signature: " + ChatColor.AQUA + server.getSignature()); + if (server instanceof SubServer) { + sender.sendMessage(" -> Logging: " + ((((SubServer) server).isLogging())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + if (((SubServer) server).isTemporary()) sender.sendMessage(" -> Temporary: " + ChatColor.GREEN + "yes"); + else sender.sendMessage(" -> Auto Restart: " + ((((SubServer) server).willAutoRestart())?ChatColor.GREEN+"enabled":ChatColor.RED+"disabled")); + } + sender.sendMessage(" -> Restricted: " + ((server.isRestricted())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + if (server instanceof SubServer && ((SubServer) server).getIncompatibilities().size() > 0) { + List current = new ArrayList(); + for (SubServer other : ((SubServer) server).getCurrentIncompatibilities()) current.add(other.getName().toLowerCase()); + sender.sendMessage(" -> Incompatibilities:"); + for (SubServer other : ((SubServer) server).getIncompatibilities()) sender.sendMessage(" - " + ((current.contains(other.getName().toLowerCase()))?ChatColor.WHITE:ChatColor.GRAY) + other); + } + sender.sendMessage(" -> Hidden: " + ((server.isHidden())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + } else { + if (type == null) { + sender.sendMessage("SubServers > There is no object with that name"); + } else { + sender.sendMessage("SubServers > There is no server with that name"); + } + } + }; + Runnable getGroup = () -> { + List group = plugin.api.getGroup(name); + if (group != null) { + sender.sendMessage("SubServers > Info on Group: " + ChatColor.WHITE + name); + sender.sendMessage(" -> Servers: " + ((group.size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + group.size())); + for (Server server : group) sender.sendMessage(" - " + ChatColor.WHITE + server.getDisplayName() + ((server.getName().equals(server.getDisplayName()))?"":" ("+server.getName()+')')); + } else { + if (type == null) { + getServer.run(); + } else { + sender.sendMessage("SubServers > There is no group with that name"); + } + } + }; + Runnable getHost = () -> { + Host host = plugin.api.getHost(name); + if (host != null) { + sender.sendMessage("SubServers > Info on Host: " + ChatColor.WHITE + host.getDisplayName()); + if (!host.getName().equals(host.getDisplayName())) sender.sendMessage(" -> System Name: " + ChatColor.WHITE + host.getName()); + sender.sendMessage(" -> Enabled: " + ((host.isEnabled())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + sender.sendMessage(" -> Address: " + ChatColor.WHITE + host.getAddress().getHostAddress()); + if (host instanceof ClientHandler && ((ClientHandler) host).getSubData() != null) sender.sendMessage(" -> Connected: " + ChatColor.GREEN + "yes"); + sender.sendMessage(" -> SubServers: " + ((host.getSubServers().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getSubServers().keySet().size())); + for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(" - " + ((subserver.isEnabled())?ChatColor.WHITE:ChatColor.GRAY) + subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')')); + sender.sendMessage(" -> Templates: " + ((host.getCreator().getTemplates().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getCreator().getTemplates().keySet().size())); + for (SubCreator.ServerTemplate template : host.getCreator().getTemplates().values()) sender.sendMessage(" - " + ((template.isEnabled())?ChatColor.WHITE:ChatColor.GRAY) + template.getDisplayName() + ((template.getName().equals(template.getDisplayName()))?"":" ("+template.getName()+')')); + sender.sendMessage(" -> Signature: " + ChatColor.AQUA + host.getSignature()); + } else { + if (type == null) { + getGroup.run(); + } else { + sender.sendMessage("SubServers > There is no host with that name"); + } + } + }; + Runnable getProxy = () -> { + Proxy proxy = plugin.api.getProxy(name); + if (proxy != null) { + sender.sendMessage("SubServers > Info on Proxy: " + ChatColor.WHITE + proxy.getDisplayName()); + if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(" -> System Name: " + ChatColor.WHITE + proxy.getName()); + sender.sendMessage(" -> Connected: " + ((proxy.getSubData() != null)?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + sender.sendMessage(" -> Redis: " + ((proxy.isRedis())?ChatColor.GREEN:ChatColor.RED+"un") + "available"); + if (proxy.isRedis()) sender.sendMessage(" -> Players: " + ChatColor.AQUA + proxy.getPlayers().size() + " online"); + sender.sendMessage(" -> Signature: " + ChatColor.AQUA + proxy.getSignature()); + } else { + if (type == null) { + getHost.run(); + } else { + sender.sendMessage("SubServers > There is no proxy with that name"); + } + } + }; + + if (type == null) { + getProxy.run(); + } else { + switch (type.toLowerCase()) { + case "p": + case "proxy": + getProxy.run(); + break; + case "h": + case "host": + getHost.run(); + break; + case "g": + case "group": + getGroup.run(); + break; + case "s": + case "server": + case "subserver": + getServer.run(); + break; + default: + sender.sendMessage("SubServers > There is no object type with that name"); + } } } else { - sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); + sender.sendMessage("SubServers > Usage: " + label + " " + args[1].toLowerCase() + " [proxy|host|group|server] "); } } else if (args[0].equalsIgnoreCase("start")) { if (args.length > 1) { @@ -422,7 +515,7 @@ public final class SubCommand extends CommandX { " List: /sub list", " Version: /sub version", " Reload: /sub reload [all|configs|templates]", - " Server Info: /sub info ", + " Info: /sub info [proxy|host|group|server] ", " Start Server: /sub start ", " Stop Server: /sub stop ", " Terminate Server: /sub kill ", @@ -457,8 +550,103 @@ public final class SubCommand extends CommandX { return new NamedContainer<>((list.size() <= 0)?plugin.api.getLang("SubServers", "Command.Generic.Invalid-Subcommand").replace("$str$", args[0]):null, list); } } else { - if (args[0].equals("info") || args[0].equals("status") || - args[0].equals("start") || + if (args[0].equals("info") || args[0].equals("status")) { + if (args.length == 2) { + List list = new ArrayList(); + List subcommands = new ArrayList(); + subcommands.add("proxy"); + subcommands.add("host"); + subcommands.add("group"); + subcommands.add("server"); + if (last.length() == 0) { + list.addAll(subcommands); + for (Proxy proxy : plugin.api.getProxies().values()) if (!list.contains(proxy.getName())) list.add(proxy.getName()); + for (Host host : plugin.api.getHosts().values()) if (!list.contains(host.getName())) list.add(host.getName()); + for (String group : plugin.api.getGroups().keySet()) if (!list.contains(group)) list.add(group); + for (Server server : plugin.api.getServers().values()) if (!list.contains(server.getName())) list.add(server.getName()); + } else { + for (String command : subcommands) { + if (!list.contains(command) && command.toLowerCase().startsWith(last)) + list.add(last + command.substring(last.length())); + } + for (Proxy proxy : plugin.api.getProxies().values()) { + if (!list.contains(proxy.getName()) && proxy.getName().toLowerCase().startsWith(last)) + list.add(last + proxy.getName().substring(last.length())); + } + for (Host host : plugin.api.getHosts().values()) { + if (!list.contains(host.getName()) && host.getName().toLowerCase().startsWith(last)) + list.add(last + host.getName().substring(last.length())); + } + for (String group : plugin.api.getGroups().keySet()) { + if (!list.contains(group) && group.toLowerCase().startsWith(last)) + list.add(last + group.substring(last.length())); + } + for (Server server : plugin.api.getServers().values()) { + if (!list.contains(server.getName()) && server.getName().toLowerCase().startsWith(last)) + list.add(last + server.getName().substring(last.length())); + } + } + return new NamedContainer<>((list.size() <= 0)?plugin.api.getLang("SubServers", "Command.Info.Unknown").replace("$str$", args[0]):null, list); + } else if (args.length == 3) { + List list = new ArrayList(); + if (last.length() == 0) { + switch (args[1].toLowerCase()) { + case "p": + case "proxy": + for (Proxy proxy : plugin.api.getProxies().values()) list.add(proxy.getName()); + break; + case "h": + case "host": + for (Host host : plugin.api.getHosts().values()) list.add(host.getName()); + break; + case "g": + case "group": + list.addAll(plugin.api.getGroups().keySet()); + break; + case "s": + case "server": + case "subserver": + for (Server server : plugin.api.getServers().values()) list.add(server.getName()); + break; + } + } else { + switch (args[1].toLowerCase()) { + case "p": + case "proxy": + for (Proxy proxy : plugin.api.getProxies().values()) { + if (!list.contains(proxy.getName()) && proxy.getName().toLowerCase().startsWith(last)) + list.add(last + proxy.getName().substring(last.length())); + } + break; + case "h": + case "host": + for (Host host : plugin.api.getHosts().values()) { + if (host.getName().toLowerCase().startsWith(last)) + list.add(last + host.getName().substring(last.length())); + } + break; + case "g": + case "group": + for (String group : plugin.api.getGroups().keySet()) { + if (group.toLowerCase().startsWith(last)) + list.add(last + group.substring(last.length())); + } + break; + case "s": + case "server": + case "subserver": + for (Server server : plugin.api.getServers().values()) { + if (server.getName().toLowerCase().startsWith(last)) + list.add(last + server.getName().substring(last.length())); + } + break; + } + } + return new NamedContainer<>((list.size() <= 0)?plugin.api.getLang("SubServers", "Command.Info.Unknown").replace("$str$", args[0]):null, list); + } else { + return new NamedContainer<>(null, Collections.emptyList()); + } + } else if (args[0].equals("start") || args[0].equals("stop") || args[0].equals("kill") || args[0].equals("terminate")) { List list = new ArrayList(); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java index 36b94a81..bcdc3e37 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java @@ -377,7 +377,7 @@ public final class SubPlugin extends BungeeCord implements Listener { int subservers = 0; System.out.println("SubServers > "+((status)?"Rel":"L")+"oading SubServers..."); if (!posted) Runtime.getRuntime().addShutdownHook(new Thread(() -> { - if (!running) { + if (running) { System.out.println("SubServers > Received request from system to shutdown"); try { shutdown(); diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/InternalUIRenderer.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/InternalUIRenderer.java index 522c3d76..56b4cacc 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/InternalUIRenderer.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/InternalUIRenderer.java @@ -400,7 +400,7 @@ public class InternalUIRenderer extends UIRenderer { block = createItem("STAINED_GLASS_PANE", "LIME_STAINED_GLASS_PANE", (short) 5); blockMeta = block.getItemMeta(); blockMeta.setDisplayName(ChatColor.GREEN + plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Version")); - blockMeta.setLore(Arrays.asList(ChatColor.GRAY + "v" + options.getVersion().toString())); + blockMeta.setLore(Arrays.asList(ChatColor.GRAY + "Minecraft " + options.getVersion().toString())); } block.setItemMeta(blockMeta); inv.setItem(32, block); diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Host.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Host.java index 4d58b896..d6e7b192 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Host.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Host.java @@ -272,6 +272,15 @@ public class Host { return raw.getSection("extra").clone(); } + /** + * Get the raw representation of the Host + * + * @return Raw Host + */ + public YAMLSection getRaw() { + return raw.clone(); + } + @Override @SuppressWarnings("unchecked") public String toString() { diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Proxy.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Proxy.java index 7b82af7a..b84bdb9c 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Proxy.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Proxy.java @@ -138,6 +138,15 @@ public class Proxy { return raw.getSection("extra").clone(); } + /** + * Get the raw representation of the Proxy + * + * @return Raw Proxy + */ + public YAMLSection getRaw() { + return raw.clone(); + } + @Override @SuppressWarnings("unchecked") public String toString() { diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Server.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Server.java index ea999695..c6c866e1 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Server.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/Server.java @@ -141,6 +141,15 @@ public class Server { return timestamp; } + /** + * Get the raw representation of the Server + * + * @return Raw Server + */ + public YAMLSection getRaw() { + return raw.clone(); + } + @Override @SuppressWarnings("unchecked") public String toString() { diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/SubServer.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/SubServer.java index 18d8e6f0..1e8f2142 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/SubServer.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/API/SubServer.java @@ -10,6 +10,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.*; public class SubServer extends Server { + private List incompatibilities = null; private Host host = null; /** @@ -37,6 +38,13 @@ public class SubServer extends Server { return obj instanceof SubServer && super.equals(obj); } + @Override + public void refresh() { + host = null; + incompatibilities = null; + super.refresh(); + } + /** * Starts the Server * @@ -231,6 +239,15 @@ public class SubServer extends Server { return raw.getBoolean("running"); } + /** + * Grabs the Host of the Server + * + * @return The Host Name + */ + public String getHost() { + return raw.getRawString("host"); + } + /** * Grabs the Host of the Server * @@ -345,6 +362,40 @@ public class SubServer extends Server { return new LinkedList(raw.getRawStringList("incompatible-list")); } + /** + * Get all listed incompatibilities for this Server + * + * @param callback Incompatibility List + */ + public void getIncompatibilities(Callback> callback) { + if (Util.isNull(callback)) throw new NullPointerException(); + StackTraceElement[] origin = new Exception().getStackTrace(); + Runnable run = () -> { + try { + callback.run(incompatibilities); + } catch (Throwable e) { + Throwable ew = new InvocationTargetException(e); + ew.setStackTrace(origin); + ew.printStackTrace(); + } + }; + + if (incompatibilities == null) { + LinkedList incompatableNames = new LinkedList(); + for (String subserver : raw.getRawStringList("incompatible-list")) incompatableNames.add(subserver.toLowerCase()); + SubAPI.getInstance().getSubServers(subservers -> { + LinkedList incompatibilities = new LinkedList(); + for (SubServer subserver : subservers.values()) + if (incompatableNames.contains(subserver.getName().toLowerCase())) + incompatibilities.add(subserver); + this.incompatibilities = incompatibilities; + run.run(); + }); + } else { + run.run(); + } + } + /** * Get incompatibility issues this server currently has * @@ -354,6 +405,24 @@ public class SubServer extends Server { return new LinkedList(raw.getRawStringList("incompatible")); } + /** + * Get incompatibility issues this server currently has + * + * @param callback Current Incompatibility List + */ + public void getCurrentIncompatibilities(Callback> callback) { + getIncompatibilities(incompatibilities -> { + LinkedList incompatableNames = new LinkedList(); + for (String subserver : raw.getRawStringList("incompatible")) incompatableNames.add(subserver.toLowerCase()); + + LinkedList current = new LinkedList(); + for (SubServer subserver : incompatibilities) + if (incompatableNames.contains(subserver.getName().toLowerCase())) + current.add(subserver); + callback.run(current); + }); + } + /** * If the Server is Temporary * diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java index b72d62d7..37367347 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java @@ -4,10 +4,7 @@ import net.ME1312.SubServers.Client.Bukkit.Graphic.UIRenderer; import net.ME1312.SubServers.Client.Bukkit.Library.Config.YAMLSection; import net.ME1312.SubServers.Client.Bukkit.Library.Util; import net.ME1312.SubServers.Client.Bukkit.Library.Version.Version; -import net.ME1312.SubServers.Client.Bukkit.Network.API.Host; -import net.ME1312.SubServers.Client.Bukkit.Network.API.Proxy; -import net.ME1312.SubServers.Client.Bukkit.Network.API.Server; -import net.ME1312.SubServers.Client.Bukkit.Network.API.SubServer; +import net.ME1312.SubServers.Client.Bukkit.Network.API.*; import net.ME1312.SubServers.Client.Bukkit.Network.Packet.*; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -180,49 +177,127 @@ public final class SubCommand implements CommandExecutor { } } else if (args[0].equalsIgnoreCase("info") || args[0].equalsIgnoreCase("status")) { if (args.length > 1) { - plugin.api.getServer(args[1], subserver -> { - if (subserver == null) { - sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Unknown")); - } else if (!(subserver instanceof SubServer)) { - sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Invalid")); - } else ((SubServer) subserver).getHost(host -> { - if (host == null) { - sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Invalid")); - } else { - sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info").replace("$str$", subserver.getDisplayName())); - if (!subserver.getName().equals(subserver.getDisplayName())) - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Real Name") + ChatColor.AQUA + subserver.getName()); - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Host") + ChatColor.AQUA + host.getName()); - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Enabled") + ((((SubServer) subserver).isEnabled())?ChatColor.GREEN+"yes":ChatColor.DARK_RED+"no")); - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Editable") + ((((SubServer) subserver).isEditable())?ChatColor.GREEN+"yes":ChatColor.DARK_RED+"no")); - if (subserver.getGroups().size() > 0) { - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Group")); - for (String group : subserver.getGroups()) - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.List").replace("$str$", ChatColor.GOLD + group)); - } - if (((SubServer) subserver).isTemporary()) sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Temporary") + ChatColor.GREEN+"yes"); - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Running") + ((((SubServer) subserver).isRunning())?ChatColor.GREEN+"yes":ChatColor.DARK_RED+"no")); - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Logging") + ((((SubServer) subserver).isLogging())?ChatColor.GREEN+"yes":ChatColor.DARK_RED+"no")); - if (plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false)) { - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Address") + ChatColor.AQUA + subserver.getAddress().getAddress().getHostAddress()); - } else { - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Port") + ChatColor.AQUA + subserver.getAddress().getPort()); - } - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Auto Restart") + ((((SubServer) subserver).willAutoRestart())?ChatColor.GREEN+"yes":ChatColor.DARK_RED+"no")); - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Hidden") + ((subserver.isHidden())?ChatColor.GREEN+"yes":ChatColor.DARK_RED+"no")); - if (((SubServer) subserver).getIncompatibilities().size() > 0) { - List current = new ArrayList(); - for (String other : ((SubServer) subserver).getCurrentIncompatibilities()) current.add(other.toLowerCase()); - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Incompatibilities")); - for (String other : ((SubServer) subserver).getIncompatibilities()) - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.List").replace("$str$", ((current.contains(other.toLowerCase()))?ChatColor.DARK_RED:ChatColor.RED) + other)); - } - sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Signature") + ChatColor.AQUA + subserver.getSignature()); + String type = (args.length > 2)?args[1]:null; + String name = args[(type != null)?2:1]; + + Runnable getServer = () -> plugin.api.getServer(name, server -> { + if (server != null) { + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info").replace("$str$", ((server instanceof SubServer)?"Sub":"") + "Server") + ChatColor.WHITE + server.getDisplayName()); + if (!server.getName().equals(server.getDisplayName())) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "System Name") + ChatColor.WHITE + server.getName()); + if (server instanceof SubServer) { + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Enabled") + ((((SubServer) server).isEnabled())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + if (!((SubServer) server).isEditable()) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Editable") + ChatColor.RED + "no"); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Host") + ChatColor.WHITE + ((SubServer) server).getHost()); } - }); + if (server.getGroups().size() > 0) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Group" + ((server.getGroups().size() > 1)?"s":"")) + ((server.getGroups().size() > 1)?"":ChatColor.WHITE + server.getGroups().get(0))); + if (server.getGroups().size() > 1) for (String group : server.getGroups()) sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.List") + ChatColor.WHITE + group); + if (plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false)) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Address") + ChatColor.WHITE + server.getAddress().getAddress().getHostAddress()+':'+server.getAddress().getPort()); + else sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Port") + ChatColor.AQUA.toString() + server.getAddress().getPort()); + if (server instanceof SubServer) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Running") + ((((SubServer) server).isRunning())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + if (!(server instanceof SubServer) || ((SubServer) server).isRunning()) { + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected") + ((server.getSubData() != null)?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Players") + ChatColor.AQUA + server.getPlayers().size() + " online"); + } + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "MOTD") + ChatColor.WHITE + ChatColor.stripColor(server.getMotd())); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Signature") + ChatColor.AQUA + server.getSignature()); + if (server instanceof SubServer) { + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Logging") + ((((SubServer) server).isLogging())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + if (((SubServer) server).isTemporary()) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Temporary") + ChatColor.GREEN + "yes"); + else sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Auto Restart") + ((((SubServer) server).willAutoRestart())?ChatColor.GREEN+"enabled":ChatColor.RED+"disabled")); + } + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Restricted") + ((server.isRestricted())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + if (server instanceof SubServer && ((SubServer) server).getIncompatibilities().size() > 0) { + List current = new ArrayList(); + for (String other : ((SubServer) server).getCurrentIncompatibilities()) current.add(other.toLowerCase()); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Incompatibilities")); + for (String other : ((SubServer) server).getIncompatibilities()) sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.List") + ((current.contains(other.toLowerCase()))?ChatColor.WHITE:ChatColor.GRAY) + other); + } + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Hidden") + ((server.isHidden())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + } else { + if (type == null) { + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Unknown")); + } else { + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Unknown-Server")); + } + } }); + Runnable getGroup = () -> plugin.api.getGroup(name, group -> { + if (group != null) { + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info").replace("$str$", "Group") + ChatColor.WHITE + name); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Servers") + ((group.size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + group.size())); + for (Server server : group) sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.List") + ChatColor.WHITE + server.getDisplayName() + ((server.getName().equals(server.getDisplayName()))?"":" ("+server.getName()+')')); + } else { + if (type == null) { + getServer.run(); + } else { + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Unknown-Group")); + } + } + }); + Runnable getHost = () -> plugin.api.getHost(name, host -> { + if (host != null) { + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info").replace("$str$", "Host") + ChatColor.WHITE + host.getDisplayName()); + if (!host.getName().equals(host.getDisplayName())) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "System Name") + ChatColor.WHITE + host.getName()); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Enabled") + ((host.isEnabled())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + if (plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false)) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Address") + ChatColor.WHITE + host.getAddress().getHostAddress()); + if (host.getSubData() != null) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected") + ChatColor.GREEN + "yes"); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "SubServers") + ((host.getSubServers().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getSubServers().keySet().size())); + for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.List") + ((subserver.isEnabled())?ChatColor.WHITE:ChatColor.GRAY) + subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')')); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Templates") + ((host.getCreator().getTemplates().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getCreator().getTemplates().keySet().size())); + for (SubCreator.ServerTemplate template : host.getCreator().getTemplates().values()) sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.List") + ((template.isEnabled())?ChatColor.WHITE:ChatColor.GRAY) + template.getDisplayName() + ((template.getName().equals(template.getDisplayName()))?"":" ("+template.getName()+')')); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Signature") + ChatColor.AQUA + host.getSignature()); + } else { + if (type == null) { + getGroup.run(); + } else { + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Unknown-Host")); + } + } + }); + Runnable getProxy = () -> plugin.api.getProxy(name, proxy -> { + if (proxy != null) { + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info").replace("$str$", "Proxy") + ChatColor.WHITE + proxy.getDisplayName()); + if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "System Name") + ChatColor.WHITE + proxy.getName()); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected") + ((proxy.getSubData() != null)?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Redis") + ((proxy.isRedis())?ChatColor.GREEN:ChatColor.RED+"un") + "available"); + if (proxy.isRedis()) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Players") + ChatColor.AQUA + proxy.getPlayers().size() + " online"); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Signature") + ChatColor.AQUA + proxy.getSignature()); + } else { + if (type == null) { + getHost.run(); + } else { + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Unknown-Proxy")); + } + } + }); + + if (type == null) { + getProxy.run(); + } else { + switch (type.toLowerCase()) { + case "p": + case "proxy": + getProxy.run(); + break; + case "h": + case "host": + getHost.run(); + break; + case "g": + case "group": + getGroup.run(); + break; + case "s": + case "server": + case "subserver": + getServer.run(); + break; + default: + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Unknown-Type")); + } + } } else { - sender.sendMessage(plugin.api.getLang("SubServers", "Command.Generic.Usage").replace("$str$", label.toLowerCase() + " " + args[0].toLowerCase() + " ")); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Generic.Usage").replace("$str$", label.toLowerCase() + " " + args[0].toLowerCase() + " [proxy|host|group|server] ")); } } else if (args[0].equalsIgnoreCase("start")) { if (args.length > 1) { @@ -477,7 +552,7 @@ public final class SubCommand implements CommandExecutor { plugin.api.getLang("SubServers", "Command.Help.Help").replace("$str$", label.toLowerCase() + " help"), plugin.api.getLang("SubServers", "Command.Help.List").replace("$str$", label.toLowerCase() + " list"), plugin.api.getLang("SubServers", "Command.Help.Version").replace("$str$", label.toLowerCase() + " version"), - plugin.api.getLang("SubServers", "Command.Help.Info").replace("$str$", label.toLowerCase() + " info "), + plugin.api.getLang("SubServers", "Command.Help.Info").replace("$str$", label.toLowerCase() + " info [proxy|host|group|server] "), plugin.api.getLang("SubServers", "Command.Help.SubServer.Start").replace("$str$", label.toLowerCase() + " start "), plugin.api.getLang("SubServers", "Command.Help.SubServer.Stop").replace("$str$", label.toLowerCase() + " stop "), plugin.api.getLang("SubServers", "Command.Help.SubServer.Terminate").replace("$str$", label.toLowerCase() + " kill "), diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Library/ChatColor.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Library/ChatColor.java new file mode 100644 index 00000000..63823f1c --- /dev/null +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Library/ChatColor.java @@ -0,0 +1,169 @@ +package net.ME1312.SubServers.Client.Sponge.Library; + +import org.spongepowered.api.text.Text; +import org.spongepowered.api.text.format.TextColor; +import org.spongepowered.api.text.format.TextColors; +import org.spongepowered.api.text.format.TextStyle; +import org.spongepowered.api.text.format.TextStyles; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.regex.Pattern; + +/** + * Color Code Converter Enum + */ +public enum ChatColor { + AQUA('b', TextColors.AQUA), + BLACK('0', TextColors.BLACK), + BLUE('9', TextColors.BLUE), + BOLD('l', TextStyles.BOLD), + DARK_AQUA('3', TextColors.DARK_AQUA), + DARK_BLUE('1', TextColors.DARK_BLUE), + DARK_GRAY('8', TextColors.DARK_GRAY), + DARK_GREEN('2', TextColors.DARK_GREEN), + DARK_PURPLE('5', TextColors.DARK_PURPLE), + DARK_RED('4', TextColors.DARK_RED), + GOLD('6', TextColors.GOLD), + GRAY('7', TextColors.GRAY), + GREEN('a', TextColors.GREEN), + ITALIC('o', TextStyles.ITALIC), + LIGHT_PURPLE('d', TextColors.LIGHT_PURPLE), + MAGIC('k', TextStyles.OBFUSCATED), + RED('c', TextColors.RED), + RESET('r', TextColors.RESET), + STRIKETHROUGH('m', TextStyles.STRIKETHROUGH), + UNDERLINE('n', TextStyles.UNDERLINE), + WHITE('f', TextColors.WHITE), + YELLOW('e', TextColors.YELLOW); + + private static HashMap map = new HashMap(); + private static boolean defaults = false; + private final Character minecraft; + private final TextColor color; + private final TextStyle[] style; + + ChatColor(Character minecraft, TextColor color) { + this(minecraft, color, TextStyles.RESET); + } + ChatColor(Character minecraft, TextStyle... style) { + this(minecraft, null, style); + } + ChatColor(Character minecraft, TextColor color, TextStyle... style) { + this.minecraft = minecraft; + this.color = color; + this.style = style; + } + + /** + * Get this color as a Minecraft Color Code + * + * @return Minecraft Color Code + */ + public String asMinecraftCode() { + return new String(new char[]{'\u00A7', minecraft}); + } + + /** + * Get the Sponge API equivalent of this value + * + * @return Sponge API Color (may be null for modifiers) + */ + public TextColor asTextColor() { + return color; + } + + /** + * Get the styles this color applies + * + * @return Sponge API Styles + */ + public TextStyle[] getStyles() { + return style; + } + + @Override + public String toString() { + return asMinecraftCode(); + } + + /** + * Parse Minecraft color codes starting with character + * + * @param character Character + * @param str String to parse + * @return Minecraft colored string + */ + public static String parseColor(char character, String str) { + for (ChatColor color : Arrays.asList(ChatColor.values())) { + str = str.replace(new String(new char[]{character, color.minecraft}), color.asMinecraftCode()); + } + return str; + } + + /** + * Convert Minecraft color codes to Sponge Text + * + * @param str Minecraft colored string + * @return Sponge Text + */ + public static Text convertColor(String str) { + return convertColor('\u00A7', str); + } + + /** + * Convert Minecraft color codes starting with character to Sponge Text + * + * @param character Character + * @param str String to parse + * @return Sponge Text + */ + public static Text convertColor(char character, String str) { + if (!defaults) { + for (ChatColor color : ChatColor.values()) map.put(color.minecraft, color); + defaults = true; + } + + if (str.contains(Character.toString(character))) { + LinkedList pieces = new LinkedList(Arrays.asList(str.split(Pattern.quote(Character.toString(character))))); + Collections.reverse(pieces); + + Text result = null; + int i = pieces.size(); + for (String piece : pieces) { + i--; + Text.Builder current; + if (i > 0 && piece.length() > 0) { + if (map.keySet().contains(piece.toCharArray()[0])) { + current = Text.builder(piece.substring(1)); + ChatColor color = map.get(piece.toCharArray()[0]); + current.style(color.getStyles()); + if (color.asTextColor() != null) current.color(color.asTextColor()); + } else current = Text.builder(character + piece); + } else current = Text.builder(piece); + + if (result != null) { + current.append(result); + } + result = current.build(); + } + if (result != null) return result; + } + return Text.of(str); + } + + /** + * Removes all Minecraft color codes from a string + * + * @param str String to parse + * @return String without color + */ + public static String stripColor(String str) { + for (ChatColor color : Arrays.asList(ChatColor.values())) { + str = str.replace(color.asMinecraftCode(), ""); + } + return str; + } +} diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Library/Config/YAMLValue.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Library/Config/YAMLValue.java index 703fdd11..68b365d0 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Library/Config/YAMLValue.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Library/Config/YAMLValue.java @@ -1,5 +1,6 @@ package net.ME1312.SubServers.Client.Sponge.Library.Config; +import net.ME1312.SubServers.Client.Sponge.Library.ChatColor; import net.ME1312.SubServers.Client.Sponge.Library.Util; import org.yaml.snakeyaml.Yaml; @@ -244,7 +245,7 @@ public class YAMLValue { */ public String asColoredString(char color) { if (Util.isNull(color)) throw new NullPointerException(); - if (obj != null) return asString().replaceAll(Pattern.quote(new String(new char[]{color})) + "([0-9A-Fa-fK-Ok-oRr])", "\u00A7$1"); + if (obj != null) return ChatColor.parseColor(color, asString()); else return null; } @@ -259,7 +260,7 @@ public class YAMLValue { if (Util.isNull(color)) throw new NullPointerException(); List values = new ArrayList(); for (String value : asStringList()) { - values.add(value.replaceAll(Pattern.quote(new String(new char[]{color})) + "([0-9A-Fa-fK-Ok-oRr])", "\u00A7$1")); + values.add(ChatColor.parseColor(color, value)); } return values; } else return null; diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Host.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Host.java index 2cffefcc..68e71028 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Host.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Host.java @@ -272,6 +272,15 @@ public class Host { return raw.getSection("extra").clone(); } + /** + * Get the raw representation of the Host + * + * @return Raw Host + */ + public YAMLSection getRaw() { + return raw.clone(); + } + @Override @SuppressWarnings("unchecked") public String toString() { diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Proxy.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Proxy.java index bf243143..5cd1192f 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Proxy.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Proxy.java @@ -138,6 +138,15 @@ public class Proxy { return raw.getSection("extra").clone(); } + /** + * Get the raw representation of the Proxy + * + * @return Raw Proxy + */ + public YAMLSection getRaw() { + return raw.clone(); + } + @Override @SuppressWarnings("unchecked") public String toString() { diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Server.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Server.java index 49415611..1bed358d 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Server.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/Server.java @@ -141,6 +141,15 @@ public class Server { return timestamp; } + /** + * Get the raw representation of the Server + * + * @return Raw Server + */ + public YAMLSection getRaw() { + return raw.clone(); + } + @Override @SuppressWarnings("unchecked") public String toString() { diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/SubServer.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/SubServer.java index 108b1765..e9aeb6c7 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/SubServer.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/API/SubServer.java @@ -13,6 +13,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.*; public class SubServer extends Server { + private List incompatibilities = null; private Host host = null; /** @@ -40,6 +41,13 @@ public class SubServer extends Server { return obj instanceof SubServer && super.equals(obj); } + @Override + public void refresh() { + host = null; + incompatibilities = null; + super.refresh(); + } + /** * Starts the Server * @@ -234,6 +242,15 @@ public class SubServer extends Server { return raw.getBoolean("running"); } + /** + * Grabs the Host of the Server + * + * @return The Host Name + */ + public String getHost() { + return raw.getRawString("host"); + } + /** * Grabs the Host of the Server * @@ -348,6 +365,40 @@ public class SubServer extends Server { return new LinkedList(raw.getRawStringList("incompatible-list")); } + /** + * Get all listed incompatibilities for this Server + * + * @param callback Incompatibility List + */ + public void getIncompatibilities(Callback> callback) { + if (Util.isNull(callback)) throw new NullPointerException(); + StackTraceElement[] origin = new Exception().getStackTrace(); + Runnable run = () -> { + try { + callback.run(incompatibilities); + } catch (Throwable e) { + Throwable ew = new InvocationTargetException(e); + ew.setStackTrace(origin); + ew.printStackTrace(); + } + }; + + if (incompatibilities == null) { + LinkedList incompatableNames = new LinkedList(); + for (String subserver : raw.getRawStringList("incompatible-list")) incompatableNames.add(subserver.toLowerCase()); + SubAPI.getInstance().getSubServers(subservers -> { + LinkedList incompatibilities = new LinkedList(); + for (SubServer subserver : subservers.values()) + if (incompatableNames.contains(subserver.getName().toLowerCase())) + incompatibilities.add(subserver); + this.incompatibilities = incompatibilities; + run.run(); + }); + } else { + run.run(); + } + } + /** * Get incompatibility issues this server currently has * @@ -357,6 +408,24 @@ public class SubServer extends Server { return new LinkedList(raw.getRawStringList("incompatible")); } + /** + * Get incompatibility issues this server currently has + * + * @param callback Current Incompatibility List + */ + public void getCurrentIncompatibilities(Callback> callback) { + getIncompatibilities(incompatibilities -> { + LinkedList incompatableNames = new LinkedList(); + for (String subserver : raw.getRawStringList("incompatible")) incompatableNames.add(subserver.toLowerCase()); + + LinkedList current = new LinkedList(); + for (SubServer subserver : incompatibilities) + if (incompatableNames.contains(subserver.getName().toLowerCase())) + current.add(subserver); + callback.run(current); + }); + } + /** * If the Server is Temporary * diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubCommand.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubCommand.java index ff88c9c9..9d85b59f 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubCommand.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubCommand.java @@ -2,13 +2,11 @@ package net.ME1312.SubServers.Client.Sponge; import com.google.gson.Gson; import net.ME1312.SubServers.Client.Sponge.Graphic.UIRenderer; +import net.ME1312.SubServers.Client.Sponge.Library.ChatColor; import net.ME1312.SubServers.Client.Sponge.Library.Config.YAMLSection; import net.ME1312.SubServers.Client.Sponge.Library.Util; import net.ME1312.SubServers.Client.Sponge.Library.Version.Version; -import net.ME1312.SubServers.Client.Sponge.Network.API.Host; -import net.ME1312.SubServers.Client.Sponge.Network.API.Proxy; -import net.ME1312.SubServers.Client.Sponge.Network.API.Server; -import net.ME1312.SubServers.Client.Sponge.Network.API.SubServer; +import net.ME1312.SubServers.Client.Sponge.Network.API.*; import net.ME1312.SubServers.Client.Sponge.Network.Packet.*; import org.spongepowered.api.Platform; import org.spongepowered.api.Sponge; @@ -68,7 +66,7 @@ public final class SubCommand implements CommandExecutor { .child(CommandSpec.builder() .description(Text.of("The SubServers Command - Info")) .executor(new INFO()) - .arguments(GenericArguments.optional(GenericArguments.string(Text.of("SubServer"))), GenericArguments.optional(GenericArguments.remainingJoinedStrings(Text.of("extra")))) + .arguments(GenericArguments.optional(GenericArguments.string(Text.of("Type"))), GenericArguments.optional(GenericArguments.string(Text.of("Name"))), GenericArguments.optional(GenericArguments.remainingJoinedStrings(Text.of("extra")))) .build(), "info", "status") .child(CommandSpec.builder() .description(Text.of("The SubServers Command - Start")) @@ -117,7 +115,7 @@ public final class SubCommand implements CommandExecutor { if (canRun(sender)) { Optional subcommand = args.getOne(Text.of("subcommand")); if (subcommand.isPresent()) { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Subcommand").replace("$str$", subcommand.get()))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Subcommand").replace("$str$", subcommand.get()))); return CommandResult.builder().successCount(0).build(); } else { if (sender.hasPermission("subservers.interface") && sender instanceof Player && plugin.gui != null) { @@ -128,7 +126,7 @@ public final class SubCommand implements CommandExecutor { return CommandResult.builder().successCount(1).build(); } } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.command"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.command"))); return CommandResult.builder().successCount(0).build(); } } @@ -139,7 +137,7 @@ public final class SubCommand implements CommandExecutor { sender.sendMessages(printHelp()); return CommandResult.builder().successCount(1).build(); } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.command"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.command"))); return CommandResult.builder().successCount(0).build(); } } @@ -153,7 +151,7 @@ public final class SubCommand implements CommandExecutor { if (container == null) container = Util.getDespiteException(() -> (PluginContainer) Platform.class.getMethod("getContainer", Class.forName("org.spongepowered.api.Platform$Component")).invoke(Sponge.getPlatform(), Enum.valueOf((Class) Class.forName("org.spongepowered.api.Platform$Component"), "IMPLEMENTATION")), null); if (container == null) container = Util.getDespiteException(() -> (PluginContainer) Platform.class.getMethod("getImplementation").invoke(Sponge.getPlatform()), null); - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Version").replace("$str$", "SubServers.Client.Sponge"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Version").replace("$str$", "SubServers.Client.Sponge"))); sender.sendMessage(Text.builder(" " + System.getProperty("os.name") + ' ' + System.getProperty("os.version")).color(TextColors.WHITE).append(Text.of(",")).build()); sender.sendMessage(Text.builder(" Java " + System.getProperty("java.version")).color(TextColors.WHITE).append(Text.of(",")).build()); sender.sendMessage(Text.builder(" " + container.getName() + ' ' + container.getVersion().get()).color(TextColors.WHITE).append(Text.of(",")).build()); @@ -175,15 +173,15 @@ public final class SubCommand implements CommandExecutor { } } if (updcount == 0) { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Version.Latest"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Version.Latest"))); } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Version.Outdated").replace("$name$", "SubServers.Client.Sponge").replace("$str$", updversion.toString()).replace("$int$", Integer.toString(updcount)))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Version.Outdated").replace("$name$", "SubServers.Client.Sponge").replace("$str$", updversion.toString()).replace("$int$", Integer.toString(updcount)))); } } catch (Exception e) {} }).submit(plugin); return CommandResult.builder().successCount(1).build(); } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.command"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.command"))); return CommandResult.builder().successCount(0).build(); } } @@ -195,15 +193,15 @@ public final class SubCommand implements CommandExecutor { plugin.api.getGroups(groups -> plugin.api.getHosts(hosts -> plugin.api.getServers(servers -> plugin.api.getMasterProxy(proxymaster -> plugin.api.getProxies(proxies -> { int i = 0; boolean sent = false; - Text div = Text.of(plugin.api.getLang("SubServers", "Command.List.Divider")); + Text div = ChatColor.convertColor(plugin.api.getLang("SubServers","Command.List.Divider")); if (groups.keySet().size() > 0) { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.List.Group-Header"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.List.Group-Header"))); for (String group : groups.keySet()) { Text.Builder msg = Text.builder(group).color(TextColors.GOLD).onHover(TextActions.showText( Text.builder(group + '\n').color(TextColors.GOLD).append( - Text.of(plugin.api.getLang("SubServers", "Interface.Group-Menu.Group-Server-Count").replace("$int$", new DecimalFormat("#,###").format(groups.get(group).size()))) + ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Group-Menu.Group-Server-Count").replace("$int$", new DecimalFormat("#,###").format(groups.get(group).size()))) ).build()) - ).onClick(TextActions.runCommand("/subservers open Server 1 " + group)).append(Text.of(plugin.api.getLang("SubServers", "Command.List.Header"))); + ).onClick(TextActions.runCommand("/subservers open Server 1 " + group)).append(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.List.Header"))); for (Server server : groups.get(group)) { Text.Builder message = Text.builder(server.getDisplayName()); @@ -217,8 +215,8 @@ public final class SubCommand implements CommandExecutor { hover.append(Text.builder(server.getName() + '\n').color(TextColors.GRAY).build()); } hover.append( - Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Temporary") + '\n'), - Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(server.getPlayers().size()))) + ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.SubServer-Temporary") + '\n'), + ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(server.getPlayers().size()))) ); } else if (((SubServer) server).isRunning()) { message.color(TextColors.GREEN); @@ -227,7 +225,7 @@ public final class SubCommand implements CommandExecutor { hover.append(Text.builder(server.getName() + '\n').color(TextColors.GRAY).build()); } hover.append( - Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(server.getPlayers().size())) + '\n') + ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(server.getPlayers().size())) + '\n') ); } else if (((SubServer) server).isEnabled() && ((SubServer) server).getCurrentIncompatibilities().size() == 0) { message.color(TextColors.YELLOW); @@ -236,7 +234,7 @@ public final class SubCommand implements CommandExecutor { hover.append(Text.builder(server.getName() + '\n').color(TextColors.GRAY).build()); } hover.append( - Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Offline")) + ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.SubServer-Offline")) ); } else { message.color(TextColors.RED); @@ -250,10 +248,10 @@ public final class SubCommand implements CommandExecutor { if (list.length() != 0) list += ", "; list += other; } - hover.append(Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Incompatible").replace("$str$", list) + ((((SubServer) server).isEnabled())?"":"\n"))); + hover.append(ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.SubServer-Incompatible").replace("$str$", list) + ((((SubServer) server).isEnabled())?"":"\n"))); } if (!((SubServer) server).isEnabled()) { - hover.append(Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Disabled"))); + hover.append(ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.SubServer-Disabled"))); } } if (plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false)) { @@ -269,8 +267,8 @@ public final class SubCommand implements CommandExecutor { hover.append(Text.builder(server.getName() + '\n').color(TextColors.GRAY).build()); } hover.append( - Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-External") + '\n'), - Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(server.getPlayers().size()))) + ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.Server-External") + '\n'), + ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(server.getPlayers().size()))) ); if (plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false)) { hover.append(Text.builder('\n' + server.getAddress().getAddress().getHostAddress()+':'+server.getAddress().getPort()).color(TextColors.WHITE).build()); @@ -283,15 +281,15 @@ public final class SubCommand implements CommandExecutor { msg.append(message.build()); i++; } - if (i == 0) msg.append(Text.of(plugin.api.getLang("SubServers", "Command.List.Empty"))); + if (i == 0) msg.append(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.List.Empty"))); sender.sendMessages(Text.builder(" ").append(msg.build()).build()); i = 0; sent = true; } - if (!sent) sender.sendMessage(Text.of(" " + plugin.api.getLang("SubServers", "Command.List.Empty"))); + if (!sent) sender.sendMessage(ChatColor.convertColor(" " + plugin.api.getLang("SubServers", "Command.List.Empty"))); sent = false; } - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.List.Host-Header"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.List.Host-Header"))); for (Host host : hosts.values()) { Text.Builder msg = Text.builder(host.getDisplayName()); Text.Builder hover = Text.builder(host.getDisplayName() + '\n'); @@ -301,21 +299,21 @@ public final class SubCommand implements CommandExecutor { if (!host.getName().equals(host.getDisplayName())) { hover.append(Text.builder(host.getName() + '\n').color(TextColors.GRAY).build()); } - hover.append(Text.of(plugin.api.getLang("SubServers", "Interface.Host-Menu.Host-Server-Count").replace("$int$", new DecimalFormat("#,###").format(host.getSubServers().keySet().size())))); + hover.append(ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Host-Menu.Host-Server-Count").replace("$int$", new DecimalFormat("#,###").format(host.getSubServers().keySet().size())))); } else { msg.color(TextColors.RED); hover.color(TextColors.RED); if (!host.getName().equals(host.getDisplayName())) { hover.append(Text.builder(host.getName() + '\n').color(TextColors.GRAY).build()); } - hover.append(Text.of(plugin.api.getLang("SubServers", "Interface.Host-Menu.Host-Disabled"))); + hover.append(ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Host-Menu.Host-Disabled"))); } if (plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false)) { hover.append(Text.builder('\n' + host.getAddress().getHostAddress()).color(TextColors.WHITE).build()); } msg.onClick(TextActions.runCommand("/subservers open Host/ " + host.getName())); msg.onHover(TextActions.showText(hover.build())); - msg.append(Text.of(plugin.api.getLang("SubServers", "Command.List.Header"))); + msg.append(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.List.Header"))); for (SubServer subserver : host.getSubServers().values()) { Text.Builder message = Text.builder(subserver.getDisplayName()); @@ -327,8 +325,8 @@ public final class SubCommand implements CommandExecutor { hover.append(Text.builder(subserver.getName() + '\n').color(TextColors.GRAY).build()); } hover.append( - Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Temporary") + '\n'), - Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(subserver.getPlayers().size()))) + ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.SubServer-Temporary") + '\n'), + ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(subserver.getPlayers().size()))) ); } else if (subserver.isRunning()) { message.color(TextColors.GREEN); @@ -336,14 +334,14 @@ public final class SubCommand implements CommandExecutor { if (!subserver.getName().equals(subserver.getDisplayName())) { hover.append(Text.builder(subserver.getName() + '\n').color(TextColors.GRAY).build()); } - hover.append(Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(subserver.getPlayers().size())))); + hover.append(ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(subserver.getPlayers().size())))); } else if (subserver.isEnabled() && subserver.getCurrentIncompatibilities().size() == 0) { message.color(TextColors.YELLOW); hover.color(TextColors.YELLOW); if (!subserver.getName().equals(subserver.getDisplayName())) { hover.append(Text.builder(subserver.getName() + '\n').color(TextColors.GRAY).build()); } - hover.append(Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Offline"))); + hover.append(ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.SubServer-Offline"))); } else { message.color(TextColors.RED); hover.color(TextColors.RED); @@ -356,10 +354,10 @@ public final class SubCommand implements CommandExecutor { if (list.length() != 0) list += ", "; list += other; } - hover.append(Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Incompatible").replace("$str$", list) + ((subserver.isEnabled())?"":"\n"))); + hover.append(ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.SubServer-Incompatible").replace("$str$", list) + ((subserver.isEnabled())?"":"\n"))); } if (!subserver.isEnabled()) { - hover.append(Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Disabled"))); + hover.append(ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.SubServer-Disabled"))); } } if (plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false)) { @@ -373,13 +371,13 @@ public final class SubCommand implements CommandExecutor { msg.append(message.build()); i++; } - if (i == 0) msg.append(Text.of(plugin.api.getLang("SubServers", "Command.List.Empty"))); + if (i == 0) msg.append(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.List.Empty"))); sender.sendMessage(Text.builder(" ").append(msg.build()).build()); i = 0; sent = true; } - if (!sent) sender.sendMessage(Text.of(" " + plugin.api.getLang("SubServers", "Command.List.Empty"))); - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.List.Server-Header"))); + if (!sent) sender.sendMessage(ChatColor.convertColor(" " + plugin.api.getLang("SubServers", "Command.List.Empty"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.List.Server-Header"))); Text.Builder msg = Text.builder(); for (Server server : servers.values()) if (!(server instanceof SubServer)) { Text.Builder message = Text.builder(server.getDisplayName()); @@ -390,8 +388,8 @@ public final class SubCommand implements CommandExecutor { hover.append(Text.builder(server.getName() + '\n').color(TextColors.GRAY).build()); } hover.append( - Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-External") + '\n'), - Text.of(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(server.getPlayers().size())))); + ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.Server-External") + '\n'), + ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(server.getPlayers().size())))); if (plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false)) { hover.append(Text.builder('\n' + server.getAddress().getAddress().getHostAddress()+':'+server.getAddress().getPort()).color(TextColors.WHITE).build()); } else { @@ -402,10 +400,10 @@ public final class SubCommand implements CommandExecutor { msg.append(message.build()); i++; } - if (i == 0) sender.sendMessage(Text.of(" " + plugin.api.getLang("SubServers", "Command.List.Empty"))); + if (i == 0) sender.sendMessage(ChatColor.convertColor(" " + plugin.api.getLang("SubServers", "Command.List.Empty"))); else sender.sendMessage(Text.builder(" ").append(msg.build()).build()); if (proxies.keySet().size() > 0) { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.List.Proxy-Header"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.List.Proxy-Header"))); msg = Text.builder(); Text.Builder message = Text.builder("(master)"); Text.Builder hover = Text.builder("(master)"); @@ -414,10 +412,10 @@ public final class SubCommand implements CommandExecutor { if (proxymaster != null) { hover.append( Text.builder('\n' + proxymaster.getName()).color(TextColors.GRAY).build(), - Text.of('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Master")), - Text.of('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Player-Count").replace("$int$", new DecimalFormat("#,###").format(proxymaster.getPlayers().size()))) + ChatColor.convertColor('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Master")), + ChatColor.convertColor('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Player-Count").replace("$int$", new DecimalFormat("#,###").format(proxymaster.getPlayers().size()))) ); - } else hover.append(Text.of('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Master"))); + } else hover.append(ChatColor.convertColor('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Master"))); message.onHover(TextActions.showText(hover.build())); msg.append(message.build()); for (Proxy proxy : proxies.values()) { @@ -429,7 +427,7 @@ public final class SubCommand implements CommandExecutor { if (!proxy.getName().equals(proxy.getDisplayName())) { hover.append(Text.builder('\n' + proxy.getName()).color(TextColors.GRAY).build()); } - hover.append(Text.of('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Player-Count").replace("$int$", new DecimalFormat("#,###").format(proxy.getPlayers().size())))); + hover.append(ChatColor.convertColor('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Player-Count").replace("$int$", new DecimalFormat("#,###").format(proxy.getPlayers().size())))); } else if (proxy.getSubData() != null) { message.color(TextColors.AQUA); hover.color(TextColors.AQUA); @@ -437,7 +435,7 @@ public final class SubCommand implements CommandExecutor { hover.append(Text.builder('\n' + proxy.getName()).color(TextColors.GRAY).build()); } if (proxymaster != null) { - hover.append(Text.of('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-SubData"))); + hover.append(ChatColor.convertColor('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-SubData"))); } } else if (proxy.isRedis()) { message.color(TextColors.WHITE); @@ -446,8 +444,8 @@ public final class SubCommand implements CommandExecutor { hover.append(Text.builder('\n' + proxy.getName()).color(TextColors.GRAY).build()); } hover.append( - Text.of('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Redis")), - Text.of('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Player-Count").replace("$int$", new DecimalFormat("#,###").format(proxy.getPlayers().size()))) + ChatColor.convertColor('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Redis")), + ChatColor.convertColor('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Player-Count").replace("$int$", new DecimalFormat("#,###").format(proxy.getPlayers().size()))) ); } else { message.color(TextColors.RED); @@ -455,7 +453,7 @@ public final class SubCommand implements CommandExecutor { if (!proxy.getName().equals(proxy.getDisplayName())) { hover.append(Text.builder('\n' + proxy.getName()).color(TextColors.GRAY).build()); } - hover.append(Text.of('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Disconnected"))); + hover.append(ChatColor.convertColor('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Disconnected"))); } message.onHover(TextActions.showText(hover.build())); msg.append(div, message.build()); @@ -465,7 +463,7 @@ public final class SubCommand implements CommandExecutor { }))))); return CommandResult.builder().successCount(1).build(); } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.command"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.command"))); return CommandResult.builder().successCount(0).build(); } } @@ -474,55 +472,141 @@ public final class SubCommand implements CommandExecutor { public final class INFO implements CommandExecutor { public CommandResult execute(CommandSource sender, CommandContext args) throws CommandException { if (canRun(sender)) { - Optional subserver = args.getOne(Text.of("SubServer")); - if (subserver.isPresent()) { - plugin.api.getServer(subserver.get(), server -> { - if (server == null) { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Info.Unknown"))); - } else if (!(server instanceof SubServer)) { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Info.Invalid"))); - } else ((SubServer) server).getHost(host -> { - if (host == null) { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Info.Invalid"))); - } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Info").replace("$str$", server.getDisplayName()))); - if (!server.getName().equals(server.getDisplayName())) - sender.sendMessage(Text.builder(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Real Name")).append(Text.builder(server.getName()).color(TextColors.AQUA).build()).build()); - sender.sendMessage(Text.builder(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Host")).append(Text.builder(host.getName()).color(TextColors.AQUA).build()).build()); - sender.sendMessage(Text.builder(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Enabled")).append(Text.builder((((SubServer) server).isEnabled())?"yes":"no").color((((SubServer) server).isEnabled())?TextColors.GREEN:TextColors.DARK_RED).build()).build()); - sender.sendMessage(Text.builder(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Editable")).append(Text.builder((((SubServer) server).isEditable())?"yes":"no").color((((SubServer) server).isEditable())?TextColors.GREEN:TextColors.DARK_RED).build()).build()); - if (server.getGroups().size() > 0) { - sender.sendMessage(Text.of(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Group"))); - for (String group : server.getGroups()) - sender.sendMessage(Text.of(" " + plugin.api.getLang("SubServers", "Command.Info.List").replace("$str$", "\u00A76" + group))); - } - if (((SubServer) server).isTemporary()) sender.sendMessage(Text.builder(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Temporary")).append(Text.builder("yes").color(TextColors.GREEN).build()).build()); - sender.sendMessage(Text.builder(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Running")).append(Text.builder((((SubServer) server).isRunning())?"yes":"no").color((((SubServer) server).isRunning())?TextColors.GREEN:TextColors.DARK_RED).build()).build()); - sender.sendMessage(Text.builder(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Logging")).append(Text.builder((((SubServer) server).isLogging())?"yes":"no").color((((SubServer) server).isLogging())?TextColors.GREEN:TextColors.DARK_RED).build()).build()); - if (plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false)) { - sender.sendMessage(Text.builder(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Address")).append(Text.builder(server.getAddress().getAddress().getHostAddress()+':'+server.getAddress().getPort()).color(TextColors.AQUA).build()).build()); - } else { - sender.sendMessage(Text.builder(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Port")).append(Text.builder(Integer.toString(server.getAddress().getPort())).color(TextColors.AQUA).build()).build()); - } - sender.sendMessage(Text.builder(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Auto Restart")).append(Text.builder((((SubServer) server).willAutoRestart())?"yes":"no").color((((SubServer) server).willAutoRestart())?TextColors.GREEN:TextColors.DARK_RED).build()).build()); - sender.sendMessage(Text.builder(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Hidden")).append(Text.builder((server.isHidden())?"yes":"no").color((server.isHidden())?TextColors.GREEN:TextColors.DARK_RED).build()).build()); - if (((SubServer) server).getIncompatibilities().size() > 0) { - List current = new ArrayList(); - for (String other : ((SubServer) server).getCurrentIncompatibilities()) current.add(other.toLowerCase()); - sender.sendMessage(Text.of(" " + plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Incompatibilities"))); - for (String other : ((SubServer) server).getIncompatibilities()) - sender.sendMessage(Text.of(" " + plugin.api.getLang("SubServers", "Command.Info.List").replace("$str$", '\u00A7' + ((current.contains(other.toLowerCase()))?'4':'c') + other))); - } + Optional t = args.getOne(Text.of("Type")); + Optional n = args.getOne(Text.of("Name")); + if (!n.isPresent()) { + Optional tmp = n; + n = t; + t = tmp; + } + + if (n.isPresent()) { + String type = (t.isPresent())?t.get():null; + String name = n.get(); + + Runnable getServer = () -> plugin.api.getServer(name, server -> { + if (server != null) { + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info").replace("$str$", ((server instanceof SubServer)?"Sub":"") + "Server")).toBuilder().append(Text.builder(server.getDisplayName()).color(TextColors.WHITE).build()).build()); + if (!server.getName().equals(server.getDisplayName())) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "System Name")).toBuilder().append(Text.builder(server.getName()).color(TextColors.WHITE).build()).build()); + if (server instanceof SubServer) { + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Enabled")).toBuilder().append(Text.builder((((SubServer) server).isEnabled())?"yes":"no").color((((SubServer) server).isEnabled())?TextColors.GREEN:TextColors.RED).build()).build()); + if (!((SubServer) server).isEditable()) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Editable")).toBuilder().append(Text.builder("no").color(TextColors.RED).build()).build()); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Host")).toBuilder().append(Text.builder(((SubServer) server).getHost()).color(TextColors.WHITE ).build()).build()); } - }); + if (server.getGroups().size() > 0) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Group" + ((server.getGroups().size() > 1)?"s":""))).toBuilder().append(Text.builder((server.getGroups().size() > 1)?"":server.getGroups().get(0)).color(TextColors.WHITE).build()).build()); + if (server.getGroups().size() > 1) for (String group : server.getGroups()) sender.sendMessage(ChatColor.convertColor(" " + plugin.api.getLang("SubServers", "Command.Info.List")).toBuilder().append(Text.builder(group).color(TextColors.WHITE).build()).build()); + if (plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false)) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Address")).toBuilder().append(Text.builder(server.getAddress().getAddress().getHostAddress()+':'+server.getAddress().getPort()).color(TextColors.WHITE).build()).build()); + else sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Port")).toBuilder().append(Text.builder(Integer.toString(server.getAddress().getPort())).color(TextColors.AQUA).build()).build()); + if (server instanceof SubServer) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Running")).toBuilder().append(Text.builder((((SubServer) server).isRunning())?"yes":"no").color((((SubServer) server).isRunning())?TextColors.GREEN:TextColors.RED).build()).build()); + if (!(server instanceof SubServer) || ((SubServer) server).isRunning()) { + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected")).toBuilder().append(Text.builder((server.getSubData() != null)?"yes":"no").color((server.getSubData() != null)?TextColors.GREEN:TextColors.RED).build()).build()); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Players")).toBuilder().append(Text.builder(server.getPlayers().size() + " online").color(TextColors.AQUA).build()).build()); + } + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "MOTD")).toBuilder().append(Text.builder(server.getMotd().replaceAll("\\u00A7[0-9a-fA-Fk-oK-ORr]", "")).color(TextColors.WHITE).build()).build()); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Signature")).toBuilder().append(Text.builder(server.getSignature()).color(TextColors.AQUA).build()).build()); + if (server instanceof SubServer) { + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Logging")).toBuilder().append(Text.builder((((SubServer) server).isLogging())?"yes":"no").color((((SubServer) server).isLogging())?TextColors.GREEN:TextColors.RED).build()).build()); + if (((SubServer) server).isTemporary()) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Temporary")).toBuilder().append(Text.builder("yes").color(TextColors.GREEN).build()).build()); + else sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Auto Restart")).toBuilder().append(Text.builder((((SubServer) server).willAutoRestart())?"enabled":"disabled").color((((SubServer) server).willAutoRestart())?TextColors.GREEN:TextColors.RED).build()).build()); + } + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Restricted")).toBuilder().append(Text.builder((server.isRestricted())?"yes":"no").color((server.isRestricted())?TextColors.GREEN:TextColors.RED).build()).build()); + if (server instanceof SubServer && ((SubServer) server).getIncompatibilities().size() > 0) { + List current = new ArrayList(); + for (String other : ((SubServer) server).getCurrentIncompatibilities()) current.add(other.toLowerCase()); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Info.Format").replace("$str$", "Incompatibilities"))); + for (String other : ((SubServer) server).getIncompatibilities()) sender.sendMessage(ChatColor.convertColor(" " + plugin.api.getLang("SubServers", "Command.Info.List")).toBuilder().append(Text.builder(other).color((current.contains(other.toLowerCase()))?TextColors.WHITE:TextColors.GRAY).build()).build()); + } + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Hidden")).toBuilder().append(Text.builder((server.isHidden())?"yes":"no").color((server.isHidden())?TextColors.GREEN:TextColors.RED).build()).build()); + } else { + if (type == null) { + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Info.Unknown"))); + } else { + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Info.Unknown-Server"))); + } + } }); + Runnable getGroup = () -> plugin.api.getGroup(name, group -> { + if (group != null) { + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info").replace("$str$", "Group")).toBuilder().append(Text.builder(name).color(TextColors.WHITE).build()).build()); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Servers")).toBuilder().append(Text.builder((group.size() <= 0)?"(none)":Integer.toString(group.size())).color((group.size() <= 0)?TextColors.GRAY:TextColors.AQUA).build()).build()); + for (Server server : group) sender.sendMessage(ChatColor.convertColor(" " + plugin.api.getLang("SubServers", "Command.Info.List")).toBuilder().append(Text.builder(server.getDisplayName() + ((server.getName().equals(server.getDisplayName()))?"":" ("+server.getName()+')')).color(TextColors.WHITE).build()).build()); + } else { + if (type == null) { + getServer.run(); + } else { + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Info.Unknown-Group"))); + } + } + }); + Runnable getHost = () -> plugin.api.getHost(name, host -> { + if (host != null) { + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info").replace("$str$", "Host")).toBuilder().append(Text.builder(host.getDisplayName()).color(TextColors.WHITE).build()).build()); + if (!host.getName().equals(host.getDisplayName())) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "System Name")).toBuilder().append(Text.builder(host.getName()).color(TextColors.WHITE).build()).build()); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Enabled")).toBuilder().append(Text.builder((host.isEnabled())?"yes":"no").color((host.isEnabled())?TextColors.GREEN:TextColors.RED).build()).build()); + if (plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false)) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Address")).toBuilder().append(Text.builder(host.getAddress().getHostAddress()).color(TextColors.WHITE).build()).build()); + if (host.getSubData() != null) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected")).toBuilder().append(Text.builder("yes").color(TextColors.GREEN).build()).build()); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "SubServers")).toBuilder().append(Text.builder((host.getSubServers().keySet().size() <= 0)?"(none)":Integer.toString(host.getSubServers().keySet().size())).color((host.getSubServers().keySet().size() <= 0)?TextColors.GRAY:TextColors.AQUA).build()).build()); + for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(ChatColor.convertColor(" " + plugin.api.getLang("SubServers", "Command.Info.List")).toBuilder().append(Text.builder(subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')')).color((subserver.isEnabled())?TextColors.WHITE:TextColors.GRAY).build()).build()); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Templates")).toBuilder().append(Text.builder((host.getCreator().getTemplates().keySet().size() <= 0)?"(none)":Integer.toString(host.getCreator().getTemplates().keySet().size())).color((host.getCreator().getTemplates().keySet().size() <= 0)?TextColors.GRAY:TextColors.AQUA).build()).build()); + for (SubCreator.ServerTemplate template : host.getCreator().getTemplates().values()) sender.sendMessage(ChatColor.convertColor(" " + plugin.api.getLang("SubServers", "Command.Info.List")).toBuilder().append(Text.builder(template.getDisplayName() + ((template.getName().equals(template.getDisplayName()))?"":" ("+template.getName()+')')).color((template.isEnabled())?TextColors.WHITE:TextColors.GRAY).build()).build()); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Signature")).toBuilder().append(Text.builder(host.getSignature()).color(TextColors.AQUA).build()).build()); + } else { + if (type == null) { + getGroup.run(); + } else { + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Info.Unknown-Host"))); + } + } + }); + Runnable getProxy = () -> plugin.api.getProxy(name, proxy -> { + if (proxy != null) { + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info").replace("$str$", "Proxy")).toBuilder().append(Text.builder(proxy.getDisplayName()).color(TextColors.WHITE).build()).build()); + if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "System Name")).toBuilder().append(Text.builder(proxy.getName()).color(TextColors.WHITE ).build()).build()); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected")).toBuilder().append(Text.builder((proxy.getSubData() != null)?"yes":"no").color((proxy.getSubData() != null)?TextColors.GREEN:TextColors.RED).build()).build()); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Redis") ).toBuilder().append(Text.builder(((proxy.isRedis())?"":"un") + "available").color((proxy.isRedis())?TextColors.GREEN:TextColors.RED).build()).build()); + if (proxy.isRedis()) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Players")).toBuilder().append(Text.builder(proxy.getPlayers().size() + " online").color(TextColors.AQUA).build()).build()); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Signature")).toBuilder().append(Text.builder(proxy.getSignature()).color(TextColors.AQUA).build()).build()); + } else { + if (type == null) { + getHost.run(); + } else { + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Info.Unknown-Proxy"))); + } + } + }); + + if (type == null) { + getProxy.run(); + } else { + switch (type.toLowerCase()) { + case "p": + case "proxy": + getProxy.run(); + break; + case "h": + case "host": + getHost.run(); + break; + case "g": + case "group": + getGroup.run(); + break; + case "s": + case "server": + case "subserver": + getServer.run(); + break; + default: + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Info.Unknown-Type"))); + } + } return CommandResult.builder().successCount(1).build(); } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Usage").replace("$str$", "/sub info "))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Usage").replace("$str$", "/sub info [proxy|host|group|server] "))); return CommandResult.builder().successCount(0).build(); } } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.command"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.command"))); return CommandResult.builder().successCount(0).build(); } } @@ -537,44 +621,44 @@ public final class SubCommand implements CommandExecutor { plugin.subdata.sendPacket(new PacketStartServer((sender instanceof Player)?((Player) sender).getUniqueId():null, subserver.get(), data -> { switch (data.getInt("r")) { case 3: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Start.Unknown"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Unknown"))); break; case 4: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Start.Invalid"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Invalid"))); break; case 5: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Start.Host-Disabled"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Host-Disabled"))); break; case 6: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Start.Server-Disabled"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Server-Disabled"))); break; case 7: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Start.Running"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Running"))); break; case 8: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Start.Server-Incompatible").replace("$str$", data.getString("m").split(":\\s")[1]))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Server-Incompatible").replace("$str$", data.getString("m").split(":\\s")[1]))); break; case 0: case 1: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Start"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start"))); break; default: plugin.logger.warn("PacketStartServer(" + ((sender instanceof Player)?((Player) sender).getUniqueId().toString():"null") + ", " + subserver.get() + ") responded with: " + data.getString("m")); - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Start"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start"))); break; } })); return CommandResult.builder().successCount(1).build(); } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.start." + subserver.get().toLowerCase()))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.start." + subserver.get().toLowerCase()))); return CommandResult.builder().successCount(0).build(); } } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Usage").replace("$str$", "/sub start "))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Usage").replace("$str$", "/sub start "))); return CommandResult.builder().successCount(0).build(); } } else { - sender.sendMessage(Text.of(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.command")))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.command"))); return CommandResult.builder().successCount(0).build(); } } @@ -589,35 +673,35 @@ public final class SubCommand implements CommandExecutor { plugin.subdata.sendPacket(new PacketStopServer((sender instanceof Player) ? ((Player) sender).getUniqueId():null, subserver.get(), false, data -> { switch (data.getInt("r")) { case 3: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Stop.Unknown"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Stop.Unknown"))); break; case 4: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Stop.Invalid"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Stop.Invalid"))); break; case 5: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Stop.Not-Running"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Stop.Not-Running"))); break; case 0: case 1: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Stop"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Stop"))); break; default: plugin.logger.warn("PacketStopServer(" + ((sender instanceof Player)?((Player) sender).getUniqueId().toString():"null") + ", " + subserver.get() + ", false) responded with: " + data.getString("m")); - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Stop"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Stop"))); break; } })); return CommandResult.builder().successCount(1).build(); } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.stop." + subserver.get().toLowerCase()))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.stop." + subserver.get().toLowerCase()))); return CommandResult.builder().successCount(0).build(); } } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Usage").replace("$str$", "/sub stop "))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Usage").replace("$str$", "/sub stop "))); return CommandResult.builder().successCount(0).build(); } } else { - sender.sendMessage(Text.of(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.command")))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.command"))); return CommandResult.builder().successCount(0).build(); } } @@ -632,35 +716,35 @@ public final class SubCommand implements CommandExecutor { plugin.subdata.sendPacket(new PacketStopServer((sender instanceof Player)?((Player) sender).getUniqueId():null, subserver.get(), true, data -> { switch (data.getInt("r")) { case 3: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Terminate.Unknown"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Terminate.Unknown"))); break; case 4: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Terminate.Invalid"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Terminate.Invalid"))); break; case 5: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Terminate.Not-Running"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Terminate.Not-Running"))); break; case 0: case 1: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Terminate"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Terminate"))); break; default: plugin.logger.warn("PacketStopServer(" + ((sender instanceof Player)?((Player) sender).getUniqueId().toString():"null") + ", " + subserver.get() + ", true) responded with: " + data.getString("m")); - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Terminate"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Terminate"))); break; } })); return CommandResult.builder().successCount(1).build(); } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.terminate." + subserver.get().toLowerCase()))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.terminate." + subserver.get().toLowerCase()))); return CommandResult.builder().successCount(0).build(); } } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Usage").replace("$str$", "/sub terminate "))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Usage").replace("$str$", "/sub terminate "))); return CommandResult.builder().successCount(0).build(); } } else { - sender.sendMessage(Text.of(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.command")))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.command"))); return CommandResult.builder().successCount(0).build(); } } @@ -676,35 +760,35 @@ public final class SubCommand implements CommandExecutor { plugin.subdata.sendPacket(new PacketCommandServer((sender instanceof Player)?((Player) sender).getUniqueId():null, subserver.get(), command.get(), data -> { switch (data.getInt("r")) { case 3: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Command.Unknown"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Command.Unknown"))); break; case 4: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Command.Invalid"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Command.Invalid"))); break; case 5: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Command.Not-Running"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Command.Not-Running"))); break; case 0: case 1: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Command"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Command"))); break; default: plugin.logger.warn("PacketCommandServer(" + ((sender instanceof Player)?((Player) sender).getUniqueId().toString():"null") + ", " + subserver.get() + ", /" + command.get() + ") responded with: " + data.getString("m")); - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Command"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Command"))); break; } })); return CommandResult.builder().successCount(1).build(); } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.command." + subserver.get().toLowerCase()))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.command." + subserver.get().toLowerCase()))); return CommandResult.builder().successCount(0).build(); } } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Usage").replace("$str$", "/sub command [Args...]"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Usage").replace("$str$", "/sub command [Args...]"))); return CommandResult.builder().successCount(0).build(); } } else { - sender.sendMessage(Text.of(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.command")))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.command"))); return CommandResult.builder().successCount(0).build(); } } @@ -721,49 +805,49 @@ public final class SubCommand implements CommandExecutor { if (name.isPresent() && host.isPresent() && template.isPresent() && version.isPresent() && port.isPresent()) { if (sender.hasPermission("subservers.host.create." + host.get().toLowerCase())) { if (Util.isException(() -> Integer.parseInt(port.get()))) { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Creator.Invalid-Port"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator.Invalid-Port"))); return CommandResult.builder().successCount(0).build(); } else { plugin.subdata.sendPacket(new PacketCreateServer((sender instanceof Player)?((Player) sender).getUniqueId():null, name.get(), host.get(), template.get(), new Version(version.get()), Integer.parseInt(port.get()), data -> { switch (data.getInt("r")) { case 3: case 4: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Creator.Exists"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator.Exists"))); break; case 5: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Creator.Unknown-Host"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator.Unknown-Host"))); break; case 6: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Creator.Invalid-Template"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator.Invalid-Template"))); break; case 7: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Creator.Invalid-Version"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator.Invalid-Version"))); break; case 8: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Creator.Invalid-Port"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator.Invalid-Port"))); break; case 0: case 1: - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Creator"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator"))); break; default: plugin.logger.warn("PacketCreateServer(" + ((sender instanceof Player)?((Player) sender).getUniqueId().toString():"null") + ", " + name.get() + ", " + host.get() + ", " + template.get() + ", " + version.get() + ", " + port.get() + ") responded with: " + data.getString("m")); - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Creator"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator"))); break; } })); return CommandResult.builder().successCount(1).build(); } } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.host.create." + host.get().toLowerCase()))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Generic.Invalid-Permission").replace("$str$", "subservers.host.create." + host.get().toLowerCase()))); return CommandResult.builder().successCount(0).build(); } } else { - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Generic.Usage").replace("$str$", "/sub create