Implement Multi-Channel SubData

This commit is contained in:
ME1312 2019-05-09 22:43:34 -04:00
parent 1952e7b940
commit 504dc7bac4
No known key found for this signature in database
GPG Key ID: FEFFE2F698E88FA8
28 changed files with 333 additions and 159 deletions

View File

@ -30,13 +30,13 @@
<dependency> <dependency>
<groupId>net.ME1312.Galaxi</groupId> <groupId>net.ME1312.Galaxi</groupId>
<artifactId>GalaxiUtil</artifactId> <artifactId>GalaxiUtil</artifactId>
<version>19w16a</version> <version>19w19b</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.ME1312.SubData</groupId> <groupId>net.ME1312.SubData</groupId>
<artifactId>Server</artifactId> <artifactId>Server</artifactId>
<version>19w18a</version> <version>19w19c</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -1,8 +1,8 @@
package net.ME1312.SubServers.Bungee.Host.External; package net.ME1312.SubServers.Bungee.Host.External;
import com.google.common.collect.Range; import com.google.common.collect.Range;
import net.ME1312.SubData.Server.ClientHandler;
import net.ME1312.SubData.Server.DataClient; import net.ME1312.SubData.Server.DataClient;
import net.ME1312.SubData.Server.SerializableClientHandler;
import net.ME1312.SubData.Server.SubDataClient; import net.ME1312.SubData.Server.SubDataClient;
import net.ME1312.SubServers.Bungee.Event.SubAddServerEvent; import net.ME1312.SubServers.Bungee.Event.SubAddServerEvent;
import net.ME1312.SubServers.Bungee.Event.SubRemoveServerEvent; import net.ME1312.SubServers.Bungee.Event.SubRemoveServerEvent;
@ -11,7 +11,6 @@ import net.ME1312.SubServers.Bungee.Host.SubCreator;
import net.ME1312.SubServers.Bungee.Host.SubServer; import net.ME1312.SubServers.Bungee.Host.SubServer;
import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException; import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException;
import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Server.Protocol.PacketObjectOut; import net.ME1312.SubData.Server.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Bungee.Network.Packet.PacketExAddServer; import net.ME1312.SubServers.Bungee.Network.Packet.PacketExAddServer;
@ -26,14 +25,15 @@ import java.util.*;
/** /**
* External Host Class * External Host Class
*/ */
public class ExternalHost extends Host implements SerializableClientHandler { public class ExternalHost extends Host implements ClientHandler {
private HashMap<Integer, SubDataClient> subdata = new HashMap<Integer, SubDataClient>();
private HashMap<String, SubServer> servers = new HashMap<String, SubServer>(); private HashMap<String, SubServer> servers = new HashMap<String, SubServer>();
private String name; private String name;
protected boolean available;
private boolean enabled; private boolean enabled;
private InetAddress address; private InetAddress address;
private SubCreator creator; private SubCreator creator;
private String directory; private String directory;
protected NamedContainer<Boolean, SubDataClient> client;
private LinkedList<PacketObjectOut> queue; private LinkedList<PacketObjectOut> queue;
private boolean clean; private boolean clean;
protected SubPlugin plugin; protected SubPlugin plugin;
@ -54,51 +54,69 @@ public class ExternalHost extends Host implements SerializableClientHandler {
super(plugin, name, enabled, ports, log, address, directory, gitBash); super(plugin, name, enabled, ports, log, address, directory, gitBash);
this.plugin = plugin; this.plugin = plugin;
this.name = name; this.name = name;
this.available = false;
this.enabled = enabled; this.enabled = enabled;
this.address = address; this.address = address;
this.client = new NamedContainer<Boolean, SubDataClient>(false, null);
this.creator = new ExternalSubCreator(this, ports, log, gitBash); this.creator = new ExternalSubCreator(this, ports, log, gitBash);
this.directory = directory; this.directory = directory;
this.queue = new LinkedList<PacketObjectOut>(); this.queue = new LinkedList<PacketObjectOut>();
this.clean = false; this.clean = false;
setSubData(null, 0);
} }
@Override @Override
public DataClient getSubData() { public DataClient[] getSubData() {
return client.get(); LinkedList<Integer> keys = new LinkedList<Integer>(subdata.keySet());
LinkedList<SubDataClient> channels = new LinkedList<SubDataClient>();
Collections.sort(keys);
for (Integer channel : keys) channels.add(subdata.get(channel));
return channels.toArray(new DataClient[0]);
}
public void setSubData(DataClient client, int channel) {
if (channel < 0) throw new IllegalArgumentException("Subchannel ID cannot be less than zero");
if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(channel) == null)) {
if (client != null || channel == 0) {
subdata.put(channel, (SubDataClient) client);
if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
} else {
subdata.remove(channel);
}
}
} }
@Override @Override
public void setSubData(DataClient client) { public void removeSubData(DataClient client) {
this.client = new NamedContainer<Boolean, SubDataClient>(false, (SubDataClient) client); for (Integer channel : Util.getBackwards(subdata, (SubDataClient) client)) setSubData(null, channel);
if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
} }
protected void queue(PacketObjectOut... packet) { protected void queue(PacketObjectOut... packet) {
for (PacketObjectOut p : packet) if (client.get() == null || client.name() == false) { for (PacketObjectOut p : packet) if (getSubData()[0] == null || !available) {
queue.add(p); queue.add(p);
} else { } else {
client.get().sendPacket(p); ((SubDataClient) getSubData()[0]).sendPacket(p);
} }
} }
private void requeue() { private void requeue() {
SubDataClient client = (SubDataClient) getSubData()[0];
if (!clean) { if (!clean) {
client.get().sendPacket(new PacketOutExReset("Prevent Desync")); client.sendPacket(new PacketOutExReset("Prevent Desync"));
clean = true; clean = true;
} }
for (SubServer server : servers.values()) { for (SubServer server : servers.values()) {
client.get().sendPacket(new PacketExAddServer(server.getName(), server.isEnabled(), server.getAddress().getPort(), server.isLogging(), server.getPath(), ((ExternalSubServer) server).exec, server.getStopCommand(), (server.isRunning())?((ExternalSubLogger) server.getLogger()).getExternalAddress():null)); client.sendPacket(new PacketExAddServer(server.getName(), server.isEnabled(), server.getAddress().getPort(), server.isLogging(), server.getPath(), ((ExternalSubServer) server).exec, server.getStopCommand(), (server.isRunning())?((ExternalSubLogger) server.getLogger()).getExternalAddress():null));
} }
while (queue.size() != 0) { while (queue.size() != 0) {
client.get().sendPacket(queue.get(0)); client.sendPacket(queue.get(0));
queue.remove(0); queue.remove(0);
} }
client.rename(true); available = true;
} }
@Override @Override
public boolean isAvailable() { public boolean isAvailable() {
return this.client.name(); return available;
} }
@Override @Override

View File

