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.
This commit is contained in:
ME1312 2018-07-29 14:39:42 -04:00
parent 98ac26750f
commit 97c73bf738
No known key found for this signature in database
GPG Key ID: FEFFE2F698E88FA8
22 changed files with 455 additions and 380 deletions

View File

@ -4,6 +4,7 @@ import com.google.gson.Gson;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection; import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection;
import net.ME1312.SubServers.Bungee.Library.Exception.IllegalPacketException; 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.Util;
import net.ME1312.SubServers.Bungee.Library.Version.Version; import net.ME1312.SubServers.Bungee.Library.Version.Version;
import net.ME1312.SubServers.Bungee.Network.Encryption.AES; import net.ME1312.SubServers.Bungee.Network.Encryption.AES;
@ -23,8 +24,8 @@ import java.util.regex.Pattern;
*/ */
public final class SubDataServer { public final class SubDataServer {
private static int MAX_QUEUE = 64; private static int MAX_QUEUE = 64;
private static HashMap<Class<? extends PacketOut>, String> pOut = new HashMap<Class<? extends PacketOut>, String>(); private static HashMap<Class<? extends PacketOut>, NamedContainer<String, String>> pOut = new HashMap<Class<? extends PacketOut>, NamedContainer<String, String>>();
private static HashMap<String, List<PacketIn>> pIn = new HashMap<String, List<PacketIn>>(); private static HashMap<String, HashMap<String, List<PacketIn>>> pIn = new HashMap<String, HashMap<String, List<PacketIn>>>();
private static HashMap<String, Cipher> ciphers = new HashMap<String, Cipher>(); private static HashMap<String, Cipher> ciphers = new HashMap<String, Cipher>();
private static List<String> allowedAddresses = new ArrayList<String>(); private static List<String> allowedAddresses = new ArrayList<String>();
private static boolean defaults = false; private static boolean defaults = false;
@ -81,58 +82,58 @@ public final class SubDataServer {
plugin.getPluginManager().registerListener(null, new PacketOutRunEvent(plugin)); plugin.getPluginManager().registerListener(null, new PacketOutRunEvent(plugin));
registerPacket(new PacketAuthorization(plugin), "Authorization"); registerPacket(new PacketAuthorization(plugin), "SubData", "Authorization");
registerPacket(new PacketCommandServer(plugin), "SubCommandServer"); registerPacket(new PacketCommandServer(plugin), "SubServers", "CommandServer");
registerPacket(new PacketCreateServer(plugin), "SubCreateServer"); registerPacket(new PacketCreateServer(plugin), "SubServers", "CreateServer");
registerPacket(new PacketDownloadHostInfo(plugin), "SubDownloadHostInfo"); registerPacket(new PacketDownloadHostInfo(plugin), "SubServers", "DownloadHostInfo");
registerPacket(new PacketDownloadLang(plugin), "SubDownloadLang"); registerPacket(new PacketDownloadLang(plugin), "SubServers", "DownloadLang");
registerPacket(new PacketDownloadNetworkList(plugin), "SubDownloadNetworkList"); registerPacket(new PacketDownloadNetworkList(plugin), "SubServers", "DownloadNetworkList");
registerPacket(new PacketDownloadPlayerList(plugin), "SubDownloadPlayerList"); registerPacket(new PacketDownloadPlayerList(plugin), "SubServers", "DownloadPlayerList");
registerPacket(new PacketDownloadProxyInfo(plugin), "SubDownloadProxyInfo"); registerPacket(new PacketDownloadProxyInfo(plugin), "SubServers", "DownloadProxyInfo");
registerPacket(new PacketDownloadServerInfo(plugin), "SubDownloadServerInfo"); registerPacket(new PacketDownloadServerInfo(plugin), "SubServers", "DownloadServerInfo");
registerPacket(new PacketDownloadServerList(plugin), "SubDownloadServerList"); registerPacket(new PacketDownloadServerList(plugin), "SubServers", "DownloadServerList");
registerPacket(new PacketEditServer(plugin), "SubEditServer"); registerPacket(new PacketEditServer(plugin), "SubServers", "EditServer");
registerPacket(new PacketExAddServer(), "SubExAddServer"); registerPacket(new PacketExAddServer(), "SubServers", "ExAddServer");
registerPacket(new PacketExConfigureHost(plugin), "SubExConfigureHost"); registerPacket(new PacketExConfigureHost(plugin), "SubServers", "ExConfigureHost");
registerPacket(new PacketExCreateServer(null), "SubExCreateServer"); registerPacket(new PacketExCreateServer(null), "SubServers", "ExCreateServer");
registerPacket(new PacketExDeleteServer(), "SubExDeleteServer"); registerPacket(new PacketExDeleteServer(), "SubServers", "ExDeleteServer");
registerPacket(new PacketExRemoveServer(), "SubExRemoveServer"); registerPacket(new PacketExRemoveServer(), "SubServers", "ExRemoveServer");
registerPacket(new PacketExUpdateServer(plugin), "SubExUpdateServer"); registerPacket(new PacketExUpdateServer(plugin), "SubServers", "ExUpdateServer");
registerPacket(new PacketInExLogMessage(), "SubExLogMessage"); registerPacket(new PacketInExLogMessage(), "SubServers", "ExLogMessage");
registerPacket(new PacketInExRequestQueue(plugin), "SubExRequestQueue"); registerPacket(new PacketInExRequestQueue(plugin), "SubServers", "ExRequestQueue");
registerPacket(new PacketLinkExHost(plugin), "SubLinkExHost"); registerPacket(new PacketLinkExHost(plugin), "SubServers", "LinkExHost");
registerPacket(new PacketLinkProxy(plugin), "SubLinkProxy"); registerPacket(new PacketLinkProxy(plugin), "SubServers", "LinkProxy");
registerPacket(new PacketLinkServer(plugin), "SubLinkServer"); registerPacket(new PacketLinkServer(plugin), "SubServers", "LinkServer");
registerPacket(new PacketListenLog(plugin), "SubListenLog"); registerPacket(new PacketListenLog(plugin), "SubServers", "ListenLog");
registerPacket(new PacketStartServer(plugin), "SubStartServer"); registerPacket(new PacketStartServer(plugin), "SubServers", "StartServer");
registerPacket(new PacketStopServer(plugin), "SubStopServer"); registerPacket(new PacketStopServer(plugin), "SubServers", "StopServer");
registerPacket(PacketAuthorization.class, "Authorization"); registerPacket(PacketAuthorization.class, "SubData", "Authorization");
registerPacket(PacketCommandServer.class, "SubCommandServer"); registerPacket(PacketCommandServer.class, "SubServers", "CommandServer");
registerPacket(PacketCreateServer.class, "SubCreateServer"); registerPacket(PacketCreateServer.class, "SubServers", "CreateServer");
registerPacket(PacketDownloadHostInfo.class, "SubDownloadHostInfo"); registerPacket(PacketDownloadHostInfo.class, "SubServers", "DownloadHostInfo");
registerPacket(PacketDownloadLang.class, "SubDownloadLang"); registerPacket(PacketDownloadLang.class, "SubServers", "DownloadLang");
registerPacket(PacketDownloadNetworkList.class, "SubDownloadNetworkList"); registerPacket(PacketDownloadNetworkList.class, "SubServers", "DownloadNetworkList");
registerPacket(PacketDownloadPlayerList.class, "SubDownloadPlayerList"); registerPacket(PacketDownloadPlayerList.class, "SubServers", "DownloadPlayerList");
registerPacket(PacketDownloadProxyInfo.class, "SubDownloadProxyInfo"); registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo");
registerPacket(PacketDownloadServerInfo.class, "SubDownloadServerInfo"); registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo");
registerPacket(PacketDownloadServerList.class, "SubDownloadServerList"); registerPacket(PacketDownloadServerList.class, "SubServers", "DownloadServerList");
registerPacket(PacketEditServer.class, "SubEditServer"); registerPacket(PacketEditServer.class, "SubServers", "EditServer");
registerPacket(PacketExAddServer.class, "SubExAddServer"); registerPacket(PacketExAddServer.class, "SubServers", "ExAddServer");
registerPacket(PacketExConfigureHost.class, "SubExConfigureHost"); registerPacket(PacketExConfigureHost.class, "SubServers", "ExConfigureHost");
registerPacket(PacketExCreateServer.class, "SubExCreateServer"); registerPacket(PacketExCreateServer.class, "SubServers", "ExCreateServer");
registerPacket(PacketExDeleteServer.class, "SubExDeleteServer"); registerPacket(PacketExDeleteServer.class, "SubServers", "ExDeleteServer");
registerPacket(PacketExRemoveServer.class, "SubExRemoveServer"); registerPacket(PacketExRemoveServer.class, "SubServers", "ExRemoveServer");
registerPacket(PacketExUpdateServer.class, "SubExUpdateServer"); registerPacket(PacketExUpdateServer.class, "SubServers", "ExUpdateServer");
registerPacket(PacketLinkExHost.class, "SubLinkExHost"); registerPacket(PacketLinkExHost.class, "SubServers", "LinkExHost");
registerPacket(PacketLinkProxy.class, "SubLinkProxy"); registerPacket(PacketLinkProxy.class, "SubServers", "LinkProxy");
registerPacket(PacketLinkServer.class, "SubLinkServer"); registerPacket(PacketLinkServer.class, "SubServers", "LinkServer");
registerPacket(PacketListenLog.class, "SubListenLog"); registerPacket(PacketListenLog.class, "SubServers", "ListenLog");
registerPacket(PacketOutRunEvent.class, "SubRunEvent"); registerPacket(PacketOutRunEvent.class, "SubServers", "RunEvent");
registerPacket(PacketOutReload.class, "SubReload"); registerPacket(PacketOutReload.class, "SubServers", "Reload");
registerPacket(PacketOutReset.class, "SubReset"); registerPacket(PacketOutReset.class, "SubServers", "Reset");
registerPacket(PacketStartServer.class, "SubStartServer"); registerPacket(PacketStartServer.class, "SubServers", "StartServer");
registerPacket(PacketStopServer.class, "SubStopServer"); registerPacket(PacketStopServer.class, "SubServers", "StopServer");
} }
/** /**
@ -298,33 +299,40 @@ public final class SubDataServer {
* Register PacketIn to the Network * Register PacketIn to the Network
* *
* @param packet PacketIn to register * @param packet PacketIn to register
* @param channel Packet Channel
* @param handle Handle to Bind * @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(); if (Util.isNull(packet, handle)) throw new NullPointerException();
List<PacketIn> list = (pIn.keySet().contains(handle.toLowerCase()))?pIn.get(handle.toLowerCase()):new ArrayList<PacketIn>(); HashMap<String, List<PacketIn>> map = (pIn.keySet().contains(channel.toLowerCase()))?pIn.get(channel.toLowerCase()):new HashMap<String, List<PacketIn>>();
List<PacketIn> list = (map.keySet().contains(handle))?map.get(handle):new ArrayList<PacketIn>();
if (!list.contains(packet)) { if (!list.contains(packet)) {
list.add(packet); list.add(packet);
pIn.put(handle.toLowerCase(), list); map.put(handle, list);
pIn.put(channel.toLowerCase(), map);
} }
} }
/** /**
* Unregister PacketIn from the Network * Unregister PacketIn from the Network
* *
* @param channel Packet Channel
* @param packet PacketIn to unregister * @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(); if (Util.isNull(packet)) throw new NullPointerException();
List<String> search = new ArrayList<String>(); if (pIn.keySet().contains(channel.toLowerCase())) {
search.addAll(pIn.keySet()); List<String> search = new ArrayList<String>();
for (String handle : search) if (pIn.get(handle.toLowerCase()).contains(packet)) { search.addAll(pIn.get(channel.toLowerCase()).keySet());
List<PacketIn> list = pIn.get(handle.toLowerCase()); for (String handle : search) if (pIn.get(channel.toLowerCase()).get(handle).contains(packet)) {
list.remove(packet); List<PacketIn> list = pIn.get(channel.toLowerCase()).get(handle);
if (list.isEmpty()) { list.remove(packet);
pIn.remove(handle.toLowerCase()); if (list.isEmpty()) {
} else { pIn.get(channel.toLowerCase()).remove(handle);
pIn.put(handle.toLowerCase(), list); 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 * Register PacketOut to the Network
* *
* @param packet PacketOut to register * @param packet PacketOut to register
* @param channel Packet Channel
* @param handle Handle to bind * @param handle Handle to bind
*/ */
public static void registerPacket(Class<? extends PacketOut> packet, String handle) { public static void registerPacket(Class<? extends PacketOut> packet, String channel, String handle) {
if (Util.isNull(packet, handle)) throw new NullPointerException(); if (Util.isNull(packet, handle)) throw new NullPointerException();
pOut.put(packet, handle.toLowerCase()); pOut.put(packet, new NamedContainer<String, String>(channel.toLowerCase(), handle));
} }
/** /**
* Unregister PacketOut to the Network * Unregister PacketOut to the Network
* *
* @param channel Packet Channel
* @param packet PacketOut to unregister * @param packet PacketOut to unregister
*/ */
public static void unregisterPacket(Class<? extends PacketOut> packet) { public static void unregisterPacket(String channel, Class<? extends PacketOut> packet) {
if (Util.isNull(packet)) throw new NullPointerException(); 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 * Grab PacketIn Instances via handle
* *
* @param channel Packet Channel
* @param handle Handle * @param handle Handle
* @return PacketIn * @return PacketIn
*/ */
public static List<? extends PacketIn> getPacket(String handle) { public static List<? extends PacketIn> getPacket(String channel, String handle) {
if (Util.isNull(handle)) throw new NullPointerException(); if (Util.isNull(handle)) throw new NullPointerException();
return new ArrayList<PacketIn>(pIn.get(handle.toLowerCase())); return new ArrayList<PacketIn>(pIn.get(channel.toLowerCase()).get(handle));
} }
/** /**
@ -428,7 +439,8 @@ public final class SubDataServer {
try { try {
YAMLSection contents = packet.generate(); 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()); section.set("v", packet.getVersion().toString());
if (contents != null) section.set("c", contents); if (contents != null) section.set("c", contents);
return section; return section;
@ -445,11 +457,11 @@ public final class SubDataServer {
* @throws IllegalPacketException * @throws IllegalPacketException
*/ */
protected static List<PacketIn> decodePacket(Client client, YAMLSection data) throws IllegalPacketException { protected static List<PacketIn> 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 (!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("h"))) throw new IllegalPacketException(client.getAddress().toString() + ": 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<PacketIn> list = new ArrayList<PacketIn>(); List<PacketIn> list = new ArrayList<PacketIn>();
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")))) { if (packet.isCompatible(new Version(data.getRawString("v")))) {
list.add(packet); list.add(packet);
} else { } else {

View File

@ -659,6 +659,15 @@ public final class SubAPI {
return plugin.version; 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 * Gets the BungeeCord Version
* *

View File

@ -71,28 +71,22 @@ public final class SubCommand extends CommandX {
if (args[0].equalsIgnoreCase("help") || args[0].equalsIgnoreCase("?")) { if (args[0].equalsIgnoreCase("help") || args[0].equalsIgnoreCase("?")) {
sender.sendMessages(printHelp()); sender.sendMessages(printHelp());
} else if (args[0].equalsIgnoreCase("version") || args[0].equalsIgnoreCase("ver")) { } 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("SubServers > These are the platforms and versions that are running SubServers.Bungee:");
sender.sendMessage(" " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") + ','); sender.sendMessage(" " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") + ',');
sender.sendMessage(" Java " + System.getProperty("java.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(" " + 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(""); sender.sendMessage("");
new Thread(() -> { new Thread(() -> {
try { 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)); 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<Version> versions = new LinkedList<Version>();
Version updversion = plugin.version; Version updversion = plugin.version;
int updcount = 0; int updcount = 0;
for (YAMLSection tag : tags.getSectionList("tags")) { for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10)));
Version version = Version.fromString(tag.getString("ref").substring(10)); Collections.sort(versions);
for (Version version : versions) {
if (version.compareTo(updversion) > 0) { if (version.compareTo(updversion) > 0) {
updversion = version; updversion = version;
updcount++; updcount++;

View File

@ -58,8 +58,7 @@ public final class SubPlugin extends BungeeCord implements Listener {
public final SubAPI api = new SubAPI(this); public final SubAPI api = new SubAPI(this);
public SubDataServer subdata = null; public SubDataServer subdata = null;
public SubServer sudo = null; public SubServer sudo = null;
//public static final Version version = Version.fromString("2.13b"); 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 boolean redis = false; public boolean redis = false;
public boolean canSudo = false; public boolean canSudo = false;

View File

@ -27,8 +27,8 @@ import java.util.*;
* SubData Direct Client Class * SubData Direct Client Class
*/ */
public final class SubDataClient { public final class SubDataClient {
private static HashMap<Class<? extends PacketOut>, String> pOut = new HashMap<Class<? extends PacketOut>, String>(); private static HashMap<Class<? extends PacketOut>, NamedContainer<String, String>> pOut = new HashMap<Class<? extends PacketOut>, NamedContainer<String, String>>();
private static HashMap<String, List<PacketIn>> pIn = new HashMap<String, List<PacketIn>>(); private static HashMap<String, HashMap<String, List<PacketIn>>> pIn = new HashMap<String, HashMap<String, List<PacketIn>>>();
private static HashMap<String, Cipher> ciphers = new HashMap<String, Cipher>(); private static HashMap<String, Cipher> ciphers = new HashMap<String, Cipher>();
private static boolean defaults = false; private static boolean defaults = false;
private PrintWriter writer; private PrintWriter writer;
@ -95,36 +95,36 @@ public final class SubDataClient {
} private void loadDefaults() { } private void loadDefaults() {
defaults = true; defaults = true;
registerPacket(new PacketAuthorization(plugin), "Authorization"); registerPacket(new PacketAuthorization(plugin), "SubData", "Authorization");
registerPacket(new PacketCommandServer(), "SubCommandServer"); registerPacket(new PacketCommandServer(), "SubServers", "CommandServer");
registerPacket(new PacketCreateServer(), "SubCreateServer"); registerPacket(new PacketCreateServer(), "SubServers", "CreateServer");
registerPacket(new PacketDownloadHostInfo(), "SubDownloadHostInfo"); registerPacket(new PacketDownloadHostInfo(), "SubServers", "DownloadHostInfo");
registerPacket(new PacketDownloadLang(plugin), "SubDownloadLang"); registerPacket(new PacketDownloadLang(plugin), "SubServers", "DownloadLang");
registerPacket(new PacketDownloadNetworkList(), "SubDownloadNetworkList"); registerPacket(new PacketDownloadNetworkList(), "SubServers", "DownloadNetworkList");
registerPacket(new PacketDownloadPlayerList(), "SubDownloadPlayerList"); registerPacket(new PacketDownloadPlayerList(), "SubServers", "DownloadPlayerList");
registerPacket(new PacketDownloadProxyInfo(), "SubDownloadProxyInfo"); registerPacket(new PacketDownloadProxyInfo(), "SubServers", "DownloadProxyInfo");
registerPacket(new PacketDownloadServerInfo(), "SubDownloadServerInfo"); registerPacket(new PacketDownloadServerInfo(), "SubServers", "DownloadServerInfo");
registerPacket(new PacketDownloadServerList(), "SubDownloadServerList"); registerPacket(new PacketDownloadServerList(), "SubServers", "DownloadServerList");
registerPacket(new PacketInRunEvent(plugin), "SubRunEvent"); registerPacket(new PacketInRunEvent(plugin), "SubServers", "RunEvent");
registerPacket(new PacketInReload(plugin), "SubReload"); registerPacket(new PacketInReload(plugin), "SubServers", "Reload");
registerPacket(new PacketInReset(), "SubReset"); registerPacket(new PacketInReset(), "SubServers", "Reset");
registerPacket(new PacketLinkServer(plugin), "SubLinkServer"); registerPacket(new PacketLinkServer(plugin), "SubServers", "LinkServer");
registerPacket(new PacketStartServer(), "SubStartServer"); registerPacket(new PacketStartServer(), "SubServers", "StartServer");
registerPacket(new PacketStopServer(), "SubStopServer"); registerPacket(new PacketStopServer(), "SubServers", "StopServer");
registerPacket(PacketAuthorization.class, "Authorization"); registerPacket(PacketAuthorization.class, "SubData", "Authorization");
registerPacket(PacketCommandServer.class, "SubCommandServer"); registerPacket(PacketCommandServer.class, "SubServers", "CommandServer");
registerPacket(PacketCreateServer.class, "SubCreateServer"); registerPacket(PacketCreateServer.class, "SubServers", "CreateServer");
registerPacket(PacketDownloadHostInfo.class, "SubDownloadHostInfo"); registerPacket(PacketDownloadHostInfo.class, "SubServers", "DownloadHostInfo");
registerPacket(PacketDownloadLang.class, "SubDownloadLang"); registerPacket(PacketDownloadLang.class, "SubServers", "DownloadLang");
registerPacket(PacketDownloadNetworkList.class, "SubDownloadNetworkList"); registerPacket(PacketDownloadNetworkList.class, "SubServers", "DownloadNetworkList");
registerPacket(PacketDownloadPlayerList.class, "SubDownloadPlayerList"); registerPacket(PacketDownloadPlayerList.class, "SubServers", "DownloadPlayerList");
registerPacket(PacketDownloadProxyInfo.class, "SubDownloadProxyInfo"); registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo");
registerPacket(PacketDownloadServerInfo.class, "SubDownloadServerInfo"); registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo");
registerPacket(PacketDownloadServerList.class, "SubDownloadServerList"); registerPacket(PacketDownloadServerList.class, "SubServers", "DownloadServerList");
registerPacket(PacketLinkServer.class, "SubLinkServer"); registerPacket(PacketLinkServer.class, "SubServers", "LinkServer");
registerPacket(PacketStartServer.class, "SubStartServer"); registerPacket(PacketStartServer.class, "SubServers", "StartServer");
registerPacket(PacketStopServer.class, "SubStopServer"); registerPacket(PacketStopServer.class, "SubServers", "StopServer");
} }
private void loop() { private void loop() {
@ -230,33 +230,40 @@ public final class SubDataClient {
* Register PacketIn to the Network * Register PacketIn to the Network
* *
* @param packet PacketIn to register * @param packet PacketIn to register
* @param channel Packet Channel
* @param handle Handle to Bind * @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(); if (Util.isNull(packet, handle)) throw new NullPointerException();
List<PacketIn> list = (pIn.keySet().contains(handle.toLowerCase()))?pIn.get(handle.toLowerCase()):new ArrayList<PacketIn>(); HashMap<String, List<PacketIn>> map = (pIn.keySet().contains(channel.toLowerCase()))?pIn.get(channel.toLowerCase()):new HashMap<String, List<PacketIn>>();
List<PacketIn> list = (map.keySet().contains(handle))?map.get(handle):new ArrayList<PacketIn>();
if (!list.contains(packet)) { if (!list.contains(packet)) {
list.add(packet); list.add(packet);
pIn.put(handle.toLowerCase(), list); map.put(handle, list);
pIn.put(channel.toLowerCase(), map);
} }
} }
/** /**
* Unregister PacketIn from the Network * Unregister PacketIn from the Network
* *
* @param channel Packet Channel
* @param packet PacketIn to unregister * @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(); if (Util.isNull(packet)) throw new NullPointerException();
List<String> search = new ArrayList<String>(); if (pIn.keySet().contains(channel.toLowerCase())) {
search.addAll(pIn.keySet()); List<String> search = new ArrayList<String>();
for (String handle : search) if (pIn.get(handle.toLowerCase()).contains(packet)) { search.addAll(pIn.get(channel.toLowerCase()).keySet());
List<PacketIn> list = pIn.get(handle.toLowerCase()); for (String handle : search) if (pIn.get(channel.toLowerCase()).get(handle).contains(packet)) {
list.remove(packet); List<PacketIn> list = pIn.get(channel.toLowerCase()).get(handle);
if (list.isEmpty()) { list.remove(packet);
pIn.remove(handle.toLowerCase()); if (list.isEmpty()) {
} else { pIn.get(channel.toLowerCase()).remove(handle);
pIn.put(handle.toLowerCase(), list); 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 * Register PacketOut to the Network
* *
* @param packet PacketOut to register * @param packet PacketOut to register
* @param channel Packet Channel
* @param handle Handle to bind * @param handle Handle to bind
*/ */
public static void registerPacket(Class<? extends PacketOut> packet, String handle) { public static void registerPacket(Class<? extends PacketOut> packet, String channel, String handle) {
if (Util.isNull(packet, handle)) throw new NullPointerException(); if (Util.isNull(packet, handle)) throw new NullPointerException();
pOut.put(packet, handle.toLowerCase()); pOut.put(packet, new NamedContainer<String, String>(channel.toLowerCase(), handle));
} }
/** /**
* Unregister PacketOut to the Network * Unregister PacketOut to the Network
* *
* @param channel Packet Channel
* @param packet PacketOut to unregister * @param packet PacketOut to unregister
*/ */
public static void unregisterPacket(Class<? extends PacketOut> packet) { public static void unregisterPacket(String channel, Class<? extends PacketOut> packet) {
if (Util.isNull(packet)) throw new NullPointerException(); 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 * Grab PacketIn Instances via handle
* *
* @param channel Packet Channel
* @param handle Handle * @param handle Handle
* @return PacketIn * @return PacketIn
*/ */
public static List<? extends PacketIn> getPacket(String handle) { public static List<? extends PacketIn> getPacket(String channel, String handle) {
if (Util.isNull(handle)) throw new NullPointerException(); if (Util.isNull(handle)) throw new NullPointerException();
return new ArrayList<PacketIn>(pIn.get(handle.toLowerCase())); return new ArrayList<PacketIn>(pIn.get(channel.toLowerCase()).get(handle));
} }
/** /**
@ -356,7 +366,8 @@ public final class SubDataClient {
try { try {
YAMLSection contents = packet.generate(); 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()); data.set("v", packet.getVersion().toString());
if (contents != null) data.set("c", contents); if (contents != null) data.set("c", contents);
return data; return data;
@ -374,11 +385,11 @@ public final class SubDataClient {
* @throws InvocationTargetException * @throws InvocationTargetException
*/ */
private static List<PacketIn> decodePacket(YAMLSection data) throws IllegalPacketException, InvocationTargetException { private static List<PacketIn> decodePacket(YAMLSection data) throws IllegalPacketException, InvocationTargetException {
if (!data.contains("h") || !data.contains("v")) throw new IllegalPacketException("Unknown Packet Format: " + data.toString()); if (!data.contains("n") || !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<PacketIn> list = new ArrayList<PacketIn>(); List<PacketIn> list = new ArrayList<PacketIn>();
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")))) { if (packet.isCompatible(new Version(data.getRawString("v")))) {
list.add(packet); list.add(packet);
} else { } else {

View File

@ -353,6 +353,15 @@ public final class SubAPI {
return plugin.version; 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 * Gets the Server Version
* *

View File

@ -53,28 +53,22 @@ public final class SubCommand implements CommandExecutor {
if (args[0].equalsIgnoreCase("help") || args[0].equalsIgnoreCase("?")) { if (args[0].equalsIgnoreCase("help") || args[0].equalsIgnoreCase("?")) {
sender.sendMessage(printHelp(label)); sender.sendMessage(printHelp(label));
} else if (args[0].equalsIgnoreCase("version") || args[0].equalsIgnoreCase("ver")) { } 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(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 + " " + 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 + " Java " + System.getProperty("java.version") + ChatColor.RESET + ',');
sender.sendMessage(ChatColor.WHITE + " " + Bukkit.getName() + ' ' + Bukkit.getVersion() + 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(""); sender.sendMessage("");
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
try { 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)); 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<Version> versions = new LinkedList<Version>();
Version updversion = plugin.version; Version updversion = plugin.version;
int updcount = 0; int updcount = 0;
for (YAMLSection tag : tags.getSectionList("tags")) { for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10)));
Version version = Version.fromString(tag.getString("ref").substring(10)); Collections.sort(versions);
for (Version version : versions) {
if (version.compareTo(updversion) > 0) { if (version.compareTo(updversion) > 0) {
updversion = version; updversion = version;
updcount++; updcount++;

View File

@ -28,6 +28,8 @@ import java.net.URL;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -46,8 +48,7 @@ public final class SubPlugin extends JavaPlugin {
public SubPlugin() { public SubPlugin() {
super(); super();
//version = Version.fromString(getDescription().getVersion()); 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
} }
/** /**
@ -95,11 +96,13 @@ public final class SubPlugin extends JavaPlugin {
Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> { Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> {
try { 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)); 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<Version> versions = new LinkedList<Version>();
Version updversion = version; Version updversion = version;
int updcount = 0; int updcount = 0;
for (YAMLSection tag : tags.getSectionList("tags")) { for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10)));
Version version = Version.fromString(tag.getString("ref").substring(10)); Collections.sort(versions);
for (Version version : versions) {
if (version.compareTo(updversion) > 0) { if (version.compareTo(updversion) > 0) {
updversion = version; updversion = version;
updcount++; updcount++;

View File

@ -30,8 +30,8 @@ import java.util.concurrent.TimeUnit;
* SubData Direct Client Class * SubData Direct Client Class
*/ */
public final class SubDataClient { public final class SubDataClient {
private static HashMap<Class<? extends PacketOut>, String> pOut = new HashMap<Class<? extends PacketOut>, String>(); private static HashMap<Class<? extends PacketOut>, NamedContainer<String, String>> pOut = new HashMap<Class<? extends PacketOut>, NamedContainer<String, String>>();
private static HashMap<String, List<PacketIn>> pIn = new HashMap<String, List<PacketIn>>(); private static HashMap<String, HashMap<String, List<PacketIn>>> pIn = new HashMap<String, HashMap<String, List<PacketIn>>>();
private static HashMap<String, Cipher> ciphers = new HashMap<String, Cipher>(); private static HashMap<String, Cipher> ciphers = new HashMap<String, Cipher>();
private static boolean defaults = false; private static boolean defaults = false;
protected static Logger log; protected static Logger log;
@ -100,36 +100,36 @@ public final class SubDataClient {
defaults = true; defaults = true;
log = LoggerFactory.getLogger("SubData"); log = LoggerFactory.getLogger("SubData");
registerPacket(new PacketAuthorization(plugin), "Authorization"); registerPacket(new PacketAuthorization(plugin), "SubData", "Authorization");
registerPacket(new PacketCommandServer(), "SubCommandServer"); registerPacket(new PacketCommandServer(), "SubServers", "CommandServer");
registerPacket(new PacketCreateServer(), "SubCreateServer"); registerPacket(new PacketCreateServer(), "SubServers", "CreateServer");
registerPacket(new PacketDownloadHostInfo(), "SubDownloadHostInfo"); registerPacket(new PacketDownloadHostInfo(), "SubServers", "DownloadHostInfo");
registerPacket(new PacketDownloadLang(plugin), "SubDownloadLang"); registerPacket(new PacketDownloadLang(plugin), "SubServers", "DownloadLang");
registerPacket(new PacketDownloadNetworkList(), "SubDownloadNetworkList"); registerPacket(new PacketDownloadNetworkList(), "SubServers", "DownloadNetworkList");
registerPacket(new PacketDownloadPlayerList(), "SubDownloadPlayerList"); registerPacket(new PacketDownloadPlayerList(), "SubServers", "DownloadPlayerList");
registerPacket(new PacketDownloadProxyInfo(), "SubDownloadProxyInfo"); registerPacket(new PacketDownloadProxyInfo(), "SubServers", "DownloadProxyInfo");
registerPacket(new PacketDownloadServerInfo(), "SubDownloadServerInfo"); registerPacket(new PacketDownloadServerInfo(), "SubServers", "DownloadServerInfo");
registerPacket(new PacketDownloadServerList(), "SubDownloadServerList"); registerPacket(new PacketDownloadServerList(), "SubServers", "DownloadServerList");
registerPacket(new PacketInRunEvent(plugin), "SubRunEvent"); registerPacket(new PacketInRunEvent(plugin), "SubServers", "RunEvent");
registerPacket(new PacketInReload(plugin), "SubReload"); registerPacket(new PacketInReload(plugin), "SubServers", "Reload");
registerPacket(new PacketInReset(), "SubReset"); registerPacket(new PacketInReset(), "SubServers", "Reset");
registerPacket(new PacketLinkServer(plugin), "SubLinkServer"); registerPacket(new PacketLinkServer(plugin), "SubServers", "LinkServer");
registerPacket(new PacketStartServer(), "SubStartServer"); registerPacket(new PacketStartServer(), "SubServers", "StartServer");
registerPacket(new PacketStopServer(), "SubStopServer"); registerPacket(new PacketStopServer(), "SubServers", "StopServer");
registerPacket(PacketAuthorization.class, "Authorization"); registerPacket(PacketAuthorization.class, "SubData", "Authorization");
registerPacket(PacketCommandServer.class, "SubCommandServer"); registerPacket(PacketCommandServer.class, "SubServers", "CommandServer");
registerPacket(PacketCreateServer.class, "SubCreateServer"); registerPacket(PacketCreateServer.class, "SubServers", "CreateServer");
registerPacket(PacketDownloadHostInfo.class, "SubDownloadHostInfo"); registerPacket(PacketDownloadHostInfo.class, "SubServers", "DownloadHostInfo");
registerPacket(PacketDownloadLang.class, "SubDownloadLang"); registerPacket(PacketDownloadLang.class, "SubServers", "DownloadLang");
registerPacket(PacketDownloadNetworkList.class, "SubDownloadNetworkList"); registerPacket(PacketDownloadNetworkList.class, "SubServers", "DownloadNetworkList");
registerPacket(PacketDownloadPlayerList.class, "SubDownloadPlayerList"); registerPacket(PacketDownloadPlayerList.class, "SubServers", "DownloadPlayerList");
registerPacket(PacketDownloadProxyInfo.class, "SubDownloadProxyInfo"); registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo");
registerPacket(PacketDownloadServerInfo.class, "SubDownloadServerInfo"); registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo");
registerPacket(PacketDownloadServerList.class, "SubDownloadServerList"); registerPacket(PacketDownloadServerList.class, "SubServers", "DownloadServerList");
registerPacket(PacketLinkServer.class, "SubLinkServer"); registerPacket(PacketLinkServer.class, "SubServers", "LinkServer");
registerPacket(PacketStartServer.class, "SubStartServer"); registerPacket(PacketStartServer.class, "SubServers", "StartServer");
registerPacket(PacketStopServer.class, "SubStopServer"); registerPacket(PacketStopServer.class, "SubServers", "StopServer");
} }
private void loop() { private void loop() {
@ -235,33 +235,40 @@ public final class SubDataClient {
* Register PacketIn to the Network * Register PacketIn to the Network
* *
* @param packet PacketIn to register * @param packet PacketIn to register
* @param channel Packet Channel
* @param handle Handle to Bind * @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(); if (Util.isNull(packet, handle)) throw new NullPointerException();
List<PacketIn> list = (pIn.keySet().contains(handle.toLowerCase()))?pIn.get(handle.toLowerCase()):new ArrayList<PacketIn>(); HashMap<String, List<PacketIn>> map = (pIn.keySet().contains(channel.toLowerCase()))?pIn.get(channel.toLowerCase()):new HashMap<String, List<PacketIn>>();
List<PacketIn> list = (map.keySet().contains(handle))?map.get(handle):new ArrayList<PacketIn>();
if (!list.contains(packet)) { if (!list.contains(packet)) {
list.add(packet); list.add(packet);
pIn.put(handle.toLowerCase(), list); map.put(handle, list);
pIn.put(channel.toLowerCase(), map);
} }
} }
/** /**
* Unregister PacketIn from the Network * Unregister PacketIn from the Network
* *
* @param channel Packet Channel
* @param packet PacketIn to unregister * @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(); if (Util.isNull(packet)) throw new NullPointerException();
List<String> search = new ArrayList<String>(); if (pIn.keySet().contains(channel.toLowerCase())) {
search.addAll(pIn.keySet()); List<String> search = new ArrayList<String>();
for (String handle : search) if (pIn.get(handle.toLowerCase()).contains(packet)) { search.addAll(pIn.get(channel.toLowerCase()).keySet());
List<PacketIn> list = pIn.get(handle.toLowerCase()); for (String handle : search) if (pIn.get(channel.toLowerCase()).get(handle).contains(packet)) {
list.remove(packet); List<PacketIn> list = pIn.get(channel.toLowerCase()).get(handle);
if (list.isEmpty()) { list.remove(packet);
pIn.remove(handle.toLowerCase()); if (list.isEmpty()) {
} else { pIn.get(channel.toLowerCase()).remove(handle);
pIn.put(handle.toLowerCase(), list); 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 * Register PacketOut to the Network
* *
* @param packet PacketOut to register * @param packet PacketOut to register
* @param channel Packet Channel
* @param handle Handle to bind * @param handle Handle to bind
*/ */
public static void registerPacket(Class<? extends PacketOut> packet, String handle) { public static void registerPacket(Class<? extends PacketOut> packet, String channel, String handle) {
if (Util.isNull(packet, handle)) throw new NullPointerException(); if (Util.isNull(packet, handle)) throw new NullPointerException();
pOut.put(packet, handle.toLowerCase()); pOut.put(packet, new NamedContainer<String, String>(channel.toLowerCase(), handle));
} }
/** /**
* Unregister PacketOut to the Network * Unregister PacketOut to the Network
* *
* @param channel Packet Channel
* @param packet PacketOut to unregister * @param packet PacketOut to unregister
*/ */
public static void unregisterPacket(Class<? extends PacketOut> packet) { public static void unregisterPacket(String channel, Class<? extends PacketOut> packet) {
if (Util.isNull(packet)) throw new NullPointerException(); 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 * Grab PacketIn Instances via handle
* *
* @param channel Packet Channel
* @param handle Handle * @param handle Handle
* @return PacketIn * @return PacketIn
*/ */
public static List<? extends PacketIn> getPacket(String handle) { public static List<? extends PacketIn> getPacket(String channel, String handle) {
if (Util.isNull(handle)) throw new NullPointerException(); if (Util.isNull(handle)) throw new NullPointerException();
return new ArrayList<PacketIn>(pIn.get(handle.toLowerCase())); return new ArrayList<PacketIn>(pIn.get(channel.toLowerCase()).get(handle));
} }
/** /**
@ -361,7 +371,8 @@ public final class SubDataClient {
try { try {
YAMLSection contents = packet.generate(); 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()); data.set("v", packet.getVersion().toString());
if (contents != null) data.set("c", contents); if (contents != null) data.set("c", contents);
return data; return data;
@ -379,11 +390,11 @@ public final class SubDataClient {
* @throws InvocationTargetException * @throws InvocationTargetException
*/ */
private static List<PacketIn> decodePacket(YAMLSection data) throws IllegalPacketException, InvocationTargetException { private static List<PacketIn> decodePacket(YAMLSection data) throws IllegalPacketException, InvocationTargetException {
if (!data.contains("h") || !data.contains("v")) throw new IllegalPacketException("Unknown Packet Format: " + data.toString()); if (!data.contains("n") || !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<PacketIn> list = new ArrayList<PacketIn>(); List<PacketIn> list = new ArrayList<PacketIn>();
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")))) { if (packet.isCompatible(new Version(data.getRawString("v")))) {
list.add(packet); list.add(packet);
} else { } else {

View File

@ -352,6 +352,15 @@ public final class SubAPI {
return plugin.version; 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 * Gets the Server Version
* *

View File

@ -156,29 +156,22 @@ public final class SubCommand implements CommandExecutor {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public CommandResult execute(CommandSource sender, CommandContext args) throws CommandException { public CommandResult execute(CommandSource sender, CommandContext args) throws CommandException {
if (canRun(sender)) { 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.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(" " + 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(" 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(" " + 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); sender.sendMessage(Text.EMPTY);
plugin.game.getScheduler().createTaskBuilder().async().execute(() -> { plugin.game.getScheduler().createTaskBuilder().async().execute(() -> {
try { 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)); 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<Version> versions = new LinkedList<Version>();
Version updversion = plugin.version; Version updversion = plugin.version;
int updcount = 0; int updcount = 0;
for (YAMLSection tag : tags.getSectionList("tags")) { for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10)));
Version version = Version.fromString(tag.getString("ref").substring(10)); Collections.sort(versions);
for (Version version : versions) {
if (version.compareTo(updversion) > 0) { if (version.compareTo(updversion) > 0) {
updversion = version; updversion = version;
updcount++; updcount++;

View File

@ -37,6 +37,8 @@ import java.net.URL;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -62,8 +64,7 @@ public final class SubPlugin {
@Listener @Listener
public void setup(GamePreInitializationEvent event) { public void setup(GamePreInitializationEvent event) {
if (plugin.getVersion().isPresent()) { if (plugin.getVersion().isPresent()) {
//version = Version.fromString(plugin.getVersion().get()); 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
} else version = new Version("Custom"); } else version = new Version("Custom");
} }
@ -110,11 +111,13 @@ public final class SubPlugin {
game.getScheduler().createTaskBuilder().async().execute(() -> { game.getScheduler().createTaskBuilder().async().execute(() -> {
try { 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)); 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<Version> versions = new LinkedList<Version>();
Version updversion = version; Version updversion = version;
int updcount = 0; int updcount = 0;
for (YAMLSection tag : tags.getSectionList("tags")) { for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10)));
Version version = Version.fromString(tag.getString("ref").substring(10)); Collections.sort(versions);
for (Version version : versions) {
if (version.compareTo(updversion) > 0) { if (version.compareTo(updversion) > 0) {
updversion = version; updversion = version;
updcount++; updcount++;

View File

@ -1,4 +1,3 @@
Manifest-Version: 1.0 Manifest-Version: 1.0
Main-Class: net.ME1312.SubServers.Host.ExHost Main-Class: net.ME1312.SubServers.Host.ExHost
Implementation-Title: SubServers.Host Implementation-Title: SubServers.Host
Specification-Title: 18w30bb

View File

@ -55,8 +55,7 @@ public final class ExHost {
public SubDataClient subdata = null; public SubDataClient subdata = null;
public final SubAPI api = new SubAPI(this); public final SubAPI api = new SubAPI(this);
//public static final Version version = Version.fromString("2.13b"); 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
private ConsoleReader jline; private ConsoleReader jline;
private boolean running = false; private boolean running = false;
@ -417,11 +416,13 @@ public final class ExHost {
public void run() { public void run() {
try { 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")))) + '}')); 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<Version> versions = new LinkedList<Version>();
Version updversion = version; Version updversion = version;
int updcount = 0; int updcount = 0;
for (YAMLSection tag : tags.getSectionList("tags")) { for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10)));
Version version = Version.fromString(tag.getString("ref").substring(10)); Collections.sort(versions);
for (Version version : versions) {
if (version.compareTo(updversion) > 0) { if (version.compareTo(updversion) > 0) {
updversion = version; updversion = version;
updcount++; updcount++;

View File

@ -32,8 +32,8 @@ import java.util.concurrent.TimeUnit;
* SubData Direct Client Class * SubData Direct Client Class
*/ */
public final class SubDataClient { public final class SubDataClient {
private static HashMap<Class<? extends PacketOut>, String> pOut = new HashMap<Class<? extends PacketOut>, String>(); private static HashMap<Class<? extends PacketOut>, NamedContainer<String, String>> pOut = new HashMap<Class<? extends PacketOut>, NamedContainer<String, String>>();
private static HashMap<String, List<PacketIn>> pIn = new HashMap<String, List<PacketIn>>(); private static HashMap<String, HashMap<String, List<PacketIn>>> pIn = new HashMap<String, HashMap<String, List<PacketIn>>>();
private static HashMap<String, Cipher> ciphers = new HashMap<String, Cipher>(); private static HashMap<String, Cipher> ciphers = new HashMap<String, Cipher>();
private static boolean defaults = false; private static boolean defaults = false;
protected static Logger log; protected static Logger log;
@ -103,51 +103,51 @@ public final class SubDataClient {
defaults = true; defaults = true;
log = new Logger("SubData"); log = new Logger("SubData");
registerPacket(new PacketAuthorization(host), "Authorization"); registerPacket(new PacketAuthorization(host), "SubData", "Authorization");
registerPacket(new PacketCommandServer(), "SubCommandServer"); registerPacket(new PacketCommandServer(), "SubServers", "CommandServer");
registerPacket(new PacketCreateServer(), "SubCreateServer"); registerPacket(new PacketCreateServer(), "SubServers", "CreateServer");
registerPacket(new PacketDownloadHostInfo(), "SubDownloadHostInfo"); registerPacket(new PacketDownloadHostInfo(), "SubServers", "DownloadHostInfo");
registerPacket(new PacketDownloadLang(host), "SubDownloadLang"); registerPacket(new PacketDownloadLang(host), "SubServers", "DownloadLang");
registerPacket(new PacketDownloadNetworkList(), "SubDownloadNetworkList"); registerPacket(new PacketDownloadNetworkList(), "SubServers", "DownloadNetworkList");
registerPacket(new PacketDownloadPlayerList(), "SubDownloadPlayerList"); registerPacket(new PacketDownloadPlayerList(), "SubServers", "DownloadPlayerList");
registerPacket(new PacketDownloadProxyInfo(), "SubDownloadProxyInfo"); registerPacket(new PacketDownloadProxyInfo(), "SubServers", "DownloadProxyInfo");
registerPacket(new PacketDownloadServerInfo(), "SubDownloadServerInfo"); registerPacket(new PacketDownloadServerInfo(), "SubServers", "DownloadServerInfo");
registerPacket(new PacketDownloadServerList(), "SubDownloadServerList"); registerPacket(new PacketDownloadServerList(), "SubServers", "DownloadServerList");
registerPacket(new PacketExAddServer(host), "SubExAddServer"); registerPacket(new PacketExAddServer(host), "SubServers", "ExAddServer");
registerPacket(new PacketExConfigureHost(host), "SubExConfigureHost"); registerPacket(new PacketExConfigureHost(host), "SubServers", "ExConfigureHost");
registerPacket(new PacketExCreateServer(host), "SubExCreateServer"); registerPacket(new PacketExCreateServer(host), "SubServers", "ExCreateServer");
registerPacket(new PacketExDeleteServer(host), "SubExDeleteServer"); registerPacket(new PacketExDeleteServer(host), "SubServers", "ExDeleteServer");
registerPacket(new PacketExRemoveServer(host), "SubExRemoveServer"); registerPacket(new PacketExRemoveServer(host), "SubServers", "ExRemoveServer");
registerPacket(new PacketExUpdateServer(host), "SubExUpdateServer"); registerPacket(new PacketExUpdateServer(host), "SubServers", "ExUpdateServer");
registerPacket(new PacketInReload(host), "SubReload"); registerPacket(new PacketInReload(host), "SubServers", "Reload");
registerPacket(new PacketInReset(host), "SubReset"); registerPacket(new PacketInReset(host), "SubServers", "Reset");
registerPacket(new PacketInRunEvent(), "SubRunEvent"); registerPacket(new PacketInRunEvent(), "SubServers", "RunEvent");
registerPacket(new PacketLinkExHost(host), "SubLinkExHost"); registerPacket(new PacketLinkExHost(host), "SubServers", "LinkExHost");
registerPacket(new PacketStartServer(), "SubStartServer"); registerPacket(new PacketStartServer(), "SubServers", "StartServer");
registerPacket(new PacketStopServer(), "SubStopServer"); registerPacket(new PacketStopServer(), "SubServers", "StopServer");
registerPacket(PacketAuthorization.class, "Authorization"); registerPacket(PacketAuthorization.class, "SubData", "Authorization");
registerPacket(PacketCommandServer.class, "SubCommandServer"); registerPacket(PacketCommandServer.class, "SubServers", "CommandServer");
registerPacket(PacketCreateServer.class, "SubCreateServer"); registerPacket(PacketCreateServer.class, "SubServers", "CreateServer");
registerPacket(PacketDownloadHostInfo.class, "SubDownloadHostInfo"); registerPacket(PacketDownloadHostInfo.class, "SubServers", "DownloadHostInfo");
registerPacket(PacketDownloadLang.class, "SubDownloadLang"); registerPacket(PacketDownloadLang.class, "SubServers", "DownloadLang");
registerPacket(PacketDownloadNetworkList.class, "SubDownloadNetworkList"); registerPacket(PacketDownloadNetworkList.class, "SubServers", "DownloadNetworkList");
registerPacket(PacketDownloadPlayerList.class, "SubDownloadPlayerList"); registerPacket(PacketDownloadPlayerList.class, "SubServers", "DownloadPlayerList");
registerPacket(PacketDownloadProxyInfo.class, "SubDownloadProxyInfo"); registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo");
registerPacket(PacketDownloadServerInfo.class, "SubDownloadServerInfo"); registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo");
registerPacket(PacketDownloadServerList.class, "SubDownloadServerList"); registerPacket(PacketDownloadServerList.class, "SubServers", "DownloadServerList");
registerPacket(PacketExAddServer.class, "SubExAddServer"); registerPacket(PacketExAddServer.class, "SubServers", "ExAddServer");
registerPacket(PacketExConfigureHost.class, "SubExConfigureHost"); registerPacket(PacketExConfigureHost.class, "SubServers", "ExConfigureHost");
registerPacket(PacketExCreateServer.class, "SubExCreateServer"); registerPacket(PacketExCreateServer.class, "SubServers", "ExCreateServer");
registerPacket(PacketExDeleteServer.class, "SubExDeleteServer"); registerPacket(PacketExDeleteServer.class, "SubServers", "ExDeleteServer");
registerPacket(PacketExRemoveServer.class, "SubExRemoveServer"); registerPacket(PacketExRemoveServer.class, "SubServers", "ExRemoveServer");
registerPacket(PacketExUpdateServer.class, "SubExUpdateServer"); registerPacket(PacketExUpdateServer.class, "SubServers", "ExUpdateServer");
registerPacket(PacketLinkExHost.class, "SubLinkExHost"); registerPacket(PacketLinkExHost.class, "SubServers", "LinkExHost");
registerPacket(PacketOutExLogMessage.class, "SubExLogMessage"); registerPacket(PacketOutExLogMessage.class, "SubServers", "ExLogMessage");
registerPacket(PacketOutExRequestQueue.class, "SubExRequestQueue"); registerPacket(PacketOutExRequestQueue.class, "SubServers", "ExRequestQueue");
registerPacket(PacketStartServer.class, "SubStartServer"); registerPacket(PacketStartServer.class, "SubServers", "StartServer");
registerPacket(PacketStopServer.class, "SubStopServer"); registerPacket(PacketStopServer.class, "SubServers", "StopServer");
} }
private void loop() { private void loop() {
@ -251,33 +251,40 @@ public final class SubDataClient {
* Register PacketIn to the Network * Register PacketIn to the Network
* *
* @param packet PacketIn to register * @param packet PacketIn to register
* @param channel Packet Channel
* @param handle Handle to Bind * @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(); if (Util.isNull(packet, handle)) throw new NullPointerException();
List<PacketIn> list = (pIn.keySet().contains(handle.toLowerCase()))?pIn.get(handle.toLowerCase()):new ArrayList<PacketIn>(); HashMap<String, List<PacketIn>> map = (pIn.keySet().contains(channel.toLowerCase()))?pIn.get(channel.toLowerCase()):new HashMap<String, List<PacketIn>>();
List<PacketIn> list = (map.keySet().contains(handle))?map.get(handle):new ArrayList<PacketIn>();
if (!list.contains(packet)) { if (!list.contains(packet)) {
list.add(packet); list.add(packet);
pIn.put(handle.toLowerCase(), list); map.put(handle, list);
pIn.put(channel.toLowerCase(), map);
} }
} }
/** /**
* Unregister PacketIn from the Network * Unregister PacketIn from the Network
* *
* @param channel Packet Channel
* @param packet PacketIn to unregister * @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(); if (Util.isNull(packet)) throw new NullPointerException();
List<String> search = new ArrayList<String>(); if (pIn.keySet().contains(channel.toLowerCase())) {
search.addAll(pIn.keySet()); List<String> search = new ArrayList<String>();
for (String handle : search) if (pIn.get(handle.toLowerCase()).contains(packet)) { search.addAll(pIn.get(channel.toLowerCase()).keySet());
List<PacketIn> list = pIn.get(handle.toLowerCase()); for (String handle : search) if (pIn.get(channel.toLowerCase()).get(handle).contains(packet)) {
list.remove(packet); List<PacketIn> list = pIn.get(channel.toLowerCase()).get(handle);
if (list.isEmpty()) { list.remove(packet);
pIn.remove(handle.toLowerCase()); if (list.isEmpty()) {
} else { pIn.get(channel.toLowerCase()).remove(handle);
pIn.put(handle.toLowerCase(), list); 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 * Register PacketOut to the Network
* *
* @param packet PacketOut to register * @param packet PacketOut to register
* @param channel Packet Channel
* @param handle Handle to bind * @param handle Handle to bind
*/ */
public static void registerPacket(Class<? extends PacketOut> packet, String handle) { public static void registerPacket(Class<? extends PacketOut> packet, String channel, String handle) {
if (Util.isNull(packet, handle)) throw new NullPointerException(); if (Util.isNull(packet, handle)) throw new NullPointerException();
pOut.put(packet, handle.toLowerCase()); pOut.put(packet, new NamedContainer<String, String>(channel.toLowerCase(), handle));
} }
/** /**
* Unregister PacketOut to the Network * Unregister PacketOut to the Network
* *
* @param channel Packet Channel
* @param packet PacketOut to unregister * @param packet PacketOut to unregister
*/ */
public static void unregisterPacket(Class<? extends PacketOut> packet) { public static void unregisterPacket(String channel, Class<? extends PacketOut> packet) {
if (Util.isNull(packet)) throw new NullPointerException(); 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 * Grab PacketIn Instances via handle
* *
* @param channel Packet Channel
* @param handle Handle * @param handle Handle
* @return PacketIn * @return PacketIn
*/ */
public static List<? extends PacketIn> getPacket(String handle) { public static List<? extends PacketIn> getPacket(String channel, String handle) {
if (Util.isNull(handle)) throw new NullPointerException(); if (Util.isNull(handle)) throw new NullPointerException();
return new ArrayList<PacketIn>(pIn.get(handle.toLowerCase())); return new ArrayList<PacketIn>(pIn.get(channel.toLowerCase()).get(handle));
} }
/** /**
@ -376,7 +386,8 @@ public final class SubDataClient {
try { try {
YAMLSection contents = packet.generate(); 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()); json.set("v", packet.getVersion().toString());
if (contents != null) json.set("c", contents); if (contents != null) json.set("c", contents);
} catch (Throwable e) { } catch (Throwable e) {
@ -395,11 +406,11 @@ public final class SubDataClient {
*/ */
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
private static List<PacketIn> decodePacket(YAMLSection data) throws IllegalPacketException, InvocationTargetException { private static List<PacketIn> decodePacket(YAMLSection data) throws IllegalPacketException, InvocationTargetException {
if (!data.contains("h") || !data.contains("v")) throw new IllegalPacketException("Unknown Packet Format: " + data.toString()); if (!data.contains("n") || !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<PacketIn> list = new ArrayList<PacketIn>(); List<PacketIn> list = new ArrayList<PacketIn>();
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")))) { if (packet.isCompatible(new Version(data.getRawString("v")))) {
list.add(packet); list.add(packet);
} else { } else {

View File

@ -615,4 +615,13 @@ public final class SubAPI {
public Version getAppVersion() { public Version getAppVersion() {
return host.version; 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;
}
} }

View File

@ -33,29 +33,23 @@ public class SubCommand {
@Override @Override
public void command(String handle, String[] args) { public void command(String handle, String[] args) {
if (args.length == 0 || host.api.plugins.get(args[0].toLowerCase()) != null) { 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( 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()) +":", "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") + ',', " " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") + ',',
" Java " + System.getProperty("java.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) { if (args.length == 0) {
host.log.message.println(""); host.log.message.println("");
new Thread(() -> { new Thread(() -> {
try { 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")))) + '}')); 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<Version> versions = new LinkedList<Version>();
Version updversion = host.version; Version updversion = host.version;
int updcount = 0; int updcount = 0;
for (YAMLSection tag : tags.getSectionList("tags")) { for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10)));
Version version = Version.fromString(tag.getString("ref").substring(10)); Collections.sort(versions);
for (Version version : versions) {
if (version.compareTo(updversion) > 0) { if (version.compareTo(updversion) > 0) {
updversion = version; updversion = version;
updcount++; updcount++;

View File

@ -2,4 +2,3 @@ Manifest-Version: 1.0
Class-Path: BungeeCord.jar Waterfall.jar Class-Path: BungeeCord.jar Waterfall.jar
Main-Class: net.ME1312.SubServers.Sync.Launch Main-Class: net.ME1312.SubServers.Sync.Launch
Implementation-Title: SubServers.Sync Implementation-Title: SubServers.Sync
Specification-Title: 18w30bb

View File

@ -30,8 +30,8 @@ import java.util.concurrent.TimeUnit;
* SubData Direct Client Class * SubData Direct Client Class
*/ */
public final class SubDataClient { public final class SubDataClient {
private static HashMap<Class<? extends PacketOut>, String> pOut = new HashMap<Class<? extends PacketOut>, String>(); private static HashMap<Class<? extends PacketOut>, NamedContainer<String, String>> pOut = new HashMap<Class<? extends PacketOut>, NamedContainer<String, String>>();
private static HashMap<String, List<PacketIn>> pIn = new HashMap<String, List<PacketIn>>(); private static HashMap<String, HashMap<String, List<PacketIn>>> pIn = new HashMap<String, HashMap<String, List<PacketIn>>>();
private static HashMap<String, Cipher> ciphers = new HashMap<String, Cipher>(); private static HashMap<String, Cipher> ciphers = new HashMap<String, Cipher>();
private static boolean defaults = false; private static boolean defaults = false;
private PrintWriter writer; private PrintWriter writer;
@ -113,35 +113,35 @@ public final class SubDataClient {
} private void loadDefaults() { } private void loadDefaults() {
defaults = true; defaults = true;
registerPacket(new PacketAuthorization(plugin), "Authorization"); registerPacket(new PacketAuthorization(plugin), "SubData", "Authorization");
registerPacket(new PacketCommandServer(), "SubCommandServer"); registerPacket(new PacketCommandServer(), "SubServers", "CommandServer");
registerPacket(new PacketCreateServer(), "SubCreateServer"); registerPacket(new PacketCreateServer(), "SubServers", "CreateServer");
registerPacket(new PacketDownloadHostInfo(), "SubDownloadHostInfo"); registerPacket(new PacketDownloadHostInfo(), "SubServers", "DownloadHostInfo");
registerPacket(new PacketDownloadLang(plugin), "SubDownloadLang"); registerPacket(new PacketDownloadLang(plugin), "SubServers", "DownloadLang");
registerPacket(new PacketDownloadNetworkList(), "SubDownloadNetworkList"); registerPacket(new PacketDownloadNetworkList(), "SubServers", "DownloadNetworkList");
registerPacket(new PacketDownloadPlayerList(), "SubDownloadPlayerList"); registerPacket(new PacketDownloadPlayerList(), "SubServers", "DownloadPlayerList");
registerPacket(new PacketDownloadProxyInfo(), "SubDownloadProxyInfo"); registerPacket(new PacketDownloadProxyInfo(), "SubServers", "DownloadProxyInfo");
registerPacket(new PacketDownloadServerInfo(), "SubDownloadServerInfo"); registerPacket(new PacketDownloadServerInfo(), "SubServers", "DownloadServerInfo");
registerPacket(new PacketDownloadServerList(), "SubDownloadServerList"); registerPacket(new PacketDownloadServerList(), "SubServers", "DownloadServerList");
registerPacket(new PacketInRunEvent(), "SubRunEvent"); registerPacket(new PacketInRunEvent(), "SubServers", "RunEvent");
registerPacket(new PacketInReset(), "SubReset"); registerPacket(new PacketInReset(), "SubServers", "Reset");
registerPacket(new PacketLinkProxy(plugin), "SubLinkProxy"); registerPacket(new PacketLinkProxy(plugin), "SubServers", "LinkProxy");
registerPacket(new PacketStartServer(), "SubStartServer"); registerPacket(new PacketStartServer(), "SubServers", "StartServer");
registerPacket(new PacketStopServer(), "SubStopServer"); registerPacket(new PacketStopServer(), "SubServers", "StopServer");
registerPacket(PacketAuthorization.class, "Authorization"); registerPacket(PacketAuthorization.class, "SubData", "Authorization");
registerPacket(PacketCommandServer.class, "SubCommandServer"); registerPacket(PacketCommandServer.class, "SubServers", "CommandServer");
registerPacket(PacketCreateServer.class, "SubCreateServer"); registerPacket(PacketCreateServer.class, "SubServers", "CreateServer");
registerPacket(PacketDownloadHostInfo.class, "SubDownloadHostInfo"); registerPacket(PacketDownloadHostInfo.class, "SubServers", "DownloadHostInfo");
registerPacket(PacketDownloadLang.class, "SubDownloadLang"); registerPacket(PacketDownloadLang.class, "SubServers", "DownloadLang");
registerPacket(PacketDownloadNetworkList.class, "SubDownloadNetworkList"); registerPacket(PacketDownloadNetworkList.class, "SubServers", "DownloadNetworkList");
registerPacket(PacketDownloadPlayerList.class, "SubDownloadPlayerList"); registerPacket(PacketDownloadPlayerList.class, "SubServers", "DownloadPlayerList");
registerPacket(PacketDownloadProxyInfo.class, "SubDownloadProxyInfo"); registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo");
registerPacket(PacketDownloadServerInfo.class, "SubDownloadServerInfo"); registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo");
registerPacket(PacketDownloadServerList.class, "SubDownloadServerList"); registerPacket(PacketDownloadServerList.class, "SubServers", "DownloadServerList");
registerPacket(PacketLinkProxy.class, "SubLinkProxy"); registerPacket(PacketLinkProxy.class, "SubServers", "LinkProxy");
registerPacket(PacketStartServer.class, "SubStartServer"); registerPacket(PacketStartServer.class, "SubServers", "StartServer");
registerPacket(PacketStopServer.class, "SubStopServer"); registerPacket(PacketStopServer.class, "SubServers", "StopServer");
} }
private void loop() { private void loop() {
@ -256,33 +256,40 @@ public final class SubDataClient {
* Register PacketIn to the Network * Register PacketIn to the Network
* *
* @param packet PacketIn to register * @param packet PacketIn to register
* @param channel Packet Channel
* @param handle Handle to Bind * @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(); if (Util.isNull(packet, handle)) throw new NullPointerException();
List<PacketIn> list = (pIn.keySet().contains(handle.toLowerCase()))?pIn.get(handle.toLowerCase()):new ArrayList<PacketIn>(); HashMap<String, List<PacketIn>> map = (pIn.keySet().contains(channel.toLowerCase()))?pIn.get(channel.toLowerCase()):new HashMap<String, List<PacketIn>>();
List<PacketIn> list = (map.keySet().contains(handle))?map.get(handle):new ArrayList<PacketIn>();
if (!list.contains(packet)) { if (!list.contains(packet)) {
list.add(packet); list.add(packet);
pIn.put(handle.toLowerCase(), list); map.put(handle, list);
pIn.put(channel.toLowerCase(), map);
} }
} }
/** /**
* Unregister PacketIn from the Network * Unregister PacketIn from the Network
* *
* @param channel Packet Channel
* @param packet PacketIn to unregister * @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(); if (Util.isNull(packet)) throw new NullPointerException();
List<String> search = new ArrayList<String>(); if (pIn.keySet().contains(channel.toLowerCase())) {
search.addAll(pIn.keySet()); List<String> search = new ArrayList<String>();
for (String handle : search) if (pIn.get(handle.toLowerCase()).contains(packet)) { search.addAll(pIn.get(channel.toLowerCase()).keySet());
List<PacketIn> list = pIn.get(handle.toLowerCase()); for (String handle : search) if (pIn.get(channel.toLowerCase()).get(handle).contains(packet)) {
list.remove(packet); List<PacketIn> list = pIn.get(channel.toLowerCase()).get(handle);
if (list.isEmpty()) { list.remove(packet);
pIn.remove(handle.toLowerCase()); if (list.isEmpty()) {
} else { pIn.get(channel.toLowerCase()).remove(handle);
pIn.put(handle.toLowerCase(), list); 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 * Register PacketOut to the Network
* *
* @param packet PacketOut to register * @param packet PacketOut to register
* @param channel Packet Channel
* @param handle Handle to bind * @param handle Handle to bind
*/ */
public static void registerPacket(Class<? extends PacketOut> packet, String handle) { public static void registerPacket(Class<? extends PacketOut> packet, String channel, String handle) {
if (Util.isNull(packet, handle)) throw new NullPointerException(); if (Util.isNull(packet, handle)) throw new NullPointerException();
pOut.put(packet, handle.toLowerCase()); pOut.put(packet, new NamedContainer<String, String>(channel.toLowerCase(), handle));
} }
/** /**
* Unregister PacketOut to the Network * Unregister PacketOut to the Network
* *
* @param channel Packet Channel
* @param packet PacketOut to unregister * @param packet PacketOut to unregister
*/ */
public static void unregisterPacket(Class<? extends PacketOut> packet) { public static void unregisterPacket(String channel, Class<? extends PacketOut> packet) {
if (Util.isNull(packet)) throw new NullPointerException(); 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 * Grab PacketIn Instances via handle
* *
* @param channel Packet Channel
* @param handle Handle * @param handle Handle
* @return PacketIn * @return PacketIn
*/ */
public static List<? extends PacketIn> getPacket(String handle) { public static List<? extends PacketIn> getPacket(String channel, String handle) {
if (Util.isNull(handle)) throw new NullPointerException(); if (Util.isNull(handle)) throw new NullPointerException();
return new ArrayList<PacketIn>(pIn.get(handle.toLowerCase())); return new ArrayList<PacketIn>(pIn.get(channel.toLowerCase()).get(handle));
} }
/** /**
@ -382,7 +392,8 @@ public final class SubDataClient {
try { try {
YAMLSection contents = packet.generate(); 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()); json.set("v", packet.getVersion().toString());
if (contents != null) json.set("c", contents); if (contents != null) json.set("c", contents);
return json; return json;
@ -401,10 +412,10 @@ public final class SubDataClient {
*/ */
private static List<PacketIn> decodePacket(YAMLSection data) throws IllegalPacketException, InvocationTargetException { private static List<PacketIn> decodePacket(YAMLSection data) throws IllegalPacketException, InvocationTargetException {
if (!data.contains("h") || !data.contains("v")) throw new IllegalPacketException("Unknown Packet Format: " + data.toString()); 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<PacketIn> list = new ArrayList<PacketIn>(); List<PacketIn> list = new ArrayList<PacketIn>();
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")))) { if (packet.isCompatible(new Version(data.getRawString("v")))) {
list.add(packet); list.add(packet);
} else { } else {

View File

@ -341,6 +341,15 @@ public final class SubAPI {
return plugin.version; 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 * Gets the BungeeCord Version
* *

View File

@ -71,28 +71,22 @@ public final class SubCommand extends CommandX {
if (args[0].equalsIgnoreCase("help") || args[0].equalsIgnoreCase("?")) { if (args[0].equalsIgnoreCase("help") || args[0].equalsIgnoreCase("?")) {
sender.sendMessages(printHelp()); sender.sendMessages(printHelp());
} else if (args[0].equalsIgnoreCase("version") || args[0].equalsIgnoreCase("ver")) { } 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("SubServers > These are the platforms and versions that are running SubServers.Sync:");
sender.sendMessage(" " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") + ','); sender.sendMessage(" " + System.getProperty("os.name") + ' ' + System.getProperty("os.version") + ',');
sender.sendMessage(" Java " + System.getProperty("java.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(" " + 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(""); sender.sendMessage("");
new Thread(() -> { new Thread(() -> {
try { 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)); 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<Version> versions = new LinkedList<Version>();
Version updversion = plugin.version; Version updversion = plugin.version;
int updcount = 0; int updcount = 0;
for (YAMLSection tag : tags.getSectionList("tags")) { for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10)));
Version version = Version.fromString(tag.getString("ref").substring(10)); Collections.sort(versions);
for (Version version : versions) {
if (version.compareTo(updversion) > 0) { if (version.compareTo(updversion) > 0) {
updversion = version; updversion = version;
updcount++; updcount++;

View File

@ -49,8 +49,7 @@ public final class SubPlugin extends BungeeCord implements Listener {
public boolean redis = false; public boolean redis = false;
public final SubAPI api = new SubAPI(this); public final SubAPI api = new SubAPI(this);
public SubDataClient subdata = null; public SubDataClient subdata = null;
//public static final Version version = Version.fromString("2.13b"); 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 final boolean isPatched; public final boolean isPatched;
public long lastReload = -1; public long lastReload = -1;
@ -135,11 +134,13 @@ public final class SubPlugin extends BungeeCord implements Listener {
public void run() { public void run() {
try { 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)); 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<Version> versions = new LinkedList<Version>();
Version updversion = version; Version updversion = version;
int updcount = 0; int updcount = 0;
for (YAMLSection tag : tags.getSectionList("tags")) { for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10)));
Version version = Version.fromString(tag.getString("ref").substring(10)); Collections.sort(versions);
for (Version version : versions) {
if (version.compareTo(updversion) > 0) { if (version.compareTo(updversion) > 0) {
updversion = version; updversion = version;
updcount++; updcount++;