From 4e664618485552a0660f9f625fe33df1f70a353c Mon Sep 17 00:00:00 2001 From: ME1312 Date: Sun, 7 Feb 2021 01:19:55 -0500 Subject: [PATCH] Move autorun queue to a more appropriate location This restores plugins' ability to listen for server start events --- .../net/ME1312/SubServers/Bungee/SubAPI.java | 1 - .../ME1312/SubServers/Bungee/SubCommand.java | 7 +- .../ME1312/SubServers/Bungee/SubProxy.java | 140 +++++++++--------- 3 files changed, 71 insertions(+), 77 deletions(-) diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java index 56fec706..986d3645 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java @@ -30,7 +30,6 @@ import java.util.*; public final class SubAPI implements BungeeAPI { LinkedList reloadListeners = new LinkedList(); private static HashMap knownSignatures = new HashMap(); - boolean ready = false; private final SubProxy plugin; private static SubAPI api; diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java index 404a2522..e2aeaa48 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java @@ -45,6 +45,7 @@ import static net.ME1312.SubServers.Bungee.Library.Compatibility.Galaxi.GalaxiCo @SuppressWarnings("deprecation") public final class SubCommand extends CommandX { static HashMap>> players = new HashMap>>(); + private static Thread reload; private SubProxy plugin; private String label; @@ -121,7 +122,7 @@ public final class SubCommand extends CommandX { } catch (Exception e) {} }, "SubServers.Bungee::Update_Check").start(); } else if (args[0].equalsIgnoreCase("reload")) { - new Thread(() -> { + if (reload == null || !reload.isAlive()) (reload = new Thread(() -> { if (args.length > 1) { switch (args[1].toLowerCase()) { case "*": @@ -141,7 +142,7 @@ public final class SubCommand extends CommandX { case "bungeecord": case "plugin": case "plugins": - plugin.getPluginManager().dispatchCommand(sender, "greload"); + plugin.getPluginManager().dispatchCommand(ConsoleCommandSender.getInstance(), "greload"); break; case "host": case "hosts": @@ -178,7 +179,7 @@ public final class SubCommand extends CommandX { e.printStackTrace(); } } - }, "SubServers.Bungee::Reload_Command_Handler").start(); + }, "SubServers.Bungee::Reload_Command_Handler")).start(); } else if (args[0].equalsIgnoreCase("list")) { String div = ChatColor.RESET + ", "; int i = 0; diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java index 3354852c..07f13af1 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java @@ -100,6 +100,7 @@ public final class SubProxy extends BungeeCommon implements Listener { private boolean running = false; private boolean reloading = false; private boolean posted = false; + private LinkedList autorun = null; private static BigInteger lastSignature = BigInteger.valueOf(-1); @SuppressWarnings("unchecked") @@ -287,40 +288,11 @@ public final class SubProxy extends BungeeCommon implements Listener { if (isGalaxi) Util.reflect(GalaxiEventListener.class.getConstructor(SubProxy.class), this); } - /** - * Load SubServers before BungeeCord finishes - */ - @Override - @SuppressWarnings("unchecked") - public void startListeners() { - try { - 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 service is unavailable. SubServers can't port-forward for you from this device."); - } - - super.startListeners(); - - if (!posted) { - posted = true; - post(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - /** * Load data from the config (will attempt to merge with current configuration) * * @throws IOException */ - @SuppressWarnings("unchecked") public void reload() throws IOException { List ukeys = new ArrayList(); long begin = Calendar.getInstance().getTime().getTime(); @@ -431,9 +403,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(this::shutdown, "SubServers.Bungee::System_Shutdown")); - running = true; - List autorun = new LinkedList(); + autorun = new LinkedList(); for (String name : this.servers.get().getMap("Servers").getKeys()) { if (!ukeys.contains(name.toLowerCase())) try { if (!this.hosts.keySet().contains(this.servers.get().getMap("Servers").getMap(name).getString("Host").toLowerCase())) throw new InvalidServerException("There is no host with this name: " + this.servers.get().getMap("Servers").getMap(name).getString("Host")); @@ -534,7 +504,9 @@ public final class SubProxy extends BungeeCommon implements Listener { } } ukeys.clear(); - api.ready = true; + + if (!posted) Runtime.getRuntime().addShutdownHook(new Thread(this::shutdown, "SubServers.Bungee::System_Shutdown")); + running = true; legServers.clear(); // Initialize SubData @@ -601,7 +573,7 @@ public final class SubProxy extends BungeeCommon implements Listener { if (status) { List listeners = api.reloadListeners; if (listeners.size() > 0) { - Logger.get("SubServers").info(((status)?"Rel":"L")+"oading SubAPI Plugins..."); + Logger.get("SubServers").info("Reloading SubAPI Plugins..."); for (Runnable obj : listeners) { try { obj.run(); @@ -618,36 +590,64 @@ public final class SubProxy extends BungeeCommon implements Listener { reloading = false; Logger.get("SubServers").info(((plugins > 0)?plugins+" Plugin"+((plugins == 1)?"":"s")+", ":"") + hosts + " Host"+((hosts == 1)?"":"s")+", " + servers + " Server"+((servers == 1)?"":"s")+", and " + subservers + " SubServer"+((subservers == 1)?"":"s")+" "+((status)?"re":"")+"loaded in " + new DecimalFormat("0.000").format((Calendar.getInstance().getTime().getTime() - begin) / 1000D) + "s"); + } - long scd = TimeUnit.SECONDS.toMillis(this.servers.get().getMap("Settings").getLong("Run-On-Launch-Timeout", 0L)); - if (autorun.size() > 0) for (Host host : api.getHosts().values()) { - List ar = new LinkedList(); - for (String name : autorun) if (host.getSubServer(name) != null) ar.add(name); - if (ar.size() > 0) new Thread(() -> { - try { - while (running && begin == resetDate && !host.isAvailable()) { - Thread.sleep(250); - } - long init = Calendar.getInstance().getTime().getTime(); - while (running && begin == resetDate && ar.size() > 0) { - SubServer server = host.getSubServer(ar.get(0)); - ar.remove(0); - if (server != null && !server.isRunning()) { - server.start(); - if (ar.size() > 0 && scd > 0) { - long sleep = Calendar.getInstance().getTime().getTime(); - while (running && begin == resetDate && server.getSubData()[0] == null && Calendar.getInstance().getTime().getTime() - sleep < scd) { - Thread.sleep(250); + @Override + public void startListeners() { + try { + if (posted || !running) 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 service is unavailable. SubServers can't port-forward for you from this device."); + } + + super.startListeners(); + + if (autorun != null && autorun.size() > 0) { + final long begin = resetDate; + final long scd = TimeUnit.SECONDS.toMillis(this.servers.get().getMap("Settings").getLong("Run-On-Launch-Timeout", 0L)); + for (Host host : api.getHosts().values()) { + List ar = new LinkedList(); + for (String name : autorun) if (host.getSubServer(name) != null) ar.add(name); + if (ar.size() > 0) new Thread(() -> { + try { + while (running && begin == resetDate && !host.isAvailable()) { + Thread.sleep(250); + } + long init = Calendar.getInstance().getTime().getTime(); + while (running && begin == resetDate && ar.size() > 0) { + SubServer server = host.getSubServer(ar.get(0)); + ar.remove(0); + if (server != null && !server.isRunning()) { + server.start(); + if (ar.size() > 0 && scd > 0) { + long sleep = Calendar.getInstance().getTime().getTime(); + while (running && begin == resetDate && server.getSubData()[0] == null && Calendar.getInstance().getTime().getTime() - sleep < scd) { + Thread.sleep(250); + } + } } } + if (running && begin == resetDate && Calendar.getInstance().getTime().getTime() - init >= 5000) + Logger.get("SubServers").info("The auto-start queue for " + host.getName() + " has been finished"); + } catch (Exception e) { + e.printStackTrace(); } - } - if (running && begin == resetDate && Calendar.getInstance().getTime().getTime() - init >= 5000) - Logger.get("SubServers").info("The auto-start queue for " + host.getName() + " has been finished"); - } catch (Exception e) { - e.printStackTrace(); + }, "SubServers.Bungee::Automatic_Server_Starter(" + host.getName() + ")").start(); } - }, "SubServers.Bungee::Automatic_Server_Starter(" + host.getName() + ")").start(); + } + autorun = null; + + if (!posted) { + posted = true; + post(); + } + } catch (IOException e) { + e.printStackTrace(); } } @@ -728,17 +728,9 @@ public final class SubProxy extends BungeeCommon implements Listener { }, TimeUnit.SECONDS.toMillis(rpec_s), TimeUnit.SECONDS.toMillis(rpec_i)); } - /** - * Reset all changes made by startListeners - * - * @see SubProxy#startListeners() - */ @Override public void stopListeners() { if (running) { - legServers.clear(); - legServers.putAll(getServersCopy()); - ListenerInfo[] listeners = getConfig().getListeners().toArray(new ListenerInfo[0]); super.stopListeners(); @@ -748,18 +740,21 @@ public final class SubProxy extends BungeeCommon implements Listener { } } } - } protected void shutdown() { + } + + protected void shutdown() { if (running) { - api.ready = false; + legServers.clear(); + legServers.putAll(getServersCopy()); + running = false; + Logger.get("SubServers").info("Stopping hosted servers"); String[] hosts = this.hosts.keySet().toArray(new String[0]); - for (String host : hosts) { api.forceRemoveHost(host); } Logger.get("SubServers").info("Removing dynamic data"); - running = false; exServers.clear(); this.hosts.clear(); @@ -768,7 +763,6 @@ public final class SubProxy extends BungeeCommon implements Listener { getPluginManager().callEvent(new SubRemoveProxyEvent(this.proxies.get(proxy))); } this.proxies.clear(); - rPlayerLinkS.clear(); rPlayerLinkP.clear(); rPlayers.clear(); @@ -833,7 +827,7 @@ public final class SubProxy extends BungeeCommon implements Listener { @Override public Map getServersCopy() { HashMap servers = new HashMap(); - if (!api.ready) { + if (!running) { servers.putAll(super.getServers()); servers.putAll(legServers); } else {