@ -66,7 +66,7 @@ public class ExternalSubCreator extends SubCreator {
e.printStackTrace(); e.printStackTrace();
} }
} }
if (host.client.name()) host.queue(new PacketExConfigureHost(host.plugin, host)); if (host.available) host.queue(new PacketExConfigureHost(host.plugin, host));
} }
@Override @Override
@ -195,7 +195,7 @@ public class ExternalSubCreator extends SubCreator {
@Override @Override
public void terminate(String name) { public void terminate(String name) {
if (this.thread.keySet().contains(name.toLowerCase())) { if (this.thread.keySet().contains(name.toLowerCase())) {
((SubDataClient) host.getSubData()).sendPacket(new PacketExCreateServer(name.toLowerCase())); ((SubDataClient) host.getSubData()[0]).sendPacket(new PacketExCreateServer(name.toLowerCase()));
thread.remove(name.toLowerCase()); thread.remove(name.toLowerCase());
} }
} }
@ -211,7 +211,7 @@ public class ExternalSubCreator extends SubCreator {
@Override @Override
public void waitFor(String name) throws InterruptedException { public void waitFor(String name) throws InterruptedException {
while (this.thread.keySet().contains(name.toLowerCase()) && host.client.get() != null) { while (this.thread.keySet().contains(name.toLowerCase()) && host.getSubData()[0] != null) {
Thread.sleep(250); Thread.sleep(250);
} }
} }

View File

@ -442,7 +442,7 @@ public class ExternalSubServer extends SubServerContainer {
@Override @Override
public void waitFor() throws InterruptedException { public void waitFor() throws InterruptedException {
while (running && host.client.get() != null) { while (running && host.getSubData()[0] != null) {
Thread.sleep(250); Thread.sleep(250);
} }
} }

View File

@ -3,6 +3,7 @@ package net.ME1312.SubServers.Bungee.Host;
import com.google.common.collect.Range; import com.google.common.collect.Range;
import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Map.ObjectMapValue; import net.ME1312.Galaxi.Library.Map.ObjectMapValue;
import net.ME1312.SubData.Server.DataClient;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidHostException; import net.ME1312.SubServers.Bungee.Library.Exception.InvalidHostException;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException; import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException;
import net.ME1312.Galaxi.Library.ExtraDataHandler; import net.ME1312.Galaxi.Library.ExtraDataHandler;
@ -12,6 +13,7 @@ import net.ME1312.SubServers.Bungee.SubAPI;
import net.ME1312.SubServers.Bungee.SubPlugin; import net.ME1312.SubServers.Bungee.SubPlugin;
import java.net.InetAddress; import java.net.InetAddress;
import java.util.LinkedList;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@ -448,7 +450,11 @@ public abstract class Host implements ExtraDataHandler {
servers.set(server.getName(), server.forSubData()); servers.set(server.getName(), server.forSubData());
} }
hinfo.set("servers", servers); hinfo.set("servers", servers);
if (this instanceof ClientHandler && ((ClientHandler) this).getSubData() != null) hinfo.set("subdata", ((ClientHandler) this).getSubData().getID()); if (this instanceof ClientHandler) {
LinkedList<UUID> subdata = new LinkedList<UUID>();
for (DataClient client : ((ClientHandler) this).getSubData()) subdata.add((client == null)?null:client.getID());
hinfo.set("subdata", subdata);
}
hinfo.set("signature", signature); hinfo.set("signature", signature);
hinfo.set("extra", getExtra()); hinfo.set("extra", getExtra());
return hinfo; return hinfo;

View File

@ -1,7 +1,6 @@
package net.ME1312.SubServers.Bungee.Host; package net.ME1312.SubServers.Bungee.Host;
import net.ME1312.SubData.Server.DataClient; import net.ME1312.SubData.Server.DataClient;
import net.ME1312.SubData.Server.SerializableClientHandler;
import net.ME1312.SubData.Server.SubDataClient; import net.ME1312.SubData.Server.SubDataClient;
import net.ME1312.SubServers.Bungee.Event.SubRemoveProxyEvent; import net.ME1312.SubServers.Bungee.Event.SubRemoveProxyEvent;
import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Map.ObjectMap;
@ -19,11 +18,11 @@ import java.util.*;
/** /**
* Proxy Class * Proxy Class
*/ */
public class Proxy implements SerializableClientHandler, ExtraDataHandler { public class Proxy implements ClientHandler, ExtraDataHandler {
private HashMap<Integer, SubDataClient> subdata = new HashMap<Integer, SubDataClient>();
private ObjectMap<String> extra = new ObjectMap<String>(); private ObjectMap<String> extra = new ObjectMap<String>();
private final String signature; private final String signature;
private boolean persistent = true; private boolean persistent = true;
private SubDataClient client = null;
private String nick = null; private String nick = null;
private final String name; private final String name;
@ -36,22 +35,41 @@ public class Proxy implements SerializableClientHandler, ExtraDataHandler {
if (name.contains(" ")) throw new IllegalArgumentException("Proxy names cannot have spaces: " + name); if (name.contains(" ")) throw new IllegalArgumentException("Proxy names cannot have spaces: " + name);
this.name = name; this.name = name;
this.signature = SubAPI.getInstance().signAnonymousObject(); this.signature = SubAPI.getInstance().signAnonymousObject();
setSubData(null, 0);
} }
@Override @Override
public DataClient getSubData() { public DataClient[] getSubData() {
return client; LinkedList<Integer> keys = new LinkedList<Integer>(subdata.keySet());
LinkedList<SubDataClient> channels = new LinkedList<SubDataClient>();
Collections.sort(keys);
for (Integer channel : keys) channels.add(subdata.get(channel));
return channels.toArray(new DataClient[0]);
} }
@Override
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public void setSubData(DataClient client) { public void setSubData(DataClient client, int channel) {
this.client = (SubDataClient) client; if (channel < 0) throw new IllegalArgumentException("Subchannel ID cannot be less than zero");
if (client == null && !persistent) { if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(channel) == null)) {
ProxyServer.getInstance().getPluginManager().callEvent(new SubRemoveProxyEvent(this)); if (client != null || channel == 0) {
SubAPI.getInstance().getInternals().proxies.remove(getName().toLowerCase()); subdata.put(channel, (SubDataClient) client);
if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
} else {
subdata.remove(channel);
}
DataClient[] subdata = getSubData();
if (subdata[0] == null && subdata.length <= 1 && !persistent) {
ProxyServer.getInstance().getPluginManager().callEvent(new SubRemoveProxyEvent(this));
SubAPI.getInstance().getInternals().proxies.remove(getName().toLowerCase());
}
} }
if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this); }
@Override
public void removeSubData(DataClient client) {
for (Integer channel : Util.getBackwards(subdata, (SubDataClient) client)) setSubData(null, channel);
} }
/** /**
@ -166,7 +184,9 @@ public class Proxy implements SerializableClientHandler, ExtraDataHandler {
} }
info.set("players", players); info.set("players", players);
info.set("redis", isRedis()); info.set("redis", isRedis());
if (getSubData() != null) info.set("subdata", getSubData().getID()); LinkedList<UUID> subdata = new LinkedList<UUID>();
for (DataClient client : getSubData()) subdata.add((client == null)?null:client.getID());
info.set("subdata", subdata);
info.set("signature", signature); info.set("signature", signature);
info.set("extra", getExtra()); info.set("extra", getExtra());
return info; return info;

View File

@ -3,7 +3,7 @@ package net.ME1312.SubServers.Bungee.Host;
import net.ME1312.Galaxi.Library.ExtraDataHandler; import net.ME1312.Galaxi.Library.ExtraDataHandler;
import net.ME1312.Galaxi.Library.NamedContainer; import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.SubData.Server.ClientHandler; import net.ME1312.SubData.Server.ClientHandler;
import net.ME1312.SubData.Server.SerializableClientHandler; import net.ME1312.SubData.Server.DataClient;
import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.config.ServerInfo;
import java.util.Collection; import java.util.Collection;
@ -13,7 +13,15 @@ import java.util.UUID;
/** /**
* Server Interface * Server Interface
*/ */
public interface Server extends ServerInfo, SerializableClientHandler, ExtraDataHandler { public interface Server extends ServerInfo, ClientHandler, ExtraDataHandler {
/**
* Link a SubData Client to this Object
*
* @param client Client to Link
* @param channel Channel ID
*/
void setSubData(DataClient client, int channel);
/** /**
* Get the Display Name of this Server * Get the Display Name of this Server

View File

@ -25,8 +25,8 @@ import java.util.*;
* Server Class * Server Class
*/ */
public class ServerContainer extends BungeeServerInfo implements Server { public class ServerContainer extends BungeeServerInfo implements Server {
private HashMap<Integer, SubDataClient> subdata = new HashMap<Integer, SubDataClient>();
private ObjectMap<String> extra = new ObjectMap<String>(); private ObjectMap<String> extra = new ObjectMap<String>();
private SubDataClient client = null;
private String nick = null; private String nick = null;
private List<String> groups = new ArrayList<String>(); private List<String> groups = new ArrayList<String>();
private List<UUID> whitelist = new ArrayList<UUID>(); private List<UUID> whitelist = new ArrayList<UUID>();
@ -40,23 +40,42 @@ public class ServerContainer extends BungeeServerInfo implements Server {
signature = SubAPI.getInstance().signAnonymousObject(); signature = SubAPI.getInstance().signAnonymousObject();
SubAPI.getInstance().getSubDataNetwork().getProtocol().whitelist(getAddress().getAddress().getHostAddress()); SubAPI.getInstance().getSubDataNetwork().getProtocol().whitelist(getAddress().getAddress().getHostAddress());
this.hidden = hidden; this.hidden = hidden;
setSubData(null, 0);
} }
@Override @Override
public DataClient getSubData() { public DataClient[] getSubData() {
return client; LinkedList<Integer> keys = new LinkedList<Integer>(subdata.keySet());
LinkedList<SubDataClient> channels = new LinkedList<SubDataClient>();
Collections.sort(keys);
for (Integer channel : keys) channels.add(subdata.get(channel));
return channels.toArray(new DataClient[0]);
} }
@Override public void setSubData(DataClient client, int channel) {
public void setSubData(DataClient client) { if (channel < 0) throw new IllegalArgumentException("Subchannel ID cannot be less than zero");
this.client = (SubDataClient) client; if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(channel) == null)) {
for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData() != null) { if (client != null || channel == 0) {
ObjectMap<String> args = new ObjectMap<String>(); subdata.put(channel, (SubDataClient) client);
args.set("server", getName()); if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this);
if (client != null) args.set("address", client.getAddress().toString()); } else {
((SubDataClient) proxy.getSubData()).sendPacket(new PacketOutExRunEvent((client != null)?SubNetworkConnectEvent.class:SubNetworkDisconnectEvent.class, args)); subdata.remove(channel);
}
for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData()[0] != null) {
ObjectMap<String> args = new ObjectMap<String>();
args.set("server", getName());
args.set("channel", channel);
if (client != null) args.set("address", client.getAddress().toString());
((SubDataClient) proxy.getSubData()[0]).sendPacket(new PacketOutExRunEvent((client != null)?SubNetworkConnectEvent.class:SubNetworkDisconnectEvent.class, args));
}
} }
if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) ((SubDataClient) client).setHandler(this); }
@Override
public void removeSubData(DataClient client) {
for (Integer channel : Util.getBackwards(subdata, (SubDataClient) client)) setSubData(null, channel);
} }
@Override @Override
@ -174,14 +193,14 @@ public class ServerContainer extends BungeeServerInfo implements Server {
public void whitelist(UUID player) { public void whitelist(UUID player) {
if (Util.isNull(player)) throw new NullPointerException(); if (Util.isNull(player)) throw new NullPointerException();
whitelist.add(player); whitelist.add(player);
for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData() != null) ((SubDataClient) proxy.getSubData()).sendPacket(new PacketOutExUpdateWhitelist(getName(), true, player)); for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData()[0] != null) ((SubDataClient) proxy.getSubData()[0]).sendPacket(new PacketOutExUpdateWhitelist(getName(), true, player));
} }
@Override @Override
public void unwhitelist(UUID player) { public void unwhitelist(UUID player) {
if (Util.isNull(player)) throw new NullPointerException(); if (Util.isNull(player)) throw new NullPointerException();
whitelist.remove(player); whitelist.remove(player);
for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData() != null) ((SubDataClient) proxy.getSubData()).sendPacket(new PacketOutExUpdateWhitelist(getName(), false, player)); for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData()[0] != null) ((SubDataClient) proxy.getSubData()[0]).sendPacket(new PacketOutExUpdateWhitelist(getName(), false, player));
} }
@Override @Override
@ -237,7 +256,9 @@ public class ServerContainer extends BungeeServerInfo implements Server {
players.set(player.get().toString(), pinfo); players.set(player.get().toString(), pinfo);
} }
info.set("players", players); info.set("players", players);
if (getSubData() != null) info.set("subdata", getSubData().getID()); LinkedList<UUID> subdata = new LinkedList<UUID>();
for (DataClient client : getSubData()) subdata.add((client == null)?null:client.getID());
info.set("subdata", subdata);
info.set("signature", signature); info.set("signature", signature);
info.set("extra", getExtra()); info.set("extra", getExtra());
return info; return info;

View File

