package net.ME1312.SubServers.Bungee; import com.google.gson.Gson; import net.ME1312.SubServers.Bungee.Host.*; import net.ME1312.SubServers.Bungee.Library.Compatibility.CommandX; 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.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Command; import net.md_5.bungee.command.ConsoleCommandSender; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.nio.charset.Charset; import java.util.*; /** * Plugin Command Class */ @SuppressWarnings("deprecation") public final class SubCommand extends CommandX { private SubPlugin plugin; private String label; protected static NamedContainer newInstance(SubPlugin plugin, String command) { NamedContainer cmd = new NamedContainer<>(new SubCommand(plugin, command), null); CommandX now = cmd.name(); //if (plugin.api.getGameVersion()[plugin.api.getGameVersion().length - 1].compareTo(new Version("1.13")) >= 0) { // TODO Future Command Validator API? // now = new net.ME1312.SubServers.Bungee.Library.Compatibility.v1_13.CommandX(cmd.name()); //} cmd.set(now); return cmd; } private SubCommand(SubPlugin plugin, String command) { super(command); this.plugin = plugin; this.label = '/' + command; } /** * Load /sub in console * * @param sender Sender * @param args Arguments */ @SuppressWarnings("unchecked") public void execute(CommandSender sender, String[] args) { if (sender instanceof ConsoleCommandSender) { if (args.length > 0) { if (args[0].equalsIgnoreCase("help") || args[0].equalsIgnoreCase("?")) { sender.sendMessages(printHelp()); } else if (args[0].equalsIgnoreCase("version") || args[0].equalsIgnoreCase("ver")) { sender.sendMessage("SubServers > These are the platforms and versions that are running SubServers.Bungee:"); sender.sendMessage(" " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") + ','); sender.sendMessage(" Java " + System.getProperty("java.version") + ','); sender.sendMessage(" " + plugin.getBungeeName() + ((plugin.isPatched)?" [Patched] ":" ") + net.md_5.bungee.Bootstrap.class.getPackage().getImplementationVersion() + ','); sender.sendMessage(" SubServers.Bungee v" + SubPlugin.version.toExtendedString() + ((plugin.api.getWrapperBuild() != null)?" (" + plugin.api.getWrapperBuild() + ')':"")); sender.sendMessage(""); new Thread(() -> { try { YAMLSection tags = new YAMLSection(new Gson().fromJson("{\"tags\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags").openStream(), Charset.forName("UTF-8")))) + '}', Map.class)); List versions = new LinkedList(); Version updversion = plugin.version; int updcount = 0; for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10))); Collections.sort(versions); for (Version version : versions) { if (version.compareTo(updversion) > 0) { updversion = version; updcount++; } } if (updcount == 0) { sender.sendMessage("You are on the latest version."); } else { sender.sendMessage("SubServers.Bungee v" + updversion + " is available. You are " + updcount + " version" + ((updcount == 1)?"":"s") + " behind."); } } catch (Exception e) {} }).start(); } else if (args[0].equalsIgnoreCase("reload")) { if (args.length > 1) { switch (args[1].toLowerCase()) { case "all": case "system": case "bungee": case "network": plugin.getPluginManager().dispatchCommand(ConsoleCommandSender.getInstance(), "greload"); break; case "host": case "hosts": case "server": case "servers": case "subserver": case "subservers": case "subdata": case "config": case "configs": try { plugin.reload(); } catch (IOException e) { e.printStackTrace(); } break; case "creator": case "creators": case "template": case "templates": for (Host host : plugin.api.getHosts().values()) { host.getCreator().reload(); } sender.sendMessage("SubServers > SubCreator instances reloaded"); break; default: sender.sendMessage("SubServers > Unknown reload type: " + args[1]); } } else { try { plugin.reload(); } catch (IOException e) { e.printStackTrace(); } } } else if (args[0].equalsIgnoreCase("list")) { String div = ChatColor.RESET + ", "; int i = 0; boolean sent = false; if (plugin.api.getGroups().keySet().size() > 0) { sender.sendMessage("SubServers > Group/Server List:"); for (String group : plugin.api.getGroups().keySet()) { String message = " "; message += ChatColor.GOLD + group + ChatColor.RESET + ": "; List names = new ArrayList(); Map servers = plugin.api.getServers(); for (Server server : plugin.api.getGroup(group)) names.add(server.getName()); Collections.sort(names); for (String name : names) { if (i != 0) message += div; Server server = servers.get(name.toLowerCase()); if (!(servers.get(name.toLowerCase()) instanceof SubServer)) { message += ChatColor.WHITE; } else if (((SubServer) server).isTemporary()) { message += ChatColor.AQUA; } else if (((SubServer) server).isRunning()) { message += ChatColor.GREEN; } else if (((SubServer) server).getHost().isEnabled() && ((SubServer) server).isEnabled() && ((SubServer) server).getCurrentIncompatibilities().size() == 0) { message += ChatColor.YELLOW; } else { message += ChatColor.RED; } message += server.getDisplayName() + " (" + server.getAddress().getAddress().getHostAddress() + ':' + server.getAddress().getPort() + ((server.getName().equals(server.getDisplayName())) ? "" : ChatColor.stripColor(div) + server.getName()) + ")"; i++; } if (i == 0) message += ChatColor.RESET + "(none)"; sender.sendMessage(message); i = 0; sent = true; } if (!sent) sender.sendMessage(ChatColor.RESET + "(none)"); sent = false; } sender.sendMessage("SubServers > Host/SubServer List:"); for (Host host : plugin.api.getHosts().values()) { String message = " "; if (host.isEnabled()) { message += ChatColor.AQUA; } else { message += ChatColor.RED; } message += host.getDisplayName() + " (" + host.getAddress().getHostAddress() + ((host.getName().equals(host.getDisplayName()))?"":ChatColor.stripColor(div)+host.getName()) + ")" + ChatColor.RESET + ": "; for (SubServer subserver : host.getSubServers().values()) { if (i != 0) message += div; if (subserver.isTemporary()) { message += ChatColor.AQUA; } else if (subserver.isRunning()) { message += ChatColor.GREEN; } else if (subserver.getHost().isEnabled() && subserver.isEnabled() && subserver.getCurrentIncompatibilities().size() == 0) { message += ChatColor.YELLOW; } else { message += ChatColor.RED; } message += subserver.getDisplayName() + " (" + subserver.getAddress().getPort() + ((subserver.getName().equals(subserver.getDisplayName()))?"":ChatColor.stripColor(div)+subserver.getName()) + ")"; i++; } if (i == 0) message += ChatColor.RESET + "(none)"; sender.sendMessage(message); i = 0; sent = true; } if (!sent) sender.sendMessage(ChatColor.RESET + "(none)"); sender.sendMessage("SubServers > Server List:"); String message = " "; for (Server server : plugin.api.getServers().values()) { if (!(server instanceof SubServer)) { if (i != 0) message += div; message += ChatColor.WHITE + server.getDisplayName() + " (" + server.getAddress().getAddress().getHostAddress() + ':' + server.getAddress().getPort() + ((server.getName().equals(server.getDisplayName()))?"":ChatColor.stripColor(div)+server.getName()) + ")"; i++; } } if (i == 0) message += ChatColor.RESET + "(none)"; sender.sendMessage(message); if (plugin.api.getProxies().keySet().size() > 0) { sender.sendMessage("SubServers > Proxy List:"); message = " (master)"; for (Proxy proxy : plugin.api.getProxies().values()) { message += div; if (proxy.getSubData() != null && proxy.isRedis()) { message += ChatColor.GREEN; } else if (proxy.getSubData() != null) { message += ChatColor.AQUA; } else if (proxy.isRedis()) { message += ChatColor.WHITE; } else { message += ChatColor.RED; } message += proxy.getDisplayName() + ((proxy.getName().equals(proxy.getDisplayName()))?"":" ("+proxy.getName()+')'); } sender.sendMessage(message); } } 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()); } } else { sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); } } else if (args[0].equalsIgnoreCase("start")) { 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 if (!((SubServer) servers.get(args[1].toLowerCase())).getHost().isEnabled()) { sender.sendMessage("SubServers > That SubServer's Host is not enabled"); } else if (!((SubServer) servers.get(args[1].toLowerCase())).isEnabled()) { sender.sendMessage("SubServers > That SubServer is not enabled"); } else if (((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { sender.sendMessage("SubServers > That SubServer is already running"); } else if (((SubServer) servers.get(args[1].toLowerCase())).getCurrentIncompatibilities().size() != 0) { String list = ""; for (SubServer server : ((SubServer) servers.get(args[1].toLowerCase())).getCurrentIncompatibilities()) { if (list.length() != 0) list += ", "; list += server.getName(); } sender.sendMessages("That SubServer cannot start while these server(s) are running:", list); } else { ((SubServer) servers.get(args[1].toLowerCase())).start(); } } else { sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); } } else if (args[0].equalsIgnoreCase("stop")) { 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 if (!((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { sender.sendMessage("SubServers > That SubServer is not running"); } else { ((SubServer) servers.get(args[1].toLowerCase())).stop(); } } else { sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); } } else if (args[0].equalsIgnoreCase("kill") || args[0].equalsIgnoreCase("terminate")) { 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 if (!((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { sender.sendMessage("SubServers > That SubServer is not running"); } else { ((SubServer) servers.get(args[1].toLowerCase())).terminate(); } } else { sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); } } else if (args[0].equalsIgnoreCase("cmd") || args[0].equalsIgnoreCase("command")) { if (args.length > 2) { Map servers = plugin.api.getServers(); if (!args[1].equals("*") && !servers.keySet().contains(args[1].toLowerCase())) { sender.sendMessage("SubServers > There is no server with that name"); } else if (!args[1].equals("*") && !(servers.get(args[1].toLowerCase()) instanceof SubServer)) { sender.sendMessage("SubServers > That Server is not a SubServer"); } else if (!args[1].equals("*") && !((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { sender.sendMessage("SubServers > That SubServer is not running"); } else { String str = args[2]; for (int i = 3; i < args.length; i++) { str += " " + args[i]; } if (args[1].equals("*")) { for (Server server : servers.values()) { if (server instanceof SubServer && ((SubServer) server).isRunning()) { ((SubServer) server).command(str); } } } else { ((SubServer) servers.get(args[1].toLowerCase())).command(str); } } } else { sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " [Args...]"); } } else if (args[0].equalsIgnoreCase("sudo") || args[0].equalsIgnoreCase("screen")) { if (plugin.canSudo) { 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 if (!((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { sender.sendMessage("SubServers > That SubServer is not running"); } else { plugin.sudo = (SubServer) servers.get(args[1].toLowerCase()); System.out.println("SubServers > Now forwarding commands to " + plugin.sudo.getDisplayName() + ". Type \"exit\" to return."); } } else { sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + " "); } } else { sender.sendMessage("SubServers > The BungeeCord library provided does not support console sudo."); } } else if (args[0].equalsIgnoreCase("create")) { if (args.length > 5) { if (plugin.api.getSubServers().keySet().contains(args[1].toLowerCase()) || SubCreator.isReserved(args[1])) { sender.sendMessage("SubServers > There is already a SubServer with that name"); } else if (!plugin.hosts.keySet().contains(args[2].toLowerCase())) { sender.sendMessage("SubServers > There is no host with that name"); } else if (!plugin.hosts.get(args[2].toLowerCase()).getCreator().getTemplates().keySet().contains(args[3].toLowerCase()) || !plugin.hosts.get(args[2].toLowerCase()).getCreator().getTemplate(args[3]).isEnabled()) { sender.sendMessage("SubServers > There is no template with that name"); } else if (new Version("1.8").compareTo(new Version(args[4])) > 0) { sender.sendMessage("SubServers > SubCreator cannot create servers before Minecraft 1.8"); } else if (Util.isException(() -> Integer.parseInt(args[5])) || Integer.parseInt(args[5]) <= 0 || Integer.parseInt(args[5]) > 65535) { sender.sendMessage("SubServers > Invalid Port Number"); } else { plugin.hosts.get(args[2].toLowerCase()).getCreator().create(args[1], plugin.hosts.get(args[2].toLowerCase()).getCreator().getTemplate(args[3]), new Version(args[4]), Integer.parseInt(args[5])); } } else { sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + "