Mirror changes in SubServers.Host

This commit is contained in:
ME1312 2019-05-12 23:28:27 -04:00
parent 9ef878ba12
commit 61ee89cfe3
No known key found for this signature in database
GPG Key ID: FEFFE2F698E88FA8
84 changed files with 2730 additions and 2266 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>19w19c</version> <version>19w20a</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>19w19f</version> <version>19w20f</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -188,7 +188,7 @@ public class ExternalHost extends Host implements ClientHandler {
getSubServer(server).waitFor(); getSubServer(server).waitFor();
} }
queue(new PacketExRemoveServer(server, data -> { queue(new PacketExRemoveServer(server, data -> {
if (data.getInt(0x0001) == 0) { if (data.getInt(0x0001) == 0 || data.getInt(0x0001) == 1) {
servers.remove(server.toLowerCase()); servers.remove(server.toLowerCase());
} }
})); }));
@ -207,7 +207,7 @@ public class ExternalHost extends Host implements ClientHandler {
getSubServer(server).terminate(); getSubServer(server).terminate();
} }
queue(new PacketExRemoveServer(server, data -> { queue(new PacketExRemoveServer(server, data -> {
if (data.getInt(0x0001) == 0) { if (data.getInt(0x0001) == 0 || data.getInt(0x0001) == 1) {
servers.remove(server.toLowerCase()); servers.remove(server.toLowerCase());
} }
})); }));
@ -242,7 +242,7 @@ public class ExternalHost extends Host implements ClientHandler {
System.out.println("SubServers > Moving Files..."); System.out.println("SubServers > Moving Files...");
queue(new PacketExDeleteServer(server, info, true, data -> { queue(new PacketExDeleteServer(server, info, true, data -> {
if (data.getInt(0x0001) == 0) { if (data.getInt(0x0001) == 0 || data.getInt(0x0001) == 1) {
servers.remove(server.toLowerCase()); servers.remove(server.toLowerCase());
System.out.println("SubServers > Deleted SubServer: " + server); System.out.println("SubServers > Deleted SubServer: " + server);
} else { } else {
@ -279,7 +279,7 @@ public class ExternalHost extends Host implements ClientHandler {
System.out.println("SubServers > Moving Files..."); System.out.println("SubServers > Moving Files...");
queue(new PacketExDeleteServer(server, info, true, data -> { queue(new PacketExDeleteServer(server, info, true, data -> {
if (data.getInt(0x0001) == 0) { if (data.getInt(0x0001) == 0 || data.getInt(0x0001) == 1) {
for (String group : getSubServer(server).getGroups()) getSubServer(server).removeGroup(group); for (String group : getSubServer(server).getGroups()) getSubServer(server).removeGroup(group);
servers.remove(server.toLowerCase()); servers.remove(server.toLowerCase());
System.out.println("SubServers > Deleted SubServer: " + server); System.out.println("SubServers > Deleted SubServer: " + server);
@ -318,7 +318,7 @@ public class ExternalHost extends Host implements ClientHandler {
System.out.println("SubServers > Removing Files..."); System.out.println("SubServers > Removing Files...");
queue(new PacketExDeleteServer(server, info, false, data -> { queue(new PacketExDeleteServer(server, info, false, data -> {
if (data.getInt(0x0001) == 0) { if (data.getInt(0x0001) == 0 || data.getInt(0x0001) == 1) {
servers.remove(server.toLowerCase()); servers.remove(server.toLowerCase());
System.out.println("SubServers > Deleted SubServer: " + server); System.out.println("SubServers > Deleted SubServer: " + server);
} else { } else {
@ -355,7 +355,7 @@ public class ExternalHost extends Host implements ClientHandler {
System.out.println("SubServers > Removing Files..."); System.out.println("SubServers > Removing Files...");
queue(new PacketExDeleteServer(server, info, false, data -> { queue(new PacketExDeleteServer(server, info, false, data -> {
if (data.getInt(0x0001) == 0) { if (data.getInt(0x0001) == 0 || data.getInt(0x0001) == 1) {
for (String group : getSubServer(server).getGroups()) getSubServer(server).removeGroup(group); for (String group : getSubServer(server).getGroups()) getSubServer(server).removeGroup(group);
servers.remove(server.toLowerCase()); servers.remove(server.toLowerCase());
System.out.println("SubServers > Deleted SubServer: " + server); System.out.println("SubServers > Deleted SubServer: " + server);

View File

@ -114,7 +114,7 @@ public class ExternalSubCreator extends SubCreator {
server.set("Port", fport); server.set("Port", fport);
server.set("Motd", "Some SubServer"); server.set("Motd", "Some SubServer");
server.set("Log", true); server.set("Log", true);
server.set("Directory", "." + File.separatorChar + name); server.set("Directory", "./" + name);
server.set("Executable", "java -Xmx1024M -jar " + template.getType().toString() + ".jar"); server.set("Executable", "java -Xmx1024M -jar " + template.getType().toString() + ".jar");
server.set("Stop-Command", "stop"); server.set("Stop-Command", "stop");
server.set("Stop-Action", "NONE"); server.set("Stop-Action", "NONE");

View File

@ -241,15 +241,9 @@ public class InternalHost extends Host {
File from = new File(getPath(), servers.get(server.toLowerCase()).getPath()); File from = new File(getPath(), servers.get(server.toLowerCase()).getPath());
if (removeSubServer(player, server)) { if (removeSubServer(player, server)) {
new Thread(() -> { new Thread(() -> {
UniversalFile to = new UniversalFile(plugin.dir, "SubServers:Recently Deleted:" + server.toLowerCase());
try { try {
if (from.exists()) { if (from.exists()) {
System.out.println("SubServers > Removing Files..."); System.out.println("SubServers > Removing Files...");
if (to.exists()) {
if (to.isDirectory()) Util.deleteDirectory(to);
else to.delete();
}
to.mkdirs();
Util.deleteDirectory(from); Util.deleteDirectory(from);
} }
} catch (Exception e) { } catch (Exception e) {
@ -257,18 +251,11 @@ public class InternalHost extends Host {
} }
System.out.println("SubServers > Saving..."); System.out.println("SubServers > Saving...");
YAMLSection info = (plugin.servers.get().getMap("Servers").getKeys().contains(server))?new YAMLSection(plugin.servers.get().getMap("Servers").getMap(server).get()):new YAMLSection();
info.set("Name", server);
info.set("Timestamp", Calendar.getInstance().getTime().getTime());
try { try {
if (plugin.servers.get().getMap("Servers").getKeys().contains(server)) { if (plugin.servers.get().getMap("Servers").getKeys().contains(server)) {
plugin.servers.get().getMap("Servers").remove(server); plugin.servers.get().getMap("Servers").remove(server);
plugin.servers.save(); plugin.servers.save();
} }
if (!to.exists()) to.mkdirs();
FileWriter writer = new FileWriter(new File(to, "info.json"));
writer.write(info.toJSON().toString());
writer.close();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -285,16 +272,9 @@ public class InternalHost extends Host {
File from = new File(getPath(), servers.get(server.toLowerCase()).getPath()); File from = new File(getPath(), servers.get(server.toLowerCase()).getPath());
if (forceRemoveSubServer(player, server)) { if (forceRemoveSubServer(player, server)) {
new Thread(() -> { new Thread(() -> {
UniversalFile to = new UniversalFile(plugin.dir, "SubServers:Recently Deleted:" + server.toLowerCase());
try { try {
if (from.exists()) { if (from.exists()) {
System.out.println("SubServers > Removing Files..."); System.out.println("SubServers > Removing Files...");
if (to.exists()) {
if (to.isDirectory()) Util.deleteDirectory(to);
else to.delete();
}
to.mkdirs();
Util.copyDirectory(from, to);
Util.deleteDirectory(from); Util.deleteDirectory(from);
} }
} catch (Exception e) { } catch (Exception e) {
@ -302,18 +282,11 @@ public class InternalHost extends Host {
} }
System.out.println("SubServers > Saving..."); System.out.println("SubServers > Saving...");
YAMLSection info = (plugin.servers.get().getMap("Servers").getKeys().contains(server))?new YAMLSection(plugin.servers.get().getMap("Servers").getMap(server).get()):new YAMLSection();
info.set("Name", server);
info.set("Timestamp", Calendar.getInstance().getTime().getTime());
try { try {
if (plugin.servers.get().getMap("Servers").getKeys().contains(server)) { if (plugin.servers.get().getMap("Servers").getKeys().contains(server)) {
plugin.servers.get().getMap("Servers").remove(server); plugin.servers.get().getMap("Servers").remove(server);
plugin.servers.save(); plugin.servers.save();
} }
if (!to.exists()) to.mkdirs();
FileWriter writer = new FileWriter(new File(to, "info.json"), false);
writer.write(info.toJSON().toString());
writer.close();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -210,7 +210,7 @@ public class InternalSubCreator extends SubCreator {
server.set("Port", port); server.set("Port", port);
server.set("Motd", "Some SubServer"); server.set("Motd", "Some SubServer");
server.set("Log", true); server.set("Log", true);
server.set("Directory", "." + File.separatorChar + name); server.set("Directory", "./" + name);
server.set("Executable", "java -Xmx1024M -jar " + template.getType().toString() + ".jar"); server.set("Executable", "java -Xmx1024M -jar " + template.getType().toString() + ".jar");
server.set("Stop-Command", "stop"); server.set("Stop-Command", "stop");
server.set("Stop-Action", "NONE"); server.set("Stop-Action", "NONE");

View File

@ -43,7 +43,7 @@ public class PacketExCreateServer implements PacketObjectIn<Integer>, PacketObje
*/ */
@SafeVarargs @SafeVarargs
public PacketExCreateServer(String name, SubCreator.ServerTemplate template, Version version, int port, UUID log, Callback<ObjectMap<Integer>>... callback) { public PacketExCreateServer(String name, SubCreator.ServerTemplate template, Version version, int port, UUID log, Callback<ObjectMap<Integer>>... callback) {
if (Util.isNull(name, template, version, port, log, callback)) throw new NullPointerException(); if (Util.isNull(name, template, port, log, callback)) throw new NullPointerException();
this.name = name; this.name = name;
this.template = template; this.template = template;
this.version = version; this.version = version;
@ -64,7 +64,7 @@ public class PacketExCreateServer implements PacketObjectIn<Integer>, PacketObje
data.set(0x0003, template.getName()); data.set(0x0003, template.getName());
data.set(0x0004, version); data.set(0x0004, version);
data.set(0x0005, port); data.set(0x0005, port);
data.set(0x0006, log.toString()); data.set(0x0006, log);
} }
return data; return data;
} }

View File

@ -36,6 +36,7 @@ public class PacketExDownloadTemplates implements PacketIn, PacketStreamOut {
public void send(SubDataClient client, OutputStream stream) throws Throwable { public void send(SubDataClient client, OutputStream stream) throws Throwable {
try { try {
Util.zip(new UniversalFile(plugin.dir, "SubServers:Templates"), stream); Util.zip(new UniversalFile(plugin.dir, "SubServers:Templates"), stream);
stream.close();
} catch (Exception e) { } catch (Exception e) {
System.out.println("SubData > Problem encoding template files for Host: " + host.getName()); System.out.println("SubData > Problem encoding template files for Host: " + host.getName());
e.printStackTrace(); e.printStackTrace();

View File

@ -21,6 +21,7 @@ import java.util.Map;
public class PacketLinkExHost implements InitialPacket, PacketObjectIn<Integer>, PacketObjectOut<Integer> { public class PacketLinkExHost implements InitialPacket, PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private SubPlugin plugin; private SubPlugin plugin;
private int response; private int response;
private String message;
/** /**
* New PacketLinkExHost (In) * New PacketLinkExHost (In)
@ -36,15 +37,19 @@ public class PacketLinkExHost implements InitialPacket, PacketObjectIn<Integer>,
* New PacketLinkExHost (Out) * New PacketLinkExHost (Out)
* *
* @param response Response ID * @param response Response ID
* @param message Message
*/ */
public PacketLinkExHost(int response) { public PacketLinkExHost(int response, String message) {
if (Util.isNull(response)) throw new NullPointerException();
this.response = response; this.response = response;
this.message = message;
} }
@Override @Override
public ObjectMap<Integer> send(SubDataClient client) { public ObjectMap<Integer> send(SubDataClient client) {
ObjectMap<Integer> data = new ObjectMap<Integer>(); ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set(0x0001, response); data.set(0x0001, response);
if (message != null) data.set(0x0002, message);
return data; return data;
} }
@ -59,20 +64,20 @@ public class PacketLinkExHost implements InitialPacket, PacketObjectIn<Integer>,
HashMap<Integer, SubDataClient> subdata = Util.getDespiteException(() -> Util.reflect(ExternalHost.class.getDeclaredField("subdata"), host), null); HashMap<Integer, SubDataClient> subdata = Util.getDespiteException(() -> Util.reflect(ExternalHost.class.getDeclaredField("subdata"), host), null);
if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) { if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) {
((ExternalHost) host).setSubData(client, channel); ((ExternalHost) host).setSubData(client, channel);
System.out.println("SubData > " + client.getAddress().toString() + " has been defined as Host: " + host.getName() + ((channel > 0)?" (Sub "+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, null));
setReady(client, true); setReady(client, true);
} else { } else {
client.sendPacket(new PacketLinkExHost(3)); client.sendPacket(new PacketLinkExHost(3, "Host already linked"));
} }
} else { } else {
client.sendPacket(new PacketLinkExHost(4)); client.sendPacket(new PacketLinkExHost(4, "That host does not support a network interface"));
} }
} else { } else {
client.sendPacket(new PacketLinkExHost(2)); client.sendPacket(new PacketLinkExHost(2, "There is no host with name: " + data.getRawString(0x0000)));
} }
} catch (Throwable e) { } catch (Throwable e) {
client.sendPacket(new PacketLinkExHost(1)); client.sendPacket(new PacketLinkExHost(1, null));
e.printStackTrace(); e.printStackTrace();
} }
} }

View File

@ -21,6 +21,7 @@ import java.util.Map;
public class PacketLinkProxy implements InitialPacket, PacketObjectIn<Integer>, PacketObjectOut<Integer> { public class PacketLinkProxy implements InitialPacket, PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private SubPlugin plugin; private SubPlugin plugin;
private int response; private int response;
private String message;
private String name; private String name;
/** /**
@ -39,9 +40,10 @@ public class PacketLinkProxy implements InitialPacket, PacketObjectIn<Integer>,
* @param name The name that was generated * @param name The name that was generated
* @param response Response ID * @param response Response ID
*/ */
public PacketLinkProxy(String name, int response) { public PacketLinkProxy(String name, int response, String message) {
this.name = name; this.name = name;
this.response = response; this.response = response;
this.message = message;
} }
@Override @Override
@ -49,6 +51,7 @@ public class PacketLinkProxy implements InitialPacket, PacketObjectIn<Integer>,
ObjectMap<Integer> json = new ObjectMap<Integer>(); ObjectMap<Integer> json = new ObjectMap<Integer>();
json.set(0x0000, name); json.set(0x0000, name);
json.set(0x0001, response); json.set(0x0001, response);
if (message != null) json.set(0x0002, message);
return json; return json;
} }
@ -69,15 +72,15 @@ public class PacketLinkProxy implements InitialPacket, PacketObjectIn<Integer>,
HashMap<Integer, SubDataClient> subdata = Util.getDespiteException(() -> Util.reflect(Proxy.class.getDeclaredField("subdata"), proxy), null); 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)) { if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) {
proxy.setSubData(client, channel); proxy.setSubData(client, channel);
System.out.println("SubData > " + client.getAddress().toString() + " has been defined as Proxy: " + proxy.getName() + ((channel > 0)?" (Sub "+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)); client.sendPacket(new PacketLinkProxy(proxy.getName(), 0, null));
setReady(client, true); setReady(client, true);
} else { } else {
client.sendPacket(new PacketLinkProxy(proxy.getName(), 2)); client.sendPacket(new PacketLinkProxy(proxy.getName(), 2, "Proxy already linked"));
} }
} catch (Throwable e) { } catch (Throwable e) {
client.sendPacket(new PacketLinkProxy(null, 1)); client.sendPacket(new PacketLinkProxy(null, 1, null));
e.printStackTrace(); e.printStackTrace();
} }
} }

View File

@ -100,7 +100,7 @@ public class PacketLinkServer implements InitialPacket, PacketObjectIn<Integer>,
HashMap<Integer, SubDataClient> subdata = Util.getDespiteException(() -> Util.reflect(ServerContainer.class.getDeclaredField("subdata"), server), null); HashMap<Integer, SubDataClient> subdata = Util.getDespiteException(() -> Util.reflect(ServerContainer.class.getDeclaredField("subdata"), server), null);
if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) { if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) {
server.setSubData(client, channel); 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+")":"")); 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

@ -285,7 +285,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()[0] != null)?ChatColor.GREEN+"yes"+((server.getSubData().length > 1)?ChatColor.AQUA+" +"+(server.getSubData().length-1):""):ChatColor.RED+"no")); sender.sendMessage(" -> Connected: " + ((server.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((server.getSubData().length > 1)?ChatColor.AQUA+" +"+(server.getSubData().length-1)+" subchannel"+((server.getSubData().length == 2)?"":"s"):""):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()));
@ -330,7 +330,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) sender.sendMessage(" -> Connected: " + ((((ClientHandler) host).getSubData()[0] != null)?ChatColor.GREEN+"yes"+((((ClientHandler) host).getSubData().length > 1)?ChatColor.AQUA+" +"+(((ClientHandler) host).getSubData().length-1):""):ChatColor.RED+"no")); if (host instanceof ClientHandler) sender.sendMessage(" -> Connected: " + ((((ClientHandler) host).getSubData()[0] != null)?ChatColor.GREEN+"yes"+((((ClientHandler) host).getSubData().length > 1)?ChatColor.AQUA+" +"+(((ClientHandler) host).getSubData().length-1)+" subchannel"+((((ClientHandler) host).getSubData().length == 2)?"":"s"):""):ChatColor.RED+"no"));
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()));
@ -349,7 +349,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()[0] != null)?ChatColor.GREEN+"yes"+((proxy.getSubData().length > 1)?ChatColor.AQUA+" +"+(proxy.getSubData().length-1):""):ChatColor.RED+"no")); sender.sendMessage(" -> Connected: " + ((proxy.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((proxy.getSubData().length > 1)?ChatColor.AQUA+" +"+(proxy.getSubData().length-1)+" subchannel"+((proxy.getSubData().length == 2)?"":"s"):""):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

@ -48,13 +48,13 @@
<dependency> <dependency>
<groupId>net.ME1312.Galaxi</groupId> <groupId>net.ME1312.Galaxi</groupId>
<artifactId>GalaxiUtil</artifactId> <artifactId>GalaxiUtil</artifactId>
<version>19w19c</version> <version>19w20a</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>19w19f</version> <version>19w20f</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -234,7 +234,7 @@ public class Metrics {
} catch (NoSuchFieldException ignored) { } } catch (NoSuchFieldException ignored) { }
} }
data.put("plugins", pluginData); data.put("Plugins", pluginData);
// Create a new thread for the connection to the bStats server // Create a new thread for the connection to the bStats server
new Thread(new Runnable() { new Thread(new Runnable() {

View File

@ -15,7 +15,7 @@ import java.util.Calendar;
/** /**
* Download Lang Packet * Download Lang Packet
*/ */
public class PacketDownloadLang implements PacketObjectIn<Integer>, PacketObjectOut<Integer> { public class PacketDownloadLang implements PacketObjectIn<Integer>, PacketOut {
private SubPlugin plugin; private SubPlugin plugin;
/** /**
@ -33,11 +33,6 @@ public class PacketDownloadLang implements PacketObjectIn<Integer>, PacketObject
*/ */
public PacketDownloadLang() {} public PacketDownloadLang() {}
@Override
public ObjectMap<Integer> send(SubDataClient subDataClient) throws Throwable {
return null;
}
@Override @Override
public void receive(SubDataClient client, ObjectMap<Integer> data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
try { try {

View File

@ -23,7 +23,6 @@ import java.util.logging.Logger;
public class SubProtocol extends SubDataProtocol { public class SubProtocol extends SubDataProtocol {
private static SubProtocol instance; private static SubProtocol instance;
private static Logger log;
private SubProtocol() {} private SubProtocol() {}
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@ -32,33 +31,6 @@ public class SubProtocol extends SubDataProtocol {
instance = new SubProtocol(); instance = new SubProtocol();
SubPlugin plugin = SubAPI.getInstance().getInternals(); SubPlugin plugin = SubAPI.getInstance().getInternals();
log = Logger.getAnonymousLogger();
log.setUseParentHandlers(false);
log.addHandler(new Handler() {
private boolean open = true;
@Override
public void publish(LogRecord record) {
if (open) {
if (plugin.isEnabled()) {
Bukkit.getScheduler().runTask(plugin, () -> Bukkit.getLogger().log(record.getLevel(), "SubData > " + record.getMessage(), record.getParameters()));
} else {
Bukkit.getLogger().log(record.getLevel(), "SubData > " + record.getMessage(), record.getParameters());
}
}
}
@Override
public void flush() {
}
@Override
public void close() throws SecurityException {
open = false;
}
});
instance.setName("SubServers 2"); instance.setName("SubServers 2");
instance.addVersion(new Version("2.14a+")); instance.addVersion(new Version("2.14a+"));
@ -125,16 +97,50 @@ public class SubProtocol extends SubDataProtocol {
return instance; return instance;
} }
@SuppressWarnings("deprecation")
private Logger getLogger(int channel) {
SubPlugin plugin = SubAPI.getInstance().getInternals();
Logger log = Logger.getAnonymousLogger();
log.setUseParentHandlers(false);
log.addHandler(new Handler() {
private boolean open = true;
private String prefix = "SubData" + ((channel != 0)? "/Sub-"+channel:"");
@Override
public void publish(LogRecord record) {
if (open) {
if (plugin.isEnabled()) {
Bukkit.getScheduler().runTask(plugin, () -> Bukkit.getLogger().log(record.getLevel(), prefix + " > " + record.getMessage(), record.getParameters()));
} else {
Bukkit.getLogger().log(record.getLevel(), prefix + " > " + record.getMessage(), record.getParameters());
}
}
}
@Override
public void flush() {
}
@Override
public void close() throws SecurityException {
open = false;
}
});
return log;
}
@Override @Override
protected SubDataClient sub(Callback<Runnable> scheduler, Logger logger, InetAddress address, int port) throws IOException { protected SubDataClient sub(Callback<Runnable> scheduler, Logger logger, InetAddress address, int port) throws IOException {
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); HashMap<Integer, SubDataClient> map = Util.getDespiteException(() -> Util.reflect(SubPlugin.class.getDeclaredField("subdata"), plugin), null);
int channel = 1; int channel = 1;
while (map.keySet().contains(channel)) channel++; while (map.keySet().contains(channel)) channel++;
final int fc = channel; final int fc = channel;
SubDataClient subdata = super.open(scheduler, getLogger(fc), address, port);
map.put(fc, subdata); map.put(fc, subdata);
subdata.sendPacket(new PacketLinkServer(plugin, fc)); subdata.sendPacket(new PacketLinkServer(plugin, fc));
subdata.on.closed(client -> map.remove(fc)); subdata.on.closed(client -> map.remove(fc));
@ -193,6 +199,6 @@ public class SubProtocol extends SubDataProtocol {
} }
public SubDataClient open(InetAddress address, int port) throws IOException { public SubDataClient open(InetAddress address, int port) throws IOException {
return open(log, address, port); return open(getLogger(0), address, port);
} }
} }

View File

@ -237,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()[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$", "Connected") + ((server.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((server.getSubData().length > 1)?ChatColor.AQUA+" +"+(server.getSubData().length-1)+" subchannel"+((server.getSubData().length == 2)?"":"s"):""):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()));
@ -280,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().length > 0) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected") + ((host.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((host.getSubData().length > 1)?ChatColor.AQUA+" +"+(host.getSubData().length-1):""):ChatColor.RED+"no")); if (host.getSubData().length > 0) sender.sendMessage(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected") + ((host.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((host.getSubData().length > 1)?ChatColor.AQUA+" +"+(host.getSubData().length-1)+" subchannel"+((host.getSubData().length == 2)?"":"s"):""):ChatColor.RED+"no"));
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()));
@ -298,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()[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$", "Connected") + ((proxy.getSubData()[0] != null)?ChatColor.GREEN+"yes"+((proxy.getSubData().length > 1)?ChatColor.AQUA+" +"+(proxy.getSubData().length-1)+" subchannel"+((proxy.getSubData().length == 2)?"":"s"):""):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());

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>19w19c</version> <version>19w20a</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>19w19f</version> <version>19w20f</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@ -30,7 +30,7 @@ public class SubCreateEvent extends AbstractEvent implements SubEvent {
* @param port Server Port Number * @param port Server Port Number
*/ */
public SubCreateEvent(UUID player, String host, String name, String template, Version version, int port) { public SubCreateEvent(UUID player, String host, String name, String template, Version version, int port) {
if (Util.isNull(host, name, template, version, port)) throw new NullPointerException(); if (Util.isNull(host, name, template, port)) throw new NullPointerException();
this.player = player; this.player = player;
this.host = host; this.host = host;
this.name = name; this.name = name;

View File

@ -5,6 +5,7 @@ import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.Protocol.PacketObjectIn; import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubData.Client.Protocol.PacketObjectOut; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubData.Client.Protocol.PacketOut;
import net.ME1312.SubData.Client.SubDataClient; import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Client.Sponge.SubPlugin; import net.ME1312.SubServers.Client.Sponge.SubPlugin;
@ -14,7 +15,7 @@ import java.util.logging.Logger;
/** /**
* Download Lang Packet * Download Lang Packet
*/ */
public class PacketDownloadLang implements PacketObjectIn<Integer>, PacketObjectOut<Integer> { public class PacketDownloadLang implements PacketObjectIn<Integer>, PacketOut {
private SubPlugin plugin; private SubPlugin plugin;
/** /**
@ -32,11 +33,6 @@ public class PacketDownloadLang implements PacketObjectIn<Integer>, PacketObject
*/ */
public PacketDownloadLang() {} public PacketDownloadLang() {}
@Override
public ObjectMap<Integer> send(SubDataClient subDataClient) throws Throwable {
return null;
}
@Override @Override
public void receive(SubDataClient client, ObjectMap<Integer> data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
Logger log = Util.getDespiteException(() -> Util.reflect(SubDataClient.class.getDeclaredField("log"), client), null); Logger log = Util.getDespiteException(() -> Util.reflect(SubDataClient.class.getDeclaredField("log"), client), null);

View File

@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory;
import org.spongepowered.api.GameState; import org.spongepowered.api.GameState;
import org.spongepowered.api.Sponge; import org.spongepowered.api.Sponge;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress; import java.net.InetAddress;
@ -28,7 +29,6 @@ import static java.util.logging.Level.*;
public class SubProtocol extends SubDataProtocol { public class SubProtocol extends SubDataProtocol {
private static SubProtocol instance; private static SubProtocol instance;
private static Logger log;
private SubProtocol() {} private SubProtocol() {}
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@ -38,40 +38,6 @@ public class SubProtocol extends SubDataProtocol {
SubPlugin plugin = SubAPI.getInstance().getInternals(); SubPlugin plugin = SubAPI.getInstance().getInternals();
log = Logger.getAnonymousLogger();
log.setUseParentHandlers(false);
log.addHandler(new Handler() {
private org.slf4j.Logger log = LoggerFactory.getLogger("SubData");
private boolean open = true;
@Override
public void publish(LogRecord record) {
if (open) {
if (record.getLevel().intValue() == OFF.intValue()) {
// do nothing
} else if (record.getLevel().intValue() == FINE.intValue() || record.getLevel().intValue() == FINER.intValue() || record.getLevel().intValue() == FINEST.intValue()) {
log.debug(record.getMessage());
} else if (record.getLevel().intValue() == ALL.intValue() || record.getLevel().intValue() == CONFIG.intValue() || record.getLevel().intValue() == INFO.intValue()) {
log.info(record.getMessage());
} else if (record.getLevel().intValue() == WARNING.intValue()) {
log.warn(record.getMessage());
} else if (record.getLevel().intValue() == SEVERE.intValue()) {
log.error(record.getMessage());
}
}
}
@Override
public void flush() {
}
@Override
public void close() throws SecurityException {
open = false;
}
});
instance.setName("SubServers 2"); instance.setName("SubServers 2");
instance.addVersion(new Version("2.14a+")); instance.addVersion(new Version("2.14a+"));
@ -138,16 +104,54 @@ public class SubProtocol extends SubDataProtocol {
return instance; return instance;
} }
private Logger getLogger(int channel) {
Logger log = Logger.getAnonymousLogger();
log.setUseParentHandlers(false);
log.addHandler(new Handler() {
private org.slf4j.Logger log = LoggerFactory.getLogger("SubData" + ((channel != 0)? "/Sub-"+channel:""));
private boolean open = true;
@Override
public void publish(LogRecord record) {
if (open) {
if (record.getLevel().intValue() == OFF.intValue()) {
// do nothing
} else if (record.getLevel().intValue() == FINE.intValue() || record.getLevel().intValue() == FINER.intValue() || record.getLevel().intValue() == FINEST.intValue()) {
log.debug(record.getMessage());
} else if (record.getLevel().intValue() == ALL.intValue() || record.getLevel().intValue() == CONFIG.intValue() || record.getLevel().intValue() == INFO.intValue()) {
log.info(record.getMessage());
} else if (record.getLevel().intValue() == WARNING.intValue()) {
log.warn(record.getMessage());
} else if (record.getLevel().intValue() == SEVERE.intValue()) {
log.error(record.getMessage());
}
}
}
@Override
public void flush() {
}
@Override
public void close() throws SecurityException {
open = false;
}
});
return log;
}
@Override @Override
protected SubDataClient sub(Callback<Runnable> scheduler, Logger logger, InetAddress address, int port) throws IOException { protected SubDataClient sub(Callback<Runnable> scheduler, Logger logger, InetAddress address, int port) throws IOException {
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); HashMap<Integer, SubDataClient> map = Util.getDespiteException(() -> Util.reflect(SubPlugin.class.getDeclaredField("subdata"), plugin), null);
int channel = 1; int channel = 1;
while (map.keySet().contains(channel)) channel++; while (map.keySet().contains(channel)) channel++;
final int fc = channel; final int fc = channel;
SubDataClient subdata = super.open(scheduler, getLogger(fc), address, port);
map.put(fc, subdata); map.put(fc, subdata);
subdata.sendPacket(new PacketLinkServer(plugin, fc)); subdata.sendPacket(new PacketLinkServer(plugin, fc));
subdata.on.closed(client -> map.remove(fc)); subdata.on.closed(client -> map.remove(fc));
@ -159,9 +163,9 @@ public class SubProtocol extends SubDataProtocol {
@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 {
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); HashMap<Integer, SubDataClient> map = Util.getDespiteException(() -> Util.reflect(SubPlugin.class.getDeclaredField("subdata"), plugin), null);
SubDataClient subdata = super.open(scheduler, logger, address, port);
subdata.sendPacket(new PacketLinkServer(plugin, 0)); subdata.sendPacket(new PacketLinkServer(plugin, 0));
subdata.sendPacket(new PacketDownloadLang()); subdata.sendPacket(new PacketDownloadLang());
subdata.on.ready(client -> Sponge.getEventManager().post(new SubNetworkConnectEvent((SubDataClient) client))); subdata.on.ready(client -> Sponge.getEventManager().post(new SubNetworkConnectEvent((SubDataClient) client)));
@ -205,6 +209,6 @@ public class SubProtocol extends SubDataProtocol {
} }
public SubDataClient open(InetAddress address, int port) throws IOException { public SubDataClient open(InetAddress address, int port) throws IOException {
return open(log, address, port); return open(getLogger(0), address, port);
} }
} }

View File

@ -526,7 +526,7 @@ public final class SubCommand implements CommandExecutor {
else sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Port")).toBuilder().append(Text.builder(Integer.toString(server.getAddress().getPort())).color(TextColors.AQUA).build()).build()); else sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Port")).toBuilder().append(Text.builder(Integer.toString(server.getAddress().getPort())).color(TextColors.AQUA).build()).build());
if (server instanceof SubServer) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Running")).toBuilder().append(Text.builder((((SubServer) server).isRunning())?"yes":"no").color((((SubServer) server).isRunning())?TextColors.GREEN:TextColors.RED).build()).build()); if (server instanceof SubServer) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Running")).toBuilder().append(Text.builder((((SubServer) server).isRunning())?"yes":"no").color((((SubServer) server).isRunning())?TextColors.GREEN:TextColors.RED).build()).build());
if (!(server instanceof SubServer) || ((SubServer) server).isRunning()) { if (!(server instanceof SubServer) || ((SubServer) server).isRunning()) {
sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected")).toBuilder().append(Text.builder((server.getSubData()[0] != null)?"yes":"no").color((server.getSubData()[0] != null)?TextColors.GREEN:TextColors.RED).build(), Text.builder((server.getSubData().length > 1)?" +"+(server.getSubData().length-1):"").color(TextColors.AQUA).build()).build()); sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected")).toBuilder().append(Text.builder((server.getSubData()[0] != null)?"yes":"no").color((server.getSubData()[0] != null)?TextColors.GREEN:TextColors.RED).build(), Text.builder((server.getSubData().length > 1)?" +"+(server.getSubData().length-1)+" subchannel"+((server.getSubData().length == 2)?"":"s"):"").color(TextColors.AQUA).build()).build());
sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Players")).toBuilder().append(Text.builder(server.getPlayers().size() + " online").color(TextColors.AQUA).build()).build()); sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Players")).toBuilder().append(Text.builder(server.getPlayers().size() + " online").color(TextColors.AQUA).build()).build());
} }
sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "MOTD")).toBuilder().append(Text.builder(server.getMotd().replaceAll("\\u00A7[0-9a-fA-Fk-oK-ORr]", "")).color(TextColors.WHITE).build()).build()); sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "MOTD")).toBuilder().append(Text.builder(server.getMotd().replaceAll("\\u00A7[0-9a-fA-Fk-oK-ORr]", "")).color(TextColors.WHITE).build()).build());
@ -569,7 +569,7 @@ public final class SubCommand implements CommandExecutor {
sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Available")).toBuilder().append(Text.builder((host.isAvailable())?"yes":"no").color((host.isAvailable())?TextColors.GREEN:TextColors.RED).build()).build()); sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Available")).toBuilder().append(Text.builder((host.isAvailable())?"yes":"no").color((host.isAvailable())?TextColors.GREEN:TextColors.RED).build()).build());
sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Enabled")).toBuilder().append(Text.builder((host.isEnabled())?"yes":"no").color((host.isEnabled())?TextColors.GREEN:TextColors.RED).build()).build()); sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Enabled")).toBuilder().append(Text.builder((host.isEnabled())?"yes":"no").color((host.isEnabled())?TextColors.GREEN:TextColors.RED).build()).build());
if (plugin.config.get().getMap("Settings").getBoolean("Show-Addresses", false)) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Address")).toBuilder().append(Text.builder(host.getAddress().getHostAddress()).color(TextColors.WHITE).build()).build()); if (plugin.config.get().getMap("Settings").getBoolean("Show-Addresses", false)) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Address")).toBuilder().append(Text.builder(host.getAddress().getHostAddress()).color(TextColors.WHITE).build()).build());
if (host.getSubData().length > 0) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected")).toBuilder().append(Text.builder((host.getSubData()[0] != null)?"yes":"no").color((host.getSubData()[0] != null)?TextColors.GREEN:TextColors.RED).build(), Text.builder((host.getSubData().length > 1)?" +"+(host.getSubData().length-1):"").color(TextColors.AQUA).build()).build()); if (host.getSubData().length > 0) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected")).toBuilder().append(Text.builder((host.getSubData()[0] != null)?"yes":"no").color((host.getSubData()[0] != null)?TextColors.GREEN:TextColors.RED).build(), Text.builder((host.getSubData().length > 1)?" +"+(host.getSubData().length-1)+" subchannel"+((host.getSubData().length == 2)?"":"s"):"").color(TextColors.AQUA).build()).build());
sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "SubServers")).toBuilder().append(Text.builder((host.getSubServers().keySet().size() <= 0)?"(none)":Integer.toString(host.getSubServers().keySet().size())).color((host.getSubServers().keySet().size() <= 0)?TextColors.GRAY:TextColors.AQUA).build()).build()); sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "SubServers")).toBuilder().append(Text.builder((host.getSubServers().keySet().size() <= 0)?"(none)":Integer.toString(host.getSubServers().keySet().size())).color((host.getSubServers().keySet().size() <= 0)?TextColors.GRAY:TextColors.AQUA).build()).build());
for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(ChatColor.convertColor(" " + plugin.api.getLang("SubServers", "Command.Info.List")).toBuilder().append(Text.builder(subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')')).color((subserver.isEnabled())?TextColors.WHITE:TextColors.GRAY).build()).build()); for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(ChatColor.convertColor(" " + plugin.api.getLang("SubServers", "Command.Info.List")).toBuilder().append(Text.builder(subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')')).color((subserver.isEnabled())?TextColors.WHITE:TextColors.GRAY).build()).build());
sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Templates")).toBuilder().append(Text.builder((host.getCreator().getTemplates().keySet().size() <= 0)?"(none)":Integer.toString(host.getCreator().getTemplates().keySet().size())).color((host.getCreator().getTemplates().keySet().size() <= 0)?TextColors.GRAY:TextColors.AQUA).build()).build()); sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Templates")).toBuilder().append(Text.builder((host.getCreator().getTemplates().keySet().size() <= 0)?"(none)":Integer.toString(host.getCreator().getTemplates().keySet().size())).color((host.getCreator().getTemplates().keySet().size() <= 0)?TextColors.GRAY:TextColors.AQUA).build()).build());
@ -587,7 +587,7 @@ public final class SubCommand implements CommandExecutor {
if (proxy != null) { if (proxy != null) {
sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info").replace("$str$", "Proxy")).toBuilder().append(Text.builder(proxy.getDisplayName()).color(TextColors.WHITE).build()).build()); sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info").replace("$str$", "Proxy")).toBuilder().append(Text.builder(proxy.getDisplayName()).color(TextColors.WHITE).build()).build());
if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "System Name")).toBuilder().append(Text.builder(proxy.getName()).color(TextColors.WHITE ).build()).build()); if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "System Name")).toBuilder().append(Text.builder(proxy.getName()).color(TextColors.WHITE ).build()).build());
sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected")).toBuilder().append(Text.builder((proxy.getSubData()[0] != null)?"yes":"no").color((proxy.getSubData()[0] != null)?TextColors.GREEN:TextColors.RED).build(), Text.builder((proxy.getSubData().length > 1)?" +"+(proxy.getSubData().length-1):"").color(TextColors.AQUA).build()).build()); sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Connected")).toBuilder().append(Text.builder((proxy.getSubData()[0] != null)?"yes":"no").color((proxy.getSubData()[0] != null)?TextColors.GREEN:TextColors.RED).build(), Text.builder((proxy.getSubData().length > 1)?" +"+(proxy.getSubData().length-1)+" subchannel"+((proxy.getSubData().length == 2)?"":"s"):"").color(TextColors.AQUA).build()).build());
sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Redis") ).toBuilder().append(Text.builder(((proxy.isRedis())?"":"un") + "available").color((proxy.isRedis())?TextColors.GREEN:TextColors.RED).build()).build()); sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Redis") ).toBuilder().append(Text.builder(((proxy.isRedis())?"":"un") + "available").color((proxy.isRedis())?TextColors.GREEN:TextColors.RED).build()).build());
if (proxy.isRedis()) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Players")).toBuilder().append(Text.builder(proxy.getPlayers().size() + " online").color(TextColors.AQUA).build()).build()); if (proxy.isRedis()) sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Players")).toBuilder().append(Text.builder(proxy.getPlayers().size() + " online").color(TextColors.AQUA).build()).build());
sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Signature")).toBuilder().append(Text.builder(proxy.getSignature()).color(TextColors.AQUA).build()).build()); sender.sendMessage(ChatColor.convertColor(plugin.api.getLang("SubServers", "Command.Info.Format").replace("$str$", "Signature")).toBuilder().append(Text.builder(proxy.getSignature()).color(TextColors.AQUA).build()).build());

View File

@ -57,7 +57,6 @@ public final class SubPlugin {
@Inject public Game game; @Inject public Game game;
private boolean reconnect = false; private boolean reconnect = false;
private boolean scheduling = false;
@Listener @Listener
public void setup(GamePreInitializationEvent event) { public void setup(GamePreInitializationEvent event) {
@ -94,7 +93,6 @@ public final class SubPlugin {
Files.move(new UniversalFile(new File(System.getProperty("user.dir")), "subdata.rsa.key").toPath(), new UniversalFile(dir, "subdata.rsa.key").toPath()); Files.move(new UniversalFile(new File(System.getProperty("user.dir")), "subdata.rsa.key").toPath(), new UniversalFile(dir, "subdata.rsa.key").toPath());
} }
scheduling = true;
subprotocol = SubProtocol.get(); subprotocol = SubProtocol.get();
reload(false); reload(false);
@ -196,7 +194,6 @@ public final class SubPlugin {
*/ */
@Listener @Listener
public void disable(GameStoppingEvent event) { public void disable(GameStoppingEvent event) {
scheduling = false;
if (subdata != null) try { if (subdata != null) try {
reconnect = false; reconnect = false;

View File

@ -1,9 +0,0 @@
Settings:
Version: '2.11.2a+'
Ingame-Access: true
Show-Addresses: false
Use-Title-Messages: true
SubData:
Address: '127.0.0.1:4391'
Password: 'default'
Encryption: 'AES'

View File

@ -1,4 +1,4 @@
name: SubServers-Console name: SubServers-Console
main: net.ME1312.SubServers.Console.ConsolePlugin main: net.ME1312.SubServers.Console.ConsolePlugin
version: 2.13.2b version: 2.14a
author: ME1312 author: ME1312

View File

@ -1,5 +1,6 @@
package net.ME1312.SubServers.Console; package net.ME1312.SubServers.Console;
import net.ME1312.Galaxi.Library.Callback.ExceptionReturnRunnable;
import net.ME1312.Galaxi.Library.Callback.ExceptionRunnable; import net.ME1312.Galaxi.Library.Callback.ExceptionRunnable;
import net.ME1312.SubServers.Bungee.Host.SubCreator; import net.ME1312.SubServers.Bungee.Host.SubCreator;
import net.ME1312.SubServers.Bungee.Host.SubLogFilter; import net.ME1312.SubServers.Bungee.Host.SubLogFilter;
@ -46,6 +47,8 @@ public final class ConsoleWindow implements SubLogFilter {
private int findO = 0; private int findO = 0;
private int findI = 0; private int findI = 0;
private boolean open = false; private boolean open = false;
private boolean running = true;
private LinkedList<Object> messages = new LinkedList<Object>();
private SubLogger logger; private SubLogger logger;
private int fontSize = 12; private int fontSize = 12;
private File file = null; private File file = null;
@ -564,6 +567,7 @@ public final class ConsoleWindow implements SubLogFilter {
logger.registerFilter(this); logger.registerFilter(this);
log.setText(RESET_VALUE); log.setText(RESET_VALUE);
loadContent(); loadContent();
log();
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(keys); KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(keys);
} }
private void hScroll() { private void hScroll() {
@ -579,9 +583,7 @@ public final class ConsoleWindow implements SubLogFilter {
public void log(Date date, String message) { public void log(Date date, String message) {
try { try {
byte[] msg = ('\u00A0' + new SimpleDateFormat("hh:mm:ss").format(date) + ' ' + message + "\u00A0\n").getBytes("UTF-8"); messages.add(('\u00A0' + new SimpleDateFormat("hh:mm:ss").format(date) + ' ' + message + "\u00A0\n").getBytes("UTF-8"));
filewriter.write(msg);
stream.write(msg);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -598,6 +600,33 @@ public final class ConsoleWindow implements SubLogFilter {
return !open; return !open;
} }
private void log() {
new Thread("SubServers.Console::Log_Spooler(" + logger.getName() + ")") {
@Override
public void run() {
while (running) {
while (running && messages.size() > 0) try {
byte[] msg = (byte[]) Util.getDespiteException(new ExceptionReturnRunnable<Object>() {
@Override
public Object run() throws Throwable {
return messages.get(0);
}
}, null);
if (msg != null) {
filewriter.write(msg);
stream.write(msg);
}
try { ConsoleWindow.this.messages.remove(0); } catch (Throwable e) {}
} catch (Throwable e) {
try { ConsoleWindow.this.messages.remove(0); } catch (Throwable ex) {}
e.printStackTrace();
}
try { Thread.sleep(32); } catch (Throwable e) {}
}
}
}.start();
}
public void clear() { public void clear() {
log.setText(RESET_VALUE); log.setText(RESET_VALUE);
hScroll(); hScroll();
@ -650,6 +679,7 @@ public final class ConsoleWindow implements SubLogFilter {
public void destroy() { public void destroy() {
close(); close();
running = false;
logger.unregisterFilter(this); logger.unregisterFilter(this);
if (filewriter != null) try { if (filewriter != null) try {
filewriter.close(); filewriter.close();

View File

@ -20,13 +20,13 @@
<dependency> <dependency>
<groupId>net.ME1312.Galaxi</groupId> <groupId>net.ME1312.Galaxi</groupId>
<artifactId>GalaxiEngine</artifactId> <artifactId>GalaxiEngine</artifactId>
<version>19w04c</version> <version>19w20a</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.msgpack</groupId> <groupId>net.ME1312.SubData</groupId>
<artifactId>msgpack-core</artifactId> <artifactId>Client</artifactId>
<version>0.8.16</version> <version>19w20f</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -28,7 +28,7 @@ public class SubCreateEvent extends Event {
* @param port Server Port Number * @param port Server Port Number
*/ */
public SubCreateEvent(UUID player, String host, String name, String template, Version version, int port) { public SubCreateEvent(UUID player, String host, String name, String template, Version version, int port) {
if (Util.isNull(host, name, template, version, port)) throw new NullPointerException(); if (Util.isNull(host, name, template, port)) throw new NullPointerException();
this.player = player; this.player = player;
this.host = host; this.host = host;
this.name = name; this.name = name;

View File

@ -1,7 +1,7 @@
package net.ME1312.SubServers.Host.Event; package net.ME1312.SubServers.Host.Event;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Config.YAMLValue; import net.ME1312.Galaxi.Library.Map.ObjectMapValue;
import net.ME1312.Galaxi.Library.Event.Event; import net.ME1312.Galaxi.Library.Event.Event;
import net.ME1312.Galaxi.Library.NamedContainer; import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Util;
@ -14,7 +14,7 @@ import java.util.UUID;
public class SubEditServerEvent extends Event { public class SubEditServerEvent extends Event {
private UUID player; private UUID player;
private String server; private String server;
private NamedContainer<String, YAMLValue> edit; private NamedContainer<String, ObjectMapValue<String>> edit;
private boolean perm; private boolean perm;
/** /**
@ -27,11 +27,11 @@ public class SubEditServerEvent extends Event {
*/ */
public SubEditServerEvent(UUID player, String server, NamedContainer<String, ?> edit, boolean permanent) { public SubEditServerEvent(UUID player, String server, NamedContainer<String, ?> edit, boolean permanent) {
if (Util.isNull(server, edit)) throw new NullPointerException(); if (Util.isNull(server, edit)) throw new NullPointerException();
YAMLSection section = new YAMLSection(); ObjectMap<String> section = new ObjectMap<String>();
section.set(".", edit.get()); section.set(".", edit.get());
this.player = player; this.player = player;
this.server = server; this.server = server;
this.edit = new NamedContainer<String, YAMLValue>(edit.name(), section.get(".")); this.edit = new NamedContainer<String, ObjectMapValue<String>>(edit.name(), section.get("."));
this.perm = permanent; this.perm = permanent;
} }
@ -54,7 +54,7 @@ public class SubEditServerEvent extends Event {
* *
* @return Edit to be made * @return Edit to be made
*/ */
public NamedContainer<String, YAMLValue> getEdit() { public NamedContainer<String, ObjectMapValue<String>> getEdit() {
return edit; return edit;
} }

View File

@ -2,7 +2,7 @@ package net.ME1312.SubServers.Host.Event;
import net.ME1312.Galaxi.Library.Event.Event; import net.ME1312.Galaxi.Library.Event.Event;
import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubServers.Host.Network.SubDataClient; import net.ME1312.SubData.Client.SubDataClient;
/** /**
* SubData Network Connect Event * SubData Network Connect Event

View File

@ -1,8 +1,41 @@
package net.ME1312.SubServers.Host.Event; package net.ME1312.SubServers.Host.Event;
import net.ME1312.Galaxi.Library.Event.Event; import net.ME1312.Galaxi.Library.Event.Event;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.DataClient;
import net.ME1312.SubData.Client.Library.DisconnectReason;
/** /**
* SubData Network Disconnect Event * SubData Network Disconnect Event
*/ */
public class SubNetworkDisconnectEvent extends Event {} public class SubNetworkDisconnectEvent extends Event {
private DataClient network;
private DisconnectReason reason;
/**
* SubData Network Disconnect Event
*/
public SubNetworkDisconnectEvent(DataClient network, DisconnectReason reason) {
if (Util.isNull(network, reason)) throw new NullPointerException();
this.network = network;
this.reason = reason;
}
/**
* Get the SubData network
*
* @return SubData Network
*/
public DataClient getNetwork() {
return network;
}
/**
* Get the reason the client disconnected
*
* @return Disconnect Reason
*/
public DisconnectReason getReason() {
return reason;
}
}

View File

@ -7,6 +7,7 @@ import net.ME1312.Galaxi.Event.GalaxiReloadEvent;
import net.ME1312.Galaxi.Galaxi; import net.ME1312.Galaxi.Galaxi;
import net.ME1312.Galaxi.Library.Config.YAMLConfig; import net.ME1312.Galaxi.Library.Config.YAMLConfig;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Log.Logger; import net.ME1312.Galaxi.Library.Log.Logger;
import net.ME1312.Galaxi.Library.NamedContainer; import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.UniversalFile; import net.ME1312.Galaxi.Library.UniversalFile;
@ -15,12 +16,16 @@ import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.Galaxi.Library.Version.VersionType; import net.ME1312.Galaxi.Library.Version.VersionType;
import net.ME1312.Galaxi.Plugin.Plugin; import net.ME1312.Galaxi.Plugin.Plugin;
import net.ME1312.Galaxi.Plugin.PluginInfo; import net.ME1312.Galaxi.Plugin.PluginInfo;
import net.ME1312.SubData.Client.Encryption.AES;
import net.ME1312.SubData.Client.Encryption.RSA;
import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.Executable.SubCreator; import net.ME1312.SubServers.Host.Executable.SubCreator;
import net.ME1312.SubServers.Host.Executable.SubLogger; import net.ME1312.SubServers.Host.Executable.SubLogger;
import net.ME1312.SubServers.Host.Executable.SubServer; import net.ME1312.SubServers.Host.Executable.SubServer;
import net.ME1312.SubServers.Host.Library.*; import net.ME1312.SubServers.Host.Library.*;
import net.ME1312.SubServers.Host.Network.Cipher; import net.ME1312.SubServers.Host.Library.Updates.ConfigUpdater;
import net.ME1312.SubServers.Host.Network.SubDataClient; import net.ME1312.SubServers.Host.Network.SubProtocol;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.*; import java.io.*;
@ -38,6 +43,7 @@ import java.util.jar.Manifest;
*/ */
@Plugin(name = "SubServers.Host", version = "2.14a", authors = "ME1312", description = "Host SubServers from other Machines", website = "https://github.com/ME1312/SubServers-2") @Plugin(name = "SubServers.Host", version = "2.14a", authors = "ME1312", description = "Host SubServers from other Machines", website = "https://github.com/ME1312/SubServers-2")
public final class ExHost { public final class ExHost {
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 HashMap<String, SubCreator.ServerTemplate> templates = new HashMap<String, SubCreator.ServerTemplate>(); public HashMap<String, SubCreator.ServerTemplate> templates = new HashMap<String, SubCreator.ServerTemplate>();
public HashMap<String, SubServer> servers = new HashMap<String, SubServer>(); public HashMap<String, SubServer> servers = new HashMap<String, SubServer>();
@ -47,11 +53,12 @@ public final class ExHost {
public PluginInfo info; public PluginInfo info;
public GalaxiEngine engine; public GalaxiEngine engine;
public YAMLConfig config; public YAMLConfig config;
public YAMLSection host = null; public ObjectMap<String> host = null;
public SubDataClient subdata = null; public SubProtocol subprotocol;
public final SubAPI api = new SubAPI(this); public final SubAPI api = new SubAPI(this);
private boolean reconnect = true;
private boolean running = false; private boolean running = false;
/** /**
@ -136,15 +143,8 @@ public final class ExHost {
info.setIcon(ExHost.class.getResourceAsStream("/net/ME1312/SubServers/Host/Library/Files/icon.png")); info.setIcon(ExHost.class.getResourceAsStream("/net/ME1312/SubServers/Host/Library/Files/icon.png"));
engine = GalaxiEngine.init(info); engine = GalaxiEngine.init(info);
log.info.println("Loading SubServers.Host v" + info.getVersion().toString() + " Libraries"); log.info.println("Loading SubServers.Host v" + info.getVersion().toString() + " Libraries");
if (!(new UniversalFile(engine.getRuntimeDirectory(), "config.yml").exists())) {
Util.copyFromJar(ExHost.class.getClassLoader(), "net/ME1312/SubServers/Host/Library/Files/config.yml", new UniversalFile(engine.getRuntimeDirectory(), "config.yml").getPath());
log.info.println("Created ./config.yml");
} else if (((new YAMLConfig(new UniversalFile(engine.getRuntimeDirectory(), "config.yml"))).get().getSection("Settings").getVersion("Version", new Version(0)).compareTo(new Version("2.11.2a+"))) != 0) {
Files.move(new UniversalFile(engine.getRuntimeDirectory(), "config.yml").toPath(), new UniversalFile(engine.getRuntimeDirectory(), "config.old" + Math.round(Math.random() * 100000) + ".yml").toPath());
Util.copyFromJar(ExHost.class.getClassLoader(), "net/ME1312/SubServers/Host/Library/Files/config.yml", new UniversalFile(engine.getRuntimeDirectory(), "config.yml").getPath()); ConfigUpdater.updateConfig(new UniversalFile(engine.getRuntimeDirectory(), "config.yml"));
log.info.println("Updated ./config.yml");
}
config = new YAMLConfig(new UniversalFile(engine.getRuntimeDirectory(), "config.yml")); config = new YAMLConfig(new UniversalFile(engine.getRuntimeDirectory(), "config.yml"));
if (!(new UniversalFile(engine.getRuntimeDirectory(), "Templates").exists())) { if (!(new UniversalFile(engine.getRuntimeDirectory(), "Templates").exists())) {
@ -191,34 +191,16 @@ public final class ExHost {
} }
} }
Util.reflect(SubLogger.class.getDeclaredField("logn"), null, config.get().getSection("Settings").getBoolean("Network-Log", true)); Util.reflect(SubLogger.class.getDeclaredField("logn"), null, config.get().getMap("Settings").getBoolean("Network-Log", true));
Util.reflect(SubLogger.class.getDeclaredField("logc"), null, config.get().getSection("Settings").getBoolean("Console-Log", true)); Util.reflect(SubLogger.class.getDeclaredField("logc"), null, config.get().getMap("Settings").getBoolean("Console-Log", true));
engine.getPluginManager().loadPlugins(new UniversalFile(engine.getRuntimeDirectory(), "Plugins")); engine.getPluginManager().loadPlugins(new UniversalFile(engine.getRuntimeDirectory(), "Plugins"));
running = true; running = true;
Cipher cipher = null;
if (!config.get().getSection("Settings").getSection("SubData").getRawString("Encryption", "NONE").equalsIgnoreCase("NONE")) {
if (config.get().getSection("Settings").getSection("SubData").getString("Password", "").length() == 0) {
log.info.println("Cannot encrypt connection without a password");
} else if (!SubDataClient.getCiphers().keySet().contains(config.get().getSection("Settings").getSection("SubData").getRawString("Encryption").toUpperCase().replace('-', '_').replace(' ', '_'))) {
log.info.println("Unknown encryption type: " + config.get().getSection("Settings").getSection("SubData").getRawString("Encryption"));
} else {
cipher = SubDataClient.getCipher(config.get().getSection("Settings").getSection("SubData").getRawString("Encryption"));
}
}
subdata = new SubDataClient(this, config.get().getSection("Settings").getSection("SubData").getString("Name", "undefined"),
InetAddress.getByName(config.get().getSection("Settings").getSection("SubData").getString("Address", "127.0.0.1:4391").split(":")[0]),
Integer.parseInt(config.get().getSection("Settings").getSection("SubData").getString("Address", "127.0.0.1:4391").split(":")[1]), cipher);
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
if (running) {
log.warn.println("Received request from system to shutdown");
engine.stop();
}
}, SubAPI.getInstance().getAppInfo().getName() + "::System_Shutdown"));
creator = new SubCreator(this); creator = new SubCreator(this);
subprotocol = SubProtocol.get();
loadDefaults(); loadDefaults();
reload(false);
new Metrics(this); new Metrics(this);
info.setUpdateChecker(() -> { info.setUpdateChecker(() -> {
@ -228,7 +210,7 @@ public final class ExHost {
Version updversion = info.getVersion(); Version updversion = info.getVersion();
int updcount = 0; int updcount = 0;
for (YAMLSection tag : tags.getSectionList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10))); for (ObjectMap<String> tag : tags.getMapList("tags")) versions.add(Version.fromString(tag.getString("ref").substring(10)));
Collections.sort(versions); Collections.sort(versions);
for (Version version : versions) { for (Version version : versions) {
if (version.compareTo(updversion) > 0) { if (version.compareTo(updversion) > 0) {
@ -251,40 +233,63 @@ public final class ExHost {
} }
} }
public void reload() throws IOException {
if (subdata != null)
subdata.destroy(0);
config.reload();
try {
Util.reflect(SubLogger.class.getDeclaredField("logn"), null, config.get().getSection("Settings").getBoolean("Network-Log", true));
Util.reflect(SubLogger.class.getDeclaredField("logc"), null, config.get().getSection("Settings").getBoolean("Console-Log", true));
} catch (Exception e) {
e.printStackTrace();
}
Cipher cipher = null;
if (!config.get().getSection("Settings").getSection("SubData").getRawString("Encryption", "NONE").equalsIgnoreCase("NONE")) {
if (config.get().getSection("Settings").getSection("SubData").getString("Password", "").length() == 0) {
log.info.println("Cannot encrypt connection without a password");
} else if (!SubDataClient.getCiphers().keySet().contains(config.get().getSection("Settings").getSection("SubData").getRawString("Encryption").toUpperCase().replace('-', '_').replace(' ', '_'))) {
log.info.println("Unknown encryption type: " + config.get().getSection("Settings").getSection("SubData").getRawString("Encryption"));
} else {
cipher = SubDataClient.getCipher(config.get().getSection("Settings").getSection("SubData").getRawString("Encryption"));
}
}
subdata = new SubDataClient(this, config.get().getSection("Settings").getSection("SubData").getString("Name", "undefined"),
InetAddress.getByName(config.get().getSection("Settings").getSection("SubData").getString("Address", "127.0.0.1:4391").split(":")[0]),
Integer.parseInt(config.get().getSection("Settings").getSection("SubData").getString("Address", "127.0.0.1:4391").split(":")[1]), cipher);
engine.getPluginManager().executeEvent(new GalaxiReloadEvent(engine));
}
private void loadDefaults() { private void loadDefaults() {
SubCommand.load(this); SubCommand.load(this);
} }
public void reload(boolean notifyPlugins) throws IOException {
reconnect = false;
ArrayList<SubDataClient> tmp = new ArrayList<SubDataClient>();
tmp.addAll(subdata.values());
for (SubDataClient client : tmp) if (client != null) {
client.close();
Util.isException(client::waitFor);
}
subdata.clear();
subdata.put(0, null);
ConfigUpdater.updateConfig(new UniversalFile(engine.getRuntimeDirectory(), "config.yml"));
config.reload();
subprotocol.unregisterCipher("AES");
subprotocol.unregisterCipher("AES-128");
subprotocol.unregisterCipher("AES-192");
subprotocol.unregisterCipher("AES-256");
subprotocol.unregisterCipher("RSA");
api.name = config.get().getMap("Settings").getMap("SubData").getString("Name", null);
Logger log = new Logger("SubData");
if (config.get().getMap("Settings").getMap("SubData").getRawString("Password", "").length() > 0) {
subprotocol.registerCipher("AES", new AES(128, config.get().getMap("Settings").getMap("SubData").getRawString("Password")));
subprotocol.registerCipher("AES-128", new AES(128, config.get().getMap("Settings").getMap("SubData").getRawString("Password")));
subprotocol.registerCipher("AES-192", new AES(192, config.get().getMap("Settings").getMap("SubData").getRawString("Password")));
subprotocol.registerCipher("AES-256", new AES(256, config.get().getMap("Settings").getMap("SubData").getRawString("Password")));
log.info.println("AES Encryption Available");
}
if (new UniversalFile(engine.getRuntimeDirectory(), "subdata.rsa.key").exists()) {
try {
subprotocol.registerCipher("RSA", new RSA(new UniversalFile(engine.getRuntimeDirectory(), "subdata.rsa.key")));
log.info.println("RSA Encryption Available");
} catch (Exception e) {
log.error.println(e);
}
}
reconnect = true;
log.info.println();
connect();
if (notifyPlugins) {
engine.getPluginManager().executeEvent(new GalaxiReloadEvent(engine));
}
}
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])));
}
private void stop() { private void stop() {
if (running) { if (running) {
log.info.println("Shutting down..."); log.info.println("Shutting down...");
@ -318,7 +323,20 @@ public final class ExHost {
} catch (Exception e) { } catch (Exception e) {
log.error.println(e); log.error.println(e);
} }
if (subdata != null) Util.isException(() -> subdata.destroy(0));
reconnect = false;
try {
ArrayList<SubDataClient> temp = new ArrayList<SubDataClient>();
temp.addAll(subdata.values());
for (SubDataClient client : temp) if (client != null) {
client.close();
client.waitFor();
}
subdata.clear();
subdata.put(0, null);
} catch (Exception e) {
log.error.println(e);
}
if (new File(engine.getRuntimeDirectory(), "Templates").exists()) Util.deleteDirectory(new File(engine.getRuntimeDirectory(), "Templates")); if (new File(engine.getRuntimeDirectory(), "Templates").exists()) Util.deleteDirectory(new File(engine.getRuntimeDirectory(), "Templates"));
} }

View File

@ -2,11 +2,12 @@ package net.ME1312.SubServers.Host.Executable;
import net.ME1312.Galaxi.Engine.GalaxiEngine; import net.ME1312.Galaxi.Engine.GalaxiEngine;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Container; import net.ME1312.Galaxi.Library.Container;
import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.UniversalFile; import net.ME1312.Galaxi.Library.UniversalFile;
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.Host.Library.Exception.InvalidServerException; import net.ME1312.SubServers.Host.Library.Exception.InvalidServerException;
import net.ME1312.SubServers.Host.Library.Exception.InvalidTemplateException; import net.ME1312.SubServers.Host.Library.Exception.InvalidTemplateException;
import net.ME1312.SubServers.Host.Library.Exception.SubCreatorException; import net.ME1312.SubServers.Host.Library.Exception.SubCreatorException;
@ -16,15 +17,11 @@ import net.ME1312.SubServers.Host.Network.Packet.PacketOutExLogMessage;
import net.ME1312.SubServers.Host.ExHost; import net.ME1312.SubServers.Host.ExHost;
import net.ME1312.SubServers.Host.SubAPI; import net.ME1312.SubServers.Host.SubAPI;
import org.json.JSONObject; import org.json.JSONObject;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*; import java.io.*;
import java.net.URL; import java.net.URL;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.*; import java.util.*;
/** /**
@ -41,8 +38,8 @@ public class SubCreator {
private String icon; private String icon;
private File directory; private File directory;
private ServerType type; private ServerType type;
private YAMLSection build; private ObjectMap<String> build;
private YAMLSection options; private ObjectMap<String> options;
/** /**
* Create a SubCreator Template * Create a SubCreator Template
@ -52,7 +49,7 @@ public class SubCreator {
* @param build Build Options * @param build Build Options
* @param options Configuration Options * @param options Configuration Options
*/ */
public ServerTemplate(String name, boolean enabled, String icon, File directory, YAMLSection build, YAMLSection options) { public ServerTemplate(String name, boolean enabled, String icon, File directory, ObjectMap<String> build, ObjectMap<String> options) {
super(toRaw(name, enabled, icon, directory, build, options)); super(toRaw(name, enabled, icon, directory, build, options));
if (name.contains(" ")) throw new InvalidTemplateException("Template names cannot have spaces: " + name); if (name.contains(" ")) throw new InvalidTemplateException("Template names cannot have spaces: " + name);
this.name = name; this.name = name;
@ -150,12 +147,21 @@ public class SubCreator {
return type; return type;
} }
/**
* Get whether this Template requires the Version argument
*
* @return Version Requirement
*/
public boolean requiresVersion() {
return getBuildOptions().getBoolean("Require-Version", false);
}
/** /**
* Get the Build Options for this Template * Get the Build Options for this Template
* *
* @return Build Options * @return Build Options
*/ */
public YAMLSection getBuildOptions() { public ObjectMap<String> getBuildOptions() {
return build; return build;
} }
@ -164,13 +170,13 @@ public class SubCreator {
* *
* @return Configuration Options * @return Configuration Options
*/ */
public YAMLSection getConfigOptions() { public ObjectMap<String> getConfigOptions() {
return options; return options;
} }
private static YAMLSection toRaw(String name, boolean enabled, String icon, File directory, YAMLSection build, YAMLSection options) { private static ObjectMap<String> toRaw(String name, boolean enabled, String icon, File directory, ObjectMap<String> build, ObjectMap<String> options) {
if (Util.isNull(name, enabled, directory, build, options)) throw new NullPointerException(); if (Util.isNull(name, enabled, directory, build, options)) throw new NullPointerException();
YAMLSection tinfo = new YAMLSection(); ObjectMap<String> tinfo = new ObjectMap<String>();
tinfo.set("enabled", enabled); tinfo.set("enabled", enabled);
tinfo.set("name", name); tinfo.set("name", name);
tinfo.set("display", name); tinfo.set("display", name);
@ -186,11 +192,11 @@ public class SubCreator {
private final Version version; private final Version version;
private final int port; private final int port;
private final UUID address; private final UUID address;
private final String id; private final UUID tracker;
private final SubLogger log; private final SubLogger log;
private Process process; private Process process;
private CreatorTask(String name, ServerTemplate template, Version version, int port, UUID address, String id) { private CreatorTask(String name, ServerTemplate template, Version version, int port, UUID address, UUID tracker) {
super(SubAPI.getInstance().getAppInfo().getName() + "::SubCreator_Process_Handler(" + name + ')'); super(SubAPI.getInstance().getAppInfo().getName() + "::SubCreator_Process_Handler(" + name + ')');
this.name = name; this.name = name;
this.template = template; this.template = template;
@ -198,11 +204,11 @@ public class SubCreator {
this.port = port; this.port = port;
this.log = new SubLogger(null, this, name + File.separator + "Creator", address, new Container<Boolean>(true), null); this.log = new SubLogger(null, this, name + File.separator + "Creator", address, new Container<Boolean>(true), null);
this.address = address; this.address = address;
this.id = id; this.tracker = tracker;
} }
private YAMLSection build(File dir, ServerTemplate template, List<ServerTemplate> history) throws SubCreatorException { private ObjectMap<String> build(File dir, ServerTemplate template, List<ServerTemplate> history) throws SubCreatorException {
YAMLSection server = new YAMLSection(); ObjectMap<String> server = new ObjectMap<String>();
Version version = this.version; Version version = this.version;
HashMap<String, String> var = new HashMap<String, String>(); HashMap<String, String> var = new HashMap<String, String>();
boolean error = false; boolean error = false;
@ -211,61 +217,68 @@ public class SubCreator {
for (String other : template.getBuildOptions().getStringList("Import", new ArrayList<String>())) { for (String other : template.getBuildOptions().getStringList("Import", new ArrayList<String>())) {
if (host.templates.keySet().contains(other.toLowerCase())) { if (host.templates.keySet().contains(other.toLowerCase())) {
if (host.templates.get(other.toLowerCase()).isEnabled()) { if (host.templates.get(other.toLowerCase()).isEnabled()) {
YAMLSection config = build(dir, host.templates.get(other.toLowerCase()), history); if (version != null || !host.templates.get(other.toLowerCase()).requiresVersion()) {
if (config == null) { ObjectMap<String> config = build(dir, host.templates.get(other.toLowerCase()), history);
throw new SubCreatorException(); if (config == null) {
throw new SubCreatorException();
} else {
server.setAll(config);
}
} else { } else {
server.setAll(config); log.logger.warn.println("Skipping template that requires extra versioning: " + other);
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Skipping template that requires extra versioning: " + other));
} }
} else { } else {
log.logger.warn.println("Skipping disabled template: " + other); log.logger.warn.println("Skipping disabled template: " + other);
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Skipping disabled template: " + other)); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Skipping disabled template: " + other));
} }
} else { } else {
log.logger.warn.println("Skipping missing template: " + other); log.logger.warn.println("Skipping missing template: " + other);
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Skipping missing template: " + other)); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Skipping missing template: " + other));
} }
} }
server.setAll(template.getConfigOptions()); server.setAll(template.getConfigOptions());
try { try {
log.logger.info.println("Loading Template: " + template.getDisplayName()); log.logger.info.println("Loading Template: " + template.getDisplayName());
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Loading Template: " + template.getDisplayName())); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Loading Template: " + template.getDisplayName()));
Util.copyDirectory(template.getDirectory(), dir); Util.copyDirectory(template.getDirectory(), dir);
var.put("name", name); var.put("name", name);
if (host.subdata != null) var.put("host", host.subdata.getName()); if (SubAPI.getInstance().getSubDataNetwork()[0] != null) var.put("host", SubAPI.getInstance().getName());
var.put("template", template.getName()); var.put("template", template.getName());
var.put("type", template.getType().toString().toUpperCase()); var.put("type", template.getType().toString().toUpperCase());
var.put("version", version.toString()); if (version != null) var.put("version", version.toString());
var.put("address", host.config.get().getSection("Settings").getRawString("Server-Bind")); var.put("address", host.config.get().getMap("Settings").getRawString("Server-Bind"));
var.put("port", Integer.toString(port)); var.put("port", Integer.toString(port));
switch (template.getType()) { switch (template.getType()) {
case SPONGE: case SPONGE:
case FORGE: case FORGE:
log.logger.info.println("Searching Versions..."); if (version != null) {
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Searching Versions...")); log.logger.info.println("Searching Versions...");
YAMLSection spversionmanifest = new YAMLSection(new JSONObject("{\"versions\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://dl-api.spongepowered.org/v1/org.spongepowered/sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "/downloads?type=stable&minecraft=" + version).openStream(), Charset.forName("UTF-8")))) + '}')); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Searching Versions..."));
YAMLSection spversionmanifest = new YAMLSection(new JSONObject("{\"versions\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://dl-api.spongepowered.org/v1/org.spongepowered/sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "/downloads?type=stable&minecraft=" + version).openStream(), Charset.forName("UTF-8")))) + '}'));
YAMLSection spprofile = null; ObjectMap<String> spprofile = null;
Version spversion = null; Version spversion = null;
for (YAMLSection profile : spversionmanifest.getSectionList("versions")) { for (ObjectMap<String> profile : spversionmanifest.getMapList("versions")) {
if (profile.getSection("dependencies").getRawString("minecraft").equalsIgnoreCase(version.toString()) && (spversion == null || new Version(profile.getRawString("version")).compareTo(spversion) >= 0)) { if (profile.getMap("dependencies").getRawString("minecraft").equalsIgnoreCase(version.toString()) && (spversion == null || new Version(profile.getRawString("version")).compareTo(spversion) >= 0)) {
spprofile = profile; spprofile = profile;
spversion = new Version(profile.getRawString("version")); spversion = new Version(profile.getRawString("version"));
}
} }
} if (spversion == null)
if (spversion == null) throw new InvalidServerException("Cannot find Sponge version for Minecraft " + version.toString());
throw new InvalidServerException("Cannot find Sponge version for Minecraft " + version.toString()); log.logger.info.println("Found \"sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "-" + spversion.toString() + '"');
log.logger.info.println("Found \"sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "-" + spversion.toString() + '"'); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Found \"sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "-" + spversion.toString() + '"'));
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Found \"sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "-" + spversion.toString() + '"'));
if (template.getType() == ServerType.FORGE) { if (template.getType() == ServerType.FORGE) {
Version mcfversion = new Version(((spprofile.getSection("dependencies").getRawString("forge").contains("-"))?"":spprofile.getSection("dependencies").getRawString("minecraft") + '-') + spprofile.getSection("dependencies").getRawString("forge")); Version mcfversion = new Version(((spprofile.getMap("dependencies").getRawString("forge").contains("-"))?"":spprofile.getMap("dependencies").getRawString("minecraft") + '-') + spprofile.getMap("dependencies").getRawString("forge"));
log.logger.info.println("Found \"forge-" + mcfversion.toString() + '"'); log.logger.info.println("Found \"forge-" + mcfversion.toString() + '"');
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Found \"forge-" + mcfversion.toString() + '"')); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Found \"forge-" + mcfversion.toString() + '"'));
var.put("mcf_version", mcfversion.toString()); var.put("mcf_version", mcfversion.toString());
}
var.put("sp_version", spversion.toString());
} }
var.put("sp_version", spversion.toString());
break; break;
} }
} catch (Exception e) { } catch (Exception e) {
@ -287,11 +300,11 @@ public class SubCreator {
try { try {
log.logger.info.println("Launching Build Script..."); log.logger.info.println("Launching Build Script...");
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Launching Build Script...")); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Launching Build Script..."));
ProcessBuilder pb = new ProcessBuilder().command(Executable.parse(host.host.getRawString("Git-Bash"), template.getBuildOptions().getRawString("Executable"))).directory(dir); ProcessBuilder pb = new ProcessBuilder().command(Executable.parse(host.host.getRawString("Git-Bash"), template.getBuildOptions().getRawString("Executable"))).directory(dir);
pb.environment().putAll(var); pb.environment().putAll(var);
process = pb.start(); process = pb.start();
log.file = new File(dir, "SubCreator-" + template.getName() + "-" + version.toString().replace(" ", "@") + ".log"); log.file = new File(dir, "SubCreator-" + template.getName() + "-" + ((version != null)?"-"+version.toString():"") + ".log");
log.process = process; log.process = process;
log.start(); log.start();
@ -323,7 +336,7 @@ public class SubCreator {
public void run() { public void run() {
UniversalFile dir = new UniversalFile(new File(host.host.getRawString("Directory")), name); UniversalFile dir = new UniversalFile(new File(host.host.getRawString("Directory")), name);
dir.mkdirs(); dir.mkdirs();
YAMLSection server; ObjectMap<String> server;
try { try {
server = build(dir, template, new LinkedList<>()); server = build(dir, template, new LinkedList<>());
generateProperties(dir, port); generateProperties(dir, port);
@ -334,13 +347,13 @@ public class SubCreator {
server = null; server = null;
log.logger.error.println(e); log.logger.error.println(e);
} }
YAMLSection config = template.getConfigOptions().clone(); ObjectMap<String> config = template.getConfigOptions().clone();
config.set("\033address", host.config.get().getSection("Settings").getRawString("Server-Bind")); config.set("\033address", host.config.get().getMap("Settings").getRawString("Server-Bind"));
if (server != null) { if (server != null) {
host.subdata.sendPacket(new PacketExCreateServer(0, "Created Server Successfully", config, id)); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExCreateServer(0, null, config, tracker));
} else { } else {
log.logger.info.println("Couldn't build the server jar. Check the SubCreator logs for more detail."); log.logger.info.println("Couldn't build the server jar. Check the SubCreator logs for more detail.");
host.subdata.sendPacket(new PacketExCreateServer(-1, "Couldn't build the server jar. Check the SubCreator logs for more detail.", config, id)); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExCreateServer(-1, "Couldn't build the server jar. Check the SubCreator logs for more detail.", config, tracker));
} }
SubCreator.this.thread.remove(name.toLowerCase()); SubCreator.this.thread.remove(name.toLowerCase());
} }
@ -357,9 +370,9 @@ public class SubCreator {
this.thread = new TreeMap<>(); this.thread = new TreeMap<>();
} }
public boolean create(String name, ServerTemplate template, Version version, int port, UUID address, String id) { public boolean create(String name, ServerTemplate template, Version version, int port, UUID address, UUID tracker) {
if (Util.isNull(name, template, version, port, address)) throw new NullPointerException(); if (Util.isNull(name, template, port, address)) throw new NullPointerException();
CreatorTask task = new CreatorTask(name, template, version, port, address, id); CreatorTask task = new CreatorTask(name, template, version, port, address, tracker);
this.thread.put(name.toLowerCase(), task); this.thread.put(name.toLowerCase(), task);
task.start(); task.start();
return true; return true;
@ -414,6 +427,7 @@ public class SubCreator {
private void generateClient(File dir, ServerType type, String name) throws IOException { private void generateClient(File dir, ServerType type, String name) throws IOException {
if (new UniversalFile(dir, "subservers.client").exists()) { if (new UniversalFile(dir, "subservers.client").exists()) {
Files.delete(new UniversalFile(dir, "subservers.client").toPath());
if (type == ServerType.SPIGOT) { if (type == ServerType.SPIGOT) {
if (!new UniversalFile(dir, "plugins").exists()) new UniversalFile(dir, "plugins").mkdirs(); if (!new UniversalFile(dir, "plugins").exists()) new UniversalFile(dir, "plugins").mkdirs();
Util.copyFromJar(ExHost.class.getClassLoader(), "net/ME1312/SubServers/Host/Library/Files/client.jar", new UniversalFile(dir, "plugins:SubServers.Client.jar").getPath()); Util.copyFromJar(ExHost.class.getClassLoader(), "net/ME1312/SubServers/Host/Library/Files/client.jar", new UniversalFile(dir, "plugins:SubServers.Client.jar").getPath());
@ -422,20 +436,23 @@ public class SubCreator {
Util.copyFromJar(ExHost.class.getClassLoader(), "net/ME1312/SubServers/Host/Library/Files/client.jar", new UniversalFile(dir, "mods:SubServers.Client.jar").getPath()); Util.copyFromJar(ExHost.class.getClassLoader(), "net/ME1312/SubServers/Host/Library/Files/client.jar", new UniversalFile(dir, "mods:SubServers.Client.jar").getPath());
} }
JSONObject config = new JSONObject(); JSONObject config = new JSONObject();
FileWriter writer = new FileWriter(new UniversalFile(dir, "subservers.client"), false); FileWriter writer = new FileWriter(new UniversalFile(dir, "subdata.json"), false);
config.put("Name", name); config.put("Name", name);
config.put("Address", host.config.get().getSection("Settings").getSection("SubData").getRawString("Address")); config.put("Address", host.config.get().getMap("Settings").getMap("SubData").getRawString("Address"));
config.put("Password", host.config.get().getSection("Settings").getSection("SubData").getRawString("Password")); if (host.config.get().getMap("Settings").getMap("SubData").getRawString("Password", "").length() > 0) config.put("Password", host.config.get().getMap("Settings").getMap("SubData").getRawString("Password"));
config.put("Encryption", host.config.get().getSection("Settings").getSection("SubData").getRawString("Encryption", "NONE"));
config.write(writer); config.write(writer);
writer.close(); writer.close();
if (new UniversalFile("subdata.rsa.key").exists()) {
Files.copy(new UniversalFile("subdata.rsa.key").toPath(), new UniversalFile(dir, "subdata.rsa.key").toPath());
}
} }
} }
private void generateProperties(File dir, int port) throws IOException { private void generateProperties(File dir, int port) throws IOException {
File file = new File(dir, "server.properties"); File file = new File(dir, "server.properties");
if (!file.exists()) file.createNewFile(); if (!file.exists()) file.createNewFile();
FileInputStream is = new FileInputStream(file); FileInputStream is = new FileInputStream(file);
String content = Util.readAll(new BufferedReader(new InputStreamReader(is))).replaceAll("server-port=.*(\r?\n)", "server-port=" + port + "$1").replaceAll("server-ip=.*(\r?\n)", "server-ip=" + host.config.get().getSection("Settings").getRawString("Server-Bind") + "$1"); String content = Util.readAll(new BufferedReader(new InputStreamReader(is))).replaceAll("server-port=.*(\r?\n)", "server-port=" + port + "$1").replaceAll("server-ip=.*(\r?\n)", "server-ip=" + host.config.get().getMap("Settings").getRawString("Server-Bind") + "$1");
is.close(); is.close();
file.delete(); file.delete();
PrintWriter writer = new PrintWriter(file, "UTF-8"); PrintWriter writer = new PrintWriter(file, "UTF-8");

View File

@ -1,9 +1,11 @@
package net.ME1312.SubServers.Host.Executable; package net.ME1312.SubServers.Host.Executable;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Container; import net.ME1312.Galaxi.Library.Container;
import net.ME1312.Galaxi.Library.Log.LogStream; import net.ME1312.Galaxi.Library.Log.LogStream;
import net.ME1312.Galaxi.Library.Log.Logger; import net.ME1312.Galaxi.Library.Log.Logger;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.Library.TextColor; import net.ME1312.SubServers.Host.Library.TextColor;
import net.ME1312.SubServers.Host.Network.Packet.PacketOutExLogMessage; import net.ME1312.SubServers.Host.Network.Packet.PacketOutExLogMessage;
import net.ME1312.SubServers.Host.SubAPI; import net.ME1312.SubServers.Host.SubAPI;
@ -26,6 +28,7 @@ public class SubLogger {
protected static boolean logn = true; protected static boolean logn = true;
protected static boolean logc = true; protected static boolean logc = true;
protected File file; protected File file;
private SubDataClient channel = null;
private PrintWriter writer = null; private PrintWriter writer = null;
private boolean started = false; private boolean started = false;
private Thread out = null; private Thread out = null;
@ -56,12 +59,13 @@ public class SubLogger {
*/ */
public void start() { public void start() {
started = true; started = true;
if (logn) Util.isException(() -> channel = (SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0].newChannel());
if (file != null && writer == null) { if (file != null && writer == null) {
try { try {
this.writer = new PrintWriter(file, "UTF-8"); this.writer = new PrintWriter(file, "UTF-8");
this.writer.println("---------- LOG START \u2014 " + name + " ----------"); this.writer.println("---------- LOG START \u2014 " + name + " ----------");
this.writer.flush(); this.writer.flush();
} catch (UnsupportedEncodingException | FileNotFoundException e) { } catch (IOException e) {
logger.error.println(e); logger.error.println(e);
} }
} }
@ -121,7 +125,7 @@ public class SubLogger {
} }
// Log to NETWORK // Log to NETWORK
if (log.get() && logn) SubAPI.getInstance().getSubDataNetwork().sendPacket(new PacketOutExLogMessage(address, line)); if (log.get() && channel != null && !channel.isClosed()) channel.sendPacket(new PacketOutExLogMessage(address, line));
// Log to CONSOLE // Log to CONSOLE
if (log.get() && logc) level.println(TextColor.convertColor(msg)); if (log.get() && logc) level.println(TextColor.convertColor(msg));
@ -157,6 +161,10 @@ public class SubLogger {
writer.close(); writer.close();
} }
} }
if (channel != null && !channel.isClosed()) {
channel.sendPacket(new PacketOutExLogMessage(address, true));
}
channel = null;
} }
} }

View File

@ -4,6 +4,7 @@ import net.ME1312.Galaxi.Library.Container;
import net.ME1312.Galaxi.Library.UniversalFile; import net.ME1312.Galaxi.Library.UniversalFile;
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.Host.Library.Exception.InvalidServerException; import net.ME1312.SubServers.Host.Library.Exception.InvalidServerException;
import net.ME1312.SubServers.Host.Network.Packet.PacketExUpdateServer; import net.ME1312.SubServers.Host.Network.Packet.PacketExUpdateServer;
import net.ME1312.SubServers.Host.ExHost; import net.ME1312.SubServers.Host.ExHost;
@ -110,8 +111,8 @@ public class SubServer {
try { try {
ProcessBuilder pb = new ProcessBuilder().command(Executable.parse(host.host.getRawString("Git-Bash"), executable)).directory(directory); ProcessBuilder pb = new ProcessBuilder().command(Executable.parse(host.host.getRawString("Git-Bash"), executable)).directory(directory);
pb.environment().put("name", getName()); pb.environment().put("name", getName());
if (host.subdata != null) pb.environment().put("host", host.subdata.getName()); if (SubAPI.getInstance().getSubDataNetwork()[0] != null) pb.environment().put("host", SubAPI.getInstance().getName());
pb.environment().put("address", host.config.get().getSection("Settings").getRawString("Server-Bind")); pb.environment().put("address", host.config.get().getMap("Settings").getRawString("Server-Bind"));
pb.environment().put("port", Integer.toString(getPort())); pb.environment().put("port", Integer.toString(getPort()));
process = pb.start(); process = pb.start();
falsestart = false; falsestart = false;
@ -130,10 +131,10 @@ public class SubServer {
} catch (IOException | InterruptedException e) { } catch (IOException | InterruptedException e) {
host.log.error.println(e); host.log.error.println(e);
allowrestart = false; allowrestart = false;
if (falsestart) host.subdata.sendPacket(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.LAUNCH_EXCEPTION)); if (falsestart) ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.LAUNCH_EXCEPTION));
} }
host.subdata.sendPacket(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.STOPPED, (Integer) process.exitValue(), (Boolean) allowrestart)); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExUpdateServer(this, PacketExUpdateServer.UpdateType.STOPPED, (Integer) process.exitValue(), (Boolean) allowrestart));
host.log.info.println(name + " has stopped"); host.log.info.println(name + " has stopped");
process = null; process = null;
command = null; command = null;

View File

@ -1,11 +0,0 @@
package net.ME1312.SubServers.Host.Library.Exception;
/**
* Illegal Packet Exception
*/
public class IllegalPacketException extends IllegalStateException {
public IllegalPacketException() {}
public IllegalPacketException(String s) {
super(s);
}
}

View File

@ -1,12 +0,0 @@
Settings:
Version: '2.11.2a+'
Console-Log: true
Network-Log: true
Server-Bind: '127.0.0.1'
UPnP:
Forward-Servers: false
SubData:
Name: 'undefined'
Address: '127.0.0.1:4391'
Password: 'default'
Encryption: 'AES'

View File

@ -2,7 +2,7 @@ package net.ME1312.SubServers.Host.Library;
import net.ME1312.Galaxi.Engine.GalaxiEngine; import net.ME1312.Galaxi.Engine.GalaxiEngine;
import net.ME1312.Galaxi.Library.Config.YAMLConfig; import net.ME1312.Galaxi.Library.Config.YAMLConfig;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Log.Logger; import net.ME1312.Galaxi.Library.Log.Logger;
import net.ME1312.SubServers.Host.ExHost; import net.ME1312.SubServers.Host.ExHost;
import net.ME1312.SubServers.Host.SubAPI; import net.ME1312.SubServers.Host.SubAPI;
@ -69,7 +69,7 @@ public class Metrics {
writer.close(); writer.close();
} }
YAMLSection configuration = new YAMLConfig(configFile).get(); ObjectMap<String> configuration = new YAMLConfig(configFile).get();
// Load configuration // Load configuration
enabled = configuration.getBoolean("enabled", true); enabled = configuration.getBoolean("enabled", true);

View File

@ -0,0 +1,81 @@
package net.ME1312.SubServers.Host.Library.Updates;
import net.ME1312.Galaxi.Library.Config.YAMLConfig;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.SubServers.Host.SubAPI;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
/**
* SubServers Configuration Updater
*/
public class ConfigUpdater {
private static final Version UNSIGNED = new Version(new SimpleDateFormat("yy'w'ww'zz'").format(Calendar.getInstance().getTime()));
/**
* Update SubServers' config.yml
*
* @param file File to bring up-to-date
*/
public static void updateConfig(File file) throws IOException {
YAMLConfig config = new YAMLConfig(file);
YAMLSection existing = config.get().clone();
YAMLSection updated = existing.clone();
YAMLSection rewritten = new YAMLSection();
Version was = existing.getMap("Settings", new ObjectMap<>()).getVersion("Version", new Version(0));
Version now = SubAPI.getInstance().getAppInfo().getSignature();
int i = 0;
if (now == null) now = UNSIGNED;
if (!existing.contains("Settings") || !existing.getMap("Settings").contains("Version")) {
i++;
SubAPI.getInstance().getAppInfo().getLogger().info.println("SubServers > Created ./config.yml");
} else {
if (was.compareTo(new Version("19w17a")) <= 0) {
if (existing.getMap("Settings", new YAMLSection()).contains("Log")) {
updated.getMap("Settings").safeSet("Console-Log", existing.getMap("Settings").getBoolean("Log"));
updated.getMap("Settings").safeSet("Network-Log", existing.getMap("Settings").getBoolean("Log"));
}
existing = updated.clone();
i++;
}// if (was.compareTo(new Version("99w99a")) <= 0) {
// // do something
// i++
//}
if (i > 0) SubAPI.getInstance().getAppInfo().getLogger().info.println("Updated ./config.yml (" + i + " pass" + ((i != 1)?"es":"") + ")");
}
if (i > 0) {
YAMLSection settings = new YAMLSection();
settings.set("Version", ((now.compareTo(was) <= 0)?was:now).toString());
settings.set("Console-Log", updated.getMap("Settings", new YAMLSection()).getBoolean("Console-Log", true));
settings.set("Network-Log", updated.getMap("Settings", new YAMLSection()).getBoolean("Network-Log", true));
settings.set("Server-Bind", updated.getMap("Settings", new YAMLSection()).getRawString("Server-Bind", "127.0.0.1"));
YAMLSection upnp = new YAMLSection();
upnp.set("Forward-Servers", updated.getMap("Settings", new YAMLSection()).getMap("UPnP", new YAMLSection()).getBoolean("Forward-Servers", false));
settings.set("UPnP", upnp);
YAMLSection subdata = new YAMLSection();
subdata.set("Name", updated.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).getRawString("Name", "undefined"));
subdata.set("Address", updated.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).getRawString("Address", "127.0.0.1:4391"));
if (updated.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).contains("Password")) subdata.set("Password", updated.getMap("Settings").getMap("SubData").getRawString("Password"));
if (updated.getMap("Settings", new YAMLSection()).getMap("SubData", new YAMLSection()).contains("Reconnect")) subdata.set("Reconnect", updated.getMap("Settings").getMap("SubData").getInt("Reconnect"));
settings.set("SubData", subdata);
rewritten.set("Settings", settings);
config.set(rewritten);
config.save();
}
}
}

View File

@ -1,11 +1,17 @@
package net.ME1312.SubServers.Host.Network.API; package net.ME1312.SubServers.Host.Network.API;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLValue; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Map.ObjectMapValue;
import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.Network.Packet.PacketAddServer;
import net.ME1312.SubServers.Host.Network.Packet.PacketDeleteServer;
import net.ME1312.SubServers.Host.Network.Packet.PacketDownloadHostInfo; import net.ME1312.SubServers.Host.Network.Packet.PacketDownloadHostInfo;
import net.ME1312.SubServers.Host.Network.Packet.PacketRemoveServer;
import net.ME1312.SubServers.Host.SubAPI; import net.ME1312.SubServers.Host.SubAPI;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.*; import java.util.*;
@ -13,7 +19,7 @@ import java.util.*;
public class Host { public class Host {
HashMap<String, SubServer> servers = new HashMap<String, SubServer>(); HashMap<String, SubServer> servers = new HashMap<String, SubServer>();
private SubCreator creator; private SubCreator creator;
YAMLSection raw; ObjectMap<String> raw;
long timestamp; long timestamp;
/** /**
@ -21,7 +27,7 @@ public class Host {
* *
* @param raw Raw representation of the Host * @param raw Raw representation of the Host
*/ */
public Host(YAMLSection raw) { public Host(ObjectMap<String> raw) {
load(raw); load(raw);
} }
@ -30,14 +36,14 @@ public class Host {
return obj instanceof Host && getSignature().equals(((Host) obj).getSignature()); return obj instanceof Host && getSignature().equals(((Host) obj).getSignature());
} }
private void load(YAMLSection raw) { private void load(ObjectMap<String> raw) {
this.raw = raw; this.raw = raw;
this.timestamp = Calendar.getInstance().getTime().getTime(); this.timestamp = Calendar.getInstance().getTime().getTime();
servers.clear(); servers.clear();
this.creator = new SubCreator(this, raw.getSection("creator")); this.creator = new SubCreator(this, raw.getMap("creator"));
for (String server : raw.getSection("servers").getKeys()) { for (String server : raw.getMap("servers").getKeys()) {
servers.put(server.toLowerCase(), new SubServer(this, raw.getSection("servers").getSection(server))); servers.put(server.toLowerCase(), new SubServer(this, raw.getMap("servers").getMap(server)));
} }
} }
@ -46,16 +52,16 @@ public class Host {
*/ */
public void refresh() { public void refresh() {
String name = getName(); String name = getName();
SubAPI.getInstance().getSubDataNetwork().sendPacket(new PacketDownloadHostInfo(name, data -> load(data.getSection("hosts").getSection(name)))); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketDownloadHostInfo(name, data -> load(data.getMap(name))));
} }
/** /**
* Gets the SubData Client Address * Gets the SubData Client Channel IDs
* *
* @return SubData Client Address (or null if unlinked/unsupported) * @return SubData Client Channel ID Array (may be empty if unsupported)
*/ */
public String getSubData() { public UUID[] getSubData() {
return raw.getRawString("subdata", null); return raw.getUUIDList("subdata", Collections.emptyList()).toArray(new UUID[0]);
} }
/** /**
@ -232,6 +238,380 @@ public class Host {
return getSubServers().get(name.toLowerCase()); return getSubServers().get(name.toLowerCase());
} }
/**
* Adds a SubServer
*
* @param name Name of Server
* @param enabled Enabled Status
* @param port Port Number
* @param motd Motd of the Server
* @param log Logging Status
* @param directory Directory
* @param executable Executable String
* @param stopcmd Command to Stop the Server
* @param hidden if the server should be hidden from players
* @param restricted Players will need a permission to join if true
* @param response Response Code
* @return The SubServer
*/
public void addSubServer(String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted, Callback<Integer> response) {
addSubServer(null, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted, response);
}
/**
* Adds a SubServer
*
* @param player Player adding
* @param name Name of Server
* @param enabled Enabled Status
* @param port Port Number
* @param motd Motd of the Server
* @param log Logging Status
* @param directory Directory
* @param executable Executable String
* @param stopcmd Command to Stop the Server
* @param hidden if the server should be hidden from players
* @param restricted Players will need a permission to join if true
* @param response Response Code
* @return The SubServer
*/
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();
StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketAddServer(player, name, enabled, getName(), port, motd, log, directory, executable, stopcmd, hidden, restricted, data -> {
try {
response.run(data.getInt(0x0001));
} catch (Throwable e) {
Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin);
ew.printStackTrace();
}
}));
}
/**
* Adds a SubServer
*
* @param name Name of Server
* @param enabled Enabled Status
* @param port Port Number
* @param motd Motd of the Server
* @param log Logging Status
* @param directory Directory
* @param executable Executable String
* @param stopcmd Command to Stop the Server
* @param hidden if the server should be hidden from players
* @param restricted Players will need a permission to join if true
* @return The SubServer
*/
public void addSubServer(String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) {
addSubServer(null, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted);
}
/**
* Adds a SubServer
*
* @param player Player adding
* @param name Name of Server
* @param enabled Enabled Status
* @param port Port Number
* @param motd Motd of the Server
* @param log Logging Status
* @param directory Directory
* @param executable Executable String
* @param stopcmd Command to Stop the Server
* @param hidden if the server should be hidden from players
* @param restricted Players will need a permission to join if true
* @return The SubServer
*/
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) {
addSubServer(player, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted, i -> {});
}
/**
* Removes a SubServer
*
* @param name SubServer Name
*/
public void removeSubServer(String name) throws InterruptedException {
removeSubServer(null, name);
}
/**
* Removes a SubServer
*
* @param player Player Removing
* @param name SubServer Name
*/
public void removeSubServer(UUID player, String name) throws InterruptedException {
if (Util.isNull(name)) throw new NullPointerException();
removeSubServer(player, name, false, i -> {});
}
/**
* Forces the Removal of a SubServer
*
* @param name SubServer Name
*/
public void forceRemoveSubServer(String name) throws InterruptedException {
forceRemoveSubServer(null, name);
}
/**
* Forces the Removal of a SubServer (will move to 'Recently Deleted')
*
* @param player Player Removing
* @param name SubServer Name
*/
public void forceRemoveSubServer(UUID player, String name) {
if (Util.isNull(name)) throw new NullPointerException();
removeSubServer(player, name, true, i -> {});
}
/**
* Removes a SubServer
*
* @param name SubServer Name
* @param response Response Code
*/
public void removeSubServer(String name, Callback<Integer> response) throws InterruptedException {
removeSubServer(null, name, response);
}
/**
* Removes a SubServer
*
* @param player Player Removing
* @param name SubServer Name
* @param response Response Code
*/
public void removeSubServer(UUID player, String name, Callback<Integer> response) throws InterruptedException {
if (Util.isNull(name)) throw new NullPointerException();
removeSubServer(player, name, false, response);
}
/**
* Forces the Removal of a SubServer
*
* @param name SubServer Name
* @param response Response Code
*/
public void forceRemoveSubServer(String name, Callback<Integer> response) throws InterruptedException {
forceRemoveSubServer(null, name, response);
}
/**
* Forces the Removal of a SubServer (will move to 'Recently Deleted')
*
* @param player Player Removing
* @param name SubServer Name
* @param response Response Code
*/
public void forceRemoveSubServer(UUID player, String name, Callback<Integer> response) {
if (Util.isNull(name)) throw new NullPointerException();
removeSubServer(player, name, true, response);
}
private void removeSubServer(UUID player, String name, boolean force, Callback<Integer> response) {
if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketRemoveServer(player, name, force, data -> {
try {
response.run(data.getInt(0x0001));
} catch (Throwable e) {
Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin);
ew.printStackTrace();
}
}));
}
/**
* Delete a SubServer (will move to 'Recently Deleted')
*
* @param name SubServer Name
*/
public void recycleSubServer(String name) throws InterruptedException {
recycleSubServer(null, name);
}
/**
* Delete a SubServer
*
* @param player Player Deleting
* @param name SubServer Name
*/
public void recycleSubServer(UUID player, String name) throws InterruptedException {
if (Util.isNull(name)) throw new NullPointerException();
deleteSubServer(player, name, true, false, i -> {});
}
/**
* Forced the Deletion of a SubServer (will move to 'Recently Deleted')
*
* @param name SubServer Name
*/
public void forceRecycleSubServer(String name) throws InterruptedException {
forceRecycleSubServer(null, name);
}
/**
* Forces the Deletion of a SubServer (will move to 'Recently Deleted')
*
* @param player Player Deleting
* @param name SubServer Name
*/
public void forceRecycleSubServer(UUID player, String name) throws InterruptedException {
if (Util.isNull(name)) throw new NullPointerException();
deleteSubServer(player, name, true, true, i -> {});
}
/**
* Delete a SubServer (will move to 'Recently Deleted')
*
* @param name SubServer Name
* @param response Response Code
*/
public void recycleSubServer(String name, Callback<Integer> response) throws InterruptedException {
recycleSubServer(null, name, response);
}
/**
* Delete a SubServer
*
* @param player Player Deleting
* @param name SubServer Name
* @param response Response Code
*/
public void recycleSubServer(UUID player, String name, Callback<Integer> response) throws InterruptedException {
if (Util.isNull(name)) throw new NullPointerException();
deleteSubServer(player, name, true, false, response);
}
/**
* Forced the Deletion of a SubServer (will move to 'Recently Deleted')
*
* @param name SubServer Name
* @param response Response Code
*/
public void forceRecycleSubServer(String name, Callback<Integer> response) throws InterruptedException {
forceRecycleSubServer(null, name, response);
}
/**
* Forces the Deletion of a SubServer (will move to 'Recently Deleted')
*
* @param player Player Deleting
* @param name SubServer Name
* @param response Response Code
*/
public void forceRecycleSubServer(UUID player, String name, Callback<Integer> response) throws InterruptedException {
if (Util.isNull(name)) throw new NullPointerException();
deleteSubServer(player, name, true, true, response);
}
/**
* Delete a SubServer
*
* @param name SubServer Name
* @return Success Status
*/
public void deleteSubServer(String name) throws InterruptedException {
deleteSubServer(null, name);
}
/**
* Forces the Deletion of a SubServer
*
* @param player Player Deleting
* @param name SubServer Name
* @return Success Status
*/
public void deleteSubServer(UUID player, String name) throws InterruptedException {
if (Util.isNull(name)) throw new NullPointerException();
deleteSubServer(player, name, false, false, i -> {});
}
/**
* Forced the Deletion of a SubServer
*
* @param name SubServer Name
* @return Success Status
*/
public void forceDeleteSubServer(String name) throws InterruptedException {
forceDeleteSubServer(null, name);
}
/**
* Forces the Deletion of a SubServer
*
* @param player Player Deleting
* @param name SubServer Name
* @return Success Status
*/
public void forceDeleteSubServer(UUID player, String name) throws InterruptedException {
if (Util.isNull(name)) throw new NullPointerException();
deleteSubServer(player, name, false, true, i -> {});
}
/**
* Delete a SubServer
*
* @param name SubServer Name
* @return Success Status
*/
public void deleteSubServer(String name, Callback<Integer> response) throws InterruptedException {
deleteSubServer(null, name, response);
}
/**
* Forces the Deletion of a SubServer
*
* @param player Player Deleting
* @param name SubServer Name
* @return Success Status
*/
public void deleteSubServer(UUID player, String name, Callback<Integer> response) throws InterruptedException {
if (Util.isNull(name)) throw new NullPointerException();
deleteSubServer(player, name, false, false, response);
}
/**
* Forced the Deletion of a SubServer
*
* @param name SubServer Name
* @return Success Status
*/
public void forceDeleteSubServer(String name, Callback<Integer> response) throws InterruptedException {
forceDeleteSubServer(null, name, response);
}
/**
* Forces the Deletion of a SubServer
*
* @param player Player Deleting
* @param name SubServer Name
* @return Success Status
*/
public void forceDeleteSubServer(UUID player, String name, Callback<Integer> response) throws InterruptedException {
if (Util.isNull(name)) throw new NullPointerException();
deleteSubServer(player, name, false, true, response);
}
private void deleteSubServer(UUID player, String name, boolean recycle, boolean force, Callback<Integer> response) {
if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketDeleteServer(player, name, recycle, force, data -> {
try {
response.run(data.getInt(0x0001));
} catch (Throwable e) {
Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin);
ew.printStackTrace();
}
}));
}
/** /**
* Get the Signature of this Object * Get the Signature of this Object
* *
@ -258,7 +638,7 @@ public class Host {
*/ */
public boolean hasExtra(String handle) { public boolean hasExtra(String handle) {
if (Util.isNull(handle)) throw new NullPointerException(); if (Util.isNull(handle)) throw new NullPointerException();
return raw.getSection("extra").getKeys().contains(handle); return raw.getMap("extra").getKeys().contains(handle);
} }
/** /**
@ -267,9 +647,9 @@ public class Host {
* @param handle Handle * @param handle Handle
* @return Value * @return Value
*/ */
public YAMLValue getExtra(String handle) { public ObjectMapValue<String> getExtra(String handle) {
if (Util.isNull(handle)) throw new NullPointerException(); if (Util.isNull(handle)) throw new NullPointerException();
return raw.getSection("extra").get(handle); return raw.getMap("extra").get(handle);
} }
/** /**
@ -277,8 +657,8 @@ public class Host {
* *
* @return Extra Value Section * @return Extra Value Section
*/ */
public YAMLSection getExtra() { public ObjectMap<String> getExtra() {
return raw.getSection("extra").clone(); return raw.getMap("extra").clone();
} }
/** /**
@ -286,13 +666,7 @@ public class Host {
* *
* @return Raw Host * @return Raw Host
*/ */
public YAMLSection getRaw() { public ObjectMap<String> getRaw() {
return raw.clone(); return raw.clone();
} }
@Override
@SuppressWarnings("unchecked")
public String toString() {
return raw.toJSON().toString();
}
} }

View File

@ -1,16 +1,17 @@
package net.ME1312.SubServers.Host.Network.API; package net.ME1312.SubServers.Host.Network.API;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Config.YAMLValue; import net.ME1312.Galaxi.Library.Map.ObjectMapValue;
import net.ME1312.Galaxi.Library.NamedContainer; import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.Network.Packet.PacketDownloadProxyInfo; import net.ME1312.SubServers.Host.Network.Packet.PacketDownloadProxyInfo;
import net.ME1312.SubServers.Host.SubAPI; import net.ME1312.SubServers.Host.SubAPI;
import java.util.*; import java.util.*;
public class Proxy { public class Proxy {
YAMLSection raw; ObjectMap<String> raw;
long timestamp; long timestamp;
/** /**
@ -18,7 +19,7 @@ public class Proxy {
* *
* @param raw Raw representation of the Proxy * @param raw Raw representation of the Proxy
*/ */
public Proxy(YAMLSection raw) { public Proxy(ObjectMap<String> raw) {
load(raw); load(raw);
} }
@ -27,7 +28,7 @@ public class Proxy {
return obj instanceof Proxy && getSignature().equals(((Proxy) obj).getSignature()); return obj instanceof Proxy && getSignature().equals(((Proxy) obj).getSignature());
} }
private void load(YAMLSection raw) { private void load(ObjectMap<String> raw) {
this.raw = raw; this.raw = raw;
this.timestamp = Calendar.getInstance().getTime().getTime(); this.timestamp = Calendar.getInstance().getTime().getTime();
} }
@ -37,16 +38,16 @@ public class Proxy {
*/ */
public void refresh() { public void refresh() {
String name = getName(); String name = getName();
SubAPI.getInstance().getSubDataNetwork().sendPacket(new PacketDownloadProxyInfo(name, data -> load(data.getSection("proxies").getSection(name)))); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketDownloadProxyInfo(name, data -> load(data.getMap(name))));
} }
/** /**
* Gets the SubData Client * Gets the SubData Client Channel IDs
* *
* @return SubData Client (or null if not linked) * @return SubData Client Channel ID Array
*/ */
public String getSubData() { public UUID[] getSubData() {
return raw.getRawString("subdata", null); return raw.getUUIDList("subdata", Collections.emptyList()).toArray(new UUID[0]);
} }
/** /**
@ -83,8 +84,8 @@ public class Proxy {
*/ */
public Collection<NamedContainer<String, UUID>> getPlayers() { public Collection<NamedContainer<String, UUID>> getPlayers() {
List<NamedContainer<String, UUID>> players = new ArrayList<NamedContainer<String, UUID>>(); List<NamedContainer<String, UUID>> players = new ArrayList<NamedContainer<String, UUID>>();
for (String id : raw.getSection("players").getKeys()) { for (String id : raw.getMap("players").getKeys()) {
players.add(new NamedContainer<String, UUID>(raw.getSection("players").getSection(id).getRawString("name"), UUID.fromString(id))); players.add(new NamedContainer<String, UUID>(raw.getMap("players").getMap(id).getRawString("name"), UUID.fromString(id)));
} }
return players; return players;
} }
@ -115,7 +116,7 @@ public class Proxy {
*/ */
public boolean hasExtra(String handle) { public boolean hasExtra(String handle) {
if (Util.isNull(handle)) throw new NullPointerException(); if (Util.isNull(handle)) throw new NullPointerException();
return raw.getSection("extra").getKeys().contains(handle); return raw.getMap("extra").getKeys().contains(handle);
} }
/** /**
@ -124,9 +125,9 @@ public class Proxy {
* @param handle Handle * @param handle Handle
* @return Value * @return Value
*/ */
public YAMLValue getExtra(String handle) { public ObjectMapValue<String> getExtra(String handle) {
if (Util.isNull(handle)) throw new NullPointerException(); if (Util.isNull(handle)) throw new NullPointerException();
return raw.getSection("extra").get(handle); return raw.getMap("extra").get(handle);
} }
/** /**
@ -134,8 +135,8 @@ public class Proxy {
* *
* @return Extra Value Section * @return Extra Value Section
*/ */
public YAMLSection getExtra() { public ObjectMap<String> getExtra() {
return raw.getSection("extra").clone(); return raw.getMap("extra").clone();
} }
/** /**
@ -143,13 +144,7 @@ public class Proxy {
* *
* @return Raw Proxy * @return Raw Proxy
*/ */
public YAMLSection getRaw() { public ObjectMap<String> getRaw() {
return raw.clone(); return raw.clone();
} }
@Override
@SuppressWarnings("unchecked")
public String toString() {
return raw.toJSON().toString();
}
} }

View File

@ -1,7 +1,8 @@
package net.ME1312.SubServers.Host.Network.API; package net.ME1312.SubServers.Host.Network.API;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.NamedContainer; import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.Network.Packet.PacketDownloadServerInfo; import net.ME1312.SubServers.Host.Network.Packet.PacketDownloadServerInfo;
import net.ME1312.SubServers.Host.SubAPI; import net.ME1312.SubServers.Host.SubAPI;
@ -9,7 +10,7 @@ import java.net.InetSocketAddress;
import java.util.*; import java.util.*;
public class Server { public class Server {
YAMLSection raw; ObjectMap<String> raw;
long timestamp; long timestamp;
/** /**
@ -17,7 +18,7 @@ public class Server {
* *
* @param raw Raw representation of the Server * @param raw Raw representation of the Server
*/ */
public Server(YAMLSection raw) { public Server(ObjectMap<String> raw) {
load(raw); load(raw);
} }
@ -26,7 +27,7 @@ public class Server {
return obj instanceof Server && getSignature().equals(((Server) obj).getSignature()); return obj instanceof Server && getSignature().equals(((Server) obj).getSignature());
} }
void load(YAMLSection raw) { void load(ObjectMap<String> raw) {
this.raw = raw; this.raw = raw;
this.timestamp = Calendar.getInstance().getTime().getTime(); this.timestamp = Calendar.getInstance().getTime().getTime();
} }
@ -36,16 +37,16 @@ public class Server {
*/ */
public void refresh() { public void refresh() {
String name = getName(); String name = getName();
SubAPI.getInstance().getSubDataNetwork().sendPacket(new PacketDownloadServerInfo(name, data -> load(data.getSection("servers").getSection(name)))); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketDownloadServerInfo(name, data -> load(data.getMap(name))));
} }
/** /**
* Gets the SubData Client Address * Gets the SubData Client Channel IDs
* *
* @return SubData Client Address (or null if not linked) * @return SubData Client Channel ID Array
*/ */
public String getSubData() { public UUID[] getSubData() {
return raw.getRawString("subdata", null); return raw.getUUIDList("subdata", Collections.emptyList()).toArray(new UUID[0]);
} }
/** /**
@ -90,8 +91,8 @@ public class Server {
*/ */
public Collection<NamedContainer<String, UUID>> getPlayers() { public Collection<NamedContainer<String, UUID>> getPlayers() {
List<NamedContainer<String, UUID>> players = new ArrayList<NamedContainer<String, UUID>>(); List<NamedContainer<String, UUID>> players = new ArrayList<NamedContainer<String, UUID>>();
for (String id : raw.getSection("players").getKeys()) { for (String id : raw.getMap("players").getKeys()) {
players.add(new NamedContainer<String, UUID>(raw.getSection("players").getSection(id).getRawString("name"), UUID.fromString(id))); players.add(new NamedContainer<String, UUID>(raw.getMap("players").getMap(id).getRawString("name"), UUID.fromString(id)));
} }
return players; return players;
} }
@ -165,13 +166,7 @@ public class Server {
* *
* @return Raw Server * @return Raw Server
*/ */
public YAMLSection getRaw() { public ObjectMap<String> getRaw() {
return raw.clone(); return raw.clone();
} }
@Override
@SuppressWarnings("unchecked")
public String toString() {
return raw.toJSON().toString();
}
} }

View File

@ -1,9 +1,10 @@
package net.ME1312.SubServers.Host.Network.API; package net.ME1312.SubServers.Host.Network.API;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; 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.Host.Network.Packet.PacketCreateServer; import net.ME1312.SubServers.Host.Network.Packet.PacketCreateServer;
import net.ME1312.SubServers.Host.SubAPI; import net.ME1312.SubServers.Host.SubAPI;
@ -16,14 +17,14 @@ import java.util.UUID;
public class SubCreator { public class SubCreator {
HashMap<String, ServerTemplate> templates = new HashMap<String, ServerTemplate>(); HashMap<String, ServerTemplate> templates = new HashMap<String, ServerTemplate>();
Host host; Host host;
YAMLSection raw; ObjectMap<String> raw;
SubCreator(Host host, YAMLSection raw) { SubCreator(Host host, ObjectMap<String> raw) {
this.host = host; this.host = host;
this.raw = raw; this.raw = raw;
for (String template : raw.getSection("templates").getKeys()) { for (String template : raw.getMap("templates").getKeys()) {
templates.put(template.toLowerCase(), new ServerTemplate(raw.getSection("templates").getSection(template))); templates.put(template.toLowerCase(), new ServerTemplate(raw.getMap("templates").getMap(template)));
} }
} }
@ -33,10 +34,10 @@ public class SubCreator {
} }
public static class ServerTemplate { public static class ServerTemplate {
private YAMLSection raw; private ObjectMap<String> raw;
private ServerType type; private ServerType type;
public ServerTemplate(YAMLSection raw) { public ServerTemplate(ObjectMap<String> raw) {
this.raw = raw; this.raw = raw;
this.type = (Util.isException(() -> ServerType.valueOf(raw.getRawString("type").toUpperCase())))? ServerType.valueOf(raw.getRawString("type").toUpperCase()): ServerType.CUSTOM; this.type = (Util.isException(() -> ServerType.valueOf(raw.getRawString("type").toUpperCase())))? ServerType.valueOf(raw.getRawString("type").toUpperCase()): ServerType.CUSTOM;
} }
@ -86,15 +87,13 @@ public class SubCreator {
return type; return type;
} }
@Override /**
public String toString() { * Get whether this Template requires the Version argument
YAMLSection tinfo = new YAMLSection(); *
tinfo.set("enabled", isEnabled()); * @return Version Requirement
tinfo.set("name", getName()); */
tinfo.set("display", getDisplayName()); public boolean requiresVersion() {
tinfo.set("icon", getIcon()); return raw.getBoolean("version-req");
tinfo.set("type", getType().toString());
return tinfo.toJSON().toString();
} }
} }
public enum ServerType { public enum ServerType {
@ -116,16 +115,16 @@ public class SubCreator {
* @param player Player Creating * @param player Player Creating
* @param name Server Name * @param name Server Name
* @param template Server Template * @param template Server Template
* @param version Server Version * @param version Server Version (may be null)
* @param port Server Port Number * @param port Server Port Number (null to auto-select)
* @param response Response Code * @param response Response Code
*/ */
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();
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("r")); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
@ -139,8 +138,8 @@ public class SubCreator {
* *
* @param name Server Name * @param name Server Name
* @param template Server Template * @param template Server Template
* @param version Server Version * @param version Server Version (may be null)
* @param port Server Port Number * @param port Server Port Number (null to auto-select)
* @param response Response Code * @param response Response Code
*/ */
public void create(String name, ServerTemplate template, Version version, int port, Callback<Integer> response) { public void create(String name, ServerTemplate template, Version version, int port, Callback<Integer> response) {
@ -153,8 +152,8 @@ public class SubCreator {
* @param player Player Creating * @param player Player Creating
* @param name Server Name * @param name Server Name
* @param template Server Template * @param template Server Template
* @param version Server Version * @param version Server Version (may be null)
* @param port Server Port Number * @param port Server Port Number (null to auto-select)
*/ */
public void create(UUID player, String name, ServerTemplate template, Version version, int port) { public void create(UUID player, String name, ServerTemplate template, Version version, int port) {
create(player, name, template, version, port, i -> {}); create(player, name, template, version, port, i -> {});
@ -165,8 +164,8 @@ public class SubCreator {
* *
* @param name Server Name * @param name Server Name
* @param template Server Template * @param template Server Template
* @param version Server Version * @param version Server Version (may be null)
* @param port Server Port Number * @param port Server Port Number (null to auto-select)
*/ */
public void create(String name, ServerTemplate template, Version version, int port) { public void create(String name, ServerTemplate template, Version version, int port) {
create(name, template, version, port, i -> {}); create(name, template, version, port, i -> {});
@ -200,10 +199,4 @@ public class SubCreator {
if (Util.isNull(name)) throw new NullPointerException(); if (Util.isNull(name)) throw new NullPointerException();
return getTemplates().get(name.toLowerCase()); return getTemplates().get(name.toLowerCase());
} }
@Override
@SuppressWarnings("unchecked")
public String toString() {
return raw.toJSON().toString();
}
} }

View File

@ -1,9 +1,11 @@
package net.ME1312.SubServers.Host.Network.API; package net.ME1312.SubServers.Host.Network.API;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.Network.Packet.PacketCommandServer; import net.ME1312.SubServers.Host.Network.Packet.PacketCommandServer;
import net.ME1312.SubServers.Host.Network.Packet.PacketEditServer;
import net.ME1312.SubServers.Host.Network.Packet.PacketStartServer; import net.ME1312.SubServers.Host.Network.Packet.PacketStartServer;
import net.ME1312.SubServers.Host.Network.Packet.PacketStopServer; import net.ME1312.SubServers.Host.Network.Packet.PacketStopServer;
import net.ME1312.SubServers.Host.SubAPI; import net.ME1312.SubServers.Host.SubAPI;
@ -24,6 +26,7 @@ public class SubServer extends Server {
NONE, NONE,
RESTART, RESTART,
REMOVE_SERVER, REMOVE_SERVER,
RECYCLE_SERVER,
DELETE_SERVER; DELETE_SERVER;
@Override @Override
@ -37,7 +40,7 @@ public class SubServer extends Server {
* *
* @param raw JSON representation of the Server * @param raw JSON representation of the Server
*/ */
public SubServer(YAMLSection raw) { public SubServer(ObjectMap<String> raw) {
super(raw); super(raw);
} }
@ -47,7 +50,7 @@ public class SubServer extends Server {
* @param host Host * @param host Host
* @param raw JSON representation of the Server * @param raw JSON representation of the Server
*/ */
SubServer(Host host, YAMLSection raw) { SubServer(Host host, ObjectMap<String> raw) {
super(raw); super(raw);
this.host = host; this.host = host;
} }
@ -73,9 +76,9 @@ 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();
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("r")); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
@ -118,9 +121,9 @@ 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();
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("r")); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
@ -163,9 +166,9 @@ 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();
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("r")); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
@ -209,9 +212,9 @@ 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();
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("r")); response.run(data.getInt(0x0001));
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
@ -249,6 +252,104 @@ public class SubServer extends Server {
command(command, i -> {}); command(command, i -> {});
} }
/**
* Edits the Server
*
* @param player Player Editing
* @param edit Edits
* @param response Negative Response Code -or- Positive Success Status
*/
public void edit(UUID player, ObjectMap<String> edit, Callback<Integer> response) {
edit(player, edit, false, response);
}
/**
* Edits the Server
*
* @param edit Edits
* @param response Negative Response Code -or- Positive Success Status
*/
public void edit(ObjectMap<String> edit, Callback<Integer> response) {
edit(null, edit, response);
}
/**
* Edits the Server
*
* @param player Player Editing
* @param edit Edits
*/
public void edit(UUID player, ObjectMap<String> edit) {
edit(player, edit, i -> {});
}
/**
* Edits the Server
*
* @param edit Edits
*/
public void edit(ObjectMap<String> edit) {
edit(null, edit);
}
/**
* Edits the Server (& Saves Changes)
*
* @param player Player Editing
* @param edit Edits
* @param response Negative Response Code -or- Positive Success Status
*/
public void permaEdit(UUID player, ObjectMap<String> edit, Callback<Integer> response) {
edit(player, edit, true, response);
}
/**
* Edits the Server (& Saves Changes)
*
* @param edit Edits
* @param response Negative Response Code -or- Positive Success Status
*/
public void permaEdit(ObjectMap<String> edit, Callback<Integer> response) {
permaEdit(null, edit, response);
}
/**
* Edits the Server (& Saves Changes)
*
* @param player Player Editing
* @param edit Edits
*/
public void permaEdit(UUID player, ObjectMap<String> edit) {
permaEdit(player, edit, i -> {});
}
/**
* Edits the Server (& Saves Changes)
*
* @param edit Edits
*/
public void permaEdit(ObjectMap<String> edit) {
permaEdit(null, edit);
}
private void edit(UUID player, ObjectMap<String> edit, boolean perma, Callback<Integer> response) {
if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketEditServer(player, getName(), edit, perma, data -> {
try {
if (data.getInt(0x0001) != 0) {
response.run(data.getInt(0x0001) * -1);
} else {
response.run(data.getInt(0x0002));
}
} catch (Throwable e) {
Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin);
ew.printStackTrace();
}
}));
}
/** /**
* If the Server is Running * If the Server is Running
* *
@ -304,6 +405,31 @@ public class SubServer extends Server {
return raw.getBoolean("enabled"); return raw.getBoolean("enabled");
} }
/**
* Set if the Server is Enabled
*
* @param value Value
*/
public void setEnabled(boolean value) {
setEnabled(value, b -> {});
}
/**
* Set if the Server is Enabled
*
* @param value Value
* @param response Success Status
*/
public void setEnabled(boolean value, Callback<Boolean> response) {
if (Util.isNull(value, response)) throw new NullPointerException();
ObjectMap<String> edit = new ObjectMap<String>();
edit.set("enabled", value);
edit(edit, r -> {
if (r > 0) raw.set("enabled", value);
response.run(r > 0);
});
}
/** /**
* If the Server is accepting requests to edit() * If the Server is accepting requests to edit()
* *
@ -322,6 +448,31 @@ public class SubServer extends Server {
return raw.getBoolean("log"); return raw.getBoolean("log");
} }
/**
* Set if the Server is Logging
*
* @param value Value
*/
public void setLogging(boolean value) {
setLogging(value, b -> {});
}
/**
* Set if the Server is Logging
*
* @param value Value
* @param response Success Status
*/
public void setLogging(boolean value, Callback<Boolean> response) {
if (Util.isNull(value, response)) throw new NullPointerException();
ObjectMap<String> edit = new ObjectMap<String>();
edit.set("log", value);
edit(edit, r -> {
if (r > 0) raw.set("log", value);
response.run(r > 0);
});
}
/** /**
* Get the Server Directory Path * Get the Server Directory Path
* *
@ -349,6 +500,31 @@ public class SubServer extends Server {
return raw.getRawString("stop-cmd"); return raw.getRawString("stop-cmd");
} }
/**
* Set the Command that Stops the Server
*
* @param value Value
*/
public void setStopCommand(String value) {
setStopCommand(value, b -> {});
}
/**
* Set the Command that Stops the Server
*
* @param value Value
* @param response Success Status
*/
public void setStopCommand(String value, Callback<Boolean> response) {
if (Util.isNull(value, response)) throw new NullPointerException();
ObjectMap<String> edit = new ObjectMap<String>();
edit.set("stop-cmd", value);
edit(edit, r -> {
if (r > 0) raw.set("stop-cmd", value);
response.run(r > 0);
});
}
/** /**
* Get the action the Server will take when it stops * Get the action the Server will take when it stops
* *
@ -358,6 +534,31 @@ public class SubServer extends Server {
return Util.getDespiteException(() -> StopAction.valueOf(raw.getRawString("stop-action").toUpperCase().replace('-', '_').replace(' ', '_')), null); return Util.getDespiteException(() -> StopAction.valueOf(raw.getRawString("stop-action").toUpperCase().replace('-', '_').replace(' ', '_')), null);
} }
/**
* Set the action the Server will take when it stops
*
* @param action Stop Action
*/
public void setStopAction(StopAction action) {
setStopAction(action, b -> {});
}
/**
* Set the action the Server will take when it stops
*
* @param action Stop Action
* @param response Success Status
*/
public void setStopAction(StopAction action, Callback<Boolean> response) {
if (Util.isNull(action, response)) throw new NullPointerException();
ObjectMap<String> edit = new ObjectMap<String>();
edit.set("stop-action", action.toString());
edit(edit, r -> {
if (r > 0) raw.set("stop-action", action.toString());
response.run(r > 0);
});
}
/** /**
* Checks if a Server is compatible * Checks if a Server is compatible
* *

View File

@ -1,34 +0,0 @@
package net.ME1312.SubServers.Host.Network;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
import org.msgpack.value.Value;
/**
* SubData Cipher Layout Class
*/
public interface Cipher {
/**
* Get the name of this Cipher
*
* @return Cipher Name
*/
String getName();
/**
* Encrypt JSON Data
*
* @param key Key to Encrypt Data with
* @param data Data to Encrypt
* @return Encrypted Data Array
*/
Value encrypt(String key, YAMLSection data) throws Exception;
/**
* Decrypt Encrypted JSON Data
*
* @param key Key to Decrypt Data with
* @param data Encrypted Data Array
* @return JSON Data
*/
YAMLSection decrypt(String key, Value data) throws Exception;
}

View File

@ -1,333 +0,0 @@
package net.ME1312.SubServers.Host.Network.Encryption;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.SubServers.Host.Network.SubDataClient;
import org.json.JSONObject;
import org.msgpack.core.MessagePack;
import org.msgpack.core.MessagePacker;
import org.msgpack.value.Value;
import org.msgpack.value.ValueFactory;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.InvalidParameterSpecException;
import java.security.spec.KeySpec;
import java.util.Arrays;
import java.util.Map;
import java.util.Random;
/**
* A class to perform password-based AES encryption and decryption in CBC mode.
* 128, 192, and 256-bit encryption are supported, provided that the latter two
* are permitted by the Java runtime's jurisdiction policy files.
* <br/>
* The public interface for this class consists of the static methods
* {@link #encrypt} and {@link #decrypt}, which encrypt and decrypt arbitrary
* streams of data, respectively.
*
* @author dweymouth@gmail.com
*/
public final class AES implements net.ME1312.SubServers.Host.Network.Cipher {
// AES specification
private static final String CIPHER_SPEC = "AES/CBC/PKCS5Padding";
// Key derivation specification
private static final String KEYGEN_SPEC = "PBKDF2WithHmacSHA1";
private static final int SALT_LENGTH = 16; // in bytes
private static final int AUTH_KEY_LENGTH = 8; // in bytes
private static final int ITERATIONS = 32768;
// Process input/output streams in chunks
private static final int BUFFER_SIZE = 1024;
// Hold Data for use by SubData Cipher methods
private final int keyLength;
/**
* Constructor for use as a SubData Cipher
*/
public AES(int keyLength) {
this.keyLength = keyLength;
}
/**
* @return a new pseudorandom salt of the specified length
*/
private static byte[] generateSalt(int length) {
Random r = new SecureRandom();
byte[] salt = new byte[length];
r.nextBytes(salt);
return salt;
}
/**
* Derive an AES encryption key and authentication key from given password and salt,
* using PBKDF2 key stretching. The authentication key is 64 bits long.
* @param keyLength
* length of the AES key in bits (128, 192, or 256)
* @param password
* the password from which to derive the keys
* @param salt
* the salt from which to derive the keys
* @return a Keys object containing the two generated keys
*/
private static Keys keygen(int keyLength, char[] password, byte[] salt) {
SecretKeyFactory factory;
try {
factory = SecretKeyFactory.getInstance(KEYGEN_SPEC);
} catch (NoSuchAlgorithmException impossible) { return null; }
// derive a longer key, then split into AES key and authentication key
KeySpec spec = new PBEKeySpec(password, salt, ITERATIONS, keyLength + AUTH_KEY_LENGTH * 8);
SecretKey tmp = null;
try {
tmp = factory.generateSecret(spec);
} catch (InvalidKeySpecException impossible) { }
byte[] fullKey = tmp.getEncoded();
SecretKey authKey = new SecretKeySpec( // key for password authentication
Arrays.copyOfRange(fullKey, 0, AUTH_KEY_LENGTH), "AES");
SecretKey encKey = new SecretKeySpec( // key for AES encryption
Arrays.copyOfRange(fullKey, AUTH_KEY_LENGTH, fullKey.length), "AES");
return new Keys(encKey, authKey);
}
/**
* Encrypts a stream of data. The encrypted stream consists of a header
* followed by the raw AES data. The header is broken down as follows:<br/>
* <ul>
* <li><b>keyLength</b>: AES key length in bytes (valid for 16, 24, 32) (1 byte)</li>
* <li><b>salt</b>: pseudorandom salt used to derive keys from password (16 bytes)</li>
* <li><b>authentication key</b> (derived from password and salt, used to
* check validity of password upon decryption) (8 bytes)</li>
* <li><b>IV</b>: pseudorandom AES initialization vector (16 bytes)</li>
* </ul>
*
* @param keyLength
* key length to use for AES encryption (must be 128, 192, or 256)
* @param password
* password to use for encryption
* @param input
* an arbitrary byte stream to encrypt
* @param output
* stream to which encrypted data will be written
* @throws AES.InvalidKeyLengthException
* if keyLength is not 128, 192, or 256
* @throws AES.StrongEncryptionNotAvailableException
* if keyLength is 192 or 256, but the Java runtime's jurisdiction
* policy files do not allow 192- or 256-bit encryption
* @throws IOException
*/
public static void encrypt(int keyLength, String password, InputStream input, OutputStream output)
throws InvalidKeyLengthException, StrongEncryptionNotAvailableException, IOException {
// Check validity of key length
if (keyLength != 128 && keyLength != 192 && keyLength != 256) {
throw new InvalidKeyLengthException(keyLength);
}
// generate salt and derive keys for authentication and encryption
byte[] salt = generateSalt(SALT_LENGTH);
Keys keys = keygen(keyLength, password.toCharArray(), salt);
// initialize AES encryption
Cipher encrypt = null;
try {
encrypt = Cipher.getInstance(CIPHER_SPEC);
encrypt.init(Cipher.ENCRYPT_MODE, keys.encryption);
} catch (NoSuchAlgorithmException | NoSuchPaddingException impossible) { }
catch (InvalidKeyException e) { // 192 or 256-bit AES not available
throw new StrongEncryptionNotAvailableException(keyLength);
}
// get initialization vector
byte[] iv = null;
try {
iv = encrypt.getParameters().getParameterSpec(IvParameterSpec.class).getIV();
} catch (InvalidParameterSpecException impossible) { }
// write authentication and AES initialization data
output.write(keyLength / 8);
output.write(salt);
output.write(keys.authentication.getEncoded());
output.write(iv);
// read data from input into buffer, encrypt and write to output
byte[] buffer = new byte[BUFFER_SIZE];
int numRead;
byte[] encrypted = null;
while ((numRead = input.read(buffer)) > 0) {
encrypted = encrypt.update(buffer, 0, numRead);
if (encrypted != null) {
output.write(encrypted);
}
}
try { // finish encryption - do final block
encrypted = encrypt.doFinal();
} catch (IllegalBlockSizeException | BadPaddingException impossible) { }
if (encrypted != null) {
output.write(encrypted);
}
output.flush();
}
/**
* This method calls to {@link #encrypt(int, String, InputStream, OutputStream)}, simplified for the {@link net.ME1312.SubServers.Host.Network.Cipher} interface.
*
* @param key Key to Encrypt Data with
* @param data Data to Encrypt
* @return Encrypted Data Array
*/
public Value encrypt(String key, YAMLSection data) throws Exception {
ByteArrayOutputStream unencrypted = new ByteArrayOutputStream();
MessagePacker packer = MessagePack.newDefaultPacker(unencrypted);
packer.packValue(SubDataClient.convert(data));
packer.close();
ByteArrayOutputStream encrypted = new ByteArrayOutputStream();
encrypt(keyLength, key, new ByteArrayInputStream(unencrypted.toByteArray()), encrypted);
return ValueFactory.newBinary(encrypted.toByteArray(), true);
}
public String getName() {
return "AES_" + keyLength;
}
/**
* Decrypts a stream of data that was encrypted by {@link #encrypt}.
* @param password
* the password used to encrypt/decrypt the stream
* @param input
* stream of encrypted data to be decrypted
* @param output
* stream to which decrypted data will be written
* @return the key length for the decrypted stream (128, 192, or 256)
* @throws AES.InvalidPasswordException
* if the given password was not used to encrypt the data
* @throws AES.InvalidAESStreamException
* if the given input stream is not a valid AES-encrypted stream
* @throws AES.StrongEncryptionNotAvailableException
* if the stream is 192 or 256-bit encrypted, and the Java runtime's
* jurisdiction policy files do not allow for AES-192 or 256
* @throws IOException
*/
public static int decrypt(String password, InputStream input, OutputStream output)
throws InvalidPasswordException, InvalidAESStreamException, IOException,
StrongEncryptionNotAvailableException {
int keyLength = input.read() * 8;
// Check validity of key length
if (keyLength != 128 && keyLength != 192 && keyLength != 256) {
throw new InvalidAESStreamException();
}
// read salt, generate keys, and authenticate password
byte[] salt = new byte[SALT_LENGTH];
input.read(salt);
Keys keys = keygen(keyLength, password.toCharArray(), salt);
byte[] authRead = new byte[AUTH_KEY_LENGTH];
input.read(authRead);
if (!Arrays.equals(keys.authentication.getEncoded(), authRead)) {
throw new InvalidPasswordException();
}
// initialize AES decryption
byte[] iv = new byte[16]; // 16-byte I.V. regardless of key size
input.read(iv);
Cipher decrypt = null;
try {
decrypt = Cipher.getInstance(CIPHER_SPEC);
decrypt.init(Cipher.DECRYPT_MODE, keys.encryption, new IvParameterSpec(iv));
} catch (NoSuchAlgorithmException | NoSuchPaddingException
| InvalidAlgorithmParameterException impossible) { }
catch (InvalidKeyException e) { // 192 or 256-bit AES not available
throw new StrongEncryptionNotAvailableException(keyLength);
}
// read data from input into buffer, decrypt and write to output
byte[] buffer = new byte[BUFFER_SIZE];
int numRead;
byte[] decrypted;
while ((numRead = input.read(buffer)) > 0) {
decrypted = decrypt.update(buffer, 0, numRead);
if (decrypted != null) {
output.write(decrypted);
}
}
try { // finish decryption - do final block
decrypted = decrypt.doFinal();
} catch (IllegalBlockSizeException | BadPaddingException e) {
throw new InvalidAESStreamException(e);
}
if (decrypted != null) {
output.write(decrypted);
}
output.flush();
return keyLength;
}
/**
* This method calls to {@link #decrypt(String, InputStream, OutputStream)}), simplified for the {@link net.ME1312.SubServers.Host.Network.Cipher} interface.
*
* @param key Key to Decrypt Data with
* @param data Encrypted Data Array
* @return JSON Data
*/
@SuppressWarnings("unchecked")
public YAMLSection decrypt(String key, Value data) throws Exception {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
decrypt(key, new ByteArrayInputStream(data.asBinaryValue().asByteArray()), bytes);
return SubDataClient.convert(MessagePack.newDefaultUnpacker(bytes.toByteArray()).unpackValue().asMapValue());
}
/**
* A tuple of encryption and authentication keys returned by {@link #keygen}
*/
private static class Keys {
public final SecretKey encryption, authentication;
public Keys(SecretKey encryption, SecretKey authentication) {
this.encryption = encryption;
this.authentication = authentication;
}
}
/**
* Thrown if an attempt is made to decrypt a stream with an incorrect password.
*/
public static class InvalidPasswordException extends Exception { }
/**
* Thrown if an attempt is made to encrypt a stream with an invalid AES key length.
*/
public static class InvalidKeyLengthException extends Exception {
InvalidKeyLengthException(int length) {
super("Invalid AES key length: " + length);
}
}
/**
* Thrown if 192- or 256-bit AES encryption or decryption is attempted,
* but not available on the particular Java platform.
*/
public static class StrongEncryptionNotAvailableException extends Exception {
public StrongEncryptionNotAvailableException(int keySize) {
super(keySize + "-bit AES encryption is not available on this Java platform.");
}
}
/**
* Thrown if an attempt is made to decrypt an invalid AES stream.
*/
public static class InvalidAESStreamException extends Exception {
public InvalidAESStreamException() { super(); };
public InvalidAESStreamException(Exception e) { super(e); }
}
}

View File

@ -0,0 +1,123 @@
package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubData.Client.SubDataClient;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.UUID;
/**
* Add Server Packet
*/
public class PacketAddServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<UUID, Callback<ObjectMap<Integer>>[]> callbacks = new HashMap<UUID, Callback<ObjectMap<Integer>>[]>();
private UUID player;
private String name;
private ObjectMap<String> opt;
private boolean subserver;
private UUID tracker;
/**
* New PacketAddServer (In)
*/
public PacketAddServer() {}
/**
* New PacketCreateServer [Server] (Out)
*
* @param player Player who added
* @param name Name of the Server
* @param ip IP of the Server
* @param port Port of the Server
* @param motd MOTD of the Server
* @param hidden If the server should be hidden from players
* @param restricted Players will need a permission to join if true
* @param callback Callbacks
*/
@SafeVarargs
public PacketAddServer(UUID player, String name, InetAddress ip, int port, String motd, boolean hidden, boolean restricted, Callback<ObjectMap<Integer>>... callback) {
if (Util.isNull(name, ip, port, motd, hidden, restricted)) throw new NullPointerException();
this.player = player;
this.name = name;
this.subserver = false;
ObjectMap<String> opt = new ObjectMap<String>();
opt.set("address", ip.getHostAddress() + ':' + port);
opt.set("motd", motd);
opt.set("restricted", restricted);
opt.set("hidden", hidden);
this.opt = opt;
this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(tracker, callback);
}
/**
* New PacketAddServer [SubServer] (Out)
*
* @param player Player who Added
* @param name Name of Server
* @param enabled Enabled Status
* @param host Host of Server
* @param port Port Number
* @param motd Motd of the Server
* @param log Logging Status
* @param directory Directory
* @param executable Executable String
* @param stopcmd Command to Stop the Server
* @param hidden if the server should be hidden from players
* @param restricted Players will need a permission to join if true
* @param callback Callbacks
*/
@SafeVarargs
public PacketAddServer(UUID player, String name, boolean enabled, String host, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted, Callback<ObjectMap<Integer>>... callback) {
if (Util.isNull(host, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted)) throw new NullPointerException();
this.player = player;
this.name = name;
this.subserver = true;
ObjectMap<String> opt = new ObjectMap<String>();
opt.set("enabled", enabled);
opt.set("host", host);
opt.set("port", port);
opt.set("motd", motd);
opt.set("log", log);
opt.set("dir", directory);
opt.set("exec", executable);
opt.set("stop-cmd", stopcmd);
opt.set("restricted", restricted);
opt.set("hidden", hidden);
this.opt = opt;
this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(tracker, callback);
}
@Override
public ObjectMap<Integer> send(SubDataClient client) {
ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set(0x0000, tracker);
data.set(0x0001, name);
data.set(0x0002, subserver);
data.set(0x0003, opt);
if (player != null) data.set(0x0004, player);
return data;
}
@Override
public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<ObjectMap<Integer>> callback : callbacks.get(data.getUUID(0x0000))) callback.run(data);
callbacks.remove(data.getUUID(0x0000));
}
@Override
public int version() {
return 0x0001;
}
}

View File

@ -1,60 +0,0 @@
package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Log.Logger;
import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.SubServers.Host.Network.PacketIn;
import net.ME1312.SubServers.Host.Network.PacketOut;
import net.ME1312.SubServers.Host.Network.SubDataClient;
import net.ME1312.SubServers.Host.ExHost;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Authorization Packet
*/
public final class PacketAuthorization implements PacketIn, PacketOut {
private ExHost host;
private Logger log = null;
/**
* New PacketAuthorization
*
* @param host SubServers.Host
*/
public PacketAuthorization(ExHost host) {
if (Util.isNull(host)) throw new NullPointerException();
this.host = host;
Util.isException(() -> this.log = Util.reflect(SubDataClient.class.getDeclaredField("log"), null));
}
@Override
public YAMLSection generate() {
YAMLSection json = new YAMLSection();
json.set("password", host.config.get().getSection("Settings").getSection("SubData").getString("Password"));
return json;
}
@Override
public void execute(YAMLSection data) {
try {
if (data.getInt("r") == 0) {
Util.isException(() -> Util.reflect(SubDataClient.class.getDeclaredMethod("sendPacket", NamedContainer.class), host.subdata, new NamedContainer<String, PacketOut>(null, new PacketLinkExHost(host))));
} else {
log.info.println("Could not authorize SubData connection: " + data.getRawString("m"));
host.subdata.destroy(0);
}
} catch (IOException e) {
log.error.println(e);
}
}
@Override
public Version getVersion() {
return new Version("2.11.0a");
}
}

View File

@ -0,0 +1,77 @@
package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap;
import java.util.UUID;
/**
* Packet Check Permission
*/
public class PacketCheckPermission implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<UUID, Callback<Boolean>[]> callbacks = new HashMap<UUID, Callback<Boolean>[]>();
private String name;
private UUID player;
private String permission;
private UUID tracker;
/**
* New PacketCheckPermission (In)
*/
public PacketCheckPermission() {}
/**
* New PacketCheckPermission (Out)
*
* @param player Player to check on
* @param permission Permission to check
* @param callback Callbacks
*/
@SafeVarargs
public PacketCheckPermission(UUID player, String permission, Callback<Boolean>... callback) {
this(null, player, permission, callback);
}
/**
* New PacketCheckPermission (Out)
*
* @param server Server to check on
* @param player Player to check on
* @param permission Permission to check
* @param callback Callbacks
*/
@SafeVarargs
public PacketCheckPermission(String server, UUID player, String permission, Callback<Boolean>... callback) {
this.name = server;
this.player = player;
this.permission = permission;
this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(tracker, callback);
}
@Override
public ObjectMap<Integer> send(SubDataClient client) throws Throwable {
ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set(0x0000, tracker);
data.set(0x0001, player);
data.set(0x0002, permission);
if (name != null) data.set(0x0003, name);
return data;
}
@Override
public void receive(SubDataClient client, ObjectMap<Integer> data) throws Throwable {
for (Callback<Boolean> callback : callbacks.get(data.getUUID(0x0000))) callback.run(data.getBoolean(0x0001));
callbacks.remove(data.getUUID(0x0000));
}
@Override
public int version() {
return 0x0001;
}
}

View File

@ -1,10 +1,11 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Callback.Callback;
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.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap; import java.util.HashMap;
import java.util.UUID; import java.util.UUID;
@ -12,12 +13,12 @@ import java.util.UUID;
/** /**
* Command Server Packet * Command Server Packet
*/ */
public class PacketCommandServer implements PacketIn, PacketOut { public class PacketCommandServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>(); private static HashMap<UUID, Callback<ObjectMap<Integer>>[]> callbacks = new HashMap<UUID, Callback<ObjectMap<Integer>>[]>();
private UUID player; private UUID player;
private String server; private String server;
private String command; private String command;
private String id; private UUID tracker;
/** /**
* New PacketCommandServer (In) * New PacketCommandServer (In)
@ -33,33 +34,33 @@ public class PacketCommandServer implements PacketIn, PacketOut {
* @param callback Callbacks * @param callback Callbacks
*/ */
@SafeVarargs @SafeVarargs
public PacketCommandServer(UUID player, String server, String command, Callback<YAMLSection>... callback) { public PacketCommandServer(UUID player, String server, String command, Callback<ObjectMap<Integer>>... callback) {
if (Util.isNull(server, command, callback)) throw new NullPointerException(); if (Util.isNull(server, command, callback)) throw new NullPointerException();
this.player = player; this.player = player;
this.server = server; this.server = server;
this.command = command; this.command = command;
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString(); this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(id, callback); callbacks.put(tracker, callback);
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection data = new YAMLSection(); ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set("id", id); data.set(0x0000, tracker);
if (player != null) data.set("player", player.toString()); data.set(0x0001, server);
data.set("server", server); data.set(0x0002, command);
data.set("command", command); if (player != null) data.set(0x0003, player.toString());
return data; return data;
} }
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data); for (Callback<ObjectMap<Integer>> callback : callbacks.get(data.getUUID(0x0000))) callback.run(data);
callbacks.remove(data.getRawString("id")); callbacks.remove(data.getUUID(0x0000));
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -1,11 +1,12 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; 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.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap; import java.util.HashMap;
import java.util.UUID; import java.util.UUID;
@ -13,15 +14,16 @@ import java.util.UUID;
/** /**
* Create Server Packet * Create Server Packet
*/ */
public class PacketCreateServer implements PacketIn, PacketOut { public class PacketCreateServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>(); private static HashMap<UUID, Callback<ObjectMap<Integer>>[]> callbacks = new HashMap<UUID, Callback<ObjectMap<Integer>>[]>();
private UUID player; private UUID player;
private String name; private String name;
private String host; private String host;
private String template; private String template;
private Version version; private Version version;
private Integer port; private Integer port;
private String id; private boolean waitfor;
private UUID tracker;
/** /**
* New PacketCreateServer (In) * New PacketCreateServer (In)
@ -40,41 +42,58 @@ public class PacketCreateServer implements PacketIn, PacketOut {
* @param callback Callbacks * @param callback Callbacks
*/ */
@SafeVarargs @SafeVarargs
public PacketCreateServer(UUID player, String name, String host, String template, Version version, Integer port, Callback<YAMLSection>... callback) { public PacketCreateServer(UUID player, String name, String host, String template, Version version, Integer port, Callback<ObjectMap<Integer>>... callback) {
if (Util.isNull(name, host, template, version, callback)) throw new NullPointerException(); this(player, name, host, template, version, port, false, callback);
}
/**
* New PacketCreateServer (Out)
*
* @param player Player Creating
* @param name Server Name
* @param host Host to use
* @param template Server Template
* @param version Server Version
* @param port Server Port
* @param waitfor Wait until completion to send callback
* @param callback Callbacks
*/
@SafeVarargs
public PacketCreateServer(UUID player, String name, String host, String template, Version version, Integer port, boolean waitfor, Callback<ObjectMap<Integer>>... callback) {
if (Util.isNull(name, host, template, callback)) throw new NullPointerException();
this.player = player; this.player = player;
this.name = name; this.name = name;
this.host = host; this.host = host;
this.template = template; this.template = template;
this.version = version; this.version = version;
this.port = port; this.port = port;
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString(); this.waitfor = waitfor;
callbacks.put(id, callback); this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(tracker, callback);
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection data = new YAMLSection(); ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set("id", id); data.set(0x0000, tracker);
if (player != null) data.set("player", player.toString()); data.set(0x0001, name);
YAMLSection creator = new YAMLSection(); data.set(0x0002, host);
creator.set("name", name); data.set(0x0003, template);
creator.set("host", host); if (version != null) data.set(0x0004, version);
creator.set("template", template); if (port != null) data.set(0x0005, port);
creator.set("version", version); if (player != null) data.set(0x0006, player);
if (port != null) creator.set("port", port); if (waitfor) data.set(0x0007, true);
data.set("creator", creator);
return data; return data;
} }
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data); for (Callback<ObjectMap<Integer>> callback : callbacks.get(data.getUUID(0x0000))) callback.run(data);
callbacks.remove(data.getRawString("id")); callbacks.remove(data.getUUID(0x0000));
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.13b"); return 0x0001;
} }
} }

View File

@ -0,0 +1,68 @@
package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap;
import java.util.UUID;
/**
* Delete Server Packet
*/
public class PacketDeleteServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<UUID, Callback<ObjectMap<Integer>>[]> callbacks = new HashMap<UUID, Callback<ObjectMap<Integer>>[]>();
private UUID player;
private String server;
private boolean recycle;
private boolean force;
private UUID tracker;
/**
* New PacketDeleteServer (In)
*/
public PacketDeleteServer() {}
/**
* New PacketDeleteServer (Out)
*
* @param player Player Deleting
* @param server Server
* @param callback Callbacks
*/
@SafeVarargs
public PacketDeleteServer(UUID player, String server, boolean recycle, boolean force, Callback<ObjectMap<Integer>>... callback) {
if (Util.isNull(server, callback)) throw new NullPointerException();
this.player = player;
this.server = server;
this.recycle = recycle;
this.force = force;
this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(tracker, callback);
}
@Override
public ObjectMap<Integer> send(SubDataClient client) {
ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set(0x0000, tracker);
data.set(0x0001, server);
data.set(0x0002, recycle);
data.set(0x0003, force);
if (player != null) data.set(0x0004, player.toString());
return data;
}
@Override
public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<ObjectMap<Integer>> callback : callbacks.get(data.getUUID(0x0000))) callback.run(data);
callbacks.remove(data.getUUID(0x0000));
}
@Override
public int version() {
return 0x0001;
}
}

View File

@ -1,22 +1,23 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; 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.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
/** /**
* Download Group Info Packet * Download Group Info Packet
*/ */
public class PacketDownloadGroupInfo implements PacketIn, PacketOut { public class PacketDownloadGroupInfo implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>(); private static HashMap<UUID, Callback<ObjectMap<String>>[]> callbacks = new HashMap<UUID, Callback<ObjectMap<String>>[]>();
private String group; private String group;
private String id; private UUID tracker;
/** /**
* New PacketDownloadGroupInfo (In) * New PacketDownloadGroupInfo (In)
@ -30,29 +31,30 @@ public class PacketDownloadGroupInfo implements PacketIn, PacketOut {
* @param callback Callbacks * @param callback Callbacks
*/ */
@SafeVarargs @SafeVarargs
public PacketDownloadGroupInfo(String group, Callback<YAMLSection>... callback) { public PacketDownloadGroupInfo(String group, Callback<ObjectMap<String>>... callback) {
if (Util.isNull((Object) callback)) throw new NullPointerException(); if (Util.isNull((Object) callback)) throw new NullPointerException();
this.group = group; this.group = group;
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString(); this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(id, callback); callbacks.put(tracker, callback);
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection json = new YAMLSection(); ObjectMap<Integer> json = new ObjectMap<Integer>();
json.set("id", id); json.set(0x0000, tracker);
if (group != null) json.set("group", group); if (group != null) json.set(0x0001, group);
return json; return json;
} }
@SuppressWarnings("unchecked")
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data); for (Callback<ObjectMap<String>> callback : callbacks.get(data.getUUID(0x0000))) callback.run(new ObjectMap<String>((Map<String, ?>) data.getObject(0x0001)));
callbacks.remove(data.getRawString("id")); callbacks.remove(data.getUUID(0x0000));
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.13b"); return 0x0001;
} }
} }

View File

@ -1,22 +1,23 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; 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.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
/** /**
* Download Host Info Packet * Download Host Info Packet
*/ */
public class PacketDownloadHostInfo implements PacketIn, PacketOut { public class PacketDownloadHostInfo implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>(); private static HashMap<UUID, Callback<ObjectMap<String>>[]> callbacks = new HashMap<UUID, Callback<ObjectMap<String>>[]>();
private String host; private String group;
private String id; private UUID tracker;
/** /**
* New PacketDownloadHostInfo (In) * New PacketDownloadHostInfo (In)
@ -26,33 +27,34 @@ public class PacketDownloadHostInfo implements PacketIn, PacketOut {
/** /**
* New PacketDownloadHostInfo (Out) * New PacketDownloadHostInfo (Out)
* *
* @param host Host name (or null for all) * @param group Host name (or null for all)
* @param callback Callbacks * @param callback Callbacks
*/ */
@SafeVarargs @SafeVarargs
public PacketDownloadHostInfo(String host, Callback<YAMLSection>... callback) { public PacketDownloadHostInfo(String group, Callback<ObjectMap<String>>... callback) {
if (Util.isNull((Object) callback)) throw new NullPointerException(); if (Util.isNull((Object) callback)) throw new NullPointerException();
this.host = host; this.group = group;
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString(); this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(id, callback); callbacks.put(tracker, callback);
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection json = new YAMLSection(); ObjectMap<Integer> json = new ObjectMap<Integer>();
json.set("id", id); json.set(0x0000, tracker);
if (host != null) json.set("host", host); if (group != null) json.set(0x0001, group);
return json; return json;
} }
@SuppressWarnings("unchecked")
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data); for (Callback<ObjectMap<String>> callback : callbacks.get(data.getUUID(0x0000))) callback.run(new ObjectMap<String>((Map<String, ?>) data.getObject(0x0001)));
callbacks.remove(data.getRawString("id")); callbacks.remove(data.getUUID(0x0000));
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.13b"); return 0x0001;
} }
} }

View File

@ -1,47 +1,51 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Log.Logger;
import net.ME1312.Galaxi.Library.NamedContainer; import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Util;
import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.Protocol.PacketOut;
import net.ME1312.SubServers.Host.Network.SubDataClient; import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.ExHost; import net.ME1312.SubServers.Host.ExHost;
import java.lang.reflect.Field;
import java.util.Calendar; import java.util.Calendar;
import java.util.logging.Logger;
public class PacketDownloadLang implements PacketIn, PacketOut { /**
* Download Lang Packet
*/
public class PacketDownloadLang implements PacketObjectIn<Integer>, PacketOut {
private ExHost host; private ExHost host;
private Logger log = null;
public PacketDownloadLang() {}
/**
* New PacketDownloadLang (In)
*
* @param host ExHost
*/
public PacketDownloadLang(ExHost host) { public PacketDownloadLang(ExHost host) {
if (Util.isNull(host)) throw new NullPointerException(); if (Util.isNull(host)) throw new NullPointerException();
this.host = host; this.host = host;
Util.isException(() -> this.log = Util.reflect(SubDataClient.class.getDeclaredField("log"), null));
} }
@Override /**
public YAMLSection generate() { * New PacketDownloadLang (Out)
return null; */
} public PacketDownloadLang() {}
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
Logger log = Util.getDespiteException(() -> Util.reflect(SubDataClient.class.getDeclaredField("log"), client), null);
try { try {
Util.reflect(ExHost.class.getDeclaredField("lang"), host, new NamedContainer<>(Calendar.getInstance().getTime().getTime(), data.getSection("Lang").get())); Util.reflect(ExHost.class.getDeclaredField("lang"), host, new NamedContainer<>(Calendar.getInstance().getTime().getTime(), data.getObject(0x0001)));
log.info.println("Lang Settings Downloaded"); log.info("Lang Settings Downloaded");
} catch (IllegalAccessException | NoSuchFieldException e) { } catch (IllegalAccessException | NoSuchFieldException e) {
log.error.println(e); e.printStackTrace();
} }
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -1,57 +0,0 @@
package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.SubServers.Host.Network.PacketIn;
import net.ME1312.SubServers.Host.Network.PacketOut;
import java.util.HashMap;
import java.util.UUID;
/**
* Download Network List Packet
*/
public class PacketDownloadNetworkList implements PacketIn, PacketOut {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>();
private String id;
/**
* New PacketDownloadNetworkList (In)
*/
public PacketDownloadNetworkList() {}
/**
* New PacketDownloadNetworkList (Out)
*
* @param callback Callbacks
*/
@SafeVarargs
public PacketDownloadNetworkList(Callback<YAMLSection>... callback) {
if (Util.isNull((Object) callback)) throw new NullPointerException();
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString();
callbacks.put(id, callback);
}
@Override
public YAMLSection generate() {
if (id != null) {
YAMLSection data = new YAMLSection();
data.set("id", id);
return data;
} else {
return null;
}
}
@Override
public void execute(YAMLSection data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data);
callbacks.remove(data.getRawString("id"));
}
@Override
public Version getVersion() {
return new Version("2.11.0a");
}
}

View File

@ -1,49 +1,50 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; 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.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
/** /**
* Download Platform Info Packet * Download Proxy Info Packet
*/ */
public class PacketDownloadPlatformInfo implements PacketIn, PacketOut { public class PacketDownloadPlatformInfo implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>(); private static HashMap<UUID, Callback<ObjectMap<String>>[]> callbacks = new HashMap<UUID, Callback<ObjectMap<String>>[]>();
private String id; private UUID tracker;
/** /**
* New PacketDownloadPlatformInfo * New PacketDownloadPlatformInfo
* *
* @param callback Callbacks * @param callback Callbacks
*/ */
@SafeVarargs @SafeVarargs
public PacketDownloadPlatformInfo(Callback<YAMLSection>... callback) { public PacketDownloadPlatformInfo(Callback<ObjectMap<String>>... callback) {
if (Util.isNull((Object) callback)) throw new NullPointerException(); if (Util.isNull((Object) callback)) throw new NullPointerException();
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString(); this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(id, callback); callbacks.put(tracker, callback);
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection data = new YAMLSection(); ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set("id", id); data.set(0x0000, tracker);
return data; return data;
} }
@SuppressWarnings("unchecked")
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data); for (Callback<ObjectMap<String>> callback : callbacks.get(data.getUUID(0x0000))) callback.run(new ObjectMap<String>((Map<String, ?>) data.getObject(0x0001)));
callbacks.remove(data.getRawString("id")); callbacks.remove(data.getUUID(0x0000));
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -1,57 +1,51 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; 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.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
/** /**
* Download Player List Packet * Download Player List Packet
*/ */
public class PacketDownloadPlayerList implements PacketIn, PacketOut { public class PacketDownloadPlayerList implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>(); private static HashMap<UUID, Callback<ObjectMap<String>>[]> callbacks = new HashMap<UUID, Callback<ObjectMap<String>>[]>();
private String id; private UUID tracker;
/** /**
* New PacketDownloadPlayerList (In) * New PacketDownloadPlayerList
*/
public PacketDownloadPlayerList() {}
/**
* New PacketDownloadPlayerList (Out)
* *
* @param callback Callbacks * @param callback Callbacks
*/ */
@SafeVarargs @SafeVarargs
public PacketDownloadPlayerList(Callback<YAMLSection>... callback) { public PacketDownloadPlayerList(Callback<ObjectMap<String>>... callback) {
if (Util.isNull((Object) callback)) throw new NullPointerException(); if (Util.isNull((Object) callback)) throw new NullPointerException();
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString(); this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(id, callback); callbacks.put(tracker, callback);
}
@Override
public YAMLSection generate() {
if (id != null) {
YAMLSection data = new YAMLSection();
data.set("id", id);
return data;
} else {
return null;
}
} }
@Override @Override
public void execute(YAMLSection data) { public ObjectMap<Integer> send(SubDataClient client) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data); ObjectMap<Integer> json = new ObjectMap<Integer>();
callbacks.remove(data.getRawString("id")); json.set(0x0000, tracker);
return json;
}
@SuppressWarnings("unchecked")
@Override
public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<ObjectMap<String>> callback : callbacks.get(data.getUUID(0x0000))) callback.run(new ObjectMap<String>((Map<String, ?>) data.getObject(0x0001)));
callbacks.remove(data.getUUID(0x0000));
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -1,22 +1,24 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Util;
import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
/** /**
* Download Proxy Info Packet * Download Proxy Info Packet
*/ */
public class PacketDownloadProxyInfo implements PacketIn, PacketOut { public class PacketDownloadProxyInfo implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>(); private static HashMap<UUID, NamedContainer<Boolean, Callback<ObjectMap<String>>[]>> callbacks = new HashMap<UUID, NamedContainer<Boolean, Callback<ObjectMap<String>>[]>>();
private String proxy; private String proxy;
private String id; private UUID tracker;
/** /**
* New PacketDownloadProxyInfo (In) * New PacketDownloadProxyInfo (In)
@ -30,29 +32,35 @@ public class PacketDownloadProxyInfo implements PacketIn, PacketOut {
* @param callback Callbacks * @param callback Callbacks
*/ */
@SafeVarargs @SafeVarargs
public PacketDownloadProxyInfo(String proxy, Callback<YAMLSection>... callback) { public PacketDownloadProxyInfo(String proxy, Callback<ObjectMap<String>>... callback) {
if (Util.isNull((Object) callback)) throw new NullPointerException(); if (Util.isNull((Object) callback)) throw new NullPointerException();
this.proxy = proxy; this.proxy = proxy;
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString(); this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(id, callback); callbacks.put(tracker, new NamedContainer<>(proxy != null && proxy.length() <= 0, callback));
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection json = new YAMLSection(); ObjectMap<Integer> json = new ObjectMap<Integer>();
json.set("id", id); json.set(0x0000, tracker);
if (proxy != null) json.set("proxy", proxy); if (proxy != null) json.set(0x0001, proxy);
return json; return json;
} }
@SuppressWarnings("unchecked")
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data); boolean mode = callbacks.get(data.getUUID(0x0000)).name();
callbacks.remove(data.getRawString("id")); for (Callback<ObjectMap<String>> callback : callbacks.get(data.getUUID(0x0000)).get()) {
if (mode) {
callback.run((data.contains(0x0002))?new ObjectMap<String>((Map<String, ?>) data.getObject(0x0002)):null);
} else callback.run(new ObjectMap<String>((Map<String, ?>) data.getObject(0x0001)));
}
callbacks.remove(data.getUUID(0x0000));
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.13b"); return 0x0001;
} }
} }

