From be8f87d17c21171aacc6c4d9808129fe59ba6456 Mon Sep 17 00:00:00 2001 From: ME1312 Date: Sun, 16 Jun 2019 23:13:48 -0400 Subject: [PATCH] Add the Update command And several related UI changes to SubServers.Client --- SubServers.Bungee/pom.xml | 4 +- .../Bungee/Event/SubCreateEvent.java | 31 ++ .../Host/External/ExternalSubCreator.java | 55 +- .../Host/External/ExternalSubServer.java | 502 +++++++++--------- .../Host/Internal/InternalSubCreator.java | 167 ++++-- .../Host/Internal/InternalSubServer.java | 476 +++++++++-------- .../Bungee/Host/ServerContainer.java | 4 +- .../SubServers/Bungee/Host/SubCreator.java | 58 ++ .../SubServers/Bungee/Host/SubServer.java | 21 + .../Bungee/Host/SubServerContainer.java | 23 + .../Library/Compatibility/GalaxiCommand.java | 10 + .../Compatibility/GalaxiCommandWrapper.java | 75 +++ .../Bungee/Library/Updates/ConfigUpdater.java | 29 +- .../Network/Packet/PacketCommandServer.java | 2 +- .../Network/Packet/PacketCreateServer.java | 2 +- .../Network/Packet/PacketExCreateServer.java | 21 + ...ateServer.java => PacketExEditServer.java} | 14 +- .../Network/Packet/PacketOutExRunEvent.java | 3 +- .../Network/Packet/PacketRestartServer.java | 1 + .../Network/Packet/PacketStartServer.java | 8 +- .../Network/Packet/PacketUpdateServer.java | 111 ++++ .../Bungee/Network/SubProtocol.java | 33 +- .../ME1312/SubServers/Bungee/SubCommand.java | 103 +++- .../ME1312/SubServers/Bungee/SubPlugin.java | 16 +- SubServers.Client/Bukkit/pom.xml | 2 +- .../Client/Bukkit/Event/SubCreateEvent.java | 35 +- .../Bukkit/Graphic/DefaultUIHandler.java | 13 + .../Bukkit/Graphic/DefaultUIRenderer.java | 69 ++- .../Library/Compatibility/BungeeChat.java | 16 +- .../Client/Bukkit/Network/API/SubCreator.java | 73 ++- .../Client/Bukkit/Network/API/SubServer.java | 263 +++++++++ .../Network/Packet/PacketInExRunEvent.java | 2 +- .../Network/Packet/PacketUpdateServer.java | 85 +++ .../Client/Bukkit/Network/SubProtocol.java | 26 +- .../SubServers/Client/Bukkit/SubCommand.java | 77 ++- SubServers.Client/Bukkit/src/plugin.yml | 5 +- SubServers.Client/Sponge/pom.xml | 2 +- .../Client/Sponge/Event/SubCreateEvent.java | 35 +- .../Client/Sponge/Network/API/SubCreator.java | 73 ++- .../Client/Sponge/Network/API/SubServer.java | 264 +++++++++ .../Network/Packet/PacketInExRunEvent.java | 2 +- .../Network/Packet/PacketUpdateServer.java | 84 +++ .../Client/Sponge/Network/SubProtocol.java | 26 +- .../SubServers/Client/Sponge/SubCommand.java | 103 +++- .../SubServers/Client/Sponge/SubPlugin.java | 2 +- SubServers.Console/src/bungee.yml | 2 +- SubServers.Creator/src/Forge/build.sh | 42 +- SubServers.Creator/src/Forge/template.yml | 3 +- SubServers.Creator/src/Spigot/build.sh | 27 +- SubServers.Creator/src/Spigot/template.yml | 3 +- SubServers.Creator/src/Sponge/build.sh | 20 +- SubServers.Creator/src/Sponge/template.yml | 3 +- SubServers.Creator/src/Vanilla/build.sh | 20 +- SubServers.Creator/src/Vanilla/template.yml | 3 +- SubServers.Host/pom.xml | 2 +- .../SubServers/Host/Event/SubCreateEvent.java | 35 +- .../net/ME1312/SubServers/Host/ExHost.java | 2 +- .../Host/Executable/SubCreator.java | 37 +- .../SubServers/Host/Executable/SubServer.java | 7 +- .../Host/Network/API/SubCreator.java | 73 ++- .../Host/Network/API/SubServer.java | 264 +++++++++ ...ateServer.java => PacketExEditServer.java} | 14 +- .../Network/Packet/PacketInExRunEvent.java | 2 +- .../Network/Packet/PacketUpdateServer.java | 84 +++ .../SubServers/Host/Network/SubProtocol.java | 30 +- .../ME1312/SubServers/Host/SubCommand.java | 109 +++- SubServers.Sync/pom.xml | 4 +- .../SubServers/Sync/Event/SubCreateEvent.java | 35 +- .../Library/Compatibility/GalaxiCommand.java | 10 + .../Compatibility/GalaxiCommandWrapper.java | 62 +++ .../Sync/Library/Updates/ConfigUpdater.java | 10 +- .../Sync/Network/API/SubCreator.java | 73 ++- .../Sync/Network/API/SubServer.java | 264 +++++++++ .../Network/Packet/PacketInExRunEvent.java | 2 +- .../Network/Packet/PacketUpdateServer.java | 84 +++ .../SubServers/Sync/Network/SubProtocol.java | 26 +- .../ME1312/SubServers/Sync/SubCommand.java | 101 +++- .../net/ME1312/SubServers/Sync/SubPlugin.java | 4 +- 78 files changed, 3666 insertions(+), 817 deletions(-) create mode 100644 SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/GalaxiCommandWrapper.java rename SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/{PacketExUpdateServer.java => PacketExEditServer.java} (86%) create mode 100644 SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketUpdateServer.java create mode 100644 SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/Packet/PacketUpdateServer.java create mode 100644 SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/Packet/PacketUpdateServer.java rename SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/{PacketExUpdateServer.java => PacketExEditServer.java} (87%) create mode 100644 SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketUpdateServer.java create mode 100644 SubServers.Sync/src/net/ME1312/SubServers/Sync/Library/Compatibility/GalaxiCommandWrapper.java create mode 100644 SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketUpdateServer.java diff --git a/SubServers.Bungee/pom.xml b/SubServers.Bungee/pom.xml index 0cb28416..60c05423 100644 --- a/SubServers.Bungee/pom.xml +++ b/SubServers.Bungee/pom.xml @@ -30,13 +30,13 @@ net.ME1312.Galaxi GalaxiUtil - 19w22b + 19w24a compile net.ME1312.Galaxi GalaxiEngine - 19w22b + 19w24a provided diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubCreateEvent.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubCreateEvent.java index 76c8f533..e204fa7a 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubCreateEvent.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Event/SubCreateEvent.java @@ -2,6 +2,7 @@ package net.ME1312.SubServers.Bungee.Event; import net.ME1312.SubServers.Bungee.Host.Host; import net.ME1312.SubServers.Bungee.Host.SubCreator; +import net.ME1312.SubServers.Bungee.Host.SubServer; import net.ME1312.SubServers.Bungee.Library.SubEvent; import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Version.Version; @@ -16,6 +17,7 @@ import java.util.UUID; public class SubCreateEvent extends Event implements SubEvent, Cancellable { private boolean cancelled = false; private UUID player; + private SubServer update; private Host host; private String name; private SubCreator.ServerTemplate template; @@ -42,6 +44,17 @@ public class SubCreateEvent extends Event implements SubEvent, Cancellable { this.port = port; } + public SubCreateEvent(UUID player, SubServer server, Version version) { + if (Util.isNull(server)) throw new NullPointerException(); + this.player = player; + this.update = server; + this.name = server.getName(); + this.host = server.getHost(); + this.template = server.getTemplate(); + this.version = version; + this.port = server.getAddress().getPort(); + } + /** * Get the Host the SubServer will run on * @@ -51,6 +64,24 @@ public class SubCreateEvent extends Event implements SubEvent, Cancellable { return host; } + /** + * Get if SubCreator is being run in update mode + * + * @return Update Mode Status + */ + public boolean isUpdate() { + return update != null; + } + + /** + * Get the Server that's being updated + * + * @return Updating Server + */ + public SubServer getUpdating() { + return update; + } + /** * Get the name the SubServer will use * 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 69dcf512..aa1223fb 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 @@ -9,6 +9,7 @@ import net.ME1312.SubServers.Bungee.Host.*; import net.ME1312.Galaxi.Library.Config.YAMLConfig; import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Version.Version; +import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; import net.ME1312.SubServers.Bungee.Network.Packet.PacketExConfigureHost; import net.ME1312.SubServers.Bungee.Network.Packet.PacketExCreateServer; import net.ME1312.SubServers.Bungee.SubAPI; @@ -85,7 +86,8 @@ public class ExternalSubCreator extends SubCreator { return new InetSocketAddress(host.getAddress(), i.get()); }).getPort(); } - ExternalSubLogger logger = new ExternalSubLogger(this, name + File.separator + "Creator", log, null); + String prefix = name + File.separator + "Creator"; + ExternalSubLogger logger = new ExternalSubLogger(this, prefix, log, null); thread.put(name.toLowerCase(), new NamedContainer<>(port, logger)); final int fport = port; @@ -96,7 +98,7 @@ public class ExternalSubCreator extends SubCreator { host.queue(new PacketExCreateServer(name, template, version, port, logger.getExternalAddress(), data -> { try { if (data.getInt(0x0001) == 0) { - System.out.println(name + "/Creator > Saving..."); + Logger.get(prefix).info("Saving..."); if (host.plugin.exServers.keySet().contains(name.toLowerCase())) host.plugin.exServers.remove(name.toLowerCase()); @@ -110,6 +112,7 @@ public class ExternalSubCreator extends SubCreator { server.set("Enabled", true); server.set("Display", ""); server.set("Host", host.getName()); + server.set("Template", template.getName()); server.set("Group", new ArrayList()); server.set("Port", fport); server.set("Motd", "Some SubServer"); @@ -127,6 +130,7 @@ public class ExternalSubCreator extends SubCreator { SubServer subserver = host.addSubServer(player, name, server.getBoolean("Enabled"), fport, ChatColor.translateAlternateColorCodes('&', server.getString("Motd")), server.getBoolean("Log"), server.getRawString("Directory"), server.getRawString("Executable"), server.getRawString("Stop-Command"), server.getBoolean("Hidden"), server.getBoolean("Restricted")); if (server.getString("Display").length() > 0) subserver.setDisplayName(server.getString("Display")); + subserver.setTemplate(getTemplate(server.getRawString("Template"))); 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); @@ -145,7 +149,7 @@ public class ExternalSubCreator extends SubCreator { ew.printStackTrace(); } } else { - System.out.println(name + "/Creator > " + data.getString(0x0003)); + Logger.get(prefix).info(data.getString(0x0003)); } } catch (Exception e) { e.printStackTrace(); @@ -183,6 +187,51 @@ public class ExternalSubCreator extends SubCreator { return string; } + @Override + public boolean update(UUID player, SubServer server, Version version, Callback callback) { + if (Util.isNull(server)) throw new NullPointerException(); + if (host.isAvailable() && host.isEnabled() && host == server.getHost() && server.isAvailable() && !server.isRunning() && server.getTemplate() != null && server.getTemplate().isEnabled() && server.getTemplate().canUpdate() && (version != null || !server.getTemplate().requiresVersion())) { + StackTraceElement[] origin = new Exception().getStackTrace(); + + String name = server.getName(); + String prefix = name + File.separator + "Updater"; + Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("lock"), server, true)); + ExternalSubLogger logger = new ExternalSubLogger(this, prefix, log, null); + thread.put(name.toLowerCase(), new NamedContainer<>(server.getAddress().getPort(), logger)); + + final SubCreateEvent event = new SubCreateEvent(player, server, version); + host.plugin.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + logger.start(); + host.queue(new PacketExCreateServer(server, version, logger.getExternalAddress(), data -> { + Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("lock"), server, false)); + try { + if (data.getInt(0x0001) == 0) { + Logger.get(prefix).info("Saving..."); + if (callback != null) try { + callback.run(server); + } catch (Throwable e) { + Throwable ew = new InvocationTargetException(e); + ew.setStackTrace(origin); + ew.printStackTrace(); + } + } else { + Logger.get(prefix).info(data.getString(0x0003)); + } + } catch (Exception e) { + e.printStackTrace(); + } + logger.stop(); + this.thread.remove(name.toLowerCase()); + })); + return true; + } else { + thread.remove(name.toLowerCase()); + return false; + } + } else return false; + } + @Override public void terminate() { HashMap> thread = new HashMap>(); 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 44beba54..f5ca062a 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 @@ -10,7 +10,7 @@ import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException; import net.ME1312.Galaxi.Library.NamedContainer; import net.ME1312.Galaxi.Library.Util; -import net.ME1312.SubServers.Bungee.Network.Packet.PacketExUpdateServer; +import net.ME1312.SubServers.Bungee.Network.Packet.PacketExEditServer; import net.md_5.bungee.BungeeServerInfo; import net.md_5.bungee.api.ChatColor; @@ -72,7 +72,7 @@ public class ExternalSubServer extends SubServerContainer { @Override public boolean start(UUID player) { - if (!lock && isEnabled() && !running && getCurrentIncompatibilities().size() == 0) { + if (!lock && isAvailable() && isEnabled() && !running && getCurrentIncompatibilities().size() == 0) { lock = true; SubStartEvent event = new SubStartEvent(player, this); host.plugin.getPluginManager().callEvent(event); @@ -81,7 +81,7 @@ public class ExternalSubServer extends SubServerContainer { Logger.get("SubServers").info("Now starting " + getName()); running = true; logger.start(); - host.queue(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.START, logger.getExternalAddress().toString())); + host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.START, logger.getExternalAddress().toString())); return true; } else return false; } else return false; @@ -99,7 +99,7 @@ public class ExternalSubServer extends SubServerContainer { host.plugin.getPluginManager().callEvent(event); if (!event.isCancelled()) { history.add(new LoggedCommand(player, stopcmd)); - host.queue(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.STOP)); + host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.STOP)); return true; } else return false; } else return false; @@ -152,7 +152,7 @@ public class ExternalSubServer extends SubServerContainer { SubStopEvent event = new SubStopEvent(player, this, true); host.plugin.getPluginManager().callEvent(event); if (!event.isCancelled()) { - host.queue(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.TERMINATE)); + host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.TERMINATE)); return true; } else return false; } else return false; @@ -167,9 +167,9 @@ public class ExternalSubServer extends SubServerContainer { if (!event.isCancelled()) { history.add(new LoggedCommand(player, event.getCommand())); if (event.getCommand().equalsIgnoreCase(stopcmd)) { - host.queue(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.STOP)); + host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.STOP)); } else { - host.queue(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.COMMAND, event.getCommand())); + host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.COMMAND, event.getCommand())); } return true; } else return false; @@ -186,255 +186,275 @@ public class ExternalSubServer extends SubServerContainer { @SuppressWarnings({"deprecation", "unchecked"}) private int edit(UUID player, ObjectMap edit, boolean perma) { - int c = 0; - boolean state = isRunning(); - SubServer forward = null; - ObjectMap pending = edit.clone(); - for (String key : edit.getKeys()) { - pending.remove(key); - ObjectMapValue value = edit.get(key); - SubEditServerEvent event = new SubEditServerEvent(player, this, new NamedContainer(key, value), perma); - host.plugin.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - try { - switch (key.toLowerCase()) { - 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()); - if (server != null) { - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - ObjectMap config = this.host.plugin.servers.get().getMap("Servers").getMap(getName()); - this.host.plugin.servers.get().getMap("Servers").remove(getName()); - this.host.plugin.servers.get().getMap("Servers").set(server.getName(), config); - this.host.plugin.servers.save(); + if (isAvailable()) { + int c = 0; + boolean state = isRunning(); + SubServer forward = null; + ObjectMap pending = edit.clone(); + for (String key : edit.getKeys()) { + pending.remove(key); + ObjectMapValue value = edit.get(key); + SubEditServerEvent event = new SubEditServerEvent(player, this, new NamedContainer(key, value), perma); + host.plugin.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + try { + switch (key.toLowerCase()) { + 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()); + if (server != null) { + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + ObjectMap config = this.host.plugin.servers.get().getMap("Servers").getMap(getName()); + this.host.plugin.servers.get().getMap("Servers").remove(getName()); + this.host.plugin.servers.get().getMap("Servers").set(server.getName(), config); + this.host.plugin.servers.save(); + } + forward = server; + c++; } - forward = server; - c++; } - } - break; - case "display": - if (value.isString()) { - Field f = ServerContainer.class.getDeclaredField("nick"); - f.setAccessible(true); - if (value == null || value.asString().length() == 0 || getName().equals(value)) { - f.set(this, null); - } else { - f.set(this, value.asString()); - } - f.setAccessible(false); - logger.name = getDisplayName(); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - if (getName().equals(getDisplayName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).remove("Display"); + break; + case "display": + if (value.isString()) { + Field f = ServerContainer.class.getDeclaredField("nick"); + f.setAccessible(true); + if (value.isNull() || value.asString().length() == 0 || getName().equals(value.asString())) { + f.set(this, null); } else { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Display", getDisplayName()); + f.set(this, value.asString()); } - this.host.plugin.servers.save(); - } - c++; - } - break; - case "enabled": - if (value.isBoolean()) { - if (enabled != value.asBoolean()) host.queue(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.SET_ENABLED, (Boolean) value.asBoolean())); - enabled = value.asBoolean(); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Enabled", isEnabled()); - this.host.plugin.servers.save(); - } - c++; - } - break; - case "group": - if (value.isList()) { - Util.reflect(ServerContainer.class.getDeclaredField("groups"), this, value.asStringList()); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Group", value.asStringList()); - this.host.plugin.servers.save(); - } - c++; - } - break; - 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()); - if (server != null) { + f.setAccessible(false); + logger.name = getDisplayName(); if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Host", server.getHost().getName()); - this.host.plugin.servers.save(); - } - forward = server; - c++; - } - } - break; - 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()); - if (server != null) { - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Port", server.getAddress().getPort()); - this.host.plugin.servers.save(); - } - forward = server; - c++; - } - } - break; - case "motd": - if (value.isString()) { - Util.reflect(BungeeServerInfo.class.getDeclaredField("motd"), this, ChatColor.translateAlternateColorCodes('&', value.asString())); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Motd", value.asString()); - this.host.plugin.servers.save(); - } - c++; - } - break; - case "log": - if (value.isBoolean()) { - if (log.get() != value.asBoolean()) host.queue(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.SET_LOGGING, (Boolean) value.asBoolean())); - log.set(value.asBoolean()); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Log", isLogging()); - this.host.plugin.servers.save(); - } - c++; - } - break; - case "dir": - case "directory": - 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()); - if (server != null) { - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Directory", server.getPath()); - this.host.plugin.servers.save(); - } - forward = server; - c++; - } - } - break; - case "exec": - case "executable": - if (value.isString() && host.removeSubServer(player, getName())) { - waitFor(() -> host.getSubServer(getName()), null); - SubServer server = host.addSubServer(player, getName(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), value.asRawString(), getStopCommand(), isHidden(), isRestricted()); - if (server != null) { - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Executable", value.asRawString()); - this.host.plugin.servers.save(); - } - forward = server; - c++; - } - } - break; - case "state": - if (value.isBoolean()) { - state = value.asBoolean(); - } - break; - case "stop-cmd": - case "stop-command": - if (value.isString()) { - if (!stopcmd.equals(value)) host.queue(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.SET_STOP_COMMAND, value.asRawString())); - stopcmd = value.asRawString(); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Stop-Command", getStopCommand()); - this.host.plugin.servers.save(); - } - 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 (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Stop-Action", getStopAction().toString()); + if (getName().equals(getDisplayName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).remove("Display"); + } else { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Display", getDisplayName()); + } this.host.plugin.servers.save(); } c++; } - } - break; - case "auto-run": - case "run-on-launch": - if (value.isBoolean()) { - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Run-On-Launch", value.asBoolean()); - this.host.plugin.servers.save(); + break; + case "enabled": + if (value.isBoolean()) { + if (enabled != value.asBoolean()) host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.SET_ENABLED, (Boolean) value.asBoolean())); + enabled = value.asBoolean(); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Enabled", isEnabled()); + this.host.plugin.servers.save(); + } + c++; } - c++; - } - break; - case "incompatible": - if (value.isList()) { - for (String oname : (List) value.asStringList()) { - SubServer oserver = host.plugin.api.getSubServer(oname); - if (oserver != null && isCompatible(oserver)) toggleCompatibility(oserver); + break; + case "group": + if (value.isList()) { + Util.reflect(ServerContainer.class.getDeclaredField("groups"), this, value.asStringList()); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Group", value.asStringList()); + this.host.plugin.servers.save(); + } + c++; } - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Incompatible", value.asStringList()); - this.host.plugin.servers.save(); + break; + 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()); + if (server != null) { + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Host", server.getHost().getName()); + this.host.plugin.servers.save(); + } + forward = server; + c++; + } } - c++; - } - break; - case "restricted": - if (value.isBoolean()) { - Util.reflect(BungeeServerInfo.class.getDeclaredField("restricted"), this, value.asBoolean()); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Restricted", isRestricted()); - this.host.plugin.servers.save(); + break; + case "template": + if (value.isString()) { + Util.reflect(SubServerContainer.class.getDeclaredField("template"), this, value.asString()); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Template", value.asString()); + this.host.plugin.servers.save(); + } + c++; } - c++; - } - break; - case "hidden": - if (value.isBoolean()) { - Util.reflect(ServerContainer.class.getDeclaredField("hidden"), this, value.asBoolean()); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Hidden", isHidden()); - this.host.plugin.servers.save(); + break; + 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()); + if (server != null) { + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Port", server.getAddress().getPort()); + this.host.plugin.servers.save(); + } + forward = server; + c++; + } } - c++; - } - break; - } - if (forward != null) { - forward.setStopAction(getStopAction()); - if (!getName().equals(getDisplayName())) forward.setDisplayName(getDisplayName()); - List groups = new ArrayList(); - groups.addAll(getGroups()); - for (String group : groups) { - removeGroup(group); - forward.addGroup(group); + break; + case "motd": + if (value.isString()) { + Util.reflect(BungeeServerInfo.class.getDeclaredField("motd"), this, ChatColor.translateAlternateColorCodes('&', value.asString())); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Motd", value.asString()); + this.host.plugin.servers.save(); + } + c++; + } + break; + case "log": + if (value.isBoolean()) { + if (log.get() != value.asBoolean()) host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.SET_LOGGING, (Boolean) value.asBoolean())); + log.set(value.asBoolean()); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Log", isLogging()); + this.host.plugin.servers.save(); + } + c++; + } + break; + case "dir": + case "directory": + 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()); + if (server != null) { + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Directory", server.getPath()); + this.host.plugin.servers.save(); + } + forward = server; + c++; + } + } + break; + case "exec": + case "executable": + if (value.isString() && host.removeSubServer(player, getName())) { + waitFor(() -> host.getSubServer(getName()), null); + SubServer server = host.addSubServer(player, getName(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), value.asRawString(), getStopCommand(), isHidden(), isRestricted()); + if (server != null) { + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Executable", value.asRawString()); + this.host.plugin.servers.save(); + } + forward = server; + c++; + } + } + break; + case "state": + if (value.isBoolean()) { + state = value.asBoolean(); + } + break; + case "stop-cmd": + case "stop-command": + if (value.isString()) { + if (!stopcmd.equals(value)) host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.SET_STOP_COMMAND, value.asRawString())); + stopcmd = value.asRawString(); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Stop-Command", getStopCommand()); + this.host.plugin.servers.save(); + } + 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 (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Stop-Action", getStopAction().toString()); + this.host.plugin.servers.save(); + } + c++; + } + } + break; + case "auto-run": + case "run-on-launch": + if (value.isBoolean()) { + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Run-On-Launch", value.asBoolean()); + this.host.plugin.servers.save(); + } + c++; + } + break; + case "incompatible": + if (value.isList()) { + for (SubServer oserver : getIncompatibilities()) toggleCompatibility(oserver); + for (String oname : (List) value.asStringList()) { + SubServer oserver = host.plugin.api.getSubServer(oname); + if (oserver != null && isCompatible(oserver)) toggleCompatibility(oserver); + } + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Incompatible", value.asStringList()); + this.host.plugin.servers.save(); + } + c++; + } + break; + case "restricted": + if (value.isBoolean()) { + Util.reflect(BungeeServerInfo.class.getDeclaredField("restricted"), this, value.asBoolean()); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Restricted", isRestricted()); + this.host.plugin.servers.save(); + } + c++; + } + break; + case "hidden": + if (value.isBoolean()) { + Util.reflect(ServerContainer.class.getDeclaredField("hidden"), this, value.asBoolean()); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Hidden", isHidden()); + this.host.plugin.servers.save(); + } + c++; + } + break; + case "whitelist": + if (value.isList()) { + Util.reflect(ServerContainer.class.getDeclaredField("whitelist"), this, value.asUUIDList()); + c++; + } + break; } - for (SubServer server : getIncompatibilities()) { - toggleCompatibility(server); - forward.toggleCompatibility(server); - } - for (String extra : getExtra().getKeys()) forward.addExtra(extra, getExtra(extra)); + if (forward != null) { + forward.setStopAction(getStopAction()); + if (!getName().equals(getDisplayName())) forward.setDisplayName(getDisplayName()); + List groups = new ArrayList(); + Util.reflect(SubServerContainer.class.getDeclaredField("template"), forward, Util.reflect(SubServerContainer.class.getDeclaredField("template"), this)); + groups.addAll(getGroups()); + for (String group : groups) { + removeGroup(group); + forward.addGroup(group); + } + for (SubServer server : getIncompatibilities()) { + toggleCompatibility(server); + forward.toggleCompatibility(server); + } + for (String extra : getExtra().getKeys()) forward.addExtra(extra, getExtra(extra)); - if (state) pending.set("state", true); - c += (perma)?forward.permaEdit(player, pending):forward.edit(player, pending); - break; + if (state) pending.set("state", true); + c += (perma)?forward.permaEdit(player, pending):forward.edit(player, pending); + break; + } + } catch (Exception e) { + e.printStackTrace(); } - } catch (Exception e) { - e.printStackTrace(); } } - } - if (!isRunning() && forward == null && state) start(player); - return c; + if (!isRunning() && forward == null && state) start(player); + return c; + } else return -1; } private void waitFor(ReturnRunnable method, V value) throws InterruptedException { while (method.run() != value) { Thread.sleep(250); @@ -467,14 +487,14 @@ public class ExternalSubServer extends SubServerContainer { @Override public boolean isEnabled() { - return enabled; + return enabled && host.isEnabled(); } @Override public void setEnabled(boolean value) { if (Util.isNull(value)) throw new NullPointerException(); 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)); + if (enabled != value) host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.SET_ENABLED, (Boolean) value)); enabled = value; } @@ -487,7 +507,7 @@ public class ExternalSubServer extends SubServerContainer { public void setLogging(boolean value) { if (Util.isNull(value)) throw new NullPointerException(); 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)); + if (log.get() != value) host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.SET_LOGGING, (Boolean) value)); log.set(value); } @@ -520,7 +540,7 @@ public class ExternalSubServer extends SubServerContainer { public void setStopCommand(String value) { if (Util.isNull(value)) throw new NullPointerException(); 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)); + if (!stopcmd.equals(value)) host.queue(new PacketExEditServer(this, PacketExEditServer.UpdateType.SET_STOP_COMMAND, value)); stopcmd = value; } 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 5919fc73..c6af0830 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 @@ -10,6 +10,7 @@ import net.ME1312.SubServers.Bungee.Event.SubCreateEvent; import net.ME1312.SubServers.Bungee.Host.*; import net.ME1312.Galaxi.Library.Config.YAMLConfig; import net.ME1312.Galaxi.Library.Map.ObjectMap; +import net.ME1312.SubServers.Bungee.Library.Compatibility.Logger; import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException; import net.ME1312.SubServers.Bungee.Library.Exception.SubCreatorException; import net.ME1312.Galaxi.Library.Version.Version; @@ -40,10 +41,12 @@ public class InternalSubCreator extends SubCreator { private class CreatorTask extends Thread { private final UUID player; + private final SubServer update; private final String name; private final ServerTemplate template; private final Version version; private final int port; + private final String prefix; private final InternalSubLogger log; private final Callback callback; private Process process; @@ -51,11 +54,24 @@ public class InternalSubCreator extends SubCreator { private CreatorTask(UUID player, String name, ServerTemplate template, Version version, int port, Callback callback) { super("SubServers.Bungee::Internal_SubCreator_Process_Handler(" + name + ')'); this.player = player; + this.update = null; this.name = name; this.template = template; this.version = version; this.port = port; - this.log = new InternalSubLogger(null, this, name + File.separator + "Creator", InternalSubCreator.this.log, null); + this.log = new InternalSubLogger(null, this, prefix = name + File.separator + "Creator", InternalSubCreator.this.log, null); + this.callback = callback; + } + + private CreatorTask(UUID player, SubServer server, Version version, Callback callback) { + super("SubServers.Bungee::Internal_SubCreator_Process_Handler(" + server.getName() + ')'); + this.player = player; + this.update = server; + this.name = server.getName(); + this.template = server.getTemplate(); + this.version = version; + this.port = server.getAddress().getPort(); + this.log = new InternalSubLogger(null, this, prefix = name + File.separator + "Updater", InternalSubCreator.this.log, null); this.callback = callback; } @@ -70,26 +86,31 @@ public class InternalSubCreator extends SubCreator { if (templates.keySet().contains(other.toLowerCase())) { if (templates.get(other.toLowerCase()).isEnabled()) { if (version != null || !templates.get(other.toLowerCase()).requiresVersion()) { - ObjectMap config = build(dir, templates.get(other.toLowerCase()), history); - if (config == null) { - throw new SubCreatorException(); + if (update == null || templates.get(other.toLowerCase()).canUpdate()) { + ObjectMap config = build(dir, templates.get(other.toLowerCase()), history); + if (config == null) { + throw new SubCreatorException(); + } else { + server.setAll(config); + } } else { - server.setAll(config); + Logger.get(prefix).info("Skipping template that cannot be run in update mode: " + other); } } else { - System.out.println(name + File.separator + "Creator > Skipping template that requires extra versioning: " + other); + Logger.get(prefix).info("Skipping template that requires extra versioning: " + other); } } else { - System.out.println(name + File.separator + "Creator > Skipping disabled template: " + other); + Logger.get(prefix).info("Skipping disabled template: " + other); } } else { - System.out.println(name + File.separator + "Creator > Skipping missing template: " + other); + Logger.get(prefix).info("Skipping missing template: " + other); } } server.setAll(template.getConfigOptions()); try { - System.out.println(name + File.separator + "Creator > Loading Template: " + template.getDisplayName()); + Logger.get(prefix).info("Loading Template: " + template.getDisplayName()); Util.copyDirectory(template.getDirectory(), dir); + var.put("mode", (update == null)?"CREATE":"UPDATE"); var.put("name", name); var.put("host", host.getName()); var.put("template", template.getName()); @@ -101,7 +122,7 @@ public class InternalSubCreator extends SubCreator { case SPONGE: case FORGE: if (version != null) { - System.out.println(name + File.separator + "Creator > Searching Versions..."); + Logger.get(prefix).info("Searching Versions..."); ObjectMap spversionmanifest = new ObjectMap(new Gson().fromJson("{\"versions\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://dl-api.spongepowered.org/v1/org.spongepowered/sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "/downloads?type=stable&minecraft=" + version).openStream(), Charset.forName("UTF-8")))) + '}', Map.class)); ObjectMap spprofile = null; @@ -114,11 +135,11 @@ public class InternalSubCreator extends SubCreator { } if (spversion == null) throw new InvalidServerException("Cannot find Sponge version for Minecraft " + version.toString()); - System.out.println(name + File.separator + "Creator > Found \"sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "-" + spversion.toString() + '"'); + Logger.get(prefix).info("Found \"sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "-" + spversion.toString() + '"'); if (template.getType() == ServerType.FORGE) { Version mcfversion = new Version(((spprofile.getMap("dependencies").getRawString("forge").contains("-"))?"":spprofile.getMap("dependencies").getRawString("minecraft") + '-') + spprofile.getMap("dependencies").getRawString("forge")); - System.out.println(name + File.separator + "Creator > Found \"forge-" + mcfversion.toString() + '"'); + Logger.get(prefix).info("Found \"forge-" + mcfversion.toString() + '"'); var.put("mcf_version", mcfversion.toString()); } @@ -144,7 +165,7 @@ public class InternalSubCreator extends SubCreator { } try { - System.out.println(name + File.separator + "Creator > Launching Build Script..."); + Logger.get(prefix).info("Launching Build Script..."); ProcessBuilder pb = new ProcessBuilder().command(Executable.parse(gitBash, template.getBuildOptions().getRawString("Executable"))).directory(dir); pb.environment().putAll(var); process = pb.start(); @@ -178,7 +199,7 @@ public class InternalSubCreator extends SubCreator { } public void run() { - UniversalFile dir = new UniversalFile(new File(host.getPath()), name); + File dir = (update != null)?new File(update.getFullPath()):new File(host.getPath(), name); dir.mkdirs(); ObjectMap server = new ObjectMap(); ObjectMap config; @@ -195,43 +216,48 @@ public class InternalSubCreator extends SubCreator { if (config != null) { try { - System.out.println(name + File.separator + "Creator > Saving..."); - if (host.plugin.exServers.keySet().contains(name.toLowerCase())) - host.plugin.exServers.remove(name.toLowerCase()); + Logger.get(prefix).info("Saving..."); + SubServer subserver = update; + if (update == null) { + if (host.plugin.exServers.keySet().contains(name.toLowerCase())) + host.plugin.exServers.remove(name.toLowerCase()); - config = new ObjectMap((Map) convert(config.get(), new NamedContainer<>("$player$", (player == null)?"":player.toString()), new NamedContainer<>("$name$", name), - new NamedContainer<>("$template$", template.getName()), new NamedContainer<>("$type$", template.getType().toString()), new NamedContainer<>("$version$", version.toString().replace(" ", "@")), - new NamedContainer<>("$address$", host.getAddress().getHostAddress()), new NamedContainer<>("$port$", Integer.toString(port)))); + config = new ObjectMap((Map) convert(config.get(), new NamedContainer<>("$player$", (player == null)?"":player.toString()), new NamedContainer<>("$name$", name), + new NamedContainer<>("$template$", template.getName()), new NamedContainer<>("$type$", template.getType().toString()), new NamedContainer<>("$version$", version.toString().replace(" ", "@")), + new NamedContainer<>("$address$", host.getAddress().getHostAddress()), new NamedContainer<>("$port$", Integer.toString(port)))); - server.set("Enabled", true); - server.set("Display", ""); - server.set("Host", host.getName()); - server.set("Group", new ArrayList()); - server.set("Port", port); - server.set("Motd", "Some SubServer"); - server.set("Log", true); - server.set("Directory", "./" + 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("Restricted", false); - server.set("Incompatible", new ArrayList()); - server.set("Hidden", false); - server.setAll(config); + server.set("Enabled", true); + server.set("Display", ""); + server.set("Host", host.getName()); + server.set("Template", template.getName()); + server.set("Group", new ArrayList()); + server.set("Port", port); + server.set("Motd", "Some SubServer"); + server.set("Log", true); + server.set("Directory", "./" + 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("Restricted", false); + server.set("Incompatible", new ArrayList()); + server.set("Hidden", false); + server.setAll(config); - SubServer subserver = host.addSubServer(player, name, server.getBoolean("Enabled"), port, ChatColor.translateAlternateColorCodes('&', server.getString("Motd")), server.getBoolean("Log"), server.getRawString("Directory"), - 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.getMap("Extra").getKeys()) - subserver.addExtra(extra, server.getMap("Extra").getObject(extra)); - host.plugin.servers.get().getMap("Servers").set(name, server); - host.plugin.servers.save(); - if (template.getBuildOptions().getBoolean("Run-On-Finish", true)) - subserver.start(); + subserver = host.addSubServer(player, name, server.getBoolean("Enabled"), port, ChatColor.translateAlternateColorCodes('&', server.getString("Motd")), server.getBoolean("Log"), server.getRawString("Directory"), + server.getRawString("Executable"), server.getRawString("Stop-Command"), server.getBoolean("Hidden"), server.getBoolean("Restricted")); + if (server.getString("Display").length() > 0) subserver.setDisplayName(server.getString("Display")); + subserver.setTemplate(getTemplate(server.getRawString("Template"))); + 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.getMap("Extra").getKeys()) + subserver.addExtra(extra, server.getMap("Extra").getObject(extra)); + host.plugin.servers.get().getMap("Servers").set(name, server); + host.plugin.servers.save(); + if (template.getBuildOptions().getBoolean("Run-On-Finish", true)) + subserver.start(); + } InternalSubCreator.this.thread.remove(name.toLowerCase()); callback.run(subserver); @@ -239,7 +265,7 @@ public class InternalSubCreator extends SubCreator { e.printStackTrace(); } } else { - System.out.println(name + File.separator + "Creator > Couldn't build the server jar. Check the SubCreator logs for more detail."); + Logger.get(prefix).info("Couldn't build the server jar. Check the SubCreator logs for more detail."); } InternalSubCreator.this.thread.remove(name.toLowerCase()); } private Object convert(Object value, NamedContainer... replacements) { @@ -300,7 +326,7 @@ public class InternalSubCreator extends SubCreator { if (config.getKeys().contains("Display")) template.setDisplayName(config.getString("Display")); } } catch (Exception e) { - System.out.println(host.getName() + File.separator + "Creator > Couldn't load template: " + file.getName()); + Logger.get(host.getName() + File.separator + "Creator").info("Couldn't load template: " + file.getName()); e.printStackTrace(); } } @@ -347,6 +373,39 @@ public class InternalSubCreator extends SubCreator { } else return false; } + @SuppressWarnings("deprecation") + @Override + public boolean update(UUID player, SubServer server, Version version, Callback callback) { + if (Util.isNull(server)) throw new NullPointerException(); + if (host.isAvailable() && host.isEnabled() && host == server.getHost() && server.isAvailable() && !server.isRunning() && server.getTemplate() != null && server.getTemplate().isEnabled() && server.getTemplate().canUpdate() && (version != null || !server.getTemplate().requiresVersion())) { + StackTraceElement[] origin = new Exception().getStackTrace(); + + Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("lock"), server, true)); + + CreatorTask task = new CreatorTask(player, server, version, x -> { + Util.isException(() -> Util.reflect(SubServerContainer.class.getDeclaredField("lock"), server, false)); + if (callback != null && x != null) try { + callback.run(x); + } catch (Throwable e) { + Throwable ew = new InvocationTargetException(e); + ew.setStackTrace(origin); + ew.printStackTrace(); + } + }); + this.thread.put(server.getName().toLowerCase(), task); + + final SubCreateEvent event = new SubCreateEvent(player, server, version); + host.plugin.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + task.start(); + return true; + } else { + this.thread.remove(server.getName().toLowerCase()); + return false; + } + } else return false; + } + @Override public void terminate() { HashMap temp = new HashMap(); @@ -460,10 +519,12 @@ public class InternalSubCreator extends SubCreator { Files.delete(new UniversalFile(dir, "subservers.client").toPath()); if (type == ServerType.SPIGOT) { if (!new UniversalFile(dir, "plugins").exists()) new UniversalFile(dir, "plugins").mkdirs(); - Util.copyFromJar(SubPlugin.class.getClassLoader(), "net/ME1312/SubServers/Bungee/Library/Files/client.jar", new UniversalFile(dir, "plugins:SubServers.Client.jar").getPath()); + if (!new UniversalFile(dir, "plugins:SubServers.Client.jar").exists()) + Util.copyFromJar(SubPlugin.class.getClassLoader(), "net/ME1312/SubServers/Bungee/Library/Files/client.jar", new UniversalFile(dir, "plugins:SubServers.Client.jar").getPath()); } else if (type == ServerType.FORGE || type == ServerType.SPONGE) { if (!new UniversalFile(dir, "mods").exists()) new UniversalFile(dir, "mods").mkdirs(); - Util.copyFromJar(SubPlugin.class.getClassLoader(), "net/ME1312/SubServers/Bungee/Library/Files/client.jar", new UniversalFile(dir, "mods:SubServers.Client.jar").getPath()); + if (!new UniversalFile(dir, "mods:SubServers.Client.jar").exists()) + Util.copyFromJar(SubPlugin.class.getClassLoader(), "net/ME1312/SubServers/Bungee/Library/Files/client.jar", new UniversalFile(dir, "mods:SubServers.Client.jar").getPath()); } YAMLSection config = new YAMLSection(); FileWriter writer = new FileWriter(new UniversalFile(dir, "subdata.json"), false); @@ -473,7 +534,7 @@ public class InternalSubCreator extends SubCreator { writer.write(config.toJSON().toString()); writer.close(); - if (new UniversalFile("SubServers:subdata.rsa.key").exists()) { + if (!new UniversalFile(dir, "subdata.rsa.key").exists() && new UniversalFile("SubServers:subdata.rsa.key").exists()) { Files.copy(new UniversalFile("SubServers:subdata.rsa.key").toPath(), new UniversalFile(dir, "subdata.rsa.key").toPath()); } } 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 37a77002..66ba44d2 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 @@ -187,7 +187,7 @@ public class InternalSubServer extends SubServerContainer { @Override public boolean start(UUID player) { - if (!lock && isEnabled() && !(thread != null && thread.isAlive()) && getCurrentIncompatibilities().size() == 0) { + if (!lock && isAvailable() && isEnabled() && !(thread != null && thread.isAlive()) && getCurrentIncompatibilities().size() == 0) { lock = true; SubStartEvent event = new SubStartEvent(player, this); host.plugin.getPluginManager().callEvent(event); @@ -269,251 +269,271 @@ public class InternalSubServer extends SubServerContainer { @SuppressWarnings({"deprecation", "unchecked"}) private int edit(UUID player, ObjectMap edit, boolean perma) { - int c = 0; - boolean state = isRunning(); - SubServer forward = null; - ObjectMap pending = edit.clone(); - for (String key : edit.getKeys()) { - pending.remove(key); - ObjectMapValue value = edit.get(key); - SubEditServerEvent event = new SubEditServerEvent(player, this, new NamedContainer(key, value), perma); - host.plugin.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - try { - switch (key.toLowerCase()) { - 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()); - if (server != null) { - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - ObjectMap config = this.host.plugin.servers.get().getMap("Servers").getMap(getName()); - this.host.plugin.servers.get().getMap("Servers").remove(getName()); - this.host.plugin.servers.get().getMap("Servers").set(server.getName(), config); - this.host.plugin.servers.save(); + if (isAvailable()) { + int c = 0; + boolean state = isRunning(); + SubServer forward = null; + ObjectMap pending = edit.clone(); + for (String key : edit.getKeys()) { + pending.remove(key); + ObjectMapValue value = edit.get(key); + SubEditServerEvent event = new SubEditServerEvent(player, this, new NamedContainer(key, value), perma); + host.plugin.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + try { + switch (key.toLowerCase()) { + 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()); + if (server != null) { + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + ObjectMap config = this.host.plugin.servers.get().getMap("Servers").getMap(getName()); + this.host.plugin.servers.get().getMap("Servers").remove(getName()); + this.host.plugin.servers.get().getMap("Servers").set(server.getName(), config); + this.host.plugin.servers.save(); + } + forward = server; + c++; } - forward = server; - c++; } - } - break; - case "display": - if (value.isString()) { - Field f = ServerContainer.class.getDeclaredField("nick"); - f.setAccessible(true); - if (value == null || value.asString().length() == 0 || getName().equals(value)) { - f.set(this, null); - } else { - f.set(this, value.asString()); - } - f.setAccessible(false); - logger.name = getDisplayName(); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - if (getName().equals(getDisplayName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).remove("Display"); + break; + case "display": + if (value.isString()) { + Field f = ServerContainer.class.getDeclaredField("nick"); + f.setAccessible(true); + if (value.isNull() || value.asString().length() == 0 || getName().equals(value.asString())) { + f.set(this, null); } else { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Display", getDisplayName()); + f.set(this, value.asString()); } - this.host.plugin.servers.save(); - } - c++; - } - break; - case "enabled": - if (value.isBoolean()) { - enabled = value.asBoolean(); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Enabled", isEnabled()); - this.host.plugin.servers.save(); - } - c++; - } - break; - case "group": - if (value.isList()) { - Util.reflect(ServerContainer.class.getDeclaredField("groups"), this, value.asStringList()); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Group", value.asStringList()); - this.host.plugin.servers.save(); - } - c++; - } - 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()); - if (server != null) { + f.setAccessible(false); + logger.name = getDisplayName(); if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Host", server.getHost().getName()); - this.host.plugin.servers.save(); - } - forward = server; - c++; - } - } - 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()); - if (server != null) { - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Port", server.getAddress().getPort()); - this.host.plugin.servers.save(); - } - forward = server; - c++; - } - } - break; - case "motd": - if (value.isString()) { - Util.reflect(BungeeServerInfo.class.getDeclaredField("motd"), this, ChatColor.translateAlternateColorCodes('&', value.asString())); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Motd", value.asString()); - this.host.plugin.servers.save(); - } - c++; - } - break; - case "log": - if (value.isBoolean()) { - log.set(value.asBoolean()); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Log", isLogging()); - this.host.plugin.servers.save(); - } - c++; - } - break; - case "dir": - case "directory": - if (value.isString()) { - if (isRunning()) { - stop(player); - waitFor(); - } - dir = value.asRawString(); - directory = new File(getHost().getPath(), value.asRawString()); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Directory", getPath()); - this.host.plugin.servers.save(); - } - c++; - } - break; - case "exec": - case "executable": - if (value.isString()) { - if (isRunning()) { - stop(player); - waitFor(); - } - executable = value.asRawString(); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Executable", value.asRawString()); - this.host.plugin.servers.save(); - } - c++; - } - break; - case "stop-cmd": - case "stop-command": - if (value.isString()) { - stopcmd = value.asRawString(); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Stop-Command", getStopCommand()); - this.host.plugin.servers.save(); - } - 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 (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Stop-Action", getStopAction().toString()); + if (getName().equals(getDisplayName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).remove("Display"); + } else { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Display", getDisplayName()); + } this.host.plugin.servers.save(); } c++; } - } - break; - case "state": - if (value.isBoolean()) { - state = value.asBoolean(); - } - break; - case "auto-run": - case "run-on-launch": - if (value.isBoolean()) { - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Run-On-Launch", value.asBoolean()); - this.host.plugin.servers.save(); + break; + case "enabled": + if (value.isBoolean()) { + enabled = value.asBoolean(); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Enabled", isEnabled()); + this.host.plugin.servers.save(); + } + c++; } - c++; - } - break; - case "incompatible": - if (value.isList()) { - for (String oname : (List) value.asStringList()) { - SubServer oserver = host.plugin.api.getSubServer(oname); - if (oserver != null && isCompatible(oserver)) toggleCompatibility(oserver); + break; + case "group": + if (value.isList()) { + Util.reflect(ServerContainer.class.getDeclaredField("groups"), this, value.asRawStringList()); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Group", value.asRawStringList()); + this.host.plugin.servers.save(); + } + c++; } - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Incompatible", value.asStringList()); - this.host.plugin.servers.save(); + 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()); + if (server != null) { + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Host", server.getHost().getName()); + this.host.plugin.servers.save(); + } + forward = server; + c++; + } } - c++; - } - break; - case "restricted": - if (value.isBoolean()) { - Util.reflect(BungeeServerInfo.class.getDeclaredField("restricted"), this, value.asBoolean()); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Restricted", isRestricted()); - this.host.plugin.servers.save(); + break; + case "template": + if (value.isString()) { + Util.reflect(SubServerContainer.class.getDeclaredField("template"), this, value.asRawString()); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Template", value.asRawString()); + this.host.plugin.servers.save(); + } + c++; } - c++; - } - break; - case "hidden": - if (value.isBoolean()) { - Util.reflect(ServerContainer.class.getDeclaredField("hidden"), this, value.asBoolean()); - if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { - this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Hidden", isHidden()); - this.host.plugin.servers.save(); + 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()); + if (server != null) { + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Port", server.getAddress().getPort()); + this.host.plugin.servers.save(); + } + forward = server; + c++; + } } - c++; - } - break; - } - if (forward != null) { - forward.setStopAction(getStopAction()); - if (!getName().equals(getDisplayName())) forward.setDisplayName(getDisplayName()); - List groups = new ArrayList(); - groups.addAll(getGroups()); - for (String group : groups) { - removeGroup(group); - forward.addGroup(group); + break; + case "motd": + if (value.isString()) { + Util.reflect(BungeeServerInfo.class.getDeclaredField("motd"), this, ChatColor.translateAlternateColorCodes('&', value.asString())); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Motd", value.asString()); + this.host.plugin.servers.save(); + } + c++; + } + break; + case "log": + if (value.isBoolean()) { + log.set(value.asBoolean()); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Log", isLogging()); + this.host.plugin.servers.save(); + } + c++; + } + break; + case "dir": + case "directory": + if (value.isString()) { + if (isRunning()) { + stop(player); + waitFor(); + } + dir = value.asRawString(); + directory = new File(getHost().getPath(), value.asRawString()); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Directory", getPath()); + this.host.plugin.servers.save(); + } + c++; + } + break; + case "exec": + case "executable": + if (value.isString()) { + if (isRunning()) { + stop(player); + waitFor(); + } + executable = value.asRawString(); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Executable", value.asRawString()); + this.host.plugin.servers.save(); + } + c++; + } + break; + case "stop-cmd": + case "stop-command": + if (value.isString()) { + stopcmd = value.asRawString(); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Stop-Command", getStopCommand()); + this.host.plugin.servers.save(); + } + 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 (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Stop-Action", getStopAction().toString()); + this.host.plugin.servers.save(); + } + c++; + } + } + break; + case "state": + if (value.isBoolean()) { + state = value.asBoolean(); + } + break; + case "auto-run": + case "run-on-launch": + if (value.isBoolean()) { + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Run-On-Launch", value.asBoolean()); + this.host.plugin.servers.save(); + } + c++; + } + break; + case "incompatible": + if (value.isList()) { + for (SubServer oserver : getIncompatibilities()) toggleCompatibility(oserver); + for (String oname : (List) value.asStringList()) { + SubServer oserver = host.plugin.api.getSubServer(oname); + if (oserver != null && isCompatible(oserver)) toggleCompatibility(oserver); + } + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Incompatible", value.asStringList()); + this.host.plugin.servers.save(); + } + c++; + } + break; + case "restricted": + if (value.isBoolean()) { + Util.reflect(BungeeServerInfo.class.getDeclaredField("restricted"), this, value.asBoolean()); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Restricted", isRestricted()); + this.host.plugin.servers.save(); + } + c++; + } + break; + case "hidden": + if (value.isBoolean()) { + Util.reflect(ServerContainer.class.getDeclaredField("hidden"), this, value.asBoolean()); + if (perma && this.host.plugin.servers.get().getMap("Servers").getKeys().contains(getName())) { + this.host.plugin.servers.get().getMap("Servers").getMap(getName()).set("Hidden", isHidden()); + this.host.plugin.servers.save(); + } + c++; + } + break; + case "whitelist": + if (value.isList()) { + Util.reflect(ServerContainer.class.getDeclaredField("whitelist"), this, value.asUUIDList()); + c++; + } + break; } - for (SubServer server : getIncompatibilities()) { - toggleCompatibility(server); - forward.toggleCompatibility(server); - } - for (String extra : getExtra().getKeys()) forward.addExtra(extra, getExtra(extra)); + if (forward != null) { + forward.setStopAction(getStopAction()); + if (!getName().equals(getDisplayName())) forward.setDisplayName(getDisplayName()); + Util.reflect(SubServerContainer.class.getDeclaredField("template"), forward, Util.reflect(SubServerContainer.class.getDeclaredField("template"), this)); + List groups = new ArrayList(); + groups.addAll(getGroups()); + for (String group : groups) { + removeGroup(group); + forward.addGroup(group); + } + for (SubServer server : getIncompatibilities()) { + toggleCompatibility(server); + forward.toggleCompatibility(server); + } + for (String extra : getExtra().getKeys()) forward.addExtra(extra, getExtra(extra)); - if (state) pending.set("state", true); - c += (perma)?forward.permaEdit(player, pending):forward.edit(player, pending); - break; + if (state) pending.set("state", true); + c += (perma)?forward.permaEdit(player, pending):forward.edit(player, pending); + break; + } + } catch (Exception e) { + e.printStackTrace(); } - } catch (Exception e) { - e.printStackTrace(); } } - } - if (!isRunning() && forward == null && state) start(player); - return c; + if (!isRunning() && forward == null && state) start(player); + return c; + } else return -1; } @Override @@ -541,7 +561,7 @@ public class InternalSubServer extends SubServerContainer { @Override public boolean isEnabled() { - return enabled; + return enabled && host.isEnabled(); } @Override 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 fadc2fd6..9586c4ac 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java @@ -195,7 +195,7 @@ public class ServerContainer extends BungeeServerInfo implements Server { @Override public void whitelist(UUID player) { if (Util.isNull(player)) throw new NullPointerException(); - whitelist.add(player); + if (!whitelist.contains(player)) whitelist.add(player); for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData()[0] != null) ((SubDataClient) proxy.getSubData()[0]).sendPacket(new PacketOutExUpdateWhitelist(getName(), true, player)); } @@ -249,7 +249,7 @@ public class ServerContainer extends BungeeServerInfo implements Server { info.set("group", getGroups()); info.set("address", getAddress().getAddress().getHostAddress() + ':' + getAddress().getPort()); info.set("motd", getMotd()); - info.set("whitelist", whitelist); + info.set("whitelist", getWhitelist()); info.set("restricted", isRestricted()); info.set("hidden", isHidden()); ObjectMap players = new ObjectMap(); 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 a30c386e..3cff963f 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubCreator.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubCreator.java @@ -140,6 +140,15 @@ public abstract class SubCreator { return getBuildOptions().getBoolean("Require-Version", false); } + /** + * Get whether this Template can be used to update it's servers + * + * @return Updatable Status + */ + public boolean canUpdate() { + return getBuildOptions().getBoolean("Can-Update", false); + } + /** * Get the Build Options for this Template * @@ -167,6 +176,7 @@ public abstract class SubCreator { tinfo.set("icon", getIcon()); tinfo.set("type", getType().toString()); tinfo.set("version-req", requiresVersion()); + tinfo.set("can-update", canUpdate()); return tinfo; } } @@ -191,6 +201,7 @@ public abstract class SubCreator { * @param template Server Template * @param version Server Version (may be null) * @param port Server Port Number (null to auto-select) + * @param callback Callback * @return Success Status */ public abstract boolean create(UUID player, String name, ServerTemplate template, Version version, Integer port, Callback callback); @@ -216,6 +227,7 @@ public abstract class SubCreator { * @param template Server Template * @param version Server Version (may be null) * @param port Server Port Number (null to auto-select) + * @param callback Callback * @return Success Status */ public boolean create(String name, ServerTemplate template, Version version, Integer port, Callback callback) { @@ -235,6 +247,52 @@ public abstract class SubCreator { return create(null, name, template, version, port); } + /** + * Update a SubServer + * + * @param player Player Updating + * @param server Server to Update + * @param version Server Version (may be null) + * @param callback Callback + * @return Success Status + */ + public abstract boolean update(UUID player, SubServer server, Version version, Callback callback); + + /** + * Update a SubServer + * + * @param player Player Updating + * @param server Server to Update + * @param version Server Version (may be null) + * @return Success Status + */ + public boolean update(UUID player, SubServer server, Version version) { + return update(player, server, version, null); + } + + /** + * Update a SubServer + * + * @param server Server to Update + * @param version Server Version (may be null) + * @param callback Callback + * @return Success Status + */ + public boolean update(SubServer server, Version version, Callback callback) { + return update(null, server, version, callback); + } + + /** + * Update a SubServer + * + * @param server Server to Update + * @param version Server Version (may be null) + * @return Success Status + */ + public boolean update(SubServer server, Version version) { + return update(null, server, version); + } + /** * Terminate All SubCreator Instances on this host */ 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 eabf3d95..7e83b46d 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServer.java @@ -226,6 +226,27 @@ public interface SubServer extends Server { */ Host getHost(); + /** + * Grabs the Template this Server was created from + * + * @return The Template + */ + SubCreator.ServerTemplate getTemplate(); + + /** + * Sets the Template this Server was created from + * + * @param value Value + */ + void setTemplate(SubCreator.ServerTemplate value); + + /** + * Is this Host Available? + * + * @return Availability Status + */ + boolean isAvailable(); + /** * If the Server is Enabled * 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 c84e7be8..cafb6479 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubServerContainer.java @@ -14,6 +14,8 @@ import java.util.*; */ public abstract class SubServerContainer extends ServerContainer implements SubServer { private List> incompatibilities = new ArrayList>(); + private String template = null; + private boolean lock; /** * Creates a SubServer @@ -54,6 +56,25 @@ public abstract class SubServerContainer extends ServerContainer implements SubS return permaEdit(null, edit); } + @Override + public boolean isAvailable() { + return !lock && getHost().isAvailable(); + } + + @Override + public void setTemplate(SubCreator.ServerTemplate template) { + this.template = (template != null)?template.getName():null; + } + + @Override + public SubCreator.ServerTemplate getTemplate() { + if (template != null && getHost().getCreator().getTemplates().keySet().contains(template.toLowerCase())) { + return getHost().getCreator().getTemplate(template.toLowerCase()); + } else { + return null; + } + } + @Override public String getFullPath() { return new File(getHost().getPath(), getPath()).getPath(); @@ -112,6 +133,8 @@ public abstract class SubServerContainer extends ServerContainer implements SubS ObjectMap sinfo = super.forSubData(); sinfo.set("type", "SubServer"); sinfo.set("host", getHost().getName()); + sinfo.set("template", (getTemplate() != null)?getTemplate().getName():null); + sinfo.set("available", isAvailable()); sinfo.set("enabled", isEnabled()); sinfo.set("editable", isEditable()); sinfo.set("log", isLogging()); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/GalaxiCommand.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/GalaxiCommand.java index acd02585..bde77d7e 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/GalaxiCommand.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/GalaxiCommand.java @@ -8,6 +8,16 @@ import net.md_5.bungee.api.plugin.Command; */ public class GalaxiCommand { + /** + * Group similar Commands + * + * @param commands Command Classes + */ + @SafeVarargs + public static void group(Class... commands) { + Util.isException(() -> Util.reflect(GalaxiCommandWrapper.class.getDeclaredConstructor(Class[].class), (Object) commands)); + } + /** * Set the Description of a Command * diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/GalaxiCommandWrapper.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/GalaxiCommandWrapper.java new file mode 100644 index 00000000..af0ecd25 --- /dev/null +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/GalaxiCommandWrapper.java @@ -0,0 +1,75 @@ +package net.ME1312.SubServers.Bungee.Library.Compatibility; + +import net.ME1312.Galaxi.Galaxi; +import net.ME1312.Galaxi.Library.Util; +import net.ME1312.Galaxi.Plugin.Command.Command; +import net.ME1312.Galaxi.Plugin.Command.CommandSender; +import net.ME1312.Galaxi.Plugin.Command.CompletionHandler; +import net.ME1312.Galaxi.Plugin.PluginManager; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +class GalaxiCommandWrapper extends Command implements CompletionHandler { + private HashMap forwards = new HashMap(); + private Command data; + + @SafeVarargs + GalaxiCommandWrapper(Class... commands) { + super(Galaxi.getInstance().getAppInfo()); + + Map registered = Util.getDespiteException(() -> Util.reflect(PluginManager.class.getDeclaredField("commands"), Galaxi.getInstance().getPluginManager()), null); + ArrayList tmp = new ArrayList(); + tmp.addAll(registered.keySet()); + for (String alias : tmp) { + Command command = registered.get(alias); + for (Class type : commands) { + if (type.isInstance(command)) { + forwards.put(alias, command); + if (data == null) data = command; + registered.remove(alias); + break; + } + } + } + + register(forwards.keySet().toArray(new String[0])); + } + + @Override + public void command(CommandSender sender, String label, String[] args) { + if (forwards.keySet().contains(label.toLowerCase())) { + forwards.get(label.toLowerCase()).command(sender, label, args); + } else { + throw new IllegalStateException("Command label not recognised in group: " + forwards.keySet()); + } + } + + @Override + public String[] complete(CommandSender sender, String label, String[] args) { + if (forwards.keySet().contains(label.toLowerCase())) { + Command command = forwards.get(label.toLowerCase()); + if (command.autocomplete() != null) { + return command.autocomplete().complete(sender, label, args); + } else return new String[0]; + } else { + throw new IllegalStateException("Command label not recognised in group: " + forwards.keySet()); + } + } + + @Override + public String description() { + return (data == null)?super.description():data.description(); + } + + @Override + public String[] help() { + return (data == null)?super.help():data.help(); + } + + @Override + public String[] usage() { + return (data == null)?super.usage():data.usage(); + } +} diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Updates/ConfigUpdater.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Updates/ConfigUpdater.java index ad5da97d..7c50e799 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Updates/ConfigUpdater.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Updates/ConfigUpdater.java @@ -154,6 +154,8 @@ public class ConfigUpdater { if (existing.getMap("Servers").getMap(name).getRawString("Stop-Action", "NONE").equalsIgnoreCase("DELETE_SERVER")) updated.getMap("Servers").getMap(name).set("Stop-Action", "RECYCLE_SERVER"); } + + existing = updated.clone(); i++; }// if (was.compareTo(new Version("99w99a")) <= 0) { // // do something @@ -177,6 +179,7 @@ public class ConfigUpdater { server.set("Enabled", updated.getMap("Servers").getMap(name).getBoolean("Enabled", false)); server.set("Display", updated.getMap("Servers").getMap(name).getRawString("Display", "")); server.set("Host", updated.getMap("Servers").getMap(name).getRawString("Host", "~")); + if (updated.getMap("Servers").getMap(name).contains("Template")) server.set("Template", updated.getMap("Servers").getMap(name).getRawString("Template")); server.set("Group", updated.getMap("Servers").getMap(name).getRawStringList("Groups", Collections.emptyList())); server.set("Port", updated.getMap("Servers").getMap(name).getInt("Port", 25567)); server.set("Motd", updated.getMap("Servers").getMap(name).getRawString("Motd", "Some SubServer")); @@ -220,7 +223,9 @@ public class ConfigUpdater { i++; Logger.get("SubServers").info("Created ./SubServers/lang.yml"); } else { - if (was.compareTo(new Version("19w17a")) <= 0) { + if (was.compareTo(new Version("19w22b")) <= 0) { + updated.getMap("Lang").remove("Interface.Host-Admin.SubServers"); + updated.getMap("Lang").remove("Interface.SubServer-Admin.Command"); i++; }// if (was.compareTo(new Version("99w99a")) <= 0) { // // do something @@ -274,6 +279,7 @@ public class ConfigUpdater { lang.set("Command.Help.SubServer.Stop", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.SubServer.Stop", " &7Stop Server:&f $str$")); lang.set("Command.Help.SubServer.Terminate", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.SubServer.Terminate", " &7Terminate Server:&f $str$")); lang.set("Command.Help.SubServer.Command", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.SubServer.Command", " &7Command Server:&f $str$")); + lang.set("Command.Help.SubServer.Update", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Help.SubServer.Update", " &7Update Server:&f $str$")); lang.set("Command.Version", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Version", "&7SubServers &8&l\u00BB&7 These are the platforms and versions that are running &f$str$&7:")); lang.set("Command.Version.Outdated", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Version.Outdated", "&7$name$ &f$str$ &7is available. You are $int$ version(s) behind.")); lang.set("Command.Version.Latest", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Version.Latest", "&7You are on the latest version.")); @@ -298,6 +304,7 @@ public class ConfigUpdater { lang.set("Command.Start.Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Invalid", "&cSubServers &4&l\u00BB&c That Server is not a SubServer")); lang.set("Command.Start.Host-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Host-Unavailable", "&cSubServers &4&l\u00BB&c That SubServer\u0027s Host is not available")); lang.set("Command.Start.Host-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Host-Disabled", "&cSubServers &4&l\u00BB&c That SubServer\u0027s Host is not enabled")); + lang.set("Command.Start.Server-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Server-Unavailable", "&cSubServers &4&l\u00BB&c That SubServer is not available")); lang.set("Command.Start.Server-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Server-Disabled", "&cSubServers &4&l\u00BB&c That SubServer is not enabled")); lang.set("Command.Start.Server-Incompatible", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Server-Incompatible", "&cSubServers &4&l\u00BB&c That SubServer cannot start while these server(s) are running: &4$str$")); lang.set("Command.Start.Running", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Start.Running", "&cSubServers &4&l\u00BB&c That SubServer is already running")); @@ -308,6 +315,7 @@ public class ConfigUpdater { lang.set("Command.Restart.Disappeared", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Disappeared", "&cSubServers &4&l\u00BB&c Could not restart server: That SubServer has disappeared")); lang.set("Command.Restart.Host-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Host-Unavailable", "&cSubServers &4&l\u00BB&c Could not restart server: That SubServer\u0027s Host is no longer available")); lang.set("Command.Restart.Host-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Host-Disabled", "&cSubServers &4&l\u00BB&c Could not restart server: That SubServer\u0027s Host is no longer enabled")); + lang.set("Command.Restart.Server-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Server-Unavailable", "&cSubServers &4&l\u00BB&c Could not restart server: That SubServer is no longer available")); lang.set("Command.Restart.Server-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Server-Disabled", "&cSubServers &4&l\u00BB&c Could not restart server: That SubServer is no longer enabled")); lang.set("Command.Restart.Server-Incompatible", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Restart.Server-Incompatible", "&cSubServers &4&l\u00BB&c Could not restart server: That SubServer cannot start while these server(s) are running: &4$str$")); lang.set("Command.Stop", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Stop", "&aSubServers &2&l\u00BB&a Stopping SubServer")); @@ -331,6 +339,17 @@ public class ConfigUpdater { lang.set("Command.Creator.Template-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Creator.Template-Disabled", "&cSubServers &4&l\u00BB&c That Template is not enabled")); lang.set("Command.Creator.Version-Required", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Creator.Version-Required", "&cSubServers &4&l\u00BB&c That Template requires a Minecraft Version to be specified")); lang.set("Command.Creator.Invalid-Port", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Creator.Invalid-Port", "&cSubServers &4&l\u00BB&c Invalid Port Number")); + lang.set("Command.Update", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Creator", "&aSubServers &2&l\u00BB&a Updating SubServer")); + lang.set("Command.Update.Unknown", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Unknown", "&cSubServers &4&l\u00BB&c There is no Server with that name")); + lang.set("Command.Update.Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Invalid", "&cSubServers &4&l\u00BB&c That Server is not a SubServer")); + lang.set("Command.Update.Host-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Host-Unavailable", "&cSubServers &4&l\u00BB&c That SubServer\u0027s Host is not available")); + lang.set("Command.Update.Host-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Host-Disabled", "&cSubServers &4&l\u00BB&c That SubServer\u0027s Host is not enabled")); + lang.set("Command.Update.Server-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Server-Unavailable", "&cSubServers &4&l\u00BB&c That SubServer is not available")); + lang.set("Command.Update.Running", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Running", "&cSubServers &4&l\u00BB&c Cannot update servers while they are still running")); + lang.set("Command.Update.Unknown-Template", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Unknown-Template", "&cSubServers &4&l\u00BB&c We don't know which template created that SubServer")); + lang.set("Command.Update.Template-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Template-Disabled", "&cSubServers &4&l\u00BB&c That SubServer's Template is not enabled")); + lang.set("Command.Update.Template-Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Template-Invalid", "&cSubServers &4&l\u00BB&c That SubServer's Template does not support server updating")); + lang.set("Command.Update.Version-Required", updated.getMap("Lang", new YAMLSection()).getRawString("Command.Update.Version-Required", "&cSubServers &4&l\u00BB&c That SubServer's Template requires a Minecraft Version to be specified")); lang.set("Interface.Generic.Back", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Generic.Back", "&cBack")); lang.set("Interface.Generic.Back-Arrow", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Generic.Back-Arrow", "&e&l<--")); lang.set("Interface.Generic.Next-Arrow", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Generic.Next-Arrow", "&e&l-->")); @@ -355,7 +374,7 @@ public class ConfigUpdater { lang.set("Interface.Host-Menu.Server-Menu", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Menu.Server-Menu", "&a&lView Servers")); lang.set("Interface.Host-Admin.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Admin.Title", "Host/$str$")); lang.set("Interface.Host-Admin.Creator", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Admin.Creator", "&eCreate a SubServer")); - lang.set("Interface.Host-Admin.SubServers", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Admin.SubServers", "&aView SubServers")); + lang.set("Interface.Host-Admin.SubServers", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Admin.SubServers", "&bView SubServers")); lang.set("Interface.Host-Admin.Plugins", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Admin.Plugins", "&bPlugins...")); lang.set("Interface.Host-Creator.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Title", "Host/$str$/Create")); lang.set("Interface.Host-Creator.Edit-Name", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Host-Creator.Edit-Name", "Change Name")); @@ -392,6 +411,7 @@ public class ConfigUpdater { lang.set("Interface.Server-Menu.SubServer-Temporary", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.SubServer-Temporary", "&9Temporary")); lang.set("Interface.Server-Menu.SubServer-Offline", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.SubServer-Offline", "&6Offline")); lang.set("Interface.Server-Menu.SubServer-Incompatible", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.SubServer-Incompatible", "&4Incompatible with $str$")); + lang.set("Interface.Server-Menu.SubServer-Unavailable", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.SubServer-Unavailable", "&4Unavailable")); lang.set("Interface.Server-Menu.SubServer-Disabled", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.SubServer-Disabled", "&4Disabled")); lang.set("Interface.Server-Menu.SubServer-Invalid", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.SubServer-Invalid", "&4Cannot be managed by SubServers")); lang.set("Interface.Server-Menu.No-Servers", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.Server-Menu.No-Servers", "&c&oThere are No Servers")); @@ -403,9 +423,12 @@ public class ConfigUpdater { lang.set("Interface.SubServer-Admin.Stop.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Stop.Title", "&cStopping $str$")); lang.set("Interface.SubServer-Admin.Terminate", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Terminate", "&4Terminate SubServer")); lang.set("Interface.SubServer-Admin.Terminate.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Terminate.Title", "&cTerminating $str$")); - lang.set("Interface.SubServer-Admin.Command", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Command", "&eSend a Command to the SubServer")); + lang.set("Interface.SubServer-Admin.Command", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Command", "&bSend a Command to the SubServer")); lang.set("Interface.SubServer-Admin.Command.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Command.Title", "&eSubServers\n&6Enter a Command to send via Chat")); lang.set("Interface.SubServer-Admin.Command.Message", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Command.Message", "&eSubServers &6&l\u00BB&e Enter a Command to send via Chat")); + lang.set("Interface.SubServer-Admin.Update", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Update", "&eUpdate SubServer")); + lang.set("Interface.SubServer-Admin.Update.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Update.Title", "&eSubServers\n&6Enter a Server Version to update to")); + lang.set("Interface.SubServer-Admin.Update.Message", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Update.Message", "&eSubServers &6&l\u00BB&e Enter a Server Version to update to via Chat")); lang.set("Interface.SubServer-Admin.Plugins", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Admin.Plugins", "&bPlugins...")); lang.set("Interface.SubServer-Plugin.Title", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Plugin.Title", "SubServer/$str$/Plugins")); lang.set("Interface.SubServer-Plugin.No-Plugins", updated.getMap("Lang", new YAMLSection()).getRawString("Interface.SubServer-Plugin.No-Plugins", "&c&oThere are No Plugins Available")); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketCommandServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketCommandServer.java index 08675c97..ff62f39f 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketCommandServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketCommandServer.java @@ -51,8 +51,8 @@ public class PacketCommandServer implements PacketObjectIn, PacketObjec @Override public void receive(SubDataClient client, ObjectMap data) { + UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null); try { - UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null); String server = data.getRawString(0x0001); String command = data.getRawString(0x0002); UUID player = (data.contains(0x0003)?data.getUUID(0x0003):null); 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 108a4e30..bb87dd64 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 @@ -48,8 +48,8 @@ public class PacketCreateServer implements PacketObjectIn, PacketObject @Override public void receive(SubDataClient client, ObjectMap data) { + UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null); try { - UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null); String name = data.getRawString(0x0001); String host = data.getRawString(0x0002); String template = data.getRawString(0x0003); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExCreateServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExCreateServer.java index ea5fc4f8..ab90caa4 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExCreateServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExCreateServer.java @@ -8,6 +8,7 @@ import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.SubData.Server.SubDataClient; import net.ME1312.SubData.Server.Protocol.PacketObjectOut; import net.ME1312.SubData.Server.Protocol.PacketObjectIn; +import net.ME1312.SubServers.Bungee.Host.SubServer; import java.util.HashMap; import java.util.UUID; @@ -31,6 +32,26 @@ public class PacketExCreateServer implements PacketObjectIn, PacketObje this.name = name; } + /** + * New PacketExCreateServer (Out) + * + * @param server Server to Update + * @param version Server Version + * @param log Log Address + * @param callback Callbacks + */ + @SafeVarargs + public PacketExCreateServer(SubServer server, Version version, UUID log, Callback>... callback) { + if (Util.isNull(server, log, callback)) throw new NullPointerException(); + this.name = server.getName(); + this.template = server.getTemplate(); + this.version = version; + this.port = server.getAddress().getPort(); + this.log = log; + this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID); + callbacks.put(tracker, callback); + } + /** * New PacketExCreateServer (Out) * diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExUpdateServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExEditServer.java similarity index 86% rename from SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExUpdateServer.java rename to SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExEditServer.java index 036c30b1..bf2c7fab 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExUpdateServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExEditServer.java @@ -13,9 +13,9 @@ import net.ME1312.SubServers.Bungee.SubPlugin; import java.util.Arrays; /** - * Update External Server Packet + * Edit External Server Packet */ -public class PacketExUpdateServer implements PacketObjectIn, PacketObjectOut { +public class PacketExEditServer implements PacketObjectIn, PacketObjectOut { private SubPlugin plugin; private SubServer server; private UpdateType type; @@ -50,22 +50,22 @@ public class PacketExUpdateServer implements PacketObjectIn, PacketObje } /** - * New PacketExUpdateServer (In) + * New PacketExEditServer (In) * @param plugin SubPlugin */ - public PacketExUpdateServer(SubPlugin plugin) { + public PacketExEditServer(SubPlugin plugin) { this.plugin = plugin; } /** - * New PacketExUpdateServer (Out) + * New PacketExEditServer (Out) * * @param server SubServer * @param type Update Type * @param arguments Arguments */ - public PacketExUpdateServer(SubServer server, UpdateType type, Object... arguments) { - if (arguments.length != type.getArguments().length) throw new IllegalArgumentException("Not enough arguments for type: " + type.toString()); + public PacketExEditServer(SubServer server, UpdateType type, Object... arguments) { + if (arguments.length != type.getArguments().length) throw new IllegalArgumentException(((arguments.length > type.getArguments().length)?"Too many":"Not enough") + " arguments for type: " + type.toString()); int i = 0; while (i < arguments.length) { if (!type.getArguments()[i].isInstance(arguments[i])) throw new IllegalArgumentException("Argument " + (i+1) + " is not " + type.getArguments()[i].getCanonicalName()); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExRunEvent.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExRunEvent.java index f18267fb..592341da 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExRunEvent.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketOutExRunEvent.java @@ -105,8 +105,9 @@ public class PacketOutExRunEvent implements Listener, PacketObjectOut { if (!event.isCancelled()) { ObjectMap args = new ObjectMap(); if (event.getPlayer() != null) args.set("player", event.getPlayer().toString()); - args.set("host", event.getHost().getName()); + args.set("update", event.isUpdate()); args.set("name", event.getName()); + args.set("host", event.getHost().getName()); args.set("template", event.getTemplate().getName()); if (event.getVersion() != null) args.set("version", event.getVersion()); args.set("port", event.getPort()); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketRestartServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketRestartServer.java index f90bdf68..06162c71 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketRestartServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketRestartServer.java @@ -62,6 +62,7 @@ public class PacketRestartServer implements PacketObjectIn, PacketObjec } else if (!(servers.get(name.toLowerCase()) instanceof SubServer)) { } else if (!((SubServer) servers.get(name.toLowerCase())).getHost().isAvailable()) { } else if (!((SubServer) servers.get(name.toLowerCase())).getHost().isEnabled()) { + } else if (!((SubServer) servers.get(name.toLowerCase())).isAvailable()) { } else if (!((SubServer) servers.get(name.toLowerCase())).isEnabled()) { } else if (((SubServer) servers.get(name.toLowerCase())).isRunning()) { } else if (((SubServer) servers.get(name.toLowerCase())).getCurrentIncompatibilities().size() != 0) { 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 873c5230..41c34236 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 @@ -78,17 +78,19 @@ public class PacketStartServer implements PacketObjectIn, PacketObjectO client.sendPacket(new PacketStartServer(5, tracker)); } else if (!((SubServer) servers.get(name.toLowerCase())).getHost().isEnabled()) { client.sendPacket(new PacketStartServer(6, tracker)); - } else if (!((SubServer) servers.get(name.toLowerCase())).isEnabled()) { + } else if (!((SubServer) servers.get(name.toLowerCase())).isAvailable()) { client.sendPacket(new PacketStartServer(7, tracker)); - } else if (((SubServer) servers.get(name.toLowerCase())).isRunning()) { + } else if (!((SubServer) servers.get(name.toLowerCase())).isEnabled()) { client.sendPacket(new PacketStartServer(8, tracker)); + } else if (((SubServer) servers.get(name.toLowerCase())).isRunning()) { + client.sendPacket(new PacketStartServer(9, tracker)); } else if (((SubServer) servers.get(name.toLowerCase())).getCurrentIncompatibilities().size() != 0) { String list = ""; for (SubServer server : ((SubServer) servers.get(name.toLowerCase())).getCurrentIncompatibilities()) { if (list.length() != 0) list += ", "; list += server.getName(); } - client.sendPacket(new PacketStartServer(9, list, tracker)); + client.sendPacket(new PacketStartServer(10, list, tracker)); } else { if (((SubServer) servers.get(name.toLowerCase())).start(player)) { client.sendPacket(new PacketStartServer(0, tracker)); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketUpdateServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketUpdateServer.java new file mode 100644 index 00000000..36e422f8 --- /dev/null +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketUpdateServer.java @@ -0,0 +1,111 @@ +package net.ME1312.SubServers.Bungee.Network.Packet; + +import net.ME1312.Galaxi.Library.Map.ObjectMap; +import net.ME1312.Galaxi.Library.Version.Version; +import net.ME1312.SubData.Server.Protocol.PacketObjectIn; +import net.ME1312.SubData.Server.Protocol.PacketObjectOut; +import net.ME1312.SubData.Server.SubDataClient; +import net.ME1312.SubServers.Bungee.Host.Server; +import net.ME1312.SubServers.Bungee.Host.SubCreator; +import net.ME1312.SubServers.Bungee.Host.SubServer; +import net.ME1312.SubServers.Bungee.SubPlugin; + +import java.util.Map; +import java.util.UUID; + +/** + * Update Server Packet + */ +public class PacketUpdateServer implements PacketObjectIn, PacketObjectOut { + private SubPlugin plugin; + private int response; + private UUID tracker; + + /** + * New PacketUpdateServer (In) + * + * @param plugin SubPlugin + */ + public PacketUpdateServer(SubPlugin plugin) { + this.plugin = plugin; + } + + /** + * New PacketUpdateServer (Out) + * + * @param response Response ID + * @param id Receiver ID + */ + public PacketUpdateServer(int response, UUID id) { + this.response = response; + this.tracker = id; + } + + @Override + public ObjectMap send(SubDataClient client) { + ObjectMap data = new ObjectMap(); + if (tracker != null) data.set(0x0000, tracker); + data.set(0x0001, response); + return data; + } + + @Override + public void receive(SubDataClient client, ObjectMap data) { + UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null); + try { + String name = data.getRawString(0x0001); + Version version = (data.contains(0x0002)?data.getVersion(0x0002):null); + UUID player = (data.contains(0x0003)?data.getUUID(0x0003):null); + boolean waitfor = (data.contains(0x0004)?data.getBoolean(0x0004):false); + + Map servers = plugin.api.getServers(); + if (!servers.keySet().contains(name.toLowerCase())) { + client.sendPacket(new PacketUpdateServer(3, tracker)); + } else if (!(servers.get(name.toLowerCase()) instanceof SubServer)) { + client.sendPacket(new PacketUpdateServer(4, tracker)); + } else if (!((SubServer) servers.get(name.toLowerCase())).getHost().isAvailable()) { + client.sendPacket(new PacketUpdateServer(5, tracker)); + } else if (!((SubServer) servers.get(name.toLowerCase())).getHost().isEnabled()) { + client.sendPacket(new PacketUpdateServer(6, tracker)); + } else if (!((SubServer) servers.get(name.toLowerCase())).isAvailable()) { + client.sendPacket(new PacketUpdateServer(7, tracker)); + } else if (((SubServer) servers.get(name.toLowerCase())).isRunning()) { + client.sendPacket(new PacketUpdateServer(8, tracker)); + } else if (((SubServer) servers.get(name.toLowerCase())).getTemplate() == null) { + client.sendPacket(new PacketUpdateServer(9, tracker)); + } else if (!((SubServer) servers.get(name.toLowerCase())).getTemplate().isEnabled()) { + client.sendPacket(new PacketUpdateServer(10, tracker)); + } else if (!((SubServer) servers.get(name.toLowerCase())).getTemplate().canUpdate()) { + client.sendPacket(new PacketUpdateServer(11, tracker)); + } else if (version == null && ((SubServer) servers.get(name.toLowerCase())).getTemplate().requiresVersion()) { + client.sendPacket(new PacketUpdateServer(12, tracker)); + } else { + if (((SubServer) servers.get(name.toLowerCase())).getHost().getCreator().update(player, (SubServer) servers.get(name.toLowerCase()), version)) { + if (waitfor) { + new Thread(() -> { + try { + ((SubServer) servers.get(name.toLowerCase())).getHost().getCreator().waitFor(); + client.sendPacket(new PacketUpdateServer(0, tracker)); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }, "SubServers.Bungee::SubData_SubCreator_Update_Handler(" + client.getAddress().toString() + ')').start(); + } else { + client.sendPacket(new PacketUpdateServer(0, tracker)); + } + } else { + client.sendPacket(new PacketUpdateServer(1, tracker)); + } + + } + } catch (Throwable e) { + client.sendPacket(new PacketUpdateServer(2, tracker)); + e.printStackTrace(); + } + } + + @Override + public int version() { + return 0x0001; + } +} diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubProtocol.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubProtocol.java index 9bed9dfc..bfb32f8e 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubProtocol.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubProtocol.java @@ -9,12 +9,9 @@ import net.ME1312.SubServers.Bungee.Event.SubNetworkDisconnectEvent; import net.ME1312.SubServers.Bungee.Network.Packet.*; import net.ME1312.SubServers.Bungee.SubAPI; import net.ME1312.SubServers.Bungee.SubPlugin; -import net.md_5.bungee.api.ProxyServer; import java.io.IOException; import java.net.InetAddress; -import java.util.logging.Handler; -import java.util.logging.LogRecord; import java.util.logging.Logger; public class SubProtocol extends SubDataProtocol { @@ -68,22 +65,24 @@ public class SubProtocol extends SubDataProtocol { instance.registerPacket(0x0030, PacketCreateServer.class); instance.registerPacket(0x0031, PacketAddServer.class); instance.registerPacket(0x0032, PacketStartServer.class); - instance.registerPacket(0x0033, PacketEditServer.class); - instance.registerPacket(0x0034, PacketRestartServer.class); - instance.registerPacket(0x0035, PacketCommandServer.class); - instance.registerPacket(0x0036, PacketStopServer.class); - instance.registerPacket(0x0037, PacketRemoveServer.class); - instance.registerPacket(0x0038, PacketDeleteServer.class); + instance.registerPacket(0x0033, PacketUpdateServer.class); + instance.registerPacket(0x0034, PacketEditServer.class); + instance.registerPacket(0x0035, PacketRestartServer.class); + instance.registerPacket(0x0036, PacketCommandServer.class); + instance.registerPacket(0x0037, PacketStopServer.class); + instance.registerPacket(0x0038, PacketRemoveServer.class); + instance.registerPacket(0x0039, PacketDeleteServer.class); instance.registerPacket(0x0030, new PacketCreateServer(plugin)); instance.registerPacket(0x0031, new PacketAddServer(plugin)); instance.registerPacket(0x0032, new PacketStartServer(plugin)); - instance.registerPacket(0x0033, new PacketEditServer(plugin)); - instance.registerPacket(0x0034, new PacketRestartServer(plugin)); - instance.registerPacket(0x0035, new PacketCommandServer(plugin)); - instance.registerPacket(0x0036, new PacketStopServer(plugin)); - instance.registerPacket(0x0037, new PacketRemoveServer(plugin)); - instance.registerPacket(0x0038, new PacketDeleteServer(plugin)); + instance.registerPacket(0x0033, new PacketUpdateServer(plugin)); + instance.registerPacket(0x0034, new PacketEditServer(plugin)); + instance.registerPacket(0x0035, new PacketRestartServer(plugin)); + instance.registerPacket(0x0036, new PacketCommandServer(plugin)); + instance.registerPacket(0x0037, new PacketStopServer(plugin)); + instance.registerPacket(0x0038, new PacketRemoveServer(plugin)); + instance.registerPacket(0x0039, new PacketDeleteServer(plugin)); // 50-69: External Host Packets @@ -92,7 +91,7 @@ public class SubProtocol extends SubDataProtocol { //instance.registerPacket(0x0052, PacketInExRequestQueue.class); instance.registerPacket(0x0053, PacketExCreateServer.class); instance.registerPacket(0x0054, PacketExAddServer.class); - instance.registerPacket(0x0055, PacketExUpdateServer.class); + instance.registerPacket(0x0055, PacketExEditServer.class); //instance.registerPacket(0x0056, PacketInExLogMessage.class); instance.registerPacket(0x0057, PacketExDeleteServer.class); instance.registerPacket(0x0058, PacketExRemoveServer.class); @@ -102,7 +101,7 @@ public class SubProtocol extends SubDataProtocol { instance.registerPacket(0x0052, new PacketInExRequestQueue(plugin)); instance.registerPacket(0x0053, new PacketExCreateServer(null)); instance.registerPacket(0x0054, new PacketExAddServer()); - instance.registerPacket(0x0055, new PacketExUpdateServer(plugin)); + instance.registerPacket(0x0055, new PacketExEditServer(plugin)); instance.registerPacket(0x0056, new PacketInExLogMessage()); instance.registerPacket(0x0057, new PacketExDeleteServer()); instance.registerPacket(0x0058, new PacketExRemoveServer()); diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java index ba73f583..dd8e8d71 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java @@ -149,6 +149,7 @@ public final class SubCommand extends CommandX { case "all": case "system": case "bungee": + case "bungeecord": case "network": plugin.getPluginManager().dispatchCommand(ConsoleCommandSender.getInstance(), "greload"); break; @@ -210,7 +211,7 @@ public final class SubCommand extends CommandX { } else { message += ChatColor.GREEN; } - } else if (((SubServer) server).getHost().isAvailable() && ((SubServer) server).getHost().isEnabled() && ((SubServer) server).isEnabled() && ((SubServer) server).getCurrentIncompatibilities().size() == 0) { + } else if (((SubServer) server).getHost().isAvailable() && ((SubServer) server).getHost().isEnabled() && ((SubServer) server).isAvailable() && ((SubServer) server).isEnabled() && ((SubServer) server).getCurrentIncompatibilities().size() == 0) { message += ChatColor.YELLOW; } else { message += ChatColor.RED; @@ -243,7 +244,7 @@ public final class SubCommand extends CommandX { } else { message += ChatColor.GREEN; } - } else if (subserver.getHost().isEnabled() && subserver.isEnabled() && subserver.getCurrentIncompatibilities().size() == 0) { + } else if (subserver.getHost().isAvailable() && subserver.getHost().isEnabled() && subserver.isAvailable() && subserver.isEnabled() && subserver.getCurrentIncompatibilities().size() == 0) { message += ChatColor.YELLOW; } else { message += ChatColor.RED; @@ -297,9 +298,11 @@ public final class SubCommand extends CommandX { 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(" -> Available: " + ((((SubServer) server).isAvailable())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); sender.sendMessage(" -> Enabled: " + ((((SubServer) server).isEnabled())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); if (!((SubServer) server).isEditable()) sender.sendMessage(" -> Editable: " + ChatColor.RED + "no"); sender.sendMessage(" -> Host: " + ChatColor.WHITE + ((SubServer) server).getHost().getName()); + if (((SubServer) server).getTemplate() != null) sender.sendMessage(" -> Template: " + ChatColor.WHITE + ((SubServer) server).getTemplate().getName()); } if (server.getGroups().size() > 0) sender.sendMessage(" -> Group" + ((server.getGroups().size() > 1)?"s:":": " + ChatColor.WHITE + server.getGroups().get(0))); if (server.getGroups().size() > 1) for (String group : server.getGroups()) sender.sendMessage(" - " + ChatColor.WHITE + group); @@ -422,6 +425,8 @@ public final class SubCommand extends CommandX { 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())).isAvailable()) { + sender.sendMessage("SubServers > That SubServer is not available"); } else if (!((SubServer) servers.get(args[1].toLowerCase())).isEnabled()) { sender.sendMessage("SubServers > That SubServer is not enabled"); } else if (((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { @@ -449,6 +454,8 @@ public final class SubCommand extends CommandX { sender.sendMessage("SubServers > Could not restart server: That SubServer's Host is no longer available"); } else if (!((SubServer) servers.get(args[1].toLowerCase())).getHost().isEnabled()) { sender.sendMessage("SubServers > Could not restart server: That SubServer's Host is no longer enabled"); + } else if (!((SubServer) servers.get(args[1].toLowerCase())).isAvailable()) { + sender.sendMessage("SubServers > Could not restart server: That SubServer is no longer available"); } else if (!((SubServer) servers.get(args[1].toLowerCase())).isEnabled()) { sender.sendMessage("SubServers > Could not restart server: That SubServer is no longer enabled"); } else if (!((SubServer) servers.get(args[1].toLowerCase())).isRunning()) { @@ -600,6 +607,35 @@ public final class SubCommand extends CommandX { } else { sender.sendMessage("SubServers > Usage: " + label + " " + args[0].toLowerCase() + "