From 97c73bf738559c6b7123321ac6c3360d8132dd23 Mon Sep 17 00:00:00 2001 From: ME1312 Date: Sun, 29 Jul 2018 14:39:42 -0400 Subject: [PATCH] Implement a simalar namespaced key system in subdata This was a change I made to the Lang API a while back, and now it has made it's way into SubData. Packets are now tied to channels (`n`) and then handles (`h`) within those channels. --- .../Bungee/Network/SubDataServer.java | 164 ++++++++++-------- .../net/ME1312/SubServers/Bungee/SubAPI.java | 9 + .../ME1312/SubServers/Bungee/SubCommand.java | 16 +- .../ME1312/SubServers/Bungee/SubPlugin.java | 3 +- .../Client/Bukkit/Network/SubDataClient.java | 119 +++++++------ .../SubServers/Client/Bukkit/SubAPI.java | 9 + .../SubServers/Client/Bukkit/SubCommand.java | 16 +- .../SubServers/Client/Bukkit/SubPlugin.java | 11 +- .../Client/Sponge/Network/SubDataClient.java | 119 +++++++------ .../SubServers/Client/Sponge/SubAPI.java | 9 + .../SubServers/Client/Sponge/SubCommand.java | 17 +- .../SubServers/Client/Sponge/SubPlugin.java | 11 +- SubServers.Host/src/META-INF/MANIFEST.MF | 1 - .../net/ME1312/SubServers/Host/ExHost.java | 9 +- .../Host/Network/SubDataClient.java | 147 ++++++++-------- .../net/ME1312/SubServers/Host/SubAPI.java | 9 + .../ME1312/SubServers/Host/SubCommand.java | 16 +- SubServers.Sync/src/META-INF/MANIFEST.MF | 1 - .../Sync/Network/SubDataClient.java | 115 ++++++------ .../net/ME1312/SubServers/Sync/SubAPI.java | 9 + .../ME1312/SubServers/Sync/SubCommand.java | 16 +- .../net/ME1312/SubServers/Sync/SubPlugin.java | 9 +- 22 files changed, 455 insertions(+), 380 deletions(-) diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java index 76a8e6fe..d128eb15 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java @@ -4,6 +4,7 @@ import com.google.gson.Gson; import com.google.gson.JsonObject; import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection; import net.ME1312.SubServers.Bungee.Library.Exception.IllegalPacketException; +import net.ME1312.SubServers.Bungee.Library.NamedContainer; import net.ME1312.SubServers.Bungee.Library.Util; import net.ME1312.SubServers.Bungee.Library.Version.Version; import net.ME1312.SubServers.Bungee.Network.Encryption.AES; @@ -23,8 +24,8 @@ import java.util.regex.Pattern; */ public final class SubDataServer { private static int MAX_QUEUE = 64; - private static HashMap, String> pOut = new HashMap, String>(); - private static HashMap> pIn = new HashMap>(); + private static HashMap, NamedContainer> pOut = new HashMap, NamedContainer>(); + private static HashMap>> pIn = new HashMap>>(); private static HashMap ciphers = new HashMap(); private static List allowedAddresses = new ArrayList(); private static boolean defaults = false; @@ -81,58 +82,58 @@ public final class SubDataServer { plugin.getPluginManager().registerListener(null, new PacketOutRunEvent(plugin)); - registerPacket(new PacketAuthorization(plugin), "Authorization"); - registerPacket(new PacketCommandServer(plugin), "SubCommandServer"); - registerPacket(new PacketCreateServer(plugin), "SubCreateServer"); - registerPacket(new PacketDownloadHostInfo(plugin), "SubDownloadHostInfo"); - registerPacket(new PacketDownloadLang(plugin), "SubDownloadLang"); - registerPacket(new PacketDownloadNetworkList(plugin), "SubDownloadNetworkList"); - registerPacket(new PacketDownloadPlayerList(plugin), "SubDownloadPlayerList"); - registerPacket(new PacketDownloadProxyInfo(plugin), "SubDownloadProxyInfo"); - registerPacket(new PacketDownloadServerInfo(plugin), "SubDownloadServerInfo"); - registerPacket(new PacketDownloadServerList(plugin), "SubDownloadServerList"); - registerPacket(new PacketEditServer(plugin), "SubEditServer"); - registerPacket(new PacketExAddServer(), "SubExAddServer"); - registerPacket(new PacketExConfigureHost(plugin), "SubExConfigureHost"); - registerPacket(new PacketExCreateServer(null), "SubExCreateServer"); - registerPacket(new PacketExDeleteServer(), "SubExDeleteServer"); - registerPacket(new PacketExRemoveServer(), "SubExRemoveServer"); - registerPacket(new PacketExUpdateServer(plugin), "SubExUpdateServer"); - registerPacket(new PacketInExLogMessage(), "SubExLogMessage"); - registerPacket(new PacketInExRequestQueue(plugin), "SubExRequestQueue"); - registerPacket(new PacketLinkExHost(plugin), "SubLinkExHost"); - registerPacket(new PacketLinkProxy(plugin), "SubLinkProxy"); - registerPacket(new PacketLinkServer(plugin), "SubLinkServer"); - registerPacket(new PacketListenLog(plugin), "SubListenLog"); - registerPacket(new PacketStartServer(plugin), "SubStartServer"); - registerPacket(new PacketStopServer(plugin), "SubStopServer"); + registerPacket(new PacketAuthorization(plugin), "SubData", "Authorization"); + registerPacket(new PacketCommandServer(plugin), "SubServers", "CommandServer"); + registerPacket(new PacketCreateServer(plugin), "SubServers", "CreateServer"); + registerPacket(new PacketDownloadHostInfo(plugin), "SubServers", "DownloadHostInfo"); + registerPacket(new PacketDownloadLang(plugin), "SubServers", "DownloadLang"); + registerPacket(new PacketDownloadNetworkList(plugin), "SubServers", "DownloadNetworkList"); + registerPacket(new PacketDownloadPlayerList(plugin), "SubServers", "DownloadPlayerList"); + registerPacket(new PacketDownloadProxyInfo(plugin), "SubServers", "DownloadProxyInfo"); + registerPacket(new PacketDownloadServerInfo(plugin), "SubServers", "DownloadServerInfo"); + registerPacket(new PacketDownloadServerList(plugin), "SubServers", "DownloadServerList"); + registerPacket(new PacketEditServer(plugin), "SubServers", "EditServer"); + registerPacket(new PacketExAddServer(), "SubServers", "ExAddServer"); + registerPacket(new PacketExConfigureHost(plugin), "SubServers", "ExConfigureHost"); + registerPacket(new PacketExCreateServer(null), "SubServers", "ExCreateServer"); + registerPacket(new PacketExDeleteServer(), "SubServers", "ExDeleteServer"); + registerPacket(new PacketExRemoveServer(), "SubServers", "ExRemoveServer"); + registerPacket(new PacketExUpdateServer(plugin), "SubServers", "ExUpdateServer"); + registerPacket(new PacketInExLogMessage(), "SubServers", "ExLogMessage"); + registerPacket(new PacketInExRequestQueue(plugin), "SubServers", "ExRequestQueue"); + registerPacket(new PacketLinkExHost(plugin), "SubServers", "LinkExHost"); + registerPacket(new PacketLinkProxy(plugin), "SubServers", "LinkProxy"); + registerPacket(new PacketLinkServer(plugin), "SubServers", "LinkServer"); + registerPacket(new PacketListenLog(plugin), "SubServers", "ListenLog"); + registerPacket(new PacketStartServer(plugin), "SubServers", "StartServer"); + registerPacket(new PacketStopServer(plugin), "SubServers", "StopServer"); - registerPacket(PacketAuthorization.class, "Authorization"); - registerPacket(PacketCommandServer.class, "SubCommandServer"); - registerPacket(PacketCreateServer.class, "SubCreateServer"); - registerPacket(PacketDownloadHostInfo.class, "SubDownloadHostInfo"); - registerPacket(PacketDownloadLang.class, "SubDownloadLang"); - registerPacket(PacketDownloadNetworkList.class, "SubDownloadNetworkList"); - registerPacket(PacketDownloadPlayerList.class, "SubDownloadPlayerList"); - registerPacket(PacketDownloadProxyInfo.class, "SubDownloadProxyInfo"); - registerPacket(PacketDownloadServerInfo.class, "SubDownloadServerInfo"); - registerPacket(PacketDownloadServerList.class, "SubDownloadServerList"); - registerPacket(PacketEditServer.class, "SubEditServer"); - registerPacket(PacketExAddServer.class, "SubExAddServer"); - registerPacket(PacketExConfigureHost.class, "SubExConfigureHost"); - registerPacket(PacketExCreateServer.class, "SubExCreateServer"); - registerPacket(PacketExDeleteServer.class, "SubExDeleteServer"); - registerPacket(PacketExRemoveServer.class, "SubExRemoveServer"); - registerPacket(PacketExUpdateServer.class, "SubExUpdateServer"); - registerPacket(PacketLinkExHost.class, "SubLinkExHost"); - registerPacket(PacketLinkProxy.class, "SubLinkProxy"); - registerPacket(PacketLinkServer.class, "SubLinkServer"); - registerPacket(PacketListenLog.class, "SubListenLog"); - registerPacket(PacketOutRunEvent.class, "SubRunEvent"); - registerPacket(PacketOutReload.class, "SubReload"); - registerPacket(PacketOutReset.class, "SubReset"); - registerPacket(PacketStartServer.class, "SubStartServer"); - registerPacket(PacketStopServer.class, "SubStopServer"); + registerPacket(PacketAuthorization.class, "SubData", "Authorization"); + registerPacket(PacketCommandServer.class, "SubServers", "CommandServer"); + registerPacket(PacketCreateServer.class, "SubServers", "CreateServer"); + registerPacket(PacketDownloadHostInfo.class, "SubServers", "DownloadHostInfo"); + registerPacket(PacketDownloadLang.class, "SubServers", "DownloadLang"); + registerPacket(PacketDownloadNetworkList.class, "SubServers", "DownloadNetworkList"); + registerPacket(PacketDownloadPlayerList.class, "SubServers", "DownloadPlayerList"); + registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo"); + registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo"); + registerPacket(PacketDownloadServerList.class, "SubServers", "DownloadServerList"); + registerPacket(PacketEditServer.class, "SubServers", "EditServer"); + registerPacket(PacketExAddServer.class, "SubServers", "ExAddServer"); + registerPacket(PacketExConfigureHost.class, "SubServers", "ExConfigureHost"); + registerPacket(PacketExCreateServer.class, "SubServers", "ExCreateServer"); + registerPacket(PacketExDeleteServer.class, "SubServers", "ExDeleteServer"); + registerPacket(PacketExRemoveServer.class, "SubServers", "ExRemoveServer"); + registerPacket(PacketExUpdateServer.class, "SubServers", "ExUpdateServer"); + registerPacket(PacketLinkExHost.class, "SubServers", "LinkExHost"); + registerPacket(PacketLinkProxy.class, "SubServers", "LinkProxy"); + registerPacket(PacketLinkServer.class, "SubServers", "LinkServer"); + registerPacket(PacketListenLog.class, "SubServers", "ListenLog"); + registerPacket(PacketOutRunEvent.class, "SubServers", "RunEvent"); + registerPacket(PacketOutReload.class, "SubServers", "Reload"); + registerPacket(PacketOutReset.class, "SubServers", "Reset"); + registerPacket(PacketStartServer.class, "SubServers", "StartServer"); + registerPacket(PacketStopServer.class, "SubServers", "StopServer"); } /** @@ -298,33 +299,40 @@ public final class SubDataServer { * Register PacketIn to the Network * * @param packet PacketIn to register + * @param channel Packet Channel * @param handle Handle to Bind */ - public static void registerPacket(PacketIn packet, String handle) { + public static void registerPacket(PacketIn packet, String channel, String handle) { if (Util.isNull(packet, handle)) throw new NullPointerException(); - List list = (pIn.keySet().contains(handle.toLowerCase()))?pIn.get(handle.toLowerCase()):new ArrayList(); + HashMap> map = (pIn.keySet().contains(channel.toLowerCase()))?pIn.get(channel.toLowerCase()):new HashMap>(); + List list = (map.keySet().contains(handle))?map.get(handle):new ArrayList(); if (!list.contains(packet)) { list.add(packet); - pIn.put(handle.toLowerCase(), list); + map.put(handle, list); + pIn.put(channel.toLowerCase(), map); } } /** * Unregister PacketIn from the Network * + * @param channel Packet Channel * @param packet PacketIn to unregister */ - public static void unregisterPacket(PacketIn packet) { + public static void unregisterPacket(String channel, PacketIn packet) { if (Util.isNull(packet)) throw new NullPointerException(); - List search = new ArrayList(); - search.addAll(pIn.keySet()); - for (String handle : search) if (pIn.get(handle.toLowerCase()).contains(packet)) { - List list = pIn.get(handle.toLowerCase()); - list.remove(packet); - if (list.isEmpty()) { - pIn.remove(handle.toLowerCase()); - } else { - pIn.put(handle.toLowerCase(), list); + if (pIn.keySet().contains(channel.toLowerCase())) { + List search = new ArrayList(); + search.addAll(pIn.get(channel.toLowerCase()).keySet()); + for (String handle : search) if (pIn.get(channel.toLowerCase()).get(handle).contains(packet)) { + List list = pIn.get(channel.toLowerCase()).get(handle); + list.remove(packet); + if (list.isEmpty()) { + pIn.get(channel.toLowerCase()).remove(handle); + if (pIn.get(channel.toLowerCase()).isEmpty()) pIn.remove(channel.toLowerCase()); + } else { + pIn.get(channel.toLowerCase()).put(handle, list); + } } } } @@ -333,32 +341,35 @@ public final class SubDataServer { * Register PacketOut to the Network * * @param packet PacketOut to register + * @param channel Packet Channel * @param handle Handle to bind */ - public static void registerPacket(Class packet, String handle) { + public static void registerPacket(Class packet, String channel, String handle) { if (Util.isNull(packet, handle)) throw new NullPointerException(); - pOut.put(packet, handle.toLowerCase()); + pOut.put(packet, new NamedContainer(channel.toLowerCase(), handle)); } /** * Unregister PacketOut to the Network * + * @param channel Packet Channel * @param packet PacketOut to unregister */ - public static void unregisterPacket(Class packet) { + public static void unregisterPacket(String channel, Class packet) { if (Util.isNull(packet)) throw new NullPointerException(); - pOut.remove(packet); + if (pOut.keySet().contains(packet) && pOut.get(packet).name().equalsIgnoreCase(channel)) pOut.remove(packet); } /** * Grab PacketIn Instances via handle * + * @param channel Packet Channel * @param handle Handle * @return PacketIn */ - public static List getPacket(String handle) { + public static List getPacket(String channel, String handle) { if (Util.isNull(handle)) throw new NullPointerException(); - return new ArrayList(pIn.get(handle.toLowerCase())); + return new ArrayList(pIn.get(channel.toLowerCase()).get(handle)); } /** @@ -428,7 +439,8 @@ public final class SubDataServer { try { YAMLSection contents = packet.generate(); - section.set("h", pOut.get(packet.getClass())); + section.set("n", pOut.get(packet.getClass()).name()); + section.set("h", pOut.get(packet.getClass()).get()); section.set("v", packet.getVersion().toString()); if (contents != null) section.set("c", contents); return section; @@ -445,11 +457,11 @@ public final class SubDataServer { * @throws IllegalPacketException */ protected static List decodePacket(Client client, YAMLSection data) throws IllegalPacketException { - if (!data.contains("h") || !data.contains("v")) throw new IllegalPacketException(client.getAddress().toString() + ": Unknown Packet Format: " + data.toString()); - if (!pIn.keySet().contains(data.getRawString("h"))) throw new IllegalPacketException(client.getAddress().toString() + ": Unknown PacketIn Channel: " + data.getRawString("h")); + if (!data.contains("n") || !data.contains("h") || !data.contains("v")) throw new IllegalPacketException(client.getAddress().toString() + ": Unknown Packet Format: " + data.toString()); + if (!pIn.keySet().contains(data.getRawString("n")) || !pIn.get(data.getRawString("n")).keySet().contains(data.getRawString("h"))) throw new IllegalPacketException("Unknown PacketIn Channel: " + data.getRawString("n") + ':' + data.getRawString("h")); List list = new ArrayList(); - for (PacketIn packet : pIn.get(data.getRawString("h"))) { + for (PacketIn packet : pIn.get(data.getRawString("n")).get(data.getRawString("h"))) { if (packet.isCompatible(new Version(data.getRawString("v")))) { list.add(packet); } else { diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java index 37d39bf0..cc5c23b9 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java @@ -659,6 +659,15 @@ public final class SubAPI { return plugin.version; } + /** + * Gets the SubServers Build Signature + * + * @return SubServers Build Signature (or null if unsigned) + */ + public Version getWrapperBuild() { + return (SubPlugin.class.getPackage().getSpecificationTitle() != null)?new Version(SubPlugin.class.getPackage().getSpecificationTitle()):null; + } + /** * Gets the BungeeCord Version * diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java index 673d72d7..d6f6b893 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubCommand.java @@ -71,28 +71,22 @@ public final class SubCommand extends CommandX { if (args[0].equalsIgnoreCase("help") || args[0].equalsIgnoreCase("?")) { sender.sendMessages(printHelp()); } else if (args[0].equalsIgnoreCase("version") || args[0].equalsIgnoreCase("ver")) { - boolean build = false; - try { - Field f = Version.class.getDeclaredField("type"); - f.setAccessible(true); - build = f.get(plugin.version) != VersionType.SNAPSHOT && SubPlugin.class.getPackage().getSpecificationTitle() != null; - f.setAccessible(false); - } catch (Exception e) {} - sender.sendMessage("SubServers > These are the platforms and versions that are running SubServers.Bungee:"); sender.sendMessage(" " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") + ','); sender.sendMessage(" Java " + System.getProperty("java.version") + ','); sender.sendMessage(" " + plugin.getBungeeName() + ((plugin.isPatched)?" [Patched] ":" ") + net.md_5.bungee.Bootstrap.class.getPackage().getImplementationVersion() + ','); - sender.sendMessage(" SubServers.Bungee v" + SubPlugin.version.toExtendedString() + ((build)?" (" + SubPlugin.class.getPackage().getSpecificationTitle() + ')':"")); + sender.sendMessage(" SubServers.Bungee v" + SubPlugin.version.toExtendedString() + ((plugin.api.getWrapperBuild() != null)?" (" + plugin.api.getWrapperBuild() + ')':"")); sender.sendMessage(""); new Thread(() -> { try { YAMLSection tags = new YAMLSection(new Gson().fromJson("{\"tags\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags").openStream(), Charset.forName("UTF-8")))) + '}', Map.class)); + List versions = new LinkedList(); Version updversion = plugin.version; int updcount = 0; - for (YAMLSection tag : tags.getSectionList("tags")) { - Version version = Version.fromString(tag.getString("ref").substring(10)); + for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10))); + Collections.sort(versions); + for (Version version : versions) { if (version.compareTo(updversion) > 0) { updversion = version; updcount++; diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java index 8d52202a..db192c69 100644 --- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java +++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java @@ -58,8 +58,7 @@ public final class SubPlugin extends BungeeCord implements Listener { public final SubAPI api = new SubAPI(this); public SubDataServer subdata = null; public SubServer sudo = null; - //public static final Version version = Version.fromString("2.13b"); - public static final Version version = new Version(Version.fromString("2.13b"), VersionType.SNAPSHOT, (SubPlugin.class.getPackage().getSpecificationTitle() == null)?"custom":SubPlugin.class.getPackage().getSpecificationTitle()); // TODO Snapshot Version + public static final Version version = Version.fromString("2.13b"); public boolean redis = false; public boolean canSudo = false; diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/SubDataClient.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/SubDataClient.java index 9f271400..9a7e819e 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/SubDataClient.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/SubDataClient.java @@ -27,8 +27,8 @@ import java.util.*; * SubData Direct Client Class */ public final class SubDataClient { - private static HashMap, String> pOut = new HashMap, String>(); - private static HashMap> pIn = new HashMap>(); + private static HashMap, NamedContainer> pOut = new HashMap, NamedContainer>(); + private static HashMap>> pIn = new HashMap>>(); private static HashMap ciphers = new HashMap(); private static boolean defaults = false; private PrintWriter writer; @@ -95,36 +95,36 @@ public final class SubDataClient { } private void loadDefaults() { defaults = true; - registerPacket(new PacketAuthorization(plugin), "Authorization"); - registerPacket(new PacketCommandServer(), "SubCommandServer"); - registerPacket(new PacketCreateServer(), "SubCreateServer"); - registerPacket(new PacketDownloadHostInfo(), "SubDownloadHostInfo"); - registerPacket(new PacketDownloadLang(plugin), "SubDownloadLang"); - registerPacket(new PacketDownloadNetworkList(), "SubDownloadNetworkList"); - registerPacket(new PacketDownloadPlayerList(), "SubDownloadPlayerList"); - registerPacket(new PacketDownloadProxyInfo(), "SubDownloadProxyInfo"); - registerPacket(new PacketDownloadServerInfo(), "SubDownloadServerInfo"); - registerPacket(new PacketDownloadServerList(), "SubDownloadServerList"); - registerPacket(new PacketInRunEvent(plugin), "SubRunEvent"); - registerPacket(new PacketInReload(plugin), "SubReload"); - registerPacket(new PacketInReset(), "SubReset"); - registerPacket(new PacketLinkServer(plugin), "SubLinkServer"); - registerPacket(new PacketStartServer(), "SubStartServer"); - registerPacket(new PacketStopServer(), "SubStopServer"); + registerPacket(new PacketAuthorization(plugin), "SubData", "Authorization"); + registerPacket(new PacketCommandServer(), "SubServers", "CommandServer"); + registerPacket(new PacketCreateServer(), "SubServers", "CreateServer"); + registerPacket(new PacketDownloadHostInfo(), "SubServers", "DownloadHostInfo"); + registerPacket(new PacketDownloadLang(plugin), "SubServers", "DownloadLang"); + registerPacket(new PacketDownloadNetworkList(), "SubServers", "DownloadNetworkList"); + registerPacket(new PacketDownloadPlayerList(), "SubServers", "DownloadPlayerList"); + registerPacket(new PacketDownloadProxyInfo(), "SubServers", "DownloadProxyInfo"); + registerPacket(new PacketDownloadServerInfo(), "SubServers", "DownloadServerInfo"); + registerPacket(new PacketDownloadServerList(), "SubServers", "DownloadServerList"); + registerPacket(new PacketInRunEvent(plugin), "SubServers", "RunEvent"); + registerPacket(new PacketInReload(plugin), "SubServers", "Reload"); + registerPacket(new PacketInReset(), "SubServers", "Reset"); + registerPacket(new PacketLinkServer(plugin), "SubServers", "LinkServer"); + registerPacket(new PacketStartServer(), "SubServers", "StartServer"); + registerPacket(new PacketStopServer(), "SubServers", "StopServer"); - registerPacket(PacketAuthorization.class, "Authorization"); - registerPacket(PacketCommandServer.class, "SubCommandServer"); - registerPacket(PacketCreateServer.class, "SubCreateServer"); - registerPacket(PacketDownloadHostInfo.class, "SubDownloadHostInfo"); - registerPacket(PacketDownloadLang.class, "SubDownloadLang"); - registerPacket(PacketDownloadNetworkList.class, "SubDownloadNetworkList"); - registerPacket(PacketDownloadPlayerList.class, "SubDownloadPlayerList"); - registerPacket(PacketDownloadProxyInfo.class, "SubDownloadProxyInfo"); - registerPacket(PacketDownloadServerInfo.class, "SubDownloadServerInfo"); - registerPacket(PacketDownloadServerList.class, "SubDownloadServerList"); - registerPacket(PacketLinkServer.class, "SubLinkServer"); - registerPacket(PacketStartServer.class, "SubStartServer"); - registerPacket(PacketStopServer.class, "SubStopServer"); + registerPacket(PacketAuthorization.class, "SubData", "Authorization"); + registerPacket(PacketCommandServer.class, "SubServers", "CommandServer"); + registerPacket(PacketCreateServer.class, "SubServers", "CreateServer"); + registerPacket(PacketDownloadHostInfo.class, "SubServers", "DownloadHostInfo"); + registerPacket(PacketDownloadLang.class, "SubServers", "DownloadLang"); + registerPacket(PacketDownloadNetworkList.class, "SubServers", "DownloadNetworkList"); + registerPacket(PacketDownloadPlayerList.class, "SubServers", "DownloadPlayerList"); + registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo"); + registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo"); + registerPacket(PacketDownloadServerList.class, "SubServers", "DownloadServerList"); + registerPacket(PacketLinkServer.class, "SubServers", "LinkServer"); + registerPacket(PacketStartServer.class, "SubServers", "StartServer"); + registerPacket(PacketStopServer.class, "SubServers", "StopServer"); } private void loop() { @@ -230,33 +230,40 @@ public final class SubDataClient { * Register PacketIn to the Network * * @param packet PacketIn to register + * @param channel Packet Channel * @param handle Handle to Bind */ - public static void registerPacket(PacketIn packet, String handle) { + public static void registerPacket(PacketIn packet, String channel, String handle) { if (Util.isNull(packet, handle)) throw new NullPointerException(); - List list = (pIn.keySet().contains(handle.toLowerCase()))?pIn.get(handle.toLowerCase()):new ArrayList(); + HashMap> map = (pIn.keySet().contains(channel.toLowerCase()))?pIn.get(channel.toLowerCase()):new HashMap>(); + List list = (map.keySet().contains(handle))?map.get(handle):new ArrayList(); if (!list.contains(packet)) { list.add(packet); - pIn.put(handle.toLowerCase(), list); + map.put(handle, list); + pIn.put(channel.toLowerCase(), map); } } /** * Unregister PacketIn from the Network * + * @param channel Packet Channel * @param packet PacketIn to unregister */ - public static void unregisterPacket(PacketIn packet) { + public static void unregisterPacket(String channel, PacketIn packet) { if (Util.isNull(packet)) throw new NullPointerException(); - List search = new ArrayList(); - search.addAll(pIn.keySet()); - for (String handle : search) if (pIn.get(handle.toLowerCase()).contains(packet)) { - List list = pIn.get(handle.toLowerCase()); - list.remove(packet); - if (list.isEmpty()) { - pIn.remove(handle.toLowerCase()); - } else { - pIn.put(handle.toLowerCase(), list); + if (pIn.keySet().contains(channel.toLowerCase())) { + List search = new ArrayList(); + search.addAll(pIn.get(channel.toLowerCase()).keySet()); + for (String handle : search) if (pIn.get(channel.toLowerCase()).get(handle).contains(packet)) { + List list = pIn.get(channel.toLowerCase()).get(handle); + list.remove(packet); + if (list.isEmpty()) { + pIn.get(channel.toLowerCase()).remove(handle); + if (pIn.get(channel.toLowerCase()).isEmpty()) pIn.remove(channel.toLowerCase()); + } else { + pIn.get(channel.toLowerCase()).put(handle, list); + } } } } @@ -265,32 +272,35 @@ public final class SubDataClient { * Register PacketOut to the Network * * @param packet PacketOut to register + * @param channel Packet Channel * @param handle Handle to bind */ - public static void registerPacket(Class packet, String handle) { + public static void registerPacket(Class packet, String channel, String handle) { if (Util.isNull(packet, handle)) throw new NullPointerException(); - pOut.put(packet, handle.toLowerCase()); + pOut.put(packet, new NamedContainer(channel.toLowerCase(), handle)); } /** * Unregister PacketOut to the Network * + * @param channel Packet Channel * @param packet PacketOut to unregister */ - public static void unregisterPacket(Class packet) { + public static void unregisterPacket(String channel, Class packet) { if (Util.isNull(packet)) throw new NullPointerException(); - pOut.remove(packet); + if (pOut.keySet().contains(packet) && pOut.get(packet).name().equalsIgnoreCase(channel)) pOut.remove(packet); } /** * Grab PacketIn Instances via handle * + * @param channel Packet Channel * @param handle Handle * @return PacketIn */ - public static List getPacket(String handle) { + public static List getPacket(String channel, String handle) { if (Util.isNull(handle)) throw new NullPointerException(); - return new ArrayList(pIn.get(handle.toLowerCase())); + return new ArrayList(pIn.get(channel.toLowerCase()).get(handle)); } /** @@ -356,7 +366,8 @@ public final class SubDataClient { try { YAMLSection contents = packet.generate(); - data.set("h", pOut.get(packet.getClass())); + data.set("n", pOut.get(packet.getClass()).name()); + data.set("h", pOut.get(packet.getClass()).get()); data.set("v", packet.getVersion().toString()); if (contents != null) data.set("c", contents); return data; @@ -374,11 +385,11 @@ public final class SubDataClient { * @throws InvocationTargetException */ private static List decodePacket(YAMLSection data) throws IllegalPacketException, InvocationTargetException { - if (!data.contains("h") || !data.contains("v")) throw new IllegalPacketException("Unknown Packet Format: " + data.toString()); - if (!pIn.keySet().contains(data.getRawString("h"))) throw new IllegalPacketException("Unknown PacketIn Channel: " + data.getRawString("h")); + if (!data.contains("n") || !data.contains("h") || !data.contains("v")) throw new IllegalPacketException("Unknown Packet Format: " + data.toString()); + if (!pIn.keySet().contains(data.getRawString("n")) || !pIn.get(data.getRawString("n")).keySet().contains(data.getRawString("h"))) throw new IllegalPacketException("Unknown PacketIn Channel: " + data.getRawString("n") + ':' + data.getRawString("h")); List list = new ArrayList(); - for (PacketIn packet : pIn.get(data.getRawString("h"))) { + for (PacketIn packet : pIn.get(data.getRawString("n")).get(data.getRawString("h"))) { if (packet.isCompatible(new Version(data.getRawString("v")))) { list.add(packet); } else { diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubAPI.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubAPI.java index 38da971c..61edab43 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubAPI.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubAPI.java @@ -353,6 +353,15 @@ public final class SubAPI { return plugin.version; } + /** + * Gets the SubServers Build Signature + * + * @return SubServers Build Signature (or null if unsigned) + */ + public Version getPluginBuild() { + return (SubPlugin.class.getPackage().getSpecificationTitle() != null)?new Version(SubPlugin.class.getPackage().getSpecificationTitle()):null; + } + /** * Gets the Server Version * diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java index 460033ec..99b4f9c9 100644 --- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java +++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java @@ -53,28 +53,22 @@ public final class SubCommand implements CommandExecutor { if (args[0].equalsIgnoreCase("help") || args[0].equalsIgnoreCase("?")) { sender.sendMessage(printHelp(label)); } else if (args[0].equalsIgnoreCase("version") || args[0].equalsIgnoreCase("ver")) { - boolean build = false; - try { - Field f = Version.class.getDeclaredField("type"); - f.setAccessible(true); - build = f.get(plugin.version) != VersionType.SNAPSHOT && SubPlugin.class.getPackage().getSpecificationTitle() != null; - f.setAccessible(false); - } catch (Exception e) {} - sender.sendMessage(plugin.api.getLang("SubServers", "Command.Version").replace("$str$", "SubServers.Client.Bukkit")); sender.sendMessage(ChatColor.WHITE + " " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") + ChatColor.RESET + ','); sender.sendMessage(ChatColor.WHITE + " Java " + System.getProperty("java.version") + ChatColor.RESET + ','); sender.sendMessage(ChatColor.WHITE + " " + Bukkit.getName() + ' ' + Bukkit.getVersion() + ChatColor.RESET + ','); - sender.sendMessage(ChatColor.WHITE + " SubServers.Client.Bukkit v" + plugin.version.toExtendedString() + ((build)?" (" + SubPlugin.class.getPackage().getSpecificationTitle() + ')':"")); + sender.sendMessage(ChatColor.WHITE + " SubServers.Client.Bukkit v" + plugin.version.toExtendedString() + ((plugin.api.getPluginBuild() != null)?" (" + plugin.api.getPluginBuild() + ')':"")); sender.sendMessage(""); Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { try { YAMLSection tags = new YAMLSection(new Gson().fromJson("{\"tags\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags").openStream(), Charset.forName("UTF-8")))) + '}', Map.class)); + List versions = new LinkedList(); Version updversion = plugin.version; int updcount = 0; - for (YAMLSection tag : tags.getSectionList("tags")) { - Version version = Version.fromString(tag.getString("ref").substring(10)); + for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10))); + Collections.sort(versions); + for (Version version : versions) { if (version.compareTo(updversion) > 0) { updversion = version; updcount++; 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 3d38f60d..f787ff6c 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 @@ -28,6 +28,8 @@ import java.net.URL; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.StandardCopyOption; +import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -46,8 +48,7 @@ public final class SubPlugin extends JavaPlugin { public SubPlugin() { super(); - //version = Version.fromString(getDescription().getVersion()); - version = new Version(Version.fromString(getDescription().getVersion()), VersionType.SNAPSHOT, (SubPlugin.class.getPackage().getSpecificationTitle() == null)?"custom":SubPlugin.class.getPackage().getSpecificationTitle()); // TODO Snapshot Version + version = Version.fromString(getDescription().getVersion()); } /** @@ -95,11 +96,13 @@ public final class SubPlugin extends JavaPlugin { Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> { try { YAMLSection tags = new YAMLSection(new Gson().fromJson("{\"tags\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags").openStream(), Charset.forName("UTF-8")))) + '}', Map.class)); + List versions = new LinkedList(); Version updversion = version; int updcount = 0; - for (YAMLSection tag : tags.getSectionList("tags")) { - Version version = Version.fromString(tag.getString("ref").substring(10)); + for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10))); + Collections.sort(versions); + for (Version version : versions) { if (version.compareTo(updversion) > 0) { updversion = version; updcount++; diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/SubDataClient.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/SubDataClient.java index 5dd50c11..f959bc02 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/SubDataClient.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/SubDataClient.java @@ -30,8 +30,8 @@ import java.util.concurrent.TimeUnit; * SubData Direct Client Class */ public final class SubDataClient { - private static HashMap, String> pOut = new HashMap, String>(); - private static HashMap> pIn = new HashMap>(); + private static HashMap, NamedContainer> pOut = new HashMap, NamedContainer>(); + private static HashMap>> pIn = new HashMap>>(); private static HashMap ciphers = new HashMap(); private static boolean defaults = false; protected static Logger log; @@ -100,36 +100,36 @@ public final class SubDataClient { defaults = true; log = LoggerFactory.getLogger("SubData"); - registerPacket(new PacketAuthorization(plugin), "Authorization"); - registerPacket(new PacketCommandServer(), "SubCommandServer"); - registerPacket(new PacketCreateServer(), "SubCreateServer"); - registerPacket(new PacketDownloadHostInfo(), "SubDownloadHostInfo"); - registerPacket(new PacketDownloadLang(plugin), "SubDownloadLang"); - registerPacket(new PacketDownloadNetworkList(), "SubDownloadNetworkList"); - registerPacket(new PacketDownloadPlayerList(), "SubDownloadPlayerList"); - registerPacket(new PacketDownloadProxyInfo(), "SubDownloadProxyInfo"); - registerPacket(new PacketDownloadServerInfo(), "SubDownloadServerInfo"); - registerPacket(new PacketDownloadServerList(), "SubDownloadServerList"); - registerPacket(new PacketInRunEvent(plugin), "SubRunEvent"); - registerPacket(new PacketInReload(plugin), "SubReload"); - registerPacket(new PacketInReset(), "SubReset"); - registerPacket(new PacketLinkServer(plugin), "SubLinkServer"); - registerPacket(new PacketStartServer(), "SubStartServer"); - registerPacket(new PacketStopServer(), "SubStopServer"); + registerPacket(new PacketAuthorization(plugin), "SubData", "Authorization"); + registerPacket(new PacketCommandServer(), "SubServers", "CommandServer"); + registerPacket(new PacketCreateServer(), "SubServers", "CreateServer"); + registerPacket(new PacketDownloadHostInfo(), "SubServers", "DownloadHostInfo"); + registerPacket(new PacketDownloadLang(plugin), "SubServers", "DownloadLang"); + registerPacket(new PacketDownloadNetworkList(), "SubServers", "DownloadNetworkList"); + registerPacket(new PacketDownloadPlayerList(), "SubServers", "DownloadPlayerList"); + registerPacket(new PacketDownloadProxyInfo(), "SubServers", "DownloadProxyInfo"); + registerPacket(new PacketDownloadServerInfo(), "SubServers", "DownloadServerInfo"); + registerPacket(new PacketDownloadServerList(), "SubServers", "DownloadServerList"); + registerPacket(new PacketInRunEvent(plugin), "SubServers", "RunEvent"); + registerPacket(new PacketInReload(plugin), "SubServers", "Reload"); + registerPacket(new PacketInReset(), "SubServers", "Reset"); + registerPacket(new PacketLinkServer(plugin), "SubServers", "LinkServer"); + registerPacket(new PacketStartServer(), "SubServers", "StartServer"); + registerPacket(new PacketStopServer(), "SubServers", "StopServer"); - registerPacket(PacketAuthorization.class, "Authorization"); - registerPacket(PacketCommandServer.class, "SubCommandServer"); - registerPacket(PacketCreateServer.class, "SubCreateServer"); - registerPacket(PacketDownloadHostInfo.class, "SubDownloadHostInfo"); - registerPacket(PacketDownloadLang.class, "SubDownloadLang"); - registerPacket(PacketDownloadNetworkList.class, "SubDownloadNetworkList"); - registerPacket(PacketDownloadPlayerList.class, "SubDownloadPlayerList"); - registerPacket(PacketDownloadProxyInfo.class, "SubDownloadProxyInfo"); - registerPacket(PacketDownloadServerInfo.class, "SubDownloadServerInfo"); - registerPacket(PacketDownloadServerList.class, "SubDownloadServerList"); - registerPacket(PacketLinkServer.class, "SubLinkServer"); - registerPacket(PacketStartServer.class, "SubStartServer"); - registerPacket(PacketStopServer.class, "SubStopServer"); + registerPacket(PacketAuthorization.class, "SubData", "Authorization"); + registerPacket(PacketCommandServer.class, "SubServers", "CommandServer"); + registerPacket(PacketCreateServer.class, "SubServers", "CreateServer"); + registerPacket(PacketDownloadHostInfo.class, "SubServers", "DownloadHostInfo"); + registerPacket(PacketDownloadLang.class, "SubServers", "DownloadLang"); + registerPacket(PacketDownloadNetworkList.class, "SubServers", "DownloadNetworkList"); + registerPacket(PacketDownloadPlayerList.class, "SubServers", "DownloadPlayerList"); + registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo"); + registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo"); + registerPacket(PacketDownloadServerList.class, "SubServers", "DownloadServerList"); + registerPacket(PacketLinkServer.class, "SubServers", "LinkServer"); + registerPacket(PacketStartServer.class, "SubServers", "StartServer"); + registerPacket(PacketStopServer.class, "SubServers", "StopServer"); } private void loop() { @@ -235,33 +235,40 @@ public final class SubDataClient { * Register PacketIn to the Network * * @param packet PacketIn to register + * @param channel Packet Channel * @param handle Handle to Bind */ - public static void registerPacket(PacketIn packet, String handle) { + public static void registerPacket(PacketIn packet, String channel, String handle) { if (Util.isNull(packet, handle)) throw new NullPointerException(); - List list = (pIn.keySet().contains(handle.toLowerCase()))?pIn.get(handle.toLowerCase()):new ArrayList(); + HashMap> map = (pIn.keySet().contains(channel.toLowerCase()))?pIn.get(channel.toLowerCase()):new HashMap>(); + List list = (map.keySet().contains(handle))?map.get(handle):new ArrayList(); if (!list.contains(packet)) { list.add(packet); - pIn.put(handle.toLowerCase(), list); + map.put(handle, list); + pIn.put(channel.toLowerCase(), map); } } /** * Unregister PacketIn from the Network * + * @param channel Packet Channel * @param packet PacketIn to unregister */ - public static void unregisterPacket(PacketIn packet) { + public static void unregisterPacket(String channel, PacketIn packet) { if (Util.isNull(packet)) throw new NullPointerException(); - List search = new ArrayList(); - search.addAll(pIn.keySet()); - for (String handle : search) if (pIn.get(handle.toLowerCase()).contains(packet)) { - List list = pIn.get(handle.toLowerCase()); - list.remove(packet); - if (list.isEmpty()) { - pIn.remove(handle.toLowerCase()); - } else { - pIn.put(handle.toLowerCase(), list); + if (pIn.keySet().contains(channel.toLowerCase())) { + List search = new ArrayList(); + search.addAll(pIn.get(channel.toLowerCase()).keySet()); + for (String handle : search) if (pIn.get(channel.toLowerCase()).get(handle).contains(packet)) { + List list = pIn.get(channel.toLowerCase()).get(handle); + list.remove(packet); + if (list.isEmpty()) { + pIn.get(channel.toLowerCase()).remove(handle); + if (pIn.get(channel.toLowerCase()).isEmpty()) pIn.remove(channel.toLowerCase()); + } else { + pIn.get(channel.toLowerCase()).put(handle, list); + } } } } @@ -270,32 +277,35 @@ public final class SubDataClient { * Register PacketOut to the Network * * @param packet PacketOut to register + * @param channel Packet Channel * @param handle Handle to bind */ - public static void registerPacket(Class packet, String handle) { + public static void registerPacket(Class packet, String channel, String handle) { if (Util.isNull(packet, handle)) throw new NullPointerException(); - pOut.put(packet, handle.toLowerCase()); + pOut.put(packet, new NamedContainer(channel.toLowerCase(), handle)); } /** * Unregister PacketOut to the Network * + * @param channel Packet Channel * @param packet PacketOut to unregister */ - public static void unregisterPacket(Class packet) { + public static void unregisterPacket(String channel, Class packet) { if (Util.isNull(packet)) throw new NullPointerException(); - pOut.remove(packet); + if (pOut.keySet().contains(packet) && pOut.get(packet).name().equalsIgnoreCase(channel)) pOut.remove(packet); } /** * Grab PacketIn Instances via handle * + * @param channel Packet Channel * @param handle Handle * @return PacketIn */ - public static List getPacket(String handle) { + public static List getPacket(String channel, String handle) { if (Util.isNull(handle)) throw new NullPointerException(); - return new ArrayList(pIn.get(handle.toLowerCase())); + return new ArrayList(pIn.get(channel.toLowerCase()).get(handle)); } /** @@ -361,7 +371,8 @@ public final class SubDataClient { try { YAMLSection contents = packet.generate(); - data.set("h", pOut.get(packet.getClass())); + data.set("n", pOut.get(packet.getClass()).name()); + data.set("h", pOut.get(packet.getClass()).get()); data.set("v", packet.getVersion().toString()); if (contents != null) data.set("c", contents); return data; @@ -379,11 +390,11 @@ public final class SubDataClient { * @throws InvocationTargetException */ private static List decodePacket(YAMLSection data) throws IllegalPacketException, InvocationTargetException { - if (!data.contains("h") || !data.contains("v")) throw new IllegalPacketException("Unknown Packet Format: " + data.toString()); - if (!pIn.keySet().contains(data.getRawString("h"))) throw new IllegalPacketException("Unknown PacketIn Channel: " + data.getRawString("h")); + if (!data.contains("n") || !data.contains("h") || !data.contains("v")) throw new IllegalPacketException("Unknown Packet Format: " + data.toString()); + if (!pIn.keySet().contains(data.getRawString("n")) || !pIn.get(data.getRawString("n")).keySet().contains(data.getRawString("h"))) throw new IllegalPacketException("Unknown PacketIn Channel: " + data.getRawString("n") + ':' + data.getRawString("h")); List list = new ArrayList(); - for (PacketIn packet : pIn.get(data.getRawString("h"))) { + for (PacketIn packet : pIn.get(data.getRawString("n")).get(data.getRawString("h"))) { if (packet.isCompatible(new Version(data.getRawString("v")))) { list.add(packet); } else { diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubAPI.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubAPI.java index 67fa1697..b00a6bcf 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubAPI.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubAPI.java @@ -352,6 +352,15 @@ public final class SubAPI { return plugin.version; } + /** + * Gets the SubServers Build Signature + * + * @return SubServers Build Signature (or null if unsigned) + */ + public Version getPluginBuild() { + return (SubPlugin.class.getPackage().getSpecificationTitle() != null)?new Version(SubPlugin.class.getPackage().getSpecificationTitle()):null; + } + /** * Gets the Server Version * diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubCommand.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubCommand.java index 4d2c30c6..42fd7783 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubCommand.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubCommand.java @@ -156,29 +156,22 @@ public final class SubCommand implements CommandExecutor { @SuppressWarnings("unchecked") public CommandResult execute(CommandSource sender, CommandContext args) throws CommandException { if (canRun(sender)) { - boolean build = false; - String platform = "Sponge"; - try { - Field f = Version.class.getDeclaredField("type"); - f.setAccessible(true); - build = f.get(plugin.version) != VersionType.SNAPSHOT && SubPlugin.class.getPackage().getSpecificationTitle() != null; - f.setAccessible(false); - } catch (Exception e) {} - sender.sendMessage(Text.of(plugin.api.getLang("SubServers", "Command.Version").replace("$str$", "SubServers.Client.Sponge"))); sender.sendMessage(Text.builder(" " + System.getProperty("os.name") + ' ' + System.getProperty("os.version")).color(TextColors.WHITE).append(Text.of(",")).build()); sender.sendMessage(Text.builder(" Java " + System.getProperty("java.version")).color(TextColors.WHITE).append(Text.of(",")).build()); sender.sendMessage(Text.builder(" " + Sponge.getPlatform().getImplementation().getName() + ' ' + Sponge.getPlatform().getImplementation().getVersion().get()).color(TextColors.WHITE).append(Text.of(",")).build()); - sender.sendMessage(Text.builder(" SubServers.Client.Sponge v" + plugin.version.toExtendedString() + ((build)?" (" + SubPlugin.class.getPackage().getSpecificationTitle() + ')':"")).color(TextColors.WHITE).build()); + sender.sendMessage(Text.builder(" SubServers.Client.Sponge v" + plugin.version.toExtendedString() + ((plugin.api.getPluginBuild() != null)?" (" + plugin.api.getPluginBuild() + ')':"")).color(TextColors.WHITE).build()); sender.sendMessage(Text.EMPTY); plugin.game.getScheduler().createTaskBuilder().async().execute(() -> { try { YAMLSection tags = new YAMLSection(new Gson().fromJson("{\"tags\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags").openStream(), Charset.forName("UTF-8")))) + '}', Map.class)); + List versions = new LinkedList(); Version updversion = plugin.version; int updcount = 0; - for (YAMLSection tag : tags.getSectionList("tags")) { - Version version = Version.fromString(tag.getString("ref").substring(10)); + for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10))); + Collections.sort(versions); + for (Version version : versions) { if (version.compareTo(updversion) > 0) { updversion = version; updcount++; diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java index 0065d122..78a9c3c0 100644 --- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java +++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java @@ -37,6 +37,8 @@ import java.net.URL; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.StandardCopyOption; +import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -62,8 +64,7 @@ public final class SubPlugin { @Listener public void setup(GamePreInitializationEvent event) { if (plugin.getVersion().isPresent()) { - //version = Version.fromString(plugin.getVersion().get()); - version = new Version(Version.fromString(plugin.getVersion().get()), VersionType.SNAPSHOT, (SubPlugin.class.getPackage().getSpecificationTitle() == null)?"custom":SubPlugin.class.getPackage().getSpecificationTitle()); // TODO Snapshot Version + version = Version.fromString(plugin.getVersion().get()); } else version = new Version("Custom"); } @@ -110,11 +111,13 @@ public final class SubPlugin { game.getScheduler().createTaskBuilder().async().execute(() -> { try { YAMLSection tags = new YAMLSection(new Gson().fromJson("{\"tags\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags").openStream(), Charset.forName("UTF-8")))) + '}', Map.class)); + List versions = new LinkedList(); Version updversion = version; int updcount = 0; - for (YAMLSection tag : tags.getSectionList("tags")) { - Version version = Version.fromString(tag.getString("ref").substring(10)); + for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10))); + Collections.sort(versions); + for (Version version : versions) { if (version.compareTo(updversion) > 0) { updversion = version; updcount++; diff --git a/SubServers.Host/src/META-INF/MANIFEST.MF b/SubServers.Host/src/META-INF/MANIFEST.MF index d391d6ff..2727025b 100644 --- a/SubServers.Host/src/META-INF/MANIFEST.MF +++ b/SubServers.Host/src/META-INF/MANIFEST.MF @@ -1,4 +1,3 @@ Manifest-Version: 1.0 Main-Class: net.ME1312.SubServers.Host.ExHost Implementation-Title: SubServers.Host -Specification-Title: 18w30bb diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java b/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java index 26148780..f0347a08 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java @@ -55,8 +55,7 @@ public final class ExHost { public SubDataClient subdata = null; public final SubAPI api = new SubAPI(this); - //public static final Version version = Version.fromString("2.13b"); - public static final Version version = new Version(Version.fromString("2.13b"), VersionType.SNAPSHOT, (ExHost.class.getPackage().getSpecificationTitle() == null)?"custom":ExHost.class.getPackage().getSpecificationTitle()); // TODO Snapshot Version + public static final Version version = Version.fromString("2.13b"); private ConsoleReader jline; private boolean running = false; @@ -417,11 +416,13 @@ public final class ExHost { public void run() { try { YAMLSection tags = new YAMLSection(new JSONObject("{\"tags\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags").openStream(), Charset.forName("UTF-8")))) + '}')); + List versions = new LinkedList(); Version updversion = version; int updcount = 0; - for (YAMLSection tag : tags.getSectionList("tags")) { - Version version = Version.fromString(tag.getString("ref").substring(10)); + for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10))); + Collections.sort(versions); + for (Version version : versions) { if (version.compareTo(updversion) > 0) { updversion = version; updcount++; diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/SubDataClient.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/SubDataClient.java index 661dc618..939477c8 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/SubDataClient.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/SubDataClient.java @@ -32,8 +32,8 @@ import java.util.concurrent.TimeUnit; * SubData Direct Client Class */ public final class SubDataClient { - private static HashMap, String> pOut = new HashMap, String>(); - private static HashMap> pIn = new HashMap>(); + private static HashMap, NamedContainer> pOut = new HashMap, NamedContainer>(); + private static HashMap>> pIn = new HashMap>>(); private static HashMap ciphers = new HashMap(); private static boolean defaults = false; protected static Logger log; @@ -103,51 +103,51 @@ public final class SubDataClient { defaults = true; log = new Logger("SubData"); - registerPacket(new PacketAuthorization(host), "Authorization"); - registerPacket(new PacketCommandServer(), "SubCommandServer"); - registerPacket(new PacketCreateServer(), "SubCreateServer"); - registerPacket(new PacketDownloadHostInfo(), "SubDownloadHostInfo"); - registerPacket(new PacketDownloadLang(host), "SubDownloadLang"); - registerPacket(new PacketDownloadNetworkList(), "SubDownloadNetworkList"); - registerPacket(new PacketDownloadPlayerList(), "SubDownloadPlayerList"); - registerPacket(new PacketDownloadProxyInfo(), "SubDownloadProxyInfo"); - registerPacket(new PacketDownloadServerInfo(), "SubDownloadServerInfo"); - registerPacket(new PacketDownloadServerList(), "SubDownloadServerList"); - registerPacket(new PacketExAddServer(host), "SubExAddServer"); - registerPacket(new PacketExConfigureHost(host), "SubExConfigureHost"); - registerPacket(new PacketExCreateServer(host), "SubExCreateServer"); - registerPacket(new PacketExDeleteServer(host), "SubExDeleteServer"); - registerPacket(new PacketExRemoveServer(host), "SubExRemoveServer"); - registerPacket(new PacketExUpdateServer(host), "SubExUpdateServer"); - registerPacket(new PacketInReload(host), "SubReload"); - registerPacket(new PacketInReset(host), "SubReset"); - registerPacket(new PacketInRunEvent(), "SubRunEvent"); - registerPacket(new PacketLinkExHost(host), "SubLinkExHost"); - registerPacket(new PacketStartServer(), "SubStartServer"); - registerPacket(new PacketStopServer(), "SubStopServer"); + registerPacket(new PacketAuthorization(host), "SubData", "Authorization"); + registerPacket(new PacketCommandServer(), "SubServers", "CommandServer"); + registerPacket(new PacketCreateServer(), "SubServers", "CreateServer"); + registerPacket(new PacketDownloadHostInfo(), "SubServers", "DownloadHostInfo"); + registerPacket(new PacketDownloadLang(host), "SubServers", "DownloadLang"); + registerPacket(new PacketDownloadNetworkList(), "SubServers", "DownloadNetworkList"); + registerPacket(new PacketDownloadPlayerList(), "SubServers", "DownloadPlayerList"); + registerPacket(new PacketDownloadProxyInfo(), "SubServers", "DownloadProxyInfo"); + registerPacket(new PacketDownloadServerInfo(), "SubServers", "DownloadServerInfo"); + registerPacket(new PacketDownloadServerList(), "SubServers", "DownloadServerList"); + registerPacket(new PacketExAddServer(host), "SubServers", "ExAddServer"); + registerPacket(new PacketExConfigureHost(host), "SubServers", "ExConfigureHost"); + registerPacket(new PacketExCreateServer(host), "SubServers", "ExCreateServer"); + registerPacket(new PacketExDeleteServer(host), "SubServers", "ExDeleteServer"); + registerPacket(new PacketExRemoveServer(host), "SubServers", "ExRemoveServer"); + registerPacket(new PacketExUpdateServer(host), "SubServers", "ExUpdateServer"); + registerPacket(new PacketInReload(host), "SubServers", "Reload"); + registerPacket(new PacketInReset(host), "SubServers", "Reset"); + registerPacket(new PacketInRunEvent(), "SubServers", "RunEvent"); + registerPacket(new PacketLinkExHost(host), "SubServers", "LinkExHost"); + registerPacket(new PacketStartServer(), "SubServers", "StartServer"); + registerPacket(new PacketStopServer(), "SubServers", "StopServer"); - registerPacket(PacketAuthorization.class, "Authorization"); - registerPacket(PacketCommandServer.class, "SubCommandServer"); - registerPacket(PacketCreateServer.class, "SubCreateServer"); - registerPacket(PacketDownloadHostInfo.class, "SubDownloadHostInfo"); - registerPacket(PacketDownloadLang.class, "SubDownloadLang"); - registerPacket(PacketDownloadNetworkList.class, "SubDownloadNetworkList"); - registerPacket(PacketDownloadPlayerList.class, "SubDownloadPlayerList"); - registerPacket(PacketDownloadProxyInfo.class, "SubDownloadProxyInfo"); - registerPacket(PacketDownloadServerInfo.class, "SubDownloadServerInfo"); - registerPacket(PacketDownloadServerList.class, "SubDownloadServerList"); - registerPacket(PacketExAddServer.class, "SubExAddServer"); - registerPacket(PacketExConfigureHost.class, "SubExConfigureHost"); - registerPacket(PacketExCreateServer.class, "SubExCreateServer"); - registerPacket(PacketExDeleteServer.class, "SubExDeleteServer"); - registerPacket(PacketExRemoveServer.class, "SubExRemoveServer"); - registerPacket(PacketExUpdateServer.class, "SubExUpdateServer"); - registerPacket(PacketLinkExHost.class, "SubLinkExHost"); - registerPacket(PacketOutExLogMessage.class, "SubExLogMessage"); - registerPacket(PacketOutExRequestQueue.class, "SubExRequestQueue"); - registerPacket(PacketStartServer.class, "SubStartServer"); - registerPacket(PacketStopServer.class, "SubStopServer"); + registerPacket(PacketAuthorization.class, "SubData", "Authorization"); + registerPacket(PacketCommandServer.class, "SubServers", "CommandServer"); + registerPacket(PacketCreateServer.class, "SubServers", "CreateServer"); + registerPacket(PacketDownloadHostInfo.class, "SubServers", "DownloadHostInfo"); + registerPacket(PacketDownloadLang.class, "SubServers", "DownloadLang"); + registerPacket(PacketDownloadNetworkList.class, "SubServers", "DownloadNetworkList"); + registerPacket(PacketDownloadPlayerList.class, "SubServers", "DownloadPlayerList"); + registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo"); + registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo"); + registerPacket(PacketDownloadServerList.class, "SubServers", "DownloadServerList"); + registerPacket(PacketExAddServer.class, "SubServers", "ExAddServer"); + registerPacket(PacketExConfigureHost.class, "SubServers", "ExConfigureHost"); + registerPacket(PacketExCreateServer.class, "SubServers", "ExCreateServer"); + registerPacket(PacketExDeleteServer.class, "SubServers", "ExDeleteServer"); + registerPacket(PacketExRemoveServer.class, "SubServers", "ExRemoveServer"); + registerPacket(PacketExUpdateServer.class, "SubServers", "ExUpdateServer"); + registerPacket(PacketLinkExHost.class, "SubServers", "LinkExHost"); + registerPacket(PacketOutExLogMessage.class, "SubServers", "ExLogMessage"); + registerPacket(PacketOutExRequestQueue.class, "SubServers", "ExRequestQueue"); + registerPacket(PacketStartServer.class, "SubServers", "StartServer"); + registerPacket(PacketStopServer.class, "SubServers", "StopServer"); } private void loop() { @@ -251,33 +251,40 @@ public final class SubDataClient { * Register PacketIn to the Network * * @param packet PacketIn to register + * @param channel Packet Channel * @param handle Handle to Bind */ - public static void registerPacket(PacketIn packet, String handle) { + public static void registerPacket(PacketIn packet, String channel, String handle) { if (Util.isNull(packet, handle)) throw new NullPointerException(); - List list = (pIn.keySet().contains(handle.toLowerCase()))?pIn.get(handle.toLowerCase()):new ArrayList(); + HashMap> map = (pIn.keySet().contains(channel.toLowerCase()))?pIn.get(channel.toLowerCase()):new HashMap>(); + List list = (map.keySet().contains(handle))?map.get(handle):new ArrayList(); if (!list.contains(packet)) { list.add(packet); - pIn.put(handle.toLowerCase(), list); + map.put(handle, list); + pIn.put(channel.toLowerCase(), map); } } /** * Unregister PacketIn from the Network * + * @param channel Packet Channel * @param packet PacketIn to unregister */ - public static void unregisterPacket(PacketIn packet) { + public static void unregisterPacket(String channel, PacketIn packet) { if (Util.isNull(packet)) throw new NullPointerException(); - List search = new ArrayList(); - search.addAll(pIn.keySet()); - for (String handle : search) if (pIn.get(handle.toLowerCase()).contains(packet)) { - List list = pIn.get(handle.toLowerCase()); - list.remove(packet); - if (list.isEmpty()) { - pIn.remove(handle.toLowerCase()); - } else { - pIn.put(handle.toLowerCase(), list); + if (pIn.keySet().contains(channel.toLowerCase())) { + List search = new ArrayList(); + search.addAll(pIn.get(channel.toLowerCase()).keySet()); + for (String handle : search) if (pIn.get(channel.toLowerCase()).get(handle).contains(packet)) { + List list = pIn.get(channel.toLowerCase()).get(handle); + list.remove(packet); + if (list.isEmpty()) { + pIn.get(channel.toLowerCase()).remove(handle); + if (pIn.get(channel.toLowerCase()).isEmpty()) pIn.remove(channel.toLowerCase()); + } else { + pIn.get(channel.toLowerCase()).put(handle, list); + } } } } @@ -286,32 +293,35 @@ public final class SubDataClient { * Register PacketOut to the Network * * @param packet PacketOut to register + * @param channel Packet Channel * @param handle Handle to bind */ - public static void registerPacket(Class packet, String handle) { + public static void registerPacket(Class packet, String channel, String handle) { if (Util.isNull(packet, handle)) throw new NullPointerException(); - pOut.put(packet, handle.toLowerCase()); + pOut.put(packet, new NamedContainer(channel.toLowerCase(), handle)); } /** * Unregister PacketOut to the Network * + * @param channel Packet Channel * @param packet PacketOut to unregister */ - public static void unregisterPacket(Class packet) { + public static void unregisterPacket(String channel, Class packet) { if (Util.isNull(packet)) throw new NullPointerException(); - pOut.remove(packet); + if (pOut.keySet().contains(packet) && pOut.get(packet).name().equalsIgnoreCase(channel)) pOut.remove(packet); } /** * Grab PacketIn Instances via handle * + * @param channel Packet Channel * @param handle Handle * @return PacketIn */ - public static List getPacket(String handle) { + public static List getPacket(String channel, String handle) { if (Util.isNull(handle)) throw new NullPointerException(); - return new ArrayList(pIn.get(handle.toLowerCase())); + return new ArrayList(pIn.get(channel.toLowerCase()).get(handle)); } /** @@ -376,7 +386,8 @@ public final class SubDataClient { try { YAMLSection contents = packet.generate(); - json.set("h", pOut.get(packet.getClass())); + json.set("n", pOut.get(packet.getClass()).name()); + json.set("h", pOut.get(packet.getClass()).get()); json.set("v", packet.getVersion().toString()); if (contents != null) json.set("c", contents); } catch (Throwable e) { @@ -395,11 +406,11 @@ public final class SubDataClient { */ @SuppressWarnings("deprecation") private static List decodePacket(YAMLSection data) throws IllegalPacketException, InvocationTargetException { - if (!data.contains("h") || !data.contains("v")) throw new IllegalPacketException("Unknown Packet Format: " + data.toString()); - if (!pIn.keySet().contains(data.getRawString("h"))) throw new IllegalPacketException("Unknown PacketIn Channel: " + data.getRawString("h")); + if (!data.contains("n") || !data.contains("h") || !data.contains("v")) throw new IllegalPacketException("Unknown Packet Format: " + data.toString()); + if (!pIn.keySet().contains(data.getRawString("n")) || !pIn.get(data.getRawString("n")).keySet().contains(data.getRawString("h"))) throw new IllegalPacketException("Unknown PacketIn Channel: " + data.getRawString("n") + ':' + data.getRawString("h")); List list = new ArrayList(); - for (PacketIn packet : pIn.get(data.getRawString("h"))) { + for (PacketIn packet : pIn.get(data.getRawString("n")).get(data.getRawString("h"))) { if (packet.isCompatible(new Version(data.getRawString("v")))) { list.add(packet); } else { diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/SubAPI.java b/SubServers.Host/src/net/ME1312/SubServers/Host/SubAPI.java index 9cba277a..71493dd3 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/SubAPI.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/SubAPI.java @@ -615,4 +615,13 @@ public final class SubAPI { public Version getAppVersion() { return host.version; } + + /** + * Gets the SubServers Build Signature + * + * @return SubServers Build Signature (or null if unsigned) + */ + public Version getAppBuild() { + return (ExHost.class.getPackage().getSpecificationTitle() != null)?new Version(ExHost.class.getPackage().getSpecificationTitle()):null; + } } diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java b/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java index 1b10ff5e..16030502 100644 --- a/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java +++ b/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java @@ -33,29 +33,23 @@ public class SubCommand { @Override public void command(String handle, String[] args) { if (args.length == 0 || host.api.plugins.get(args[0].toLowerCase()) != null) { - boolean build = false; - try { - Field f = Version.class.getDeclaredField("type"); - f.setAccessible(true); - build = f.get(host.version) != VersionType.SNAPSHOT && ExHost.class.getPackage().getSpecificationTitle() != null; - f.setAccessible(false); - } catch (Exception e) {} - host.log.message.println( "These are the platforms and versions that are running " + ((args.length == 0)?"SubServers.Host":host.api.plugins.get(args[0].toLowerCase()).getName()) +":", " " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") + ',', " Java " + System.getProperty("java.version") + ',', - " SubServers.Host v" + host.version.toExtendedString() + ((build)?" (" + ExHost.class.getPackage().getSpecificationTitle() + ')':"") + ((args.length == 0)?"":",")); + " SubServers.Host v" + host.version.toExtendedString() + ((host.api.getAppBuild() != null)?" (" + host.api.getAppBuild() + ')':"")); if (args.length == 0) { host.log.message.println(""); new Thread(() -> { try { YAMLSection tags = new YAMLSection(new JSONObject("{\"tags\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags").openStream(), Charset.forName("UTF-8")))) + '}')); + List versions = new LinkedList(); Version updversion = host.version; int updcount = 0; - for (YAMLSection tag : tags.getSectionList("tags")) { - Version version = Version.fromString(tag.getString("ref").substring(10)); + for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10))); + Collections.sort(versions); + for (Version version : versions) { if (version.compareTo(updversion) > 0) { updversion = version; updcount++; diff --git a/SubServers.Sync/src/META-INF/MANIFEST.MF b/SubServers.Sync/src/META-INF/MANIFEST.MF index 3c8214c8..da7d5eb9 100644 --- a/SubServers.Sync/src/META-INF/MANIFEST.MF +++ b/SubServers.Sync/src/META-INF/MANIFEST.MF @@ -2,4 +2,3 @@ Manifest-Version: 1.0 Class-Path: BungeeCord.jar Waterfall.jar Main-Class: net.ME1312.SubServers.Sync.Launch Implementation-Title: SubServers.Sync -Specification-Title: 18w30bb diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubDataClient.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubDataClient.java index 940593d5..097d8d9a 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubDataClient.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubDataClient.java @@ -30,8 +30,8 @@ import java.util.concurrent.TimeUnit; * SubData Direct Client Class */ public final class SubDataClient { - private static HashMap, String> pOut = new HashMap, String>(); - private static HashMap> pIn = new HashMap>(); + private static HashMap, NamedContainer> pOut = new HashMap, NamedContainer>(); + private static HashMap>> pIn = new HashMap>>(); private static HashMap ciphers = new HashMap(); private static boolean defaults = false; private PrintWriter writer; @@ -113,35 +113,35 @@ public final class SubDataClient { } private void loadDefaults() { defaults = true; - registerPacket(new PacketAuthorization(plugin), "Authorization"); - registerPacket(new PacketCommandServer(), "SubCommandServer"); - registerPacket(new PacketCreateServer(), "SubCreateServer"); - registerPacket(new PacketDownloadHostInfo(), "SubDownloadHostInfo"); - registerPacket(new PacketDownloadLang(plugin), "SubDownloadLang"); - registerPacket(new PacketDownloadNetworkList(), "SubDownloadNetworkList"); - registerPacket(new PacketDownloadPlayerList(), "SubDownloadPlayerList"); - registerPacket(new PacketDownloadProxyInfo(), "SubDownloadProxyInfo"); - registerPacket(new PacketDownloadServerInfo(), "SubDownloadServerInfo"); - registerPacket(new PacketDownloadServerList(), "SubDownloadServerList"); - registerPacket(new PacketInRunEvent(), "SubRunEvent"); - registerPacket(new PacketInReset(), "SubReset"); - registerPacket(new PacketLinkProxy(plugin), "SubLinkProxy"); - registerPacket(new PacketStartServer(), "SubStartServer"); - registerPacket(new PacketStopServer(), "SubStopServer"); + registerPacket(new PacketAuthorization(plugin), "SubData", "Authorization"); + registerPacket(new PacketCommandServer(), "SubServers", "CommandServer"); + registerPacket(new PacketCreateServer(), "SubServers", "CreateServer"); + registerPacket(new PacketDownloadHostInfo(), "SubServers", "DownloadHostInfo"); + registerPacket(new PacketDownloadLang(plugin), "SubServers", "DownloadLang"); + registerPacket(new PacketDownloadNetworkList(), "SubServers", "DownloadNetworkList"); + registerPacket(new PacketDownloadPlayerList(), "SubServers", "DownloadPlayerList"); + registerPacket(new PacketDownloadProxyInfo(), "SubServers", "DownloadProxyInfo"); + registerPacket(new PacketDownloadServerInfo(), "SubServers", "DownloadServerInfo"); + registerPacket(new PacketDownloadServerList(), "SubServers", "DownloadServerList"); + registerPacket(new PacketInRunEvent(), "SubServers", "RunEvent"); + registerPacket(new PacketInReset(), "SubServers", "Reset"); + registerPacket(new PacketLinkProxy(plugin), "SubServers", "LinkProxy"); + registerPacket(new PacketStartServer(), "SubServers", "StartServer"); + registerPacket(new PacketStopServer(), "SubServers", "StopServer"); - registerPacket(PacketAuthorization.class, "Authorization"); - registerPacket(PacketCommandServer.class, "SubCommandServer"); - registerPacket(PacketCreateServer.class, "SubCreateServer"); - registerPacket(PacketDownloadHostInfo.class, "SubDownloadHostInfo"); - registerPacket(PacketDownloadLang.class, "SubDownloadLang"); - registerPacket(PacketDownloadNetworkList.class, "SubDownloadNetworkList"); - registerPacket(PacketDownloadPlayerList.class, "SubDownloadPlayerList"); - registerPacket(PacketDownloadProxyInfo.class, "SubDownloadProxyInfo"); - registerPacket(PacketDownloadServerInfo.class, "SubDownloadServerInfo"); - registerPacket(PacketDownloadServerList.class, "SubDownloadServerList"); - registerPacket(PacketLinkProxy.class, "SubLinkProxy"); - registerPacket(PacketStartServer.class, "SubStartServer"); - registerPacket(PacketStopServer.class, "SubStopServer"); + registerPacket(PacketAuthorization.class, "SubData", "Authorization"); + registerPacket(PacketCommandServer.class, "SubServers", "CommandServer"); + registerPacket(PacketCreateServer.class, "SubServers", "CreateServer"); + registerPacket(PacketDownloadHostInfo.class, "SubServers", "DownloadHostInfo"); + registerPacket(PacketDownloadLang.class, "SubServers", "DownloadLang"); + registerPacket(PacketDownloadNetworkList.class, "SubServers", "DownloadNetworkList"); + registerPacket(PacketDownloadPlayerList.class, "SubServers", "DownloadPlayerList"); + registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo"); + registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo"); + registerPacket(PacketDownloadServerList.class, "SubServers", "DownloadServerList"); + registerPacket(PacketLinkProxy.class, "SubServers", "LinkProxy"); + registerPacket(PacketStartServer.class, "SubServers", "StartServer"); + registerPacket(PacketStopServer.class, "SubServers", "StopServer"); } private void loop() { @@ -256,33 +256,40 @@ public final class SubDataClient { * Register PacketIn to the Network * * @param packet PacketIn to register + * @param channel Packet Channel * @param handle Handle to Bind */ - public static void registerPacket(PacketIn packet, String handle) { + public static void registerPacket(PacketIn packet, String channel, String handle) { if (Util.isNull(packet, handle)) throw new NullPointerException(); - List list = (pIn.keySet().contains(handle.toLowerCase()))?pIn.get(handle.toLowerCase()):new ArrayList(); + HashMap> map = (pIn.keySet().contains(channel.toLowerCase()))?pIn.get(channel.toLowerCase()):new HashMap>(); + List list = (map.keySet().contains(handle))?map.get(handle):new ArrayList(); if (!list.contains(packet)) { list.add(packet); - pIn.put(handle.toLowerCase(), list); + map.put(handle, list); + pIn.put(channel.toLowerCase(), map); } } /** * Unregister PacketIn from the Network * + * @param channel Packet Channel * @param packet PacketIn to unregister */ - public static void unregisterPacket(PacketIn packet) { + public static void unregisterPacket(String channel, PacketIn packet) { if (Util.isNull(packet)) throw new NullPointerException(); - List search = new ArrayList(); - search.addAll(pIn.keySet()); - for (String handle : search) if (pIn.get(handle.toLowerCase()).contains(packet)) { - List list = pIn.get(handle.toLowerCase()); - list.remove(packet); - if (list.isEmpty()) { - pIn.remove(handle.toLowerCase()); - } else { - pIn.put(handle.toLowerCase(), list); + if (pIn.keySet().contains(channel.toLowerCase())) { + List search = new ArrayList(); + search.addAll(pIn.get(channel.toLowerCase()).keySet()); + for (String handle : search) if (pIn.get(channel.toLowerCase()).get(handle).contains(packet)) { + List list = pIn.get(channel.toLowerCase()).get(handle); + list.remove(packet); + if (list.isEmpty()) { + pIn.get(channel.toLowerCase()).remove(handle); + if (pIn.get(channel.toLowerCase()).isEmpty()) pIn.remove(channel.toLowerCase()); + } else { + pIn.get(channel.toLowerCase()).put(handle, list); + } } } } @@ -291,32 +298,35 @@ public final class SubDataClient { * Register PacketOut to the Network * * @param packet PacketOut to register + * @param channel Packet Channel * @param handle Handle to bind */ - public static void registerPacket(Class packet, String handle) { + public static void registerPacket(Class packet, String channel, String handle) { if (Util.isNull(packet, handle)) throw new NullPointerException(); - pOut.put(packet, handle.toLowerCase()); + pOut.put(packet, new NamedContainer(channel.toLowerCase(), handle)); } /** * Unregister PacketOut to the Network * + * @param channel Packet Channel * @param packet PacketOut to unregister */ - public static void unregisterPacket(Class packet) { + public static void unregisterPacket(String channel, Class packet) { if (Util.isNull(packet)) throw new NullPointerException(); - pOut.remove(packet); + if (pOut.keySet().contains(packet) && pOut.get(packet).name().equalsIgnoreCase(channel)) pOut.remove(packet); } /** * Grab PacketIn Instances via handle * + * @param channel Packet Channel * @param handle Handle * @return PacketIn */ - public static List getPacket(String handle) { + public static List getPacket(String channel, String handle) { if (Util.isNull(handle)) throw new NullPointerException(); - return new ArrayList(pIn.get(handle.toLowerCase())); + return new ArrayList(pIn.get(channel.toLowerCase()).get(handle)); } /** @@ -382,7 +392,8 @@ public final class SubDataClient { try { YAMLSection contents = packet.generate(); - json.set("h", pOut.get(packet.getClass())); + json.set("n", pOut.get(packet.getClass()).name()); + json.set("h", pOut.get(packet.getClass()).get()); json.set("v", packet.getVersion().toString()); if (contents != null) json.set("c", contents); return json; @@ -401,10 +412,10 @@ public final class SubDataClient { */ private static List decodePacket(YAMLSection data) throws IllegalPacketException, InvocationTargetException { if (!data.contains("h") || !data.contains("v")) throw new IllegalPacketException("Unknown Packet Format: " + data.toString()); - if (!pIn.keySet().contains(data.getRawString("h"))) throw new IllegalPacketException("Unknown PacketIn Channel: " + data.getRawString("h")); + if (!pIn.keySet().contains(data.getRawString("n")) || !pIn.get(data.getRawString("n")).keySet().contains(data.getRawString("h"))) throw new IllegalPacketException("Unknown PacketIn Channel: " + data.getRawString("n") + ':' + data.getRawString("h")); List list = new ArrayList(); - for (PacketIn packet : pIn.get(data.getRawString("h"))) { + for (PacketIn packet : pIn.get(data.getRawString("n")).get(data.getRawString("h"))) { if (packet.isCompatible(new Version(data.getRawString("v")))) { list.add(packet); } else { diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubAPI.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubAPI.java index b0a14768..68bd3a72 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubAPI.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubAPI.java @@ -341,6 +341,15 @@ public final class SubAPI { return plugin.version; } + /** + * Gets the SubServers Build Signature + * + * @return SubServers Build Signature (or null if unsigned) + */ + public Version getWrapperBuild() { + return (SubPlugin.class.getPackage().getSpecificationTitle() != null)?new Version(SubPlugin.class.getPackage().getSpecificationTitle()):null; + } + /** * Gets the BungeeCord Version * diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java index 1177d651..2b58de72 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java @@ -71,28 +71,22 @@ public final class SubCommand extends CommandX { if (args[0].equalsIgnoreCase("help") || args[0].equalsIgnoreCase("?")) { sender.sendMessages(printHelp()); } else if (args[0].equalsIgnoreCase("version") || args[0].equalsIgnoreCase("ver")) { - boolean build = false; - try { - Field f = Version.class.getDeclaredField("type"); - f.setAccessible(true); - build = f.get(plugin.version) != VersionType.SNAPSHOT && SubPlugin.class.getPackage().getSpecificationTitle() != null; - f.setAccessible(false); - } catch (Exception e) {} - sender.sendMessage("SubServers > These are the platforms and versions that are running SubServers.Sync:"); sender.sendMessage(" " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") + ','); sender.sendMessage(" Java " + System.getProperty("java.version") + ','); sender.sendMessage(" " + plugin.getBungeeName() + ((plugin.isPatched)?" [Patched] ":" ") + net.md_5.bungee.Bootstrap.class.getPackage().getImplementationVersion() + ','); - sender.sendMessage(" SubServers.Sync v" + SubPlugin.version.toExtendedString() + ((build)?" (" + SubPlugin.class.getPackage().getSpecificationTitle() + ')':"")); + sender.sendMessage(" SubServers.Sync v" + SubPlugin.version.toExtendedString() + ((plugin.api.getWrapperBuild() != null)?" (" + plugin.api.getWrapperBuild() + ')':"")); sender.sendMessage(""); new Thread(() -> { try { YAMLSection tags = new YAMLSection(new Gson().fromJson("{\"tags\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags").openStream(), Charset.forName("UTF-8")))) + '}', Map.class)); + List versions = new LinkedList(); Version updversion = plugin.version; int updcount = 0; - for (YAMLSection tag : tags.getSectionList("tags")) { - Version version = Version.fromString(tag.getString("ref").substring(10)); + for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10))); + Collections.sort(versions); + for (Version version : versions) { if (version.compareTo(updversion) > 0) { updversion = version; updcount++; diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java index 4b5d5dd6..e6299c46 100644 --- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java +++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java @@ -49,8 +49,7 @@ public final class SubPlugin extends BungeeCord implements Listener { public boolean redis = false; public final SubAPI api = new SubAPI(this); public SubDataClient subdata = null; - //public static final Version version = Version.fromString("2.13b"); - public static final Version version = new Version(Version.fromString("2.13b"), VersionType.SNAPSHOT, (SubPlugin.class.getPackage().getSpecificationTitle() == null)?"custom":SubPlugin.class.getPackage().getSpecificationTitle()); // TODO Snapshot Version + public static final Version version = Version.fromString("2.13b"); public final boolean isPatched; public long lastReload = -1; @@ -135,11 +134,13 @@ public final class SubPlugin extends BungeeCord implements Listener { public void run() { try { YAMLSection tags = new YAMLSection(new Gson().fromJson("{\"tags\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://api.github.com/repos/ME1312/SubServers-2/git/refs/tags").openStream(), Charset.forName("UTF-8")))) + '}', Map.class)); + List versions = new LinkedList(); Version updversion = version; int updcount = 0; - for (YAMLSection tag : tags.getSectionList("tags")) { - Version version = Version.fromString(tag.getString("ref").substring(10)); + for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10))); + Collections.sort(versions); + for (Version version : versions) { if (version.compareTo(updversion) > 0) { updversion = version; updcount++;