From 3dea3b67d08ac1c8e19c5130f2f19721275df5e6 Mon Sep 17 00:00:00 2001 From: ME1312 Date: Sat, 6 Feb 2021 23:53:03 -0500 Subject: [PATCH] Rework SubServers.Bungee's app lifecycle SubServers.Bungee now puts code in 2 new places to better load/unload it's data. When supported, this should give it better compatabilty with ordanary plugins. Also, it no longer has to 'shutdown' to handle /greload. Isn't that neat? --- SubServers.Bungee/common/pom.xml | 4 +- .../ME1312/SubServers/Bungee/BungeeAPI.java | 8 - .../Bungee/Library/Compatibility/Logger.java | 16 +- SubServers.Bungee/pom.xml | 4 +- .../ME1312/SubServers/Bungee/Host/Host.java | 4 +- .../Bungee/Host/Internal/InternalHost.java | 2 +- .../Bungee/Library/Compatibility/Plugin.java | 26 +++- .../net/ME1312/SubServers/Bungee/SubAPI.java | 20 +-- .../ME1312/SubServers/Bungee/SubCommand.java | 108 +++++++------ .../ME1312/SubServers/Bungee/SubProxy.java | 142 +++++++----------- SubServers.Client/Bukkit/pom.xml | 2 +- SubServers.Client/Common/pom.xml | 2 +- SubServers.Client/Sponge/pom.xml | 2 +- .../SubServers/Console/ConsolePlugin.java | 4 +- SubServers.Host/pom.xml | 2 +- .../net/ME1312/SubServers/Host/ExHost.java | 24 +-- SubServers.Sync/pom.xml | 4 +- .../net/ME1312/SubServers/Sync/ExProxy.java | 10 +- .../net/ME1312/SubServers/Sync/SubAPI.java | 13 -- .../ME1312/SubServers/Sync/SubCommand.java | 102 +++++++------ 20 files changed, 230 insertions(+), 269 deletions(-) diff --git a/SubServers.Bungee/common/pom.xml b/SubServers.Bungee/common/pom.xml index 6e15235e..a3d5023c 100644 --- a/SubServers.Bungee/common/pom.xml +++ b/SubServers.Bungee/common/pom.xml @@ -30,13 +30,13 @@ net.ME1312.Galaxi GalaxiUtil - 21w04a + 21w06a provided net.ME1312.Galaxi GalaxiEngine - 21w04a + 21w06a provided diff --git a/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/BungeeAPI.java b/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/BungeeAPI.java index 3e0c727c..7dff142c 100644 --- a/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/BungeeAPI.java +++ b/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/BungeeAPI.java @@ -26,14 +26,6 @@ public interface BungeeAPI { return ((BungeeCommon) ProxyServer.getInstance()).api.run(); } - /** - * Adds a SubAPI Listener - * - * @param enable An Event that will be called when SubAPI is ready - * @param disable An Event that will be called before SubAPI is disabled (your plugin should reset it's values in case this is a hard-reset instead of a shutdown) - */ - void addListener(Runnable enable, Runnable disable); - /** * Get the number of players on this network across all known proxies * diff --git a/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/Library/Compatibility/Logger.java b/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/Library/Compatibility/Logger.java index be737901..fa792011 100644 --- a/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/Library/Compatibility/Logger.java +++ b/SubServers.Bungee/common/src/net/ME1312/SubServers/Bungee/Library/Compatibility/Logger.java @@ -19,7 +19,6 @@ public class Logger { * @param prefix Prefix * @return Logger */ - @SuppressWarnings("deprecation") public static java.util.logging.Logger get(String prefix) { if (!existing.keySet().contains(prefix)) { java.util.logging.Logger log = Util.getDespiteException(() -> Util.reflect(Class.forName("net.ME1312.Galaxi.Library.Log.Logger").getDeclaredMethod("toPrimitive"), @@ -29,23 +28,14 @@ public class Logger { log = java.util.logging.Logger.getAnonymousLogger(); log.setUseParentHandlers(false); log.addHandler(new Handler() { - private boolean open = true; - @Override public void publish(LogRecord record) { - if (open) - BungeeCommon.getInstance().getLogger().log(record.getLevel(), prefix + " > " + record.getMessage(), record.getParameters()); + BungeeCommon.getInstance().getLogger().log(record.getLevel(), prefix + " > " + record.getMessage(), record.getParameters()); } @Override - public void flush() { - - } - - @Override - public void close() throws SecurityException { - open = false; - } + public void flush() {} + public void close() {} }); } existing.put(prefix, log); diff --git a/SubServers.Bungee/pom.xml b/SubServers.Bungee/pom.xml index bc23c8f7..2f552061 100644 --- a/SubServers.Bungee/pom.xml +++ b/SubServers.Bungee/pom.xml @@ -30,14 +30,14 @@ net.ME1312.Galaxi GalaxiUtil - 21w04a + 21w06a compile true net.ME1312.Galaxi GalaxiEngine - 21w04a + 21w06a provided diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java index 18df92b4..a135dcd8 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Host.java @@ -465,13 +465,11 @@ public abstract class Host implements ExtraDataHandler { */ public boolean destroy() { try { - List subservers = new ArrayList(); - subservers.addAll(getSubServers().keySet()); + String[] subservers = getSubServers().keySet().toArray(new String[0]); for (String server : subservers) { forceRemoveSubServer(server); } - subservers.clear(); getCreator().terminate(); getCreator().waitFor(); return true; diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java index 2a0169e4..1a793536 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalHost.java @@ -124,9 +124,9 @@ public class InternalHost extends Host { server.stop(); server.waitFor(); } + servers.remove(name.toLowerCase()); if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(server.getAddress().getPort())) UPnP.closePortTCP(server.getAddress().getPort()); - servers.remove(name.toLowerCase()); return true; } else return false; } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/Plugin.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/Plugin.java index d0ddf445..a031f8c2 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/Plugin.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Library/Compatibility/Plugin.java @@ -1,19 +1,23 @@ package net.ME1312.SubServers.Bungee.Library.Compatibility; +import net.ME1312.Galaxi.Library.Callback.ExceptionRunnable; import net.ME1312.Galaxi.Library.Util; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.PluginDescription; import java.io.File; +import java.io.IOException; public final class Plugin extends net.md_5.bungee.api.plugin.Plugin { private static final PluginDescription description = new PluginDescription(); - private final boolean invalid; + private final ExceptionRunnable enable; + private final Runnable disable; @Deprecated public Plugin() { - this.invalid = true; + enable = null; + disable = null; } private static PluginDescription describe() { @@ -25,9 +29,10 @@ public final class Plugin extends net.md_5.bungee.api.plugin.Plugin { return description; } - public Plugin(ProxyServer proxy) { + public Plugin(ProxyServer proxy, ExceptionRunnable enable, Runnable disable) { super(proxy, describe()); - this.invalid = false; + this.enable = enable; + this.disable = disable; // 2020 BungeeCord builds don't run init(), but future builds may uncomment that line. We wouldn't want to repeat ourselves. if (getDescription() == null) Util.isException(() -> Util.reflect(net.md_5.bungee.api.plugin.Plugin.class.getDeclaredMethod("init", ProxyServer.class, PluginDescription.class), this, proxy, description)); @@ -35,6 +40,17 @@ public final class Plugin extends net.md_5.bungee.api.plugin.Plugin { @Override public void onEnable() { - if (invalid) throw new IllegalStateException("SubServers.Bungee does not run as a plugin, but a wrapper. For more information on how to install, please visit this page: https://github.com/ME1312/SubServers-2/wiki/Install"); + if (enable == null) { + throw new IllegalStateException("SubServers.Bungee does not run as a plugin, but a wrapper. For more information on how to install, please visit this page: https://github.com/ME1312/SubServers-2/wiki/Install"); + } else try { + enable.run(); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + @Override + public void onDisable() { + if (disable != null) disable.run(); } } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java index d307ed43..56fec706 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java @@ -28,9 +28,7 @@ import java.util.*; * SubAPI Class */ public final class SubAPI implements BungeeAPI { - LinkedList enableListeners = new LinkedList(); LinkedList reloadListeners = new LinkedList(); - LinkedList disableListeners = new LinkedList(); private static HashMap knownSignatures = new HashMap(); boolean ready = false; private final SubProxy plugin; @@ -63,25 +61,11 @@ public final class SubAPI implements BungeeAPI { } /** - * Adds a SubAPI Listener + * Adds a SubAPI Reload Listener * - * @param enable An Event that will be called when SubAPI is ready - * @param disable An Event that will be called before SubAPI is disabled (your plugin should reset it's values in case this is a hard-reset instead of a shutdown) - */ - public void addListener(Runnable enable, Runnable disable) { - if (enable != null) enableListeners.add(enable); - if (disable != null) disableListeners.add(disable); - } - - /** - * Adds a SubAPI Listener - * - * @param enable An Event that will be called when SubAPI is ready * @param reload An Event that will be called after SubAPI is soft-reloaded - * @param disable An Event that will be called before SubAPI is disabled (your plugin should reset it's values in case this is a hard-reset instead of a shutdown) */ - public void addListener(Runnable enable, Runnable reload, Runnable disable) { - addListener(enable, disable); + public void addListener(Runnable reload) { if (reload != null) reloadListeners.add(reload); } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java index 64b537fc..404a2522 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java @@ -121,52 +121,64 @@ public final class SubCommand extends CommandX { } catch (Exception e) {} }, "SubServers.Bungee::Update_Check").start(); } else if (args[0].equalsIgnoreCase("reload")) { - if (args.length > 1) { - switch (args[1].toLowerCase()) { - case "*": - case "all": - case "system": - case "bungee": - case "bungeecord": - case "subdata": - case "network": - plugin.getPluginManager().dispatchCommand(ConsoleCommandSender.getInstance(), "greload"); - break; - case "host": - case "hosts": - case "server": - case "servers": - case "subserver": - case "subservers": - case "config": - case "configs": - try { - plugin.reload(); - } catch (IOException e) { - e.printStackTrace(); - } - break; - case "creator": - case "creators": - case "subcreator": - case "subcreators": - case "template": - case "templates": - for (Host host : plugin.api.getHosts().values()) { - host.getCreator().reload(); - } - sender.sendMessage("SubServers > SubCreator instances reloaded"); - break; - default: - sender.sendMessage("SubServers > Unknown reload type: " + args[1]); + new Thread(() -> { + if (args.length > 1) { + switch (args[1].toLowerCase()) { + case "*": + case "all": + case "hard": + case "system": + case "subdata": + case "network": + plugin.stopListeners(); + plugin.getLogger().info("Closing player connections"); + for (ProxiedPlayer player : plugin.getPlayers()) { + Util.isException(() -> player.disconnect(plugin.getTranslation("restart"))); + } + plugin.shutdown(); + case "soft": + case "bungee": + case "bungeecord": + case "plugin": + case "plugins": + plugin.getPluginManager().dispatchCommand(sender, "greload"); + break; + case "host": + case "hosts": + case "server": + case "servers": + case "subserver": + case "subservers": + case "config": + case "configs": + try { + plugin.reload(); + } catch (IOException e) { + e.printStackTrace(); + } + break; + case "creator": + case "creators": + case "subcreator": + case "subcreators": + case "template": + case "templates": + for (Host host : plugin.api.getHosts().values()) { + host.getCreator().reload(); + } + sender.sendMessage("SubServers > SubCreator instances reloaded"); + break; + default: + sender.sendMessage("SubServers > Unknown reload type: " + args[1]); + } + } else { + try { + plugin.reload(); + } catch (IOException e) { + e.printStackTrace(); + } } - } else { - try { - plugin.reload(); - } catch (IOException e) { - e.printStackTrace(); - } - } + }, "SubServers.Bungee::Reload_Command_Handler").start(); } else if (args[0].equalsIgnoreCase("list")) { String div = ChatColor.RESET + ", "; int i = 0; @@ -830,7 +842,7 @@ public final class SubCommand extends CommandX { " Help: /sub help", " List: /sub list", " Version: /sub version", - " Reload: /sub reload [all|config|templates]", + " Reload: /sub reload [hard|bungee|servers|templates]", " Info: /sub info [proxy|host|group|server|player] ", " Start Server: /sub start ", " Restart Server: /sub restart ", @@ -987,12 +999,12 @@ public final class SubCommand extends CommandX { } else if (!(sender instanceof ProxiedPlayer) && (args[0].equals("reload") || args[0].equals("restore"))) { if (args[0].equals("reload")) { List list = new ArrayList(), - completes = Arrays.asList("all", "config", "templates"); + completes = Arrays.asList("hard", "bungee", "servers", "templates"); if (args.length == 2) { for (String complete : completes) { if (complete.toLowerCase().startsWith(last)) list.add(Last + complete.substring(last.length())); } - return new ContainedPair<>((list.size() <= 0)?plugin.api.getLang("SubServers", "Command.Generic.Unknown").replace("$str$", args[0]):null, list); + return new ContainedPair<>(null, list); } else { return new ContainedPair<>(null, Collections.emptyList()); } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java index 72977add..3354852c 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java @@ -11,7 +11,6 @@ import net.ME1312.SubData.Server.ClientHandler; import net.ME1312.SubData.Server.Encryption.AES; import net.ME1312.SubData.Server.Encryption.DHE; import net.ME1312.SubData.Server.Encryption.RSA; -import net.ME1312.SubData.Server.Library.DataSize; import net.ME1312.SubData.Server.SubDataClient; import net.ME1312.SubData.Server.SubDataServer; import net.ME1312.SubServers.Bungee.Event.SubRemoveProxyEvent; @@ -47,6 +46,7 @@ import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.event.*; import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.api.plugin.PluginManager; import net.md_5.bungee.connection.InitialHandler; import net.md_5.bungee.event.EventHandler; @@ -62,6 +62,7 @@ import java.security.SecureRandom; import java.text.DecimalFormat; import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.logging.Handler; /** * Main Plugin Class @@ -241,8 +242,9 @@ public final class SubProxy extends BungeeCommon implements Listener { api.addHostDriver(net.ME1312.SubServers.Bungee.Host.Internal.InternalHost.class, "virtual"); api.addHostDriver(net.ME1312.SubServers.Bungee.Host.External.ExternalHost.class, "network"); - plugin = Util.getDespiteException(() -> new Plugin(this), null); + plugin = Util.getDespiteException(() -> new Plugin(this, this::reload, this::shutdown), null); if (plugin == null) Logger.get("SubServers").warning("Could not initialize plugin object emulation"); + else Util.isException(() -> Util.>reflect(PluginManager.class.getDeclaredField("plugins"), getPluginManager()).put(null, plugin)); getPluginManager().registerListener(plugin, this); @@ -292,21 +294,21 @@ public final class SubProxy extends BungeeCommon implements Listener { @SuppressWarnings("unchecked") public void startListeners() { try { - reload(); + if (posted || !api.ready) reload(); if (UPnP.isUPnPAvailable()) { if (config.get().getMap("Settings").getMap("UPnP", new ObjectMap()).getBoolean("Forward-Proxy", true)) for (ListenerInfo listener : getConfig().getListeners()) { UPnP.openPortTCP(listener.getHost().getPort()); } } else { - getLogger().warning("UPnP is currently unavailable. Ports may not be automatically forwarded on this device."); + getLogger().warning("UPnP service is unavailable. SubServers can't port-forward for you from this device."); } super.startListeners(); if (!posted) { - post(); posted = true; + post(); } } catch (IOException e) { e.printStackTrace(); @@ -429,16 +431,7 @@ public final class SubProxy extends BungeeCommon implements Listener { int subservers = 0; Logger.get("SubServers").info(((status)?"Rel":"L")+"oading SubServers..."); - if (!posted) Runtime.getRuntime().addShutdownHook(new Thread(() -> { - if (running) { - Logger.get("SubServers").info("Received request from system to shutdown"); - try { - shutdown(); - } catch (Exception e) { - e.printStackTrace(); - } - } - }, "SubServers.Bungee::System_Shutdown")); + if (!posted) Runtime.getRuntime().addShutdownHook(new Thread(this::shutdown, "SubServers.Bungee::System_Shutdown")); running = true; List autorun = new LinkedList(); for (String name : this.servers.get().getMap("Servers").getKeys()) { @@ -605,20 +598,20 @@ public final class SubProxy extends BungeeCommon implements Listener { } int plugins = 0; - List listeners = (status)?api.reloadListeners:api.enableListeners; - if (listeners.size() > 0) { - Logger.get("SubServers").info(((status)?"Rel":"L")+"oading SubAPI Plugins..."); - for (Runnable obj : listeners) { - try { - obj.run(); - plugins++; - } catch (Throwable e) { - new InvocationTargetException(e, "Problem " + ((status)?"reloading":"enabling") + " plugin").printStackTrace(); + if (status) { + List listeners = api.reloadListeners; + if (listeners.size() > 0) { + Logger.get("SubServers").info(((status)?"Rel":"L")+"oading SubAPI Plugins..."); + for (Runnable obj : listeners) { + try { + obj.run(); + plugins++; + } catch (Throwable e) { + new InvocationTargetException(e, "Problem " + ((status)?"reloading":"enabling") + " plugin").printStackTrace(); + } } } - } - if (status) { for (Host host : api.getHosts().values()) if (host instanceof ClientHandler && ((ClientHandler) host).getSubData()[0] != null) ((SubDataClient) ((ClientHandler) host).getSubData()[0]).sendPacket(new PacketOutExReload(null)); for (Server server : api.getServers().values()) if (server.getSubData()[0] != null) ((SubDataClient) server.getSubData()[0]).sendPacket(new PacketOutExReload(null)); } @@ -733,23 +726,6 @@ public final class SubProxy extends BungeeCommon implements Listener { } } }, TimeUnit.SECONDS.toMillis(rpec_s), TimeUnit.SECONDS.toMillis(rpec_i)); - new Timer("SubServers.Bungee::Garbo_Collector").schedule(new TimerTask() { - @Override - public void run() { - long start = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); - System.gc(); - Timer timer = new Timer("SubServers.Bungee::Garbo_Collector_Result"); - timer.schedule(new TimerTask() { - @Override - public void run() { - long end = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); - Logger.get("SGC").info("Cleared " + (start - end) + " bytes of extremely useless memory data. Now using " + end + " bytes."); - if (subdata != null) Logger.get("SDD").info(subdata.getClients().size() + " SubData channels are open."); - timer.cancel(); - } - }, TimeUnit.MINUTES.toMillis(1)); - } - }, TimeUnit.HOURS.toMillis(1), TimeUnit.HOURS.toMillis(1)); } /** @@ -759,57 +735,49 @@ public final class SubProxy extends BungeeCommon implements Listener { */ @Override public void stopListeners() { - try { + if (running) { legServers.clear(); legServers.putAll(getServersCopy()); - if (api.disableListeners.size() > 0) { - Logger.get("SubServers").info("Resetting SubAPI Plugins..."); - for (Runnable listener : api.disableListeners) { - try { - listener.run(); - } catch (Throwable e) { - new InvocationTargetException(e, "Problem disabling plugin").printStackTrace(); - } + + ListenerInfo[] listeners = getConfig().getListeners().toArray(new ListenerInfo[0]); + super.stopListeners(); + + if (UPnP.isUPnPAvailable()) { + for (ListenerInfo listener : listeners) { + if (UPnP.isMappedTCP(listener.getHost().getPort())) UPnP.closePortTCP(listener.getHost().getPort()); } } + } + } protected void shutdown() { + if (running) { + api.ready = false; + Logger.get("SubServers").info("Stopping hosted servers"); + String[] hosts = this.hosts.keySet().toArray(new String[0]); - shutdown(); - - subdata.close(); - - for (ListenerInfo listener : getConfig().getListeners()) { - if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(listener.getHost().getPort())) UPnP.closePortTCP(listener.getHost().getPort()); + for (String host : hosts) { + api.forceRemoveHost(host); } - } catch (Exception e) { - e.printStackTrace(); + + Logger.get("SubServers").info("Removing dynamic data"); + running = false; + exServers.clear(); + this.hosts.clear(); + + String[] proxies = this.proxies.keySet().toArray(new String[0]); + for (String proxy : proxies) { + getPluginManager().callEvent(new SubRemoveProxyEvent(this.proxies.get(proxy))); + } + this.proxies.clear(); + + rPlayerLinkS.clear(); + rPlayerLinkP.clear(); + rPlayers.clear(); + + try { + subdata.close(); + Thread.sleep(500); + } catch (InterruptedException | IOException e) {} } - - super.stopListeners(); - } private void shutdown() throws Exception { - api.ready = false; - Logger.get("SubServers").info("Resetting Hosts and Server Data"); - List hosts = new ArrayList(); - hosts.addAll(this.hosts.keySet()); - - for (String host : hosts) { - api.forceRemoveHost(host); - } - running = false; - this.hosts.clear(); - exServers.clear(); - - for (String proxy : proxies.keySet()) { - getPluginManager().callEvent(new SubRemoveProxyEvent(proxies.get(proxy))); - } - proxies.clear(); - - for (ListenerInfo listener : getConfig().getListeners()) { - if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(listener.getHost().getPort())) UPnP.closePortTCP(listener.getHost().getPort()); - } - - rPlayerLinkS.clear(); - rPlayerLinkP.clear(); - rPlayers.clear(); } String getNewSignature() { diff --git a/SubServers.Client/Bukkit/pom.xml b/SubServers.Client/Bukkit/pom.xml index c793af75..eee22049 100644 --- a/SubServers.Client/Bukkit/pom.xml +++ b/SubServers.Client/Bukkit/pom.xml @@ -48,7 +48,7 @@ net.ME1312.Galaxi GalaxiUtil - 21w04a + 21w06a compile true diff --git a/SubServers.Client/Common/pom.xml b/SubServers.Client/Common/pom.xml index 492e0adf..a3bd1be9 100644 --- a/SubServers.Client/Common/pom.xml +++ b/SubServers.Client/Common/pom.xml @@ -20,7 +20,7 @@ net.ME1312.Galaxi GalaxiUtil - 21w04a + 21w06a provided diff --git a/SubServers.Client/Sponge/pom.xml b/SubServers.Client/Sponge/pom.xml index cc368d10..67c9d8f5 100644 --- a/SubServers.Client/Sponge/pom.xml +++ b/SubServers.Client/Sponge/pom.xml @@ -30,7 +30,7 @@ net.ME1312.Galaxi GalaxiUtil - 21w04a + 21w06a compile true diff --git a/SubServers.Console/src/net/ME1312/SubServers/Console/ConsolePlugin.java b/SubServers.Console/src/net/ME1312/SubServers/Console/ConsolePlugin.java index 2ebdc799..3ecc41e3 100644 --- a/SubServers.Console/src/net/ME1312/SubServers/Console/ConsolePlugin.java +++ b/SubServers.Console/src/net/ME1312/SubServers/Console/ConsolePlugin.java @@ -45,12 +45,12 @@ public final class ConsolePlugin extends Plugin implements Listener { e.printStackTrace(); } - SubAPI.getInstance().addListener(null, new Runnable() { + SubAPI.getInstance().addListener(new Runnable() { @Override public void run() { reload(); } - }, null); + }); } private void reload() { diff --git a/SubServers.Host/pom.xml b/SubServers.Host/pom.xml index 7205418b..8acfeec0 100644 --- a/SubServers.Host/pom.xml +++ b/SubServers.Host/pom.xml @@ -20,7 +20,7 @@ net.ME1312.Galaxi GalaxiEngine - 21w04a + 21w06a compile true diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java b/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java index 75963ec4..d3b2b94a 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java @@ -224,14 +224,18 @@ public final class ExHost { updcount++; } } - if (updcount > 0) log.info.println("SubServers.Host v" + updversion + " is available. You are " + updcount + " version" + ((updcount == 1)?"":"s") + " behind."); + if (updcount > 0) { + log.info.println("SubServers.Host v" + updversion + " is available. You are " + updcount + " version" + ((updcount == 1)?"":"s") + " behind."); + return true; + } } catch (Exception e) {} + return false; }); engine.start(this::stop); if (!UPnP.isUPnPAvailable()) { - log.warn.println("UPnP is currently unavailable. Ports may not be automatically forwarded on this device."); + log.warn.println("UPnP service is unavailable. SubServers can't port-forward for you from this device."); } } catch (Exception e) { if (engine == null) { @@ -289,19 +293,19 @@ public final class ExHost { private void stop() { if (running) { - log.info.println("Shutting down..."); + log.info.println("Stopping hosted servers"); + String[] subservers = servers.keySet().toArray(new String[0]); - List subservers = new ArrayList(); - subservers.addAll(servers.keySet()); - - for (String server : subservers) { - servers.get(server).stop(); + for (String name : subservers) { + SubServerImpl server = servers.get(name); + server.stop(); try { - servers.get(server).waitFor(); + server.waitFor(); } catch (Exception e) { log.error.println(e); } - if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(servers.get(server).getPort())) UPnP.closePortTCP(servers.get(server).getPort()); + servers.remove(name); + if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(server.getPort())) UPnP.closePortTCP(server.getPort()); } servers.clear(); diff --git a/SubServers.Sync/pom.xml b/SubServers.Sync/pom.xml index 440fd335..c5492939 100644 --- a/SubServers.Sync/pom.xml +++ b/SubServers.Sync/pom.xml @@ -30,14 +30,14 @@ net.ME1312.Galaxi GalaxiUtil - 21w04a + 21w06a compile true net.ME1312.Galaxi GalaxiEngine - 21w04a + 21w06a provided diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java index 1f1f62f4..d64024e2 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java @@ -268,7 +268,7 @@ public final class ExProxy extends BungeeCommon implements Listener { new Timer("SubServers.Sync::RemotePlayer_Error_Checking").schedule(new TimerTask() { @Override public void run() { - if (api.getSubDataNetwork()[0] != null && !api.getSubDataNetwork()[0].isClosed()) { + if (api.getName() != null && api.getSubDataNetwork()[0] != null && !api.getSubDataNetwork()[0].isClosed()) { api.getProxy(api.getName(), proxy -> { synchronized (rPlayers) { ArrayList add = new ArrayList(); @@ -376,7 +376,7 @@ public final class ExProxy extends BungeeCommon implements Listener { @Override public void stopListeners() { try { - Logger.get("SubServers").info("Resetting Server Data"); + Logger.get("SubServers").info("Removing synced data"); servers.clear(); reconnect = false; @@ -389,8 +389,10 @@ public final class ExProxy extends BungeeCommon implements Listener { subdata.clear(); subdata.put(0, null); - for (ListenerInfo listener : getConfig().getListeners()) { - if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(listener.getHost().getPort())) UPnP.closePortTCP(listener.getHost().getPort()); + if (UPnP.isUPnPAvailable()) { + for (ListenerInfo listener : getConfig().getListeners()) { + if (UPnP.isMappedTCP(listener.getHost().getPort())) UPnP.closePortTCP(listener.getHost().getPort()); + } } rPlayerLinkS.clear(); diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubAPI.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubAPI.java index 0e64b31a..34c9ed22 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubAPI.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubAPI.java @@ -20,8 +20,6 @@ import java.util.*; * SubAPI Class */ public final class SubAPI extends ClientAPI implements BungeeAPI { - LinkedList enableListeners = new LinkedList(); - LinkedList disableListeners = new LinkedList(); private final ExProxy plugin; private static SubAPI api; String name; @@ -52,17 +50,6 @@ public final class SubAPI extends ClientAPI implements BungeeAPI { return plugin; } - /** - * Adds a SubAPI Listener - * - * @param enable An Event that will be called when SubAPI is ready - * @param disable An Event that will be called before SubAPI is disabled (your plugin should reset it's values in case this is a hard-reset instead of a shutdown) - */ - public void addListener(Runnable enable, Runnable disable) { - if (enable != null) enableListeners.add(enable); - if (disable != null) disableListeners.add(disable); - } - /** * Get the Proxy Name * diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java index c991ad3b..e4854a91 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java @@ -1463,39 +1463,43 @@ public final class SubCommand extends CommandX { @SuppressWarnings("deprecation") @Override public void execute(CommandSender sender, String[] args) { - if (sender instanceof ProxiedPlayer) { - if (args.length > 0) { - Map servers = plugin.servers; - if (servers.keySet().contains(args[0].toLowerCase())) { - ((ProxiedPlayer) sender).connect(servers.get(args[0].toLowerCase())); + if (plugin.lang == null) { + throw new IllegalStateException("There are no lang options available at this time"); + } else { + if (sender instanceof ProxiedPlayer) { + if (args.length > 0) { + Map servers = plugin.servers; + if (servers.keySet().contains(args[0].toLowerCase())) { + ((ProxiedPlayer) sender).connect(servers.get(args[0].toLowerCase())); + } else { + sender.sendMessage(plugin.api.getLang("SubServers", "Bungee.Server.Invalid")); + } } else { - sender.sendMessage(plugin.api.getLang("SubServers", "Bungee.Server.Invalid")); + int i = 0; + TextComponent serverm = new TextComponent(ChatColor.RESET.toString()); + TextComponent div = new TextComponent(plugin.api.getLang("SubServers", "Bungee.Server.Divider")); + for (ServerImpl server : plugin.servers.values()) { + if (!server.isHidden() && server.canAccess(sender) && (!(server instanceof SubServerImpl) || ((SubServerImpl) server).isRunning())) { + if (i != 0) serverm.addExtra(div); + TextComponent message = new TextComponent(plugin.api.getLang("SubServers", "Bungee.Server.List").replace("$str$", server.getDisplayName())); + try { + message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{new TextComponent(plugin.api.getLang("SubServers", "Bungee.Server.Hover").replace("$int$", Integer.toString(server.getRemotePlayers().size())))})); + } catch (Exception e) { + e.printStackTrace(); + } + message.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/server " + server.getName())); + serverm.addExtra(message); + i++; + } + } + sender.sendMessages( + plugin.api.getLang("SubServers", "Bungee.Server.Current").replace("$str$", ((ProxiedPlayer) sender).getServer().getInfo().getName()), + plugin.api.getLang("SubServers", "Bungee.Server.Available")); + sender.sendMessage(serverm); } } else { - int i = 0; - TextComponent serverm = new TextComponent(ChatColor.RESET.toString()); - TextComponent div = new TextComponent(plugin.api.getLang("SubServers", "Bungee.Server.Divider")); - for (ServerImpl server : plugin.servers.values()) { - if (!server.isHidden() && server.canAccess(sender) && (!(server instanceof SubServerImpl) || ((SubServerImpl) server).isRunning())) { - if (i != 0) serverm.addExtra(div); - TextComponent message = new TextComponent(plugin.api.getLang("SubServers", "Bungee.Server.List").replace("$str$", server.getDisplayName())); - try { - message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[]{new TextComponent(plugin.api.getLang("SubServers", "Bungee.Server.Hover").replace("$int$", Integer.toString(server.getRemotePlayers().size())))})); - } catch (Exception e) { - e.printStackTrace(); - } - message.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/server " + server.getName())); - serverm.addExtra(message); - i++; - } - } - sender.sendMessages( - plugin.api.getLang("SubServers", "Bungee.Server.Current").replace("$str$", ((ProxiedPlayer) sender).getServer().getInfo().getName()), - plugin.api.getLang("SubServers", "Bungee.Server.Available")); - sender.sendMessage(serverm); + sender.sendMessage(plugin.api.getLang("SubServers", "Command.Generic.Player-Only")); } - } else { - sender.sendMessage(plugin.api.getLang("SubServers", "Command.Generic.Player-Only")); } } @@ -1507,7 +1511,7 @@ public final class SubCommand extends CommandX { * @return The validator's response and list of possible arguments */ public Pair> suggestArguments(CommandSender sender, String[] args) { - if (args.length <= 1) { + if (plugin.lang != null && args.length <= 1) { String last = (args.length > 0)?args[args.length - 1].toLowerCase():""; List list = new ArrayList(); if (last.length() == 0) { @@ -1557,27 +1561,31 @@ public final class SubCommand extends CommandX { @SuppressWarnings("deprecation") @Override public void execute(CommandSender sender, String[] args) { - List messages = new LinkedList(); - int players = 0; - for (ServerImpl server : plugin.servers.values()) { - List playerlist = new ArrayList(); - for (CachedPlayer player : server.getRemotePlayers()) playerlist.add(player.getName()); - Collections.sort(playerlist); + if (plugin.lang == null) { + throw new IllegalStateException("There are no lang options available at this time"); + } else { + List messages = new LinkedList(); + int players = 0; + for (ServerImpl server : plugin.servers.values()) { + List playerlist = new ArrayList(); + for (CachedPlayer player : server.getRemotePlayers()) playerlist.add(player.getName()); + Collections.sort(playerlist); - players += playerlist.size(); - if (!server.isHidden() && (!(server instanceof SubServerImpl) || ((SubServerImpl) server).isRunning())) { - int i = 0; - String message = plugin.api.getLang("SubServers", "Bungee.List.Format").replace("$str$", server.getDisplayName()).replace("$int$", Integer.toString(playerlist.size())); - for (String player : playerlist) { - if (i != 0) message += plugin.api.getLang("SubServers", "Bungee.List.Divider"); - message += plugin.api.getLang("SubServers", "Bungee.List.List").replace("$str$", player); - i++; + players += playerlist.size(); + if (!server.isHidden() && (!(server instanceof SubServerImpl) || ((SubServerImpl) server).isRunning())) { + int i = 0; + String message = plugin.api.getLang("SubServers", "Bungee.List.Format").replace("$str$", server.getDisplayName()).replace("$int$", Integer.toString(playerlist.size())); + for (String player : playerlist) { + if (i != 0) message += plugin.api.getLang("SubServers", "Bungee.List.Divider"); + message += plugin.api.getLang("SubServers", "Bungee.List.List").replace("$str$", player); + i++; + } + messages.add(message); } - messages.add(message); } + sender.sendMessages(messages.toArray(new String[messages.size()])); + sender.sendMessage(plugin.api.getLang("SubServers", "Bungee.List.Total").replace("$int$", Integer.toString(players))); } - sender.sendMessages(messages.toArray(new String[messages.size()])); - sender.sendMessage(plugin.api.getLang("SubServers", "Bungee.List.Total").replace("$int$", Integer.toString(players))); } } } \ No newline at end of file