View File

@ -1,22 +1,23 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; 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.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
import java.util.UUID; import java.util.UUID;
/** /**
* Download Server Info Packet * Download Server Info Packet
*/ */
public class PacketDownloadServerInfo implements PacketIn, PacketOut { public class PacketDownloadServerInfo implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>(); private static HashMap<UUID, Callback<ObjectMap<String>>[]> callbacks = new HashMap<UUID, Callback<ObjectMap<String>>[]>();
private String server; private String server;
private String id; private UUID tracker;
/** /**
* New PacketDownloadServerInfo (In) * New PacketDownloadServerInfo (In)
@ -30,29 +31,30 @@ public class PacketDownloadServerInfo implements PacketIn, PacketOut {
* @param callback Callbacks * @param callback Callbacks
*/ */
@SafeVarargs @SafeVarargs
public PacketDownloadServerInfo(String server, Callback<YAMLSection>... callback) { public PacketDownloadServerInfo(String server, Callback<ObjectMap<String>>... callback) {
if (Util.isNull((Object) callback)) throw new NullPointerException(); if (Util.isNull((Object) callback)) throw new NullPointerException();
this.server = server; this.server = server;
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString(); this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(id, callback); callbacks.put(tracker, callback);
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection json = new YAMLSection(); ObjectMap<Integer> json = new ObjectMap<Integer>();
json.set("id", id); json.set(0x0000, tracker);
if (server != null) json.set("server", server); if (server != null) json.set(0x0001, server);
return json; return json;
} }
@SuppressWarnings("unchecked")
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data); for (Callback<ObjectMap<String>> callback : callbacks.get(data.getUUID(0x0000))) callback.run(new ObjectMap<String>((Map<String, ?>) data.getObject(0x0001)));
callbacks.remove(data.getRawString("id")); callbacks.remove(data.getUUID(0x0000));
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.13b"); return 0x0001;
} }
} }

View File

@ -0,0 +1,70 @@
package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap;
import java.util.UUID;
/**
* Edit Server Packet
*/
public class PacketEditServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<UUID, Callback<ObjectMap<Integer>>[]> callbacks = new HashMap<UUID, Callback<ObjectMap<Integer>>[]>();
private UUID player;
private String server;
private ObjectMap<String> edit;
private boolean perma;
private UUID tracker;
/**
* New PacketEditServer (In)
*/
public PacketEditServer() {}
/**
* New PacketEditServer (Out)
*
* @param player Player Editing
* @param server Server
* @param edit Edits
* @param perma Save Changes
* @param callback Callbacks
*/
@SafeVarargs
public PacketEditServer(UUID player, String server, ObjectMap<String> edit, boolean perma, Callback<ObjectMap<Integer>>... callback) {
if (Util.isNull(server, callback)) throw new NullPointerException();
this.player = player;
this.server = server;
this.edit = edit;
this.perma = perma;
this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(tracker, callback);
}
@Override
public ObjectMap<Integer> send(SubDataClient client) {
ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set(0x0000, tracker);
data.set(0x0001, server);
data.set(0x0002, edit);
data.set(0x0003, perma);
if (player != null) data.set(0x0004, player.toString());
return data;
}
@Override
public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<ObjectMap<Integer>> callback : callbacks.get(data.getUUID(0x0000))) callback.run(data);
callbacks.remove(data.getUUID(0x0000));
}
@Override
public int version() {
return 0x0001;
}
}

View File

@ -1,85 +1,87 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import com.dosse.upnp.UPnP; import com.dosse.upnp.UPnP;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Log.Logger;
import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Util;
import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.Executable.SubServer; import net.ME1312.SubServers.Host.Executable.SubServer;
import net.ME1312.SubServers.Host.Network.PacketIn;
import net.ME1312.SubServers.Host.Network.PacketOut;
import net.ME1312.SubServers.Host.Network.SubDataClient;
import net.ME1312.SubServers.Host.ExHost; import net.ME1312.SubServers.Host.ExHost;
import java.lang.reflect.Field;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Logger;
/** /**
* Create Server Packet * Create Server Packet
*/ */
public class PacketExAddServer implements PacketIn, PacketOut { public class PacketExAddServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private ExHost host; private ExHost host;
private int response; private int response;
private String message; private UUID tracker;
private String id;
private Logger log = null;
/** /**
* New PacketExAddServer (In) * New PacketExAddServer (In)
* *
* @param host SubPlugin * @param host ExHost
*/ */
public PacketExAddServer(ExHost host) { public PacketExAddServer(ExHost host) {
if (Util.isNull(host)) throw new NullPointerException(); if (Util.isNull(host)) throw new NullPointerException();
this.host = host; this.host = host;
Util.isException(() -> this.log = Util.reflect(SubDataClient.class.getDeclaredField("log"), null));
} }
/** /**
* New PacketExAddServer (Out) * New PacketExAddServer (Out)
* *
* @param response Response ID * @param response Response ID
* @param message Message * @param tracker Receiver ID
* @param id Receiver ID
*/ */
public PacketExAddServer(int response, String message, String id) { public PacketExAddServer(int response, UUID tracker) {
if (Util.isNull(response, message)) throw new NullPointerException(); if (Util.isNull(response)) throw new NullPointerException();
this.response = response; this.response = response;
this.message = message; this.tracker = tracker;
this.id = id;
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection data = new YAMLSection(); ObjectMap<Integer> data = new ObjectMap<Integer>();
if (id != null) data.set("id", id); if (tracker != null) data.set(0x0000, tracker);
data.set("r", response); data.set(0x0001, response);
data.set("m", message);
return data; return data;
} }
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
Logger logger = Util.getDespiteException(() -> Util.reflect(SubDataClient.class.getDeclaredField("log"), client), null);
UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null);
try { try {
if (host.servers.keySet().contains(data.getSection("server").getRawString("name").toLowerCase())) { String name = data.getRawString(0x0001);
host.subdata.sendPacket(new PacketExAddServer(0, "Server Already Added", (data.contains("id"))?data.getRawString("id"):null)); boolean enabled = data.getBoolean(0x0002);
int port = data.getInt(0x0003);
boolean log = data.getBoolean(0x0004);
String dir = data.getRawString(0x0005);
String exec = data.getRawString(0x0006);
String stopcmd = data.getRawString(0x0007);
UUID running = data.contains(0x0008)?data.getUUID(0x0008):null;
if (host.servers.keySet().contains(name.toLowerCase())) {
client.sendPacket(new PacketExAddServer(1, tracker));
} else { } else {
SubServer server = new SubServer(host, data.getSection("server").getRawString("name"), data.getSection("server").getBoolean("enabled"), data.getSection("server").getInt("port"), data.getSection("server").getBoolean("log"), SubServer server = new SubServer(host, name, enabled, port, log, dir, exec, stopcmd);
data.getSection("server").getRawString("dir"), data.getSection("server").getRawString("exec"), data.getSection("server").getRawString("stopcmd")); host.servers.put(name.toLowerCase(), server);
host.servers.put(data.getSection("server").getRawString("name").toLowerCase(), server); if (UPnP.isUPnPAvailable() && host.config.get().getMap("Settings").getMap("UPnP", new ObjectMap<String>()).getBoolean("Forward-Servers", false)) UPnP.openPortTCP(server.getPort());
if (UPnP.isUPnPAvailable() && host.config.get().getSection("Settings").getSection("UPnP", new YAMLSection()).getBoolean("Forward-Servers", false)) UPnP.openPortTCP(server.getPort()); logger.info("Added SubServer: " + name);
log.info.println("Added SubServer: " + data.getSection("server").getRawString("name")); if (running != null) server.start(running);
if (data.getSection("server").contains("running")) server.start(data.getSection("server").getUUID("running")); client.sendPacket(new PacketExAddServer(0, tracker));
host.subdata.sendPacket(new PacketExAddServer(0, "Server Added Successfully", (data.contains("id"))?data.getRawString("id"):null));
} }
} catch (Throwable e) { } catch (Throwable e) {
host.subdata.sendPacket(new PacketExAddServer(1, e.getClass().getCanonicalName() + ": " + e.getMessage(), (data.contains("id"))?data.getRawString("id"):null)); client.sendPacket(new PacketExAddServer(2, tracker));
host.log.error.println(e); host.log.error.println(e);
} }
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.13.1b"); return 0x0001;
} }
} }

View File

@ -1,74 +1,69 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Engine.GalaxiEngine; import net.ME1312.Galaxi.Engine.GalaxiEngine;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Log.Logger;
import net.ME1312.Galaxi.Library.UniversalFile; import net.ME1312.Galaxi.Library.UniversalFile;
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.Protocol.Initial.InitialPacket;
import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubData.Client.Protocol.PacketOut;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.Executable.SubCreator; import net.ME1312.SubServers.Host.Executable.SubCreator;
import net.ME1312.SubServers.Host.Network.PacketIn;
import net.ME1312.SubServers.Host.Network.PacketOut;
import net.ME1312.SubServers.Host.Network.SubDataClient;
import net.ME1312.SubServers.Host.ExHost; import net.ME1312.SubServers.Host.ExHost;
import org.msgpack.value.Value;
import java.io.ByteArrayInputStream; import java.util.Map;
import java.lang.reflect.Field;
/** /**
* External Host Configuration Packet * External Host Configuration Packet
*/ */
public class PacketExConfigureHost implements PacketIn, PacketOut { public class PacketExConfigureHost implements PacketObjectIn<Integer>, PacketOut {
private static boolean first = false; private static boolean first = false;
private ExHost host; private ExHost host;
private Logger log = null;
/** /**
* New PacketExConfigureHost * New PacketExConfigureHost
*/ */
public PacketExConfigureHost(ExHost host) { public PacketExConfigureHost(ExHost host) {
this.host = host; this.host = host;
Util.isException(() -> this.log = Util.reflect(SubDataClient.class.getDeclaredField("log"), null));
} }
@Override @Override
public YAMLSection generate() { public void sending(SubDataClient client) {
host.log.info.println("Downloading Host Settings..."); host.log.info.println("Downloading Host Settings...");
first = true; first = true;
return null;
} }
@SuppressWarnings("unchecked")
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
host.host = data.getSection("host").clone(); host.host = new ObjectMap<>((Map<String, ?>) data.getObject(0x0000));
for (SubCreator.ServerTemplate template : host.templates.values()) { for (SubCreator.ServerTemplate template : host.templates.values()) {
Util.deleteDirectory(template.getDirectory()); Util.deleteDirectory(template.getDirectory());
} }
host.templates.clear(); host.templates.clear();
UniversalFile templates = new UniversalFile(GalaxiEngine.getInstance().getRuntimeDirectory(), "Templates"); UniversalFile templatedir = new UniversalFile(GalaxiEngine.getInstance().getRuntimeDirectory(), "Templates");
Util.deleteDirectory(templates); ObjectMap<String> templates = new ObjectMap<>((Map<String, ?>) data.getObject(0x0001));
templates.mkdirs(); Util.deleteDirectory(templatedir);
for (String name : data.getSection("templates").getKeys()) { templatedir.mkdirs();
for (String name : templates.getKeys()) {
try { try {
UniversalFile dir = new UniversalFile(templates, name); UniversalFile dir = new UniversalFile(templatedir, name);
dir.mkdirs(); SubCreator.ServerTemplate template = new SubCreator.ServerTemplate(name, templates.getMap(name).getBoolean("enabled"), templates.getMap(name).getRawString("icon"), dir,
Util.unzip(new ByteArrayInputStream(((Value) data.getSection("templates").getSection(name).getObject("files")).asBinaryValue().asByteArray()), dir); templates.getMap(name).getMap("build").clone(), templates.getMap(name).getMap("settings").clone());
SubCreator.ServerTemplate template = new SubCreator.ServerTemplate(name, data.getSection("templates").getSection(name).getBoolean("enabled"), data.getSection("templates").getSection(name).getRawString("icon"), dir,
data.getSection("templates").getSection(name).getSection("build").clone(), data.getSection("templates").getSection(name).getSection("settings").clone());
host.templates.put(name.toLowerCase(), template); host.templates.put(name.toLowerCase(), template);
if (!data.getSection("templates").getSection(name).getRawString("display").equals(name)) template.setDisplayName(data.getSection("templates").getSection(name).getRawString("display")); if (!templates.getMap(name).getRawString("display").equals(name)) template.setDisplayName(templates.getMap(name).getRawString("display"));
} catch (Exception e) { } catch (Exception e) {
host.log.error.println("Couldn't load template: " + name); host.log.error.println("Couldn't load template: " + name);
host.log.error.println(e); host.log.error.println(e);
} }
} }
log.info.println(((first)?"":"New ") + "Host Settings Downloaded"); host.log.info.println(((first)?"":"New ") + "Host Settings Downloaded");
first = false; first = false;
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -1,10 +1,11 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Config.YAMLSection; 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.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.ExHost; import net.ME1312.SubServers.Host.ExHost;
import java.util.UUID; import java.util.UUID;
@ -12,17 +13,17 @@ import java.util.UUID;
/** /**
* Create Server Packet * Create Server Packet
*/ */
public class PacketExCreateServer implements PacketIn, PacketOut { public class PacketExCreateServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private ExHost host; private ExHost host;
private int response; private int response;
private String message; private String message;
private YAMLSection info; private ObjectMap<String> info;
private String id; private UUID tracker;
/** /**
* New PacketExCreateServer (In) * New PacketExCreateServer (In)
* *
* @param host SubPlugin * @param host ExHost
*/ */
public PacketExCreateServer(ExHost host) { public PacketExCreateServer(ExHost host) {
if (Util.isNull(host)) throw new NullPointerException(); if (Util.isNull(host)) throw new NullPointerException();
@ -35,44 +36,54 @@ public class PacketExCreateServer implements PacketIn, PacketOut {
* @param response Response ID * @param response Response ID
* @param message Message * @param message Message
* @param info Creator Info * @param info Creator Info
* @param id Receiver ID * @param tracker Receiver ID
*/ */
public PacketExCreateServer(int response, String message, YAMLSection info, String id) { public PacketExCreateServer(int response, String message, ObjectMap<String> info, UUID tracker) {
if (Util.isNull(response, message)) throw new NullPointerException(); if (Util.isNull(response)) throw new NullPointerException();
this.response = response; this.response = response;
this.message = message; this.message = message;
this.info = info; this.info = info;
this.id = id; this.tracker = tracker;
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection data = new YAMLSection(); ObjectMap<Integer> data = new ObjectMap<Integer>();
if (id != null) data.set("id", id); if (tracker != null) data.set(0x0000, tracker);
data.set("r", response); data.set(0x0001, response);
data.set("m", message); data.set(0x0002, info);
data.set("c", info); if (message != null) data.set(0x0003, message);
return data; return data;
} }
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null);
try { try {
host.creator.create(data.getSection("creator").getRawString("name"), host.templates.get(data.getSection("creator").getRawString("template").toLowerCase()), data.getSection("creator").getVersion("version"), if (data.contains(0x0001)) {
data.getSection("creator").getInt("port"), data.getSection("creator").getUUID("log"), (data.contains("id"))?data.getRawString("id"):null); if (data.contains(0x0001)) {
} catch (Throwable e) { host.creator.terminate(data.getRawString(0x0001).toLowerCase());
if (data.contains("thread")) { } else {
host.creator.terminate(data.getRawString("thread").toLowerCase()); host.creator.terminate();
}
client.sendPacket(new PacketExCreateServer(1, null, null, tracker));
} else { } else {
host.creator.terminate(); String name = data.getRawString(0x0002);
String template = data.getRawString(0x0003);
Version version = (data.contains(0x0004)?data.getVersion(0x0004):null);
Integer port = data.getInt(0x0005);
UUID log = data.getUUID(0x0006);
host.creator.create(name, host.templates.get(template.toLowerCase()), version,
port, log, tracker);
} }
host.subdata.sendPacket(new PacketExCreateServer(1, e.getClass().getCanonicalName() + ": " + e.getMessage(), null, (data.contains("id"))?data.getRawString("id"):null)); } catch (Throwable e) {
host.log.error.println(e); host.log.error.println(e);
} }
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -3,115 +3,120 @@ package net.ME1312.SubServers.Host.Network.Packet;
import com.dosse.upnp.UPnP; import com.dosse.upnp.UPnP;
import net.ME1312.Galaxi.Engine.GalaxiEngine; import net.ME1312.Galaxi.Engine.GalaxiEngine;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Log.Logger; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.UniversalFile; import net.ME1312.Galaxi.Library.UniversalFile;
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.Protocol.PacketObjectIn;
import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.Executable.SubServer; import net.ME1312.SubServers.Host.Executable.SubServer;
import net.ME1312.SubServers.Host.Network.PacketIn;
import net.ME1312.SubServers.Host.Network.PacketOut;
import net.ME1312.SubServers.Host.Network.SubDataClient;
import net.ME1312.SubServers.Host.ExHost; import net.ME1312.SubServers.Host.ExHost;
import net.ME1312.SubServers.Host.SubAPI; import net.ME1312.SubServers.Host.SubAPI;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
import java.lang.reflect.Field; import java.util.Map;
import java.util.UUID;
import java.util.logging.Logger;
/** /**
* Create Server Packet * Create Server Packet
*/ */
public class PacketExDeleteServer implements PacketIn, PacketOut { public class PacketExDeleteServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private ExHost host; private ExHost host;
private int response; private int response;
private String message; private UUID tracker;
private String id;
private Logger log = null;
/** /**
* New PacketExDeleteServer (In) * New PacketExDeleteServer (In)
* *
* @param host SubPlugin * @param host ExHost
*/ */
public PacketExDeleteServer(ExHost host) { public PacketExDeleteServer(ExHost host) {
if (Util.isNull(host)) throw new NullPointerException(); if (Util.isNull(host)) throw new NullPointerException();
this.host = host; this.host = host;
Util.isException(() -> this.log = Util.reflect(SubDataClient.class.getDeclaredField("log"), null));
} }
/** /**
* New PacketExDeleteServer (Out) * New PacketExDeleteServer (Out)
* *
* @param response Response ID * @param response Response ID
* @param message Message * @param tracker Receiver ID
* @param id Receiver ID
*/ */
public PacketExDeleteServer(int response, String message, String id) { public PacketExDeleteServer(int response, UUID tracker) {
if (Util.isNull(response, message)) throw new NullPointerException(); if (Util.isNull(response)) throw new NullPointerException();
this.response = response; this.response = response;
this.message = message; this.tracker = tracker;
this.id = id;
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection data = new YAMLSection(); ObjectMap<Integer> data = new ObjectMap<Integer>();
if (id != null) data.set("id", id); if (tracker != null) data.set(0x0000, tracker);
data.set("r", response); data.set(0x0001, response);
data.set("m", message);
return data; return data;
} }
@SuppressWarnings("unchecked")
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
Logger log = Util.getDespiteException(() -> Util.reflect(SubDataClient.class.getDeclaredField("log"), client), null);
UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null);
try { try {
if (!host.servers.keySet().contains(data.getRawString("server").toLowerCase())) { String name = data.getRawString(0x0001);
host.subdata.sendPacket(new PacketExDeleteServer(0, "Server Didn't Exist", (data.contains("id"))?data.getRawString("id"):null)); YAMLSection info = new YAMLSection((Map<String, ?>) data.getObject(0x0002));
} else if (host.servers.get(data.getRawString("server").toLowerCase()).isRunning()) { boolean recycle = data.getBoolean(0x0003, false);
host.subdata.sendPacket(new PacketExDeleteServer(2, "That server is still running.", (data.contains("id"))?data.getRawString("id"):null));
if (!host.servers.keySet().contains(name.toLowerCase())) {
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExDeleteServer(1, tracker));
} else if (host.servers.get(name.toLowerCase()).isRunning()) {
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExDeleteServer(3, tracker));
} else { } else {
SubServer server = host.servers.get(data.getRawString("server").toLowerCase()); SubServer server = host.servers.get(name.toLowerCase());
host.servers.remove(data.getRawString("server").toLowerCase()); host.servers.remove(name.toLowerCase());
new Thread(() -> { new Thread(() -> {
UniversalFile to = new UniversalFile(GalaxiEngine.getInstance().getRuntimeDirectory(), "Recently Deleted:" + server.getName().toLowerCase()); UniversalFile to = new UniversalFile(GalaxiEngine.getInstance().getRuntimeDirectory(), "Recently Deleted:" + server.getName().toLowerCase());
try { try {
File from = new File(host.host.getRawString("Directory"), server.getDirectory()); File from = new File(host.host.getRawString("Directory"), server.getDirectory());
if (from.exists()) { if (from.exists()) {
log.info.println("Removing Files..."); log.info("Removing Files...");
if (to.exists()) { if (recycle) {
if (to.isDirectory()) Util.deleteDirectory(to); if (to.exists()) {
else to.delete(); if (to.isDirectory()) Util.deleteDirectory(to);
else to.delete();
}
to.mkdirs();
Util.copyDirectory(from, to);
} }
to.mkdirs();
Util.copyDirectory(from, to);
Util.deleteDirectory(from); Util.deleteDirectory(from);
} }
} catch (Exception e) { } catch (Exception e) {
log.error.println(e); SubAPI.getInstance().getAppInfo().getLogger().error.println(e);
} }
log.info.println("Saving..."); log.info("Saving...");
try { if (recycle) try {
if (!to.exists()) to.mkdirs(); if (!to.exists()) to.mkdirs();
FileWriter writer = new FileWriter(new File(to, "info.json")); FileWriter writer = new FileWriter(new File(to, "info.json"));
data.getSection("info").toJSON().write(writer); info.toJSON().write(writer);
writer.close(); writer.close();
} catch (Exception e) { } catch (Exception e) {
log.error.println(e); SubAPI.getInstance().getAppInfo().getLogger().error.println(e);
} }
if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(server.getPort())) UPnP.closePortTCP(server.getPort()); if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(server.getPort())) UPnP.closePortTCP(server.getPort());
log.info.println("Deleted SubServer: " + data.getRawString("server")); log.info("Deleted SubServer: " + name);
host.subdata.sendPacket(new PacketExDeleteServer(0, "Server Deleted Successfully", (data.contains("id"))?data.getRawString("id"):null)); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExDeleteServer(0, tracker));
}, SubAPI.getInstance().getAppInfo().getName() + "::Server_Deletion(" + server.getName() + ')').start(); }, SubAPI.getInstance().getAppInfo().getName() + "::Server_Deletion(" + server.getName() + ')').start();
} }
} catch (Throwable e) { } catch (Throwable e) {
host.subdata.sendPacket(new PacketExDeleteServer(1, e.getClass().getCanonicalName() + ": " + e.getMessage(), (data.contains("id"))?data.getRawString("id"):null)); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExDeleteServer(2, tracker));
host.log.error.println(e); host.log.error.println(e);
} }
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -0,0 +1,50 @@
package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Engine.GalaxiEngine;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.UniversalFile;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.Protocol.PacketOut;
import net.ME1312.SubData.Client.Protocol.PacketStreamIn;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.ExHost;
import net.ME1312.SubServers.Host.SubAPI;
import java.io.InputStream;
/**
* External Host Template Download Packet
*/
public class PacketExDownloadTemplates implements PacketOut, PacketStreamIn {
private ExHost host;
/**
* New PacketExDownloadTemplates
*/
public PacketExDownloadTemplates(ExHost host) {
this.host = host;
}
@Override
public void sending(SubDataClient client) throws Throwable {
UniversalFile dir = new UniversalFile(GalaxiEngine.getInstance().getRuntimeDirectory(), "Templates");
if (dir.exists()) Util.deleteDirectory(dir);
host.log.info.println("Downloading Template Files...");
}
@Override
public void receive(SubDataClient client, InputStream stream) {
try {
Util.unzip(stream, new UniversalFile(GalaxiEngine.getInstance().getRuntimeDirectory(), "Templates"));
host.log.info.println("Template Files Downloaded");
} catch (Exception e) {
SubAPI.getInstance().getAppInfo().getLogger().error.println("Problem decoding template files");
SubAPI.getInstance().getAppInfo().getLogger().error.println(e);
}
}
@Override
public int version() {
return 0x0001;
}
}

View File

@ -1,83 +1,81 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import com.dosse.upnp.UPnP; import com.dosse.upnp.UPnP;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Log.Logger;
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.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Host.Network.SubDataClient; import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.ExHost; import net.ME1312.SubServers.Host.ExHost;
import net.ME1312.SubServers.Host.SubAPI;
import java.lang.reflect.Field; import java.util.UUID;
import java.util.logging.Logger;
/** /**
* Create Server Packet * Create Server Packet
*/ */
public class PacketExRemoveServer implements PacketIn, PacketOut { public class PacketExRemoveServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private ExHost host; private ExHost host;
private int response; private int response;
private String message; private UUID tracker;
private String id;
private Logger log = null;
/** /**
* New PacketExRemoveServer (In) * New PacketExRemoveServer (In)
* *
* @param host SubPlugin * @param host ExHost
*/ */
public PacketExRemoveServer(ExHost host) { public PacketExRemoveServer(ExHost host) {
if (Util.isNull(host)) throw new NullPointerException(); if (Util.isNull(host)) throw new NullPointerException();
this.host = host; this.host = host;
Util.isException(() -> this.log = Util.reflect(SubDataClient.class.getDeclaredField("log"), null));
} }
/** /**
* New PacketExRemoveServer (Out) * New PacketExRemoveServer (Out)
* *
* @param response Response ID * @param response Response ID
* @param message Message * @param tracker Receiver ID
* @param id Receiver ID
*/ */
public PacketExRemoveServer(int response, String message, String id) { public PacketExRemoveServer(int response, UUID tracker) {
if (Util.isNull(response, message)) throw new NullPointerException(); if (Util.isNull(response)) throw new NullPointerException();
this.response = response; this.response = response;
this.message = message; this.tracker = tracker;
this.id = id;
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection data = new YAMLSection(); ObjectMap<Integer> data = new ObjectMap<Integer>();
if (id != null) data.set("id", id); if (tracker != null) data.set(0x0000, tracker);
data.set("r", response); data.set(0x0001, response);
data.set("m", message);
return data; return data;
} }
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
Logger log = Util.getDespiteException(() -> Util.reflect(SubDataClient.class.getDeclaredField("log"), client), null);
UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null);
try { try {
if (!host.servers.keySet().contains(data.getRawString("server").toLowerCase())) { String name = data.getRawString(0x0001);
host.subdata.sendPacket(new PacketExRemoveServer(0, "Server Didn't Exist", (data.contains("id"))?data.getRawString("id"):null)); if (!host.servers.keySet().contains(name.toLowerCase())) {
} else if (host.servers.get(data.getRawString("server").toLowerCase()).isRunning()) { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExRemoveServer(1, tracker));
host.subdata.sendPacket(new PacketExRemoveServer(2, "That server is still running.", (data.contains("id"))?data.getRawString("id"):null)); } else if (host.servers.get(name.toLowerCase()).isRunning()) {
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExRemoveServer(3, tracker));
} else { } else {
if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(host.servers.get(data.getRawString("server").toLowerCase()).getPort())) if (UPnP.isUPnPAvailable() && UPnP.isMappedTCP(host.servers.get(name.toLowerCase()).getPort()))
UPnP.closePortTCP(host.servers.get(data.getRawString("server").toLowerCase()).getPort()); UPnP.closePortTCP(host.servers.get(name.toLowerCase()).getPort());
host.servers.remove(data.getRawString("server").toLowerCase()); host.servers.remove(name.toLowerCase());
log.info.println("Removed SubServer: " + data.getRawString("server")); log.info("Removed SubServer: " + name);
host.subdata.sendPacket(new PacketExRemoveServer(0, "Server Removed Successfully", (data.contains("id"))?data.getRawString("id"):null)); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExRemoveServer(0, tracker));
} }
} catch (Throwable e) { } catch (Throwable e) {
host.subdata.sendPacket(new PacketExRemoveServer(1, e.getClass().getCanonicalName() + ": " + e.getMessage(), (data.contains("id"))?data.getRawString("id"):null)); ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketExRemoveServer(2, tracker));
host.log.error.println(e); host.log.error.println(e);
} }
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -1,10 +1,11 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.Executable.SubServer; import net.ME1312.SubServers.Host.Executable.SubServer;
import net.ME1312.SubServers.Host.Network.PacketIn;
import net.ME1312.SubServers.Host.Network.PacketOut;
import net.ME1312.SubServers.Host.ExHost; import net.ME1312.SubServers.Host.ExHost;
import java.util.Arrays; import java.util.Arrays;
@ -13,7 +14,7 @@ import java.util.UUID;
/** /**
* Update Server Packet * Update Server Packet
*/ */
public class PacketExUpdateServer implements PacketIn, PacketOut { public class PacketExUpdateServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private ExHost host; private ExHost host;
private SubServer server; private SubServer server;
private UpdateType type; private UpdateType type;
@ -43,7 +44,7 @@ public class PacketExUpdateServer implements PacketIn, PacketOut {
/** /**
* New PacketExUpdateServer (In) * New PacketExUpdateServer (In)
* @param host SubPlugin * @param host ExHost
*/ */
public PacketExUpdateServer(ExHost host) { public PacketExUpdateServer(ExHost host) {
this.host = host; this.host = host;
@ -68,27 +69,27 @@ public class PacketExUpdateServer implements PacketIn, PacketOut {
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection data = new YAMLSection(); ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set("server", server.getName()); data.set(0x0000, server.getName());
data.set("type", type.getValue()); data.set(0x0001, type.getValue());
data.set("args", Arrays.asList(args)); data.set(0x0002, Arrays.asList(args));
return data; return data;
} }
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
try { try {
SubServer server = host.servers.get(data.getString("server").toLowerCase()); SubServer server = host.servers.get(data.getString(0x0000).toLowerCase());
switch (data.getInt("type")) { switch (data.getInt(0x0001)) {
case 0: case 0:
server.setEnabled(data.getList("args").get(0).asBoolean()); server.setEnabled(data.getList(0x0002).get(0).asBoolean());
break; break;
case 1: case 1:
server.start(data.getList("args").get(0).asUUID()); server.start(data.getList(0x0002).get(0).asUUID());
break; break;
case 2: case 2:
server.command(data.getList("args").get(0).asRawString()); server.command(data.getList(0x0002).get(0).asRawString());
break; break;
case 3: case 3:
server.stop(); server.stop();
@ -97,10 +98,10 @@ public class PacketExUpdateServer implements PacketIn, PacketOut {
server.terminate(); server.terminate();
break; break;
case 5: case 5:
server.setLogging(data.getList("args").get(0).asBoolean()); server.setLogging(data.getList(0x0002).get(0).asBoolean());
break; break;
case 6: case 6:
server.setStopCommand(data.getList("args").get(0).asRawString()); server.setStopCommand(data.getList(0x0002).get(0).asRawString());
break; break;
} }
} catch (Exception e) { } catch (Exception e) {
@ -109,7 +110,7 @@ public class PacketExUpdateServer implements PacketIn, PacketOut {
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -0,0 +1,44 @@
package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.ExHost;
import java.util.logging.Logger;
/**
* Reload Packet
*/
public class PacketInExReload implements PacketObjectIn<Integer> {
private ExHost host;
/**
* New PacketInExReload
*
* @param host Plugin
*/
public PacketInExReload(ExHost host) {
this.host = host;
}
@Override
public void receive(SubDataClient client, ObjectMap<Integer> data) {
Logger log = Util.getDespiteException(() -> Util.reflect(SubDataClient.class.getDeclaredField("log"), client), null);
if (data != null && data.contains(0x0000)) log.warning("Received request for a plugin reload: " + data.getString(0x0000));
else log.warning("Received request for a plugin reload");
new Thread(() -> {
try {
host.reload(true);
} catch (Exception e) {
e.printStackTrace();
}
}, "SubServers.Host::Network_Reload_Handler").start();
}
@Override
public int version() {
return 0x0001;
}
}

View File

@ -1,8 +1,8 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.ExHost; import net.ME1312.SubServers.Host.ExHost;
import java.util.ArrayList; import java.util.ArrayList;
@ -11,15 +11,15 @@ import java.util.List;
/** /**
* Reset Packet * Reset Packet
*/ */
public class PacketInReset implements PacketIn { public class PacketInExReset implements PacketObjectIn<Integer> {
private ExHost host; private ExHost host;
public PacketInReset(ExHost host) { public PacketInExReset(ExHost host) {
this.host = host; this.host = host;
} }
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
List<String> subservers = new ArrayList<String>(); List<String> subservers = new ArrayList<String>();
subservers.addAll(host.servers.keySet()); subservers.addAll(host.servers.keySet());
@ -43,7 +43,7 @@ public class PacketInReset implements PacketIn {
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -1,135 +1,135 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Engine.GalaxiEngine; import net.ME1312.Galaxi.Engine.GalaxiEngine;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.NamedContainer; import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.Event.*; import net.ME1312.SubServers.Host.Event.*;
import net.ME1312.SubServers.Host.Network.PacketIn;
import net.ME1312.SubServers.Host.SubAPI;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.Map;
/** /**
* Run Event Packet * Run Event Packet
*/ */
public class PacketInRunEvent implements PacketIn { public class PacketInExRunEvent implements PacketObjectIn<Integer> {
private static HashMap<String, List<Callback<YAMLSection>>> callbacks = new HashMap<String, List<Callback<YAMLSection>>>(); private static HashMap<String, List<Callback<ObjectMap<String>>>> callbacks = new HashMap<String, List<Callback<ObjectMap<String>>>>();
/** /**
* New PacketInRunEvent * New PacketInRunEvent
*/ */
public PacketInRunEvent() { public PacketInExRunEvent() {
callback("SubAddHostEvent", new Callback<YAMLSection>() { callback("SubAddHostEvent", new Callback<ObjectMap<String>>() {
@Override @Override
public void run(YAMLSection data) { public void run(ObjectMap<String> data) {
GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubAddHostEvent((data.contains("player"))?data.getUUID("player"):null, data.getRawString("host"))); GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubAddHostEvent((data.contains("player"))?data.getUUID("player"):null, data.getRawString("host")));
callback("SubAddHostEvent", this); callback("SubAddHostEvent", this);
} }
}); });
callback("SubAddProxyEvent", new Callback<YAMLSection>() { callback("SubAddProxyEvent", new Callback<ObjectMap<String>>() {
@Override @Override
public void run(YAMLSection data) { public void run(ObjectMap<String> data) {
GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubAddProxyEvent(data.getRawString("proxy"))); GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubAddProxyEvent(data.getRawString("proxy")));
callback("SubAddProxyEvent", this); callback("SubAddProxyEvent", this);
} }
}); });
callback("SubAddServerEvent", new Callback<YAMLSection>() { callback("SubAddServerEvent", new Callback<ObjectMap<String>>() {
@Override @Override
public void run(YAMLSection data) { public void run(ObjectMap<String> data) {
GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubAddServerEvent((data.contains("player"))?data.getUUID("player"):null, (data.contains("host"))?data.getRawString("host"):null, data.getRawString("server"))); GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubAddServerEvent((data.contains("player"))?data.getUUID("player"):null, (data.contains("host"))?data.getRawString("host"):null, data.getRawString("server")));
callback("SubAddServerEvent", this); callback("SubAddServerEvent", this);
} }
}); });
callback("SubCreateEvent", new Callback<YAMLSection>() { callback("SubCreateEvent", new Callback<ObjectMap<String>>() {
@Override @Override
public void run(YAMLSection data) { public void run(ObjectMap<String> data) {
GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubCreateEvent((data.contains("player"))?data.getUUID("player"):null, data.getRawString("host"), data.getRawString("name"), GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubCreateEvent((data.contains("player"))?data.getUUID("player"):null, data.getRawString("host"), data.getRawString("name"),
data.getRawString("template"), data.getVersion("version"), data.getInt("port"))); data.getRawString("template"), data.getVersion("version"), data.getInt("port")));
callback("SubCreateEvent", this); callback("SubCreateEvent", this);
} }
}); });
callback("SubSendCommandEvent", new Callback<YAMLSection>() { callback("SubSendCommandEvent", new Callback<ObjectMap<String>>() {
@Override @Override
public void run(YAMLSection data) { public void run(ObjectMap<String> data) {
GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubSendCommandEvent((data.contains("player"))?data.getUUID("player"):null, data.getRawString("server"), data.getRawString("command"))); GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubSendCommandEvent((data.contains("player"))?data.getUUID("player"):null, data.getRawString("server"), data.getRawString("command")));
callback("SubSendCommandEvent", this); callback("SubSendCommandEvent", this);
} }
}); });
callback("SubEditServerEvent", new Callback<YAMLSection>() { callback("SubEditServerEvent", new Callback<ObjectMap<String>>() {
@Override @Override
public void run(YAMLSection data) { public void run(ObjectMap<String> data) {
GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubEditServerEvent((data.contains("player"))?data.getUUID("player"):null, data.getRawString("server"), new NamedContainer<String, Object>(data.getRawString("edit"), data.get("value")), data.getBoolean("perm"))); GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubEditServerEvent((data.contains("player"))?data.getUUID("player"):null, data.getRawString("server"), new NamedContainer<String, Object>(data.getRawString("edit"), data.get("value")), data.getBoolean("perm")));
callback("SubEditServerEvent", this); callback("SubEditServerEvent", this);
} }
}); });
callback("SubStartEvent", new Callback<YAMLSection>() { callback("SubStartEvent", new Callback<ObjectMap<String>>() {
@Override @Override
public void run(YAMLSection data) { public void run(ObjectMap<String> data) {
GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubStartEvent((data.contains("player"))?data.getUUID("player"):null, data.getRawString("server"))); GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubStartEvent((data.contains("player"))?data.getUUID("player"):null, data.getRawString("server")));
callback("SubStartEvent", this); callback("SubStartEvent", this);
} }
}); });
callback("SubStopEvent", new Callback<YAMLSection>() { callback("SubStopEvent", new Callback<ObjectMap<String>>() {
@Override @Override
public void run(YAMLSection data) { public void run(ObjectMap<String> data) {
GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubStopEvent((data.contains("player"))?data.getUUID("player"):null, data.getRawString("server"), data.getBoolean("force"))); GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubStopEvent((data.contains("player"))?data.getUUID("player"):null, data.getRawString("server"), data.getBoolean("force")));
callback("SubStopEvent", this); callback("SubStopEvent", this);
} }
}); });
callback("SubStoppedEvent", new Callback<YAMLSection>() { callback("SubStoppedEvent", new Callback<ObjectMap<String>>() {
@Override @Override
public void run(YAMLSection data) { public void run(ObjectMap<String> data) {
GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubStoppedEvent(data.getRawString("server"))); GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubStoppedEvent(data.getRawString("server")));
callback("SubStoppedEvent", this); callback("SubStoppedEvent", this);
} }
}); });
callback("SubRemoveServerEvent", new Callback<YAMLSection>() { callback("SubRemoveServerEvent", new Callback<ObjectMap<String>>() {
@Override @Override
public void run(YAMLSection data) { public void run(ObjectMap<String> data) {
GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubRemoveServerEvent((data.contains("player"))?data.getUUID("player"):null, (data.contains("host"))?data.getRawString("host"):null, data.getRawString("server"))); GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubRemoveServerEvent((data.contains("player"))?data.getUUID("player"):null, (data.contains("host"))?data.getRawString("host"):null, data.getRawString("server")));
callback("SubRemoveServerEvent", this); callback("SubRemoveServerEvent", this);
} }
}); });
callback("SubRemoveProxyEvent", new Callback<YAMLSection>() { callback("SubRemoveProxyEvent", new Callback<ObjectMap<String>>() {
@Override @Override
public void run(YAMLSection data) { public void run(ObjectMap<String> data) {
GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubAddProxyEvent(data.getRawString("proxy"))); GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubAddProxyEvent(data.getRawString("proxy")));
callback("SubRemoveProxyEvent", this); callback("SubRemoveProxyEvent", this);
} }
}); });
callback("SubRemoveHostEvent", new Callback<YAMLSection>() { callback("SubRemoveHostEvent", new Callback<ObjectMap<String>>() {
@Override @Override
public void run(YAMLSection data) { public void run(ObjectMap<String> data) {
GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubRemoveHostEvent((data.contains("player"))?data.getUUID("player"):null, data.getRawString("host"))); GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubRemoveHostEvent((data.contains("player"))?data.getUUID("player"):null, data.getRawString("host")));
callback("SubRemoveHostEvent", this); callback("SubRemoveHostEvent", this);
} }
}); });
} }
@SuppressWarnings("unchecked")
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
if (callbacks.keySet().contains(data.getRawString("type"))) { if (callbacks.keySet().contains(data.getString(0x0000))) {
List<Callback<YAMLSection>> callbacks = PacketInRunEvent.callbacks.get(data.getRawString("type")); List<Callback<ObjectMap<String>>> callbacks = PacketInExRunEvent.callbacks.get(data.getString(0x0000));
PacketInRunEvent.callbacks.remove(data.getRawString("type")); PacketInExRunEvent.callbacks.remove(data.getString(0x0000));
for (Callback<YAMLSection> callback : callbacks) { for (Callback<ObjectMap<String>> callback : callbacks) {
callback.run(data.getSection("args")); callback.run(new ObjectMap<>((Map<String, ?>) data.getObject(0x0001)));
} }
} }
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
public static void callback(String event, Callback<YAMLSection> callback) { public static void callback(String event, Callback<ObjectMap<String>> callback) {
List<Callback<YAMLSection>> callbacks = (PacketInRunEvent.callbacks.keySet().contains(event))?PacketInRunEvent.callbacks.get(event):new ArrayList<Callback<YAMLSection>>(); List<Callback<ObjectMap<String>>> callbacks = (PacketInExRunEvent.callbacks.keySet().contains(event))? PacketInExRunEvent.callbacks.get(event):new ArrayList<Callback<ObjectMap<String>>>();
callbacks.add(callback); callbacks.add(callback);
PacketInRunEvent.callbacks.put(event, callbacks); PacketInExRunEvent.callbacks.put(event, callbacks);
} }
} }

View File

@ -1,39 +0,0 @@
package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Log.Logger;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.SubServers.Host.ExHost;
import net.ME1312.SubServers.Host.Network.PacketIn;
import net.ME1312.SubServers.Host.Network.SubDataClient;
import java.io.IOException;
import java.lang.reflect.Field;
/**
* Reload Packet
*/
public class PacketInReload implements PacketIn {
private ExHost host;
private Logger log;
public PacketInReload(ExHost host) {
this.host = host;
Util.isException(() -> this.log = Util.reflect(SubDataClient.class.getDeclaredField("log"), null));
}
@Override
public void execute(YAMLSection data) {
try {
host.reload();
} catch (IOException e) {
log.error.println(e);
}
}
@Override
public Version getVersion() {
return new Version("2.11.0a");
}
}

View File

@ -1,55 +1,69 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Engine.GalaxiEngine; import net.ME1312.Galaxi.Engine.GalaxiEngine;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Log.Logger;
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.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.Initial.InitialPacket;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.SubDataClient; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.ExHost; import net.ME1312.SubServers.Host.ExHost;
import net.ME1312.SubServers.Host.SubAPI;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.logging.Logger;
/** /**
* Link Host Packet * Link Host Packet
*/ */
public class PacketLinkExHost implements PacketIn, PacketOut { public class PacketLinkExHost implements InitialPacket, PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private ExHost host; private ExHost host;
private Logger log; private int channel;
/** /**
* New PacketLinkHost * New PacketLinkHost (In)
* *
* @param host SubServers.Host * @param host SubServers.Host
*/ */
public PacketLinkExHost(ExHost host) { public PacketLinkExHost(ExHost host) {
if (Util.isNull(host)) throw new NullPointerException(); if (Util.isNull(host)) throw new NullPointerException();
this.host = host; this.host = host;
Util.isException(() -> this.log = Util.reflect(SubDataClient.class.getDeclaredField("log"), null)); }
/**
* New PacketLinkHost (Out)
*
* @param host SubServers.Host
*/
public PacketLinkExHost(ExHost host, int channel) {
if (Util.isNull(host)) throw new NullPointerException();
this.host = host;
this.channel = channel;
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection data = new YAMLSection(); ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set("name", host.subdata.getName()); data.set(0x0000, host.api.getName());
data.set(0x0001, channel);
return data; return data;
} }
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) throws Throwable {
if (data.getInt("r") == 0) { Logger log = Util.getDespiteException(() -> Util.reflect(SubDataClient.class.getDeclaredField("log"), client), null);
Util.isException(() -> Util.reflect(SubDataClient.class.getDeclaredMethod("init"), host.subdata)); if (data.getInt(0x0001) == 0) {
setReady(client, true);
} else { } else {
log.info.println("Could not link name with host: " + data.getRawString("m")); log.info("Could not link name with host" + ((data.contains(0x0002))?": "+data.getRawString(0x0002):'.'));
GalaxiEngine.getInstance().stop(); GalaxiEngine.getInstance().stop();
} }
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -1,17 +1,19 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Version.Version; import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubData.Client.SubDataClient;
import java.util.UUID; import java.util.UUID;
/** /**
* Message Log External Host Packet * Message Log External Host Packet
*/ */
public class PacketOutExLogMessage implements PacketOut { public class PacketOutExLogMessage implements PacketObjectOut<Integer> {
private UUID address; private UUID address;
private String line; private String line;
private boolean terminate;
/** /**
* New PacketInExLogMessage (Out) * New PacketInExLogMessage (Out)
@ -19,18 +21,30 @@ public class PacketOutExLogMessage implements PacketOut {
public PacketOutExLogMessage(UUID address, String line) { public PacketOutExLogMessage(UUID address, String line) {
this.address = address; this.address = address;
this.line = line; this.line = line;
this.terminate = false;
}
/**
* New PacketInExLogMessage (Out)
*/
public PacketOutExLogMessage(UUID address, boolean terminate) {
this.address = address;
this.line = null;
this.terminate = terminate;
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) throws Exception {
YAMLSection data = new YAMLSection(); if (terminate) client.close();
data.set("h", address.toString());
data.set("m", line); ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set(0x0000, address);
if (line != null) data.set(0x0001, line);
return data; return data;
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -1,8 +1,6 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.SubData.Client.Protocol.PacketOut;
import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.SubServers.Host.Network.PacketOut;
/** /**
* Queue Request Packet * Queue Request Packet
@ -15,13 +13,9 @@ public class PacketOutExRequestQueue implements PacketOut {
public PacketOutExRequestQueue() { public PacketOutExRequestQueue() {
} }
@Override
public YAMLSection generate() {
return null;
}
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -0,0 +1,65 @@
package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap;
import java.util.UUID;
/**
* Remove Server Packet
*/
public class PacketRemoveServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<UUID, Callback<ObjectMap<Integer>>[]> callbacks = new HashMap<UUID, Callback<ObjectMap<Integer>>[]>();
private UUID player;
private String server;
private boolean force;
private UUID tracker;
/**
* New PacketRemoveServer (In)
*/
public PacketRemoveServer() {}
/**
* New PacketRemoveServer (Out)
*
* @param player Player Removing
* @param server Server
* @param callback Callbacks
*/
@SafeVarargs
public PacketRemoveServer(UUID player, String server, boolean force, Callback<ObjectMap<Integer>>... callback) {
if (Util.isNull(server, callback)) throw new NullPointerException();
this.player = player;
this.server = server;
this.force = force;
this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(tracker, callback);
}
@Override
public ObjectMap<Integer> send(SubDataClient client) {
ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set(0x0000, tracker);
data.set(0x0001, server);
data.set(0x0002, force);
if (player != null) data.set(0x0003, player.toString());
return data;
}
@Override
public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<ObjectMap<Integer>> callback : callbacks.get(data.getUUID(0x0000))) callback.run(data);
callbacks.remove(data.getUUID(0x0000));
}
@Override
public int version() {
return 0x0001;
}
}

View File

@ -1,11 +1,11 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; 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.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap; import java.util.HashMap;
import java.util.UUID; import java.util.UUID;
@ -13,11 +13,11 @@ import java.util.UUID;
/** /**
* Restart Server Packet * Restart Server Packet
*/ */
public class PacketRestartServer implements PacketIn, PacketOut { public class PacketRestartServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>(); private static HashMap<UUID, Callback<ObjectMap<Integer>>[]> callbacks = new HashMap<UUID, Callback<ObjectMap<Integer>>[]>();
private UUID player; private UUID player;
private String server; private String server;
private String id; private UUID tracker;
/** /**
* New PacketRestartServer (In) * New PacketRestartServer (In)
@ -32,31 +32,31 @@ public class PacketRestartServer implements PacketIn, PacketOut {
* @param callback Callbacks * @param callback Callbacks
*/ */
@SafeVarargs @SafeVarargs
public PacketRestartServer(UUID player, String server, Callback<YAMLSection>... callback) { public PacketRestartServer(UUID player, String server, Callback<ObjectMap<Integer>>... callback) {
if (Util.isNull(server, callback)) throw new NullPointerException(); if (Util.isNull(server, callback)) throw new NullPointerException();
this.player = player; this.player = player;
this.server = server; this.server = server;
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString(); this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(id, callback); callbacks.put(tracker, callback);
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection data = new YAMLSection(); ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set("id", id); data.set(0x0000, tracker);
if (player != null) data.set("player", player.toString()); data.set(0x0001, server);
data.set("server", server); if (player != null) data.set(0x0002, player.toString());
return data; return data;
} }
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data); for (Callback<ObjectMap<Integer>> callback : callbacks.get(data.getUUID(0x0000))) callback.run(data);
callbacks.remove(data.getRawString("id")); callbacks.remove(data.getUUID(0x0000));
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -1,11 +1,11 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; 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.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap; import java.util.HashMap;
import java.util.UUID; import java.util.UUID;
@ -13,11 +13,11 @@ import java.util.UUID;
/** /**
* Start Server Packet * Start Server Packet
*/ */
public class PacketStartServer implements PacketIn, PacketOut { public class PacketStartServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>(); private static HashMap<UUID, Callback<ObjectMap<Integer>>[]> callbacks = new HashMap<UUID, Callback<ObjectMap<Integer>>[]>();
private UUID player; private UUID player;
private String server; private String server;
private String id; private UUID tracker;
/** /**
* New PacketStartServer (In) * New PacketStartServer (In)
@ -32,31 +32,31 @@ public class PacketStartServer implements PacketIn, PacketOut {
* @param callback Callbacks * @param callback Callbacks
*/ */
@SafeVarargs @SafeVarargs
public PacketStartServer(UUID player, String server, Callback<YAMLSection>... callback) { public PacketStartServer(UUID player, String server, Callback<ObjectMap<Integer>>... callback) {
if (Util.isNull(server, callback)) throw new NullPointerException(); if (Util.isNull(server, callback)) throw new NullPointerException();
this.player = player; this.player = player;
this.server = server; this.server = server;
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString(); this.tracker = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(id, callback); callbacks.put(tracker, callback);
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection data = new YAMLSection(); ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set("id", id); data.set(0x0000, tracker);
if (player != null) data.set("player", player.toString()); data.set(0x0001, server);
data.set("server", server); if (player != null) data.set(0x0002, player.toString());
return data; return data;
} }
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data); for (Callback<ObjectMap<Integer>> callback : callbacks.get(data.getUUID(0x0000))) callback.run(data);
callbacks.remove(data.getRawString("id")); callbacks.remove(data.getUUID(0x0000));
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.13b"); return 0x0001;
} }
} }

View File

@ -1,11 +1,11 @@
package net.ME1312.SubServers.Host.Network.Packet; package net.ME1312.SubServers.Host.Network.Packet;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; 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.SubData.Client.Protocol.PacketObjectIn;
import net.ME1312.SubServers.Host.Network.PacketIn; import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubServers.Host.Network.PacketOut; import net.ME1312.SubData.Client.SubDataClient;
import java.util.HashMap; import java.util.HashMap;
import java.util.UUID; import java.util.UUID;
@ -13,12 +13,12 @@ import java.util.UUID;
/** /**
* Stop Server Packet * Stop Server Packet
*/ */
public class PacketStopServer implements PacketIn, PacketOut { public class PacketStopServer implements PacketObjectIn<Integer>, PacketObjectOut<Integer> {
private static HashMap<String, Callback<YAMLSection>[]> callbacks = new HashMap<String, Callback<YAMLSection>[]>(); private static HashMap<UUID, Callback<ObjectMap<Integer>>[]> callbacks = new HashMap<UUID, Callback<ObjectMap<Integer>>[]>();
private UUID player; private UUID player;
private boolean force; private boolean force;
private String server; private String server;
private String id; private UUID id;
/** /**
* New PacketStopServer (In) * New PacketStopServer (In)
@ -34,33 +34,33 @@ public class PacketStopServer implements PacketIn, PacketOut {
* @param callback Callbacks * @param callback Callbacks
*/ */
@SafeVarargs @SafeVarargs
public PacketStopServer(UUID player, String server, boolean force, Callback<YAMLSection>... callback) { public PacketStopServer(UUID player, String server, boolean force, Callback<ObjectMap<Integer>>... callback) {
if (Util.isNull(server, force, callback)) throw new NullPointerException(); if (Util.isNull(server, force, callback)) throw new NullPointerException();
this.player = player; this.player = player;
this.server = server; this.server = server;
this.force = force; this.force = force;
this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID).toString(); this.id = Util.getNew(callbacks.keySet(), UUID::randomUUID);
callbacks.put(id, callback); callbacks.put(id, callback);
} }
@Override @Override
public YAMLSection generate() { public ObjectMap<Integer> send(SubDataClient client) {
YAMLSection data = new YAMLSection(); ObjectMap<Integer> data = new ObjectMap<Integer>();
data.set("id", id); data.set(0x0000, id);
if (player != null) data.set("player", player.toString()); data.set(0x0001, server);
data.set("server", server); data.set(0x0002, force);
data.set("force", force); if (player != null) data.set(0x0003, player.toString());
return data; return data;
} }
@Override @Override
public void execute(YAMLSection data) { public void receive(SubDataClient client, ObjectMap<Integer> data) {
for (Callback<YAMLSection> callback : callbacks.get(data.getRawString("id"))) callback.run(data); for (Callback<ObjectMap<Integer>> callback : callbacks.get(data.getUUID(0x0000))) callback.run(data);
callbacks.remove(data.getRawString("id")); callbacks.remove(data.getUUID(0x0000));
} }
@Override @Override
public Version getVersion() { public int version() {
return new Version("2.11.0a"); return 0x0001;
} }
} }

View File

@ -1,33 +0,0 @@
package net.ME1312.SubServers.Host.Network;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Version.Version;
/**
* PacketIn Layout Class
*/
public interface PacketIn {
/**
* Execute Incoming Packet
*
* @param data Incoming Data
*/
void execute(YAMLSection data) throws Throwable;
/**
* Get Packet Version
*
* @return Packet Version
*/
Version getVersion();
/**
* Check Compatibility with oncoming packet
*
* @param version Version of oncoming packet
* @return Compatibility Status
*/
default boolean isCompatible(Version version) {
return getVersion().equals(version);
}
}

View File

@ -1,23 +0,0 @@
package net.ME1312.SubServers.Host.Network;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Version.Version;
/**
* PacketOut Layout Class
*/
public interface PacketOut {
/**
* Generate JSON Packet Contents
*
* @return Packet Contents
*/
YAMLSection generate() throws Throwable;
/**
* Get Packet Version
*
* @return Packet Version
*/
Version getVersion();
}

View File

@ -1,578 +0,0 @@
package net.ME1312.SubServers.Host.Network;
import net.ME1312.Galaxi.Engine.GalaxiEngine;
import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Log.Logger;
import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.SubServers.Host.Event.SubNetworkConnectEvent;
import net.ME1312.SubServers.Host.Event.SubNetworkDisconnectEvent;
import net.ME1312.SubServers.Host.Library.Exception.IllegalPacketException;
import net.ME1312.SubServers.Host.Network.Encryption.AES;
import net.ME1312.SubServers.Host.Network.Packet.*;
import net.ME1312.SubServers.Host.SubAPI;
import net.ME1312.SubServers.Host.ExHost;
import org.json.JSONException;
import org.msgpack.core.MessageInsufficientBufferException;
import org.msgpack.core.MessagePack;
import org.msgpack.core.MessagePacker;
import org.msgpack.core.MessageUnpacker;
import org.msgpack.value.MapValue;
import org.msgpack.value.Value;
import org.msgpack.value.ValueFactory;
import org.yaml.snakeyaml.error.YAMLException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* SubData Direct Client Class
*/
public final class SubDataClient {
private static HashMap<Class<? extends PacketOut>, NamedContainer<String, String>> pOut = new HashMap<Class<? extends PacketOut>, NamedContainer<String, String>>();
private static HashMap<String, HashMap<String, List<PacketIn>>> pIn = new HashMap<String, HashMap<String, List<PacketIn>>>();
private static HashMap<String, Cipher> ciphers = new HashMap<String, Cipher>();
private static boolean defaults = false;
protected static Logger log;
private MessagePacker out;
private NamedContainer<Boolean, Socket> socket;
private String name;
private Cipher cipher;
private ExHost host;
private LinkedList<NamedContainer<String, PacketOut>> queue;
/**
* SubServers Client Instance
*
* @param host SubServers.Host
* @param name Name of Host
* @param address Address
* @param port Port
* @param cipher Cipher
* @throws IOException
*/
public SubDataClient(ExHost host, String name, InetAddress address, int port, Cipher cipher) throws IOException {
if (Util.isNull(host, name, address, port)) throw new NullPointerException();
socket = new NamedContainer<>(false, new Socket(address, port));
this.host = host;
this.name = name;
this.out = MessagePack.newDefaultPacker(socket.get().getOutputStream());
this.queue = new LinkedList<NamedContainer<String, PacketOut>>();
this.cipher = (cipher != null)?cipher:new Cipher() {
@Override
public String getName() {
return "NONE";
}
@Override
public Value encrypt(String key, YAMLSection data) {
return convert(data);
}
@Override
@SuppressWarnings("unchecked")
public YAMLSection decrypt(String key, Value data) {
return convert(data.asMapValue());
}
};
if (!defaults) loadDefaults();
loop();
sendPacket(new NamedContainer<>(null, new PacketAuthorization(host)));
}
private void init() {
sendPacket(new PacketExConfigureHost(host));
sendPacket(new PacketDownloadLang());
sendPacket(new PacketOutExRequestQueue());
while (queue.size() != 0) {
sendPacket(queue.get(0));
queue.remove(0);
}
socket.rename(true);
GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubNetworkConnectEvent(host.subdata));
}
static {
addCipher("AES", new AES(128));
addCipher("AES_128", new AES(128));
addCipher("AES_192", new AES(192));
addCipher("AES_256", new AES(256));
} private void loadDefaults() {
defaults = true;
log = new Logger("SubData");
registerPacket(new PacketAuthorization(host), "SubData", "Authorization");
registerPacket(new PacketCommandServer(), "SubServers", "CommandServer");
registerPacket(new PacketCreateServer(), "SubServers", "CreateServer");
registerPacket(new PacketDownloadGroupInfo(), "SubServers", "DownloadGroupInfo");
registerPacket(new PacketDownloadHostInfo(), "SubServers", "DownloadHostInfo");
registerPacket(new PacketDownloadLang(host), "SubServers", "DownloadLang");
registerPacket(new PacketDownloadNetworkList(), "SubServers", "DownloadNetworkList");
registerPacket(new PacketDownloadPlatformInfo(), "SubServers", "DownloadPlatformInfo");
registerPacket(new PacketDownloadPlayerList(), "SubServers", "DownloadPlayerList");
registerPacket(new PacketDownloadProxyInfo(), "SubServers", "DownloadProxyInfo");
registerPacket(new PacketDownloadServerInfo(), "SubServers", "DownloadServerInfo");
registerPacket(new PacketExAddServer(host), "SubServers", "ExAddServer");
registerPacket(new PacketExConfigureHost(host), "SubServers", "ExConfigureHost");
registerPacket(new PacketExCreateServer(host), "SubServers", "ExCreateServer");
registerPacket(new PacketExDeleteServer(host), "SubServers", "ExDeleteServer");
registerPacket(new PacketExRemoveServer(host), "SubServers", "ExRemoveServer");
registerPacket(new PacketExUpdateServer(host), "SubServers", "ExUpdateServer");
registerPacket(new PacketInReload(host), "SubServers", "Reload");
registerPacket(new PacketInReset(host), "SubServers", "Reset");
registerPacket(new PacketInRunEvent(), "SubServers", "RunEvent");
registerPacket(new PacketLinkExHost(host), "SubServers", "LinkExHost");
registerPacket(new PacketRestartServer(), "SubServers", "RestartServer");
registerPacket(new PacketStartServer(), "SubServers", "StartServer");
registerPacket(new PacketStopServer(), "SubServers", "StopServer");
registerPacket(PacketAuthorization.class, "SubData", "Authorization");
registerPacket(PacketCommandServer.class, "SubServers", "CommandServer");
registerPacket(PacketCreateServer.class, "SubServers", "CreateServer");
registerPacket(PacketDownloadGroupInfo.class, "SubServers", "DownloadGroupInfo");
registerPacket(PacketDownloadHostInfo.class, "SubServers", "DownloadHostInfo");
registerPacket(PacketDownloadLang.class, "SubServers", "DownloadLang");
registerPacket(PacketDownloadNetworkList.class, "SubServers", "DownloadNetworkList");
registerPacket(PacketDownloadPlatformInfo.class, "SubServers", "DownloadPlatformInfo");
registerPacket(PacketDownloadPlayerList.class, "SubServers", "DownloadPlayerList");
registerPacket(PacketDownloadProxyInfo.class, "SubServers", "DownloadProxyInfo");
registerPacket(PacketDownloadServerInfo.class, "SubServers", "DownloadServerInfo");
registerPacket(PacketExAddServer.class, "SubServers", "ExAddServer");
registerPacket(PacketExConfigureHost.class, "SubServers", "ExConfigureHost");
registerPacket(PacketExCreateServer.class, "SubServers", "ExCreateServer");
registerPacket(PacketExDeleteServer.class, "SubServers", "ExDeleteServer");
registerPacket(PacketExRemoveServer.class, "SubServers", "ExRemoveServer");
registerPacket(PacketExUpdateServer.class, "SubServers", "ExUpdateServer");
registerPacket(PacketLinkExHost.class, "SubServers", "LinkExHost");
registerPacket(PacketOutExLogMessage.class, "SubServers", "ExLogMessage");
registerPacket(PacketOutExRequestQueue.class, "SubServers", "ExRequestQueue");
registerPacket(PacketRestartServer.class, "SubServers", "RestartServer");
registerPacket(PacketStartServer.class, "SubServers", "StartServer");
registerPacket(PacketStopServer.class, "SubServers", "StopServer");
}
private void loop() {
new Thread(() -> {
try {
MessageUnpacker in = MessagePack.newDefaultUnpacker(socket.get().getInputStream());
Value input;
while ((input = in.unpackValue()) != null) {
recieve(input);
}
try {
destroy(host.config.get().getSection("Settings").getSection("SubData").getInt("Reconnect", 30));
} catch (IOException e1) {
log.error.println(e1);
}
} catch (Exception e) {
if (!(e instanceof SocketException || e instanceof MessageInsufficientBufferException)) log.error.println(e);
try {
destroy(host.config.get().getSection("Settings").getSection("SubData").getInt("Reconnect", 30));
} catch (IOException e1) {
log.error.println(e1);
}
}
}, SubAPI.getInstance().getAppInfo().getName() + "::SubData_Packet_Listener").start();
}
private void recieve(Value input) {
try {
YAMLSection data = cipher.decrypt(host.config.get().getSection("Settings").getSection("SubData").getRawString("Password"), input);
for (PacketIn packet : decodePacket(data)) {
try {
packet.execute((data.contains("c"))?data.getSection("c"):null);
} catch (Throwable e) {
log.error.println(new InvocationTargetException(e, "Exception while executing PacketIn"));
}
}
} catch (JSONException | YAMLException e) {
log.error.println(new IllegalPacketException("Unknown Packet Format: " + input));
} catch (IllegalPacketException e) {
log.error.println(e);
} catch (Exception e) {
log.error.println(new InvocationTargetException(e, "Exception while decoding packet"));
}
}
/**
* Gets the Assigned Host Name
*
* @return Host Name
*/
public String getName() {
return name;
}
/**
* Gets the Client Socket
*
* @return Client Socket
*/
public Socket getClient() {
return socket.get();
}
/**
* Add a Cipher for use by SubData
*
* @param cipher Cipher to Add
* @param handle Handle to Bind
*/
public static void addCipher(String handle, Cipher cipher) {
if (Util.isNull(cipher)) throw new NullPointerException();
if (ciphers.keySet().contains(handle.toUpperCase().replace('-', '_').replace(' ', '_'))) throw new IllegalStateException("Cipher already exists: " + handle);
ciphers.put(handle.toUpperCase().replace('-', '_').replace(' ', '_'), cipher);
}
/**
* Gets the Ciphers
*
* @return Cipher Map
*/
public static Map<String, Cipher> getCiphers() {
return new TreeMap<>(ciphers);
}
/**
* Gets the Client's Cipher
*
* @return Cipher
*/
public Cipher getCipher() {
return cipher;
}
/**
* Gets a Cipher by Handle
*
* @param handle Handle
* @return Cipher
*/
public static Cipher getCipher(String handle) {
return getCiphers().get(handle.toUpperCase().replace('-', '_').replace(' ', '_'));
}
/**
* Register PacketIn to the Network
*
* @param packet PacketIn to register
* @param channel Packet Channel
* @param handle Handle to Bind
*/
public static void registerPacket(PacketIn packet, String channel, String handle) {
if (Util.isNull(packet, channel, handle)) throw new NullPointerException();
HashMap<String, List<PacketIn>> map = (pIn.keySet().contains(channel.toLowerCase()))?pIn.get(channel.toLowerCase()):new HashMap<String, List<PacketIn>>();
List<PacketIn> list = (map.keySet().contains(handle))?map.get(handle):new ArrayList<PacketIn>();
if (!list.contains(packet)) {
list.add(packet);
map.put(handle, list);
pIn.put(channel.toLowerCase(), map);
}
}
/**
* Unregister PacketIn from the Network
*
* @param channel Packet Channel
* @param packet PacketIn to unregister
*/
public static void unregisterPacket(String channel, PacketIn packet) {
if (Util.isNull(channel, packet)) throw new NullPointerException();
if (pIn.keySet().contains(channel.toLowerCase())) {
List<String> search = new ArrayList<String>();
search.addAll(pIn.get(channel.toLowerCase()).keySet());
for (String handle : search) if (pIn.get(channel.toLowerCase()).get(handle).contains(packet)) {
List<PacketIn> list = pIn.get(channel.toLowerCase()).get(handle);
list.remove(packet);
if (list.isEmpty()) {
pIn.get(channel.toLowerCase()).remove(handle);
if (pIn.get(channel.toLowerCase()).isEmpty()) pIn.remove(channel.toLowerCase());
} else {
pIn.get(channel.toLowerCase()).put(handle, list);
}
}
}
}
/**
* Register PacketOut to the Network
*
* @param packet PacketOut to register
* @param channel Packet Channel
* @param handle Handle to bind
*/
public static void registerPacket(Class<? extends PacketOut> packet, String channel, String handle) {
if (Util.isNull(packet, channel, handle)) throw new NullPointerException();
pOut.put(packet, new NamedContainer<String, String>(channel.toLowerCase(), handle));
}
/**
* Unregister PacketOut to the Network
*
* @param channel Packet Channel
* @param packet PacketOut to unregister
*/
public static void unregisterPacket(String channel, Class<? extends PacketOut> packet) {
if (Util.isNull(channel, packet)) throw new NullPointerException();
if (pOut.keySet().contains(packet) && pOut.get(packet).name().equalsIgnoreCase(channel)) pOut.remove(packet);
}
/**
* Grab PacketIn Instances via handle
*
* @param channel Packet Channel
* @param handle Handle
* @return PacketIn
*/
public static List<? extends PacketIn> getPacket(String channel, String handle) {
if (Util.isNull(channel, handle)) throw new NullPointerException();
return new ArrayList<PacketIn>(pIn.get(channel.toLowerCase()).get(handle));
}
/**
* Send Packet to Client
*
* @param packet Packet to send
*/
public void sendPacket(PacketOut packet) {
if (Util.isNull(packet)) throw new NullPointerException();
if (socket.get() == null || !socket.name()) {
queue.add(new NamedContainer<>(null, packet));
} else {
sendPacket(new NamedContainer<>(null, packet));
}
}
private void sendPacket(NamedContainer<String, PacketOut> packet) {
try {
YAMLSection data = encodePacket(packet.get());
if (packet.name() != null) data.set("f", packet.name());
out.packValue(getCipher().encrypt(host.config.get().getSection("Settings").getSection("SubData").getRawString("Password"), data));
out.flush();
} catch (Throwable e) {
log.error.println(e);
}
}
/**
* Forward Packet to Server
*
* @param packet Packet to send
* @param location Where to send
*/
public void forwardPacket(PacketOut packet, String location) {
if (Util.isNull(packet, location)) throw new NullPointerException();
if (socket == null || !socket.name()) {
queue.add(new NamedContainer<>(location, packet));
} else {
sendPacket(new NamedContainer<>(location, packet));
}
}
/**
* Broadcast packet to all Clients
*
* @param packet Packet to send
*/
public void broadcastPacket(PacketOut packet) {
forwardPacket(packet, "");
}
/**
* Convert a YAMLSection to a MessagePack Map
*
* @param config YAMLSection
* @return MessagePack Map
*/
public static MapValue convert(YAMLSection config) {
return (MapValue) msgPack(config.get());
}
@SuppressWarnings("unchecked")
private static Value msgPack(Object value) {
if (value == null) {
return ValueFactory.newNil();
} else if (value instanceof Value) {
return (Value) value;
} else if (value instanceof Map) {
ValueFactory.MapBuilder map = ValueFactory.newMapBuilder();
for (String key : ((Map<String, ?>) value).keySet()) {
Value v = msgPack(((Map<String, ?>) value).get(key));
if (v != null) map.put(ValueFactory.newString(key), v);
}
return map.build();
} else if (value instanceof Collection) {
LinkedList<Value> values = new LinkedList<Value>();
for (Object object : (Collection<?>) value) {
Value v = msgPack(object);
if (v != null) values.add(v);
}
return ValueFactory.newArray(values);
} else if (value instanceof Boolean) {
return ValueFactory.newBoolean((boolean) value);
} else if (value instanceof Number) {
if (((Number) value).doubleValue() == (double)(int) ((Number) value).doubleValue()) {
return ValueFactory.newInteger(((Number) value).longValue());
} else {
return ValueFactory.newFloat(((Number) value).doubleValue());
}
} else if (value instanceof String) {
return ValueFactory.newString((String) value);
} else {
return null;
}
}
/**
* Convert a MessagePack Map to a YAMLSection
*
* @param msgpack MessagePack Map
* @return YAMLSection
*/
@SuppressWarnings("unchecked")
public static YAMLSection convert(MapValue msgpack) {
YAMLSection section = new YAMLSection();
boolean warned = false;
Map<Value, Value> map = msgpack.map();
for (Value key : map.keySet()) {
if (key.isStringValue()) {
section.set(key.asStringValue().asString(), simplify(map.get(key)));
} else if (!warned) {
new IllegalStateException("MessagePack contains non-string key(s)").printStackTrace();
warned = true;
}
}
return section;
}
private static Object simplify(Value value) {
Object simple = value;
if (value.isNilValue()) {
simple = null;
} else if (value.isMapValue()) {
Map<Value, Value> map = value.asMapValue().map();
simple = convert(value.asMapValue());
} else if (value.isArrayValue()) {
simple = value.asArrayValue().list();
} else if (value.isBooleanValue()) {
simple = value.asBooleanValue().getBoolean();
} else if (value.isFloatValue()) {
if (value.asFloatValue().toDouble() == (double)(float) value.asFloatValue().toDouble()) {
simple = value.asFloatValue().toFloat();
} else {
simple = value.asFloatValue().toDouble();
}
} else if (value.isIntegerValue()) {
if (value.asIntegerValue().isInByteRange()) {
simple = value.asIntegerValue().asByte();
} else if (value.asIntegerValue().isInShortRange()) {
simple = value.asIntegerValue().asShort();
} else if (value.asIntegerValue().isInIntRange()) {
simple = value.asIntegerValue().asInt();
} else if (value.asIntegerValue().isInLongRange()) {
simple = value.asIntegerValue().asLong();
} else {
simple = value.asIntegerValue().asBigInteger();
}
} else if (value.isStringValue()) {
simple = value.asStringValue().asString();
}
return simple;
}
/**
* Encode PacketOut
*
* @param packet PacketOut
* @return JSON Formatted Packet
* @throws IllegalPacketException
*/
private static YAMLSection encodePacket(PacketOut packet) throws IllegalPacketException, InvocationTargetException {
YAMLSection json = new YAMLSection();
if (!pOut.keySet().contains(packet.getClass())) throw new IllegalPacketException("Unknown PacketOut Channel: " + packet.getClass().getCanonicalName());
if (packet.getVersion() == null) throw new NullPointerException("PacketOut Version cannot be null: " + packet.getClass().getCanonicalName());
try {
YAMLSection contents = packet.generate();
json.set("n", pOut.get(packet.getClass()).name());
json.set("h", pOut.get(packet.getClass()).get());
json.set("v", packet.getVersion());
if (contents != null) json.set("c", contents);
} catch (Throwable e) {
throw new InvocationTargetException(e, "Exception while encoding packet");
}
return json;
}
/**
* Decode PacketIn
*
* @param data Data to Decode
* @return PacketIn
* @throws IllegalPacketException
* @throws InvocationTargetException
*/
@SuppressWarnings("deprecation")
private static List<PacketIn> decodePacket(YAMLSection data) throws IllegalPacketException, InvocationTargetException {
if (!data.contains("n") || !data.contains("h") || !data.contains("v")) throw new IllegalPacketException("Unknown Packet Format: " + data.toString());
if (!pIn.keySet().contains(data.getRawString("n")) || !pIn.get(data.getRawString("n")).keySet().contains(data.getRawString("h"))) throw new IllegalPacketException("Unknown PacketIn Channel: " + data.getRawString("n") + ':' + data.getRawString("h"));
List<PacketIn> list = new ArrayList<PacketIn>();
for (PacketIn packet : pIn.get(data.getRawString("n")).get(data.getRawString("h"))) {
if (packet.isCompatible(data.getVersion("v"))) {
list.add(packet);
} else {
SubAPI.getInstance().getInternals().log.error.println(new IllegalPacketException("Packet Version Mismatch in " + data.getRawString("h") + ": " + data.getRawString("v") + " -> " + packet.getVersion().toFullString()));
}
}
return list;
}
/**
* Drops All Connections and Stops the SubData Listener
*
* @throws IOException
*/
public void destroy(int reconnect) throws IOException {
if (Util.isNull(reconnect)) throw new NullPointerException();
if (socket.get() != null) {
final Socket socket = this.socket.get();
this.socket.set(null);
if (!socket.isClosed()) socket.close();
GalaxiEngine.getInstance().getPluginManager().executeEvent(new SubNetworkDisconnectEvent());
log.info.println("The SubData Connection was closed");
if (reconnect > 0) {
log.info.println("Attempting to reconnect in " + reconnect + " seconds");
Timer timer = new Timer(SubAPI.getInstance().getAppInfo().getName() + "::SubData_Reconnect_Handler");
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
host.subdata = new SubDataClient(host, name, socket.getInetAddress(), socket.getPort(), cipher);
timer.cancel();
while (queue.size() != 0) {
if (queue.get(0).name() != null) {
host.subdata.forwardPacket(queue.get(0).get(), queue.get(0).name());
} else {
host.subdata.sendPacket(queue.get(0).get());
}
queue.remove(0);
}
} catch (IOException e) {
log.warn.println("Connection was unsuccessful, retrying in " + reconnect + " seconds");
}
}
}, TimeUnit.SECONDS.toMillis(reconnect), TimeUnit.SECONDS.toMillis(reconnect));
}
}
}
}

View File

@ -0,0 +1,192 @@
package net.ME1312.SubServers.Host.Network;
import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Util;
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.SubDataProtocol;
import net.ME1312.SubServers.Host.Event.SubNetworkConnectEvent;
import net.ME1312.SubServers.Host.Event.SubNetworkDisconnectEvent;
import net.ME1312.SubServers.Host.ExHost;
import net.ME1312.SubServers.Host.Network.Packet.*;
import net.ME1312.SubServers.Host.SubAPI;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
public class SubProtocol extends SubDataProtocol {
private static SubProtocol instance;
private SubProtocol() {}
@SuppressWarnings("deprecation")
public static SubProtocol get() {
if (instance == null) {
instance = new SubProtocol();
ExHost host = SubAPI.getInstance().getInternals();
instance.setName("SubServers 2");
instance.addVersion(new Version("2.14a+"));
// 00-09: Object Link Packets
instance.registerPacket(0x0001, PacketLinkExHost.class);
instance.registerPacket(0x0001, new PacketLinkExHost(host));
// 10-29: Download Packets
instance.registerPacket(0x0010, PacketDownloadLang.class);
instance.registerPacket(0x0011, PacketDownloadPlatformInfo.class);
instance.registerPacket(0x0012, PacketDownloadProxyInfo.class);
instance.registerPacket(0x0013, PacketDownloadHostInfo.class);
instance.registerPacket(0x0014, PacketDownloadGroupInfo.class);
instance.registerPacket(0x0015, PacketDownloadServerInfo.class);
instance.registerPacket(0x0016, PacketDownloadPlayerList.class);
instance.registerPacket(0x0017, PacketCheckPermission.class);
instance.registerPacket(0x0010, new PacketDownloadLang(host));
instance.registerPacket(0x0011, new PacketDownloadPlatformInfo());
instance.registerPacket(0x0012, new PacketDownloadProxyInfo());
instance.registerPacket(0x0013, new PacketDownloadHostInfo());
instance.registerPacket(0x0014, new PacketDownloadGroupInfo());
instance.registerPacket(0x0015, new PacketDownloadServerInfo());
instance.registerPacket(0x0016, new PacketDownloadPlayerList());
instance.registerPacket(0x0017, new PacketCheckPermission());
// 30-49: Control Packets
instance.registerPacket(0x0030, PacketCreateServer.class);
instance.registerPacket(0x0031, PacketAddServer.class);
instance.registerPacket(0x0032, PacketStartServer.class);
instance.registerPacket(0x0033, PacketEditServer.class);
instance.registerPacket(0x0034, PacketRestartServer.class);
instance.registerPacket(0x0035, PacketCommandServer.class);
instance.registerPacket(0x0036, PacketStopServer.class);
instance.registerPacket(0x0037, PacketRemoveServer.class);
instance.registerPacket(0x0038, PacketDeleteServer.class);
instance.registerPacket(0x0030, new PacketCreateServer());
instance.registerPacket(0x0031, new PacketAddServer());
instance.registerPacket(0x0032, new PacketStartServer());
instance.registerPacket(0x0033, new PacketEditServer());
instance.registerPacket(0x0034, new PacketRestartServer());
instance.registerPacket(0x0035, new PacketCommandServer());
instance.registerPacket(0x0036, new PacketStopServer());
instance.registerPacket(0x0037, new PacketRemoveServer());
instance.registerPacket(0x0038, new PacketDeleteServer());
// 50-69: External Host Packets
instance.registerPacket(0x0050, PacketExConfigureHost.class);
instance.registerPacket(0x0051, PacketExDownloadTemplates.class);
instance.registerPacket(0x0052, PacketOutExRequestQueue.class);
instance.registerPacket(0x0053, PacketExCreateServer.class);
instance.registerPacket(0x0054, PacketExAddServer.class);
instance.registerPacket(0x0055, PacketExUpdateServer.class);
instance.registerPacket(0x0056, PacketOutExLogMessage.class);
instance.registerPacket(0x0057, PacketExDeleteServer.class);
instance.registerPacket(0x0058, PacketExRemoveServer.class);
instance.registerPacket(0x0050, new PacketExConfigureHost(host));
instance.registerPacket(0x0051, new PacketExDownloadTemplates(host));
//instance.registerPacket(0x0052, new PacketOutExRequestQueue(host));
instance.registerPacket(0x0053, new PacketExCreateServer(host));
instance.registerPacket(0x0054, new PacketExAddServer(host));
instance.registerPacket(0x0055, new PacketExUpdateServer(host));
//instance.registerPacket(0x0056, new PacketOutExLogMessage());
instance.registerPacket(0x0057, new PacketExDeleteServer(host));
instance.registerPacket(0x0058, new PacketExRemoveServer(host));
// 70-79: External Misc Packets
//instance.registerPacket(0x0070, PacketInExRunEvent.class);
//instance.registerPacket(0x0071, PacketInExReset.class);
//instance.registerPacket(0x0072, PacketInExReload.class);
instance.registerPacket(0x0070, new PacketInExRunEvent());
instance.registerPacket(0x0071, new PacketInExReset(host));
instance.registerPacket(0x0072, new PacketInExReload(host));
}
return instance;
}
private Logger getLogger(int channel) {
return new net.ME1312.Galaxi.Library.Log.Logger("SubData" + ((channel != 0)?File.separator+"Sub-"+channel:"")).toPrimitive();
}
@Override
protected SubDataClient sub(Callback<Runnable> scheduler, Logger logger, InetAddress address, int port) throws IOException {
ExHost host = SubAPI.getInstance().getInternals();
HashMap<Integer, SubDataClient> map = Util.getDespiteException(() -> Util.reflect(ExHost.class.getDeclaredField("subdata"), host), null);
int channel = 1;
while (map.keySet().contains(channel)) channel++;
final int fc = channel;
SubDataClient subdata = super.open(scheduler, getLogger(fc), address, port);
map.put(fc, subdata);
subdata.sendPacket(new PacketLinkExHost(host, fc));
subdata.on.closed(client -> map.remove(fc));
return subdata;
}
@SuppressWarnings("deprecation")
@Override
public SubDataClient open(Callback<Runnable> scheduler, Logger logger, InetAddress address, int port) throws IOException {
ExHost host = SubAPI.getInstance().getInternals();
HashMap<Integer, SubDataClient> map = Util.getDespiteException(() -> Util.reflect(ExHost.class.getDeclaredField("subdata"), host), null);
SubDataClient subdata = super.open(scheduler, logger, address, port);
subdata.sendPacket(new PacketLinkExHost(host, 0));
subdata.sendPacket(new PacketExConfigureHost(host));
subdata.sendPacket(new PacketExDownloadTemplates(host));
subdata.sendPacket(new PacketDownloadLang());
subdata.sendPacket(new PacketOutExRequestQueue());
subdata.on.ready(client -> host.engine.getPluginManager().executeEvent(new SubNetworkConnectEvent((SubDataClient) client)));
subdata.on.closed(client -> {
SubNetworkDisconnectEvent event = new SubNetworkDisconnectEvent(client.get(), client.name());
host.engine.getPluginManager().executeEvent(event);
map.put(0, null);
Logger log = Util.getDespiteException(() -> Util.reflect(SubDataClient.class.getDeclaredField("log"), client.get()), null);
int reconnect = host.config.get().getMap("Settings").getMap("SubData").getInt("Reconnect", 30);
if (Util.getDespiteException(() -> Util.reflect(ExHost.class.getDeclaredField("reconnect"), host), false) && reconnect > 0
&& client.name() != DisconnectReason.PROTOCOL_MISMATCH && client.name() != DisconnectReason.ENCRYPTION_MISMATCH) {
log.info("Attempting reconnect in " + reconnect + " seconds");
Timer timer = new Timer(SubAPI.getInstance().getAppInfo().getName() + "::SubData_Reconnect_Handler");
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
Util.reflect(ExHost.class.getDeclaredMethod("connect"), host);
timer.cancel();
} catch (InvocationTargetException e) {
if (e.getTargetException() instanceof IOException) {
log.info("Connection was unsuccessful, retrying in " + reconnect + " seconds");
} else e.printStackTrace();
} catch (NoSuchMethodException | IllegalAccessException e) {
e.printStackTrace();
}
}
}, TimeUnit.SECONDS.toMillis(reconnect), TimeUnit.SECONDS.toMillis(reconnect));
}
});
return subdata;
}
public SubDataClient open(InetAddress address, int port) throws IOException {
return open(getLogger(0), address, port);
}
}