@ -77,7 +77,7 @@ public class SmartReconnectHandler implements ReconnectHandler {
if (server instanceof Server) { if (server instanceof Server) {
if (!((Server) server).isHidden()) confidence++; if (!((Server) server).isHidden()) confidence++;
if (!((Server) server).isRestricted()) confidence++; if (!((Server) server).isRestricted()) confidence++;
if (((Server) server).getSubData() != null) confidence++; if (((Server) server).getSubData()[0] != null) confidence++;
} if (server instanceof SubServer) { } if (server instanceof SubServer) {
if (!((SubServer) server).isRunning()) valid = false; if (!((SubServer) server).isRunning()) valid = false;
} }

View File

@ -1,14 +1,17 @@
package net.ME1312.SubServers.Bungee.Network.Packet; package net.ME1312.SubServers.Bungee.Network.Packet;
import net.ME1312.SubData.Server.SubDataClient; import net.ME1312.SubData.Server.SubDataClient;
import net.ME1312.SubServers.Bungee.Host.External.ExternalHost;
import net.ME1312.SubServers.Bungee.Host.Host; import net.ME1312.SubServers.Bungee.Host.Host;
import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Server.ClientHandler; import net.ME1312.SubData.Server.ClientHandler;
import net.ME1312.SubData.Server.Protocol.PacketObjectIn; import net.ME1312.SubData.Server.Protocol.PacketObjectIn;
import net.ME1312.SubData.Server.Protocol.PacketObjectOut; import net.ME1312.SubData.Server.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Bungee.Host.ServerContainer;
import net.ME1312.SubServers.Bungee.SubPlugin; import net.ME1312.SubServers.Bungee.SubPlugin;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
@ -50,10 +53,12 @@ public class PacketLinkExHost implements PacketObjectIn<Integer>, PacketObjectOu
Map<String, Host> hosts = plugin.api.getHosts(); Map<String, Host> hosts = plugin.api.getHosts();
if (hosts.keySet().contains(data.getRawString(0x0000).toLowerCase())) { if (hosts.keySet().contains(data.getRawString(0x0000).toLowerCase())) {
Host host = hosts.get(data.getRawString(0x0000).toLowerCase()); Host host = hosts.get(data.getRawString(0x0000).toLowerCase());
if (host instanceof ClientHandler) { if (host instanceof ExternalHost) {
if (((ClientHandler) host).getSubData() == null) { Integer channel = data.getInt(0x0001);
client.setHandler((ClientHandler) host); HashMap<Integer, SubDataClient> subdata = Util.getDespiteException(() -> Util.reflect(ExternalHost.class.getDeclaredField("subdata"), host), null);
System.out.println("SubData > " + client.getAddress().toString() + " has been defined as Host: " + host.getName()); if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) {
((ExternalHost) host).setSubData(client, channel);
System.out.println("SubData > " + client.getAddress().toString() + " has been defined as Host: " + host.getName() + ((channel > 0)?" (Sub "+channel+")":""));
client.sendPacket(new PacketLinkExHost(0)); client.sendPacket(new PacketLinkExHost(0));
} else { } else {
client.sendPacket(new PacketLinkExHost(3)); client.sendPacket(new PacketLinkExHost(3));

View File

@ -8,8 +8,10 @@ import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.SubData.Server.SubDataClient; import net.ME1312.SubData.Server.SubDataClient;
import net.ME1312.SubData.Server.Protocol.PacketObjectOut; import net.ME1312.SubData.Server.Protocol.PacketObjectOut;
import net.ME1312.SubData.Server.Protocol.PacketObjectIn; import net.ME1312.SubData.Server.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Bungee.Host.ServerContainer;
import net.ME1312.SubServers.Bungee.SubPlugin; import net.ME1312.SubServers.Bungee.SubPlugin;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
@ -54,18 +56,24 @@ public class PacketLinkProxy implements PacketObjectIn<Integer>, PacketObjectOut
try { try {
Map<String, Proxy> proxies = plugin.api.getProxies(); Map<String, Proxy> proxies = plugin.api.getProxies();
String name = ((data.contains(0x0000))?data.getRawString(0x0000):null); String name = ((data.contains(0x0000))?data.getRawString(0x0000):null);
Integer channel = data.getInt(0x0001);
Proxy proxy; Proxy proxy;
if (name != null && proxies.keySet().contains(name.toLowerCase()) && proxies.get(name.toLowerCase()).getSubData() == null) { if (name != null && proxies.keySet().contains(name.toLowerCase())) {
proxy = proxies.get(name.toLowerCase()); proxy = proxies.get(name.toLowerCase());
} else { } else {
proxy = new Proxy((name != null && !proxies.keySet().contains(name.toLowerCase()))?name:null); proxy = new Proxy((name != null && !proxies.keySet().contains(name.toLowerCase()))?name:null);
plugin.getPluginManager().callEvent(new SubAddProxyEvent(proxy)); plugin.getPluginManager().callEvent(new SubAddProxyEvent(proxy));
plugin.proxies.put(proxy.getName().toLowerCase(), proxy); plugin.proxies.put(proxy.getName().toLowerCase(), proxy);
} }
HashMap<Integer, SubDataClient> subdata = Util.getDespiteException(() -> Util.reflect(Proxy.class.getDeclaredField("subdata"), proxy), null);
if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) {
proxy.setSubData(client, channel);
System.out.println("SubData > " + client.getAddress().toString() + " has been defined as Proxy: " + proxy.getName() + ((channel > 0)?" (Sub "+channel+")":""));
client.sendPacket(new PacketLinkProxy(proxy.getName(), 0));
} else {
client.sendPacket(new PacketLinkProxy(proxy.getName(), 2));
client.setHandler(proxy); }
System.out.println("SubData > " + client.getAddress().toString() + " has been defined as Proxy: " + proxy.getName());
client.sendPacket(new PacketLinkProxy(proxy.getName(), 0));
} catch (Exception e) { } catch (Exception e) {
client.sendPacket(new PacketLinkProxy(null, 1)); client.sendPacket(new PacketLinkProxy(null, 1));
e.printStackTrace(); e.printStackTrace();

View File

@ -1,7 +1,9 @@
package net.ME1312.SubServers.Bungee.Network.Packet; package net.ME1312.SubServers.Bungee.Network.Packet;
import net.ME1312.SubData.Server.DataClient;
import net.ME1312.SubData.Server.SubDataClient; import net.ME1312.SubData.Server.SubDataClient;
import net.ME1312.SubServers.Bungee.Host.Server; import net.ME1312.SubServers.Bungee.Host.Server;
import net.ME1312.SubServers.Bungee.Host.ServerContainer;
import net.ME1312.SubServers.Bungee.Host.SubServer; import net.ME1312.SubServers.Bungee.Host.SubServer;
import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Util;
@ -10,6 +12,7 @@ import net.ME1312.SubData.Server.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Bungee.SubPlugin; import net.ME1312.SubServers.Bungee.SubPlugin;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
@ -64,15 +67,16 @@ public class PacketLinkServer implements PacketObjectIn<Integer>, PacketObjectOu
public void receive(SubDataClient client, ObjectMap<Integer> data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
String name = (data.contains(0x0000))?data.getRawString(0x0000):null; String name = (data.contains(0x0000))?data.getRawString(0x0000):null;
Integer port = (data.contains(0x0001))?data.getInt(0x0001):null; Integer port = (data.contains(0x0001))?data.getInt(0x0001):null;
Integer channel = data.getInt(0x0002);
try { try {
Map<String, Server> servers = plugin.api.getServers(); Map<String, Server> servers = plugin.api.getServers();
Server server; Server server;
if (name != null && servers.keySet().contains(name.toLowerCase())) { if (name != null && servers.keySet().contains(name.toLowerCase())) {
link(client, servers.get(name.toLowerCase())); link(client, servers.get(name.toLowerCase()), channel);
} else if (port != null) { } else if (port != null) {
if ((server = search(new InetSocketAddress(client.getAddress().getAddress(), port))) != null) { if ((server = search(new InetSocketAddress(client.getAddress().getAddress(), port))) != null) {
link(client, server); link(client, server, channel);
} else { } else {
throw new ServerLinkException("There is no server with address: " + client.getAddress().getAddress().getHostAddress() + ':' + port); throw new ServerLinkException("There is no server with address: " + client.getAddress().getAddress().getHostAddress() + ':' + port);
} }
@ -91,10 +95,11 @@ public class PacketLinkServer implements PacketObjectIn<Integer>, PacketObjectOu
} }
} }
private void link(SubDataClient client, Server server) { private void link(SubDataClient client, Server server, int channel) {
if (server.getSubData() == null) { HashMap<Integer, SubDataClient> subdata = Util.getDespiteException(() -> Util.reflect(ServerContainer.class.getDeclaredField("subdata"), server), null);
client.setHandler(server); if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) {
System.out.println("SubData > " + client.getAddress().toString() + " has been defined as " + ((server instanceof SubServer) ? "SubServer" : "Server") + ": " + server.getName()); server.setSubData(client, channel);
System.out.println("SubData > " + client.getAddress().toString() + " has been defined as " + ((server instanceof SubServer) ? "SubServer" : "Server") + ": " + server.getName() + ((channel > 0)?" (Sub "+channel+")":""));
if (server instanceof SubServer && !((SubServer) server).isRunning()) { if (server instanceof SubServer && !((SubServer) server).isRunning()) {
System.out.println("SubServers > Sending shutdown signal to rogue SubServer: " + server.getName()); System.out.println("SubServers > Sending shutdown signal to rogue SubServer: " + server.getName());
client.sendPacket(new PacketOutExReset("Rogue SubServer Detected")); client.sendPacket(new PacketOutExReset("Rogue SubServer Detected"));

View File

@ -247,9 +247,9 @@ public final class SubCommand extends CommandX {
message = " (master)"; message = " (master)";
for (Proxy proxy : plugin.api.getProxies().values()) { for (Proxy proxy : plugin.api.getProxies().values()) {
message += div; message += div;
if (proxy.getSubData() != null && proxy.isRedis()) { if (proxy.getSubData()[0] != null && proxy.isRedis()) {
message += ChatColor.GREEN; message += ChatColor.GREEN;
} else if (proxy.getSubData() != null) { } else if (proxy.getSubData()[0] != null) {
message += ChatColor.AQUA; message += ChatColor.AQUA;
} else if (proxy.isRedis()) { } else if (proxy.isRedis()) {
message += ChatColor.WHITE; message += ChatColor.WHITE;
@ -280,7 +280,7 @@ public final class SubCommand extends CommandX {
sender.sendMessage(" -> Address: " + ChatColor.WHITE + server.getAddress().getAddress().getHostAddress()+':'+server.getAddress().getPort()); sender.sendMessage(" -> Address: " + ChatColor.WHITE + server.getAddress().getAddress().getHostAddress()+':'+server.getAddress().getPort());
if (server instanceof SubServer) sender.sendMessage(" -> Running: " + ((((SubServer) server).isRunning())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); if (server instanceof SubServer) sender.sendMessage(" -> Running: " + ((((SubServer) server).isRunning())?ChatColor.GREEN+"yes":ChatColor.RED+"no"));
if (!(server instanceof SubServer) || ((SubServer) server).isRunning()) { if (!(server instanceof SubServer) || ((SubServer) server).isRunning()) {
sender.sendMessage(" -> Connected: " + ((server.getSubData() != null)?ChatColor.GREEN+"yes":ChatColor.RED+"no")); sender.sendMessage(" -> Connected: " + ((server.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((server.getSubData().length > 1)?ChatColor.AQUA+" +"+(server.getSubData().length-1):""):ChatColor.RED+"no"));
sender.sendMessage(" -> Players: " + ChatColor.AQUA + server.getPlayers().size() + " online"); sender.sendMessage(" -> Players: " + ChatColor.AQUA + server.getPlayers().size() + " online");
} }
sender.sendMessage(" -> MOTD: " + ChatColor.WHITE + ChatColor.stripColor(server.getMotd())); sender.sendMessage(" -> MOTD: " + ChatColor.WHITE + ChatColor.stripColor(server.getMotd()));
@ -325,7 +325,7 @@ public final class SubCommand extends CommandX {
sender.sendMessage(" -> Available: " + ((host.isAvailable())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); sender.sendMessage(" -> Available: " + ((host.isAvailable())?ChatColor.GREEN+"yes":ChatColor.RED+"no"));
sender.sendMessage(" -> Enabled: " + ((host.isEnabled())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); sender.sendMessage(" -> Enabled: " + ((host.isEnabled())?ChatColor.GREEN+"yes":ChatColor.RED+"no"));
sender.sendMessage(" -> Address: " + ChatColor.WHITE + host.getAddress().getHostAddress()); sender.sendMessage(" -> Address: " + ChatColor.WHITE + host.getAddress().getHostAddress());
if (host instanceof ClientHandler && ((ClientHandler) host).getSubData() != null) sender.sendMessage(" -> Connected: " + ChatColor.GREEN + "yes"); if (host instanceof ClientHandler && ((ClientHandler) host).getSubData()[0] != null) sender.sendMessage(" -> Connected: " + ChatColor.GREEN + "yes" + ((((ClientHandler) host).getSubData().length > 1)?ChatColor.AQUA+" +"+(((ClientHandler) host).getSubData().length-1):""));
sender.sendMessage(" -> SubServers: " + ((host.getSubServers().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getSubServers().keySet().size())); sender.sendMessage(" -> SubServers: " + ((host.getSubServers().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getSubServers().keySet().size()));
for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(" - " + ((subserver.isEnabled())?ChatColor.WHITE:ChatColor.GRAY) + subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')')); for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(" - " + ((subserver.isEnabled())?ChatColor.WHITE:ChatColor.GRAY) + subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')'));
sender.sendMessage(" -> Templates: " + ((host.getCreator().getTemplates().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getCreator().getTemplates().keySet().size())); sender.sendMessage(" -> Templates: " + ((host.getCreator().getTemplates().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getCreator().getTemplates().keySet().size()));
@ -344,7 +344,7 @@ public final class SubCommand extends CommandX {
if (proxy != null) { if (proxy != null) {
sender.sendMessage("SubServers > Info on Proxy: " + ChatColor.WHITE + proxy.getDisplayName()); sender.sendMessage("SubServers > Info on Proxy: " + ChatColor.WHITE + proxy.getDisplayName());
if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(" -> System Name: " + ChatColor.WHITE + proxy.getName()); if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(" -> System Name: " + ChatColor.WHITE + proxy.getName());
sender.sendMessage(" -> Connected: " + ((proxy.getSubData() != null)?ChatColor.GREEN+"yes":ChatColor.RED+"no")); sender.sendMessage(" -> Connected: " + ((proxy.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((proxy.getSubData().length > 1)?ChatColor.AQUA+" +"+(proxy.getSubData().length-1):""):ChatColor.RED+"no"));
sender.sendMessage(" -> Redis: " + ((proxy.isRedis())?ChatColor.GREEN:ChatColor.RED+"un") + "available"); sender.sendMessage(" -> Redis: " + ((proxy.isRedis())?ChatColor.GREEN:ChatColor.RED+"un") + "available");
if (proxy.isRedis()) sender.sendMessage(" -> Players: " + ChatColor.AQUA + proxy.getPlayers().size() + " online"); if (proxy.isRedis()) sender.sendMessage(" -> Players: " + ChatColor.AQUA + proxy.getPlayers().size() + " online");
sender.sendMessage(" -> Signature: " + ChatColor.AQUA + proxy.getSignature()); sender.sendMessage(" -> Signature: " + ChatColor.AQUA + proxy.getSignature());

View File

@ -46,6 +46,7 @@ import java.nio.file.Files;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -424,8 +425,8 @@ public final class SubPlugin extends BungeeCord implements Listener {
} }
if (bungee.get().getMap("servers").getMap(name).getKeys().contains("extra")) if (bungee.get().getMap("servers").getMap(name).getKeys().contains("extra"))
for (String extra : config.get().getMap("servers").getMap(name).getMap("extra").getKeys()) server.addExtra(extra, config.get().getMap("servers").getMap(name).getMap("extra").getObject(extra)); for (String extra : config.get().getMap("servers").getMap(name).getMap("extra").getKeys()) server.addExtra(extra, config.get().getMap("servers").getMap(name).getMap("extra").getObject(extra));
if (server.getSubData() != null) if (server.getSubData()[0] != null)
((SubDataClient) server.getSubData()).sendPacket(new PacketOutExReload(null)); ((SubDataClient) server.getSubData()[0]).sendPacket(new PacketOutExReload(null));
ukeys.add(name.toLowerCase()); ukeys.add(name.toLowerCase());
servers++; servers++;
} }
@ -563,8 +564,8 @@ public final class SubPlugin extends BungeeCord implements Listener {
} }
if (status) { if (status) {
for (Host host : api.getHosts().values()) if (host instanceof ClientHandler && ((ClientHandler) host).getSubData() != null) ((SubDataClient) ((ClientHandler) host).getSubData()).sendPacket(new PacketOutExReload(null)); for (Host host : api.getHosts().values()) if (host instanceof ClientHandler && ((ClientHandler) host).getSubData()[0] != null) ((SubDataClient) ((ClientHandler) host).getSubData()[0]).sendPacket(new PacketOutExReload(null));
for (Server server : api.getServers().values()) if (server.getSubData() != null) ((SubDataClient) server.getSubData()).sendPacket(new PacketOutExReload(null)); for (Server server : api.getServers().values()) if (server.getSubData()[0] != null) ((SubDataClient) server.getSubData()[0]).sendPacket(new PacketOutExReload(null));
} }
System.out.println("SubServers > " + ((plugins > 0)?plugins+" Plugin"+((plugins == 1)?"":"s")+", ":"") + ((proxies > 1)?proxies+" Proxies, ":"") + hosts + " Host"+((hosts == 1)?"":"s")+", " + servers + " Server"+((servers == 1)?"":"s")+", and " + subservers + " SubServer"+((subservers == 1)?"":"s")+" "+((status)?"re":"")+"loaded in " + new DecimalFormat("0.000").format((Calendar.getInstance().getTime().getTime() - begin) / 1000D) + "s"); System.out.println("SubServers > " + ((plugins > 0)?plugins+" Plugin"+((plugins == 1)?"":"s")+", ":"") + ((proxies > 1)?proxies+" Proxies, ":"") + hosts + " Host"+((hosts == 1)?"":"s")+", " + servers + " Server"+((servers == 1)?"":"s")+", and " + subservers + " SubServer"+((subservers == 1)?"":"s")+" "+((status)?"re":"")+"loaded in " + new DecimalFormat("0.000").format((Calendar.getInstance().getTime().getTime() - begin) / 1000D) + "s");
@ -586,7 +587,7 @@ public final class SubPlugin extends BungeeCord implements Listener {
server.start(); server.start();
if (ar.size() > 0 && scd > 0) { if (ar.size() > 0 && scd > 0) {
long sleep = Calendar.getInstance().getTime().getTime(); long sleep = Calendar.getInstance().getTime().getTime();
while (running && begin == resetDate && server.getSubData() == null && Calendar.getInstance().getTime().getTime() - sleep < scd) { while (running && begin == resetDate && server.getSubData()[0] == null && Calendar.getInstance().getTime().getTime() - sleep < scd) {
Thread.sleep(250); Thread.sleep(250);
} }
} }

View File

@ -48,13 +48,13 @@
<dependency> <dependency>
<groupId>net.ME1312.Galaxi</groupId> <groupId>net.ME1312.Galaxi</groupId>
<artifactId>GalaxiUtil</artifactId> <artifactId>GalaxiUtil</artifactId>
<version>19w16a</version> <version>19w19b</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.ME1312.SubData</groupId> <groupId>net.ME1312.SubData</groupId>
<artifactId>Client</artifactId> <artifactId>Client</artifactId>
<version>19w18a</version> <version>19w19c</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -6,6 +6,7 @@ import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Util;
import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Client.Bukkit.Network.API.Host; import net.ME1312.SubServers.Client.Bukkit.Network.API.Host;
import net.ME1312.SubServers.Client.Bukkit.Network.API.SubServer; import net.ME1312.SubServers.Client.Bukkit.Network.API.SubServer;
import net.ME1312.SubServers.Client.Bukkit.Network.Packet.*; import net.ME1312.SubServers.Client.Bukkit.Network.Packet.*;
@ -62,7 +63,7 @@ public class DefaultUIHandler implements UIHandler, Listener {
String title = event.getView().getTitle(); String title = event.getView().getTitle();
if (gui.open && event.getClickedInventory() != null && title != null) { if (gui.open && event.getClickedInventory() != null && title != null) {
if (plugin.subdata == null) { if (plugin.api.getSubDataNetwork()[0] == null) {
new IllegalStateException("SubData is not connected").printStackTrace(); new IllegalStateException("SubData is not connected").printStackTrace();
} else if (Util.isException(() -> plugin.api.getLangChannels())) { } else if (Util.isException(() -> plugin.api.getLangChannels())) {
new IllegalStateException("There are no lang options available at this time").printStackTrace(); new IllegalStateException("There are no lang options available at this time").printStackTrace();
@ -109,7 +110,7 @@ public class DefaultUIHandler implements UIHandler, Listener {
if (player.hasPermission("subservers.host.create.*") || player.hasPermission("subservers.host.create." + ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]).getHost().toLowerCase())) { if (player.hasPermission("subservers.host.create.*") || player.hasPermission("subservers.host.create." + ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]).getHost().toLowerCase())) {
player.closeInventory(); player.closeInventory();
gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response")); gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response"));
plugin.subdata.sendPacket(new PacketCreateServer(player.getUniqueId(), ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]), data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketCreateServer(player.getUniqueId(), ((UIRenderer.CreatorOptions) gui.lastVisitedObjects[0]), data -> {
gui.back(); gui.back();
})); }));
} else { } else {
@ -319,7 +320,7 @@ public class DefaultUIHandler implements UIHandler, Listener {
player.closeInventory(); player.closeInventory();
if (player.hasPermission("subservers.subserver.start.*") || player.hasPermission("subservers.subserver.start." + ((String) gui.lastVisitedObjects[0]).toLowerCase())) { if (player.hasPermission("subservers.subserver.start.*") || player.hasPermission("subservers.subserver.start." + ((String) gui.lastVisitedObjects[0]).toLowerCase())) {
gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response")); gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response"));
plugin.subdata.sendPacket(new PacketStartServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketStartServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], data -> {
gui.setDownloading(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Start.Title")); gui.setDownloading(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Start.Title"));
Bukkit.getScheduler().runTaskLater(plugin, gui::reopen, 30); Bukkit.getScheduler().runTaskLater(plugin, gui::reopen, 30);
})); }));
@ -341,7 +342,7 @@ public class DefaultUIHandler implements UIHandler, Listener {
} catch (Exception e) {} } catch (Exception e) {}
} }
}); });
plugin.subdata.sendPacket(new PacketStopServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], false, data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketStopServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], false, data -> {
if (data.getInt(0x0001) != 0) { if (data.getInt(0x0001) != 0) {
gui.reopen(); gui.reopen();
listening.set(false); listening.set(false);
@ -365,7 +366,7 @@ public class DefaultUIHandler implements UIHandler, Listener {
} catch (Exception e) {} } catch (Exception e) {}
} }
}); });
plugin.subdata.sendPacket(new PacketStopServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], false, data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketStopServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], false, data -> {
if (data.getInt(0x0001) != 0) { if (data.getInt(0x0001) != 0) {
gui.reopen(); gui.reopen();
listening.set(false); listening.set(false);
@ -379,7 +380,7 @@ public class DefaultUIHandler implements UIHandler, Listener {
player.sendMessage(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Command.Message")); player.sendMessage(plugin.api.getLang("SubServers", "Interface.SubServer-Admin.Command.Message"));
input.put(player.getUniqueId(), m -> { input.put(player.getUniqueId(), m -> {
gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response")); gui.setDownloading(plugin.api.getLang("SubServers", "Interface.Generic.Downloading.Response"));
plugin.subdata.sendPacket(new PacketCommandServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], (m.getString("message").startsWith("/"))?m.getString("message").substring(1):m.getString("message"), data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketCommandServer(player.getUniqueId(), (String) gui.lastVisitedObjects[0], (m.getString("message").startsWith("/"))?m.getString("message").substring(1):m.getString("message"), data -> {
gui.reopen(); gui.reopen();
})); }));
}); });

View File

@ -396,7 +396,7 @@ public class DefaultUIRenderer extends UIRenderer {
block = createItem("STAINED_GLASS_PANE", "LIME_STAINED_GLASS_PANE", (short) 5); block = createItem("STAINED_GLASS_PANE", "LIME_STAINED_GLASS_PANE", (short) 5);
blockMeta = block.getItemMeta(); blockMeta = block.getItemMeta();
blockMeta.setDisplayName(ChatColor.GREEN + plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Version")); blockMeta.setDisplayName(ChatColor.GREEN + plugin.api.getLang("SubServers", "Interface.Host-Creator.Edit-Version"));
blockMeta.setLore(Arrays.asList(ChatColor.GRAY + ((options.getVersion() == null)?"Auto Select":"Minecraft "+options.getVersion().toString()))); blockMeta.setLore(Arrays.asList(ChatColor.GRAY + ((options.getVersion() == null)?"Unspecified":"Minecraft "+options.getVersion().toString())));
} }
block.setItemMeta(blockMeta); block.setItemMeta(blockMeta);
inv.setItem(32, block); inv.setItem(32, block);

View File

@ -311,7 +311,7 @@ public class BungeeChat {
hoverm = new LinkedList<TextComponent>(); hoverm = new LinkedList<TextComponent>();
message = new TextComponent(proxy.getDisplayName()); message = new TextComponent(proxy.getDisplayName());
hover = new TextComponent(proxy.getDisplayName()); hover = new TextComponent(proxy.getDisplayName());
if (proxy.getSubData() != null && proxy.isRedis()) { if (proxy.getSubData()[0] != null && proxy.isRedis()) {
message.setColor(ChatColor.GREEN); message.setColor(ChatColor.GREEN);
hover.setColor(ChatColor.GREEN); hover.setColor(ChatColor.GREEN);
if (!proxy.getName().equals(proxy.getDisplayName())) { if (!proxy.getName().equals(proxy.getDisplayName())) {
@ -321,7 +321,7 @@ public class BungeeChat {
} }
hoverm.add(hover); hoverm.add(hover);
hover = new TextComponent('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Player-Count").replace("$int$", new DecimalFormat("#,###").format(proxy.getPlayers().size()))); hover = new TextComponent('\n' + plugin.api.getLang("SubServers", "Interface.Proxy-Menu.Proxy-Player-Count").replace("$int$", new DecimalFormat("#,###").format(proxy.getPlayers().size())));
} else if (proxy.getSubData() != null) { } else if (proxy.getSubData()[0] != null) {
message.setColor(ChatColor.AQUA); message.setColor(ChatColor.AQUA);
hover.setColor(ChatColor.AQUA); hover.setColor(ChatColor.AQUA);
if (!proxy.getName().equals(proxy.getDisplayName())) { if (!proxy.getName().equals(proxy.getDisplayName())) {

View File

@ -49,16 +49,16 @@ public class Host {
*/ */
public void refresh() { public void refresh() {
String name = getName(); String name = getName();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketDownloadHostInfo(name, data -> load(data.getMap(name)))); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketDownloadHostInfo(name, data -> load(data.getMap(name))));
} }
/** /**
* Gets the SubData Client ID * Gets the SubData Client Channel IDs
* *
* @return SubData Client ID (or null if unlinked/unsupported) * @return SubData Client Channel ID Array
*/ */
public UUID getSubData() { public UUID[] getSubData() {
return raw.getUUID("subdata", null); return raw.getUUIDList("subdata", Collections.emptyList()).toArray(new UUID[0]);
} }
/** /**
@ -275,7 +275,7 @@ public class Host {
public void addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted, Callback<Integer> response) { public void addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted, Callback<Integer> response) {
if (Util.isNull(response)) throw new NullPointerException(); if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketAddServer(player, name, enabled, getName(), port, motd, log, directory, executable, stopcmd, hidden, restricted, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketAddServer(player, name, enabled, getName(), port, motd, log, directory, executable, stopcmd, hidden, restricted, data -> {
try { try {
response.run(data.getInt(0x0001)); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {
@ -412,7 +412,7 @@ public class Host {
private void removeSubServer(UUID player, String name, boolean force, Callback<Integer> response) { private void removeSubServer(UUID player, String name, boolean force, Callback<Integer> response) {
if (Util.isNull(response)) throw new NullPointerException(); if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketRemoveServer(player, name, force, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketRemoveServer(player, name, force, data -> {
try { try {
response.run(data.getInt(0x0001)); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {
@ -598,7 +598,7 @@ public class Host {
private void deleteSubServer(UUID player, String name, boolean recycle, boolean force, Callback<Integer> response) { private void deleteSubServer(UUID player, String name, boolean recycle, boolean force, Callback<Integer> response) {
if (Util.isNull(response)) throw new NullPointerException(); if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketDeleteServer(player, name, recycle, force, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketDeleteServer(player, name, recycle, force, data -> {
try { try {
response.run(data.getInt(0x0001)); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {

View File

@ -38,16 +38,16 @@ public class Proxy {
*/ */
public void refresh() { public void refresh() {
String name = getName(); String name = getName();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketDownloadProxyInfo(name, data -> load(data.getMap(name)))); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketDownloadProxyInfo(name, data -> load(data.getMap(name))));
} }
/** /**
* Gets the SubData Client ID * Gets the SubData Client Channel IDs
* *
* @return SubData Client ID (or null if not linked) * @return SubData Client Channel ID Array
*/ */
public UUID getSubData() { public UUID[] getSubData() {
return raw.getUUID("subdata", null); return raw.getUUIDList("subdata", Collections.emptyList()).toArray(new UUID[0]);
} }
/** /**

View File

@ -37,16 +37,16 @@ public class Server {
*/ */
public void refresh() { public void refresh() {
String name = getName(); String name = getName();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketDownloadServerInfo(name, data -> load(data.getMap(name)))); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketDownloadServerInfo(name, data -> load(data.getMap(name))));
} }
/** /**
* Gets the SubData Client ID * Gets the SubData Client Channel IDs
* *
* @return SubData Client ID (or null if not linked) * @return SubData Client Channel ID Array
*/ */
public UUID getSubData() { public UUID[] getSubData() {
return raw.getUUID("subdata", null); return raw.getUUIDList("subdata", Collections.emptyList()).toArray(new UUID[0]);
} }
/** /**

View File

@ -122,7 +122,7 @@ public class SubCreator {
public void create(UUID player, String name, ServerTemplate template, Version version, int port, Callback<Integer> response) { public void create(UUID player, String name, ServerTemplate template, Version version, int port, Callback<Integer> response) {
if (Util.isNull(response)) throw new NullPointerException(); if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketCreateServer(player, name, host.getName(), template.getName(), version, port, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketCreateServer(player, name, host.getName(), template.getName(), version, port, data -> {
try { try {
response.run(data.getInt(0x0001)); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {

View File

@ -71,7 +71,7 @@ public class SubServer extends Server {
public void start(UUID player, Callback<Integer> response) { public void start(UUID player, Callback<Integer> response) {
if (Util.isNull(response)) throw new NullPointerException(); if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketStartServer(player, getName(), data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketStartServer(player, getName(), data -> {
try { try {
response.run(data.getInt(0x0001)); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {
@ -116,7 +116,7 @@ public class SubServer extends Server {
public void stop(UUID player, Callback<Integer> response) { public void stop(UUID player, Callback<Integer> response) {
if (Util.isNull(response)) throw new NullPointerException(); if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketStopServer(player, getName(), false, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketStopServer(player, getName(), false, data -> {
try { try {
response.run(data.getInt(0x0001)); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {
@ -161,7 +161,7 @@ public class SubServer extends Server {
public void terminate(UUID player, Callback<Integer> response) { public void terminate(UUID player, Callback<Integer> response) {
if (Util.isNull(response)) throw new NullPointerException(); if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketStopServer(player, getName(), true, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketStopServer(player, getName(), true, data -> {
try { try {
response.run(data.getInt(0x0001)); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {
@ -207,7 +207,7 @@ public class SubServer extends Server {
public void command(UUID player, String command, Callback<Integer> response) { public void command(UUID player, String command, Callback<Integer> response) {
if (Util.isNull(command, response)) throw new NullPointerException(); if (Util.isNull(command, response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketCommandServer(player, getName(), command, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketCommandServer(player, getName(), command, data -> {
try { try {
response.run(data.getInt(0x0001)); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {
@ -330,7 +330,7 @@ public class SubServer extends Server {
private void edit(UUID player, ObjectMap<String> edit, boolean perma, Callback<Integer> response) { private void edit(UUID player, ObjectMap<String> edit, boolean perma, Callback<Integer> response) {
if (Util.isNull(response)) throw new NullPointerException(); if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketEditServer(player, getName(), edit, perma, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketEditServer(player, getName(), edit, perma, data -> {
try { try {
if (data.getInt(0x0001) != 0) { if (data.getInt(0x0001) != 0) {
response.run(data.getInt(0x0001) * -1); response.run(data.getInt(0x0001) * -1);

View File

@ -15,9 +15,10 @@ import org.bukkit.Bukkit;
*/ */
public class PacketLinkServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> { public class PacketLinkServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private SubPlugin plugin; private SubPlugin plugin;
private int channel;
/** /**
* New PacketLinkServer * New PacketLinkServer (In)
* *
* @param plugin SubServers.Client * @param plugin SubServers.Client
*/ */
@ -25,12 +26,24 @@ public class PacketLinkServer implements PacketObjectIn<Integer>, PacketObjectOu
if (Util.isNull(plugin)) throw new NullPointerException(); if (Util.isNull(plugin)) throw new NullPointerException();
this.plugin = plugin; this.plugin = plugin;
} }
/**
* New PacketLinkServer (Out)
*
* @param plugin SubServers.Client
* @param channel Channel ID
*/
public PacketLinkServer(SubPlugin plugin, int channel) {
if (Util.isNull(plugin)) throw new NullPointerException();
this.plugin = plugin;
this.channel = channel;
}
@Override @Override
public ObjectMap<Integer> send(SubDataClient client) { public ObjectMap<Integer> send(SubDataClient client) {
ObjectMap<Integer> json = new ObjectMap<Integer>(); ObjectMap<Integer> json = new ObjectMap<Integer>();
if (plugin.api.getName() != null) json.set(0x0000, plugin.api.getName()); if (plugin.api.getName() != null) json.set(0x0000, plugin.api.getName());
json.set(0x0001, Bukkit.getServer().getPort()); json.set(0x0001, Bukkit.getServer().getPort());
json.set(0x0002, channel);
return json; return json;
} }
@ -41,8 +54,10 @@ public class PacketLinkServer implements PacketObjectIn<Integer>, PacketObjectOu
if (data.contains(0x0000)) { if (data.contains(0x0000)) {
Util.reflect(SubAPI.class.getDeclaredField("name"), plugin.api, data.getRawString(0x0000)); Util.reflect(SubAPI.class.getDeclaredField("name"), plugin.api, data.getRawString(0x0000));
} }
client.sendPacket(new PacketDownloadLang()); if (SubAPI.getInstance().getSubDataNetwork()[0] == client) {
Bukkit.getPluginManager().callEvent(new SubNetworkConnectEvent(client)); client.sendPacket(new PacketDownloadLang());
Bukkit.getPluginManager().callEvent(new SubNetworkConnectEvent(client));
}
} catch (Exception e) {} } catch (Exception e) {}
} else { } else {
Bukkit.getLogger().info("SubData > Could not link name with server" + ((data.contains(0x0002))?": "+data.getRawString(0x0002):'.')); Bukkit.getLogger().info("SubData > Could not link name with server" + ((data.contains(0x0002))?": "+data.getRawString(0x0002):'.'));

View File

@ -1,7 +1,9 @@
package net.ME1312.SubServers.Client.Bukkit.Network; package net.ME1312.SubServers.Client.Bukkit.Network;
import net.ME1312.Galaxi.Library.Callback.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.SubData.Client.Library.DisconnectReason;
import net.ME1312.SubData.Client.SubDataClient; import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubData.Client.SubDataProtocol; import net.ME1312.SubData.Client.SubDataProtocol;
import net.ME1312.SubServers.Client.Bukkit.Event.SubNetworkDisconnectEvent; import net.ME1312.SubServers.Client.Bukkit.Event.SubNetworkDisconnectEvent;
@ -11,7 +13,9 @@ import net.ME1312.SubServers.Client.Bukkit.SubPlugin;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress; import java.net.InetAddress;
import java.util.HashMap;
import java.util.logging.Handler; import java.util.logging.Handler;
import java.util.logging.LogRecord; import java.util.logging.LogRecord;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -110,16 +114,56 @@ public class SubProtocol extends SubDataProtocol {
return instance; return instance;
} }
@Override
protected SubDataClient openChannel(Callback<Runnable> scheduler, Logger logger, InetAddress address, int port) throws IOException {
SubPlugin plugin = SubAPI.getInstance().getInternals();
SubDataClient subdata = super.open(scheduler, logger, address, port);
HashMap<Integer, SubDataClient> map = Util.getDespiteException(() -> Util.reflect(SubPlugin.class.getDeclaredField("subdata"), plugin), null);
int channel = 1;
while (map.keySet().contains(channel)) channel++;
final int fc = channel;
map.put(fc, subdata);
subdata.on.ready(client -> ((SubDataClient) client).sendPacket(new PacketLinkServer(plugin, fc)));
subdata.on.closed(client -> map.remove(fc));
return subdata;
}
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@Override @Override
public SubDataClient open(Callback<Runnable> scheduler, Logger logger, InetAddress address, int port) throws IOException { public SubDataClient open(Callback<Runnable> scheduler, Logger logger, InetAddress address, int port) throws IOException {
SubDataClient subdata = super.open(scheduler, logger, address, port);
SubPlugin plugin = SubAPI.getInstance().getInternals(); SubPlugin plugin = SubAPI.getInstance().getInternals();
SubDataClient subdata = super.open(scheduler, logger, address, port);
HashMap<Integer, SubDataClient> map = Util.getDespiteException(() -> Util.reflect(SubPlugin.class.getDeclaredField("subdata"), plugin), null);
subdata.on.ready(client -> ((SubDataClient) client).sendPacket(new PacketLinkServer(plugin))); subdata.on.ready(client -> ((SubDataClient) client).sendPacket(new PacketLinkServer(plugin, 0)));
subdata.on.closed(client -> { subdata.on.closed(client -> {
SubNetworkDisconnectEvent event = new SubNetworkDisconnectEvent(client.get(), client.name()); SubNetworkDisconnectEvent event = new SubNetworkDisconnectEvent(client.get(), client.name());
if (plugin.isEnabled()) Bukkit.getPluginManager().callEvent(event); if (plugin.isEnabled()) Bukkit.getPluginManager().callEvent(event);
map.put(0, null);
int reconnect = plugin.config.get().getMap("Settings").getMap("SubData").getInt("Reconnect", 30);
if (Util.getDespiteException(() -> Util.reflect(SubPlugin.class.getDeclaredField("reconnect"), plugin), false) && reconnect > 0
&& client.name() != DisconnectReason.PROTOCOL_MISMATCH && client.name() != DisconnectReason.ENCRYPTION_MISMATCH) {
Bukkit.getLogger().info("SubData > Attempting reconnect in " + reconnect + " seconds");
Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() {
@Override
public void run() {
try {
Util.reflect(SubPlugin.class.getDeclaredMethod("connect"), plugin);
} catch (InvocationTargetException e) {
if (e.getTargetException() instanceof IOException) {
Bukkit.getLogger().info("SubData > Connection was unsuccessful, retrying in " + reconnect + " seconds");
Bukkit.getScheduler().runTaskLater(plugin, this, reconnect * 20);
} else e.printStackTrace();
} catch (NoSuchMethodException | IllegalAccessException e) {
e.printStackTrace();
}
}
}, reconnect * 20);
}
}); });
return subdata; return subdata;

View File

@ -14,7 +14,6 @@ import net.ME1312.SubServers.Client.Bukkit.Network.Packet.*;
import net.ME1312.SubData.Client.SubDataClient; import net.ME1312.SubData.Client.SubDataClient;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import javax.xml.ws.Response;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress; import java.net.InetAddress;
import java.util.*; import java.util.*;
@ -80,7 +79,7 @@ public final class SubAPI {
public void getHosts(Callback<Map<String, Host>> callback) { public void getHosts(Callback<Map<String, Host>> callback) {
if (Util.isNull(callback)) throw new NullPointerException(); if (Util.isNull(callback)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
plugin.subdata.sendPacket(new PacketDownloadHostInfo(null, data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadHostInfo(null, data -> {
TreeMap<String, Host> hosts = new TreeMap<String, Host>(); TreeMap<String, Host> hosts = new TreeMap<String, Host>();
for (String host : data.getKeys()) { for (String host : data.getKeys()) {
hosts.put(host.toLowerCase(), new Host(data.getMap(host))); hosts.put(host.toLowerCase(), new Host(data.getMap(host)));
@ -105,7 +104,7 @@ public final class SubAPI {
public void getHost(String name, Callback<Host> callback) { public void getHost(String name, Callback<Host> callback) {
if (Util.isNull(name, callback)) throw new NullPointerException(); if (Util.isNull(name, callback)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
plugin.subdata.sendPacket(new PacketDownloadHostInfo(name, data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadHostInfo(name, data -> {
Host host = null; Host host = null;
if (data.getKeys().size() > 0) { if (data.getKeys().size() > 0) {
host = new Host(data.getMap(new LinkedList<String>(data.getKeys()).getFirst())); host = new Host(data.getMap(new LinkedList<String>(data.getKeys()).getFirst()));
@ -129,7 +128,7 @@ public final class SubAPI {
public void getGroups(Callback<Map<String, List<Server>>> callback) { public void getGroups(Callback<Map<String, List<Server>>> callback) {
if (Util.isNull(callback)) throw new NullPointerException(); if (Util.isNull(callback)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
plugin.subdata.sendPacket(new PacketDownloadGroupInfo(null, data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadGroupInfo(null, data -> {
TreeMap<String, List<Server>> groups = new TreeMap<String, List<Server>>(); TreeMap<String, List<Server>> groups = new TreeMap<String, List<Server>>();
for (String group : data.getKeys()) { for (String group : data.getKeys()) {
ArrayList<Server> servers = new ArrayList<Server>(); ArrayList<Server> servers = new ArrayList<Server>();
@ -178,7 +177,7 @@ public final class SubAPI {
public void getGroup(String name, Callback<List<Server>> callback) { public void getGroup(String name, Callback<List<Server>> callback) {
if (Util.isNull(name, callback)) throw new NullPointerException(); if (Util.isNull(name, callback)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
plugin.subdata.sendPacket(new PacketDownloadGroupInfo(name, data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadGroupInfo(name, data -> {
List<Server> servers = null; List<Server> servers = null;
if (data.getKeys().size() > 0) { if (data.getKeys().size() > 0) {
String key = new LinkedList<String>(data.getKeys()).getFirst(); String key = new LinkedList<String>(data.getKeys()).getFirst();
@ -210,7 +209,7 @@ public final class SubAPI {
public void getServers(Callback<Map<String, Server>> callback) { public void getServers(Callback<Map<String, Server>> callback) {
if (Util.isNull(callback)) throw new NullPointerException(); if (Util.isNull(callback)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
plugin.subdata.sendPacket(new PacketDownloadServerInfo(null, data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadServerInfo(null, data -> {
TreeMap<String, Server> servers = new TreeMap<String, Server>(); TreeMap<String, Server> servers = new TreeMap<String, Server>();
for (String server : data.getKeys()) { for (String server : data.getKeys()) {
if (data.getMap(server).getRawString("type", "Server").equals("SubServer")) { if (data.getMap(server).getRawString("type", "Server").equals("SubServer")) {
@ -239,7 +238,7 @@ public final class SubAPI {
public void getServer(String name, Callback<Server> callback) { public void getServer(String name, Callback<Server> callback) {
if (Util.isNull(name, callback)) throw new NullPointerException(); if (Util.isNull(name, callback)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
plugin.subdata.sendPacket(new PacketDownloadServerInfo(name, data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadServerInfo(name, data -> {
Server server = null; Server server = null;
if (data.getKeys().size() > 0) { if (data.getKeys().size() > 0) {
String key = new LinkedList<String>(data.getKeys()).getFirst(); String key = new LinkedList<String>(data.getKeys()).getFirst();
@ -290,7 +289,7 @@ public final class SubAPI {
public void addServer(UUID player, String name, InetAddress ip, int port, String motd, boolean hidden, boolean restricted, Callback<Integer> response) { public void addServer(UUID player, String name, InetAddress ip, int port, String motd, boolean hidden, boolean restricted, Callback<Integer> response) {
if (Util.isNull(response)) throw new NullPointerException(); if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketAddServer(player, name, ip, port, motd, hidden, restricted, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketAddServer(player, name, ip, port, motd, hidden, restricted, data -> {
try { try {
response.run(data.getInt(0x0001)); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {
@ -417,7 +416,7 @@ public final class SubAPI {
private void removeServer(UUID player, String name, boolean force, Callback<Integer> response) { private void removeServer(UUID player, String name, boolean force, Callback<Integer> response) {
if (Util.isNull(response)) throw new NullPointerException(); if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()).sendPacket(new PacketRemoveServer(player, name, force, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketRemoveServer(player, name, force, data -> {
try { try {
response.run(data.getInt(0x0001)); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {
@ -463,7 +462,7 @@ public final class SubAPI {
public void getProxies(Callback<Map<String, Proxy>> callback) { public void getProxies(Callback<Map<String, Proxy>> callback) {
if (Util.isNull(callback)) throw new NullPointerException(); if (Util.isNull(callback)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
plugin.subdata.sendPacket(new PacketDownloadProxyInfo(null, data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadProxyInfo(null, data -> {
TreeMap<String, Proxy> proxies = new TreeMap<String, Proxy>(); TreeMap<String, Proxy> proxies = new TreeMap<String, Proxy>();
for (String proxy : data.getKeys()) { for (String proxy : data.getKeys()) {
proxies.put(proxy.toLowerCase(), new Proxy(data.getMap(proxy))); proxies.put(proxy.toLowerCase(), new Proxy(data.getMap(proxy)));
@ -488,7 +487,7 @@ public final class SubAPI {
public void getProxy(String name, Callback<Proxy> callback) { public void getProxy(String name, Callback<Proxy> callback) {
if (Util.isNull(name, callback)) throw new NullPointerException(); if (Util.isNull(name, callback)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
plugin.subdata.sendPacket(new PacketDownloadProxyInfo(name, data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadProxyInfo(name, data -> {
Proxy proxy = null; Proxy proxy = null;
if (data.getKeys().size() > 0) { if (data.getKeys().size() > 0) {
proxy = new Proxy(data.getMap(new LinkedList<String>(data.getKeys()).getFirst())); proxy = new Proxy(data.getMap(new LinkedList<String>(data.getKeys()).getFirst()));
@ -512,7 +511,7 @@ public final class SubAPI {
public void getMasterProxy(Callback<Proxy> callback) { public void getMasterProxy(Callback<Proxy> callback) {
if (Util.isNull(callback)) throw new NullPointerException(); if (Util.isNull(callback)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
plugin.subdata.sendPacket(new PacketDownloadProxyInfo("", data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadProxyInfo("", data -> {
Proxy proxy = null; Proxy proxy = null;
if (data != null) { if (data != null) {
proxy = new Proxy(data); proxy = new Proxy(data);
@ -537,7 +536,7 @@ public final class SubAPI {
public void getGlobalPlayers(Callback<Collection<NamedContainer<String, UUID>>> callback) { public void getGlobalPlayers(Callback<Collection<NamedContainer<String, UUID>>> callback) {
if (Util.isNull(callback)) throw new NullPointerException(); if (Util.isNull(callback)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace(); StackTraceElement[] origin = new Exception().getStackTrace();
plugin.subdata.sendPacket(new PacketDownloadPlayerList(data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadPlayerList(data -> {
List<NamedContainer<String, UUID>> players = new ArrayList<NamedContainer<String, UUID>>(); List<NamedContainer<String, UUID>> players = new ArrayList<NamedContainer<String, UUID>>();
for (String id : data.getKeys()) { for (String id : data.getKeys()) {
players.add(new NamedContainer<String, UUID>(data.getMap(id).getRawString("name"), UUID.fromString(id))); players.add(new NamedContainer<String, UUID>(data.getMap(id).getRawString("name"), UUID.fromString(id)));
@ -558,8 +557,12 @@ public final class SubAPI {
* *
* @return SubData Network Manager * @return SubData Network Manager
*/ */
public DataClient getSubDataNetwork() { public DataClient[] getSubDataNetwork() {
return plugin.subdata; LinkedList<Integer> keys = new LinkedList<Integer>(plugin.subdata.keySet());
LinkedList<SubDataClient> channels = new LinkedList<SubDataClient>();
Collections.sort(keys);
for (Integer channel : keys) channels.add(plugin.subdata.get(channel));
return channels.toArray(new DataClient[0]);
} }
/** /**

View File

@ -1,6 +1,7 @@
package net.ME1312.SubServers.Client.Bukkit; package net.ME1312.SubServers.Client.Bukkit;
import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Client.Bukkit.Graphic.UIRenderer; import net.ME1312.SubServers.Client.Bukkit.Graphic.UIRenderer;
import net.ME1312.Galaxi.Library.Callback.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Config.YAMLSection;
@ -43,7 +44,7 @@ public final class SubCommand extends BukkitCommand {
@Override @Override
public boolean execute(CommandSender sender, String label, String[] args) { public boolean execute(CommandSender sender, String label, String[] args) {
label = "/" + label; label = "/" + label;
if (plugin.subdata == null) { if (plugin.api.getSubDataNetwork()[0] == null) {
new IllegalStateException("SubData is not connected").printStackTrace(); new IllegalStateException("SubData is not connected").printStackTrace();
if (!(sender instanceof ConsoleCommandSender)) sender.sendMessage(ChatColor.RED + "An exception has occurred while running this command"); if (!(sender instanceof ConsoleCommandSender)) sender.sendMessage(ChatColor.RED + "An exception has occurred while running this command");
} else if (plugin.lang == null) { } else if (plugin.lang == null) {
@ -201,9 +202,9 @@ public final class SubCommand extends BukkitCommand {
message = " (master)"; message = " (master)";
for (Proxy proxy : proxies.values()) { for (Proxy proxy : proxies.values()) {
message += div; message += div;
if (proxy.getSubData() != null && proxy.isRedis()) { if (proxy.getSubData()[0] != null && proxy.isRedis()) {
message += ChatColor.GREEN; message += ChatColor.GREEN;
} else if (proxy.getSubData() != null) { } else if (proxy.getSubData()[0] != null) {
message += ChatColor.AQUA; message += ChatColor.AQUA;
} else if (proxy.isRedis()) { } else if (proxy.isRedis()) {
message += ChatColor.WHITE; message += ChatColor.WHITE;
@ -236,7 +237,7 @@ public final class SubCommand extends BukkitCommand {
else sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Port") + ChatColor.AQUA.toString() + server.getAddress().getPort()); else sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Port") + ChatColor.AQUA.toString() + server.getAddress().getPort());
if (server instanceof SubServer) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Running") + ((((SubServer) server).isRunning())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); if (server instanceof SubServer) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Running") + ((((SubServer) server).isRunning())?ChatColor.GREEN+"yes":ChatColor.RED+"no"));
if (!(server instanceof SubServer) || ((SubServer) server).isRunning()) { if (!(server instanceof SubServer) || ((SubServer) server).isRunning()) {
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected") + ((server.getSubData() != null)?ChatColor.GREEN+"yes":ChatColor.RED+"no")); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected") + ((server.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((server.getSubData().length > 1)?ChatColor.AQUA+" +"+(server.getSubData().length-1):""):ChatColor.RED+"no"));
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Players") + ChatColor.AQUA + server.getPlayers().size() + " online"); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Players") + ChatColor.AQUA + server.getPlayers().size() + " online");
} }
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "MOTD") + ChatColor.WHITE + ChatColor.stripColor(server.getMotd())); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "MOTD") + ChatColor.WHITE + ChatColor.stripColor(server.getMotd()));
@ -279,7 +280,7 @@ public final class SubCommand extends BukkitCommand {
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Available") + ((host.isAvailable())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Available") + ((host.isAvailable())?ChatColor.GREEN+"yes":ChatColor.RED+"no"));
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Enabled") + ((host.isEnabled())?ChatColor.GREEN+"yes":ChatColor.RED+"no")); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Enabled") + ((host.isEnabled())?ChatColor.GREEN+"yes":ChatColor.RED+"no"));
if (plugin.config.get().getMap("Settings").getBoolean("Show-Addresses", false)) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Address") + ChatColor.WHITE + host.getAddress().getHostAddress()); if (plugin.config.get().getMap("Settings").getBoolean("Show-Addresses", false)) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Address") + ChatColor.WHITE + host.getAddress().getHostAddress());
if (host.getSubData() != null) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected") + ChatColor.GREEN + "yes"); if (host.getSubData()[0] != null) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected") + ChatColor.GREEN + "yes" + ((host.getSubData().length > 1)?ChatColor.AQUA+" +"+(host.getSubData().length-1):""));
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "SubServers") + ((host.getSubServers().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getSubServers().keySet().size())); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "SubServers") + ((host.getSubServers().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getSubServers().keySet().size()));
for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.List") + ((subserver.isEnabled())?ChatColor.WHITE:ChatColor.GRAY) + subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')')); for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(" " + plugin.api.getLang("SubServers", "Command.Info.List") + ((subserver.isEnabled())?ChatColor.WHITE:ChatColor.GRAY) + subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')'));
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Templates") + ((host.getCreator().getTemplates().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getCreator().getTemplates().keySet().size())); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Templates") + ((host.getCreator().getTemplates().keySet().size() <= 0)?ChatColor.GRAY + "(none)":ChatColor.AQUA.toString() + host.getCreator().getTemplates().keySet().size()));
@ -297,7 +298,7 @@ public final class SubCommand extends BukkitCommand {
if (proxy != null) { if (proxy != null) {
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info").replace("$str$", "Proxy") + ChatColor.WHITE + proxy.getDisplayName()); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info").replace("$str$", "Proxy") + ChatColor.WHITE + proxy.getDisplayName());
if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "System Name") + ChatColor.WHITE + proxy.getName()); if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "System Name") + ChatColor.WHITE + proxy.getName());
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected") + ((proxy.getSubData() != null)?ChatColor.GREEN+"yes":ChatColor.RED+"no")); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected") + ((proxy.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((proxy.getSubData().length > 1)?ChatColor.AQUA+" +"+(proxy.getSubData().length-1):""):ChatColor.RED+"no"));
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Redis") + ((proxy.isRedis())?ChatColor.GREEN:ChatColor.RED+"un") + "available"); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Redis") + ((proxy.isRedis())?ChatColor.GREEN:ChatColor.RED+"un") + "available");
if (proxy.isRedis()) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Players") + ChatColor.AQUA + proxy.getPlayers().size() + " online"); if (proxy.isRedis()) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Players") + ChatColor.AQUA + proxy.getPlayers().size() + " online");
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Signature") + ChatColor.AQUA + proxy.getSignature()); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Signature") + ChatColor.AQUA + proxy.getSignature());
@ -341,7 +342,7 @@ public final class SubCommand extends BukkitCommand {
} else if (args[0].equalsIgnoreCase("start")) { } else if (args[0].equalsIgnoreCase("start")) {
if (args.length > 1) { if (args.length > 1) {
if (sender.hasPermission("subservers.subserver.start.*") || sender.hasPermission("subservers.subserver.start." + args[1].toLowerCase())) { if (sender.hasPermission("subservers.subserver.start.*") || sender.hasPermission("subservers.subserver.start." + args[1].toLowerCase())) {
plugin.subdata.sendPacket(new PacketStartServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketStartServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], data -> {
switch (data.getInt(0x0001)) { switch (data.getInt(0x0001)) {
case 3: case 3:
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Start.Unknown")); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Start.Unknown"));
@ -379,7 +380,7 @@ public final class SubCommand extends BukkitCommand {
} else if (args[0].equalsIgnoreCase("restart")) { } else if (args[0].equalsIgnoreCase("restart")) {
if (args.length > 1) { if (args.length > 1) {
if ((sender.hasPermission("subservers.subserver.stop.*") || sender.hasPermission("subservers.subserver.stop." + args[1].toLowerCase())) && (sender.hasPermission("subservers.subserver.start.*") || sender.hasPermission("subservers.subserver.start." + args[1].toLowerCase()))) { if ((sender.hasPermission("subservers.subserver.stop.*") || sender.hasPermission("subservers.subserver.stop." + args[1].toLowerCase())) && (sender.hasPermission("subservers.subserver.start.*") || sender.hasPermission("subservers.subserver.start." + args[1].toLowerCase()))) {
Runnable starter = () -> plugin.subdata.sendPacket(new PacketStartServer(null, args[1], data -> { Runnable starter = () -> ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketStartServer(null, args[1], data -> {
switch (data.getInt(0x0001)) { switch (data.getInt(0x0001)) {
case 3: case 3:
case 4: case 4:
@ -440,9 +441,9 @@ public final class SubCommand extends BukkitCommand {
if (plugin.api.getName().equalsIgnoreCase(args[1])) { if (plugin.api.getName().equalsIgnoreCase(args[1])) {
listening.set(false); listening.set(false);
plugin.subdata.sendPacket(new PacketRestartServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], stopper)); ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketRestartServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], stopper));
} else { } else {
plugin.subdata.sendPacket(new PacketStopServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], false, stopper)); ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketStopServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], false, stopper));
} }
} else if (!(sender.hasPermission("subservers.subserver.stop.*") || sender.hasPermission("subservers.subserver.stop." + args[1].toLowerCase()))) { } else if (!(sender.hasPermission("subservers.subserver.stop.*") || sender.hasPermission("subservers.subserver.stop." + args[1].toLowerCase()))) {
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.stop." + args[1].toLowerCase())); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Generic.Invalid-Permission").replace("$str$", "subservers.subserver.stop." + args[1].toLowerCase()));
@ -455,7 +456,7 @@ public final class SubCommand extends BukkitCommand {
} else if (args[0].equalsIgnoreCase("stop")) { } else if (args[0].equalsIgnoreCase("stop")) {
if (args.length > 1) { if (args.length > 1) {
if (sender.hasPermission("subservers.subserver.stop.*") || sender.hasPermission("subservers.subserver.stop." + args[1].toLowerCase())) { if (sender.hasPermission("subservers.subserver.stop.*") || sender.hasPermission("subservers.subserver.stop." + args[1].toLowerCase())) {
plugin.subdata.sendPacket(new PacketStopServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], false, data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketStopServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], false, data -> {
switch (data.getInt(0x0001)) { switch (data.getInt(0x0001)) {
case 3: case 3:
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Stop.Unknown")); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Stop.Unknown"));
@ -481,7 +482,7 @@ public final class SubCommand extends BukkitCommand {
} else if (args[0].equalsIgnoreCase("kill") || args[0].equalsIgnoreCase("terminate")) { } else if (args[0].equalsIgnoreCase("kill") || args[0].equalsIgnoreCase("terminate")) {
if (args.length > 1) { if (args.length > 1) {
if (sender.hasPermission("subservers.subserver.terminate.*") || sender.hasPermission("subservers.subserver.terminate." + args[1].toLowerCase())) { if (sender.hasPermission("subservers.subserver.terminate.*") || sender.hasPermission("subservers.subserver.terminate." + args[1].toLowerCase())) {
plugin.subdata.sendPacket(new PacketStopServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], true, data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketStopServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], true, data -> {
switch (data.getInt(0x0001)) { switch (data.getInt(0x0001)) {
case 3: case 3:
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Terminate.Unknown")); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Terminate.Unknown"));
@ -516,7 +517,7 @@ public final class SubCommand extends BukkitCommand {
} while ((i + 1) != args.length); } while ((i + 1) != args.length);
} }
final String cmd = str; final String cmd = str;
plugin.subdata.sendPacket(new PacketCommandServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], cmd, data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketCommandServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], cmd, data -> {
switch (data.getInt(0x0001)) { switch (data.getInt(0x0001)) {
case 3: case 3:
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Command.Unknown")); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Command.Unknown"));
@ -545,7 +546,7 @@ public final class SubCommand extends BukkitCommand {
if (args.length > 5 && Util.isException(() -> Integer.parseInt(args[5]))) { if (args.length > 5 && Util.isException(() -> Integer.parseInt(args[5]))) {
sender.sendMessage(plugin.api.getLang("SubServers", "Command.Creator.Invalid-Port")); sender.sendMessage(plugin.api.getLang("SubServers", "Command.Creator.Invalid-Port"));
} else { } else {
plugin.subdata.sendPacket(new PacketCreateServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], args[2], args[3], (args.length > 4)?new Version(args[4]):null, (args.length > 5)?Integer.parseInt(args[5]):null, data -> { ((SubDataClient) plugin.api.getSubDataNetwork()[0]).sendPacket(new PacketCreateServer((sender instanceof Player)?((Player) sender).getUniqueId():null, args[1], args[2], args[3], (args.length > 4)?new Version(args[4]):null, (args.length > 5)?Integer.parseInt(args[5]):null, data -> {
switch (data.getInt(0x0001)) { switch (data.getInt(0x0001)) {
case 3: case 3:
case 4: case 4:

View File

@ -3,6 +3,7 @@ package net.ME1312.SubServers.Client.Bukkit;
import net.ME1312.Galaxi.Library.Map.ObjectMap; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.SubData.Client.Encryption.AES; import net.ME1312.SubData.Client.Encryption.AES;
import net.ME1312.SubData.Client.Encryption.RSA; import net.ME1312.SubData.Client.Encryption.RSA;
import net.ME1312.SubData.Client.Library.DisconnectReason;
import net.ME1312.SubServers.Client.Bukkit.Graphic.DefaultUIHandler; import net.ME1312.SubServers.Client.Bukkit.Graphic.DefaultUIHandler;
import net.ME1312.SubServers.Client.Bukkit.Graphic.UIHandler; import net.ME1312.SubServers.Client.Bukkit.Graphic.UIHandler;
import net.ME1312.Galaxi.Library.Config.YAMLConfig; import net.ME1312.Galaxi.Library.Config.YAMLConfig;
@ -25,25 +26,24 @@ 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.*;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
* SubServers Client Plugin Class * SubServers Client Plugin Class
*/ */
public final class SubPlugin extends JavaPlugin { public final class SubPlugin extends JavaPlugin {
protected HashMap<Integer, SubDataClient> subdata = new HashMap<Integer, SubDataClient>();
protected NamedContainer<Long, Map<String, Map<String, String>>> lang = null; protected NamedContainer<Long, Map<String, Map<String, String>>> lang = null;
public YAMLConfig config; public YAMLConfig config;
public SubDataClient subdata = null;
public SubProtocol subprotocol; public SubProtocol subprotocol;
public UIHandler gui = null; public UIHandler gui = null;
public final Version version; public final Version version;
public final SubAPI api = new SubAPI(this); public final SubAPI api = new SubAPI(this);
private boolean reconnect = false;
public SubPlugin() { public SubPlugin() {
super(); super();
version = Version.fromString(getDescription().getVersion()); version = Version.fromString(getDescription().getVersion());
@ -120,8 +120,14 @@ public final class SubPlugin extends JavaPlugin {
} }
public void reload(boolean notifyPlugins) throws IOException { public void reload(boolean notifyPlugins) throws IOException {
if (subdata != null) reconnect = false;
subdata.close(); ArrayList<SubDataClient> tmp = new ArrayList<SubDataClient>();
tmp.addAll(subdata.values());
for (SubDataClient client : tmp) {
client.close();
Util.isException(client::waitFor);
}
subdata.clear();
config.reload(); config.reload();
@ -149,9 +155,9 @@ public final class SubPlugin extends JavaPlugin {
} }
} }
reconnect = true;
System.out.println("SubData > "); System.out.println("SubData > ");
subdata = subprotocol.open((config.get().getMap("Settings").getMap("SubData").getRawString("Address", "127.0.0.1:4391").split(":")[0].equals("0.0.0.0"))?null:InetAddress.getByName(config.get().getMap("Settings").getMap("SubData").getRawString("Address", "127.0.0.1:4391").split(":")[0]), connect();
Integer.parseInt(config.get().getMap("Settings").getMap("SubData").getRawString("Address", "127.0.0.1:4391").split(":")[1]));
if (notifyPlugins) { if (notifyPlugins) {
List<Runnable> listeners = api.reloadListeners; List<Runnable> listeners = api.reloadListeners;
@ -167,6 +173,11 @@ public final class SubPlugin extends JavaPlugin {
} }
} }
private void connect() throws IOException {
subdata.put(0, subprotocol.open((config.get().getMap("Settings").getMap("SubData").getRawString("Address", "127.0.0.1:4391").split(":")[0].equals("0.0.0.0"))?null:InetAddress.getByName(config.get().getMap("Settings").getMap("SubData").getRawString("Address", "127.0.0.1:4391").split(":")[0]),
Integer.parseInt(config.get().getMap("Settings").getMap("SubData").getRawString("Address", "127.0.0.1:4391").split(":")[1])));
}
/** /**
* Disable Plugin * Disable Plugin
*/ */
@ -174,8 +185,15 @@ public final class SubPlugin extends JavaPlugin {
public void onDisable() { public void onDisable() {
if (subdata != null) try { if (subdata != null) try {
setEnabled(false); setEnabled(false);
subdata.close(); reconnect = false;
subdata.waitFor();
ArrayList<SubDataClient> temp = new ArrayList<SubDataClient>();
temp.addAll(subdata.values());
for (SubDataClient client : temp) {
client.close();
client.waitFor();
}
subdata.clear();
} catch (IOException | InterruptedException e) { } catch (IOException | InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }