static void |
unregisterPacket(PacketIn packet)
Unregister PacketIn from the Network
@@ -260,13 +267,14 @@ extends java.lang.Object
Constructor Detail
-
+
-
SubDataClient
public SubDataClient(SubPlugin plugin,
+ java.lang.String name,
java.net.InetAddress address,
int port,
Cipher cipher)
@@ -291,6 +299,20 @@ extends java.lang.Object
Method Detail
+
+
+
+
diff --git a/Javadoc/SubServers.Sync/overview-tree.html b/Javadoc/SubServers.Sync/overview-tree.html
index 79ad78f4..e67f59f1 100644
--- a/Javadoc/SubServers.Sync/overview-tree.html
+++ b/Javadoc/SubServers.Sync/overview-tree.html
@@ -152,6 +152,7 @@
- net.ME1312.SubServers.Sync.Network.Packet.PacketDownloadServerList (implements net.ME1312.SubServers.Sync.Network.PacketIn, net.ME1312.SubServers.Sync.Network.PacketOut)
- net.ME1312.SubServers.Sync.Network.Packet.PacketInReset (implements net.ME1312.SubServers.Sync.Network.PacketIn)
- net.ME1312.SubServers.Sync.Network.Packet.PacketInRunEvent (implements net.ME1312.SubServers.Sync.Network.PacketIn)
+- net.ME1312.SubServers.Sync.Network.Packet.PacketLinkProxy (implements net.ME1312.SubServers.Sync.Network.PacketIn, net.ME1312.SubServers.Sync.Network.PacketOut)
- net.ME1312.SubServers.Sync.Network.Packet.PacketStartServer (implements net.ME1312.SubServers.Sync.Network.PacketIn, net.ME1312.SubServers.Sync.Network.PacketOut)
- net.ME1312.SubServers.Sync.Network.Packet.PacketStopServer (implements net.ME1312.SubServers.Sync.Network.PacketIn, net.ME1312.SubServers.Sync.Network.PacketOut)
- net.md_5.bungee.api.ProxyServer
diff --git a/SubServers.Bungee/src.jar b/SubServers.Bungee/src.jar
index aaa6f900..284fdaf0 100644
Binary files a/SubServers.Bungee/src.jar and b/SubServers.Bungee/src.jar differ
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Proxy.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Proxy.java
new file mode 100644
index 00000000..8d5a80e0
--- /dev/null
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Proxy.java
@@ -0,0 +1,153 @@
+package net.ME1312.SubServers.Bungee.Host;
+
+import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection;
+import net.ME1312.SubServers.Bungee.Library.Config.YAMLValue;
+import net.ME1312.SubServers.Bungee.Library.ExtraDataHandler;
+import net.ME1312.SubServers.Bungee.Library.NamedContainer;
+import net.ME1312.SubServers.Bungee.Library.Util;
+import net.ME1312.SubServers.Bungee.Network.Client;
+import net.ME1312.SubServers.Bungee.Network.ClientHandler;
+import net.ME1312.SubServers.Bungee.SubAPI;
+import net.ME1312.SubServers.Bungee.SubPlugin;
+import org.json.JSONObject;
+
+import java.util.*;
+
+/**
+ * Proxy Class
+ */
+public class Proxy implements ClientHandler, ExtraDataHandler {
+ private YAMLSection extra = new YAMLSection();
+ private final String signature;
+ private Client client = null;
+ private String nick = null;
+ private final String name;
+
+ public Proxy(String name) throws IllegalArgumentException {
+ if (Util.isNull(name)) throw new NullPointerException();
+ if (name.contains(" ")) throw new IllegalArgumentException("Proxy names cannot have spaces: " + name);
+ this.name = name;
+ this.signature = SubAPI.getInstance().signAnonymousObject();
+ }
+
+ @Override
+ public Client getSubData() {
+ return client;
+ }
+
+ @Override
+ @SuppressWarnings("deprecation")
+ public void setSubData(Client client) {
+ this.client = client;
+ if (client == null) SubAPI.getInstance().getInternals().proxies.remove(getName().toLowerCase());
+ if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) client.setHandler(this);
+ }
+
+ /**
+ * Get the Name of this Proxy
+ *
+ * @return Name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Get the Display Name of this Proxy
+ *
+ * @return Display Name
+ */
+ public String getDisplayName() {
+ return (nick == null)?getName():nick;
+ }
+
+ /**
+ * Sets the Display Name for this Proxy
+ *
+ * @param value Value (or null to reset)
+ */
+ public void setDisplayName(String value) {
+ if (value == null || value.length() == 0 || getName().equals(value)) {
+ this.nick = null;
+ } else {
+ this.nick = value;
+ }
+ }
+
+ /**
+ * Get the players on this proxy (via RedisBungee)
+ *
+ * @return Player Collection
+ */
+ @SuppressWarnings({"deprecation", "unchecked"})
+ public Collection> getPlayers() {
+ List> players = new ArrayList>();
+ SubPlugin plugin = SubAPI.getInstance().getInternals();
+ if (plugin.redis) {
+ try {
+ for (UUID player : (Set) plugin.redis("getPlayersOnProxy", new NamedContainer<>(String.class, getName())))
+ players.add(new NamedContainer<>((String) plugin.redis("getNameFromUuid", new NamedContainer<>(UUID.class, player)), player));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return players;
+ }
+
+ /**
+ * Get the Signature of this Object
+ *
+ * @return Object Signature
+ */
+ public final String getSignature() {
+ return signature;
+ }
+
+ @Override
+ public void addExtra(String handle, Object value) {
+ if (Util.isNull(handle, value)) throw new NullPointerException();
+ extra.set(handle, value);
+ }
+
+ @Override
+ public boolean hasExtra(String handle) {
+ if (Util.isNull(handle)) throw new NullPointerException();
+ return extra.getKeys().contains(handle);
+ }
+
+ @Override
+ public YAMLValue getExtra(String handle) {
+ if (Util.isNull(handle)) throw new NullPointerException();
+ return extra.get(handle);
+ }
+
+ @Override
+ public YAMLSection getExtra() {
+ return extra.clone();
+ }
+
+ @Override
+ public void removeExtra(String handle) {
+ if (Util.isNull(handle)) throw new NullPointerException();
+ extra.remove(handle);
+ }
+
+ @Override
+ public String toString() {
+ JSONObject info = new JSONObject();
+ info.put("type", "Proxy");
+ info.put("name", getName());
+ info.put("display", getDisplayName());
+ JSONObject players = new JSONObject();
+ for (NamedContainer player : getPlayers()) {
+ JSONObject pinfo = new JSONObject();
+ pinfo.put("name", player.name());
+ players.put(player.get().toString(), pinfo);
+ }
+ info.put("players", players);
+ if (getSubData() != null) info.put("subdata", getSubData().getAddress().toString());
+ info.put("signature", signature);
+ info.put("extra", getExtra().toJSON());
+ return info.toString();
+ }
+}
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java
new file mode 100644
index 00000000..31e6cb7a
--- /dev/null
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java
@@ -0,0 +1,83 @@
+package net.ME1312.SubServers.Bungee.Network.Packet;
+
+import net.ME1312.SubServers.Bungee.Host.Proxy;
+import net.ME1312.SubServers.Bungee.Host.Server;
+import net.ME1312.SubServers.Bungee.Host.SubServer;
+import net.ME1312.SubServers.Bungee.Library.Util;
+import net.ME1312.SubServers.Bungee.Library.Version.Version;
+import net.ME1312.SubServers.Bungee.Network.Client;
+import net.ME1312.SubServers.Bungee.Network.PacketIn;
+import net.ME1312.SubServers.Bungee.Network.PacketOut;
+import net.ME1312.SubServers.Bungee.SubAPI;
+import net.ME1312.SubServers.Bungee.SubPlugin;
+import org.json.JSONObject;
+
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * Link Proxy Packet
+ */
+public class PacketLinkProxy implements PacketIn, PacketOut {
+ private SubPlugin plugin;
+ private int response;
+ private String message;
+ private String name;
+
+ /**
+ * New PacketLinkProxy (In)
+ *
+ * @param plugin SubPlugin
+ */
+ public PacketLinkProxy(SubPlugin plugin) {
+ if (Util.isNull(plugin)) throw new NullPointerException();
+ this.plugin = plugin;
+ }
+
+ /**
+ * New PacketLinkProxy (Out)
+ *
+ * @param name The name that was generated
+ * @param response Response ID
+ * @param message Message
+ */
+ public PacketLinkProxy(String name, int response, String message) {
+ if (Util.isNull(response, message)) throw new NullPointerException();
+ this.name = name;
+ this.response = response;
+ this.message = message;
+ }
+
+ @Override
+ public JSONObject generate() {
+ JSONObject json = new JSONObject();
+ json.put("n", name);
+ json.put("r", response);
+ json.put("m", message);
+ return json;
+ }
+
+ @Override
+ public void execute(Client client, JSONObject data) {
+ try {
+ Map proxies = plugin.api.getProxies();
+ if (!data.keySet().contains("name") || !proxies.keySet().contains(data.getString("name"))) {
+ Proxy proxy = new Proxy((data.keySet().contains("name"))?data.getString("name"):Util.getNew(proxies.keySet(), () -> UUID.randomUUID().toString()));
+ plugin.proxies.put(proxy.getName().toLowerCase(), proxy);
+ client.setHandler(proxy);
+ System.out.println("SubData > " + client.getAddress().toString() + " has been defined as Proxy: " + proxy.getName());
+ client.sendPacket(new PacketLinkProxy(proxy.getName(), 0, "Definition Successful"));
+ } else {
+ client.sendPacket(new PacketLinkProxy(null, 3, "Proxy already linked"));
+ }
+ } catch (Exception e) {
+ client.sendPacket(new PacketLinkProxy(null, 1, e.getClass().getCanonicalName() + ": " + e.getMessage()));
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public Version getVersion() {
+ return new Version("2.11.0a");
+ }
+}
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java
index ef0d53e1..aac145c7 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/SubDataServer.java
@@ -98,6 +98,7 @@ public final class SubDataServer {
registerPacket(new PacketInExLogMessage(), "SubExLogMessage");
registerPacket(new PacketInExRequestQueue(plugin), "SubExRequestQueue");
registerPacket(new PacketLinkExHost(plugin), "SubLinkExHost");
+ registerPacket(new PacketLinkProxy(plugin), "SubLinkProxy");
registerPacket(new PacketLinkServer(plugin), "SubLinkServer");
registerPacket(new PacketListenLog(plugin), "SubListenLog");
registerPacket(new PacketStartServer(plugin), "SubStartServer");
@@ -121,6 +122,7 @@ public final class SubDataServer {
registerPacket(PacketExRemoveServer.class, "SubExRemoveServer");
registerPacket(PacketExUpdateServer.class, "SubExUpdateServer");
registerPacket(PacketLinkExHost.class, "SubLinkExHost");
+ registerPacket(PacketLinkProxy.class, "SubLinkProxy");
registerPacket(PacketLinkServer.class, "SubLinkServer");
registerPacket(PacketListenLog.class, "SubListenLog");
registerPacket(PacketOutRunEvent.class, "SubRunEvent");
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java
index de443ab4..26065ccc 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubAPI.java
@@ -4,10 +4,7 @@ import net.ME1312.SubServers.Bungee.Event.SubAddHostEvent;
import net.ME1312.SubServers.Bungee.Event.SubAddServerEvent;
import net.ME1312.SubServers.Bungee.Event.SubRemoveHostEvent;
import net.ME1312.SubServers.Bungee.Event.SubRemoveServerEvent;
-import net.ME1312.SubServers.Bungee.Host.Server;
-import net.ME1312.SubServers.Bungee.Host.Host;
-import net.ME1312.SubServers.Bungee.Host.ServerContainer;
-import net.ME1312.SubServers.Bungee.Host.SubServer;
+import net.ME1312.SubServers.Bungee.Host.*;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidHostException;
import net.ME1312.SubServers.Bungee.Library.NamedContainer;
import net.ME1312.SubServers.Bungee.Library.UniversalFile;
@@ -508,6 +505,26 @@ public final class SubAPI {
return getSubServers().get(name.toLowerCase());
}
+ /**
+ * Gets the known Proxies
+ *
+ * @return Proxy Map
+ */
+ public Map getProxies() {
+ return new TreeMap(plugin.proxies);
+ }
+
+ /**
+ * Gets a Proxy
+ *
+ * @param name Proxy name
+ * @return a Proxy
+ */
+ public Proxy getProxy(String name) {
+ if (Util.isNull(name)) throw new NullPointerException();
+ return getProxies().get(name.toLowerCase());
+ }
+
/**
* Get players on this network across all known proxies
*
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java
index b8051bc7..294c58e5 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubPlugin.java
@@ -44,6 +44,7 @@ import java.util.concurrent.TimeUnit;
public final class SubPlugin extends BungeeCord implements Listener {
protected final LinkedHashMap> lang = new LinkedHashMap>();
protected final HashMap> hostDrivers = new HashMap>();
+ public final HashMap proxies = new HashMap();
public final HashMap hosts = new HashMap();
public final HashMap exServers = new HashMap();
private final HashMap legServers = new HashMap();
@@ -194,6 +195,7 @@ public final class SubPlugin extends BungeeCord implements Listener {
@Override
public void startListeners() {
try {
+ redis = getPluginManager().getPlugin("RedisBungee") != null;
reload();
super.startListeners();
@@ -472,7 +474,6 @@ public final class SubPlugin extends BungeeCord implements Listener {
}
private void post() {
- if (getPluginManager().getPlugin("RedisBungee") != null) redis = true;
if (config.get().getSection("Settings").getBoolean("Override-Bungee-Commands", true)) {
getPluginManager().registerCommand(null, SubCommand.BungeeServer.newInstance(this, "server").get());
getPluginManager().registerCommand(null, new SubCommand.BungeeList(this, "glist"));
diff --git a/SubServers.Sync/src.jar b/SubServers.Sync/src.jar
index 571d014c..05e9909a 100644
Binary files a/SubServers.Sync/src.jar and b/SubServers.Sync/src.jar differ
diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketLinkProxy.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketLinkProxy.java
new file mode 100644
index 00000000..2bc247f1
--- /dev/null
+++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/Packet/PacketLinkProxy.java
@@ -0,0 +1,54 @@
+package net.ME1312.SubServers.Sync.Network.Packet;
+
+import net.ME1312.SubServers.Sync.Library.Util;
+import net.ME1312.SubServers.Sync.Library.Version.Version;
+import net.ME1312.SubServers.Sync.Network.PacketIn;
+import net.ME1312.SubServers.Sync.Network.PacketOut;
+import net.ME1312.SubServers.Sync.Network.SubDataClient;
+import net.ME1312.SubServers.Sync.SubPlugin;
+import org.json.JSONObject;
+
+import java.lang.reflect.Field;
+
+/**
+ * Link Proxy Packet
+ */
+public class PacketLinkProxy implements PacketIn, PacketOut {
+ private SubPlugin plugin;
+
+ /**
+ * New PacketLinkProxy
+ *
+ * @param plugin SubServers.Sync
+ */
+ public PacketLinkProxy(SubPlugin plugin) {
+ if (Util.isNull(plugin)) throw new NullPointerException();
+ this.plugin = plugin;
+ }
+
+ @Override
+ public JSONObject generate() {
+ JSONObject json = new JSONObject();
+ json.put("name", plugin.subdata.getName());
+ return json;
+ }
+
+ @Override
+ public void execute(JSONObject data) {
+ if (data.getInt("r") == 0) {
+ if (data.keySet().contains("n")) try {
+ Field m = SubDataClient.class.getDeclaredField("name");
+ m.setAccessible(true);
+ m.set(plugin.subdata, data.getString("n"));
+ m.setAccessible(false);
+ } catch (Exception e) {}
+ } else {
+ System.out.println("SubData > Could not link name with server: " + data.getString("m"));
+ }
+ }
+
+ @Override
+ public Version getVersion() {
+ return new Version("2.11.0a");
+ }
+}
diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubDataClient.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubDataClient.java
index 7fd383aa..f0ca5767 100644
--- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubDataClient.java
+++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubDataClient.java
@@ -34,6 +34,7 @@ public final class SubDataClient {
private static boolean defaults = false;
private PrintWriter writer;
private NamedContainer socket;
+ private String name = null;
private Cipher cipher;
private SubPlugin plugin;
private LinkedList> queue;
@@ -47,10 +48,11 @@ public final class SubDataClient {
* @param cipher Cipher
* @throws IOException
*/
- public SubDataClient(SubPlugin plugin, InetAddress address, int port, Cipher cipher) throws IOException {
+ public SubDataClient(SubPlugin plugin, String name, InetAddress address, int port, Cipher cipher) throws IOException {
if (Util.isNull(plugin, address, port)) throw new NullPointerException();
socket = new NamedContainer<>(false, new Socket(address, port));
this.plugin = plugin;
+ this.name = name;
this.writer = new PrintWriter(socket.get().getOutputStream(), true);
this.cipher = (cipher != null)?cipher:new Cipher() {
@Override
@@ -76,6 +78,7 @@ public final class SubDataClient {
private void init() {
plugin.subdata.sendPacket(new PacketDownloadLang(plugin));
+ plugin.subdata.sendPacket(new PacketLinkProxy(plugin));
plugin.subdata.sendPacket(new PacketDownloadProxyInfo(proxy -> plugin.subdata.sendPacket(new PacketDownloadServerList(null, null, json -> {
if (plugin.lastReload != proxy.getJSONObject("subservers").getLong("last-reload")) {
System.out.println("SubServers > Resetting Server Data");
@@ -119,6 +122,7 @@ public final class SubDataClient {
registerPacket(new PacketDownloadServerList(), "SubDownloadServerList");
registerPacket(new PacketInRunEvent(), "SubRunEvent");
registerPacket(new PacketInReset(), "SubReset");
+ registerPacket(new PacketLinkProxy(plugin), "SubLinkProxy");
registerPacket(new PacketStartServer(), "SubStartServer");
registerPacket(new PacketStopServer(), "SubStopServer");
@@ -132,6 +136,7 @@ public final class SubDataClient {
registerPacket(PacketDownloadProxyInfo.class, "SubDownloadProxyInfo");
registerPacket(PacketDownloadServerInfo.class, "SubDownloadServerInfo");
registerPacket(PacketDownloadServerList.class, "SubDownloadServerList");
+ registerPacket(PacketLinkProxy.class, "SubLinkProxy");
registerPacket(PacketStartServer.class, "SubStartServer");
registerPacket(PacketStopServer.class, "SubStopServer");
}
@@ -175,6 +180,25 @@ public final class SubDataClient {
}).start();
}
+ /**
+ * Gets the Assigned Proxy Name
+ *
+ * @return Host Name
+ */
+ public String getName() {
+ if (name != null) {
+ return name;
+ } else if (plugin.redis) {
+ try {
+ return (String) plugin.redis("getServerId");
+ } catch (Exception e) {
+ return null;
+ }
+ } else {
+ return null;
+ }
+ }
+
/**
* Gets the Server Socket
*
@@ -407,7 +431,7 @@ public final class SubDataClient {
@Override
public void run() {
try {
- plugin.subdata = new SubDataClient(plugin, socket.getInetAddress(), socket.getPort(), cipher);
+ plugin.subdata = new SubDataClient(plugin, name, socket.getInetAddress(), socket.getPort(), cipher);
timer.cancel();
while (queue.size() != 0) {
if (queue.get(0).name() != null) {
diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java
index 79e84f63..442d3c3c 100644
--- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java
+++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubPlugin.java
@@ -90,6 +90,7 @@ public final class SubPlugin extends BungeeCord implements Listener {
@Override
public void startListeners() {
try {
+ redis = getPluginManager().getPlugin("RedisBungee") != null;
config.reload();
Cipher cipher = null;
@@ -102,7 +103,9 @@ public final class SubPlugin extends BungeeCord implements Listener {
cipher = SubDataClient.getCipher(config.get().getSection("Settings").getSection("SubData").getRawString("Encryption"));
}
}
- subdata = new SubDataClient(this, InetAddress.getByName(config.get().getSection("Settings").getSection("SubData").getRawString("Address", "127.0.0.1:4391").split(":")[0]), Integer.parseInt(config.get().getSection("Settings").getSection("SubData").getRawString("Address", "127.0.0.1:4391").split(":")[1]), cipher);
+ subdata = new SubDataClient(this, config.get().getSection("Settings").getSection("SubData").getString("Name", null),
+ InetAddress.getByName(config.get().getSection("Settings").getSection("SubData").getRawString("Address", "127.0.0.1:4391").split(":")[0]),
+ Integer.parseInt(config.get().getSection("Settings").getSection("SubData").getRawString("Address", "127.0.0.1:4391").split(":")[1]), cipher);
super.startListeners();
if (!posted) {
@@ -115,7 +118,6 @@ public final class SubPlugin extends BungeeCord implements Listener {
}
private void post() {
- if (getPluginManager().getPlugin("RedisBungee") != null) redis = true;
if (config.get().getSection("Settings").getBoolean("Override-Bungee-Commands", true)) {
getPluginManager().registerCommand(null, SubCommand.BungeeServer.newInstance(this, "server").get());
getPluginManager().registerCommand(null, new SubCommand.BungeeList(this, "glist"));
|