diff --git a/Artifacts/SubServers.Bungee.jar b/Artifacts/SubServers.Bungee.jar index 917ea3ed..c66d4829 100644 Binary files a/Artifacts/SubServers.Bungee.jar and b/Artifacts/SubServers.Bungee.jar differ diff --git a/Artifacts/SubServers.Client.Bukkit.jar b/Artifacts/SubServers.Client.Bukkit.jar index 68bdc1d8..c2f65bcb 100644 Binary files a/Artifacts/SubServers.Client.Bukkit.jar and b/Artifacts/SubServers.Client.Bukkit.jar differ diff --git a/Artifacts/SubServers.Host.jar b/Artifacts/SubServers.Host.jar index ccd5fa41..5d663c4b 100644 Binary files a/Artifacts/SubServers.Host.jar and b/Artifacts/SubServers.Host.jar differ diff --git a/Artifacts/SubServers.Sync.jar b/Artifacts/SubServers.Sync.jar index 4d2448df..a4162667 100644 Binary files a/Artifacts/SubServers.Sync.jar and b/Artifacts/SubServers.Sync.jar differ diff --git a/Javadoc/SubServers.Bungee.jar b/Javadoc/SubServers.Bungee.jar index 5a5b4a45..d5d18730 100644 Binary files a/Javadoc/SubServers.Bungee.jar and b/Javadoc/SubServers.Bungee.jar differ diff --git a/Javadoc/SubServers.Bungee/index-all.html b/Javadoc/SubServers.Bungee/index-all.html index 36a8cb96..0972e3f1 100644 --- a/Javadoc/SubServers.Bungee/index-all.html +++ b/Javadoc/SubServers.Bungee/index-all.html @@ -970,7 +970,7 @@
getGroup(String) - Method in class net.ME1312.SubServers.Bungee.SubAPI
-
Gets a Server Group
+
Gets a Server Group (Group names are case insensitive here)
getGroups() - Method in interface net.ME1312.SubServers.Bungee.Host.Server
@@ -980,7 +980,7 @@
 
getGroups() - Method in class net.ME1312.SubServers.Bungee.SubAPI
-
Gets the Server Groups
+
Gets the Server Groups (Group names are case sensitive here)
getHandler() - Method in class net.ME1312.SubServers.Bungee.Host.External.ExternalSubLogger
 
@@ -1154,6 +1154,10 @@
Get a Long List by Handle
+
getLowercaseGroups() - Method in class net.ME1312.SubServers.Bungee.SubAPI
+
+
Gets the Server Groups (Group names are all lowercase here)
+
getMessage() - Method in class net.ME1312.SubServers.Bungee.Host.SubLogger.LogMessage
Get the message
@@ -1592,8 +1596,6 @@
Gets the SubServers Version
-
groups - Variable in class net.ME1312.SubServers.Bungee.SubPlugin
-
 
diff --git a/Javadoc/SubServers.Bungee/net/ME1312/SubServers/Bungee/SubAPI.html b/Javadoc/SubServers.Bungee/net/ME1312/SubServers/Bungee/SubAPI.html index 2acaa22c..007fa9d3 100644 --- a/Javadoc/SubServers.Bungee/net/ME1312/SubServers/Bungee/SubAPI.html +++ b/Javadoc/SubServers.Bungee/net/ME1312/SubServers/Bungee/SubAPI.html @@ -17,7 +17,7 @@ catch(err) { } //--> -var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":9,"i18":42,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10}; +var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":9,"i18":42,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10}; var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -229,13 +229,13 @@ extends java.lang.Object java.util.List<Server> getGroup(java.lang.String name) -
Gets a Server Group
+
Gets a Server Group (Group names are case insensitive here)
java.util.Map<java.lang.String,java.util.List<Server>> getGroups() -
Gets the Server Groups
+
Gets the Server Groups (Group names are case sensitive here)
@@ -283,80 +283,86 @@ extends java.lang.Object +java.util.Map<java.lang.String,java.util.List<Server>> +getLowercaseGroups() +
Gets the Server Groups (Group names are all lowercase here)
+ + + Version getProxyVersion()
Gets the BungeeCord Version
- + UniversalFile getRuntimeDirectory()
Gets the Runtime Directory
- + Server getServer(java.lang.String name)
Gets a Server
- + java.util.Map<java.lang.String,Server> getServers()
Gets the Servers (including SubServers)
- + SubDataServer getSubDataNetwork()
Gets the SubData Network Manager
- + SubServer getSubServer(java.lang.String name)
Gets a SubServer
- + java.util.Map<java.lang.String,SubServer> getSubServers()
Gets the SubServers
- + Version getWrapperVersion()
Gets the SubServers Version
- + boolean removeHost(java.lang.String name)
Remove a Host from the Network
- + boolean removeHost(java.util.UUID player, java.lang.String name)
Remove a Host from the Network
- + boolean removeServer(java.lang.String name)
Remove a Server from the Network
- + boolean removeServer(java.util.UUID player, java.lang.String name)
Remove a Server from the Network
- + void setLang(java.lang.String key, java.lang.String value) @@ -652,7 +658,21 @@ public 

