Optimizations for developers

This commit is contained in:
ME1312 2021-06-05 22:44:33 -04:00
parent 42a73c8372
commit e1de6636f0
No known key found for this signature in database
GPG Key ID: FEFFE2F698E88FA8
12 changed files with 149 additions and 62 deletions

View File

@ -71,7 +71,7 @@ public class ExternalSubCreator extends SubCreator {
try {
if (file.isDirectory() && !file.getName().endsWith(".x")) {
ObjectMap<String> config = (new UniversalFile(file, "template.yml").exists())?new YAMLConfig(new UniversalFile(file, "template.yml")).get().getMap("Template", new ObjectMap<String>()):new ObjectMap<String>();
ServerTemplate template = new ServerTemplate(file.getName(), config.getBoolean("Enabled", true), config.getRawString("Icon", "::NULL::"), file, config.getMap("Build", new ObjectMap<String>()), config.getMap("Settings", new ObjectMap<String>()));
ServerTemplate template = loadTemplate(file.getName(), config.getBoolean("Enabled", true), config.getRawString("Icon", "::NULL::"), file, config.getMap("Build", new ObjectMap<String>()), config.getMap("Settings", new ObjectMap<String>()));
templatesR.put(file.getName().toLowerCase(), template);
if (config.getKeys().contains("Display")) template.setDisplayName(config.getString("Display"));
}

View File

@ -123,7 +123,7 @@ public class InternalSubCreator extends SubCreator {
}
server.setAll(template.getConfigOptions());
try {
Logger.get(prefix).info("Loading Template: " + template.getDisplayName());
Logger.get(prefix).info("Loading" + ((template.isDynamic())?" Dynamic":"") + " Template: " + template.getDisplayName());
if (template.getBuildOptions().getBoolean("Update-Files", false)) updateDirectory(template.getDirectory(), dir);
else Util.copyDirectory(template.getDirectory(), dir);
@ -369,7 +369,7 @@ public class InternalSubCreator extends SubCreator {
try {
if (file.isDirectory() && !file.getName().endsWith(".x")) {
ObjectMap<String> config = (new UniversalFile(file, "template.yml").exists()) ? new YAMLConfig(new UniversalFile(file, "template.yml")).get().getMap("Template", new ObjectMap<String>()) : new ObjectMap<String>();
ServerTemplate template = new ServerTemplate(file.getName(), config.getBoolean("Enabled", true), config.getRawString("Icon", "::NULL::"), file, config.getMap("Build", new ObjectMap<String>()), config.getMap("Settings", new ObjectMap<String>()));
ServerTemplate template = loadTemplate(file.getName(), config.getBoolean("Enabled", true), config.getRawString("Icon", "::NULL::"), file, config.getMap("Build", new ObjectMap<String>()), config.getMap("Settings", new ObjectMap<String>()));
templates.put(file.getName().toLowerCase(), template);
if (config.getKeys().contains("Display")) template.setDisplayName(config.getString("Display"));
}

View File

@ -18,6 +18,7 @@ import java.util.*;
*/
public abstract class SubCreator {
public static class ServerTemplate {
private final boolean dynamic;
private String name;
private String nick = null;
private boolean enabled;
@ -31,11 +32,17 @@ public abstract class SubCreator {
* Create a SubCreator Template
*
* @param name Template Name
* @param enabled Template Enabled Status
* @param icon Template Item Icon Name
* @param directory Template Directory
* @param build Build Options
* @param options Configuration Options
*/
public ServerTemplate(String name, boolean enabled, String icon, File directory, ObjectMap<String> build, ObjectMap<String> options) {
this(name, enabled, icon, directory, build, options, true);
}
private ServerTemplate(String name, boolean enabled, String icon, File directory, ObjectMap<String> build, ObjectMap<String> options, boolean dynamic) {
if (Util.isNull(name, enabled, directory, build, options)) throw new NullPointerException();
if (name.contains(" ")) throw new InvalidTemplateException("Template names cannot have spaces: " + name);
this.name = name;
@ -45,6 +52,7 @@ public abstract class SubCreator {
this.type = (build.contains("Server-Type"))?ServerType.valueOf(build.getRawString("Server-Type").toUpperCase()):ServerType.CUSTOM;
this.build = build;
this.options = options;
this.dynamic = dynamic;
}
/**
@ -150,6 +158,15 @@ public abstract class SubCreator {
return getBuildOptions().getBoolean("Can-Update", false);
}
/**
* Get whether this Template was generated by a SubCreator instance
*
* @return Custom Status
*/
public boolean isDynamic() {
return dynamic;
}
/**
* Get the Build Options for this Template
*
@ -490,6 +507,20 @@ public abstract class SubCreator {
*/
public abstract ServerTemplate getTemplate(String name);
/**
* Create a SubCreator Template
*
* @param name Template Name
* @param enabled Template Enabled Status
* @param icon Template Item Icon Name
* @param directory Template Directory
* @param build Build Options
* @param options Configuration Options
*/
protected ServerTemplate loadTemplate(String name, boolean enabled, String icon, File directory, ObjectMap<String> build, ObjectMap<String> options) {
return new ServerTemplate(name, enabled, icon, directory, build, options, false);
}
/**
* Reload SubCreator
*/

View File

@ -91,7 +91,19 @@ public class PacketExCreateServer implements PacketObjectIn<Integer>, PacketObje
} else {
data.set(0x0000, tracker);
data.set(0x0002, name);
data.set(0x0003, template.getName());
if (template.isDynamic()) {
ObjectMap<String> template = new ObjectMap<>();
template.set("name", this.template.getName());
template.set("display", this.template.getDisplayName());
template.set("enabled", this.template.isEnabled());
template.set("icon", this.template.getIcon());
template.set("dir", this.template.getDirectory().toString());
template.set("build", this.template.getBuildOptions().clone());
template.set("def", this.template.getConfigOptions().clone());
data.set(0x0003, template);
} else {
data.set(0x0003, template.getName());
}
data.set(0x0004, version);
data.set(0x0005, port);
data.set(0x0006, log);

View File

@ -11,6 +11,7 @@ import net.ME1312.SubServers.Bungee.Host.External.ExternalSubCreator;
import net.ME1312.SubServers.Bungee.Host.SubCreator;
import net.ME1312.SubServers.Bungee.SubProxy;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
@ -39,7 +40,8 @@ public class PacketExUploadTemplates implements PacketObjectIn<Integer>, PacketO
for (String name : templates.getKeys()) {
try {
UniversalFile dir = new UniversalFile(templatedir, name);
SubCreator.ServerTemplate template = new SubCreator.ServerTemplate(name, templates.getMap(name).getBoolean("enabled"), templates.getMap(name).getRawString("icon"), dir,
SubCreator.ServerTemplate template = Util.reflect(SubCreator.class.getDeclaredMethod("loadTemplate", String.class, boolean.class, String.class, File.class, ObjectMap.class, ObjectMap.class),
((ExternalHost) client.getHandler()).getCreator(), name, templates.getMap(name).getBoolean("enabled"), templates.getMap(name).getRawString("icon"), dir,
templates.getMap(name).getMap("build").clone(), templates.getMap(name).getMap("settings").clone());
map.put(name.toLowerCase(), template);
if (!templates.getMap(name).getRawString("display").equals(name)) template.setDisplayName(templates.getMap(name).getRawString("display"));

View File

@ -340,8 +340,8 @@ public final class SubProxy extends BungeeCommon implements Listener {
public void reload() throws IOException {
List<String> ukeys = new ArrayList<String>();
long begin = Calendar.getInstance().getTime().getTime();
boolean status;
if (!(status = ready)) resetDate = begin;
boolean status = ready;
if (!status) resetDate = begin;
reloading = true;
ConfigUpdater.updateConfig(new UniversalFile(dir, "SubServers:config.yml"));
@ -359,9 +359,9 @@ public final class SubProxy extends BungeeCommon implements Listener {
!config.get().getMap("Settings").getMap("SubData").getRawString("Address", "127.0.0.1:4391").equals(prevconfig.getMap("Settings").getMap("SubData").getRawString("Address", "127.0.0.1:4391")) ||
!config.get().getMap("Settings").getMap("SubData").getRawString("Encryption", "NONE").equals(prevconfig.getMap("Settings").getMap("SubData").getRawString("Encryption", "NONE"))
)) {
SubDataServer subdata = this.subdata;
subdata.close();
Util.isException(subdata::waitFor);
subdata = null;
}
SmartFallback.dns_forward = config.get().getMap("Settings").getMap("Smart-Fallback", new ObjectMap<>()).getBoolean("DNS-Forward", false);
@ -553,7 +553,31 @@ public final class SubProxy extends BungeeCommon implements Listener {
running = ready = true;
legServers.clear();
// Initialize SubData
int plugins = 0;
if (status) {
List<Runnable> listeners = api.reloadListeners;
if (listeners.size() > 0) {
Logger.get("SubServers").info("Reloading SubAPI Plugins...");
for (Runnable obj : listeners) {
try {
obj.run();
plugins++;
} catch (Throwable e) {
new InvocationTargetException(e, "Problem " + ((status)?"reloading":"enabling") + " plugin").printStackTrace();
}
}
}
for (Host host : api.getHosts().values()) if (host instanceof ClientHandler && ((ClientHandler) host).getSubData()[0] != null) ((SubDataClient) ((ClientHandler) host).getSubData()[0]).sendPacket(new PacketOutExReload(null));
for (Server server : api.getServers().values()) if (server.getSubData()[0] != null) ((SubDataClient) server.getSubData()[0]).sendPacket(new PacketOutExReload(null));
}
reloading = false;
Logger.get("SubServers").info(((plugins > 0)?plugins+" Plugin"+((plugins == 1)?"":"s")+", ":"") + hosts + " Host"+((hosts == 1)?"":"s")+", " + servers + " Server"+((servers == 1)?"":"s")+", and " + subservers + " SubServer"+((subservers == 1)?"":"s")+" "+((status)?"re":"")+"loaded in " + new DecimalFormat("0.000").format((Calendar.getInstance().getTime().getTime() - begin) / 1000D) + "s");
if (status) startDataListeners();
}
private void startDataListeners() throws IOException {
if (subdata == null) {
subprotocol.unregisterCipher("AES");
subprotocol.unregisterCipher("AES-128");
@ -605,7 +629,9 @@ public final class SubProxy extends BungeeCommon implements Listener {
subdata = subprotocol.open((config.get().getMap("Settings").getMap("SubData").getRawString("Address", "127.0.0.1:4391").split(":")[0].equals("0.0.0.0"))?
null:InetAddress.getByName(config.get().getMap("Settings").getMap("SubData").getRawString("Address", "127.0.0.1:4391").split(":")[0]),
Integer.parseInt(config.get().getMap("Settings").getMap("SubData").getRawString("Address", "127.0.0.1:4391").split(":")[1]), cipher);
} // Add new entries to Allowed-Connections
}
// Add new entries to Allowed-Connections
for (String s : config.get().getMap("Settings").getMap("SubData").getStringList("Whitelist", new ArrayList<String>())) {
try {
subdata.whitelist(s);
@ -613,28 +639,6 @@ public final class SubProxy extends BungeeCommon implements Listener {
e.printStackTrace();
}
}
int plugins = 0;
if (status) {
List<Runnable> listeners = api.reloadListeners;
if (listeners.size() > 0) {
Logger.get("SubServers").info("Reloading SubAPI Plugins...");
for (Runnable obj : listeners) {
try {
obj.run();
plugins++;
} catch (Throwable e) {
new InvocationTargetException(e, "Problem " + ((status)?"reloading":"enabling") + " plugin").printStackTrace();
}
}
}
for (Host host : api.getHosts().values()) if (host instanceof ClientHandler && ((ClientHandler) host).getSubData()[0] != null) ((SubDataClient) ((ClientHandler) host).getSubData()[0]).sendPacket(new PacketOutExReload(null));
for (Server server : api.getServers().values()) if (server.getSubData()[0] != null) ((SubDataClient) server.getSubData()[0]).sendPacket(new PacketOutExReload(null));
}
reloading = false;
Logger.get("SubServers").info(((plugins > 0)?plugins+" Plugin"+((plugins == 1)?"":"s")+", ":"") + hosts + " Host"+((hosts == 1)?"":"s")+", " + servers + " Server"+((servers == 1)?"":"s")+", and " + subservers + " SubServer"+((subservers == 1)?"":"s")+" "+((status)?"re":"")+"loaded in " + new DecimalFormat("0.000").format((Calendar.getInstance().getTime().getTime() - begin) / 1000D) + "s");
}
@Override
@ -650,6 +654,7 @@ public final class SubProxy extends BungeeCommon implements Listener {
getLogger().warning("UPnP service is unavailable. SubServers can't port-forward for you from this device.");
}
startDataListeners();
super.startListeners();
if (autorun != null && autorun.size() > 0) {
@ -819,9 +824,10 @@ public final class SubProxy extends BungeeCommon implements Listener {
rPlayerLinkP.clear();
rPlayers.clear();
try {
if (subdata != null) try {
SubDataServer subdata = this.subdata;
subdata.close();
Thread.sleep(500);
subdata.waitFor();
} catch (InterruptedException | IOException e) {}
if (shutdown) super.isRunning = false;

View File

@ -1,7 +1,7 @@
package net.ME1312.SubServers.Client.Bukkit.Event;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubData.Client.DataClient;
import net.ME1312.SubServers.Client.Bukkit.Library.SubEvent;
import org.bukkit.event.Event;
@ -11,12 +11,12 @@ import org.bukkit.event.HandlerList;
* SubData Network Connect Event
*/
public class SubNetworkConnectEvent extends Event implements SubEvent {
private SubDataClient network;
private DataClient network;
/**
* SubData Network Connect Event
*/
public SubNetworkConnectEvent(SubDataClient network) {
public SubNetworkConnectEvent(DataClient network) {
if (Util.isNull(network)) throw new NullPointerException();
this.network = network;
}
@ -26,7 +26,7 @@ public class SubNetworkConnectEvent extends Event implements SubEvent {
*
* @return SubData Network
*/
public SubDataClient getNetwork() {
public DataClient getNetwork() {
return network;
}

View File

@ -1,7 +1,7 @@
package net.ME1312.SubServers.Client.Sponge.Event;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubData.Client.DataClient;
import net.ME1312.SubServers.Client.Sponge.Library.SubEvent;
import org.spongepowered.api.event.cause.Cause;
@ -11,12 +11,12 @@ import org.spongepowered.api.event.impl.AbstractEvent;
* SubData Network Connect Event
*/
public class SubNetworkConnectEvent extends AbstractEvent implements SubEvent {
private SubDataClient network;
private DataClient network;
/**
* SubData Network Connect Event
*/
public SubNetworkConnectEvent(SubDataClient network) {
public SubNetworkConnectEvent(DataClient network) {
if (Util.isNull(network)) throw new NullPointerException();
this.network = network;
}
@ -26,7 +26,7 @@ public class SubNetworkConnectEvent extends AbstractEvent implements SubEvent {
*
* @return SubData Network
*/
public SubDataClient getNetwork() {
public DataClient getNetwork() {
return network;
}

View File

@ -2,18 +2,18 @@ package net.ME1312.SubServers.Host.Event;
import net.ME1312.Galaxi.Event.Event;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubData.Client.DataClient;
/**
* SubData Network Connect Event
*/
public class SubNetworkConnectEvent extends Event {
private SubDataClient network;
private DataClient network;
/**
* SubData Network Connect Event
*/
public SubNetworkConnectEvent(SubDataClient network) {
public SubNetworkConnectEvent(DataClient network) {
if (Util.isNull(network)) throw new NullPointerException();
this.network = network;
}
@ -23,7 +23,7 @@ public class SubNetworkConnectEvent extends Event {
*
* @return SubData Network
*/
public SubDataClient getNetwork() {
public DataClient getNetwork() {
return network;
}
}

View File

@ -42,6 +42,7 @@ public class SubCreatorImpl {
private TreeMap<String, CreatorTask> thread;
public static class ServerTemplate extends SubCreator.ServerTemplate {
private final boolean dynamic;
private String name;
private String nick = null;
private boolean enabled;
@ -55,11 +56,17 @@ public class SubCreatorImpl {
* Create a SubCreator Template
*
* @param name Template Name
* @param enabled Template Enabled Status
* @param icon Template Item Icon Name
* @param directory Template Directory
* @param build Build Options
* @param options Configuration Options
*/
public ServerTemplate(String name, boolean enabled, String icon, File directory, ObjectMap<String> build, ObjectMap<String> options) {
this(name, enabled, icon, directory, build, options, true);
}
private ServerTemplate(String name, boolean enabled, String icon, File directory, ObjectMap<String> build, ObjectMap<String> options, boolean dynamic) {
super(toRaw(name, enabled, icon, directory, build, options));
if (name.contains(" ")) throw new InvalidTemplateException("Template names cannot have spaces: " + name);
this.name = name;
@ -69,6 +76,7 @@ public class SubCreatorImpl {
this.type = (build.contains("Server-Type"))?ServerType.valueOf(build.getRawString("Server-Type").toUpperCase()):ServerType.CUSTOM;
this.build = build;
this.options = options;
this.dynamic = dynamic;
}
/**
@ -175,6 +183,15 @@ public class SubCreatorImpl {
return getBuildOptions().getBoolean("Can-Update", false);
}
/**
* Get whether this Template was generated by a SubCreator instance
*
* @return Custom Status
*/
public boolean isDynamic() {
return dynamic;
}
/**
* Get the Build Options for this Template
*
@ -201,6 +218,8 @@ public class SubCreatorImpl {
tinfo.set("display", name);
tinfo.set("icon", icon);
tinfo.set("type", (build.contains("Server-Type"))?ServerType.valueOf(build.getRawString("Server-Type").toUpperCase()):ServerType.CUSTOM);
tinfo.set("version-req", build.getBoolean("Require-Version", false));
tinfo.set("can-update", build.getBoolean("Can-Update", false));
return tinfo;
}
}
@ -218,7 +237,7 @@ public class SubCreatorImpl {
try {
if (file.isDirectory() && !file.getName().endsWith(".x")) {
ObjectMap<String> config = (new UniversalFile(file, "template.yml").exists())?new YAMLConfig(new UniversalFile(file, "template.yml")).get().getMap("Template", new ObjectMap<String>()):new ObjectMap<String>();
ServerTemplate template = new ServerTemplate(file.getName(), config.getBoolean("Enabled", true), config.getRawString("Icon", "::NULL::"), file, config.getMap("Build", new ObjectMap<String>()), config.getMap("Settings", new ObjectMap<String>()));
ServerTemplate template = new ServerTemplate(file.getName(), config.getBoolean("Enabled", true), config.getRawString("Icon", "::NULL::"), file, config.getMap("Build", new ObjectMap<String>()), config.getMap("Settings", new ObjectMap<String>()), false);
templates.put(file.getName().toLowerCase(), template);
if (config.getKeys().contains("Display")) template.setDisplayName(config.getString("Display"));
}
@ -300,7 +319,7 @@ public class SubCreatorImpl {
}
server.setAll(template.getConfigOptions());
try {
log.logger.info.println("Loading Template: " + template.getDisplayName());
log.logger.info.println("Loading" + ((template.isDynamic())?" Dynamic":"") + " Template: " + template.getDisplayName());
((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Loading Template: " + template.getDisplayName()));
if (template.getBuildOptions().getBoolean("Update-Files", false)) updateDirectory(template.getDirectory(), dir);
else Util.copyDirectory(template.getDirectory(), dir);

View File

@ -1,6 +1,7 @@
package net.ME1312.SubServers.Host.Network.Packet;
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.Version.Version;
import net.ME1312.SubData.Client.Protocol.PacketObjectIn;
@ -8,7 +9,9 @@ import net.ME1312.SubData.Client.Protocol.PacketObjectOut;
import net.ME1312.SubData.Client.SubDataSender;
import net.ME1312.SubServers.Host.ExHost;
import net.ME1312.SubServers.Host.Executable.SubCreatorImpl;
import net.ME1312.SubServers.Host.Executable.SubCreatorImpl.ServerTemplate;
import java.io.File;
import java.util.Map;
import java.util.UUID;
@ -74,7 +77,7 @@ public class PacketExCreateServer implements PacketObjectIn<Integer>, PacketObje
@Override
public void receive(SubDataSender client, ObjectMap<Integer> data) {
UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null);
UUID tracker = (data.contains(0x0000)?data.getUUID(0x0000):null);
try {
if (data.contains(0x0001)) {
if (data.contains(0x0001)) {
@ -84,16 +87,30 @@ public class PacketExCreateServer implements PacketObjectIn<Integer>, PacketObje
}
client.sendPacket(new PacketExCreateServer(1, null, tracker));
} else {
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);
Boolean mode = (data.contains(0x0007)?data.getBoolean(0x0007):null);
UUID player = (data.contains(0x0008)?data.getUUID(0x0008):null);
String name = data.getRawString(0x0002);
ObjectMapValue<Integer> template = data.get(0x0003);
Version version = (data.contains(0x0004)?data.getVersion(0x0004):null);
Integer port = data.getInt(0x0005);
UUID log = data.getUUID(0x0006);
Boolean mode = (data.contains(0x0007)?data.getBoolean(0x0007):null);
UUID player = (data.contains(0x0008)?data.getUUID(0x0008):null);
SubCreatorImpl.ServerTemplate templateV = host.templates.get(template.toLowerCase());
if (templateV == null) templateV = host.templatesR.get(template.toLowerCase());
SubCreatorImpl.ServerTemplate templateV;
if (template.isString()) {
templateV = host.templates.get(template.asRawString().toLowerCase());
if (templateV == null) templateV = host.templatesR.get(template.asRawString().toLowerCase());
} else {
ObjectMap<String> templateM = template.asMap().key();
templateV = new ServerTemplate(
templateM.getRawString("name"),
templateM.getBoolean("enabled"),
templateM.getRawString("icon"),
new File(templateM.getRawString("dir").replace('/', File.separatorChar)),
templateM.getMap("build"),
templateM.getMap("def"));
templateV.setDisplayName(templateM.getRawString("display"));
}
host.creator.create(player, name, templateV, version, port, mode, log, tracker);
}

View File

@ -1,7 +1,7 @@
package net.ME1312.SubServers.Sync.Event;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubData.Client.DataClient;
import net.ME1312.SubServers.Sync.Library.SubEvent;
import net.md_5.bungee.api.plugin.Event;
@ -10,12 +10,12 @@ import net.md_5.bungee.api.plugin.Event;
* SubData Network Connect Event
*/
public class SubNetworkConnectEvent extends Event implements SubEvent {
private SubDataClient network;
private DataClient network;
/**
* SubData Network Connect Event
*/
public SubNetworkConnectEvent(SubDataClient network) {
public SubNetworkConnectEvent(DataClient network) {
if (Util.isNull(network)) throw new NullPointerException();
this.network = network;
}
@ -25,7 +25,7 @@ public class SubNetworkConnectEvent extends Event implements SubEvent {
*
* @return SubData Network
*/
public SubDataClient getNetwork() {
public DataClient getNetwork() {
return network;
}
}