View File

@ -1,17 +1,19 @@
package net.ME1312.SubServers.Host; package net.ME1312.SubServers.Host;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.NamedContainer; import net.ME1312.Galaxi.Library.NamedContainer;
import net.ME1312.Galaxi.Library.Util; import net.ME1312.Galaxi.Library.Util;
import net.ME1312.Galaxi.Plugin.PluginInfo; import net.ME1312.Galaxi.Plugin.PluginInfo;
import net.ME1312.SubData.Client.DataClient;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.Network.API.Host; import net.ME1312.SubServers.Host.Network.API.Host;
import net.ME1312.SubServers.Host.Network.API.Proxy; import net.ME1312.SubServers.Host.Network.API.Proxy;
import net.ME1312.SubServers.Host.Network.API.Server; import net.ME1312.SubServers.Host.Network.API.Server;
import net.ME1312.SubServers.Host.Network.API.SubServer; import net.ME1312.SubServers.Host.Network.API.SubServer;
import net.ME1312.SubServers.Host.Network.Packet.*; import net.ME1312.SubServers.Host.Network.Packet.*;
import net.ME1312.SubServers.Host.Network.SubDataClient;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
import java.util.*; import java.util.*;
/** /**
@ -20,6 +22,7 @@ import java.util.*;
public final class SubAPI { public final class SubAPI {
private final ExHost host; private final ExHost host;
private static SubAPI api; private static SubAPI api;
String name;
protected SubAPI(ExHost host) { protected SubAPI(ExHost host) {
this.host = host; this.host = host;
@ -38,14 +41,23 @@ public final class SubAPI {
/** /**
* Gets the SubServers Internals * Gets the SubServers Internals
* *
* @return SubServers.Host Internals
* @deprecated Use SubAPI Methods when available * @deprecated Use SubAPI Methods when available
* @return SubPlugin Internals
*/ */
@Deprecated @Deprecated
public ExHost getInternals() { public ExHost getInternals() {
return host; return host;
} }
/**
* Get the Server Name
*
* @return Server Name
*/
public String getName() {
return name;
}
/** /**
* Gets the Hosts * Gets the Hosts
* *
@ -54,10 +66,10 @@ 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();
host.subdata.sendPacket(new PacketDownloadHostInfo(null, data -> { ((SubDataClient) host.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.getSection("hosts").getKeys()) { for (String host : data.getKeys()) {
hosts.put(host.toLowerCase(), new Host(data.getSection("hosts").getSection(host))); hosts.put(host.toLowerCase(), new Host(data.getMap(host)));
} }
try { try {
@ -65,7 +77,7 @@ public final class SubAPI {
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
host.log.error.println(ew); ew.printStackTrace();
} }
})); }));
} }
@ -79,10 +91,10 @@ 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();
host.subdata.sendPacket(new PacketDownloadHostInfo(name, data -> { ((SubDataClient) host.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadHostInfo(name, data -> {
Host host = null; Host host = null;
if (data.getSection("hosts").getKeys().size() > 0) { if (data.getKeys().size() > 0) {
host = new Host(data.getSection("hosts").getSection(new LinkedList<String>(data.getSection("hosts").getKeys()).getFirst())); host = new Host(data.getMap(new LinkedList<String>(data.getKeys()).getFirst()));
} }
try { try {
@ -90,7 +102,7 @@ public final class SubAPI {
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
this.host.log.error.println(ew); ew.printStackTrace();
} }
})); }));
} }
@ -103,15 +115,15 @@ 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();
host.subdata.sendPacket(new PacketDownloadGroupInfo(null, data -> { ((SubDataClient) host.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.getSection("groups").getKeys()) { for (String group : data.getKeys()) {
ArrayList<Server> servers = new ArrayList<Server>(); ArrayList<Server> servers = new ArrayList<Server>();
for (String server : data.getSection("groups").getSection(group).getKeys()) { for (String server : data.getMap(group).getKeys()) {
if (data.getSection("groups").getSection(group).getSection(server).getRawString("type", "Server").equals("SubServer")) { if (data.getMap(group).getMap(server).getRawString("type", "Server").equals("SubServer")) {
servers.add(new SubServer(data.getSection("groups").getSection(group).getSection(server))); servers.add(new SubServer(data.getMap(group).getMap(server)));
} else { } else {
servers.add(new Server(data.getSection("groups").getSection(group).getSection(server))); servers.add(new Server(data.getMap(group).getMap(server)));
} }
} }
if (servers.size() > 0) groups.put(group, servers); if (servers.size() > 0) groups.put(group, servers);
@ -122,7 +134,7 @@ public final class SubAPI {
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
host.log.error.println(ew); ew.printStackTrace();
} }
})); }));
} }
@ -152,16 +164,16 @@ 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();
host.subdata.sendPacket(new PacketDownloadGroupInfo(name, data -> { ((SubDataClient) host.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadGroupInfo(name, data -> {
List<Server> servers = null; List<Server> servers = null;
if (data.getSection("groups").getKeys().size() > 0) { if (data.getKeys().size() > 0) {
String key = new LinkedList<String>(data.getSection("groups").getKeys()).getFirst(); String key = new LinkedList<String>(data.getKeys()).getFirst();
servers = new ArrayList<Server>(); servers = new ArrayList<Server>();
for (String server : data.getSection("groups").getSection(key).getKeys()) { for (String server : data.getMap(key).getKeys()) {
if (data.getSection("groups").getSection(key).getSection(server).getRawString("type", "Server").equals("SubServer")) { if (data.getMap(key).getMap(server).getRawString("type", "Server").equals("SubServer")) {
servers.add(new SubServer(data.getSection("groups").getSection(key).getSection(server))); servers.add(new SubServer(data.getMap(key).getMap(server)));
} else { } else {
servers.add(new Server(data.getSection("groups").getSection(key).getSection(server))); servers.add(new Server(data.getMap(key).getMap(server)));
} }
} }
} }
@ -171,7 +183,7 @@ public final class SubAPI {
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
host.log.error.println(ew); ew.printStackTrace();
} }
})); }));
} }
@ -184,13 +196,13 @@ 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();
host.subdata.sendPacket(new PacketDownloadServerInfo(null, data -> { ((SubDataClient) host.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.getSection("servers").getKeys()) { for (String server : data.getKeys()) {
if (data.getSection("servers").getSection(server).getRawString("type", "Server").equals("SubServer")) { if (data.getMap(server).getRawString("type", "Server").equals("SubServer")) {
servers.put(server.toLowerCase(), new SubServer(data.getSection("servers").getSection(server))); servers.put(server.toLowerCase(), new SubServer(data.getMap(server)));
} else { } else {
servers.put(server.toLowerCase(), new Server(data.getSection("servers").getSection(server))); servers.put(server.toLowerCase(), new Server(data.getMap(server)));
} }
} }
@ -199,7 +211,7 @@ public final class SubAPI {
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
host.log.error.println(ew); ew.printStackTrace();
} }
})); }));
} }
@ -213,14 +225,14 @@ 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();
host.subdata.sendPacket(new PacketDownloadServerInfo(name, data -> { ((SubDataClient) host.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadServerInfo(name, data -> {
Server server = null; Server server = null;
if (data.getSection("servers").getKeys().size() > 0) { if (data.getKeys().size() > 0) {
String key = new LinkedList<String>(data.getSection("servers").getKeys()).getFirst(); String key = new LinkedList<String>(data.getKeys()).getFirst();
if (data.getSection("servers").getSection(key).getRawString("type", "Server").equals("SubServer")) { if (data.getMap(key).getRawString("type", "Server").equals("SubServer")) {
server = new SubServer(data.getSection("servers").getSection(key)); server = new SubServer(data.getMap(key));
} else { } else {
server = new Server(data.getSection("servers").getSection(key)); server = new Server(data.getMap(key));
} }
} }
@ -229,7 +241,175 @@ public final class SubAPI {
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
host.log.error.println(ew); ew.printStackTrace();
}
}));
}
/**
* Adds a Server to the Network
*
* @param name Name of the Server
* @param ip IP of the Server
* @param port Port of the Server
* @param motd MOTD of the Server
* @param hidden if the server should be hidden from players
* @param restricted Players will need a permission to join if true
* @param response Response Code
*/
public void addServer(String name, InetAddress ip, int port, String motd, boolean hidden, boolean restricted, Callback<Integer> response) {
addServer(null, name, ip, port, motd, hidden, restricted, response);
}
/**
* Adds a Server to the Network
*
* @param player Player who added
* @param name Name of the Server
* @param ip IP of the Server
* @param port Port of the Server
* @param motd MOTD of the Server
* @param hidden If the server should be hidden from players
* @param restricted Players will need a permission to join if true
* @param response Response Code
*/
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();
StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketAddServer(player, name, ip, port, motd, hidden, restricted, data -> {
try {
response.run(data.getInt(0x0001));
} catch (Throwable e) {
Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin);
ew.printStackTrace();
}
}));
}
/**
* Adds a Server to the Network
*
* @param name Name of the Server
* @param ip IP of the Server
* @param port Port of the Server
* @param motd MOTD of the Server
* @param hidden if the server should be hidden from players
* @param restricted Players will need a permission to join if true
*/
public void addServer(String name, InetAddress ip, int port, String motd, boolean hidden, boolean restricted) {
addServer(null, name, ip, port, motd, hidden, restricted);
}
/**
* Adds a Server to the Network
*
* @param player Player who added
* @param name Name of the Server
* @param ip IP of the Server
* @param port Port of the Server
* @param motd MOTD of the Server
* @param hidden If the server should be hidden from players
* @param restricted Players will need a permission to join if true
*/
public void addServer(UUID player, String name, InetAddress ip, int port, String motd, boolean hidden, boolean restricted) {
addServer(player, name, ip, port, motd, hidden, restricted, i -> {});
}
/**
* Remove a Server from the Network
*
* @param name Name of the Server
* @param response Response Code
*/
public void removeServer(String name, Callback<Integer> response) {
removeServer(null, name, response);
}
/**
* Remove a Server from the Network
*
* @param player Player Removing
* @param name Name of the Server
* @param response Response Code
*/
public void removeServer(UUID player, String name, Callback<Integer> response) {
if (Util.isNull(name)) throw new NullPointerException();
removeServer(player, name, false, response);
}
/**
* Remove a Server from the Network
*
* @param name Name of the Server
*/
public void removeServer(String name) {
removeServer(null, name);
}
/**
* Remove a Server from the Network
*
* @param player Player Removing
* @param name Name of the Server
*/
public void removeServer(UUID player, String name) {
if (Util.isNull(name)) throw new NullPointerException();
removeServer(player, name, i -> {});
}
/**
* Force Remove a Server from the Network
*
* @param name Name of the Server
* @param response Response Code
*/
public void forceRemoveServer(String name, Callback<Integer> response) {
forceRemoveServer(null, name, response);
}
/**
* Force Remove a Server from the Network
*
* @param player Player Removing
* @param name Name of the Server
* @param response Response Code
*/
public void forceRemoveServer(UUID player, String name, Callback<Integer> response) {
if (Util.isNull(name)) throw new NullPointerException();
removeServer(player, name, true, response);
}
/**
* Force Remove a Server from the Network
*
* @param name Name of the Server
*/
public void forceRemoveServer(String name) {
forceRemoveServer(null, name);
}
/**
* Force Remove a Server from the Network
*
* @param player Player Removing
* @param name Name of the Server
*/
public void forceRemoveServer(UUID player, String name) {
if (Util.isNull(name)) throw new NullPointerException();
forceRemoveServer(player, name, i -> {});
}
private void removeServer(UUID player, String name, boolean force, Callback<Integer> response) {
if (Util.isNull(response)) throw new NullPointerException();
StackTraceElement[] origin = new Exception().getStackTrace();
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketRemoveServer(player, name, force, data -> {
try {
response.run(data.getInt(0x0001));
} catch (Throwable e) {
Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin);
ew.printStackTrace();
} }
})); }));
} }
@ -269,10 +449,10 @@ 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();
host.subdata.sendPacket(new PacketDownloadProxyInfo(null, data -> { ((SubDataClient) host.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.getSection("proxies").getKeys()) { for (String proxy : data.getKeys()) {
proxies.put(proxy.toLowerCase(), new Proxy(data.getSection("proxies").getSection(proxy))); proxies.put(proxy.toLowerCase(), new Proxy(data.getMap(proxy)));
} }
try { try {
@ -280,7 +460,7 @@ public final class SubAPI {
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
host.log.error.println(ew); ew.printStackTrace();
} }
})); }));
} }
@ -294,10 +474,10 @@ 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();
host.subdata.sendPacket(new PacketDownloadProxyInfo(name, data -> { ((SubDataClient) host.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadProxyInfo(name, data -> {
Proxy proxy = null; Proxy proxy = null;
if (data.getSection("proxies").getKeys().size() > 0) { if (data.getKeys().size() > 0) {
proxy = new Proxy(data.getSection("proxies").getSection(new LinkedList<String>(data.getSection("proxies").getKeys()).getFirst())); proxy = new Proxy(data.getMap(new LinkedList<String>(data.getKeys()).getFirst()));
} }
try { try {
@ -305,7 +485,7 @@ public final class SubAPI {
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
host.log.error.println(ew); ew.printStackTrace();
} }
})); }));
} }
@ -318,10 +498,10 @@ 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();
host.subdata.sendPacket(new PacketDownloadProxyInfo("", data -> { ((SubDataClient) host.api.getSubDataNetwork()[0]).sendPacket(new PacketDownloadProxyInfo("", data -> {
Proxy proxy = null; Proxy proxy = null;
if (data.getKeys().contains("master")) { if (data != null) {
proxy = new Proxy(data.getSection("master")); proxy = new Proxy(data);
} }
try { try {
@ -329,7 +509,7 @@ public final class SubAPI {
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
host.log.error.println(ew); ew.printStackTrace();
} }
})); }));
} }
@ -343,10 +523,10 @@ 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();
host.subdata.sendPacket(new PacketDownloadPlayerList(data -> { ((SubDataClient) host.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.getSection("players").getKeys()) { for (String id : data.getKeys()) {
players.add(new NamedContainer<String, UUID>(data.getSection("players").getSection(id).getRawString("name"), UUID.fromString(id))); players.add(new NamedContainer<String, UUID>(data.getMap(id).getRawString("name"), UUID.fromString(id)));
} }
try { try {
@ -354,7 +534,7 @@ public final class SubAPI {
} catch (Throwable e) { } catch (Throwable e) {
Throwable ew = new InvocationTargetException(e); Throwable ew = new InvocationTargetException(e);
ew.setStackTrace(origin); ew.setStackTrace(origin);
host.log.error.println(ew); ew.printStackTrace();
} }
})); }));
} }
@ -364,8 +544,12 @@ public final class SubAPI {
* *
* @return SubData Network Manager * @return SubData Network Manager
*/ */
public SubDataClient getSubDataNetwork() { public DataClient[] getSubDataNetwork() {
return host.subdata; LinkedList<Integer> keys = new LinkedList<Integer>(host.subdata.keySet());
LinkedList<SubDataClient> channels = new LinkedList<SubDataClient>();
Collections.sort(keys);
for (Integer channel : keys) channels.add(host.subdata.get(channel));
return channels.toArray(new DataClient[0]);
} }
/** /**

View File

@ -1,8 +1,9 @@
package net.ME1312.SubServers.Host; package net.ME1312.SubServers.Host;
import net.ME1312.Galaxi.Engine.GalaxiEngine; import net.ME1312.Galaxi.Engine.GalaxiEngine;
import net.ME1312.Galaxi.Library.Callback; import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Config.YAMLSection; import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.Galaxi.Library.Map.ObjectMapValue;
import net.ME1312.Galaxi.Library.Container; import net.ME1312.Galaxi.Library.Container;
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;
@ -10,6 +11,7 @@ import net.ME1312.Galaxi.Plugin.Command.Command;
import net.ME1312.Galaxi.Plugin.Command.CommandSender; import net.ME1312.Galaxi.Plugin.Command.CommandSender;
import net.ME1312.Galaxi.Plugin.Command.CompletionHandler; import net.ME1312.Galaxi.Plugin.Command.CompletionHandler;
import net.ME1312.Galaxi.Plugin.PluginManager; import net.ME1312.Galaxi.Plugin.PluginManager;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Host.Library.TextColor; import net.ME1312.SubServers.Host.Library.TextColor;
import net.ME1312.SubServers.Host.Network.API.*; import net.ME1312.SubServers.Host.Network.API.*;
import net.ME1312.SubServers.Host.Network.Packet.*; import net.ME1312.SubServers.Host.Network.Packet.*;
@ -103,7 +105,7 @@ public class SubCommand {
if (!(server instanceof SubServer)) { if (!(server instanceof SubServer)) {
message += TextColor.WHITE; message += TextColor.WHITE;
} else if (((SubServer) server).isRunning()) { } else if (((SubServer) server).isRunning()) {
if (((SubServer) server).getStopAction() == SubServer.StopAction.REMOVE_SERVER || ((SubServer) server).getStopAction() == SubServer.StopAction.DELETE_SERVER) { if (((SubServer) server).getStopAction() == SubServer.StopAction.REMOVE_SERVER || ((SubServer) server).getStopAction() == SubServer.StopAction.RECYCLE_SERVER || ((SubServer) server).getStopAction() == SubServer.StopAction.DELETE_SERVER) {
message += TextColor.AQUA; message += TextColor.AQUA;
} else { } else {
message += TextColor.GREEN; message += TextColor.GREEN;
@ -136,7 +138,7 @@ public class SubCommand {
for (SubServer subserver : host.getSubServers().values()) { for (SubServer subserver : host.getSubServers().values()) {
if (i != 0) message += div; if (i != 0) message += div;
if (subserver.isRunning()) { if (subserver.isRunning()) {
if (subserver.getStopAction() == SubServer.StopAction.REMOVE_SERVER || subserver.getStopAction() == SubServer.StopAction.DELETE_SERVER) { if (subserver.getStopAction() == SubServer.StopAction.REMOVE_SERVER || subserver.getStopAction() == SubServer.StopAction.RECYCLE_SERVER || subserver.getStopAction() == SubServer.StopAction.DELETE_SERVER) {
message += TextColor.AQUA; message += TextColor.AQUA;
} else { } else {
message += TextColor.GREEN; message += TextColor.GREEN;
@ -169,9 +171,9 @@ public class SubCommand {
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 += TextColor.GREEN; message += TextColor.GREEN;
} else if (proxy.getSubData() != null) { } else if (proxy.getSubData()[0] != null) {
message += TextColor.AQUA; message += TextColor.AQUA;
} else if (proxy.isRedis()) { } else if (proxy.isRedis()) {
message += TextColor.WHITE; message += TextColor.WHITE;
@ -212,7 +214,7 @@ public class SubCommand {
sender.sendMessage(" -> Address: " + TextColor.WHITE + server.getAddress().getAddress().getHostAddress()+':'+server.getAddress().getPort()); sender.sendMessage(" -> Address: " + TextColor.WHITE + server.getAddress().getAddress().getHostAddress()+':'+server.getAddress().getPort());
if (server instanceof SubServer) sender.sendMessage(" -> Running: " + ((((SubServer) server).isRunning())?TextColor.GREEN+"yes":TextColor.RED+"no")); if (server instanceof SubServer) sender.sendMessage(" -> Running: " + ((((SubServer) server).isRunning())?TextColor.GREEN+"yes":TextColor.RED+"no"));
if (!(server instanceof SubServer) || ((SubServer) server).isRunning()) { if (!(server instanceof SubServer) || ((SubServer) server).isRunning()) {
sender.sendMessage(" -> Connected: " + ((server.getSubData() != null)?TextColor.GREEN+"yes":TextColor.RED+"no")); sender.sendMessage(" -> Connected: " + ((server.getSubData()[0] != null)?TextColor.GREEN+"yes"+((server.getSubData().length > 1)?TextColor.AQUA+" +"+(server.getSubData().length-1)+" subchannel"+((server.getSubData().length == 2)?"":"s"):""):TextColor.RED+"no"));
sender.sendMessage(" -> Players: " + TextColor.AQUA + server.getPlayers().size() + " online"); sender.sendMessage(" -> Players: " + TextColor.AQUA + server.getPlayers().size() + " online");
} }
sender.sendMessage(" -> MOTD: " + TextColor.WHITE + TextColor.stripColor(server.getMotd())); sender.sendMessage(" -> MOTD: " + TextColor.WHITE + TextColor.stripColor(server.getMotd()));
@ -255,7 +257,7 @@ public class SubCommand {
sender.sendMessage(" -> Available: " + ((host.isAvailable())?TextColor.GREEN+"yes":TextColor.RED+"no")); sender.sendMessage(" -> Available: " + ((host.isAvailable())?TextColor.GREEN+"yes":TextColor.RED+"no"));
sender.sendMessage(" -> Enabled: " + ((host.isEnabled())?TextColor.GREEN+"yes":TextColor.RED+"no")); sender.sendMessage(" -> Enabled: " + ((host.isEnabled())?TextColor.GREEN+"yes":TextColor.RED+"no"));
sender.sendMessage(" -> Address: " + TextColor.WHITE + host.getAddress().getHostAddress()); sender.sendMessage(" -> Address: " + TextColor.WHITE + host.getAddress().getHostAddress());
if (host.getSubData() != null) sender.sendMessage(" -> Connected: " + TextColor.GREEN + "yes"); if (host.getSubData().length > 0) sender.sendMessage(" -> Connected: " + ((host.getSubData()[0] != null)?TextColor.GREEN+"yes"+((host.getSubData().length > 1)?TextColor.AQUA+" +"+(host.getSubData().length-1)+" subchannel"+((host.getSubData().length == 2)?"":"s"):""):TextColor.RED+"no"));
sender.sendMessage(" -> SubServers: " + ((host.getSubServers().keySet().size() <= 0)?TextColor.GRAY + "(none)":TextColor.AQUA.toString() + host.getSubServers().keySet().size())); sender.sendMessage(" -> SubServers: " + ((host.getSubServers().keySet().size() <= 0)?TextColor.GRAY + "(none)":TextColor.AQUA.toString() + host.getSubServers().keySet().size()));
for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(" - " + ((subserver.isEnabled())?TextColor.WHITE:TextColor.GRAY) + subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')')); for (SubServer subserver : host.getSubServers().values()) sender.sendMessage(" - " + ((subserver.isEnabled())?TextColor.WHITE:TextColor.GRAY) + subserver.getDisplayName() + ((subserver.getName().equals(subserver.getDisplayName()))?"":" ("+subserver.getName()+')'));
sender.sendMessage(" -> Templates: " + ((host.getCreator().getTemplates().keySet().size() <= 0)?TextColor.GRAY + "(none)":TextColor.AQUA.toString() + host.getCreator().getTemplates().keySet().size())); sender.sendMessage(" -> Templates: " + ((host.getCreator().getTemplates().keySet().size() <= 0)?TextColor.GRAY + "(none)":TextColor.AQUA.toString() + host.getCreator().getTemplates().keySet().size()));
@ -273,7 +275,7 @@ public class SubCommand {
if (proxy != null) { if (proxy != null) {
sender.sendMessage("SubServers > Info on Proxy: " + TextColor.WHITE + proxy.getDisplayName()); sender.sendMessage("SubServers > Info on Proxy: " + TextColor.WHITE + proxy.getDisplayName());
if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(" -> System Name: " + TextColor.WHITE + proxy.getName()); if (!proxy.getName().equals(proxy.getDisplayName())) sender.sendMessage(" -> System Name: " + TextColor.WHITE + proxy.getName());
sender.sendMessage(" -> Connected: " + ((proxy.getSubData() != null)?TextColor.GREEN+"yes":TextColor.RED+"no")); sender.sendMessage(" -> Connected: " + ((proxy.getSubData()[0] != null)?TextColor.GREEN+"yes"+((proxy.getSubData().length > 1)?TextColor.AQUA+" +"+(proxy.getSubData().length-1)+" subchannel"+((proxy.getSubData().length == 2)?"":"s"):""):TextColor.RED+"no"));
sender.sendMessage(" -> Redis: " + ((proxy.isRedis())?TextColor.GREEN:TextColor.RED+"un") + "available"); sender.sendMessage(" -> Redis: " + ((proxy.isRedis())?TextColor.GREEN:TextColor.RED+"un") + "available");
if (proxy.isRedis()) sender.sendMessage(" -> Players: " + TextColor.AQUA + proxy.getPlayers().size() + " online"); if (proxy.isRedis()) sender.sendMessage(" -> Players: " + TextColor.AQUA + proxy.getPlayers().size() + " online");
sender.sendMessage(" -> Signature: " + TextColor.AQUA + proxy.getSignature()); sender.sendMessage(" -> Signature: " + TextColor.AQUA + proxy.getSignature());
@ -433,8 +435,8 @@ public class SubCommand {
@Override @Override
public void command(CommandSender sender, String handle, String[] args) { public void command(CommandSender sender, String handle, String[] args) {
if (args.length > 0) { if (args.length > 0) {
host.subdata.sendPacket(new PacketStartServer(null, args[0], data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketStartServer(null, args[0], data -> {
switch (data.getInt("r")) { switch (data.getInt(0x0001)) {
case 3: case 3:
sender.sendMessage("There is no server with that name"); sender.sendMessage("There is no server with that name");
break; break;
@ -454,10 +456,8 @@ public class SubCommand {
sender.sendMessage("That SubServer is already running"); sender.sendMessage("That SubServer is already running");
break; break;
case 9: case 9:
sender.sendMessage("That SubServer cannot start while these server(s) are running:", data.getRawString("m").split(":\\s")[1]); sender.sendMessage("That SubServer cannot start while these server(s) are running:", data.getRawString(0x0002));
break; break;
default:
host.log.warn.println("PacketStartServer(null, " + args[0] + ") responded with: " + data.getRawString("m"));
case 0: case 0:
case 1: case 1:
sender.sendMessage("Server was started successfully"); sender.sendMessage("Server was started successfully");
@ -502,8 +502,8 @@ public class SubCommand {
TimerTask starter = new TimerTask() { TimerTask starter = new TimerTask() {
@Override @Override
public void run() { public void run() {
host.subdata.sendPacket(new PacketStartServer(null, args[0], data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketStartServer(null, args[0], data -> {
switch (data.getInt("r")) { switch (data.getInt(0x0001)) {
case 3: case 3:
case 4: case 4:
sender.sendMessage("Could not restart server: That SubServer has disappeared"); sender.sendMessage("Could not restart server: That SubServer has disappeared");
@ -518,10 +518,8 @@ public class SubCommand {
sender.sendMessage("Could not restart server: That SubServer is no longer enabled"); sender.sendMessage("Could not restart server: That SubServer is no longer enabled");
break; break;
case 9: case 9:
sender.sendMessage("Could not restart server: That SubServer cannot start while these server(s) are running:", data.getRawString("m").split(":\\s")[1]); sender.sendMessage("Could not restart server: That SubServer cannot start while these server(s) are running:", data.getRawString(0x0002));
break; break;
default:
host.log.warn.println("PacketStartServer(null, " + args[0] + ") responded with: " + data.getRawString("m"));
case 8: case 8:
case 0: case 0:
case 1: case 1:
@ -533,12 +531,12 @@ public class SubCommand {
}; };
final Container<Boolean> listening = new Container<Boolean>(true); final Container<Boolean> listening = new Container<Boolean>(true);
PacketInRunEvent.callback("SubStoppedEvent", new Callback<YAMLSection>() { PacketInExRunEvent.callback("SubStoppedEvent", new Callback<ObjectMap<String>>() {
@Override @Override
public void run(YAMLSection json) { public void run(ObjectMap<String> json) {
try { try {
if (listening.get()) if (!json.getString("server").equalsIgnoreCase(args[0])) { if (listening.get()) if (!json.getString("server").equalsIgnoreCase(args[0])) {
PacketInRunEvent.callback("SubStoppedEvent", this); PacketInExRunEvent.callback("SubStoppedEvent", this);
} else { } else {
new Timer(SubAPI.getInstance().getAppInfo().getName() + "::Server_Restart_Command_Handler(" + args[0] + ')').schedule(starter, 100); new Timer(SubAPI.getInstance().getAppInfo().getName() + "::Server_Restart_Command_Handler(" + args[0] + ')').schedule(starter, 100);
} }
@ -546,9 +544,9 @@ public class SubCommand {
} }
}); });
host.subdata.sendPacket(new PacketStopServer(null, args[0], false, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketStopServer(null, args[0], false, data -> {
if (data.getInt("r") != 0) listening.set(false); if (data.getInt(0x0001) != 0) listening.set(false);
switch (data.getInt("r")) { switch (data.getInt(0x0001)) {
case 3: case 3:
sender.sendMessage("There is no server with that name"); sender.sendMessage("There is no server with that name");
break; break;
@ -558,8 +556,6 @@ public class SubCommand {
case 5: case 5:
starter.run(); starter.run();
break; break;
default:
host.log.warn.println("PacketStopServer(null, " + args[0] + ", false) responded with: " + data.getRawString("m"));
case 0: case 0:
case 1: case 1:
sender.sendMessage("Server was stopped successfully"); sender.sendMessage("Server was stopped successfully");
@ -585,8 +581,8 @@ public class SubCommand {
@Override @Override
public void command(CommandSender sender, String handle, String[] args) { public void command(CommandSender sender, String handle, String[] args) {
if (args.length > 0) { if (args.length > 0) {
host.subdata.sendPacket(new PacketStopServer(null, args[0], false, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketStopServer(null, args[0], false, data -> {
switch (data.getInt("r")) { switch (data.getInt(0x0001)) {
case 3: case 3:
sender.sendMessage("There is no server with that name"); sender.sendMessage("There is no server with that name");
break; break;
@ -600,10 +596,6 @@ public class SubCommand {
case 1: case 1:
sender.sendMessage("Server was stopped successfully"); sender.sendMessage("Server was stopped successfully");
break; break;
default:
host.log.warn.println("PacketStopServer(null, " + args[0] + ", false) responded with: " + data.getRawString("m"));
sender.sendMessage("Server was stopped successfully");
break;
} }
})); }));
} else { } else {
@ -625,8 +617,8 @@ public class SubCommand {
@Override @Override
public void command(CommandSender sender, String handle, String[] args) { public void command(CommandSender sender, String handle, String[] args) {
if (args.length > 0) { if (args.length > 0) {
host.subdata.sendPacket(new PacketStopServer(null, args[0], true, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketStopServer(null, args[0], true, data -> {
switch (data.getInt("r")) { switch (data.getInt(0x0001)) {
case 3: case 3:
sender.sendMessage("There is no server with that name"); sender.sendMessage("There is no server with that name");
break; break;
@ -636,8 +628,6 @@ public class SubCommand {
case 5: case 5:
sender.sendMessage("That SubServer is not running"); sender.sendMessage("That SubServer is not running");
break; break;
default:
host.log.warn.println("PacketStopServer(null, " + args[0] + ", true) responded with: " + data.getRawString("m"));
case 0: case 0:
case 1: case 1:
sender.sendMessage("Server was terminated successfully"); sender.sendMessage("Server was terminated successfully");
@ -672,8 +662,8 @@ public class SubCommand {
} while ((i + 1) != args.length); } while ((i + 1) != args.length);
} }
final String cmd = str; final String cmd = str;
host.subdata.sendPacket(new PacketCommandServer(null, args[0], cmd, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketCommandServer(null, args[0], cmd, data -> {
switch (data.getInt("r")) { switch (data.getInt(0x0001)) {
case 3: case 3:
sender.sendMessage("There is no server with that name"); sender.sendMessage("There is no server with that name");
break; break;
@ -683,8 +673,6 @@ public class SubCommand {
case 5: case 5:
sender.sendMessage("That SubServer is not running"); sender.sendMessage("That SubServer is not running");
break; break;
default:
host.log.warn.println("PacketCommandServer(null, " + args[0] + ", /" + cmd + ") responded with: " + data.getRawString("m"));
case 0: case 0:
case 1: case 1:
sender.sendMessage("Command was sent successfully"); sender.sendMessage("Command was sent successfully");
@ -715,8 +703,8 @@ public class SubCommand {
if (args.length > 4 && Util.isException(() -> Integer.parseInt(args[4]))) { if (args.length > 4 && Util.isException(() -> Integer.parseInt(args[4]))) {
sender.sendMessage("Invalid Port Number"); sender.sendMessage("Invalid Port Number");
} else { } else {
host.subdata.sendPacket(new PacketCreateServer(null, args[0], args[1], args[2], new Version(args[3]), (args.length > 4)?Integer.parseInt(args[4]):null, data -> { ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketCreateServer(null, args[0], args[1], args[2], new Version(args[3]), (args.length > 4)?Integer.parseInt(args[4]):null, data -> {
switch (data.getInt("r")) { switch (data.getInt(0x0001)) {
case 3: case 3:
sender.sendMessage("Server names cannot use spaces"); sender.sendMessage("Server names cannot use spaces");
case 4: case 4:
@ -738,13 +726,11 @@ public class SubCommand {
sender.sendMessage("That Template is not enabled"); sender.sendMessage("That Template is not enabled");
break; break;
case 10: case 10:
sender.sendMessage("SubCreator cannot create servers before Minecraft 1.8"); sender.sendMessage("That Template requires a Minecraft Version to be specified");
break; break;
case 11: case 11:
sender.sendMessage("Invalid Port Number"); sender.sendMessage("Invalid Port Number");
break; break;
default:
host.log.warn.println("PacketCreateServer(null, " + args[0] + ", " + args[1] + ", " + args[2] + ", " + args[3] + ", " + ((args.length > 4)?args[4]:"null") + ") responded with: " + data.getRawString("m"));
case 0: case 0:
case 1: case 1:
sender.sendMessage("Launching SubCreator..."); sender.sendMessage("Launching SubCreator...");
@ -753,7 +739,7 @@ public class SubCommand {
})); }));
} }
} else { } else {
sender.sendMessage("Usage: /" + handle + " <Name> <Host> <Template> <Version> <Port>"); sender.sendMessage("Usage: /" + handle + " <Name> <Host> <Template> [Version] [Port]");
} }
} }
}.autocomplete((sender, handle, args) -> { }.autocomplete((sender, handle, args) -> {
@ -798,15 +784,16 @@ public class SubCommand {
"The <Template> argument is required, and should be the name of", "The <Template> argument is required, and should be the name of",
"the template you want to create your server with.", "the template you want to create your server with.",
"", "",
"The <Version> argument is required, and should be a version", "When the [Version] argument is provided, it will set the",
"string of the type of server that you want to create", "Minecraft version of the type of server that you want to create",
"", "",
"When the <Port> argument is provided, it will set the port number", "When the [Port] argument is provided, it will set the port number",
"the server will listen on after it has been created.", "the server will listen on after it has been created.",
"", "",
"Examples:", "Examples:",
" /create ExampleServer ExampleHost Spigot 1.13.1", " /create ExampleServer ExampleHost Spigot",
" /create ExampleServer ExampleHost Spigot 1.13.1 25565" " /create ExampleServer ExampleHost Spigot 1.12.2",
" /create ExampleServer ExampleHost Spigot 1.12.2 25565"
).register("create"); ).register("create");
} }