getGroups

public java.util.Map<java.lang.String,java.util.List<Server>> getGroups()
-
Gets the Server Groups
+
Gets the Server Groups (Group names are case sensitive here)
+
+
Returns:
+
Group Map
+
+ + + + + + - - - - diff --git a/Javadoc/SubServers.Client.Bukkit.jar b/Javadoc/SubServers.Client.Bukkit.jar index 58b450b2..a2fd47b6 100644 Binary files a/Javadoc/SubServers.Client.Bukkit.jar and b/Javadoc/SubServers.Client.Bukkit.jar differ diff --git a/Javadoc/SubServers.Host.jar b/Javadoc/SubServers.Host.jar index eb0ff23f..7e263251 100644 Binary files a/Javadoc/SubServers.Host.jar and b/Javadoc/SubServers.Host.jar differ diff --git a/Javadoc/SubServers.Sync.jar b/Javadoc/SubServers.Sync.jar index be1af422..81548c32 100644 Binary files a/Javadoc/SubServers.Sync.jar and b/Javadoc/SubServers.Sync.jar differ diff --git a/SubServers.Bungee/src.jar b/SubServers.Bungee/src.jar index 6a89ed93..239e84c1 100644 Binary files a/SubServers.Bungee/src.jar and b/SubServers.Bungee/src.jar differ 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 b5059462..a0bebdb4 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 @@ -122,7 +122,7 @@ public class InternalHost extends Host { getSubServer(name).stop(); getSubServer(name).waitFor(); } - for (String group : getSubServer(name).getGroups()) getSubServer(name).removeGroup(group); + servers.remove(name.toLowerCase()); return true; } else return false; @@ -136,7 +136,6 @@ public class InternalHost extends Host { if (getSubServer(name).isRunning()) { getSubServer(name).terminate(); } - for (String group : getSubServer(name).getGroups()) getSubServer(name).removeGroup(group); servers.remove(name.toLowerCase()); return true; } 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 bdcbde96..f8aae521 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/ServerContainer.java @@ -80,9 +80,6 @@ public class ServerContainer extends BungeeServerInfo implements Server { public void addGroup(String value) { if (Util.isNull(value)) throw new NullPointerException(); if (value.length() > 0 && !groups.contains(value)) { - List list = (SubAPI.getInstance().getInternals().groups.keySet().contains(value))?SubAPI.getInstance().getInternals().groups.get(value):new ArrayList(); - list.add(this); - SubAPI.getInstance().getInternals().groups.put(value, list); groups.add(value); Collections.sort(groups); } @@ -92,9 +89,6 @@ public class ServerContainer extends BungeeServerInfo implements Server { @SuppressWarnings("deprecation") public void removeGroup(String value) { if (Util.isNull(value)) throw new NullPointerException(); - List list = SubAPI.getInstance().getInternals().groups.get(value); - list.remove(this); - SubAPI.getInstance().getInternals().groups.put(value, list); groups.remove(value); Collections.sort(groups); } diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java index 71f54431..cf24fbc9 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java @@ -25,9 +25,11 @@ import java.util.*; */ public final class SubAPI { LinkedList> listeners = new LinkedList>(); + boolean ready = false; private SubPlugin plugin; private static SubAPI api; + protected SubAPI(SubPlugin plugin) { this.plugin = plugin; api = this; @@ -215,22 +217,58 @@ public final class SubAPI { } /** - * Gets the Server Groups + * Gets the Server Groups (Group names are case sensitive here) * * @return Group Map */ public Map> getGroups() { - return new TreeMap>(plugin.groups); + TreeMap> groups = new TreeMap>(); + HashMap conflitresolver = new HashMap(); + for (Server server : getServers().values()) { + for (String name : server.getGroups()) { + String group = name; + if (conflitresolver.keySet().contains(name.toLowerCase())) { + group = conflitresolver.get(name.toLowerCase()); + } else { + conflitresolver.put(name.toLowerCase(), name); + } + List list = (groups.keySet().contains(group))?groups.get(group):new ArrayList(); + list.add(server); + groups.put(group, list); + } + } + return groups; } /** - * Gets a Server Group + * Gets the Server Groups (Group names are all lowercase here) + * + * @return Group Map + */ + public Map> getLowercaseGroups() { + Map> groups = getGroups(); + TreeMap> lowercaseGroups = new TreeMap>(); + for (String key : groups.keySet()) { + lowercaseGroups.put(key.toLowerCase(), groups.get(key)); + } + return lowercaseGroups; + } + + /** + * Gets a Server Group (Group names are case insensitive here) * * @param name Group name * @return a Server Group */ public List getGroup(String name) { - return getGroups().get(name); + Map> groups = getGroups(); + HashMap insensitivity = new HashMap(); + for (String group : groups.keySet()) insensitivity.put(group.toLowerCase(), group); + if (insensitivity.keySet().contains(name.toLowerCase())) { + return groups.get(insensitivity.get(name.toLowerCase())); + } else { + return null; + } } /** diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java index 1f772796..9fbcda37 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java @@ -39,7 +39,6 @@ import java.util.concurrent.TimeUnit; public final class SubPlugin extends BungeeCord implements Listener { protected final HashMap> hostDrivers = new HashMap>(); public final HashMap hosts = new HashMap(); - public final HashMap> groups = new HashMap>(); public final HashMap exServers = new HashMap(); private final HashMap legServers = new HashMap(); @@ -244,6 +243,17 @@ public final class SubPlugin extends BungeeCord implements Listener { int subservers = 0; System.out.println("SubServers > Loading SubServers..."); + if (!posted) Runtime.getRuntime().addShutdownHook(new Thread(() -> { + if (!running) { + System.out.println("SubServers > Received request from system to shutdown"); + try { + resetHosts(); + } catch (Exception e) { + e.printStackTrace(); + } + } + })); + running = true; for (String name : config.get().getSection("Servers").getKeys()) { try { if (!this.hosts.keySet().contains(config.get().getSection("Servers").getSection(name).getString("Host").toLowerCase())) throw new InvalidServerException("There is no host with this name: " + config.get().getSection("Servers").getSection(name).getString("Host")); @@ -269,7 +279,7 @@ public final class SubPlugin extends BungeeCord implements Listener { if (other != null && server.isCompatible(other)) server.toggleCompatibility(other); } } - running = true; + api.ready = true; legServers.clear(); int plugins = 0; @@ -288,88 +298,7 @@ public final class SubPlugin extends BungeeCord implements Listener { } System.out.println("SubServers > " + ((plugins > 0)?plugins+" Plugin"+((plugins == 1)?"":"s")+", ":"") + hosts + " Host"+((hosts == 1)?"":"s")+", " + servers + " Server"+((servers == 1)?"":"s")+", and " + subservers + " SubServer"+((subservers == 1)?"":"s")+" loaded in " + new DecimalFormat("0.000").format((Calendar.getInstance().getTime().getTime() - begin) / 1000D) + "s"); - /* - System.out.println(" "); - System.out.println("// Begin Internal SubCreator Template Argument Validator Tests //"); - Container str = new Container("testString"); - SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "System", "toUppercase", str); - System.out.println("System.toUppercase: testString -> " + str.get()); - str.set("testString"); - SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "System", "toLowercase", str); - System.out.println("System.toLowercase: testString -> " + str.get()); - str.set("1.8"); - SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "System", "toServerVersion", str); - System.out.println("System.toServerVersion: 1.8 -> " + str.get()); - str.set("1.10.2"); - SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "System", "toServerVersion", str); - System.out.println("System.toServerVersion: 1.10.2 -> " + str.get()); - str.set("1.12.2"); - SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "System", "toServerVersion", str); - System.out.println("System.toServerVersion: 1.12.2 -> " + str.get()); - str.set("1.8"); - System.out.println("Integer: " + str.get() + " == 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", "=1.10.2", str))?"TRUE":"FALSE")); - str.set("1.10.2"); - System.out.println("Integer: " + str.get() + " == 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", "==1.10.2", str))?"TRUE":"FALSE")); - str.set("1.8"); - System.out.println("Integer: " + str.get() + " != 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", "!1.10.2", str))?"TRUE":"FALSE")); - str.set("1.10.2"); - System.out.println("Integer: " + str.get() + " != 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", "!=1.10.2", str))?"TRUE":"FALSE")); - str.set("1.8"); - System.out.println("Integer: " + str.get() + " < 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", "<1.10.2", str))?"TRUE":"FALSE")); - str.set("1.10.2"); - System.out.println("Integer: " + str.get() + " < 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", "<1.10.2", str))?"TRUE":"FALSE")); - str.set("1.12.2"); - System.out.println("Integer: " + str.get() + " < 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", "<1.10.2", str))?"TRUE":"FALSE")); - str.set("1.8"); - System.out.println("Integer: " + str.get() + " <= 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", "<=1.10.2", str))?"TRUE":"FALSE")); - str.set("1.10.2"); - System.out.println("Integer: " + str.get() + " <= 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", "<=1.10.2", str))?"TRUE":"FALSE")); - str.set("1.12.2"); - System.out.println("Integer: " + str.get() + " <= 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", "<=1.10.2", str))?"TRUE":"FALSE")); - str.set("1.8"); - System.out.println("Integer: " + str.get() + " > 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", ">1.10.2", str))?"TRUE":"FALSE")); - str.set("1.10.2"); - System.out.println("Integer: " + str.get() + " > 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", ">1.10.2", str))?"TRUE":"FALSE")); - str.set("1.12.2"); - System.out.println("Integer: " + str.get() + " > 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", ">1.10.2", str))?"TRUE":"FALSE")); - str.set("1.8"); - System.out.println("Integer: " + str.get() + " >= 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", ">=1.10.2", str))?"TRUE":"FALSE")); - str.set("1.10.2"); - System.out.println("Integer: " + str.get() + " >= 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", ">=1.10.2", str))?"TRUE":"FALSE")); - str.set("1.12.2"); - System.out.println("Integer: " + str.get() + " >= 1.10.2 = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "Integer", ">=1.10.2", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /No Pizza Please/ == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/No Pizza Please/", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /no pizza please/ == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/no pizza please/", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /nopizzaplease/ == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/nopizzaplease/", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /No Pizza Please/i == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/No Pizza Please/i", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /no pizza please/i == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/no pizza please/i", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /nopizzaplease/i == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/nopizzaplease/i", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /No Pizza Please/u == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/No Pizza Please/u", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /no pizza please/u == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/no pizza please/u", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /nopizzaplease/u == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/nopizzaplease/u", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /No Pizza Please/x == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/No Pizza Please/x", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /no pizza please/x == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/no pizza please/x", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /nopizzaplease/x == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/nopizzaplease/x", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /No Pizza Please/iux == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/No Pizza Please/iux", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /no pizza please/iux == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/no pizza please/iux", str))?"TRUE":"FALSE")); - str.set("No Pizza Please"); - System.out.println("RegEx: /nopizzaplease/iux == " + str.get() + " = " + ((SubCreator.validate(((Host) api.getHosts().values().toArray()[0]).getCreator().getTemplate("Sponge"), "RegEx", "/nopizzaplease/iux", str))?"TRUE":"FALSE")); - System.out.println(" "); - */ + super.startListeners(); if (!posted) { post(); @@ -382,12 +311,11 @@ public final class SubPlugin extends BungeeCord implements Listener { private void post() { new Metrics(this); - new Timer().schedule(new TimerTask() { @Override public void run() { try { - Document updxml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(Util.readAll(new BufferedReader(new InputStreamReader(new URL("http://src.me1312.net/maven/net/ME1312/SubServers/SubServers.Bungee/maven-metadata.xml").openStream(), Charset.forName("UTF-8"))))))); + Document updxml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://src.me1312.net/maven/net/ME1312/SubServers/SubServers.Bungee/maven-metadata.xml").openStream(), Charset.forName("UTF-8"))))))); NodeList updnodeList = updxml.getElementsByTagName("version"); Version updversion = version; @@ -428,7 +356,7 @@ public final class SubPlugin extends BungeeCord implements Listener { @Override public Map getServers() { HashMap servers = new HashMap(); - if (!running) { + if (!api.ready) { servers.putAll(super.getServers()); servers.putAll(legServers); } else { @@ -472,25 +400,8 @@ public final class SubPlugin extends BungeeCord implements Listener { } } } - running = false; - System.out.println("SubServers > Resetting Hosts and Server Data"); - List hosts = new ArrayList(); - hosts.addAll(this.hosts.keySet()); - for (String host : hosts) { - List subservers = new ArrayList(); - subservers.addAll(this.hosts.get(host).getSubServers().keySet()); - - for (String server : subservers) { - this.hosts.get(host).removeSubServer(server); - } - subservers.clear(); - this.hosts.get(host).getCreator().terminate(); - this.hosts.get(host).getCreator().waitFor(); - this.hosts.remove(host); - } - hosts.clear(); - exServers.clear(); + resetHosts(); subdata.destroy(); } catch (Exception e) { @@ -498,6 +409,27 @@ public final class SubPlugin extends BungeeCord implements Listener { } super.stopListeners(); + } private void resetHosts() throws Exception { + api.ready = false; + System.out.println("SubServers > Resetting Hosts and Server Data"); + List hosts = new ArrayList(); + hosts.addAll(this.hosts.keySet()); + + for (String host : hosts) { + List subservers = new ArrayList(); + subservers.addAll(this.hosts.get(host).getSubServers().keySet()); + + for (String server : subservers) { + this.hosts.get(host).removeSubServer(server); + } + subservers.clear(); + this.hosts.get(host).getCreator().terminate(); + this.hosts.get(host).getCreator().waitFor(); + this.hosts.remove(host); + } + running = false; + this.hosts.clear(); + exServers.clear(); } @EventHandler(priority = Byte.MAX_VALUE) diff --git a/SubServers.Client/Bukkit/src.jar b/SubServers.Client/Bukkit/src.jar index e41b9966..49820181 100644 Binary files a/SubServers.Client/Bukkit/src.jar and b/SubServers.Client/Bukkit/src.jar differ diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/InternalUIRenderer.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/InternalUIRenderer.java index 6cbf89a6..1adbb7c8 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/InternalUIRenderer.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Graphic/InternalUIRenderer.java @@ -821,6 +821,7 @@ public class InternalUIRenderer extends UIRenderer { hosts.put(server, (json.getJSONObject("groups").getJSONObject(group).getJSONObject(server).keySet().contains("host") && json.getJSONObject("hosts").keySet().contains(json.getJSONObject("groups").getJSONObject(group).getJSONObject(server).getString("host")))?json.getJSONObject("groups").getJSONObject(group).getJSONObject(server).getString("host"):null); servers.add(server); } + } else { lastMenu = () -> serverMenu(1, null, null); for (String s : json.getJSONObject("servers").keySet()) { hosts.put(s, null); diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubPlugin.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubPlugin.java index 2d2c405b..f919a0be 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubPlugin.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubPlugin.java @@ -92,7 +92,7 @@ public final class SubPlugin extends JavaPlugin { Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> { try { - Document updxml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(Util.readAll(new BufferedReader(new InputStreamReader(new URL("http://src.me1312.net/maven/net/ME1312/SubServers/SubServers.Client.Bukkit/maven-metadata.xml").openStream(), Charset.forName("UTF-8"))))))); + Document updxml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://src.me1312.net/maven/net/ME1312/SubServers/SubServers.Client.Bukkit/maven-metadata.xml").openStream(), Charset.forName("UTF-8"))))))); NodeList updnodeList = updxml.getElementsByTagName("version"); Version updversion = version; diff --git a/SubServers.Host/src.jar b/SubServers.Host/src.jar index cc77ece1..bf63765b 100644 Binary files a/SubServers.Host/src.jar and b/SubServers.Host/src.jar differ diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java b/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java index 68967ea8..8b3e85d2 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java @@ -26,7 +26,6 @@ import javax.xml.parsers.DocumentBuilderFactory; import java.io.*; import java.lang.reflect.InvocationTargetException; import java.net.InetAddress; -import java.net.SocketException; import java.net.URL; import java.net.URLDecoder; import java.nio.charset.Charset; @@ -57,7 +56,8 @@ public final class ExHost { public final Version bversion = new Version(2); public final SubAPI api = new SubAPI(this); - private boolean running; + private boolean running = false; + private boolean ready = false; /** * SubServers.Host Launch @@ -123,7 +123,7 @@ public final class ExHost { Files.delete(new UniversalFile(dir, "Recently Deleted").toPath()); } } - + running = true; SubDataClient.Encryption encryption = SubDataClient.Encryption.NONE; if (config.get().getSection("Settings").getSection("SubData").getString("Password", "").length() == 0) { log.info.println("Cannot encrypt connection without a password"); @@ -135,6 +135,12 @@ public final class ExHost { subdata = new SubDataClient(this, config.get().getSection("Settings").getSection("SubData").getString("Name", "undefined"), InetAddress.getByName(config.get().getSection("Settings").getSection("SubData").getString("Address", "127.0.0.1:4391").split(":")[0]), Integer.parseInt(config.get().getSection("Settings").getSection("SubData").getString("Address", "127.0.0.1:4391").split(":")[1]), encryption); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + if (running) { + log.warn.println("Received request from system to shutdown"); + forcequit(0); + } + })); creator = new SubCreator(this); if (System.getProperty("subservers.host.plugins", "").length() > 0) { @@ -226,6 +232,7 @@ public final class ExHost { plugin.setEnabled(true); api.addListener(plugin, plugin.get()); api.plugins.put(plugin.getName().toLowerCase(), plugin); + api.plugins.put(plugin.getName().toLowerCase(), plugin); loaded.add(plugin.getName().toLowerCase()); log.info.println("Loaded " + plugin.getName() + " v" + plugin.getVersion().toString() + " by " + plugin.getAuthors().toString().substring(1, plugin.getAuthors().toString().length() - 1)); i++; @@ -257,13 +264,12 @@ public final class ExHost { } loadDefaults(); - running = true; new Timer().schedule(new TimerTask() { @Override public void run() { try { - Document updxml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(Util.readAll(new BufferedReader(new InputStreamReader(new URL("http://src.me1312.net/maven/net/ME1312/SubServers/SubServers.Host/maven-metadata.xml").openStream(), Charset.forName("UTF-8"))))))); + Document updxml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://src.me1312.net/maven/net/ME1312/SubServers/SubServers.Host/maven-metadata.xml").openStream(), Charset.forName("UTF-8"))))))); NodeList updnodeList = updxml.getElementsByTagName("version"); Version updversion = version; @@ -283,18 +289,17 @@ public final class ExHost { }, 0, TimeUnit.DAYS.toMillis(2)); loop(); - } catch (SocketException e) { - log.severe.println(e); } catch (Exception e) { log.error.println(e); + forcequit(1); } } private void loop() { Scanner console = new Scanner(System.in); - - while (running && console.hasNextLine()) { - if (!running) continue; + ready = true; + while (ready && console.hasNextLine()) { + if (!ready) continue; final String umsg = console.nextLine(); final CommandPreProcessEvent event; api.executeEvent(event = new CommandPreProcessEvent(this, umsg)); @@ -305,7 +310,7 @@ public final class ExHost { args.addAll(Arrays.asList(umsg.contains(" ") ? umsg.split(" ") : new String[]{umsg})); args.remove(0); - new Thread(() ->{ + new Thread(() -> { try { api.commands.get(cmd.toLowerCase()).command(cmd, args.toArray(new String[args.size()])); } catch (Exception e) { @@ -329,41 +334,50 @@ public final class ExHost { * @param exit Exit Code */ public void stop(int exit) { - log.info.println("Shutting down..."); - running = false; - SubDisableEvent event = new SubDisableEvent(this, exit); - api.executeEvent(event); + if (ready) { + log.info.println("Shutting down..."); + SubDisableEvent event = new SubDisableEvent(this, exit); + api.executeEvent(event); - List subservers = new ArrayList(); - subservers.addAll(servers.keySet()); + forcequit(event.getExitCode()); + } + } private void forcequit(int exit) { + if (ready) { + ready = false; + + List subservers = new ArrayList(); + subservers.addAll(servers.keySet()); + + for (String server : subservers) { + servers.get(server).stop(); + try { + servers.get(server).waitFor(); + } catch (Exception e) { + log.error.println(e); + } + } + servers.clear(); + + if (creator != null) { + creator.terminate(); + try { + creator.waitFor(); + } catch (Exception e) { + log.error.println(e); + } + } + running = false; - for (String server : subservers) { - servers.get(server).stop(); try { - servers.get(server).waitFor(); + Thread.sleep(500); } catch (Exception e) { log.error.println(e); } - } - subservers.clear(); - servers.clear(); + if (subdata != null) Util.isException(() -> subdata.destroy(0)); - creator.terminate(); - try { - creator.waitFor(); - } catch (Exception e) { - log.error.println(e); + Util.isException(FileLogger::end); + System.exit(exit); } - - try { - Thread.sleep(500); - } catch (Exception e) { - log.error.println(e); - } - if (subdata != null) Util.isException(() -> subdata.destroy(0)); - - Util.isException(FileLogger::end); - System.exit(event.getExitCode()); } private void unzip(InputStream zip, File dir) { diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Launch.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Launch.java index 8f7fe1a8..b0f9ed82 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Launch.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Launch.java @@ -21,6 +21,8 @@ import org.w3c.dom.NodeList; * SubServers.Host Launcher Class */ public final class Launch { + private static File dir = null; + private static Process process = null; /** * Prepare and launch SubServers.Host @@ -41,32 +43,32 @@ public final class Launch { private static void launch(String[] args) throws Exception { String plugins = ""; File rtdir = new File(System.getProperty("user.dir")); - File tmpdir = File.createTempFile("SubServers.Host.", ".jar"); File pldir = new File(rtdir, "Plugins"); - tmpdir.delete(); - tmpdir.mkdir(); - System.out.println(">> Created " + tmpdir.getPath().replace(File.separator, "/")); - extractJar(getCodeSourceLocation(), tmpdir); + dir = File.createTempFile("SubServers.Host.", ".jar"); + dir.delete(); + dir.mkdir(); + System.out.println(">> Created " + dir.getPath().replace(File.separator, "/")); + extractJar(getCodeSourceLocation(), dir); System.out.println(">> Extracted ~/" + getCodeSourceLocation().getName()); if (pldir.isDirectory() && pldir.listFiles().length > 0) { for (File plugin : Arrays.asList(pldir.listFiles())) { try { boolean success = false; if (getFileExtension(plugin.getName()).equalsIgnoreCase("zip")) { - Util.unzip(new FileInputStream(plugin), tmpdir); + Util.unzip(new FileInputStream(plugin), dir); success = true; } else if (getFileExtension(plugin.getName()).equalsIgnoreCase("jar")) { - extractJar(plugin, tmpdir); + extractJar(plugin, dir); success = true; } - if (new File(tmpdir, "package.xml").exists()) { - NodeList xml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(tmpdir, "package.xml")).getElementsByTagName("class"); + if (new File(dir, "package.xml").exists()) { + NodeList xml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(dir, "package.xml")).getElementsByTagName("class"); if (xml.getLength() > 0) { for (int i = 0; i < xml.getLength(); i++) { plugins += ((plugins.length() == 0)?"":" ") + xml.item(i).getTextContent().replace(' ', '_'); } } - new File(tmpdir, "package.xml").delete(); + new File(dir, "package.xml").delete(); } if (success) System.out.println(">> Extracted ~/plugins/" + plugin.getName()); } catch (Exception e) { @@ -79,31 +81,47 @@ public final class Launch { String javaPath = String.valueOf(System.getProperty("java.home")) + File.separator + "bin" + File.separator + "java"; arguments.add(javaPath); arguments.addAll(getVmArgs()); - arguments.add("-Dsubservers.host.runtime=" + URLEncoder.encode(tmpdir.getPath(), "UTF-8")); + arguments.add("-Dsubservers.host.runtime=" + URLEncoder.encode(dir.getPath(), "UTF-8")); if (!plugins.equals("")) arguments.add("-Dsubservers.host.plugins=" + URLEncoder.encode(plugins, "UTF-8")); arguments.add("-cp"); - arguments.add(tmpdir.getPath()); + arguments.add(dir.getPath()); arguments.add("net.ME1312.SubServers.Host.ExHost"); arguments.addAll(Arrays.asList(args)); ProcessBuilder processBuilder = new ProcessBuilder(arguments); processBuilder.directory(new File(System.getProperty("user.dir"))); processBuilder.redirectErrorStream(true); - Process process = processBuilder.start(); - syncConsole(process); - System.out.println(">> Cleaning up"); - deleteDir(tmpdir); - System.exit(process.exitValue()); + syncConsole(processBuilder.start()); + Thread.sleep(250); + int code = process.exitValue(); + process = null; + exit(code); } - private static void syncConsole(final Process process) throws Exception { + private static void syncConsole(Process process) throws Exception { ConsoleReader console = new ConsoleReader(System.in, (System.getProperty("subservers.host.log.color", "true").equalsIgnoreCase("true"))?AnsiConsole.out:System.out); console.setExpandEvents(false); + Launch.process = process; try { new Thread(() -> { try { String line; BufferedWriter cmd = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + if (Launch.process != null && Launch.process.isAlive()) { + try { + stashLine(console); + console.println(">> Received request from system to shutdown"); + unstashLine(console); + console.flush(); + cmd.write("exit"); + cmd.newLine(); + cmd.flush(); + } catch (Exception e) { + e.printStackTrace(); + } + } + })); while (process.isAlive() && (line = console.readLine(">")) != null) { if (line.equals("")) continue; cmd.write(line); @@ -150,6 +168,12 @@ public final class Launch { stashLine(console); } + private static void exit(int code) { + System.out.println(">> Cleaning up"); + deleteDir(dir); + System.exit(code); + } + private static void extractJar(File jarFile, File dir) throws Exception { JarFile jar = new JarFile(jarFile); Enumeration files = jar.entries(); diff --git a/SubServers.Sync/src.jar b/SubServers.Sync/src.jar index aee470e8..802f1ade 100644 Binary files a/SubServers.Sync/src.jar and b/SubServers.Sync/src.jar differ diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java index 4fde2694..3ef276e5 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java @@ -121,7 +121,7 @@ public final class SubPlugin extends BungeeCord implements Listener { @Override public void run() { try { - Document updxml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(Util.readAll(new BufferedReader(new InputStreamReader(new URL("http://src.me1312.net/maven/net/ME1312/SubServers/SubServers.Sync/maven-metadata.xml").openStream(), Charset.forName("UTF-8"))))))); + Document updxml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://src.me1312.net/maven/net/ME1312/SubServers/SubServers.Sync/maven-metadata.xml").openStream(), Charset.forName("UTF-8"))))))); NodeList updnodeList = updxml.getElementsByTagName("version"); Version updversion = version;