From bc5acab41dd539f5835536a409ede2624e0d9a80 Mon Sep 17 00:00:00 2001 From: ME1312 Date: Wed, 29 Aug 2018 21:55:59 -0400 Subject: [PATCH] Replace Auto-Restart and Temporary Flags with Stop Actions Stop Actions will is the replacement for both the Auto Restart and Temporary flags. To define that the server should restart on stop, use the RESTART keyword. To get the same result that you would get using the temporary flag, use the REMOVE_SERVER keyword. Additionally, there is now a DELETE_SERVER keyword. This keyword does the same thing as the REMOVE_SERVER keyword, except it deletes the directory on the server ran from. If you would like nothing special to happen when the server stops, use the NONE keyword. --- .../Bungee/Host/External/ExternalHost.java | 56 +- .../Host/External/ExternalSubCreator.java | 23 +- .../Host/External/ExternalSubServer.java | 115 ++- .../ME1312/SubServers/Bungee/Host/Host.java | 18 +- .../Bungee/Host/Internal/InternalHost.java | 29 +- .../Host/Internal/InternalSubCreator.java | 38 +- .../Host/Internal/InternalSubServer.java | 109 ++- .../Bungee/Host/ServerContainer.java | 14 +- .../SubServers/Bungee/Host/SubCreator.java | 171 +--- .../SubServers/Bungee/Host/SubServer.java | 65 +- .../Bungee/Host/SubServerContainer.java | 5 +- .../Bungee/Host/SubServerController.java | 80 +- .../Bungee/Library/Files/config.yml | 2 +- .../SubServers/Bungee/Library/Files/lang.yml | 7 +- .../SubServers/Bungee/Library/Metrics.java | 2 +- .../Network/Packet/PacketCreateServer.java | 16 +- .../Network/Packet/PacketEditServer.java | 73 -- .../Network/Packet/PacketListenLog.java | 130 --- .../Network/Packet/PacketStartServer.java | 10 +- .../Bungee/Network/SubDataServer.java | 4 - .../ME1312/SubServers/Bungee/SubCommand.java | 41 +- .../ME1312/SubServers/Bungee/SubPlugin.java | 15 +- .../Bukkit/Graphic/DefaultUIHandler.java | 2 +- .../Bukkit/Graphic/DefaultUIRenderer.java | 343 ++++---- .../Library/Compatibility/BungeeChat.java | 44 +- .../Client/Bukkit/Network/API/Host.java | 9 + .../Client/Bukkit/Network/API/SubServer.java | 32 +- .../SubServers/Client/Bukkit/SubCommand.java | 50 +- SubServers.Client/Sponge/pom.xml | 2 +- .../Client/Sponge/Event/SubAddHostEvent.java | 4 +- .../Client/Sponge/Event/SubAddProxyEvent.java | 2 +- .../Sponge/Event/SubAddServerEvent.java | 4 +- .../Client/Sponge/Event/SubCreateEvent.java | 4 +- .../Sponge/Event/SubEditServerEvent.java | 4 +- .../Sponge/Event/SubNetworkConnectEvent.java | 2 +- .../Event/SubNetworkDisconnectEvent.java | 2 +- .../Sponge/Event/SubRemoveHostEvent.java | 4 +- .../Sponge/Event/SubRemoveProxyEvent.java | 2 +- .../Sponge/Event/SubRemoveServerEvent.java | 4 +- .../Sponge/Event/SubSendCommandEvent.java | 4 +- .../Client/Sponge/Event/SubStartEvent.java | 4 +- .../Client/Sponge/Event/SubStopEvent.java | 4 +- .../Client/Sponge/Event/SubStoppedEvent.java | 2 +- .../Client/Sponge/Network/API/Host.java | 9 + .../Client/Sponge/Network/API/SubServer.java | 32 +- .../SubServers/Client/Sponge/SubCommand.java | 69 +- .../SubServers/Host/Network/API/Host.java | 9 + .../Host/Network/API/SubServer.java | 32 +- .../ME1312/SubServers/Host/SubCommand.java | 50 +- .../SubServers/Sync/Library/Metrics.java | 2 +- .../SubServers/Sync/Network/API/Host.java | 9 + .../Sync/Network/API/SubServer.java | 32 +- .../ME1312/SubServers/Sync/SubCommand.java | 764 +++++++++--------- .../net/ME1312/SubServers/Sync/SubPlugin.java | 2 +- 54 files changed, 1147 insertions(+), 1414 deletions(-) delete mode 100644 SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketEditServer.java delete mode 100644 SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketListenLog.java diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java index 5dce1e4c..2c77bc8f 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalHost.java @@ -95,9 +95,14 @@ public class ExternalHost extends Host implements ClientHandler { client.rename(true); } + @Override + public boolean isAvailable() { + return this.client.name(); + } + @Override public boolean isEnabled() { - return enabled && this.client.name(); + return enabled; } @Override @@ -137,17 +142,13 @@ public class ExternalHost extends Host implements ClientHandler { } @Override - public SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted, boolean temporary) throws InvalidServerException { + public SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { if (plugin.api.getServers().keySet().contains(name.toLowerCase())) throw new InvalidServerException("A Server already exists with this name!"); SubServer server = new ExternalSubServer(this, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted); SubAddServerEvent event = new SubAddServerEvent(player, this, server); plugin.getPluginManager().callEvent(event); if (!event.isCancelled()) { - queue(new PacketExAddServer(name, enabled, log, directory, executable, stopcmd, (server.isRunning())?((ExternalSubLogger) server.getLogger()).getExternalAddress():null, data -> { - if (data.getInt("r") == 0) { - if (temporary && server.start()) server.setTemporary(true); - } - })); + queue(new PacketExAddServer(name, enabled, log, directory, executable, stopcmd, (server.isRunning())?((ExternalSubLogger) server.getLogger()).getExternalAddress():null)); servers.put(name.toLowerCase(), server); return server; } else { @@ -158,19 +159,18 @@ public class ExternalHost extends Host implements ClientHandler { @Override public boolean removeSubServer(UUID player, String name) throws InterruptedException { if (Util.isNull(name)) throw new NullPointerException(); - SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(name)); + String server = servers.get(name.toLowerCase()).getName(); + + SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server)); plugin.getPluginManager().callEvent(event); if (!event.isCancelled()) { - if (getSubServer(name).isRunning()) { - getSubServer(name).stop(); - getSubServer(name).waitFor(); + if (getSubServer(server).isRunning()) { + getSubServer(server).stop(); + getSubServer(server).waitFor(); } - queue(new PacketExRemoveServer(name, data -> { + queue(new PacketExRemoveServer(server, data -> { if (data.getInt("r") == 0) { - List groups = new ArrayList(); - groups.addAll(getSubServer(name).getGroups()); - for (String group : groups) getSubServer(name).removeGroup(group); - servers.remove(name.toLowerCase()); + servers.remove(server.toLowerCase()); } })); return true; @@ -180,15 +180,16 @@ public class ExternalHost extends Host implements ClientHandler { @Override public boolean forceRemoveSubServer(UUID player, String name) { if (Util.isNull(name)) throw new NullPointerException(); - SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(name)); + String server = servers.get(name.toLowerCase()).getName(); + + SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server)); plugin.getPluginManager().callEvent(event); - if (getSubServer(name).isRunning()) { - getSubServer(name).terminate(); + if (getSubServer(server).isRunning()) { + getSubServer(server).terminate(); } - queue(new PacketExRemoveServer(name, data -> { + queue(new PacketExRemoveServer(server, data -> { if (data.getInt("r") == 0) { - for (String group : getSubServer(name).getGroups()) getSubServer(name).removeGroup(group); - servers.remove(name.toLowerCase()); + servers.remove(server.toLowerCase()); } })); return true; @@ -223,11 +224,10 @@ public class ExternalHost extends Host implements ClientHandler { System.out.println("SubServers > Removing Files..."); queue(new PacketExDeleteServer(server, info, data -> { if (data.getInt("r") == 0) { - for (String group : getSubServer(name).getGroups()) getSubServer(name).removeGroup(group); servers.remove(server.toLowerCase()); - System.out.println("SubServers > Done!"); + System.out.println("SubServers > Deleted SubServer: " + server); } else { - System.out.println("SubServers > Couldn't remove server from memory. See " + getName() + " console for more details"); + System.out.println("SubServers > Couldn't remove " + server + " from memory. See " + getName() + " console for more details"); } })); return true; @@ -261,11 +261,11 @@ public class ExternalHost extends Host implements ClientHandler { System.out.println("SubServers > Removing Files..."); queue(new PacketExDeleteServer(server, info, data -> { if (data.getInt("r") == 0) { - for (String group : getSubServer(name).getGroups()) getSubServer(name).removeGroup(group); + for (String group : getSubServer(server).getGroups()) getSubServer(server).removeGroup(group); servers.remove(server.toLowerCase()); - System.out.println("SubServers > Done!"); + System.out.println("SubServers > Deleted SubServer: " + server); } else { - System.out.println("SubServers > Couldn't remove server from memory. See " + getName() + " console for more details"); + System.out.println("SubServers > Couldn't remove " + server + " from memory. See " + getName() + " console for more details"); } })); return true; 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 c75a0149..375d8f72 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 @@ -11,6 +11,7 @@ import net.ME1312.SubServers.Bungee.Network.Packet.PacketExCreateServer; import net.ME1312.SubServers.Bungee.SubAPI; import java.io.File; +import java.lang.reflect.InvocationTargetException; import java.util.*; /** @@ -57,9 +58,10 @@ public class ExternalSubCreator extends SubCreator { } @Override - public boolean create(UUID player, String name, ServerTemplate template, Version version, int port) { + public boolean create(UUID player, String name, ServerTemplate template, Version version, int port, Callback callback) { if (Util.isNull(name, template, version, port)) throw new NullPointerException(); - if (template.isEnabled() && !SubAPI.getInstance().getSubServers().keySet().contains(name.toLowerCase()) && !SubCreator.isReserved(name)) { + if (host.isAvailable() && host.isEnabled() && template.isEnabled() && !SubAPI.getInstance().getSubServers().keySet().contains(name.toLowerCase()) && !SubCreator.isReserved(name)) { + StackTraceElement[] origin = new Exception().getStackTrace(); ExternalSubLogger logger = new ExternalSubLogger(this, name + File.separator + "Creator", new Container(host.plugin.config.get().getSection("Settings").getBoolean("Log-Creator")), null); thread.put(name.toLowerCase(), logger); final SubCreateEvent event = new SubCreateEvent(player, host, name, template, version, port); @@ -78,7 +80,6 @@ public class ExternalSubCreator extends SubCreator { new NamedContainer<>("$template$", template.getName()), new NamedContainer<>("$type$", template.getType().toString()), new NamedContainer<>("$version$", version.toString().replace(" ", "@")), new NamedContainer<>("$port$", Integer.toString(port)))); server.set("Enabled", true); - //server.set("Editable", true); server.set("Display", ""); server.set("Host", host.getName()); server.set("Group", new ArrayList()); @@ -88,25 +89,33 @@ public class ExternalSubCreator extends SubCreator { server.set("Directory", "." + File.separatorChar + name); server.set("Executable", "java -Xmx1024M -jar " + template.getType().toString() + ".jar"); server.set("Stop-Command", "stop"); + server.set("Stop-Action", "NONE"); server.set("Run-On-Launch", false); - server.set("Auto-Restart", false); server.set("Restricted", false); server.set("Incompatible", new ArrayList()); server.set("Hidden", false); server.setAll(config); 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("Auto-Restart")) subserver.setAutoRestart(true); + new Executable(server.getRawString("Executable")), server.getRawString("Stop-Command"), server.getBoolean("Hidden"), server.getBoolean("Restricted")); if (server.getString("Display").length() > 0) subserver.setDisplayName(server.getString("Display")); for (String group : server.getStringList("Group")) subserver.addGroup(group); + SubServer.StopAction action = Util.getDespiteException(() -> SubServer.StopAction.valueOf(server.getRawString("Stop-Action").toUpperCase().replace('-', '_').replace(' ', '_')), null); + if (action != null) subserver.setStopAction(action); if (server.contains("Extra")) for (String extra : server.getSection("Extra").getKeys()) subserver.addExtra(extra, server.getSection("Extra").getObject(extra)); host.plugin.config.get().getSection("Servers").set(name, server); host.plugin.config.save(); if (template.getBuildOptions().getBoolean("Run-On-Finish", true)) subserver.start(); + + if (callback != null) try { + callback.run(subserver); + } catch (Throwable e) { + Throwable ew = new InvocationTargetException(e); + ew.setStackTrace(origin); + ew.printStackTrace(); + } } else { System.out.println(name + "/Creator > " + data.getString("m")); } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java index f359b6df..e5d0ddb8 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubServer.java @@ -13,6 +13,7 @@ import net.ME1312.SubServers.Bungee.SubAPI; import net.md_5.bungee.BungeeServerInfo; import java.io.File; +import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.LinkedList; @@ -25,15 +26,13 @@ import java.util.UUID; public class ExternalSubServer extends SubServerContainer { private ExternalHost host; private boolean enabled; - private boolean editable; private Container log; private String dir; protected Executable exec; private String stopcmd; + private StopAction stopaction; private LinkedList history; private ExternalSubLogger logger; - private boolean restart; - private boolean temporary; private boolean running; private boolean lock; @@ -55,20 +54,18 @@ public class ExternalSubServer extends SubServerContainer { */ public ExternalSubServer(ExternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { super(host, name, port, motd, hidden, restricted); - if (Util.isNull(host, name, enabled, port, motd, log, stopcmd, restart, hidden, restricted)) throw new NullPointerException(); + if (Util.isNull(host, name, enabled, port, motd, log, stopcmd, hidden, restricted)) throw new NullPointerException(); this.host = host; this.enabled = enabled; - this.editable = false; this.log = new Container(log); this.dir = directory; this.exec = executable; this.stopcmd = stopcmd; + this.stopaction = StopAction.NONE; this.history = new LinkedList(); this.logger = new ExternalSubLogger(this, getName(), this.log, null); - this.restart = false; this.running = false; - this.temporary = false; this.lock = false; } @@ -89,7 +86,7 @@ public class ExternalSubServer extends SubServerContainer { } else return false; } private void falsestart() { - System.out.println("SubServers > Couldn't start " + getName() + " \u2014 See the " + host.getName() + " console for more details"); + System.out.println("SubServers > Couldn't start " + getName() + " - See the " + host.getName() + " console for more details"); running = false; logger.stop(); } @@ -114,16 +111,26 @@ public class ExternalSubServer extends SubServerContainer { history.clear(); running = false; - if (isTemporary()) { + if (stopaction == StopAction.REMOVE_SERVER || stopaction == StopAction.DELETE_SERVER) { try { - if (host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) - host.plugin.config.get().getSection("Servers").remove(getName()); - host.removeSubServer(getName()); + if (stopaction == StopAction.DELETE_SERVER) { + host.deleteSubServer(getName()); + } else { + try { + if (host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { + host.plugin.config.get().getSection("Servers").remove(getName()); + host.plugin.config.save(); + } + } catch (IOException e) { + e.printStackTrace(); + } + host.removeSubServer(getName()); + } } catch (InterruptedException e) { e.printStackTrace(); } - } else { - if (willAutoRestart() && allowrestart) { + } else if (stopaction == StopAction.RESTART) { + if (allowrestart) { new Thread(() -> { try { Thread.sleep(250); @@ -174,7 +181,7 @@ public class ExternalSubServer extends SubServerContainer { boolean state = isRunning(); SubServer forward = null; YAMLSection pending = edit.clone(); - if (editable) for (String key : edit.getKeys()) { + for (String key : edit.getKeys()) { pending.remove(key); YAMLValue value = edit.get(key); SubEditServerEvent event = new SubEditServerEvent(player, this, new NamedContainer(key, value), true); @@ -184,7 +191,7 @@ public class ExternalSubServer extends SubServerContainer { switch (key) { case "name": if (value.isString() && host.removeSubServer(player, getName())) { - SubServer server = host.addSubServer(player, value.asRawString(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), isHidden(), isRestricted(), isTemporary()); + SubServer server = host.addSubServer(player, value.asRawString(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), isHidden(), isRestricted()); if (server != null) { if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { YAMLSection config = this.host.plugin.config.get().getSection("Servers").getSection(getName()); @@ -246,7 +253,7 @@ public class ExternalSubServer extends SubServerContainer { case "host": if (value.isString() && host.removeSubServer(player, getName())) { waitFor(() -> host.getSubServer(getName()), null); - SubServer server = this.host.plugin.api.getHost(value.asRawString()).addSubServer(player, getName(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), isHidden(), isRestricted(), isTemporary()); + SubServer server = this.host.plugin.api.getHost(value.asRawString()).addSubServer(player, getName(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), isHidden(), isRestricted()); if (server != null) { if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Host", server.getHost().getName()); @@ -260,7 +267,7 @@ public class ExternalSubServer extends SubServerContainer { case "port": if (value.isNumber() && host.removeSubServer(player, getName())) { waitFor(() -> host.getSubServer(getName()), null); - SubServer server = host.addSubServer(player, getName(), isEnabled(), value.asInt(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), isHidden(), isRestricted(), isTemporary()); + SubServer server = host.addSubServer(player, getName(), isEnabled(), value.asInt(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), isHidden(), isRestricted()); if (server != null) { if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Port", server.getAddress().getPort()); @@ -298,7 +305,7 @@ public class ExternalSubServer extends SubServerContainer { case "dir": if (value.isString() && host.removeSubServer(player, getName())) { waitFor(() -> host.getSubServer(getName()), null); - SubServer server = host.addSubServer(player, getName(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), value.asRawString(), getExecutable(), getStopCommand(), isHidden(), isRestricted(), isTemporary()); + SubServer server = host.addSubServer(player, getName(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), value.asRawString(), getExecutable(), getStopCommand(), isHidden(), isRestricted()); if (server != null) { if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Directory", server.getPath()); @@ -312,7 +319,7 @@ public class ExternalSubServer extends SubServerContainer { case "exec": if (value.isString() && host.removeSubServer(player, getName())) { waitFor(() -> host.getSubServer(getName()), null); - SubServer server = host.addSubServer(player, getName(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), new Executable(value.asRawString()), getStopCommand(), isHidden(), isRestricted(), isTemporary()); + SubServer server = host.addSubServer(player, getName(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), new Executable(value.asRawString()), getStopCommand(), isHidden(), isRestricted()); if (server != null) { if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Executable", value.asRawString()); @@ -339,6 +346,19 @@ public class ExternalSubServer extends SubServerContainer { c++; } break; + case "stop-action": + if (value.isString()) { + StopAction action = Util.getDespiteException(() -> StopAction.valueOf(value.asRawString().toUpperCase().replace('-', '_').replace(' ', '_')), null); + if (action != null) { + stopaction = action; + if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { + this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Stop-Action", getStopAction().toString()); + this.host.plugin.config.save(); + } + c++; + } + } + break; case "auto-run": if (value.isBoolean()) { if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { @@ -348,16 +368,6 @@ public class ExternalSubServer extends SubServerContainer { c++; } break; - case "auto-restart": - if (value.isBoolean()) { - restart = value.asBoolean(); - if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { - this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Auto-Restart", willAutoRestart()); - this.host.plugin.config.save(); - } - c++; - } - break; case "incompatible": if (value.isList()) { for (String oname : value.asStringList()) { @@ -399,7 +409,7 @@ public class ExternalSubServer extends SubServerContainer { break; } if (forward != null) { - if (willAutoRestart()) forward.setAutoRestart(true); + forward.setStopAction(getStopAction()); if (!getName().equals(getDisplayName())) forward.setDisplayName(getDisplayName()); List groups = new ArrayList(); groups.addAll(getGroups()); @@ -413,7 +423,6 @@ public class ExternalSubServer extends SubServerContainer { } for (String extra : getExtra().getKeys()) forward.addExtra(extra, getExtra(extra)); - forward.setEditable(true); if (state) pending.set("state", true); c += forward.edit(player, pending); break; @@ -447,7 +456,7 @@ public class ExternalSubServer extends SubServerContainer { public void setDisplayName(String value) { super.setDisplayName(value); logger.name = getDisplayName(); - new SubEditServerEvent(null, this, new NamedContainer("display", value), false); + host.plugin.getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("display", value), false)); } @Override @@ -463,21 +472,11 @@ public class ExternalSubServer extends SubServerContainer { @Override public void setEnabled(boolean value) { if (Util.isNull(value)) throw new NullPointerException(); - new SubEditServerEvent(null, this, new NamedContainer("enabled", value), false); + host.plugin.getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("enabled", value), false)); if (enabled != value) host.queue(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.SET_ENABLED, (Boolean) value)); enabled = value; } - @Override - public boolean isEditable() { - return editable; - } - - @Override - public void setEditable(boolean value) { - editable = value; - } - @Override public boolean isLogging() { return log.get(); @@ -486,7 +485,7 @@ public class ExternalSubServer extends SubServerContainer { @Override public void setLogging(boolean value) { if (Util.isNull(value)) throw new NullPointerException(); - new SubEditServerEvent(null, this, new NamedContainer("log", value), false); + host.plugin.getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("log", value), false)); if (log.get() != value) host.queue(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.SET_LOGGING, (Boolean) value)); log.set(value); } @@ -519,32 +518,20 @@ public class ExternalSubServer extends SubServerContainer { @Override public void setStopCommand(String value) { if (Util.isNull(value)) throw new NullPointerException(); - new SubEditServerEvent(null, this, new NamedContainer("stop-cmd", value), false); + host.plugin.getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("stop-cmd", value), false)); if (!stopcmd.equals(value)) host.queue(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.SET_STOP_COMMAND, value)); stopcmd = value; } @Override - public boolean willAutoRestart() { - return restart; + public StopAction getStopAction() { + return stopaction; } @Override - public void setAutoRestart(boolean value) { - if (Util.isNull(value)) throw new NullPointerException(); - new SubEditServerEvent(null, this, new NamedContainer("auto-restart", value), false); - restart = value; - } - - @Override - public boolean isTemporary() { - return temporary; - } - - @Override - public void setTemporary(boolean value) { - if (Util.isNull(value)) throw new NullPointerException(); - new SubEditServerEvent(null, this, new NamedContainer("temp", value), false); - this.temporary = !(value && !isRunning() && !start()) && value; + public void setStopAction(StopAction action) { + if (Util.isNull(action)) throw new NullPointerException(); + host.plugin.getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("stop-action", action), false)); + stopaction = action; } } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java index 6844a2d4..6319d4ee 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java @@ -39,6 +39,15 @@ public abstract class Host implements ExtraDataHandler { SubDataServer.allowConnection(address.getHostAddress()); } + /** + * Is this Host Available? + * + * @return Availability Status + */ + public boolean isAvailable() { + return true; + } + /** * Is this Host Enabled? * @@ -234,11 +243,10 @@ public abstract class Host implements ExtraDataHandler { * @param stopcmd Command to Stop the Server * @param hidden if the server should be hidden from players * @param restricted Players will need a permission to join if true - * @param temporary Temporary Status * @return The SubServer * @throws InvalidServerException */ - public abstract SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted, boolean temporary) throws InvalidServerException; + public abstract SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException; /** * Adds a SubServer @@ -253,12 +261,11 @@ public abstract class Host implements ExtraDataHandler { * @param stopcmd Command to Stop the Server * @param hidden if the server should be hidden from players * @param restricted Players will need a permission to join if true - * @param temporary Temporary Status * @return The SubServer * @throws InvalidServerException */ - public SubServer addSubServer(String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted, boolean temporary) throws InvalidServerException { - return addSubServer(null, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted, temporary); + public SubServer addSubServer(String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { + return addSubServer(null, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted); } /** @@ -382,6 +389,7 @@ public abstract class Host implements ExtraDataHandler { hinfo.set("type", "Host"); hinfo.set("name", getName()); hinfo.set("display", getDisplayName()); + hinfo.set("available", isAvailable()); hinfo.set("enabled", isEnabled()); hinfo.set("address", getAddress().getHostAddress()); hinfo.set("dir", getPath()); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java index df9ab43b..5475c0e1 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java @@ -92,9 +92,9 @@ public class InternalHost extends Host { } @Override - public SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted, boolean temporary) throws InvalidServerException { + public SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { if (plugin.api.getServers().keySet().contains(name.toLowerCase())) throw new InvalidServerException("A Server already exists with this name!"); - SubServer server = new InternalSubServer(this, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted, temporary); + SubServer server = new InternalSubServer(this, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted); SubAddServerEvent event = new SubAddServerEvent(player, this, server); plugin.getPluginManager().callEvent(event); if (!event.isCancelled()) { @@ -108,15 +108,15 @@ public class InternalHost extends Host { @Override public boolean removeSubServer(UUID player, String name) throws InterruptedException { if (Util.isNull(name)) throw new NullPointerException(); - SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(name)); + String server = servers.get(name.toLowerCase()).getName(); + SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server)); plugin.getPluginManager().callEvent(event); if (!event.isCancelled()) { - if (getSubServer(name).isRunning()) { - getSubServer(name).stop(); - getSubServer(name).waitFor(); + if (getSubServer(server).isRunning()) { + getSubServer(server).stop(); + getSubServer(server).waitFor(); } - - servers.remove(name.toLowerCase()); + servers.remove(server.toLowerCase()); return true; } else return false; } @@ -124,12 +124,13 @@ public class InternalHost extends Host { @Override public boolean forceRemoveSubServer(UUID player, String name) { if (Util.isNull(name)) throw new NullPointerException(); - SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(name)); + String server = servers.get(name.toLowerCase()).getName(); + SubRemoveServerEvent event = new SubRemoveServerEvent(player, this, getSubServer(server)); plugin.getPluginManager().callEvent(event); - if (getSubServer(name).isRunning()) { - getSubServer(name).terminate(); + if (getSubServer(server).isRunning()) { + getSubServer(server).terminate(); } - servers.remove(name.toLowerCase()); + servers.remove(server.toLowerCase()); return true; } @@ -172,7 +173,7 @@ public class InternalHost extends Host { } catch (Exception e) { e.printStackTrace(); } - System.out.println("SubServers > Done!"); + System.out.println("SubServers > Deleted SubServer: " + server); }).start(); return true; } else return false; @@ -217,7 +218,7 @@ public class InternalHost extends Host { } catch (Exception e) { e.printStackTrace(); } - System.out.println("SubServers > Done!"); + System.out.println("SubServers > Deleted SubServer: " + server); }).start(); return true; } else return false; 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 e5e67179..4bd95c31 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 @@ -2,14 +2,11 @@ package net.ME1312.SubServers.Bungee.Host.Internal; import net.ME1312.SubServers.Bungee.Event.SubCreateEvent; import net.ME1312.SubServers.Bungee.Host.*; +import net.ME1312.SubServers.Bungee.Library.*; import net.ME1312.SubServers.Bungee.Library.Config.YAMLConfig; import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection; -import net.ME1312.SubServers.Bungee.Library.Container; import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException; import net.ME1312.SubServers.Bungee.Library.Exception.SubCreatorException; -import net.ME1312.SubServers.Bungee.Library.NamedContainer; -import net.ME1312.SubServers.Bungee.Library.UniversalFile; -import net.ME1312.SubServers.Bungee.Library.Util; import net.ME1312.SubServers.Bungee.Library.Version.Version; import net.ME1312.SubServers.Bungee.SubAPI; import net.ME1312.SubServers.Bungee.SubPlugin; @@ -20,6 +17,7 @@ import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilderFactory; import java.io.*; +import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.nio.charset.Charset; import java.util.*; @@ -190,7 +188,7 @@ public class InternalSubCreator extends SubCreator { return server; } - private void run(UUID player, String name, ServerTemplate template, Version version, int port) { + private SubServer run(UUID player, String name, ServerTemplate template, Version version, int port) { NamedContainer thread = this.thread.get(name.toLowerCase()).get(); UniversalFile dir = new UniversalFile(new File(host.getPath()), name); dir.mkdirs(); @@ -217,7 +215,6 @@ public class InternalSubCreator extends SubCreator { new NamedContainer<>("$type$", template.getType().toString()), new NamedContainer<>("$version$", version.toString().replace(" ", "@")), new NamedContainer<>("$port$", Integer.toString(port)))); server.set("Enabled", true); - //server.set("Editable", true); server.set("Display", ""); server.set("Host", host.getName()); server.set("Group", new ArrayList()); @@ -227,25 +224,28 @@ public class InternalSubCreator extends SubCreator { server.set("Directory", "." + File.separatorChar + name); server.set("Executable", "java -Xmx1024M -jar " + template.getType().toString() + ".jar"); server.set("Stop-Command", "stop"); + server.set("Stop-Action", "NONE"); server.set("Run-On-Launch", false); - server.set("Auto-Restart", false); server.set("Restricted", false); server.set("Incompatible", new ArrayList()); server.set("Hidden", false); server.setAll(config); 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("Auto-Restart")) subserver.setAutoRestart(true); + new Executable(server.getRawString("Executable")), server.getRawString("Stop-Command"), server.getBoolean("Hidden"), server.getBoolean("Restricted")); if (server.getString("Display").length() > 0) subserver.setDisplayName(server.getString("Display")); for (String group : server.getStringList("Group")) subserver.addGroup(group); + SubServer.StopAction action = Util.getDespiteException(() -> SubServer.StopAction.valueOf(server.getRawString("Stop-Action").toUpperCase().replace('-', '_').replace(' ', '_')), null); + if (action != null) subserver.setStopAction(action); if (server.contains("Extra")) for (String extra : server.getSection("Extra").getKeys()) subserver.addExtra(extra, server.getSection("Extra").getObject(extra)); host.plugin.config.get().getSection("Servers").set(name, server); host.plugin.config.save(); if (template.getBuildOptions().getBoolean("Run-On-Finish", true)) subserver.start(); + + this.thread.remove(name.toLowerCase()); + return subserver; } catch (Exception e) { e.printStackTrace(); } @@ -253,6 +253,7 @@ public class InternalSubCreator extends SubCreator { System.out.println(name + File.separator + "Creator > Couldn't build the server jar. Check the SubCreator logs for more detail."); } this.thread.remove(name.toLowerCase()); + return null; } private Object convert(Object value, NamedContainer... replacements) { if (value instanceof Map) { List list = new ArrayList(); @@ -278,16 +279,27 @@ public class InternalSubCreator extends SubCreator { } @Override - public boolean create(UUID player, String name, ServerTemplate template, Version version, int port) { + public boolean create(UUID player, String name, ServerTemplate template, Version version, int port, Callback callback) { if (Util.isNull(name, template, version, port)) throw new NullPointerException(); - if (host.isEnabled() && template.isEnabled() && !SubAPI.getInstance().getSubServers().keySet().contains(name.toLowerCase()) && !SubCreator.isReserved(name)) { + if (host.isAvailable() && host.isEnabled() && template.isEnabled() && !SubAPI.getInstance().getSubServers().keySet().contains(name.toLowerCase()) && !SubCreator.isReserved(name)) { + StackTraceElement[] origin = new Exception().getStackTrace(); NamedContainer> thread = new NamedContainer>(null, new NamedContainer(new InternalSubLogger(null, this, name + File.separator + "Creator", new Container(false), null), null)); this.thread.put(name.toLowerCase(), thread); final SubCreateEvent event = new SubCreateEvent(player, host, name, template, version, port); host.plugin.getPluginManager().callEvent(event); if (!event.isCancelled()) { - thread.rename(new Thread(() -> InternalSubCreator.this.run(player, name, event.getTemplate(), event.getVersion(), port))); + thread.rename(new Thread(() -> { + SubServer server = InternalSubCreator.this.run(player, name, event.getTemplate(), event.getVersion(), port); + + if (callback != null && server != null) try { + callback.run(server); + } catch (Throwable e) { + Throwable ew = new InvocationTargetException(e); + ew.setStackTrace(origin); + ew.printStackTrace(); + } + })); thread.name().start(); return true; } else { diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java index 77971917..a0f835ef 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubServer.java @@ -28,20 +28,18 @@ import java.util.jar.JarInputStream; public class InternalSubServer extends SubServerContainer { private InternalHost host; private boolean enabled; - private boolean editable; private Container log; private String dir; private File directory; private Executable executable; private String stopcmd; + private StopAction stopaction; private LinkedList history; private Process process; private InternalSubLogger logger; private Thread thread; private BufferedWriter command; - private boolean restart; private boolean allowrestart; - private boolean temporary; private boolean lock; /** @@ -58,26 +56,24 @@ public class InternalSubServer extends SubServerContainer { * @param stopcmd Stop Command * @param hidden Hidden Status * @param restricted Restricted Status - * @param temporary Temporary Status * @throws InvalidServerException */ - public InternalSubServer(InternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted, boolean temporary) throws InvalidServerException { + public InternalSubServer(InternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException { super(host, name, port, motd, hidden, restricted); - if (Util.isNull(host, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted, temporary)) throw new NullPointerException(); + if (Util.isNull(host, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted)) throw new NullPointerException(); this.host = host; this.enabled = enabled; - this.editable = false; this.log = new Container(log); this.dir = directory; this.directory = new File(host.getPath(), directory); this.executable = executable; this.stopcmd = stopcmd; + this.stopaction = StopAction.NONE; this.history = new LinkedList(); this.process = null; this.logger = new InternalSubLogger(null, this, getName(), this.log, null); this.thread = null; this.command = null; - this.restart = false; if (new UniversalFile(this.directory, "plugins:SubServers.Client.jar").exists()) { try { @@ -116,7 +112,6 @@ public class InternalSubServer extends SubServerContainer { e.printStackTrace(); } } - this.temporary = temporary && start(); this.lock = false; } @@ -147,16 +142,26 @@ public class InternalSubServer extends SubServerContainer { command = null; history.clear(); - if (isTemporary()) { + if (stopaction == StopAction.REMOVE_SERVER || stopaction == StopAction.DELETE_SERVER) { try { - if (host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) - host.plugin.config.get().getSection("Servers").remove(getName()); - host.removeSubServer(getName()); + if (stopaction == StopAction.DELETE_SERVER) { + host.deleteSubServer(getName()); + } else { + try { + if (host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { + host.plugin.config.get().getSection("Servers").remove(getName()); + host.plugin.config.save(); + } + } catch (IOException e) { + e.printStackTrace(); + } + host.removeSubServer(getName()); + } } catch (InterruptedException e) { e.printStackTrace(); } - } else { - if (willAutoRestart() && allowrestart) { + } else if (stopaction == StopAction.RESTART) { + if (allowrestart) { new Thread(() -> { try { while (thread != null && thread.isAlive()) { @@ -251,7 +256,7 @@ public class InternalSubServer extends SubServerContainer { boolean state = isRunning(); SubServer forward = null; YAMLSection pending = edit.clone(); - if (editable) for (String key : edit.getKeys()) { + for (String key : edit.getKeys()) { pending.remove(key); YAMLValue value = edit.get(key); SubEditServerEvent event = new SubEditServerEvent(player, this, new NamedContainer(key, value), true); @@ -261,7 +266,7 @@ public class InternalSubServer extends SubServerContainer { switch (key) { case "name": if (value.isString() && host.removeSubServer(player, getName())) { - SubServer server = host.addSubServer(player, value.asRawString(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), isHidden(), isRestricted(), isTemporary()); + SubServer server = host.addSubServer(player, value.asRawString(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), isHidden(), isRestricted()); if (server != null) { if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { YAMLSection config = this.host.plugin.config.get().getSection("Servers").getSection(getName()); @@ -321,7 +326,7 @@ public class InternalSubServer extends SubServerContainer { break; case "host": if (value.isString() && host.removeSubServer(player, getName())) { - SubServer server = this.host.plugin.api.getHost(value.asRawString()).addSubServer(player, getName(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), isHidden(), isRestricted(), isTemporary()); + SubServer server = this.host.plugin.api.getHost(value.asRawString()).addSubServer(player, getName(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), isHidden(), isRestricted()); if (server != null) { if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Host", server.getHost().getName()); @@ -334,7 +339,7 @@ public class InternalSubServer extends SubServerContainer { break; case "port": if (value.isNumber() && host.removeSubServer(player, getName())) { - SubServer server = host.addSubServer(player, getName(), isEnabled(), value.asInt(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), isHidden(), isRestricted(), isTemporary()); + SubServer server = host.addSubServer(player, getName(), isEnabled(), value.asInt(), getMotd(), isLogging(), getPath(), getExecutable(), getStopCommand(), isHidden(), isRestricted()); if (server != null) { if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Port", server.getAddress().getPort()); @@ -407,6 +412,19 @@ public class InternalSubServer extends SubServerContainer { c++; } break; + case "stop-action": + if (value.isString()) { + StopAction action = Util.getDespiteException(() -> StopAction.valueOf(value.asRawString().toUpperCase().replace('-', '_').replace(' ', '_')), null); + if (action != null) { + stopaction = action; + if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { + this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Stop-Action", getStopAction().toString()); + this.host.plugin.config.save(); + } + c++; + } + } + break; case "state": if (value.isBoolean()) { state = value.asBoolean(); @@ -421,16 +439,6 @@ public class InternalSubServer extends SubServerContainer { c++; } break; - case "auto-restart": - if (value.isBoolean()) { - restart = value.asBoolean(); - if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) { - this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Auto-Restart", willAutoRestart()); - this.host.plugin.config.save(); - } - c++; - } - break; case "incompatible": if (value.isList()) { for (String oname : value.asStringList()) { @@ -472,7 +480,7 @@ public class InternalSubServer extends SubServerContainer { break; } if (forward != null) { - if (willAutoRestart()) forward.setAutoRestart(true); + forward.setStopAction(getStopAction()); if (!getName().equals(getDisplayName())) forward.setDisplayName(getDisplayName()); List groups = new ArrayList(); groups.addAll(getGroups()); @@ -486,7 +494,6 @@ public class InternalSubServer extends SubServerContainer { } for (String extra : getExtra().getKeys()) forward.addExtra(extra, getExtra(extra)); - forward.setEditable(true); if (state) pending.set("state", true); c += forward.edit(player, pending); break; @@ -531,20 +538,10 @@ public class InternalSubServer extends SubServerContainer { @Override public void setEnabled(boolean value) { if (Util.isNull(value)) throw new NullPointerException(); - new SubEditServerEvent(null, this, new NamedContainer("enabled", value), false); + host.plugin.getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("enabled", value), false)); enabled = value; } - @Override - public boolean isEditable() { - return editable; - } - - @Override - public void setEditable(boolean value) { - editable = value; - } - @Override public boolean isLogging() { return log.get(); @@ -553,7 +550,7 @@ public class InternalSubServer extends SubServerContainer { @Override public void setLogging(boolean value) { if (Util.isNull(value)) throw new NullPointerException(); - new SubEditServerEvent(null, this, new NamedContainer("log", value), false); + host.plugin.getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("log", value), false)); log.set(value); } @@ -585,31 +582,19 @@ public class InternalSubServer extends SubServerContainer { @Override public void setStopCommand(String value) { if (Util.isNull(value)) throw new NullPointerException(); - new SubEditServerEvent(null, this, new NamedContainer("stop-cmd", value), false); + host.plugin.getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("stop-cmd", value), false)); stopcmd = value; } @Override - public boolean willAutoRestart() { - return restart; + public StopAction getStopAction() { + return stopaction; } @Override - public void setAutoRestart(boolean value) { - if (Util.isNull(value)) throw new NullPointerException(); - new SubEditServerEvent(null, this, new NamedContainer("auto-restart", value), false); - restart = value; - } - - @Override - public boolean isTemporary() { - return temporary; - } - - @Override - public void setTemporary(boolean value) { - if (Util.isNull(value)) throw new NullPointerException(); - new SubEditServerEvent(null, this, new NamedContainer("temp", value), false); - temporary = !(value && !isRunning() && !start()) && value; + public void setStopAction(StopAction action) { + if (Util.isNull(action)) throw new NullPointerException(); + host.plugin.getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("stop-action", action), false)); + stopaction = action; } } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java index 35ece44c..4be2b4f3 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java @@ -54,12 +54,13 @@ public class ServerContainer extends BungeeServerInfo implements Server { } @Override + @SuppressWarnings("deprecation") public void setDisplayName(String value) { if (value == null || value.length() == 0 || getName().equals(value)) { - new SubEditServerEvent(null, this, new NamedContainer("display", getName()), false); + SubAPI.getInstance().getInternals().getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("display", getName()), false)); this.nick = null; } else { - new SubEditServerEvent(null, this, new NamedContainer("display", value), false); + SubAPI.getInstance().getInternals().getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("display", value), false)); this.nick = value; } } @@ -108,15 +109,17 @@ public class ServerContainer extends BungeeServerInfo implements Server { } @Override + @SuppressWarnings("deprecation") public void setHidden(boolean value) { if (Util.isNull(value)) throw new NullPointerException(); - new SubEditServerEvent(null, this, new NamedContainer("hidden", value), false); + SubAPI.getInstance().getInternals().getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("hidden", value), false)); this.hidden = value; } + @SuppressWarnings("deprecation") public void setMotd(String value) { if (Util.isNull(value)) throw new NullPointerException(); - new SubEditServerEvent(null, this, new NamedContainer("motd", value), false); + SubAPI.getInstance().getInternals().getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("motd", value), false)); try { Field f = BungeeServerInfo.class.getDeclaredField("motd"); f.setAccessible(true); @@ -127,9 +130,10 @@ public class ServerContainer extends BungeeServerInfo implements Server { } } + @SuppressWarnings("deprecation") public void setRestricted(boolean value) { if (Util.isNull(value)) throw new NullPointerException(); - new SubEditServerEvent(null, this, new NamedContainer("restricted", value), false); + SubAPI.getInstance().getInternals().getPluginManager().callEvent(new SubEditServerEvent(null, this, new NamedContainer("restricted", value), false)); try { Field f = BungeeServerInfo.class.getDeclaredField("restricted"); f.setAccessible(true); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubCreator.java index cc02bbb9..6f68dd39 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubCreator.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubCreator.java @@ -1,5 +1,6 @@ package net.ME1312.SubServers.Bungee.Host; +import net.ME1312.SubServers.Bungee.Library.Callback; import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection; import net.ME1312.SubServers.Bungee.Library.Exception.InvalidTemplateException; import net.ME1312.SubServers.Bungee.Library.Util; @@ -170,148 +171,17 @@ public abstract class SubCreator { } } - public SubCreator() { - /* - if (!defaults) { - defaults = true; - addValidator("System", (template, match, string) -> { - boolean validated; - switch (match.toLowerCase()) { - case "touppercase": - string.set(string.get().toUpperCase()); - validated = true; - break; - case "tolowercase": - string.set(string.get().toLowerCase()); - validated = true; - break; - case "toserverversion": - try { - Version version = new Version(string.get()); - if (template.getType() == ServerType.VANILLA) { - String patch = "Patch"; - if (version.compareTo(new Version("1.12")) >= 0) patch += "-v2"; - version = new Version(version.toString() + " " + patch); - } else if (template.getType() == ServerType.SPONGE) { - Document spongexml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(Util.readAll(new BufferedReader(new InputStreamReader(new URL("http://files.minecraftforge.net/maven/org/spongepowered/spongeforge/maven-metadata.xml").openStream(), Charset.forName("UTF-8"))))))); - Document forgexml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(Util.readAll(new BufferedReader(new InputStreamReader(new URL("http://files.minecraftforge.net/maven/net/minecraftforge/forge/maven-metadata.xml").openStream(), Charset.forName("UTF-8"))))))); - - NodeList spnodeList = spongexml.getElementsByTagName("version"); - Version spversion = null; - for (int i = 0; i < spnodeList.getLength(); i++) { - Node node = spnodeList.item(i); - if (node.getNodeType() == Node.ELEMENT_NODE) { - if (node.getTextContent().startsWith(version.toString() + '-') && (spversion == null || new Version(node.getTextContent()).compareTo(spversion) >= 0)) { - spversion = new Version(node.getTextContent()); - } - } - } - if (spversion == null) - throw new InvalidServerException("Cannot find sponge version for Minecraft " + version.toString()); - - NodeList mcfnodeList = forgexml.getElementsByTagName("version"); - Version mcfversion = null; - for (int i = 0; i < mcfnodeList.getLength(); i++) { - Node node = mcfnodeList.item(i); - if (node.getNodeType() == Node.ELEMENT_NODE) { - if (node.getTextContent().contains(spversion.toString().split("\\-")[1]) && (mcfversion == null || new Version(node.getTextContent()).compareTo(mcfversion) >= 0)) { - mcfversion = new Version(node.getTextContent()); - } - } - } - if (mcfversion == null) - throw new InvalidServerException("Cannot find forge version for Sponge " + spversion.toString()); - - version = new Version(mcfversion.toString() + " " + spversion.toString()); - } - string.set(version.toString()); - validated = true; - } catch (Exception e) { - e.printStackTrace(); - validated = false; - } - break; - default: - validated = false; - } - return validated; - }); - addValidator("Integer", (template, match, string) -> { - Matcher matcher = Pattern.compile("^([!<>=][=]?)(.*)$").matcher(match); - String comparator = ""; - String other = ""; - while (matcher.find()) { - comparator = matcher.group(1).toUpperCase(); - other = matcher.group(2); - } - - boolean validated; - switch (comparator) { - case "=": - case "==": - validated = string.get().equals(other); - break; - case "!": - case "!=": - validated = !string.get().equals(other); - break; - case "<": - validated = new Version(string.get()).compareTo(new Version(other)) < 0; - break; - case "<=": - validated = new Version(string.get()).compareTo(new Version(other)) <= 0; - break; - case ">": - validated = new Version(string.get()).compareTo(new Version(other)) > 0; - break; - case ">=": - validated = new Version(string.get()).compareTo(new Version(other)) >= 0; - break; - default: - validated = false; - } - return validated; - }); - addValidator("RegEx", (template, match, string) -> { - Matcher matcher = Pattern.compile("^/(.*)/([iux]*)$").matcher(match); - String pattern = ""; - char[] flags = new char[0]; - while (matcher.find()) { - pattern = matcher.group(1); - if (matcher.groupCount() >= 2) - flags = matcher.group(2).toCharArray(); - } - - int byteflags = 0x00; - for (char flag : flags) { - switch (flag) { - case 'i': - byteflags |= Pattern.CASE_INSENSITIVE; - break; - case 'u': - byteflags |= Pattern.UNICODE_CASE; - break; - case 'x': - byteflags |= Pattern.COMMENTS; - break; - } - } - - if (byteflags == 0x00) { - matcher = Pattern.compile(pattern).matcher(match); - } else { - matcher = Pattern.compile(pattern, byteflags).matcher(match); - } - boolean validated = false; - while (matcher.find()) { - string.set(matcher.group()); - validated = true; - } - return validated; - }); - } - */ - } + /** + * Create a SubServer + * + * @param player Player Creating + * @param name Server Name + * @param template Server Template + * @param version Server Version + * @param port Server Port Number + * @return Success Status + */ + public abstract boolean create(UUID player, String name, ServerTemplate template, Version version, int port, Callback callback); /** * Create a SubServer @@ -323,7 +193,22 @@ public abstract class SubCreator { * @param port Server Port Number * @return Success Status */ - public abstract boolean create(UUID player, String name, ServerTemplate template, Version version, int port); + public boolean create(UUID player, String name, ServerTemplate template, Version version, int port) { + return create(player, name, template, version, port, null); + } + + /** + * Create a SubServer + * + * @param name Server Name + * @param template Server Template + * @param version Server Version + * @param port Server Port Number + * @return Success Status + */ + public boolean create(String name, ServerTemplate template, Version version, int port, Callback callback) { + return create(null, name, template, version, port, callback); + } /** * Create a SubServer diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServer.java index fc0a9d50..2cd24c83 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServer.java @@ -9,6 +9,22 @@ import java.util.*; * SubServer Interface */ public interface SubServer extends Server { + + /** + * SubServer Stop Action Class + */ + enum StopAction { + NONE, + RESTART, + REMOVE_SERVER, + DELETE_SERVER; + + @Override + public String toString() { + return super.toString().substring(0, 1).toUpperCase()+super.toString().substring(1).toLowerCase().replace('_', ' '); + } + } + /** * Command Storage Class */ @@ -153,7 +169,9 @@ public interface SubServer extends Server { * @param edit Edits * @return Success Status */ - int edit(UUID player, YAMLSection edit); + default int edit(UUID player, YAMLSection edit) { + return -1; + } /** * Edits the Server @@ -161,7 +179,9 @@ public interface SubServer extends Server { * @param edit Edits * @return Success Status */ - int edit(YAMLSection edit); + default int edit(YAMLSection edit) { + return -1; + } /** * Waits for the Server to Stop @@ -205,16 +225,9 @@ public interface SubServer extends Server { * @see #edit(UUID, YAMLSection) * @return Edit Status */ - boolean isEditable(); - - /** - * Set if the Server should accept requests to edit() - * - * @param value Edit Status - * @see #edit(YAMLSection) - * @see #edit(UUID, YAMLSection) - */ - void setEditable(boolean value); + default boolean isEditable() { + return edit(new YAMLSection()) >= 0; + } /** * If the Server is Logging @@ -278,18 +291,18 @@ public interface SubServer extends Server { void setStopCommand(String value); /** - * If the Server will Auto Restart on unexpected shutdowns + * Get the action the Server will take when it stops * - * @return Auto Restart Status + * @return Stop Action */ - boolean willAutoRestart(); + StopAction getStopAction(); /** - * Set if the Server will Auto Restart on unexpected shutdowns + * Set the action the Server will take when it stops * - * @param value Value + * @param action Stop Action */ - void setAutoRestart(boolean value); + void setStopAction(StopAction action); /** * Toggles compatibility with other Servers @@ -311,7 +324,7 @@ public interface SubServer extends Server { * * @return Incompatibility List */ - List getIncompatibilities() ; + List getIncompatibilities(); /** * Get incompatibility issues this server currently has @@ -319,18 +332,4 @@ public interface SubServer extends Server { * @return Current Incompatibility List */ List getCurrentIncompatibilities(); - - /** - * If the Server is Temporary - * - * @return Temporary Status - */ - boolean isTemporary(); - - /** - * Set If the Server is Temporary (will start server if not running) - * - * @param value Value - */ - void setTemporary(boolean value); } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java index 4856d566..43384956 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java @@ -113,22 +113,21 @@ public abstract class SubServerContainer extends ServerContainer implements SubS YAMLSection sinfo = new YAMLSection(new Gson().fromJson(super.toString(), Map.class)); sinfo.set("type", "SubServer"); sinfo.set("host", getHost().getName()); - sinfo.set("enabled", isEnabled() && getHost().isEnabled()); + sinfo.set("enabled", isEnabled()); sinfo.set("editable", isEditable()); sinfo.set("log", isLogging()); sinfo.set("dir", getPath()); sinfo.set("exec", getExecutable()); sinfo.set("running", isRunning()); sinfo.set("stop-cmd", getStopCommand()); + sinfo.set("stop-action", getStopAction().toString()); sinfo.set("auto-run", SubAPI.getInstance().getInternals().config.get().getSection("Servers").getSection(getName()).getKeys().contains("Run-On-Launch") && SubAPI.getInstance().getInternals().config.get().getSection("Servers").getSection(getName()).getBoolean("Run-On-Launch")); - sinfo.set("auto-restart", willAutoRestart()); List incompatibleCurrent = new ArrayList(); List incompatible = new ArrayList(); for (SubServer server : getCurrentIncompatibilities()) incompatibleCurrent.add(server.getName()); for (SubServer server : getIncompatibilities()) incompatible.add(server.getName()); sinfo.set("incompatible", incompatibleCurrent); sinfo.set("incompatible-list", incompatible); - sinfo.set("temp", isTemporary()); return sinfo.toJSON(); } } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java index 64ddffbb..559e29d1 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerController.java @@ -9,7 +9,7 @@ import java.util.*; * API-Safe SubServer Layout Class */ public abstract class SubServerController { - private final net.ME1312.SubServers.Bungee.Host.SubServerContainer control; + private final SubServerContainer control; /** * Creates a SubServer @@ -98,16 +98,6 @@ public abstract class SubServerController { SubServerController.this.setEnabled(value); } - @Override - public boolean isEditable() { - return SubServerController.this.isEditable(); - } - - @Override - public void setEditable(boolean value) { - SubServerController.this.setEditable(value); - } - @Override public boolean isLogging() { return SubServerController.this.isLogging(); @@ -149,23 +139,13 @@ public abstract class SubServerController { } @Override - public boolean willAutoRestart() { - return SubServerController.this.willAutoRestart(); + public StopAction getStopAction() { + return SubServerController.this.getStopAction(); } @Override - public void setAutoRestart(boolean value) { - SubServerController.this.setAutoRestart(value); - } - - @Override - public boolean isTemporary() { - return SubServerController.this.isTemporary(); - } - - @Override - public void setTemporary(boolean value) { - SubServerController.this.setTemporary(value); + public void setStopAction(StopAction action) { + SubServerController.this.setStopAction(action); } }; } @@ -256,7 +236,9 @@ public abstract class SubServerController { * @param edit Edits * @return Success Status */ - public abstract int edit(UUID player, YAMLSection edit); + public int edit(UUID player, YAMLSection edit) { + return -1; + } /** * Edits the Server @@ -265,7 +247,7 @@ public abstract class SubServerController { * @return Success Status */ public int edit(YAMLSection edit) { - return edit(null, edit); + return -1; } /** @@ -303,24 +285,6 @@ public abstract class SubServerController { */ public abstract void setEnabled(boolean value); - /** - * If the Server is accepting requests to edit() - * - * @see #edit(YAMLSection) - * @see #edit(UUID, YAMLSection) - * @return Edit Status - */ - public abstract boolean isEditable(); - - /** - * Set if the Server should accept requests to edit() - * - * @param value Edit Status - * @see #edit(YAMLSection) - * @see #edit(UUID, YAMLSection) - */ - public abstract void setEditable(boolean value); - /** * If the Server is Logging * @@ -376,32 +340,18 @@ public abstract class SubServerController { public abstract void setStopCommand(String value); /** - * If the Server will Auto Restart on unexpected shutdowns + * Get the action the Server will take when it stops * - * @return Auto Restart Status + * @return Stop Action */ - public abstract boolean willAutoRestart(); + public abstract SubServer.StopAction getStopAction(); /** - * Set if the Server will Auto Restart on unexpected shutdowns + * Set the action the Server will take when it stops * - * @param value Value + * @param action Stop Action */ - public abstract void setAutoRestart(boolean value); - - /** - * If the Server is Temporary - * - * @return Temporary Status - */ - public abstract boolean isTemporary(); - - /** - * Set If the Server is Temporary (will start server if not running) - * - * @param value Value - */ - public abstract void setTemporary(boolean value); + public abstract void setStopAction(SubServer.StopAction action); @Override public String toString() { diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/config.yml b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/config.yml index 35832965..afb3aab4 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/config.yml +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Files/config.yml @@ -29,8 +29,8 @@ Servers: Directory: './Example' Executable: 'java -Djline.terminal=jline.UnsupportedTerminal -jar Spigot.jar' Stop-Command: 'stop' + Stop-Action: 'NONE' Run-On-Launch: false - Auto-Restart: false Restricted: false Incompatible: [] Hidden: false \ No newline at end of file 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 efeb7218..81c0b77c 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 @@ -54,6 +54,7 @@ Lang: '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' + 'Command.Start.Host-Unavailable': '&cSubServers &4&l\u00BB&c That SubServer\u0027s Host is not available' 'Command.Start.Host-Disabled': '&cSubServers &4&l\u00BB&c That SubServer\u0027s Host is not enabled' 'Command.Start.Server-Disabled': '&cSubServers &4&l\u00BB&c That SubServer is not enabled' 'Command.Start.Server-Incompatible': '&cSubServers &4&l\u00BB&c That SubServer cannot start while these server(s) are running: &4$str$' @@ -73,7 +74,10 @@ Lang: 'Command.Creator': '&aSubServers &2&l\u00BB&a Creating SubServer' 'Command.Creator.Exists': '&cSubServers &4&l\u00BB&c There is already a SubServer with that name' 'Command.Creator.Unknown-Host': '&cSubServers &4&l\u00BB&c There is no Host with that name' - 'Command.Creator.Invalid-Template': '&cSubServers &4&l\u00BB&c There is no Template with that name' + 'Command.Creator.Host-Unavailable': '&cSubServers &4&l\u00BB&c That Host is not available' + 'Command.Creator.Host-Disabled': '&cSubServers &4&l\u00BB&c That Host is not enabled' + 'Command.Creator.Unknown-Template': '&cSubServers &4&l\u00BB&c There is no Template with that name' + 'Command.Creator.Template-Disabled': '&cSubServers &4&l\u00BB&c That Template is not enabled' 'Command.Creator.Invalid-Version': '&cSubServers &4&l\u00BB&c SubCreator cannot create servers before Minecraft 1.8' 'Command.Creator.Invalid-Port': '&cSubServers &4&l\u00BB&c Invalid Port Number' 'Interface.Generic.Back': '&cBack' @@ -92,6 +96,7 @@ Lang: 'Interface.Proxy-Menu.Proxy-Redis': '&7Redis Only' 'Interface.Proxy-Menu.Proxy-Disconnected': '&4Disconnected' 'Interface.Host-Menu.Title': 'Host Menu' + 'Interface.Host-Menu.Host-Unavailable': '&4Unavailable' 'Interface.Host-Menu.Host-Disabled': '&4Disabled' 'Interface.Host-Menu.Host-Server-Count': '&9$int$ Server(s)' 'Interface.Host-Menu.No-Hosts': '&c&oThere are No Hosts' diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Metrics.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Metrics.java index 3fe3e9e3..d5e9b63f 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Metrics.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Metrics.java @@ -173,7 +173,7 @@ public class Metrics { int playerAmount = plugin.getOnlineCount(); playerAmount = playerAmount > 500 ? 500 : playerAmount; int onlineMode = plugin.getConfig().isOnlineMode() ? 1 : 0; - String bungeecordVersion = (plugin.getName().equals("SubServers.Bungee"))?"SubServers-Bungee-Patched":plugin.getVersion(); + String bungeecordVersion = (plugin.getName().equals("SubServers Platform"))?"SubServers-Bungee-Patched":plugin.getVersion(); int managedServers = plugin.getServers().size(); // OS/Java specific data diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketCreateServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketCreateServer.java index e5a59291..98fdfd99 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketCreateServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketCreateServer.java @@ -1,6 +1,7 @@ package net.ME1312.SubServers.Bungee.Network.Packet; import net.ME1312.SubServers.Bungee.Host.SubCreator; +import net.ME1312.SubServers.Bungee.Host.SubServer; import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection; import net.ME1312.SubServers.Bungee.Library.Version.Version; import net.ME1312.SubServers.Bungee.Network.Client; @@ -59,13 +60,18 @@ public class PacketCreateServer implements PacketIn, PacketOut { client.sendPacket(new PacketCreateServer(4, "There is already a subserver with that name", (data.contains("id")) ? data.getRawString("id") : null)); } else if (!plugin.hosts.keySet().contains(data.getSection("creator").getString("host").toLowerCase())) { client.sendPacket(new PacketCreateServer(5, "There is no Host with that name", (data.contains("id")) ? data.getRawString("id") : null)); - } else if (!plugin.hosts.get(data.getSection("creator").getString("host").toLowerCase()).getCreator().getTemplates().keySet().contains(data.getSection("creator").getString("template").toLowerCase()) || - !plugin.hosts.get(data.getSection("creator").getString("host").toLowerCase()).getCreator().getTemplate(data.getSection("creator").getString("template")).isEnabled()) { - client.sendPacket(new PacketCreateServer(6, "There is no template with that name", (data.contains("id")) ? data.getRawString("id") : null)); + } else if (!plugin.hosts.get(data.getSection("creator").getString("host").toLowerCase()).isAvailable()) { + client.sendPacket(new PacketStartServer(6, "That SubServer's Host is not available", (data.contains("id"))?data.getRawString("id"):null)); + } else if (!plugin.hosts.get(data.getSection("creator").getString("host").toLowerCase()).isEnabled()) { + client.sendPacket(new PacketStartServer(7, "That SubServer's Host is not enabled", (data.contains("id"))?data.getRawString("id"):null)); + } else if (!plugin.hosts.get(data.getSection("creator").getString("host").toLowerCase()).getCreator().getTemplates().keySet().contains(data.getSection("creator").getString("template").toLowerCase())) { + client.sendPacket(new PacketCreateServer(8, "There is no template with that name", (data.contains("id")) ? data.getRawString("id") : null)); + } else if (!plugin.hosts.get(data.getSection("creator").getString("host").toLowerCase()).getCreator().getTemplate(data.getSection("creator").getString("template")).isEnabled()) { + client.sendPacket(new PacketCreateServer(8, "That Template is not enabled", (data.contains("id")) ? data.getRawString("id") : null)); } else if (new Version("1.8").compareTo(new Version(data.getSection("creator").getString("version"))) > 0) { - client.sendPacket(new PacketCreateServer(7, "SubCreator cannot create servers before Minecraft 1.8", (data.contains("id")) ? data.getRawString("id") : null)); + client.sendPacket(new PacketCreateServer(10, "SubCreator cannot create servers before Minecraft 1.8", (data.contains("id")) ? data.getRawString("id") : null)); } else if (data.getSection("creator").getInt("port") <= 0 || data.getSection("creator").getInt("port") > 65535) { - client.sendPacket(new PacketCreateServer(8, "Invalid Port Number", (data.contains("id")) ? data.getRawString("id") : null)); + client.sendPacket(new PacketCreateServer(11, "Invalid Port Number", (data.contains("id")) ? data.getRawString("id") : null)); } else { if (plugin.hosts.get(data.getSection("creator").getString("host").toLowerCase()).getCreator().create((data.contains("player"))?UUID.fromString(data.getRawString("player")):null, data.getSection("creator").getString("name"), plugin.hosts.get(data.getSection("creator").getString("host").toLowerCase()).getCreator().getTemplate(data.getSection("creator").getString("template")), new Version(data.getSection("creator").getString("version")), data.getSection("creator").getInt("port"))) { if (data.contains("wait") && data.getBoolean("wait")) { diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketEditServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketEditServer.java deleted file mode 100644 index 9e8b9059..00000000 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketEditServer.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.ME1312.SubServers.Bungee.Network.Packet; - -import net.ME1312.SubServers.Bungee.Host.Server; -import net.ME1312.SubServers.Bungee.Host.SubServer; -import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection; -import net.ME1312.SubServers.Bungee.Library.Util; -import net.ME1312.SubServers.Bungee.Library.Version.Version; -import net.ME1312.SubServers.Bungee.Network.Client; -import net.ME1312.SubServers.Bungee.Network.PacketIn; -import net.ME1312.SubServers.Bungee.Network.PacketOut; -import net.ME1312.SubServers.Bungee.SubPlugin; - -import java.util.Map; -import java.util.UUID; - -/** - * Edit Server Packet - */ -public class PacketEditServer implements PacketIn, PacketOut { - private SubPlugin plugin; - private int response; - private String id; - - /** - * New PacketEditServer (In) - * - * @param plugin SubPlugin - */ - public PacketEditServer(SubPlugin plugin) { - if (Util.isNull(plugin)) throw new NullPointerException(); - this.plugin = plugin; - } - - /** - * New PacketEditServer (Out) - * - * @param response Response ID - * @param id Receiver ID - */ - public PacketEditServer(int response, String id) { - if (Util.isNull(response)) throw new NullPointerException(); - this.response = response; - this.id = id; - } - - @Override - public YAMLSection generate() { - YAMLSection json = new YAMLSection(); - if (id != null) json.set("id", id); - json.set("r", response); - return json; - } - - @Override - public void execute(Client client, YAMLSection data) { - try { - Map servers = plugin.api.getServers(); - if (!servers.keySet().contains(data.getRawString("server").toLowerCase()) || !(servers.get(data.getRawString("server").toLowerCase()) instanceof SubServer)) { - client.sendPacket(new PacketEditServer(0, (data.contains("id"))?data.getRawString("id"):null)); - } else { - new Thread(() -> client.sendPacket(new PacketEditServer(((SubServer) servers.get(data.getRawString("server").toLowerCase())).edit((data.contains("player"))?UUID.fromString(data.getRawString("player")):null, data.getSection("edit").clone()) * -1, (data.contains("id"))?data.getRawString("id"):null))).start(); - } - } catch (Throwable e) { - client.sendPacket(new PacketEditServer(0, (data.contains("id"))?data.getRawString("id"):null)); - e.printStackTrace(); - } - } - - @Override - public Version getVersion() { - return new Version("2.11.0a"); - } -} diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketListenLog.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketListenLog.java deleted file mode 100644 index 23f8ab57..00000000 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketListenLog.java +++ /dev/null @@ -1,130 +0,0 @@ -package net.ME1312.SubServers.Bungee.Network.Packet; - -import net.ME1312.SubServers.Bungee.Host.Host; -import net.ME1312.SubServers.Bungee.Host.SubLogFilter; -import net.ME1312.SubServers.Bungee.Host.SubLogger; -import net.ME1312.SubServers.Bungee.Host.SubServer; -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.Client; -import net.ME1312.SubServers.Bungee.Network.PacketIn; -import net.ME1312.SubServers.Bungee.Network.PacketOut; -import net.ME1312.SubServers.Bungee.SubPlugin; - -import java.text.SimpleDateFormat; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; -import java.util.logging.Level; - -/** - * Server Log Listener Packet - */ -public class PacketListenLog implements PacketIn, PacketOut { - private static HashMap> filters = new HashMap>(); - private SubPlugin plugin; - private SubLogger.LogMessage[] lines; - private String id; - - /** - * New PacketListenServerLog (In) - * - * @param plugin SubPlugin - */ - public PacketListenLog(SubPlugin plugin) { - if (Util.isNull(plugin)) throw new NullPointerException(); - this.plugin = plugin; - } - - /** - * New PacketListenServerLog (Out) - * - * @param line Message - * @param id Receiver ID - */ - public PacketListenLog(String id, SubLogger.LogMessage... line) { - if (Util.isNull(id, line)) throw new NullPointerException(); - this.lines = line; - this.id = id; - } - - @Override - public YAMLSection generate() { - YAMLSection add = new YAMLSection(); - if (id != null) add.set("id", id); - LinkedList lines = new LinkedList(); - for (SubLogger.LogMessage line : this.lines) lines.add(new SimpleDateFormat("hh:mm:ss").format(line.getDate()) + " [" + line.getLevel().getLocalizedName() + "] " + line.getMessage()); - add.set("lines", lines); - return add; - } - - @Override - public void execute(Client client, YAMLSection data) { - if (data != null && data.contains("id")) { - if (data.contains("server")) { - if (data.getRawString("server").length() == 0) { - unregister(data.getRawString("id")); - } else { - Map servers = plugin.api.getSubServers(); - if (servers.keySet().contains(data.getRawString("server").toLowerCase())) { - register(client, data.getRawString("id"), servers.get(data.getRawString("server").toLowerCase()).getLogger()); - } - } - } else if (data.contains("creator")) { - if (data.getRawString("creator").length() == 0) { - unregister(data.getRawString("id")); - } else { - Map hosts = plugin.api.getHosts(); - if (hosts.keySet().contains(data.getRawString("creator").toLowerCase())) { - register(client, data.getRawString("id"), hosts.get(data.getRawString("creator").toLowerCase()).getCreator().getLogger(data.getRawString("name"))); - } - } - } - } - } - - private void register(Client client, String id, SubLogger logger) { - client.sendPacket(new PacketListenLog(id, logger.getMessageHistory().toArray(new SubLogger.LogMessage[logger.getMessageHistory().size()]))); - SubLogFilter filter = new SubLogFilter() { - @Override - public void start() { - if (client.getConnection().isClosed()) { - unregister(id); - } - } - - @Override - public boolean log(Level level, String message) { - if (client.getConnection().isClosed()) { - unregister(id); - } else { - client.sendPacket(new PacketListenLog(id, new SubLogger.LogMessage(level, message))); - } - return true; - } - - @Override - public void stop() { - if (client.getConnection().isClosed()) { - unregister(id); - } - } - }; - filters.put(id, new NamedContainer(logger, filter)); - logger.registerFilter(filter); - } - - private void unregister(String id) { - if (filters.keySet().contains(id)) { - filters.get(id).name().unregisterFilter(filters.get(id).get()); - filters.remove(id); - } - } - - @Override - public Version getVersion() { - return new Version("2.11.0a"); - } -} diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketStartServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketStartServer.java index b858fb9a..f8181a43 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketStartServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketStartServer.java @@ -63,19 +63,21 @@ public class PacketStartServer implements PacketIn, PacketOut { client.sendPacket(new PacketStartServer(3, "There is no server with that name", (data.contains("id"))?data.getRawString("id"):null)); } else if (!(servers.get(data.getRawString("server").toLowerCase()) instanceof SubServer)) { client.sendPacket(new PacketStartServer(4, "That Server is not a SubServer", (data.contains("id"))?data.getRawString("id"):null)); + } else if (!((SubServer) servers.get(data.getRawString("server").toLowerCase())).getHost().isAvailable()) { + client.sendPacket(new PacketStartServer(5, "That SubServer's Host is not available", (data.contains("id"))?data.getRawString("id"):null)); } else if (!((SubServer) servers.get(data.getRawString("server").toLowerCase())).getHost().isEnabled()) { - client.sendPacket(new PacketStartServer(5, "That SubServer's Host is not enabled", (data.contains("id"))?data.getRawString("id"):null)); + client.sendPacket(new PacketStartServer(6, "That SubServer's Host is not enabled", (data.contains("id"))?data.getRawString("id"):null)); } else if (!((SubServer) servers.get(data.getRawString("server").toLowerCase())).isEnabled()) { - client.sendPacket(new PacketStartServer(6, "That SubServer is not enabled", (data.contains("id"))?data.getRawString("id"):null)); + client.sendPacket(new PacketStartServer(7, "That SubServer is not enabled", (data.contains("id"))?data.getRawString("id"):null)); } else if (((SubServer) servers.get(data.getRawString("server").toLowerCase())).isRunning()) { - client.sendPacket(new PacketStartServer(7, "That SubServer is already running", (data.contains("id")) ? data.getRawString("id") : null)); + client.sendPacket(new PacketStartServer(8, "That SubServer is already running", (data.contains("id")) ? data.getRawString("id") : null)); } else if (((SubServer) servers.get(data.getRawString("server").toLowerCase())).getCurrentIncompatibilities().size() != 0) { String list = ""; for (SubServer server : ((SubServer) servers.get(data.getRawString("server").toLowerCase())).getCurrentIncompatibilities()) { if (list.length() != 0) list += ", "; list += server.getName(); } - client.sendPacket(new PacketStartServer(8, "Cannot start SubServer while these servers are running: " + list, (data.contains("id")) ? data.getRawString("id") : null)); + client.sendPacket(new PacketStartServer(9, "Cannot start SubServer while these servers are running: " + list, (data.contains("id")) ? data.getRawString("id") : null)); } else { if (((SubServer) servers.get(data.getRawString("server").toLowerCase())).start((data.contains("player"))?UUID.fromString(data.getRawString("player")):null)) { client.sendPacket(new PacketStartServer(0, "Starting SubServer", (data.contains("id"))?data.getRawString("id"):null)); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java index 13d1a017..b2130c0e 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java @@ -97,7 +97,6 @@ public final class SubDataServer { registerPacket(new PacketDownloadPlayerList(plugin), "SubServers", "DownloadPlayerList"); registerPacket(new PacketDownloadProxyInfo(plugin), "SubServers", "DownloadProxyInfo"); registerPacket(new PacketDownloadServerInfo(plugin), "SubServers", "DownloadServerInfo"); - registerPacket(new PacketEditServer(plugin), "SubServers", "EditServer"); registerPacket(new PacketExAddServer(), "SubServers", "ExAddServer"); registerPacket(new PacketExConfigureHost(plugin), "SubServers", "ExConfigureHost"); registerPacket(new PacketExCreateServer(null), "SubServers", "ExCreateServer"); @@ -109,7 +108,6 @@ public final class SubDataServer { registerPacket(new PacketLinkExHost(plugin), "SubServers", "LinkExHost"); registerPacket(new PacketLinkProxy(plugin), "SubServers", "LinkProxy"); registerPacket(new PacketLinkServer(plugin), "SubServers", "LinkServer"); - registerPacket(new PacketListenLog(plugin), "SubServers", "ListenLog"); registerPacket(new PacketStartServer(plugin), "SubServers", "StartServer"); registerPacket(new PacketStopServer(plugin), "SubServers", "StopServer"); @@ -124,7 +122,6 @@ public final class SubDataServer { registerPacket(PacketDownloadPlayerList.class, "SubServers", "DownloadPlayerList"); registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo"); registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo"); - registerPacket(PacketEditServer.class, "SubServers", "EditServer"); registerPacket(PacketExAddServer.class, "SubServers", "ExAddServer"); registerPacket(PacketExConfigureHost.class, "SubServers", "ExConfigureHost"); registerPacket(PacketExCreateServer.class, "SubServers", "ExCreateServer"); @@ -134,7 +131,6 @@ public final class SubDataServer { registerPacket(PacketLinkExHost.class, "SubServers", "LinkExHost"); registerPacket(PacketLinkProxy.class, "SubServers", "LinkProxy"); registerPacket(PacketLinkServer.class, "SubServers", "LinkServer"); - registerPacket(PacketListenLog.class, "SubServers", "ListenLog"); registerPacket(PacketOutRunEvent.class, "SubServers", "RunEvent"); registerPacket(PacketOutReload.class, "SubServers", "Reload"); registerPacket(PacketOutReset.class, "SubServers", "Reset"); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java index 736b5846..69143e11 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java @@ -92,6 +92,7 @@ public final class SubCommand extends CommandX { } else if (args[0].equalsIgnoreCase("reload")) { if (args.length > 1) { switch (args[1].toLowerCase()) { + case "*": case "all": case "system": case "bungee": @@ -150,11 +151,13 @@ public final class SubCommand extends CommandX { 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) { + if (((SubServer) server).getStopAction() == SubServer.StopAction.REMOVE_SERVER || ((SubServer) server).getStopAction() == SubServer.StopAction.DELETE_SERVER) { + message += ChatColor.AQUA; + } else { + message += ChatColor.GREEN; + } + } else if (((SubServer) server).getHost().isAvailable() && ((SubServer) server).getHost().isEnabled() && ((SubServer) server).isEnabled() && ((SubServer) server).getCurrentIncompatibilities().size() == 0) { message += ChatColor.YELLOW; } else { message += ChatColor.RED; @@ -173,7 +176,7 @@ public final class SubCommand extends CommandX { sender.sendMessage("SubServers > Host/SubServer List:"); for (Host host : plugin.api.getHosts().values()) { String message = " "; - if (host.isEnabled()) { + if (host.isAvailable() && host.isEnabled()) { message += ChatColor.AQUA; } else { message += ChatColor.RED; @@ -181,10 +184,12 @@ public final class SubCommand extends CommandX { 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; + if (subserver.isRunning()) { + if (subserver.getStopAction() == SubServer.StopAction.REMOVE_SERVER || subserver.getStopAction() == SubServer.StopAction.DELETE_SERVER) { + message += ChatColor.AQUA; + } else { + message += ChatColor.GREEN; + } } else if (subserver.getHost().isEnabled() && subserver.isEnabled() && subserver.getCurrentIncompatibilities().size() == 0) { message += ChatColor.YELLOW; } else { @@ -252,12 +257,9 @@ public final class SubCommand extends CommandX { sender.sendMessage(" -> Players: " + ChatColor.AQUA + server.getPlayers().size() + " online"); } sender.sendMessage(" -> MOTD: " + ChatColor.WHITE + ChatColor.stripColor(server.getMotd())); + if (server instanceof SubServer && ((SubServer) server).getStopAction() != SubServer.StopAction.NONE) sender.sendMessage(" -> Stop Action: " + ChatColor.WHITE + ((SubServer) server).getStopAction().toString()); 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")); - } + if (server instanceof SubServer) sender.sendMessage(" -> Logging: " + ((((SubServer) server).isLogging())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); sender.sendMessage(" -> Restricted: " + ((server.isRestricted())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); if (server instanceof SubServer && ((SubServer) server).getIncompatibilities().size() > 0) { List current = new ArrayList(); @@ -293,6 +295,7 @@ public final class SubCommand extends CommandX { 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(" -> Available: " + ((host.isAvailable())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); 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"); @@ -362,6 +365,8 @@ public final class SubCommand extends CommandX { 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().isAvailable()) { + sender.sendMessage("SubServers > That SubServer's Host is not available"); } 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()) { @@ -464,8 +469,14 @@ public final class SubCommand extends CommandX { 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()) { + } else if (!plugin.hosts.get(args[2].toLowerCase()).isAvailable()) { + sender.sendMessage("SubServers > That Host is not available"); + } else if (!plugin.hosts.get(args[2].toLowerCase()).isEnabled()) { + sender.sendMessage("SubServers > That Host is not enabled"); + } else if (!plugin.hosts.get(args[2].toLowerCase()).getCreator().getTemplates().keySet().contains(args[3].toLowerCase())) { sender.sendMessage("SubServers > There is no template with that name"); + } else if (!plugin.hosts.get(args[2].toLowerCase()).getCreator().getTemplate(args[3]).isEnabled()) { + sender.sendMessage("SubServers > That Template is not enabled"); } 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) { diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java index 57c7575f..1328cb38 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java @@ -416,8 +416,9 @@ public final class SubPlugin extends BungeeCord implements Listener { edits.set("exec", config.get().getSection("Servers").getSection(name).getRawString("Executable")); if (!config.get().getSection("Servers").getSection(name).getRawString("Stop-Command").equals(server.getStopCommand())) edits.set("stop-cmd", config.get().getSection("Servers").getSection(name).getRawString("Stop-Command")); - if (config.get().getSection("Servers").getSection(name).getBoolean("Auto-Restart") != server.willAutoRestart()) - edits.set("auto-restart", config.get().getSection("Servers").getSection(name).getBoolean("Auto-Restart")); + SubServer.StopAction action = Util.getDespiteException(() -> SubServer.StopAction.valueOf(config.get().getSection("Servers").getSection(name).getRawString("Stop-Action", "NONE").toUpperCase().replace('-', '_').replace(' ', '_')), null); + if (action != null && action != server.getStopAction()) + edits.set("stop-action", action.toString()); if (config.get().getSection("Servers").getSection(name).getBoolean("Restricted") != server.isRestricted()) edits.set("restricted", config.get().getSection("Servers").getSection(name).getBoolean("Restricted")); if (config.get().getSection("Servers").getSection(name).getBoolean("Hidden") != server.isHidden()) @@ -439,7 +440,7 @@ public final class SubPlugin extends BungeeCord implements Listener { server = this.hosts.get(config.get().getSection("Servers").getSection(name).getString("Host").toLowerCase()).addSubServer(name, config.get().getSection("Servers").getSection(name).getBoolean("Enabled"), config.get().getSection("Servers").getSection(name).getInt("Port"), config.get().getSection("Servers").getSection(name).getColoredString("Motd", '&'), config.get().getSection("Servers").getSection(name).getBoolean("Log"), config.get().getSection("Servers").getSection(name).getRawString("Directory"), new Executable(config.get().getSection("Servers").getSection(name).getRawString("Executable")), config.get().getSection("Servers").getSection(name).getRawString("Stop-Command"), - config.get().getSection("Servers").getSection(name).getBoolean("Hidden"), config.get().getSection("Servers").getSection(name).getBoolean("Restricted"), false); + config.get().getSection("Servers").getSection(name).getBoolean("Hidden"), config.get().getSection("Servers").getSection(name).getBoolean("Restricted")); } else { // Server doesn't need to reset if (config.get().getSection("Servers").getSection(name).getBoolean("Enabled") != server.isEnabled()) server.setEnabled(config.get().getSection("Servers").getSection(name).getBoolean("Enabled")); @@ -454,8 +455,9 @@ public final class SubPlugin extends BungeeCord implements Listener { if (config.get().getSection("Servers").getSection(name).getBoolean("Hidden") != server.isHidden()) server.setHidden(config.get().getSection("Servers").getSection(name).getBoolean("Hidden")); } // Apply these changes regardless of reset - if (config.get().getSection("Servers").getSection(name).getBoolean("Auto-Restart") != server.willAutoRestart()) - server.setAutoRestart(config.get().getSection("Servers").getSection(name).getBoolean("Auto-Restart")); + SubServer.StopAction action = Util.getDespiteException(() -> SubServer.StopAction.valueOf(config.get().getSection("Servers").getSection(name).getRawString("Stop-Action", "NONE").toUpperCase().replace('-', '_').replace(' ', '_')), null); + if (action != null && action != server.getStopAction()) + server.setStopAction(action); if (!status && config.get().getSection("Servers").getSection(name).getBoolean("Run-On-Launch")) autorun.add(name.toLowerCase()); if (config.get().getSection("Servers").getSection(name).getKeys().contains("Display") && ((config.get().getSection("Servers").getSection(name).getRawString("Display").length() == 0 && !server.getDisplayName().equals(server.getName())) || !config.get().getSection("Servers").getSection(name).getRawString("Display").equals(server.getDisplayName()))) @@ -465,7 +467,6 @@ public final class SubPlugin extends BungeeCord implements Listener { for (String group : config.get().getSection("Servers").getSection(name).getStringList("Group")) server.addGroup(group); } } // Apply these changes regardless of edit/reset - if (config.get().getSection("Servers").getSection(name).getBoolean("Editable", true) != server.isEditable()) server.setEditable(config.get().getSection("Servers").getSection(name).getBoolean("Editable", true)); if (config.get().getSection("Servers").getSection(name).getKeys().contains("Extra")) for (String extra : config.get().getSection("Servers").getSection(name).getSection("Extra").getKeys()) server.addExtra(extra, config.get().getSection("Servers").getSection(name).getSection("Extra").getObject(extra)); ukeys.add(name.toLowerCase()); subservers++; @@ -660,7 +661,7 @@ public final class SubPlugin extends BungeeCord implements Listener { */ @Override public String getName() { - return (isPatched)?"SubServers.Bungee":super.getName(); + return (isPatched)?"SubServers Platform":super.getName(); } /** diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIHandler.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIHandler.java index 7bea838a..1e443de7 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIHandler.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIHandler.java @@ -334,7 +334,7 @@ public class DefaultUIHandler implements UIHandler, Listener { if (listening.get()) if (!json.getString("server").equalsIgnoreCase((String) gui.lastVisitedObjects[0])) { PacketInRunEvent.callback("SubStoppedEvent", this); } else { - gui.reopen(); + Bukkit.getScheduler().runTaskLater(plugin, gui::reopen, 5); } } catch (Exception e) {} } diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIRenderer.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIRenderer.java index 54f2036b..9868d032 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIRenderer.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/DefaultUIRenderer.java @@ -121,7 +121,7 @@ public class DefaultUIRenderer extends UIRenderer { enabled = (((i & 1) == 0) ? new NamedContainer<>("BLUE_STAINED_GLASS_PANE", (short) 3) : new NamedContainer<>("LIGHT_BLUE_STAINED_GLASS_PANE", (short) 11)); disabled = (((i & 1) == 0) ? new NamedContainer<>("MAGENTA_STAINED_GLASS_PANE", (short) 2) : new NamedContainer<>("RED_STAINED_GLASS_PANE", (short) 14)); - if (host.isEnabled()) { + if (host.isAvailable() && host.isEnabled()) { block = createItem("STAINED_GLASS_PANE", enabled.name(), enabled.get()); blockMeta = block.getItemMeta(); blockMeta.setDisplayName(ChatColor.AQUA + host.getDisplayName()); @@ -138,7 +138,8 @@ public class DefaultUIRenderer extends UIRenderer { LinkedList lore = new LinkedList(); if (!host.getName().equals(host.getDisplayName())) lore.add(ChatColor.GRAY + host.getName()); - lore.add(plugin.api.getLang("SubServers", "Interface.Host-Menu.Host-Disabled")); + if (!host.isAvailable()) lore.add(plugin.api.getLang("SubServers", "Interface.Host-Menu.Host-Unavailable")); + else lore.add(plugin.api.getLang("SubServers", "Interface.Host-Menu.Host-Disabled")); if (plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false)) lore.add(ChatColor.WHITE + host.getAddress().getHostAddress()); blockMeta.setLore(lore); } @@ -278,7 +279,7 @@ public class DefaultUIRenderer extends UIRenderer { inv.setItem(27, block); inv.setItem(28, block); - if (host.isEnabled()) { + if (host.isAvailable() && host.isEnabled()) { block = createItem("STAINED_GLASS_PANE", "BLUE_STAINED_GLASS_PANE", (short) 11); blockMeta = block.getItemMeta(); blockMeta.setDisplayName(ChatColor.AQUA + host.getDisplayName()); @@ -295,7 +296,8 @@ public class DefaultUIRenderer extends UIRenderer { LinkedList lore = new LinkedList(); if (!host.getName().equals(host.getDisplayName())) lore.add(ChatColor.GRAY + host.getName()); - lore.add(plugin.api.getLang("SubServers", "Interface.Host-Menu.Host-Disabled")); + if (!host.isAvailable()) lore.add(plugin.api.getLang("SubServers", "Interface.Host-Menu.Host-Unavailable")); + else lore.add(plugin.api.getLang("SubServers", "Interface.Host-Menu.Host-Disabled")); if (plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false)) lore.add(ChatColor.WHITE + host.getAddress().getHostAddress()); blockMeta.setLore(lore); } @@ -844,24 +846,17 @@ public class DefaultUIRenderer extends UIRenderer { lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Invalid")); lore.add(ChatColor.WHITE + ((plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false))?server.getAddress().getAddress().getHostAddress()+':':"") + server.getAddress().getPort()); blockMeta.setLore(lore); - } else if (((SubServer) server).isTemporary()) { - block = createItem("STAINED_GLASS_PANE", temp.name(), temp.get()); - blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(ChatColor.AQUA + server.getDisplayName()); - LinkedList lore = new LinkedList(); - if (!server.getName().equals(server.getDisplayName())) - lore.add(ChatColor.GRAY + server.getName()); - lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Temporary")); - lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(server.getPlayers().size()))); - lore.add(ChatColor.WHITE + ((plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false))?server.getAddress().getAddress().getHostAddress()+':':"") + server.getAddress().getPort()); - blockMeta.setLore(lore); } else if (((SubServer) server).isRunning()) { - block = createItem("STAINED_GLASS_PANE", online.name(), online.get()); + NamedContainer blockinfo = (((SubServer) server).getStopAction() == SubServer.StopAction.REMOVE_SERVER || ((SubServer) server).getStopAction() == SubServer.StopAction.DELETE_SERVER)?temp:online; + block = createItem("STAINED_GLASS_PANE", blockinfo.name(), blockinfo.get()); blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(ChatColor.GREEN + server.getDisplayName()); LinkedList lore = new LinkedList(); if (!server.getName().equals(server.getDisplayName())) lore.add(ChatColor.GRAY + server.getName()); + if (((SubServer) server).getStopAction() == SubServer.StopAction.REMOVE_SERVER || ((SubServer) server).getStopAction() == SubServer.StopAction.DELETE_SERVER) { + blockMeta.setDisplayName(ChatColor.AQUA + server.getDisplayName()); + lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Temporary")); + } else blockMeta.setDisplayName(ChatColor.GREEN + server.getDisplayName()); lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(server.getPlayers().size()))); lore.add(ChatColor.WHITE + ((plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false))?server.getAddress().getAddress().getHostAddress()+':':"") + server.getAddress().getPort()); blockMeta.setLore(lore); @@ -989,176 +984,172 @@ public class DefaultUIRenderer extends UIRenderer { windowHistory.add(() -> subserverAdmin(name)); if (subserver == null) { if (hasHistory()) back(); - } else { - setDownloading(null); - lastVisitedObjects[0] = name; - ItemStack block; - ItemMeta blockMeta; - ItemStack div = createItem("STAINED_GLASS_PANE", "BLACK_STAINED_GLASS_PANE", (short) 15); - ItemMeta divMeta = div.getItemMeta(); - divMeta.setDisplayName(ChatColor.RESET.toString()); - div.setItemMeta(divMeta); + } else subserver.getHost(host -> { + if (host == null) { + if (hasHistory()) back(); + } else { + setDownloading(null); + lastVisitedObjects[0] = name; + ItemStack block; + ItemMeta blockMeta; + ItemStack div = createItem("STAINED_GLASS_PANE", "BLACK_STAINED_GLASS_PANE", (short) 15); + ItemMeta divMeta = div.getItemMeta(); + divMeta.setDisplayName(ChatColor.RESET.toString()); + div.setItemMeta(divMeta); - Inventory inv = Bukkit.createInventory(null, 36, plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Title").replace("$str$", subserver.getDisplayName())); + Inventory inv = Bukkit.createInventory(null, 36, plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Title").replace("$str$", subserver.getDisplayName())); - int i = 0; - while (i < inv.getSize()) { - inv.setItem(i, div); - i++; - } - i = 0; + int i = 0; + while (i < inv.getSize()) { + inv.setItem(i, div); + i++; + } + i = 0; - if (subserver.isRunning()) { - if (!(Bukkit.getPlayer(player).hasPermission("subservers.subserver.terminate.*") || Bukkit.getPlayer(player).hasPermission("subservers.subserver.terminate." + name.toLowerCase()))) { - block = createItem("STAINED_GLASS_PANE", "GRAY_STAINED_GLASS_PANE", (short) 7); + if (subserver.isRunning()) { + if (!(Bukkit.getPlayer(player).hasPermission("subservers.subserver.terminate.*") || Bukkit.getPlayer(player).hasPermission("subservers.subserver.terminate." + name.toLowerCase()))) { + block = createItem("STAINED_GLASS_PANE", "GRAY_STAINED_GLASS_PANE", (short) 7); + blockMeta = block.getItemMeta(); + blockMeta.setDisplayName(ChatColor.GRAY+ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Terminate"))); + blockMeta.setLore(Arrays.asList(plugin.api.getLang("SubServers", "Interface.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.terminate." + name.toLowerCase()))); + } else { + block = createItem("STAINED_GLASS_PANE", "RED_STAINED_GLASS_PANE", (short) 14); + blockMeta = block.getItemMeta(); + blockMeta.setDisplayName(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Terminate")); + } + + block.setItemMeta(blockMeta); + inv.setItem(1, block); + inv.setItem(10, block); + + if (!(Bukkit.getPlayer(player).hasPermission("subservers.subserver.stop.*") || Bukkit.getPlayer(player).hasPermission("subservers.subserver.stop." + name.toLowerCase()))) { + block = createItem("STAINED_GLASS_PANE", "GRAY_STAINED_GLASS_PANE", (short) 7); + blockMeta = block.getItemMeta(); + blockMeta.setDisplayName(ChatColor.GRAY+ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Stop"))); + blockMeta.setLore(Arrays.asList(plugin.api.getLang("SubServers", "Interface.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.stop." + name.toLowerCase()))); + } else { + block = createItem("STAINED_GLASS_PANE", "MAGENTA_STAINED_GLASS_PANE", (short) 2); + blockMeta = block.getItemMeta(); + blockMeta.setDisplayName(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Stop")); + } + block.setItemMeta(blockMeta); + inv.setItem(2, block); + inv.setItem(3, block); + inv.setItem(11, block); + inv.setItem(12, block); + + if (!(Bukkit.getPlayer(player).hasPermission("subservers.subserver.command.*") || Bukkit.getPlayer(player).hasPermission("subservers.subserver.command." + name.toLowerCase()))) { + block = createItem("STAINED_GLASS_PANE", "GRAY_STAINED_GLASS_PANE", (short) 7); + blockMeta = block.getItemMeta(); + blockMeta.setDisplayName(ChatColor.GRAY+ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Command"))); + blockMeta.setLore(Arrays.asList(plugin.api.getLang("SubServers", "Interface.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.command." + name.toLowerCase()))); + } else { + block = createItem("STAINED_GLASS_PANE", "YELLOW_STAINED_GLASS_PANE", (short) 4); + blockMeta = block.getItemMeta(); + blockMeta.setDisplayName(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Command")); + } + block.setItemMeta(blockMeta); + inv.setItem(5, block); + inv.setItem(6, block); + inv.setItem(7, block); + inv.setItem(14, block); + inv.setItem(15, block); + inv.setItem(16, block); + } else { + if (!(Bukkit.getPlayer(player).hasPermission("subservers.subserver.start.*") || Bukkit.getPlayer(player).hasPermission("subservers.subserver.start." + name.toLowerCase()))) { + block = createItem("STAINED_GLASS_PANE", "GRAY_STAINED_GLASS_PANE", (short) 7); + blockMeta = block.getItemMeta(); + blockMeta.setDisplayName(ChatColor.GRAY+ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Start"))); + blockMeta.setLore(Arrays.asList(plugin.api.getLang("SubServers", "Interface.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.start." + name.toLowerCase()))); + } else if (!host.isAvailable() || !host.isEnabled() || !subserver.isEnabled() || subserver.getCurrentIncompatibilities().size() != 0) { + block = createItem("STAINED_GLASS_PANE", "GRAY_STAINED_GLASS_PANE", (short) 7); + blockMeta = block.getItemMeta(); + blockMeta.setDisplayName(ChatColor.GRAY+ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Start"))); + } else { + block = createItem("STAINED_GLASS_PANE", "LIME_STAINED_GLASS_PANE", (short) 5); + blockMeta = block.getItemMeta(); + blockMeta.setDisplayName(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Start")); + } + block.setItemMeta(blockMeta); + inv.setItem(3, block); + inv.setItem(4, block); + inv.setItem(5, block); + inv.setItem(12, block); + inv.setItem(13, block); + inv.setItem(14, block); + } + + if (!host.isAvailable() || !host.isEnabled() || !subserver.isEnabled() || subserverPlugins.size() <= 0) { + block = div; + } else { + block = createItem("STAINED_GLASS_PANE", "BLUE_STAINED_GLASS_PANE", (short) 11); blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(ChatColor.GRAY+ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Terminate"))); - blockMeta.setLore(Arrays.asList(plugin.api.getLang("SubServers", "Interface.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.terminate." + name.toLowerCase()))); + blockMeta.setDisplayName(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Plugins")); + block.setItemMeta(blockMeta); + } + inv.setItem(27, block); + inv.setItem(28, block); + + if (subserver.isRunning()) { + block = (subserver.getStopAction() == SubServer.StopAction.REMOVE_SERVER || subserver.getStopAction() == SubServer.StopAction.DELETE_SERVER)?createItem("STAINED_GLASS_PANE", "BLUE_STAINED_GLASS_PANE", (short) 11):createItem("STAINED_GLASS_PANE", "LIME_STAINED_GLASS_PANE", (short) 5); + blockMeta = block.getItemMeta(); + LinkedList lore = new LinkedList(); + if (!subserver.getName().equals(subserver.getDisplayName())) + lore.add(ChatColor.GRAY + subserver.getName()); + if (subserver.getStopAction() != SubServer.StopAction.REMOVE_SERVER || subserver.getStopAction() != SubServer.StopAction.DELETE_SERVER) { + blockMeta.setDisplayName(ChatColor.AQUA + subserver.getDisplayName()); + lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Temporary")); + } else blockMeta.setDisplayName(ChatColor.GREEN + subserver.getDisplayName()); + lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(subserver.getPlayers().size()))); + lore.add(ChatColor.WHITE + ((plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false))?subserver.getAddress().getAddress().getHostAddress()+':':"") + subserver.getAddress().getPort()); + blockMeta.setLore(lore); + } else if (subserver.isEnabled() && subserver.getCurrentIncompatibilities().size() == 0) { + block = createItem("STAINED_GLASS_PANE", "YELLOW_STAINED_GLASS_PANE", (short) 4); + blockMeta = block.getItemMeta(); + blockMeta.setDisplayName(ChatColor.YELLOW + subserver.getDisplayName()); + LinkedList lore = new LinkedList(); + if (!subserver.getName().equals(subserver.getDisplayName())) + lore.add(ChatColor.GRAY + subserver.getName()); + lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Offline")); + lore.add(ChatColor.WHITE + ((plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false))?subserver.getAddress().getAddress().getHostAddress()+':':"") + subserver.getAddress().getPort()); + blockMeta.setLore(lore); } else { block = createItem("STAINED_GLASS_PANE", "RED_STAINED_GLASS_PANE", (short) 14); blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Terminate")); - } - - block.setItemMeta(blockMeta); - inv.setItem(1, block); - inv.setItem(10, block); - - if (!(Bukkit.getPlayer(player).hasPermission("subservers.subserver.stop.*") || Bukkit.getPlayer(player).hasPermission("subservers.subserver.stop." + name.toLowerCase()))) { - block = createItem("STAINED_GLASS_PANE", "GRAY_STAINED_GLASS_PANE", (short) 7); - blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(ChatColor.GRAY+ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Stop"))); - blockMeta.setLore(Arrays.asList(plugin.api.getLang("SubServers", "Interface.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.stop." + name.toLowerCase()))); - } else { - block = createItem("STAINED_GLASS_PANE", "MAGENTA_STAINED_GLASS_PANE", (short) 2); - blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Stop")); - } - block.setItemMeta(blockMeta); - inv.setItem(2, block); - inv.setItem(3, block); - inv.setItem(11, block); - inv.setItem(12, block); - - if (!(Bukkit.getPlayer(player).hasPermission("subservers.subserver.command.*") || Bukkit.getPlayer(player).hasPermission("subservers.subserver.command." + name.toLowerCase()))) { - block = createItem("STAINED_GLASS_PANE", "GRAY_STAINED_GLASS_PANE", (short) 7); - blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(ChatColor.GRAY+ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Command"))); - blockMeta.setLore(Arrays.asList(plugin.api.getLang("SubServers", "Interface.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.command." + name.toLowerCase()))); - } else { - block = createItem("STAINED_GLASS_PANE", "YELLOW_STAINED_GLASS_PANE", (short) 4); - blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Command")); - } - block.setItemMeta(blockMeta); - inv.setItem(5, block); - inv.setItem(6, block); - inv.setItem(7, block); - inv.setItem(14, block); - inv.setItem(15, block); - inv.setItem(16, block); - } else { - if (!(Bukkit.getPlayer(player).hasPermission("subservers.subserver.start.*") || Bukkit.getPlayer(player).hasPermission("subservers.subserver.start." + name.toLowerCase()))) { - block = createItem("STAINED_GLASS_PANE", "GRAY_STAINED_GLASS_PANE", (short) 7); - blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(ChatColor.GRAY+ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Start"))); - blockMeta.setLore(Arrays.asList(plugin.api.getLang("SubServers", "Interface.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.start." + name.toLowerCase()))); - } else if (!subserver.isEnabled() || subserver.getCurrentIncompatibilities().size() != 0) { - block = createItem("STAINED_GLASS_PANE", "GRAY_STAINED_GLASS_PANE", (short) 7); - blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(ChatColor.GRAY+ChatColor.stripColor(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Start"))); - } else { - block = createItem("STAINED_GLASS_PANE", "LIME_STAINED_GLASS_PANE", (short) 5); - blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Start")); - } - block.setItemMeta(blockMeta); - inv.setItem(3, block); - inv.setItem(4, block); - inv.setItem(5, block); - inv.setItem(12, block); - inv.setItem(13, block); - inv.setItem(14, block); - } - - if (!subserver.isEnabled() || subserverPlugins.size() <= 0) { - block = div; - } else { - block = createItem("STAINED_GLASS_PANE", "BLUE_STAINED_GLASS_PANE", (short) 11); - blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Plugins")); - block.setItemMeta(blockMeta); - } - inv.setItem(27, block); - inv.setItem(28, block); - - if (subserver.isTemporary()) { - block = createItem("STAINED_GLASS_PANE", "BLUE_STAINED_GLASS_PANE", (short) 11); - blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(ChatColor.AQUA + subserver.getDisplayName()); - LinkedList lore = new LinkedList(); - if (!subserver.getName().equals(subserver.getDisplayName())) - lore.add(ChatColor.GRAY + subserver.getName()); - lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Temporary")); - lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(subserver.getPlayers().size()))); - lore.add(ChatColor.WHITE + ((plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false))?subserver.getAddress().getAddress().getHostAddress()+':':"") + subserver.getAddress().getPort()); - blockMeta.setLore(lore); - } else if (subserver.isRunning()) { - block = createItem("STAINED_GLASS_PANE", "LIME_STAINED_GLASS_PANE", (short) 5); - blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(ChatColor.GREEN + subserver.getDisplayName()); - LinkedList lore = new LinkedList(); - if (!subserver.getName().equals(subserver.getDisplayName())) - lore.add(ChatColor.GRAY + subserver.getName()); - lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(subserver.getPlayers().size()))); - lore.add(ChatColor.WHITE + ((plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false))?subserver.getAddress().getAddress().getHostAddress()+':':"") + subserver.getAddress().getPort()); - blockMeta.setLore(lore); - } else if (subserver.isEnabled() && subserver.getCurrentIncompatibilities().size() == 0) { - block = createItem("STAINED_GLASS_PANE", "YELLOW_STAINED_GLASS_PANE", (short) 4); - blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(ChatColor.YELLOW + subserver.getDisplayName()); - LinkedList lore = new LinkedList(); - if (!subserver.getName().equals(subserver.getDisplayName())) - lore.add(ChatColor.GRAY + subserver.getName()); - lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Offline")); - lore.add(ChatColor.WHITE + ((plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false))?subserver.getAddress().getAddress().getHostAddress()+':':"") + subserver.getAddress().getPort()); - blockMeta.setLore(lore); - } else { - block = createItem("STAINED_GLASS_PANE", "RED_STAINED_GLASS_PANE", (short) 14); - blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(ChatColor.RED + subserver.getDisplayName()); - LinkedList lore = new LinkedList(); - if (!subserver.getName().equals(subserver.getDisplayName())) - lore.add(ChatColor.GRAY + subserver.getName()); - if (subserver.getCurrentIncompatibilities().size() != 0) { - String list = ""; - for (String other : subserver.getCurrentIncompatibilities()) { - if (list.length() != 0) list += ", "; - list += other; + blockMeta.setDisplayName(ChatColor.RED + subserver.getDisplayName()); + LinkedList lore = new LinkedList(); + if (!subserver.getName().equals(subserver.getDisplayName())) + lore.add(ChatColor.GRAY + subserver.getName()); + if (subserver.getCurrentIncompatibilities().size() != 0) { + String list = ""; + for (String other : subserver.getCurrentIncompatibilities()) { + if (list.length() != 0) list += ", "; + list += other; + } + lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Incompatible").replace("$str$", list)); } - lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Incompatible").replace("$str$", list)); + if (!subserver.isEnabled()) lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Disabled")); + lore.add(ChatColor.WHITE + ((plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false))?subserver.getAddress().getAddress().getHostAddress()+':':"") + subserver.getAddress().getPort()); + blockMeta.setLore(lore); } - if (!subserver.isEnabled()) lore.add(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Disabled")); - lore.add(ChatColor.WHITE + ((plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false))?subserver.getAddress().getAddress().getHostAddress()+':':"") + subserver.getAddress().getPort()); - blockMeta.setLore(lore); - } - block.setItemMeta(blockMeta); - inv.setItem(30, block); - inv.setItem(31, block); - inv.setItem(32, block); - - if (hasHistory()) { - block = createItem("STAINED_GLASS_PANE", "RED_STAINED_GLASS_PANE", (short) 14); - blockMeta = block.getItemMeta(); - blockMeta.setDisplayName(plugin.api.getLang("SubServers", "Interface.Generic.Back")); block.setItemMeta(blockMeta); - inv.setItem(34, block); - inv.setItem(35, block); - } + inv.setItem(30, block); + inv.setItem(31, block); + inv.setItem(32, block); - Bukkit.getPlayer(player).openInventory(inv); - open = true; - } + if (hasHistory()) { + block = createItem("STAINED_GLASS_PANE", "RED_STAINED_GLASS_PANE", (short) 14); + blockMeta = block.getItemMeta(); + blockMeta.setDisplayName(plugin.api.getLang("SubServers", "Interface.Generic.Back")); + block.setItemMeta(blockMeta); + inv.setItem(34, block); + inv.setItem(35, block); + } + + Bukkit.getPlayer(player).openInventory(inv); + open = true; + } + }); }); } diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/BungeeChat.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/BungeeChat.java index 1e0046df..d37790f0 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/BungeeChat.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Library/Compatibility/BungeeChat.java @@ -50,19 +50,7 @@ public class BungeeChat { message = new TextComponent(server.getDisplayName()); hover = new TextComponent(server.getDisplayName() + '\n'); if (server instanceof SubServer) { - if (((SubServer) server).isTemporary()) { - message.setColor(ChatColor.AQUA); - hover.setColor(ChatColor.AQUA); - hoverm.add(hover); - if (!server.getName().equals(server.getDisplayName())) { - hover = new TextComponent(server.getName() + '\n'); - hover.setColor(ChatColor.GRAY); - hoverm.add(hover); - } - hover = new TextComponent(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Temporary") + '\n'); - hoverm.add(hover); - hover = new TextComponent(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(server.getPlayers().size()))); - } else if (((SubServer) server).isRunning()) { + if (((SubServer) server).isRunning()) { message.setColor(ChatColor.GREEN); hover.setColor(ChatColor.GREEN); hoverm.add(hover); @@ -71,6 +59,12 @@ public class BungeeChat { hover.setColor(ChatColor.GRAY); hoverm.add(hover); } + if (((SubServer) server).getStopAction() == SubServer.StopAction.REMOVE_SERVER || ((SubServer) server).getStopAction() == SubServer.StopAction.DELETE_SERVER) { + message.setColor(ChatColor.AQUA); + hover.setColor(ChatColor.AQUA); + hover = new TextComponent(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Temporary") + '\n'); + hoverm.add(hover); + } hover = new TextComponent(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(server.getPlayers().size()))); } else if (((SubServer) server).isEnabled() && ((SubServer) server).getCurrentIncompatibilities().size() == 0) { message.setColor(ChatColor.YELLOW); @@ -153,7 +147,7 @@ public class BungeeChat { TextComponent msg = new TextComponent(" "); TextComponent message = new TextComponent(host.getDisplayName()); TextComponent hover = new TextComponent(host.getDisplayName() + '\n'); - if (host.isEnabled()) { + if (host.isAvailable() && host.isEnabled()) { message.setColor(ChatColor.AQUA); hover.setColor(ChatColor.AQUA); hoverm.add(hover); @@ -172,7 +166,7 @@ public class BungeeChat { hover.setColor(ChatColor.GRAY); hoverm.add(hover); } - hover = new TextComponent(plugin.api.getLang("SubServers", "Interface.Host-Menu.Host-Disabled")); + hover = new TextComponent(plugin.api.getLang("SubServers", (!host.isAvailable())?"Interface.Host-Menu.Host-Unavailable":"Interface.Host-Menu.Host-Disabled")); } if (plugin.config.get().getSection("Settings").getBoolean("Show-Addresses", false)) { hoverm.add(hover); @@ -190,19 +184,7 @@ public class BungeeChat { message = new TextComponent(subserver.getDisplayName()); hover = new TextComponent(subserver.getDisplayName() + '\n'); message.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, label + " open SubServer/ " + subserver)); - if (subserver.isTemporary()) { - message.setColor(ChatColor.AQUA); - hover.setColor(ChatColor.AQUA); - hoverm.add(hover); - if (!subserver.getName().equals(subserver.getDisplayName())) { - hover = new TextComponent(subserver.getName() + '\n'); - hover.setColor(ChatColor.GRAY); - hoverm.add(hover); - } - hover = new TextComponent(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Temporary") + '\n'); - hoverm.add(hover); - hover = new TextComponent(plugin.api.getLang("SubServers", "Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(subserver.getPlayers().size()))); - } else if (subserver.isEnabled()) { + if (subserver.isRunning()) { message.setColor(ChatColor.GREEN); hover.setColor(ChatColor.GREEN); hoverm.add(hover); @@ -211,6 +193,12 @@ public class BungeeChat { hover.setColor(ChatColor.GRAY); hoverm.add(hover); } + if (subserver.getStopAction() == SubServer.StopAction.REMOVE_SERVER || subserver.getStopAction() == SubServer.StopAction.DELETE_SERVER) { + message.setColor(ChatColor.AQUA); + hover.setColor(ChatColor.AQUA); + hover = new TextComponent(plugin.api.getLang("SubServers", "Interface.Server-Menu.SubServer-Temporary") + '\n'); + hoverm.add(hover); + } hover = new TextComponent(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.setColor(ChatColor.YELLOW); 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 d6e7b192..f1eafefa 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 @@ -58,6 +58,15 @@ public class Host { return raw.getRawString("subdata", null); } + /** + * Is this Host Available? + * + * @return Availability Status + */ + public boolean isAvailable() { + return raw.getBoolean("available"); + } + /** * Is this Host Enabled? * 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 1e8f2142..ce452cc5 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 @@ -13,6 +13,21 @@ public class SubServer extends Server { private List incompatibilities = null; private Host host = null; + /** + * SubServer Stop Action Class + */ + public enum StopAction { + NONE, + RESTART, + REMOVE_SERVER, + DELETE_SERVER; + + @Override + public String toString() { + return super.toString().substring(0, 1).toUpperCase()+super.toString().substring(1).toLowerCase().replace('_', ' '); + } + } + /** * Create an API representation of a Server * @@ -331,12 +346,12 @@ public class SubServer extends Server { } /** - * If the Server will Auto Restart on unexpected shutdowns + * Get the action the Server will take when it stops * - * @return Auto Restart Status + * @return Stop Action */ - public boolean willAutoRestart() { - return raw.getBoolean("auto-restart"); + public StopAction getStopAction() { + return Util.getDespiteException(() -> StopAction.valueOf(raw.getRawString("stop-action").toUpperCase().replace('-', '_').replace(' ', '_')), null); } /** @@ -422,13 +437,4 @@ public class SubServer extends Server { callback.run(current); }); } - - /** - * If the Server is Temporary - * - * @return Temporary Status - */ - public boolean isTemporary() { - return raw.getBoolean("temp"); - } } 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 37367347..d1a1a7f1 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 @@ -91,10 +91,12 @@ public final class SubCommand implements CommandExecutor { if (i != 0) message += div; if (!(server instanceof SubServer)) { message += ChatColor.WHITE; - } else if (((SubServer) server).isTemporary()) { - message += ChatColor.AQUA; } else if (((SubServer) server).isRunning()) { - message += ChatColor.GREEN; + if (((SubServer) server).getStopAction() == SubServer.StopAction.REMOVE_SERVER || ((SubServer) server).getStopAction() == SubServer.StopAction.DELETE_SERVER) { + message += ChatColor.AQUA; + } else { + message += ChatColor.GREEN; + } } else if (((SubServer) server).isEnabled() && ((SubServer) server).getCurrentIncompatibilities().size() == 0) { message += ChatColor.YELLOW; } else { @@ -114,7 +116,7 @@ public final class SubCommand implements CommandExecutor { sender.sendMessage(plugin.api.getLang("SubServers", "Command.List.Host-Header")); for (Host host : hosts.values()) { String message = " "; - if (host.isEnabled()) { + if (host.isAvailable() && host.isEnabled()) { message += ChatColor.AQUA; } else { message += ChatColor.RED; @@ -128,10 +130,12 @@ public final class SubCommand implements CommandExecutor { message += plugin.api.getLang("SubServers", "Command.List.Header"); for (SubServer subserver : host.getSubServers().values()) { if (i != 0) message += div; - if (subserver.isTemporary()) { - message += ChatColor.AQUA; - } else if (subserver.isRunning()) { - message += ChatColor.GREEN; + if (subserver.isRunning()) { + if (subserver.getStopAction() == SubServer.StopAction.REMOVE_SERVER || subserver.getStopAction() == SubServer.StopAction.DELETE_SERVER) { + message += ChatColor.AQUA; + } else { + message += ChatColor.GREEN; + } } else if (subserver.isEnabled() && subserver.getCurrentIncompatibilities().size() == 0) { message += ChatColor.YELLOW; } else { @@ -199,12 +203,9 @@ public final class SubCommand implements CommandExecutor { 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())); + if (server instanceof SubServer && ((SubServer) server).getStopAction() != SubServer.StopAction.NONE) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Stop Action") + ChatColor.WHITE + ((SubServer) server).getStopAction().toString()); 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")); - } + 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")); 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(); @@ -238,6 +239,7 @@ public final class SubCommand implements CommandExecutor { 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$", "Available") + ((host.isAvailable())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); 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"); @@ -311,15 +313,18 @@ public final class SubCommand implements CommandExecutor { sender.sendMessage(plugin.api.getLang("SubServers", "Command.Start.Invalid")); break; case 5: - sender.sendMessage(plugin.api.getLang("SubServers", "Command.Start.Host-Disabled")); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Start.Host-Unavailable")); break; case 6: - sender.sendMessage(plugin.api.getLang("SubServers", "Command.Start.Server-Disabled")); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Start.Host-Disabled")); break; case 7: - sender.sendMessage(plugin.api.getLang("SubServers", "Command.Start.Running")); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Start.Server-Disabled")); break; case 8: + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Start.Running")); + break; + case 9: sender.sendMessage(plugin.api.getLang("SubServers", "Command.Start.Server-Incompatible").replace("$str$", data.getString("m").split(":\\s")[1])); break; case 0: @@ -453,12 +458,21 @@ public final class SubCommand implements CommandExecutor { sender.sendMessage(plugin.api.getLang("SubServers", "Command.Creator.Unknown-Host")); break; case 6: - sender.sendMessage(plugin.api.getLang("SubServers", "Command.Creator.Invalid-Template")); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Start.Host-Unavailable")); break; case 7: - sender.sendMessage(plugin.api.getLang("SubServers", "Command.Creator.Invalid-Version")); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Start.Host-Disabled")); break; case 8: + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Creator.Unknown-Template")); + break; + case 9: + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Creator.Template-Disabled")); + break; + case 10: + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Creator.Invalid-Version")); + break; + case 11: sender.sendMessage(plugin.api.getLang("SubServers", "Command.Creator.Invalid-Port")); break; case 0: diff --git a/SubServers.Client/Sponge/pom.xml b/SubServers.Client/Sponge/pom.xml index e41e47ca..652343b6 100644 --- a/SubServers.Client/Sponge/pom.xml +++ b/SubServers.Client/Sponge/pom.xml @@ -20,7 +20,7 @@ org.spongepowered spongeapi - 4.0.0 + 7.0.0 provided diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubAddHostEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubAddHostEvent.java index 03623829..6e311785 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubAddHostEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubAddHostEvent.java @@ -44,11 +44,11 @@ public class SubAddHostEvent extends AbstractEvent implements SubEvent { * Gets the cause of this Event * * @deprecated Use simplified methods where available - * @return The player who triggered this event under the key: player + * @return The player UUID who triggered this event */ @Override @Deprecated public Cause getCause() { - return Cause.builder().named("player", player).build(); + return Cause.builder().append(player).build(getContext()); } } diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubAddProxyEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubAddProxyEvent.java index b9a71f06..f0f8b2db 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubAddProxyEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubAddProxyEvent.java @@ -38,6 +38,6 @@ public class SubAddProxyEvent extends AbstractEvent implements SubEvent { @Override @Deprecated public Cause getCause() { - return Cause.builder().build(); + return Cause.builder().build(getContext()); } } diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubAddServerEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubAddServerEvent.java index 48b93a63..bf7cafa6 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubAddServerEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubAddServerEvent.java @@ -55,11 +55,11 @@ public class SubAddServerEvent extends AbstractEvent implements SubEvent { * Gets the cause of this Event * * @deprecated Use simplified methods where available - * @return The player who triggered this event under the key: player + * @return The player UUID who triggered this event */ @Override @Deprecated public Cause getCause() { - return Cause.builder().named("player", player).build(); + return Cause.builder().append(player).build(getContext()); } } diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubCreateEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubCreateEvent.java index 960fe58b..3a075208 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubCreateEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubCreateEvent.java @@ -113,11 +113,11 @@ public class SubCreateEvent extends AbstractEvent implements SubEvent { * Gets the cause of this Event * * @deprecated Use simplified methods where available - * @return The player who triggered this event under the key: player + * @return The player UUID who triggered this event */ @Override @Deprecated public Cause getCause() { - return Cause.builder().named("player", player).build(); + return Cause.builder().append(player).build(getContext()); } } diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubEditServerEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubEditServerEvent.java index 17066f8d..a224356d 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubEditServerEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubEditServerEvent.java @@ -73,11 +73,11 @@ public class SubEditServerEvent extends AbstractEvent implements SubEvent { * Gets the cause of this Event * * @deprecated Use simplified methods where available - * @return The player who triggered this event under the key: player + * @return The player UUID who triggered this event */ @Override @Deprecated public Cause getCause() { - return Cause.builder().named("player", player).build(); + return Cause.builder().append(player).build(getContext()); } } diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubNetworkConnectEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubNetworkConnectEvent.java index bd06496f..07974aac 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubNetworkConnectEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubNetworkConnectEvent.java @@ -38,6 +38,6 @@ public class SubNetworkConnectEvent extends AbstractEvent implements SubEvent { @Override @Deprecated public Cause getCause() { - return Cause.builder().build(); + return Cause.builder().build(getContext()); } } \ No newline at end of file diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubNetworkDisconnectEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubNetworkDisconnectEvent.java index e266e338..32da1cc5 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubNetworkDisconnectEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubNetworkDisconnectEvent.java @@ -18,6 +18,6 @@ public class SubNetworkDisconnectEvent extends AbstractEvent implements SubEvent @Override @Deprecated public Cause getCause() { - return Cause.builder().build(); + return Cause.builder().build(getContext()); } } \ No newline at end of file diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubRemoveHostEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubRemoveHostEvent.java index 84e1bd22..bd193f6b 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubRemoveHostEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubRemoveHostEvent.java @@ -44,11 +44,11 @@ public class SubRemoveHostEvent extends AbstractEvent implements SubEvent { * Gets the cause of this Event * * @deprecated Use simplified methods where available - * @return The player who triggered this event under the key: player + * @return The player UUID who triggered this event */ @Override @Deprecated public Cause getCause() { - return Cause.builder().named("player", player).build(); + return Cause.builder().append(player).build(getContext()); } } diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubRemoveProxyEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubRemoveProxyEvent.java index dc83a267..5752a3f7 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubRemoveProxyEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubRemoveProxyEvent.java @@ -37,6 +37,6 @@ public class SubRemoveProxyEvent extends AbstractEvent implements SubEvent { @Override @Deprecated public Cause getCause() { - return Cause.builder().build(); + return Cause.builder().build(getContext()); } } diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubRemoveServerEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubRemoveServerEvent.java index 02d84adf..48f49aab 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubRemoveServerEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubRemoveServerEvent.java @@ -55,11 +55,11 @@ public class SubRemoveServerEvent extends AbstractEvent implements SubEvent { * Gets the cause of this Event * * @deprecated Use simplified methods where available - * @return The player who triggered this event under the key: player + * @return The player UUID who triggered this event */ @Override @Deprecated public Cause getCause() { - return Cause.builder().named("player", player).build(); + return Cause.builder().append(player).build(getContext()); } } diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubSendCommandEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubSendCommandEvent.java index 9172059e..5a83906c 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubSendCommandEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubSendCommandEvent.java @@ -64,11 +64,11 @@ public class SubSendCommandEvent extends AbstractEvent implements SubEvent { * Gets the cause of this Event * * @deprecated Use simplified methods where available - * @return The player who triggered this event under the key: player + * @return The player UUID who triggered this event */ @Override @Deprecated public Cause getCause() { - return Cause.builder().named("player", player).build(); + return Cause.builder().append(player).build(getContext()); } } diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStartEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStartEvent.java index 075d523f..b3f46225 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStartEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStartEvent.java @@ -45,11 +45,11 @@ public class SubStartEvent extends AbstractEvent implements SubEvent { * Gets the cause of this Event * * @deprecated Use simplified methods where available - * @return The player who triggered this event under the key: player + * @return The player UUID who triggered this event */ @Override @Deprecated public Cause getCause() { - return Cause.builder().named("player", player).build(); + return Cause.builder().append(player).build(getContext()); } } diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStopEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStopEvent.java index 3570aa36..4711a192 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStopEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStopEvent.java @@ -57,11 +57,11 @@ public class SubStopEvent extends AbstractEvent implements SubEvent { * Gets the cause of this Event * * @deprecated Use simplified methods where available - * @return The player who triggered this event under the key: player + * @return The player UUID who triggered this event */ @Override @Deprecated public Cause getCause() { - return Cause.builder().named("player", player).build(); + return Cause.builder().append(player).build(getContext()); } } diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStoppedEvent.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStoppedEvent.java index 20767330..9997f20a 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStoppedEvent.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Event/SubStoppedEvent.java @@ -37,6 +37,6 @@ public class SubStoppedEvent extends AbstractEvent implements SubEvent { @Override @Deprecated public Cause getCause() { - return Cause.builder().build(); + return Cause.builder().build(getContext()); } } 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 68e71028..62e5914e 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 @@ -58,6 +58,15 @@ public class Host { return raw.getRawString("subdata", null); } + /** + * Is this Host Available? + * + * @return Availability Status + */ + public boolean isAvailable() { + return raw.getBoolean("available"); + } + /** * Is this Host Enabled? * 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 e9aeb6c7..5c2b9d4f 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 @@ -16,6 +16,21 @@ public class SubServer extends Server { private List incompatibilities = null; private Host host = null; + /** + * SubServer Stop Action Class + */ + public enum StopAction { + NONE, + RESTART, + REMOVE_SERVER, + DELETE_SERVER; + + @Override + public String toString() { + return super.toString().substring(0, 1).toUpperCase()+super.toString().substring(1).toLowerCase().replace('_', ' '); + } + } + /** * Create an API representation of a Server * @@ -334,12 +349,12 @@ public class SubServer extends Server { } /** - * If the Server will Auto Restart on unexpected shutdowns + * Get the action the Server will take when it stops * - * @return Auto Restart Status + * @return Stop Action */ - public boolean willAutoRestart() { - return raw.getBoolean("auto-restart"); + public StopAction getStopAction() { + return Util.getDespiteException(() -> StopAction.valueOf(raw.getRawString("stop-action").toUpperCase().replace('-', '_').replace(' ', '_')), null); } /** @@ -425,13 +440,4 @@ public class SubServer extends Server { callback.run(current); }); } - - /** - * If the Server is Temporary - * - * @return Temporary Status - */ - public boolean isTemporary() { - return raw.getBoolean("temp"); - } } 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 ac679dd5..dcf1c327 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 @@ -208,22 +208,17 @@ public final class SubCommand implements CommandExecutor { Text.Builder hover = Text.builder(server.getDisplayName() + '\n'); if (server instanceof SubServer) { message.onClick(TextActions.runCommand("/subservers open SubServer/ " + server.getName())); - if (((SubServer) server).isTemporary()) { - message.color(TextColors.AQUA); - hover.color(TextColors.AQUA); - if (!server.getName().equals(server.getDisplayName())) { - hover.append(Text.builder(server.getName() + '\n').color(TextColors.GRAY).build()); - } - hover.append( - 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()) { + if (((SubServer) server).isRunning()) { message.color(TextColors.GREEN); hover.color(TextColors.GREEN); if (!server.getName().equals(server.getDisplayName())) { hover.append(Text.builder(server.getName() + '\n').color(TextColors.GRAY).build()); } + if (((SubServer) server).getStopAction() == SubServer.StopAction.REMOVE_SERVER || ((SubServer) server).getStopAction() == SubServer.StopAction.DELETE_SERVER) { + message.color(TextColors.AQUA); + hover.color(TextColors.AQUA); + hover.append(ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.SubServer-Temporary") + '\n')); + } hover.append( ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.Server-Player-Count").replace("$int$", new DecimalFormat("#,###").format(server.getPlayers().size()))) ); @@ -293,7 +288,7 @@ public final class SubCommand implements CommandExecutor { for (Host host : hosts.values()) { Text.Builder msg = Text.builder(host.getDisplayName()); Text.Builder hover = Text.builder(host.getDisplayName() + '\n'); - if (host.isEnabled()) { + if (host.isAvailable() && host.isEnabled()) { msg.color(TextColors.AQUA); hover.color(TextColors.AQUA); if (!host.getName().equals(host.getDisplayName())) { @@ -306,7 +301,8 @@ 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(ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Host-Menu.Host-Disabled"))); + if (!host.isAvailable()) hover.append(ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Host-Menu.Host-Unavailable"))); + else 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()); @@ -318,22 +314,17 @@ public final class SubCommand implements CommandExecutor { for (SubServer subserver : host.getSubServers().values()) { Text.Builder message = Text.builder(subserver.getDisplayName()); hover = Text.builder(subserver.getDisplayName() + '\n'); - if (subserver.isTemporary()) { - message.color(TextColors.AQUA); - hover.color(TextColors.AQUA); - if (!subserver.getName().equals(subserver.getDisplayName())) { - hover.append(Text.builder(subserver.getName() + '\n').color(TextColors.GRAY).build()); - } - hover.append( - 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()) { + if (subserver.isRunning()) { message.color(TextColors.GREEN); hover.color(TextColors.GREEN); if (!subserver.getName().equals(subserver.getDisplayName())) { hover.append(Text.builder(subserver.getName() + '\n').color(TextColors.GRAY).build()); } + if (subserver.getStopAction() == SubServer.StopAction.REMOVE_SERVER || subserver.getStopAction() == SubServer.StopAction.DELETE_SERVER) { + message.color(TextColors.AQUA); + hover.color(TextColors.AQUA); + hover.append(ChatColor.convertColor(plugin.api.getLang("SubServers","Interface.Server-Menu.SubServer-Temporary") + '\n')); + } 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); @@ -503,12 +494,9 @@ public final class SubCommand implements CommandExecutor { 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()); + if (server instanceof SubServer && ((SubServer) server).getStopAction() != SubServer.StopAction.NONE) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Stop Action")).toBuilder().append(Text.builder(((SubServer) server).getStopAction().toString()).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()); - } + 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()); 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(); @@ -542,6 +530,7 @@ public final class SubCommand implements CommandExecutor { 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$", "Available")).toBuilder().append(Text.builder((host.isAvailable())?"yes":"no").color((host.isAvailable())?TextColors.GREEN:TextColors.RED).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()); @@ -627,15 +616,18 @@ public final class SubCommand implements CommandExecutor { sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Invalid"))); break; case 5: - sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Host-Disabled"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Host-Unavailable"))); break; case 6: - sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Server-Disabled"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Host-Disabled"))); break; case 7: - sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Running"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Server-Disabled"))); break; case 8: + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Running"))); + break; + case 9: sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Server-Incompatible").replace("$str$", data.getString("m").split(":\\s")[1]))); break; case 0: @@ -818,12 +810,21 @@ public final class SubCommand implements CommandExecutor { sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator.Unknown-Host"))); break; case 6: - sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator.Invalid-Template"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Host-Unavailable"))); break; case 7: - sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator.Invalid-Version"))); + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Start.Host-Disabled"))); break; case 8: + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator.Unknown-Template"))); + break; + case 9: + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator.Template-Disabled"))); + break; + case 10: + sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator.Invalid-Version"))); + break; + case 11: sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers","Command.Creator.Invalid-Port"))); break; case 0: diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/API/Host.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/API/Host.java index ffbac631..3baaf3d7 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/API/Host.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/API/Host.java @@ -58,6 +58,15 @@ public class Host { return raw.getRawString("subdata", null); } + /** + * Is this Host Available? + * + * @return Availability Status + */ + public boolean isAvailable() { + return raw.getBoolean("available"); + } + /** * Is this Host Enabled? * diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/API/SubServer.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/API/SubServer.java index fe9f4061..9dfdc50f 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/API/SubServer.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/API/SubServer.java @@ -18,6 +18,21 @@ public class SubServer extends Server { private List incompatibilities = null; private Host host = null; + /** + * SubServer Stop Action Class + */ + public enum StopAction { + NONE, + RESTART, + REMOVE_SERVER, + DELETE_SERVER; + + @Override + public String toString() { + return super.toString().substring(0, 1).toUpperCase()+super.toString().substring(1).toLowerCase().replace('_', ' '); + } + } + /** * Create an API representation of a Server * @@ -336,12 +351,12 @@ public class SubServer extends Server { } /** - * If the Server will Auto Restart on unexpected shutdowns + * Get the action the Server will take when it stops * - * @return Auto Restart Status + * @return Stop Action */ - public boolean willAutoRestart() { - return raw.getBoolean("auto-restart"); + public StopAction getStopAction() { + return Util.getDespiteException(() -> StopAction.valueOf(raw.getRawString("stop-action").toUpperCase().replace('-', '_').replace(' ', '_')), null); } /** @@ -427,13 +442,4 @@ public class SubServer extends Server { callback.run(current); }); } - - /** - * If the Server is Temporary - * - * @return Temporary Status - */ - public boolean isTemporary() { - return raw.getBoolean("temp"); - } } diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java b/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java index 45ed559b..1a00ee66 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java @@ -114,10 +114,12 @@ public class SubCommand { if (i != 0) message += div; if (!(server instanceof SubServer)) { message += TextColor.WHITE; - } else if (((SubServer) server).isTemporary()) { - message += TextColor.AQUA; } else if (((SubServer) server).isRunning()) { - message += TextColor.GREEN; + if (((SubServer) server).getStopAction() == SubServer.StopAction.REMOVE_SERVER || ((SubServer) server).getStopAction() == SubServer.StopAction.DELETE_SERVER) { + message += TextColor.AQUA; + } else { + message += TextColor.GREEN; + } } else if (((SubServer) server).isEnabled() && ((SubServer) server).getCurrentIncompatibilities().size() == 0) { message += TextColor.YELLOW; } else { @@ -138,7 +140,7 @@ public class SubCommand { host.log.message.println("Host/SubServer List:"); for (Host host : hosts.values()) { String message = " "; - if (host.isEnabled()) { + if (host.isAvailable() && host.isEnabled()) { message += TextColor.AQUA; } else { message += TextColor.RED; @@ -146,10 +148,12 @@ public class SubCommand { message += host.getDisplayName() + " (" + host.getAddress().getHostAddress() + ((host.getName().equals(host.getDisplayName()))?"":TextColor.stripColor(div)+host.getName()) + ")" + TextColor.RESET + ": "; for (SubServer subserver : host.getSubServers().values()) { if (i != 0) message += div; - if (subserver.isTemporary()) { - message += TextColor.AQUA; - } else if (subserver.isRunning()) { - message += TextColor.GREEN; + if (subserver.isRunning()) { + if (subserver.getStopAction() == SubServer.StopAction.REMOVE_SERVER || subserver.getStopAction() == SubServer.StopAction.DELETE_SERVER) { + message += TextColor.AQUA; + } else { + message += TextColor.GREEN; + } } else if (subserver.isEnabled() && subserver.getCurrentIncompatibilities().size() == 0) { message += TextColor.YELLOW; } else { @@ -225,12 +229,9 @@ public class SubCommand { host.log.message.println(" -> 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")); - if (((SubServer) server).isTemporary()) host.log.message.println(" -> Temporary: " + TextColor.GREEN + "yes"); - else host.log.message.println(" -> Auto Restart: " + ((((SubServer) server).willAutoRestart())?TextColor.GREEN+"enabled":TextColor.RED+"disabled")); - } + 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")); if (server instanceof SubServer && ((SubServer) server).getIncompatibilities().size() > 0) { List current = new ArrayList(); @@ -265,6 +266,7 @@ public class SubCommand { 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"); @@ -354,15 +356,18 @@ public class SubCommand { host.log.message.println("That Server is not a SubServer"); break; case 5: - host.log.message.println("That SubServer's Host is not enabled"); + host.log.message.println("That SubServer's Host is not available"); break; case 6: - host.log.message.println("That SubServer is not enabled"); + host.log.message.println("That SubServer's Host is not enabled"); break; case 7: - host.log.message.println("That SubServer is already running"); + host.log.message.println("That SubServer is not enabled"); break; case 8: + host.log.message.println("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]); break; case 0: @@ -538,12 +543,21 @@ public class SubCommand { host.log.message.println("There is no host with that name"); break; case 6: - host.log.message.println("There is no template with that name"); + host.log.message.println("That Host is not available"); break; case 7: - host.log.message.println("SubCreator cannot create servers before Minecraft 1.8"); + host.log.message.println("That Host is not enabled"); break; case 8: + host.log.message.println("There is no template with that name"); + break; + case 9: + host.log.message.println("That Template is not enabled"); + break; + case 10: + host.log.message.println("SubCreator cannot create servers before Minecraft 1.8"); + break; + case 11: host.log.message.println("Invalid Port Number"); break; case 0: diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Library/Metrics.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Library/Metrics.java index cee3ba4d..968409c3 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Library/Metrics.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Library/Metrics.java @@ -153,7 +153,7 @@ public class Metrics { int playerAmount = plugin.getOnlineCount(); playerAmount = playerAmount > 500 ? 500 : playerAmount; int onlineMode = plugin.getConfig().isOnlineMode() ? 1 : 0; - String bungeecordVersion = (plugin.getName().equals("SubServers.Sync"))?"SubServers-Sync-Patched":plugin.getVersion(); + String bungeecordVersion = (plugin.getName().equals("SubServers Platform"))?"SubServers-Sync-Patched":plugin.getVersion(); int managedServers = plugin.getServers().size(); // OS/Java specific data diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/API/Host.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/API/Host.java index 895b3466..7ca16a5e 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/API/Host.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/API/Host.java @@ -58,6 +58,15 @@ public class Host { return raw.getRawString("subdata", null); } + /** + * Is this Host Available? + * + * @return Availability Status + */ + public boolean isAvailable() { + return raw.getBoolean("available"); + } + /** * Is this Host Enabled? * diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/API/SubServer.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/API/SubServer.java index 460e4708..b7b53b8e 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/API/SubServer.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/API/SubServer.java @@ -17,6 +17,21 @@ public class SubServer extends Server { private List incompatibilities = null; private Host host = null; + /** + * SubServer Stop Action Class + */ + public enum StopAction { + NONE, + RESTART, + REMOVE_SERVER, + DELETE_SERVER; + + @Override + public String toString() { + return super.toString().substring(0, 1).toUpperCase()+super.toString().substring(1).toLowerCase().replace('_', ' '); + } + } + /** * Create an API representation of a Server * @@ -335,12 +350,12 @@ public class SubServer extends Server { } /** - * If the Server will Auto Restart on unexpected shutdowns + * Get the action the Server will take when it stops * - * @return Auto Restart Status + * @return Stop Action */ - public boolean willAutoRestart() { - return raw.getBoolean("auto-restart"); + public StopAction getStopAction() { + return Util.getDespiteException(() -> StopAction.valueOf(raw.getRawString("stop-action").toUpperCase().replace('-', '_').replace(' ', '_')), null); } /** @@ -426,13 +441,4 @@ public class SubServer extends Server { callback.run(current); }); } - - /** - * If the Server is Temporary - * - * @return Temporary Status - */ - public boolean isTemporary() { - return raw.getBoolean("temp"); - } } diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java index 47dfa353..909fac2e 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java @@ -53,99 +53,65 @@ public final class SubCommand extends CommandX { @Override public void execute(CommandSender sender, String[] args) { if (sender instanceof ConsoleCommandSender) { - if (plugin.subdata == null) { - throw new IllegalStateException("SubData is not connected"); - } else if (plugin.lang == null) { - throw new IllegalStateException("There are no lang options available at this time"); - } else { - 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.Sync:"); - 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.Sync 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(); + 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.Sync:"); + 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.Sync 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++; - } + 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.Sync v" + updversion + " is available. You are " + updcount + " version" + ((updcount == 1)?"":"s") + " behind."); - } - } catch (Exception e) { } - }).start(); - } else if (args[0].equalsIgnoreCase("list")) { - 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; - String div = ChatColor.RESET + ", "; - if (groups.keySet().size() > 0) { - sender.sendMessage("Group/Server List:"); - for (String group : groups.keySet()) { - String message = " "; - message += ChatColor.GOLD + group + ChatColor.RESET + ": "; - for (Server server : groups.get(group)) { - if (i != 0) message += div; - if (!(server 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).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; + if (updcount == 0) { + sender.sendMessage("You are on the latest version."); + } else { + sender.sendMessage("SubServers.Sync v" + updversion + " is available. You are " + updcount + " version" + ((updcount == 1)?"":"s") + " behind."); } - sender.sendMessage("Host/SubServer List:"); - for (Host host : hosts.values()) { + } catch (Exception e) { + } + }).start(); + } else if (args[0].equalsIgnoreCase("list")) { + 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; + String div = ChatColor.RESET + ", "; + if (groups.keySet().size() > 0) { + sender.sendMessage("Group/Server List:"); + for (String group : groups.keySet()) { 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()) { + message += ChatColor.GOLD + group + ChatColor.RESET + ": "; + for (Server server : groups.get(group)) { if (i != 0) message += div; - if (subserver.isTemporary()) { - message += ChatColor.AQUA; - } else if (subserver.isRunning()) { - message += ChatColor.GREEN; - } else if (subserver.isEnabled() && subserver.getCurrentIncompatibilities().size() == 0) { + if (!(server instanceof SubServer)) { + message += ChatColor.WHITE; + } else if (((SubServer) server).isRunning()) { + if (((SubServer) server).getStopAction() == SubServer.StopAction.REMOVE_SERVER || ((SubServer) server).getStopAction() == SubServer.StopAction.DELETE_SERVER) { + message += ChatColor.AQUA; + } else { + message += ChatColor.GREEN; + } + } else if (((SubServer) server).isEnabled() && ((SubServer) server).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()) + ")"; + 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)"; @@ -154,322 +120,364 @@ public final class SubCommand extends CommandX { sent = true; } if (!sent) sender.sendMessage(ChatColor.RESET + "(none)"); - sender.sendMessage("Server List:"); + sent = false; + } + sender.sendMessage("Host/SubServer List:"); + for (Host host : hosts.values()) { String message = " "; - for (Server server : servers.values()) if (!(server instanceof SubServer)) { + 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; - message += ChatColor.WHITE + server.getDisplayName() + " (" + server.getAddress().getAddress().getHostAddress()+':'+server.getAddress().getPort() + ((server.getName().equals(server.getDisplayName()))?"":ChatColor.stripColor(div)+server.getName()) + ")"; + if (subserver.isRunning()) { + if (subserver.getStopAction() == SubServer.StopAction.REMOVE_SERVER || subserver.getStopAction() == SubServer.StopAction.DELETE_SERVER) { + message += ChatColor.AQUA; + } else { + message += ChatColor.GREEN; + } + } else if (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); - if (proxies.keySet().size() > 0) { - sender.sendMessage("Proxy List:"); - message = " (master)"; - for (Proxy proxy : proxies.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()+')'); + i = 0; + sent = true; + } + if (!sent) sender.sendMessage(ChatColor.RESET + "(none)"); + sender.sendMessage("Server List:"); + String message = " "; + for (Server server : servers.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 (proxies.keySet().size() > 0) { + sender.sendMessage("Proxy List:"); + message = " (master)"; + for (Proxy proxy : proxies.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; } - sender.sendMessage(message); + message += proxy.getDisplayName() + ((proxy.getName().equals(proxy.getDisplayName()))?"":" ("+proxy.getName()+')'); } - }))))); - } else if (args[0].equalsIgnoreCase("info") || args[0].equalsIgnoreCase("status")) { - if (args.length > 1) { - String type = (args.length > 2)?args[1]:null; - String name = args[(type != null)?2:1]; + sender.sendMessage(message); + } + }))))); + } else if (args[0].equalsIgnoreCase("info") || args[0].equalsIgnoreCase("status")) { + if (args.length > 1) { + 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("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()); - } - 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 (String other : ((SubServer) server).getCurrentIncompatibilities()) current.add(other.toLowerCase()); - sender.sendMessage(" -> Incompatibilities:"); - for (String other : ((SubServer) server).getIncompatibilities()) sender.sendMessage(" - " + ((current.contains(other.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 getServer = () -> plugin.api.getServer(name, server -> { + 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()); } - }); - Runnable getGroup = () -> plugin.api.getGroup(name, group -> { - 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"); - } + 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"); } - }); - Runnable getHost = () -> plugin.api.getHost(name, host -> { - 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.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"); - } + sender.sendMessage(" -> MOTD: " + ChatColor.WHITE + ChatColor.stripColor(server.getMotd())); + if (server instanceof SubServer && ((SubServer) server).getStopAction() != SubServer.StopAction.NONE) sender.sendMessage(" -> Stop Action: " + ChatColor.WHITE + ((SubServer) server).getStopAction().toString()); + sender.sendMessage(" -> Signature: " + ChatColor.AQUA + server.getSignature()); + if (server instanceof SubServer) sender.sendMessage(" -> Logging: " + ((((SubServer) server).isLogging())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + 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 (String other : ((SubServer) server).getCurrentIncompatibilities()) current.add(other.toLowerCase()); + sender.sendMessage(" -> Incompatibilities:"); + for (String other : ((SubServer) server).getIncompatibilities()) sender.sendMessage(" - " + ((current.contains(other.toLowerCase()))?ChatColor.WHITE:ChatColor.GRAY) + other); } - }); - Runnable getProxy = () -> plugin.api.getProxy(name, proxy -> { - 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()); + 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 { - if (type == null) { - getHost.run(); - } else { - sender.sendMessage("SubServers > There is no proxy with that name"); - } + sender.sendMessage("SubServers > There is no server with that name"); } - }); + } + }); + Runnable getGroup = () -> plugin.api.getGroup(name, group -> { + 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 = () -> plugin.api.getHost(name, host -> { + 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(" -> Available: " + ((host.isAvailable())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + sender.sendMessage(" -> Enabled: " + ((host.isEnabled())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); + sender.sendMessage(" -> Address: " + ChatColor.WHITE + host.getAddress().getHostAddress()); + if (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 = () -> plugin.api.getProxy(name, proxy -> { + 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"); - } + 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[1].toLowerCase() + " [proxy|host|group|server] "); - } - } else if (args[0].equalsIgnoreCase("start")) { - if (args.length > 1) { - plugin.subdata.sendPacket(new PacketStartServer(null, args[1], data -> { - switch (data.getInt("r")) { - case 3: - sender.sendMessage("SubServers > There is no server with that name"); - break; - case 4: - sender.sendMessage("SubServers > That Server is not a SubServer"); - break; - case 5: - sender.sendMessage("SubServers > That SubServer's Host is not enabled"); - break; - case 6: - sender.sendMessage("SubServers > That SubServer is not enabled"); - break; - case 7: - sender.sendMessage("SubServers > That SubServer is already running"); - break; - case 8: - sender.sendMessages("That SubServer cannot start while these server(s) are running:", data.getRawString("m").split(":\\s")[1]); - break; - case 0: - case 1: - sender.sendMessage("SubServers > Server was started successfully"); - break; - default: - System.out.println("PacketStartServer(null, " + args[1] + ") responded with: " + data.getRawString("m")); - sender.sendMessage("SubServers > Server was started successfully"); - break; - } - })); - } else { - sender.sendMessage("Usage: " + label + " "); - } - } else if (args[0].equalsIgnoreCase("stop")) { - if (args.length > 1) { - plugin.subdata.sendPacket(new PacketStopServer(null, args[1], false, data -> { - switch (data.getInt("r")) { - case 3: - sender.sendMessage("SubServers > There is no server with that name"); - break; - case 4: - sender.sendMessage("SubServers > That Server is not a SubServer"); - break; - case 5: - sender.sendMessage("SubServers > That SubServer is not running"); - break; - case 0: - case 1: - sender.sendMessage("SubServers > Server was stopped successfully"); - break; - default: - System.out.println("PacketStopServer(null, " + args[1] + ", false) responded with: " + data.getRawString("m")); - sender.sendMessage("SubServers > Server was stopped successfully"); - break; - } - })); - } else { - sender.sendMessage("Usage: " + label + " "); - } - } else if (args[0].equalsIgnoreCase("kill") || args[0].equalsIgnoreCase("terminate")) { - if (args.length > 1) { - plugin.subdata.sendPacket(new PacketStopServer(null, args[1], true, data -> { - switch (data.getInt("r")) { - case 3: - sender.sendMessage("SubServers > There is no server with that name"); - break; - case 4: - sender.sendMessage("SubServers > That Server is not a SubServer"); - break; - case 5: - sender.sendMessage("SubServers > That SubServer is not running"); - break; - case 0: - case 1: - sender.sendMessage("SubServers > Server was terminated successfully"); - break; - default: - System.out.println("PacketStopServer(null, " + args[1] + ", true) responded with: " + data.getRawString("m")); - sender.sendMessage("SubServers > Server was terminated successfully"); - break; - } - })); - } else { - sender.sendMessage("Usage: " + label + " "); - } - } else if (args[0].equalsIgnoreCase("cmd") || args[0].equalsIgnoreCase("command")) { - if (args.length > 2) { - int i = 2; - String str = args[2]; - if (args.length > 3) { - do { - i++; - str = str + " " + args[i]; - } while ((i + 1) != args.length); - } - final String cmd = str; - plugin.subdata.sendPacket(new PacketCommandServer(null, args[1], cmd, data -> { - switch (data.getInt("r")) { - case 3: - sender.sendMessage("SubServers > There is no server with that name"); - break; - case 4: - sender.sendMessage("SubServers > That Server is not a SubServer"); - break; - case 5: - sender.sendMessage("SubServers > That SubServer is not running"); - break; - case 0: - case 1: - sender.sendMessage("SubServers > Command was sent successfully"); - break; - default: - System.out.println("PacketCommandServer(null, " + args[1] + ", /" + cmd + ") responded with: " + data.getRawString("m")); - sender.sendMessage("SubServers > Command was sent successfully"); - break; - } - })); - } else { - sender.sendMessage("Usage: " + label + " [Args...]"); - } - } else if (args[0].equalsIgnoreCase("create")) { - if (args.length > 5) { - if (Util.isException(() -> Integer.parseInt(args[5]))) { - sender.sendMessage("Invalid Port Number"); - } else { - plugin.subdata.sendPacket(new PacketCreateServer(null, args[1], args[2],args[3], new Version(args[4]), Integer.parseInt(args[5]), data -> { - switch (data.getInt("r")) { - case 3: - case 4: - sender.sendMessage("SubServers > There is already a SubServer with that name"); - break; - case 5: - sender.sendMessage("SubServers > There is no host with that name"); - break; - case 6: - sender.sendMessage("SubServers > There is no template with that name"); - break; - case 7: - sender.sendMessage("SubServers > SubCreator cannot create servers before Minecraft 1.8"); - break; - case 8: - sender.sendMessage("SubServers > Invalid Port Number"); - break; - case 0: - case 1: - sender.sendMessage("SubServers > Launching SubCreator..."); - break; - default: - System.out.println("PacketCreateServer(null, " + args[1] + ", " + args[2] + ", " + args[3] + ", " + args[4] + ", " + args[5] + ") responded with: " + data.getRawString("m")); - sender.sendMessage("SubServers > Launching SubCreator..."); - break; - } - })); - } - } else { - sender.sendMessage("Usage: " + label + "