From b2bbff069263498e8a2aaf5fe4e6da82392788fc Mon Sep 17 00:00:00 2001 From: ME1312 Date: Thu, 25 Oct 2018 16:47:44 -0400 Subject: [PATCH] Add autocompletes to Galaxi commands Commands here use cached data, in a simalar fasion to SubServers.Sync. --- .../Console/AnsiHTMLColorStream.java | 40 +- SubServers.Host/pom.xml | 2 +- .../ME1312/SubServers/Host/SubCommand.java | 397 +++++++++++++----- .../ME1312/SubServers/Sync/SubCommand.java | 2 +- 4 files changed, 318 insertions(+), 123 deletions(-) diff --git a/SubServers.Console/src/net/ME1312/SubServers/Console/AnsiHTMLColorStream.java b/SubServers.Console/src/net/ME1312/SubServers/Console/AnsiHTMLColorStream.java index 492aebf5..c53a2496 100644 --- a/SubServers.Console/src/net/ME1312/SubServers/Console/AnsiHTMLColorStream.java +++ b/SubServers.Console/src/net/ME1312/SubServers/Console/AnsiHTMLColorStream.java @@ -11,6 +11,7 @@ import java.util.List; public class AnsiHTMLColorStream extends AnsiOutputStream { private boolean concealOn = false; private static final String[] ANSI_COLOR_MAP = new String[]{"000000", "cd0000", "25bc24", "e1e100", "0000ee", "cd00cd", "00e1e1", "ffffff"}; + private static final byte[] BYTES_NBSP = " ".getBytes(); private static final byte[] BYTES_QUOT = """.getBytes(); private static final byte[] BYTES_AMP = "&".getBytes(); private static final byte[] BYTES_LT = "<".getBytes(); @@ -46,24 +47,31 @@ public class AnsiHTMLColorStream extends AnsiOutputStream { this.closingAttributes.clear(); } + private boolean nbsp = true; public void write(int data) throws IOException { - switch(data) { - case 34: - this.out.write(BYTES_QUOT); - break; - case 38: - this.out.write(BYTES_AMP); - break; - case 60: - this.out.write(BYTES_LT); - break; - case 62: - this.out.write(BYTES_GT); - break; - default: - super.write(data); + if (data == 32) { + if (nbsp) this.out.write(BYTES_NBSP); + else super.write(data); + nbsp = !nbsp; + } else { + nbsp = false; + switch(data) { + case 34: + this.out.write(BYTES_QUOT); + break; + case 38: + this.out.write(BYTES_AMP); + break; + case 60: + this.out.write(BYTES_LT); + break; + case 62: + this.out.write(BYTES_GT); + break; + default: + super.write(data); + } } - } public void writeLine(byte[] buf, int offset, int len) throws IOException { diff --git a/SubServers.Host/pom.xml b/SubServers.Host/pom.xml index 91b8d3b7..c8e8700d 100644 --- a/SubServers.Host/pom.xml +++ b/SubServers.Host/pom.xml @@ -20,7 +20,7 @@ net.ME1312.Galaxi GalaxiEngine - 18w43d + 18w43g compile diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java b/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java index 323801d6..98ef6156 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java @@ -13,14 +13,22 @@ import net.ME1312.SubServers.Host.Network.Packet.*; import java.lang.reflect.Field; import java.util.*; +import java.util.concurrent.TimeUnit; /** * Command Class */ public class SubCommand { + private static LinkedList proxyCache = new LinkedList(); + private static TreeMap> hostCache = new TreeMap>(); + private static LinkedList groupCache = new LinkedList(); + private static TreeMap serverCache = new TreeMap(); + private static long cacheDate = 0; + private SubCommand() {} @SuppressWarnings("unchecked") protected static void load(ExHost host) { + CompletionHandler defaultCompletor; new Command(host.info) { @Override public void command(CommandSender sender, String handle, String[] args) { @@ -34,6 +42,8 @@ public class SubCommand { } while ((i + 1) != args.length); } GalaxiEngine.getInstance().getConsoleReader().runCommand(sender, str); + } else { + sender.sendMessage("Usage: /" + handle + " [Args...]"); } } }.autocomplete((sender, handle, args) -> { @@ -84,7 +94,7 @@ public class SubCommand { boolean sent = false; String div = TextColor.RESET + ", "; if (groups.keySet().size() > 0) { - host.log.message.println("Group/Server List:"); + sender.sendMessage("Group/Server List:"); for (String group : groups.keySet()) { String message = " "; message += TextColor.GOLD + group + TextColor.RESET + ": "; @@ -107,15 +117,14 @@ public class SubCommand { i++; } if (i == 0) message += TextColor.RESET + "(none)"; - host.log.message.println(message); + sender.sendMessage(message); i = 0; sent = true; } - if (!sent) host.log.message.println(TextColor.RESET + "(none)"); + if (!sent) sender.sendMessage(TextColor.RESET + "(none)"); sent = false; } - ExHost h = host; - host.log.message.println("Host/SubServer List:"); + sender.sendMessage("Host/SubServer List:"); for (Host host : hosts.values()) { String message = " "; if (host.isAvailable() && host.isEnabled()) { @@ -141,12 +150,12 @@ public class SubCommand { i++; } if (i == 0) message += TextColor.RESET + "(none)"; - h.log.message.println(message); + sender.sendMessage(message); i = 0; sent = true; } - if (!sent) host.log.message.println(TextColor.RESET + "(none)"); - host.log.message.println("Server List:"); + if (!sent) sender.sendMessage(TextColor.RESET + "(none)"); + sender.sendMessage("Server List:"); String message = " "; for (Server server : servers.values()) if (!(server instanceof SubServer)) { if (i != 0) message += div; @@ -154,9 +163,9 @@ public class SubCommand { i++; } if (i == 0) message += TextColor.RESET + "(none)"; - host.log.message.println(message); + sender.sendMessage(message); if (proxies.keySet().size() > 0) { - host.log.message.println("Proxy List:"); + sender.sendMessage("Proxy List:"); message = " (master)"; for (Proxy proxy : proxies.values()) { message += div; @@ -171,7 +180,7 @@ public class SubCommand { } message += proxy.getDisplayName() + ((proxy.getName().equals(proxy.getDisplayName()))?"":" ("+proxy.getName()+')'); } - host.log.message.println(message); + sender.sendMessage(message); } }))))); } @@ -191,89 +200,88 @@ public class SubCommand { Runnable getServer = () -> host.api.getServer(name, server -> { if (server != null) { - host.log.message.println("SubServers > Info on " + ((server instanceof SubServer)?"Sub":"") + "Server: " + TextColor.WHITE + server.getDisplayName()); - if (!server.getName().equals(server.getDisplayName())) host.log.message.println(" -> System Name: " + TextColor.WHITE + server.getName()); + sender.sendMessage("SubServers > Info on " + ((server instanceof SubServer)?"Sub":"") + "Server: " + TextColor.WHITE + server.getDisplayName()); + if (!server.getName().equals(server.getDisplayName())) sender.sendMessage(" -> System Name: " + TextColor.WHITE + server.getName()); if (server instanceof SubServer) { - host.log.message.println(" -> Enabled: " + ((((SubServer) server).isEnabled())?TextColor.GREEN+"yes":TextColor.RED+"no")); - if (!((SubServer) server).isEditable()) host.log.message.println(" -> Editable: " + TextColor.RED + "no"); - host.log.message.println(" -> Host: " + TextColor.WHITE + ((SubServer) server).getHost()); + sender.sendMessage(" -> Enabled: " + ((((SubServer) server).isEnabled())?TextColor.GREEN+"yes":TextColor.RED+"no")); + if (!((SubServer) server).isEditable()) sender.sendMessage(" -> Editable: " + TextColor.RED + "no"); + sender.sendMessage(" -> Host: " + TextColor.WHITE + ((SubServer) server).getHost()); } - if (server.getGroups().size() > 0) host.log.message.println(" -> Group" + ((server.getGroups().size() > 1)?"s:":": " + TextColor.WHITE + server.getGroups().get(0))); - if (server.getGroups().size() > 1) for (String group : server.getGroups()) host.log.message.println(" - " + TextColor.WHITE + group); - host.log.message.println(" -> Address: " + TextColor.WHITE + server.getAddress().getAddress().getHostAddress()+':'+server.getAddress().getPort()); - if (server instanceof SubServer) host.log.message.println(" -> Running: " + ((((SubServer) server).isRunning())?TextColor.GREEN+"yes":TextColor.RED+"no")); + if (server.getGroups().size() > 0) sender.sendMessage(" -> Group" + ((server.getGroups().size() > 1)?"s:":": " + TextColor.WHITE + server.getGroups().get(0))); + if (server.getGroups().size() > 1) for (String group : server.getGroups()) sender.sendMessage(" - " + TextColor.WHITE + group); + sender.sendMessage(" -> Address: " + TextColor.WHITE + server.getAddress().getAddress().getHostAddress()+':'+server.getAddress().getPort()); + if (server instanceof SubServer) sender.sendMessage(" -> Running: " + ((((SubServer) server).isRunning())?TextColor.GREEN+"yes":TextColor.RED+"no")); if (!(server instanceof SubServer) || ((SubServer) server).isRunning()) { - host.log.message.println(" -> Connected: " + ((server.getSubData() != null)?TextColor.GREEN+"yes":TextColor.RED+"no")); - host.log.message.println(" -> Players: " + TextColor.AQUA + server.getPlayers().size() + " online"); + sender.sendMessage(" -> Connected: " + ((server.getSubData() != null)?TextColor.GREEN+"yes":TextColor.RED+"no")); + sender.sendMessage(" -> Players: " + TextColor.AQUA + server.getPlayers().size() + " online"); } - host.log.message.println(" -> MOTD: " + TextColor.WHITE + TextColor.stripColor(server.getMotd())); - if (server instanceof SubServer && ((SubServer) server).getStopAction() != SubServer.StopAction.NONE) host.log.message.println(" -> Stop Action: " + TextColor.WHITE + ((SubServer) server).getStopAction().toString()); - host.log.message.println(" -> Signature: " + TextColor.AQUA + server.getSignature()); - if (server instanceof SubServer) host.log.message.println(" -> Logging: " + ((((SubServer) server).isLogging())?TextColor.GREEN+"yes":TextColor.RED+"no")); - host.log.message.println(" -> Restricted: " + ((server.isRestricted())?TextColor.GREEN+"yes":TextColor.RED+"no")); + sender.sendMessage(" -> MOTD: " + TextColor.WHITE + TextColor.stripColor(server.getMotd())); + if (server instanceof SubServer && ((SubServer) server).getStopAction() != SubServer.StopAction.NONE) sender.sendMessage(" -> Stop Action: " + TextColor.WHITE + ((SubServer) server).getStopAction().toString()); + sender.sendMessage(" -> Signature: " + TextColor.AQUA + server.getSignature()); + if (server instanceof SubServer) sender.sendMessage(" -> Logging: " + ((((SubServer) server).isLogging())?TextColor.GREEN+"yes":TextColor.RED+"no")); + sender.sendMessage(" -> Restricted: " + ((server.isRestricted())?TextColor.GREEN+"yes":TextColor.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()); - host.log.message.println(" -> Incompatibilities:"); - for (String other : ((SubServer) server).getIncompatibilities()) host.log.message.println(" - " + ((current.contains(other.toLowerCase()))?TextColor.WHITE:TextColor.GRAY) + other); + sender.sendMessage(" -> Incompatibilities:"); + for (String other : ((SubServer) server).getIncompatibilities()) sender.sendMessage(" - " + ((current.contains(other.toLowerCase()))?TextColor.WHITE:TextColor.GRAY) + other); } - host.log.message.println(" -> Hidden: " + ((server.isHidden())?TextColor.GREEN+"yes":TextColor.RED+"no")); + sender.sendMessage(" -> Hidden: " + ((server.isHidden())?TextColor.GREEN+"yes":TextColor.RED+"no")); } else { if (type == null) { - host.log.message.println("SubServers > There is no object with that name"); + sender.sendMessage("SubServers > There is no object with that name"); } else { - host.log.message.println("SubServers > There is no server with that name"); + sender.sendMessage("SubServers > There is no server with that name"); } } }); Runnable getGroup = () -> host.api.getGroup(name, group -> { if (group != null) { - host.log.message.println("SubServers > Info on Group: " + TextColor.WHITE + name); - host.log.message.println(" -> Servers: " + ((group.size() <= 0)?TextColor.GRAY + "(none)":TextColor.AQUA.toString() + group.size())); - for (Server server : group) host.log.message.println(" - " + TextColor.WHITE + server.getDisplayName() + ((server.getName().equals(server.getDisplayName()))?"":" ("+server.getName()+')')); + sender.sendMessage("SubServers > Info on Group: " + TextColor.WHITE + name); + sender.sendMessage(" -> Servers: " + ((group.size() <= 0)?TextColor.GRAY + "(none)":TextColor.AQUA.toString() + group.size())); + for (Server server : group) sender.sendMessage(" - " + TextColor.WHITE + server.getDisplayName() + ((server.getName().equals(server.getDisplayName()))?"":" ("+server.getName()+')')); } else { if (type == null) { getServer.run(); } else { - host.log.message.println("SubServers > There is no group with that name"); + sender.sendMessage("SubServers > There is no group with that name"); } } }); - ExHost h = host; Runnable getHost = () -> host.api.getHost(name, host -> { if (host != null) { - h.log.message.println("SubServers > Info on Host: " + TextColor.WHITE + host.getDisplayName()); - if (!host.getName().equals(host.getDisplayName())) h.log.message.println(" -> System Name: " + TextColor.WHITE + host.getName()); - h.log.message.println(" -> Available: " + ((host.isAvailable())?TextColor.GREEN+"yes":TextColor.RED+"no")); - h.log.message.println(" -> Enabled: " + ((host.isEnabled())?TextColor.GREEN+"yes":TextColor.RED+"no")); - h.log.message.println(" -> Address: " + TextColor.WHITE + host.getAddress().getHostAddress()); - if (host.getSubData() != null) h.log.message.println(" -> Connected: " + TextColor.GREEN + "yes"); - h.log.message.println(" -> SubServers: " + ((host.getSubServers().keySet().size() <= 0)?TextColor.GRAY + "(none)":TextColor.AQUA.toString() + host.getSubServers().keySet().size())); - for (SubServer subserver : host.getSubServers().values()) h.log.message.println(" - " + ((subserver.isEnabled())?TextColor.WHITE:TextColor.GRAY) + subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')')); - h.log.message.println(" -> Templates: " + ((host.getCreator().getTemplates().keySet().size() <= 0)?TextColor.GRAY + "(none)":TextColor.AQUA.toString() + host.getCreator().getTemplates().keySet().size())); - for (SubCreator.ServerTemplate template : host.getCreator().getTemplates().values()) h.log.message.println(" - " + ((template.isEnabled())?TextColor.WHITE:TextColor.GRAY) + template.getDisplayName() + ((template.getName().equals(template.getDisplayName()))?"":" ("+template.getName()+')')); - h.log.message.println(" -> Signature: " + TextColor.AQUA + host.getSignature()); + sender.sendMessage("SubServers > Info on Host: " + TextColor.WHITE + host.getDisplayName()); + if (!host.getName().equals(host.getDisplayName())) sender.sendMessage(" -> System Name: " + TextColor.WHITE + host.getName()); + sender.sendMessage(" -> Available: " + ((host.isAvailable())?TextColor.GREEN+"yes":TextColor.RED+"no")); + sender.sendMessage(" -> Enabled: " + ((host.isEnabled())?TextColor.GREEN+"yes":TextColor.RED+"no")); + sender.sendMessage(" -> Address: " + TextColor.WHITE + host.getAddress().getHostAddress()); + if (host.getSubData() != null) sender.sendMessage(" -> Connected: " + TextColor.GREEN + "yes"); + sender.sendMessage(" -> SubServers: " + ((host.getSubServers().keySet().size() <= 0)?TextColor.GRAY + "(none)":TextColor.AQUA.toString() + host.getSubServers().keySet().size())); + for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(" - " + ((subserver.isEnabled())?TextColor.WHITE:TextColor.GRAY) + subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')')); + sender.sendMessage(" -> Templates: " + ((host.getCreator().getTemplates().keySet().size() <= 0)?TextColor.GRAY + "(none)":TextColor.AQUA.toString() + host.getCreator().getTemplates().keySet().size())); + for (SubCreator.ServerTemplate template : host.getCreator().getTemplates().values()) sender.sendMessage(" - " + ((template.isEnabled())?TextColor.WHITE:TextColor.GRAY) + template.getDisplayName() + ((template.getName().equals(template.getDisplayName()))?"":" ("+template.getName()+')')); + sender.sendMessage(" -> Signature: " + TextColor.AQUA + host.getSignature()); } else { if (type == null) { getGroup.run(); } else { - h.log.message.println("SubServers > There is no host with that name"); + sender.sendMessage("SubServers > There is no host with that name"); } } }); Runnable getProxy = () -> host.api.getProxy(name, proxy -> { if (proxy != null) { - host.log.message.println("SubServers > Info on Proxy: " + TextColor.WHITE + proxy.getDisplayName()); - if (!proxy.getName().equals(proxy.getDisplayName())) host.log.message.println(" -> System Name: " + TextColor.WHITE + proxy.getName()); - host.log.message.println(" -> Connected: " + ((proxy.getSubData() != null)?TextColor.GREEN+"yes":TextColor.RED+"no")); - host.log.message.println(" -> Redis: " + ((proxy.isRedis())?TextColor.GREEN:TextColor.RED+"un") + "available"); - if (proxy.isRedis()) host.log.message.println(" -> Players: " + TextColor.AQUA + proxy.getPlayers().size() + " online"); - host.log.message.println(" -> Signature: " + TextColor.AQUA + proxy.getSignature()); + sender.sendMessage("SubServers > Info on Proxy: " + TextColor.WHITE + proxy.getDisplayName()); + if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(" -> System Name: " + TextColor.WHITE + proxy.getName()); + sender.sendMessage(" -> Connected: " + ((proxy.getSubData() != null)?TextColor.GREEN+"yes":TextColor.RED+"no")); + sender.sendMessage(" -> Redis: " + ((proxy.isRedis())?TextColor.GREEN:TextColor.RED+"un") + "available"); + if (proxy.isRedis()) sender.sendMessage(" -> Players: " + TextColor.AQUA + proxy.getPlayers().size() + " online"); + sender.sendMessage(" -> Signature: " + TextColor.AQUA + proxy.getSignature()); } else { if (type == null) { getHost.run(); } else { - host.log.message.println("SubServers > There is no proxy with that name"); + sender.sendMessage("SubServers > There is no proxy with that name"); } } }); @@ -300,14 +308,114 @@ public class SubCommand { getServer.run(); break; default: - host.log.message.println("SubServers > There is no object type with that name"); + sender.sendMessage("SubServers > There is no object type with that name"); } } } else { - host.log.message.println("SubServers > Usage: /" + handle + " [proxy|host|group|server] "); + sender.sendMessage("SubServers > Usage: /" + handle + " [proxy|host|group|server] "); } } - }.usage("[proxy|host|group|server]", "").description("Gets information about an Object").help( + }.autocomplete((sender, handle, args) -> { + String last = (args.length > 0)?args[args.length - 1].toLowerCase():""; + TreeMap commands; + if (args.length == 1) { + updateCache(); + 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 (String proxy : proxyCache) if (!list.contains(proxy)) list.add(proxy); + for (String h : hostCache.keySet()) if (!list.contains(h)) list.add(h); + for (String group : groupCache) if (!list.contains(group)) list.add(group); + for (String server : serverCache.keySet()) if (!list.contains(server)) list.add(server); + } else { + for (String command : subcommands) { + if (!list.contains(command) && command.toLowerCase().startsWith(last)) + list.add(last + command.substring(last.length())); + } + for (String proxy : proxyCache) { + if (!list.contains(proxy) && proxy.toLowerCase().startsWith(last)) + list.add(last + proxy.substring(last.length())); + } + for (String h : hostCache.keySet()) { + if (!list.contains(h) && h.toLowerCase().startsWith(last)) + list.add(last + h.substring(last.length())); + } + for (String group : groupCache) { + if (!list.contains(group) && group.toLowerCase().startsWith(last)) + list.add(last + group.substring(last.length())); + } + for (String server : serverCache.keySet()) { + if (!list.contains(server) && server.toLowerCase().startsWith(last)) + list.add(last + server.substring(last.length())); + } + } + return list.toArray(new String[0]); + } else if (args.length == 2) { + updateCache(); + List list = new ArrayList(); + if (last.length() == 0) { + switch (args[0].toLowerCase()) { + case "p": + case "proxy": + list.addAll(proxyCache); + break; + case "h": + case "host": + list.addAll(hostCache.keySet()); + break; + case "g": + case "group": + list.addAll(groupCache); + break; + case "s": + case "server": + case "subserver": + list.addAll(serverCache.keySet()); + break; + } + } else { + switch (args[0].toLowerCase()) { + case "p": + case "proxy": + for (String proxy : proxyCache) { + if (proxy.toLowerCase().startsWith(last)) + list.add(last + proxy.substring(last.length())); + } + break; + case "h": + case "host": + for (String h : hostCache.keySet()) { + if (h.toLowerCase().startsWith(last)) + list.add(last + h.substring(last.length())); + } + break; + case "g": + case "group": + for (String group : groupCache) { + if (group.toLowerCase().startsWith(last)) + list.add(last + group.substring(last.length())); + } + break; + case "s": + case "server": + case "subserver": + for (String server : serverCache.keySet()) { + if (!list.contains(server) && server.toLowerCase().startsWith(last)) + list.add(last + server.substring(last.length())); + } + break; + } + } + return list.toArray(new String[0]); + } else { + return new String[0]; + } + }).usage("[proxy|host|group|server]", "").description("Gets information about an Object").help( "This command will print a list of information about", "the specified Object.", "", @@ -328,41 +436,58 @@ public class SubCommand { host.subdata.sendPacket(new PacketStartServer(null, args[0], data -> { switch (data.getInt("r")) { case 3: - host.log.message.println("There is no server with that name"); + sender.sendMessage("There is no server with that name"); break; case 4: - host.log.message.println("That Server is not a SubServer"); + sender.sendMessage("That Server is not a SubServer"); break; case 5: - host.log.message.println("That SubServer's Host is not available"); + sender.sendMessage("That SubServer's Host is not available"); break; case 6: - host.log.message.println("That SubServer's Host is not enabled"); + sender.sendMessage("That SubServer's Host is not enabled"); break; case 7: - host.log.message.println("That SubServer is not enabled"); + sender.sendMessage("That SubServer is not enabled"); break; case 8: - host.log.message.println("That SubServer is already running"); + sender.sendMessage("That SubServer is already running"); break; case 9: - host.log.message.println("That SubServer cannot start while these server(s) are running:", data.getRawString("m").split(":\\s")[1]); + sender.sendMessage("That SubServer cannot start while these server(s) are running:", data.getRawString("m").split(":\\s")[1]); break; case 0: case 1: - host.log.message.println("Server was started successfully"); + sender.sendMessage("Server was started successfully"); break; default: host.log.warn.println("PacketStartServer(null, " + args[0] + ") responded with: " + data.getRawString("m")); - host.log.message.println("Server was started successfully"); + sender.sendMessage("Server was started successfully"); break; } })); } else { - host.log.message.println("Usage: /" + handle + " "); + sender.sendMessage("Usage: /" + handle + " "); } } - }.usage("").description("Starts a SubServer").help( + }.autocomplete(defaultCompletor = (sender, handle, args) -> { + String last = (args.length > 0)?args[args.length - 1].toLowerCase():""; + List list = new ArrayList(); + if (args.length == 1) { + updateCache(); + if (last.length() == 0) { + for (String server : serverCache.keySet()) if (serverCache.get(server) == Boolean.TRUE) list.add(server); + } else { + for (String server : serverCache.keySet()) { + if (serverCache.get(server) == Boolean.TRUE && server.toLowerCase().startsWith(last)); + list.add(last + server.substring(last.length())); + } + } + return list.toArray(new String[0]); + } else { + return new String[0]; + } + }).usage("").description("Starts a SubServer").help( "This command is used to start a SubServer on the network.", "Once it has been started, you can control it via the other commands", "", @@ -379,29 +504,29 @@ public class SubCommand { host.subdata.sendPacket(new PacketStopServer(null, args[0], false, data -> { switch (data.getInt("r")) { case 3: - host.log.message.println("There is no server with that name"); + sender.sendMessage("There is no server with that name"); break; case 4: - host.log.message.println("That Server is not a SubServer"); + sender.sendMessage("That Server is not a SubServer"); break; case 5: - host.log.message.println("That SubServer is not running"); + sender.sendMessage("That SubServer is not running"); break; case 0: case 1: - host.log.message.println("Server was stopped successfully"); + sender.sendMessage("Server was stopped successfully"); break; default: host.log.warn.println("PacketStopServer(null, " + args[0] + ", false) responded with: " + data.getRawString("m")); - host.log.message.println("Server was stopped successfully"); + sender.sendMessage("Server was stopped successfully"); break; } })); } else { - host.log.message.println("Usage: /" + handle + " "); + sender.sendMessage("Usage: /" + handle + " "); } } - }.usage("").description("Stops a SubServer").help( + }.autocomplete(defaultCompletor).usage("").description("Stops a SubServer").help( "This command is used to request a SubServer to stop via the network.", "Stopping a SubServer in this way will run the stop command", "specified in the server's configuration", @@ -419,29 +544,29 @@ public class SubCommand { host.subdata.sendPacket(new PacketStopServer(null, args[0], true, data -> { switch (data.getInt("r")) { case 3: - host.log.message.println("There is no server with that name"); + sender.sendMessage("There is no server with that name"); break; case 4: - host.log.message.println("That Server is not a SubServer"); + sender.sendMessage("That Server is not a SubServer"); break; case 5: - host.log.message.println("That SubServer is not running"); + sender.sendMessage("That SubServer is not running"); break; case 0: case 1: - host.log.message.println("Server was terminated successfully"); + sender.sendMessage("Server was terminated successfully"); break; default: host.log.warn.println("PacketStopServer(null, " + args[0] + ", true) responded with: " + data.getRawString("m")); - host.log.message.println("Server was terminated successfully"); + sender.sendMessage("Server was terminated successfully"); break; } })); } else { - host.log.message.println("Usage: /" + handle + " "); + sender.sendMessage("Usage: /" + handle + " "); } } - }.usage("").description("Terminates a SubServer").help( + }.autocomplete(defaultCompletor).usage("").description("Terminates a SubServer").help( "This command is used to forcefully stop a SubServer on the network.", "Stopping a SubServer in this way can make you lose unsaved data though,", "so it is generally recommended to use this command only when it stops responding.", @@ -468,29 +593,29 @@ public class SubCommand { host.subdata.sendPacket(new PacketCommandServer(null, args[0], cmd, data -> { switch (data.getInt("r")) { case 3: - host.log.message.println("There is no server with that name"); + sender.sendMessage("There is no server with that name"); break; case 4: - host.log.message.println("That Server is not a SubServer"); + sender.sendMessage("That Server is not a SubServer"); break; case 5: - host.log.message.println("That SubServer is not running"); + sender.sendMessage("That SubServer is not running"); break; case 0: case 1: - host.log.message.println("Command was sent successfully"); + sender.sendMessage("Command was sent successfully"); break; default: host.log.warn.println("PacketCommandServer(null, " + args[0] + ", /" + cmd + ") responded with: " + data.getRawString("m")); - host.log.message.println("Command was sent successfully"); + sender.sendMessage("Command was sent successfully"); break; } })); } else { - host.log.message.println("Usage: /" + handle + " [Args...]"); + sender.sendMessage("Usage: /" + handle + " [Args...]"); } } - }.usage("", "", "[Args...]").description("Sends a Command to a SubServer").help( + }.autocomplete(defaultCompletor).usage("", "", "[Args...]").description("Sends a Command to a SubServer").help( "This command is used to send a command to a SubServer's Console via the network.", "", "The argument is required, and should be the name of", @@ -508,52 +633,81 @@ public class SubCommand { public void command(CommandSender sender, String handle, String[] args) { if (args.length > 3) { if (args.length > 4 && Util.isException(() -> Integer.parseInt(args[4]))) { - host.log.message.println("Invalid Port Number"); + sender.sendMessage("Invalid Port Number"); } else { host.subdata.sendPacket(new PacketCreateServer(null, args[0], args[1], args[2], new Version(args[3]), (args.length > 4)?Integer.parseInt(args[4]):null, data -> { switch (data.getInt("r")) { case 3: - host.log.message.println("Server names cannot use spaces"); + sender.sendMessage("Server names cannot use spaces"); case 4: - host.log.message.println("There is already a SubServer with that name"); + sender.sendMessage("There is already a SubServer with that name"); break; case 5: - host.log.message.println("There is no host with that name"); + sender.sendMessage("There is no host with that name"); break; case 6: - host.log.message.println("That Host is not available"); + sender.sendMessage("That Host is not available"); break; case 7: - host.log.message.println("That Host is not enabled"); + sender.sendMessage("That Host is not enabled"); break; case 8: - host.log.message.println("There is no template with that name"); + sender.sendMessage("There is no template with that name"); break; case 9: - host.log.message.println("That Template is not enabled"); + sender.sendMessage("That Template is not enabled"); break; case 10: - host.log.message.println("SubCreator cannot create servers before Minecraft 1.8"); + sender.sendMessage("SubCreator cannot create servers before Minecraft 1.8"); break; case 11: - host.log.message.println("Invalid Port Number"); + sender.sendMessage("Invalid Port Number"); break; case 0: case 1: - host.log.message.println("Launching SubCreator..."); + sender.sendMessage("Launching SubCreator..."); break; default: host.log.warn.println("PacketCreateServer(null, " + args[0] + ", " + args[1] + ", " + args[2] + ", " + args[3] + ", " + ((args.length > 4)?args[4]:"null") + ") responded with: " + data.getRawString("m")); - host.log.message.println("Launching SubCreator..."); + sender.sendMessage("Launching SubCreator..."); break; } })); } } else { - host.log.message.println("Usage: /" + handle + "