diff --git a/SubServers.Bungee/pom.xml b/SubServers.Bungee/pom.xml
index 03268313..666438b9 100644
--- a/SubServers.Bungee/pom.xml
+++ b/SubServers.Bungee/pom.xml
@@ -85,6 +85,7 @@
+
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java
index 992615ab..2df2537f 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubCreator.java
@@ -71,7 +71,7 @@ public class ExternalSubCreator extends SubCreator {
try {
if (file.isDirectory() && !file.getName().endsWith(".x")) {
ObjectMap config = (new UniversalFile(file, "template.yml").exists())?new YAMLConfig(new UniversalFile(file, "template.yml")).get().getMap("Template", new ObjectMap()):new ObjectMap();
- ServerTemplate template = loadTemplate(file.getName(), config.getBoolean("Enabled", true), config.getRawString("Icon", "::NULL::"), file, config.getMap("Build", new ObjectMap()), config.getMap("Settings", new ObjectMap()));
+ ServerTemplate template = loadTemplate(file.getName(), config.getBoolean("Enabled", true), config.getBoolean("Internal", false), config.getRawString("Icon", "::NULL::"), file, config.getMap("Build", new ObjectMap()), config.getMap("Settings", new ObjectMap()));
templatesR.put(file.getName().toLowerCase(), template);
if (config.getKeys().contains("Display")) template.setDisplayName(config.getString("Display"));
}
@@ -82,7 +82,6 @@ public class ExternalSubCreator extends SubCreator {
}
if (host.available && !Util.getDespiteException(() -> Util.reflect(SubProxy.class.getDeclaredField("reloading"), host.plugin), false)) {
- host.queue(new PacketExConfigureHost(host.plugin, host));
host.queue(new PacketExUploadTemplates(host.plugin));
if (enableRT == null || enableRT) host.queue(new PacketExDownloadTemplates(host.plugin, host));
}
@@ -115,7 +114,6 @@ public class ExternalSubCreator extends SubCreator {
logger.start();
host.queue(new PacketExCreateServer(player, name, template, version, port, logger.getExternalAddress(), data -> {
finish(player, null, name, template, version, fport, prefix, origin, data, callback);
- logger.stop();
this.thread.remove(name.toLowerCase());
}));
return true;
@@ -156,7 +154,6 @@ public class ExternalSubCreator extends SubCreator {
((ExternalSubServer) server).updating(false);
if (callback != null) callback.run(s != null);
});
- logger.stop();
this.thread.remove(name.toLowerCase());
}));
return true;
@@ -334,14 +331,26 @@ public class ExternalSubCreator extends SubCreator {
@Override
public Map getTemplates() {
TreeMap map = new TreeMap();
- if (enableRT != null && enableRT) map.putAll(templatesR);
- map.putAll(templates);
+ if (enableRT != null && enableRT) for (Map.Entry template : templatesR.entrySet()) {
+ if (!template.getValue().isInternal()) map.put(template.getKey(), template.getValue());
+ }
+ for (Map.Entry template : templates.entrySet()) {
+ if (!template.getValue().isInternal()) map.put(template.getKey(), template.getValue());
+ }
return map;
}
@Override
public ServerTemplate getTemplate(String name) {
if (Util.isNull(name)) throw new NullPointerException();
- return getTemplates().get(name.toLowerCase());
+ name = name.toLowerCase();
+
+ ServerTemplate template = templates.getOrDefault(name, null);
+ if (template == null && enableRT != null && enableRT) template = templatesR.getOrDefault(name, null);
+ if (template == null || template.isInternal()) {
+ return null;
+ } else {
+ return template;
+ }
}
}
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubLogger.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubLogger.java
index e64c5cc8..f5b63160 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubLogger.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/External/ExternalSubLogger.java
@@ -13,7 +13,9 @@ import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Calendar;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -72,29 +74,17 @@ public class ExternalSubLogger extends SubLogger {
}
@SuppressWarnings("deprecation")
- private void log(String line) {
+ private void log(String type, String msg) {
if (started) {
- String msg = line;
Level level;
- // REGEX Formatting
- String type = "";
- Matcher matcher = Pattern.compile("^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|INFO|WARNING|WARN|ERROR|ERR|SEVERE)\\]?:?(?:\\s*>)?\\s*)").matcher(msg.replaceAll("\u001B\\[[;\\d]*m", ""));
- while (matcher.find()) {
- type = matcher.group(3).toUpperCase();
- }
-
- msg = msg.substring(msg.length() - msg.replaceAll("^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|INFO|WARNING|WARN|ERROR|ERR|SEVERE)\\]?:?(?:\\s*>)?\\s*)", "").length());
-
// Determine LOG LEVEL
switch (type) {
- case "WARNING":
case "WARN":
level = Level.WARNING;
break;
case "SEVERE":
case "ERROR":
- case "ERR":
level = Level.SEVERE;
break;
default:
@@ -117,7 +107,7 @@ public class ExternalSubLogger extends SubLogger {
// Log to FILE
if (writer != null) {
- writer.println(line);
+ writer.println('[' + new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()) + "] [" + level + "] > " + msg);
writer.flush();
}
}
@@ -147,7 +137,6 @@ public class ExternalSubLogger extends SubLogger {
@Override
public void stop() {
if (started) {
- PacketInExLogMessage.unregister(id);
id = null;
started = false;
List filters = new ArrayList();
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java
index 328b45bc..0c2ddf48 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubCreator.java
@@ -102,30 +102,24 @@ public class InternalSubCreator extends SubCreator {
if (templates.get(other.toLowerCase()).isEnabled()) {
if (version != null || !templates.get(other.toLowerCase()).requiresVersion()) {
if (update == null || templates.get(other.toLowerCase()).canUpdate()) {
- ObjectMap config = build(dir, templates.get(other.toLowerCase()), history);
- if (config == null) {
- throw new SubCreatorException();
- } else {
- server.setAll(config);
- }
+ server.setAll(this.build(dir, templates.get(other.toLowerCase()), history));
} else {
- Logger.get(prefix).info("Skipping template that cannot be run in update mode: " + other);
+ Logger.get(prefix).warning("Skipping template that cannot be run in update mode: " + other);
}
} else {
- Logger.get(prefix).info("Skipping template that requires extra versioning information: " + other);
+ Logger.get(prefix).warning("Skipping template that requires extra versioning information: " + other);
}
} else {
- Logger.get(prefix).info("Skipping disabled template: " + other);
+ Logger.get(prefix).warning("Skipping disabled template: " + other);
}
} else {
- Logger.get(prefix).info("Skipping missing template: " + other);
+ Logger.get(prefix).warning("Skipping missing template: " + other);
}
}
server.setAll(template.getConfigOptions());
try {
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);
+ updateDirectory(template.getDirectory(), dir, template.getBuildOptions().getBoolean("Update-Files", false));
for (ObjectMapValue replacement : template.getBuildOptions().getMap("Replacements", new ObjectMap<>()).getValues()) if (!replacement.isNull()) {
replacements.put(replacement.getHandle().toLowerCase().replace('-', '_').replace(' ', '_'), replacement.asRawString());
@@ -235,7 +229,6 @@ public class InternalSubCreator extends SubCreator {
declaration.run();
File dir = (update != null)?new File(update.getFullPath()):new File(host.getPath(),
(template.getConfigOptions().contains("Directory"))?new ReplacementScanner(replacements).replace(template.getConfigOptions().getRawString("Directory")).toString():name);
- dir.mkdirs();
ObjectMap server = new ObjectMap();
ObjectMap config;
@@ -366,7 +359,7 @@ public class InternalSubCreator extends SubCreator {
try {
if (file.isDirectory() && !file.getName().endsWith(".x")) {
ObjectMap config = (new UniversalFile(file, "template.yml").exists()) ? new YAMLConfig(new UniversalFile(file, "template.yml")).get().getMap("Template", new ObjectMap()) : new ObjectMap();
- ServerTemplate template = loadTemplate(file.getName(), config.getBoolean("Enabled", true), config.getRawString("Icon", "::NULL::"), file, config.getMap("Build", new ObjectMap()), config.getMap("Settings", new ObjectMap()));
+ ServerTemplate template = loadTemplate(file.getName(), config.getBoolean("Enabled", true), config.getBoolean("Internal", false), config.getRawString("Icon", "::NULL::"), file, config.getMap("Build", new ObjectMap()), config.getMap("Settings", new ObjectMap()));
templates.put(file.getName().toLowerCase(), template);
if (config.getKeys().contains("Display")) template.setDisplayName(config.getString("Display"));
}
@@ -550,13 +543,23 @@ public class InternalSubCreator extends SubCreator {
@Override
public Map getTemplates() {
- return new TreeMap(templates);
+ TreeMap map = new TreeMap();
+ for (Map.Entry template : templates.entrySet()) {
+ if (!template.getValue().isInternal()) map.put(template.getKey(), template.getValue());
+ }
+ return map;
}
@Override
public ServerTemplate getTemplate(String name) {
if (Util.isNull(name)) throw new NullPointerException();
- return getTemplates().get(name.toLowerCase());
+
+ ServerTemplate template = templates.getOrDefault(name.toLowerCase(), null);
+ if (template == null || template.isInternal()) {
+ return null;
+ } else {
+ return template;
+ }
}
private static Pair> subdata = null;
@@ -598,23 +601,21 @@ public class InternalSubCreator extends SubCreator {
}
}
- private void updateDirectory(File from, File to) {
- if (from.isDirectory() && !Files.isSymbolicLink(from.toPath())) {
- if (!to.exists()) {
- to.mkdirs();
- }
-
+ private void updateDirectory(File from, File to, boolean overwrite) {
+ if (!to.exists()) {
+ Util.copyDirectory(from, to);
+ } else if (from.isDirectory() && !Files.isSymbolicLink(from.toPath())) {
String files[] = from.list();
for (String file : files) {
File srcFile = new File(from, file);
File destFile = new File(to, file);
- updateDirectory(srcFile, destFile);
+ updateDirectory(srcFile, destFile, overwrite);
}
} else {
try {
- if (!to.exists() || from.length() != to.length() || !Arrays.equals(generateSHA256(to), generateSHA256(from))) {
+ if (overwrite && (from.length() != to.length() || !Arrays.equals(generateSHA256(to), generateSHA256(from)))) {
if (to.exists()) {
if (to.isDirectory()) Util.deleteDirectory(to);
else to.delete();
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubLogger.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubLogger.java
index d4475766..d712ff6b 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubLogger.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/Internal/InternalSubLogger.java
@@ -90,6 +90,7 @@ public class InternalSubLogger extends SubLogger {
}
}
+ private static final String PATTERN = "^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(DEBUG|MESSAGE|MSG|" + Pattern.quote(Level.INFO.getLocalizedName()) + "|INFO|" + Pattern.quote(Level.WARNING.getLocalizedName()) + "|WARNING|WARN|ERROR|ERR|" + Pattern.quote(Level.SEVERE.getLocalizedName()) + "|SEVERE)\\]?:?(?:\\s*>)?\\s*)";
private void log(String line) {
if (!line.startsWith(">")) {
String msg = line;
@@ -97,15 +98,19 @@ public class InternalSubLogger extends SubLogger {
// REGEX Formatting
String type = "";
- Matcher matcher = Pattern.compile("^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|INFO|WARNING|WARN|ERROR|ERR|SEVERE)\\]?:?(?:\\s*>)?\\s*)").matcher(msg.replaceAll("\u001B\\[[;\\d]*m", ""));
+ Matcher matcher = Pattern.compile(PATTERN).matcher(msg.replaceAll("\u001B\\[[;\\d]*m", ""));
while (matcher.find()) {
type = matcher.group(3).toUpperCase();
}
- msg = msg.replaceAll("^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|INFO|WARNING|WARN|ERROR|ERR|SEVERE)\\]?:?(?:\\s*>)?\\s*)", "");
+ msg = msg.replaceAll(PATTERN, "");
// Determine LOG LEVEL
- switch (type) {
+ if (type.equalsIgnoreCase(Level.WARNING.getLocalizedName())) {
+ level = Level.WARNING;
+ } else if (type.equalsIgnoreCase(Level.SEVERE.getLocalizedName())) {
+ level = Level.SEVERE;
+ } else switch (type) {
case "WARNING":
case "WARN":
level = Level.WARNING;
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubCreator.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubCreator.java
index 77a43291..f2085f72 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubCreator.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Host/SubCreator.java
@@ -22,6 +22,7 @@ public abstract class SubCreator {
private String name;
private String nick = null;
private boolean enabled;
+ private boolean internal;
private String icon;
private File directory;
private ServerType type;
@@ -39,14 +40,15 @@ public abstract class SubCreator {
* @param options Configuration Options
*/
public ServerTemplate(String name, boolean enabled, String icon, File directory, ObjectMap build, ObjectMap options) {
- this(name, enabled, icon, directory, build, options, true);
+ this(name, enabled, false, icon, directory, build, options, true);
}
- private ServerTemplate(String name, boolean enabled, String icon, File directory, ObjectMap build, ObjectMap options, boolean dynamic) {
+ private ServerTemplate(String name, boolean enabled, boolean internal, String icon, File directory, ObjectMap build, ObjectMap 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;
this.enabled = enabled;
+ this.internal = internal;
this.icon = icon;
this.directory = directory;
this.type = (build.contains("Server-Type"))?ServerType.valueOf(build.getRawString("Server-Type").toUpperCase()):ServerType.CUSTOM;
@@ -104,6 +106,15 @@ public abstract class SubCreator {
enabled = value;
}
+ /**
+ * Get if this Template is for Internal use only
+ *
+ * @return Internal Status
+ */
+ public boolean isInternal() {
+ return internal;
+ }
+
/**
* Get the Item Icon for this Template
*
@@ -161,7 +172,7 @@ public abstract class SubCreator {
/**
* Get whether this Template was generated by a SubCreator instance
*
- * @return Custom Status
+ * @return Dynamic Status
*/
public boolean isDynamic() {
return dynamic;
@@ -512,13 +523,14 @@ public abstract class SubCreator {
*
* @param name Template Name
* @param enabled Template Enabled Status
+ * @param internal Template Internal 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 build, ObjectMap options) {
- return new ServerTemplate(name, enabled, icon, directory, build, options, false);
+ protected ServerTemplate loadTemplate(String name, boolean enabled, boolean internal, String icon, File directory, ObjectMap build, ObjectMap options) {
+ return new ServerTemplate(name, enabled, internal, icon, directory, build, options, false);
}
/**
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExUploadTemplates.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExUploadTemplates.java
index 801b329b..b0bd3183 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExUploadTemplates.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketExUploadTemplates.java
@@ -40,8 +40,8 @@ public class PacketExUploadTemplates implements PacketObjectIn, PacketO
for (String name : templates.getKeys()) {
try {
UniversalFile dir = new UniversalFile(templatedir, name);
- 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,
+ SubCreator.ServerTemplate template = Util.reflect(SubCreator.class.getDeclaredMethod("loadTemplate", String.class, boolean.class, boolean.class, String.class, File.class, ObjectMap.class, ObjectMap.class),
+ ((ExternalHost) client.getHandler()).getCreator(), name, templates.getMap(name).getBoolean("enabled"), templates.getMap(name).getBoolean("internal"), 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"));
@@ -55,6 +55,6 @@ public class PacketExUploadTemplates implements PacketObjectIn, PacketO
@Override
public int version() {
- return 0x0001;
+ return 0x0002;
}
}
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketInExLogMessage.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketInExLogMessage.java
index 8d0eb152..ec6fcd31 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketInExLogMessage.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketInExLogMessage.java
@@ -23,8 +23,12 @@ public class PacketInExLogMessage implements PacketObjectIn {
@Override
public void receive(SubDataClient client, ObjectMap data) {
try {
- if (data.contains(0x0000) && data.contains(0x0001) && loggers.keySet().contains(data.getUUID(0x0000))) {
- Util.reflect(ExternalSubLogger.class.getDeclaredMethod("log", String.class), loggers.get(data.getUUID(0x0000)), data.getRawString(0x0001));
+ if (data.contains(0x0000) && loggers.keySet().contains(data.getUUID(0x0000))) {
+ if (data.contains(0x0001) && data.contains(0x0002)) {
+ Util.reflect(ExternalSubLogger.class.getDeclaredMethod("log", String.class, String.class), loggers.get(data.getUUID(0x0000)), data.getRawString(0x0001), data.getRawString(0x0002));
+ } else {
+ unregister(data.getUUID(0x0000));
+ }
}
} catch (Exception e) {
e.printStackTrace();
@@ -33,7 +37,7 @@ public class PacketInExLogMessage implements PacketObjectIn {
@Override
public int version() {
- return 0x0001;
+ return 0x0002;
}
/**
@@ -54,6 +58,6 @@ public class PacketInExLogMessage implements PacketObjectIn {
* @param id External Address
*/
public static void unregister(UUID id) {
- loggers.remove(id);
+ loggers.remove(id).stop();
}
}
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkExHost.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkExHost.java
index 5f4bd9d2..e0464d3e 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkExHost.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkExHost.java
@@ -65,7 +65,7 @@ public class PacketLinkExHost implements InitialPacket, PacketObjectIn,
HashMap subdata = Util.getDespiteException(() -> Util.reflect(ExternalHost.class.getDeclaredField("subdata"), host), null);
if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) {
((ExternalHost) host).setSubData(client, channel);
- Logger.get("SubData").info(client.getAddress().toString() + " has been defined as Host: " + host.getName() + ((channel > 0)?" (Sub-"+channel+")":""));
+ Logger.get("SubData").info(client.getAddress().toString() + " has been defined as Host: " + host.getName() + ((channel > 0)?" [+"+channel+"]":""));
queue(host.getName(), () -> client.sendPacket(new PacketLinkExHost(0, null)));
setReady(client);
} else {
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java
index ceb0d014..dc99cad3 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkProxy.java
@@ -76,7 +76,7 @@ public class PacketLinkProxy implements InitialPacket, PacketObjectIn,
if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) {
proxy.setSubData(client, channel);
if (isnew) plugin.getPluginManager().callEvent(new SubAddProxyEvent(proxy));
- Logger.get("SubData").info(client.getAddress().toString() + " has been defined as Proxy: " + proxy.getName() + ((channel > 0)?" (Sub-"+channel+")":""));
+ Logger.get("SubData").info(client.getAddress().toString() + " has been defined as Proxy: " + proxy.getName() + ((channel > 0)?" [+"+channel+"]":""));
queue(proxy.getName(), () -> client.sendPacket(new PacketLinkProxy(proxy.getName(), 0, null)));
setReady(client);
} else {
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java
index e680e5c5..8d149de1 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/Network/Packet/PacketLinkServer.java
@@ -107,7 +107,7 @@ public class PacketLinkServer implements InitialPacket, PacketObjectIn,
HashMap subdata = Util.getDespiteException(() -> Util.reflect(ServerImpl.class.getDeclaredField("subdata"), server), null);
if (!subdata.keySet().contains(channel) || (channel == 0 && subdata.get(0) == null)) {
server.setSubData(client, channel);
- Logger.get("SubData").info(client.getAddress().toString() + " has been defined as " + ((server instanceof SubServer) ? "SubServer" : "Server") + ": " + server.getName() + ((channel > 0)?" (Sub-"+channel+")":""));
+ Logger.get("SubData").info(client.getAddress().toString() + " has been defined as " + ((server instanceof SubServer) ? "SubServer" : "Server") + ": " + server.getName() + ((channel > 0)?" [+"+channel+"]":""));
Runnable register = () -> {
if (server instanceof SubServer && !((SubServer) server).isRunning()) {
if (((SubServer) server).getHost().isAvailable()) {
diff --git a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java
index f2c8b0e6..58e98552 100644
--- a/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java
+++ b/SubServers.Bungee/src/net/ME1312/SubServers/Bungee/SubProxy.java
@@ -90,7 +90,7 @@ public final class SubProxy extends BungeeCommon implements Listener {
public SubProtocol subprotocol;
public SubDataServer subdata = null;
public SubServer sudo = null;
- public static final Version version = Version.fromString("2.17b/p1");
+ public static final Version version = Version.fromString("2.17.1a");
public final Proxy mProxy;
public boolean canSudo = false;
@@ -146,6 +146,9 @@ public final class SubProxy extends BungeeCommon implements Listener {
Util.unzip(SubProxy.class.getResourceAsStream("/net/ME1312/SubServers/Bungee/Library/Files/Templates/paper.zip"), new UniversalFile(dir, "Templates"));
Logger.get("SubServers").info("Created ./SubServers/Templates/Paper");
+ Util.unzip(SubProxy.class.getResourceAsStream("/net/ME1312/SubServers/Bungee/Library/Files/Templates/purpur.zip"), new UniversalFile(dir, "Templates"));
+ Logger.get("SubServers").info("Created ./SubServers/Templates/Purpur");
+
Util.unzip(SubProxy.class.getResourceAsStream("/net/ME1312/SubServers/Bungee/Library/Files/Templates/forge.zip"), new UniversalFile(dir, "Templates"));
Logger.get("SubServers").info("Created ./SubServers/Templates/Forge");
@@ -170,6 +173,11 @@ public final class SubProxy extends BungeeCommon implements Listener {
Util.unzip(SubProxy.class.getResourceAsStream("/net/ME1312/SubServers/Bungee/Library/Files/Templates/paper.zip"), new UniversalFile(dir, "Templates"));
Logger.get("SubServers").info("Updated ./SubServers/Templates/Paper");
}
+ if (new UniversalFile(dir, "Templates:Purpur:template.yml").exists() && ((new YAMLConfig(new UniversalFile(dir, "Templates:Purpur:template.yml"))).get().getVersion("Version", version)).compareTo(version) != 0) {
+ Files.move(new UniversalFile(dir, "Templates:Purpur").toPath(), new UniversalFile(dir, "Templates:Purpur." + stamp + ".x").toPath());
+ Util.unzip(SubProxy.class.getResourceAsStream("/net/ME1312/SubServers/Bungee/Library/Files/Templates/purpur.zip"), new UniversalFile(dir, "Templates"));
+ Logger.get("SubServers").info("Updated ./SubServers/Templates/Purpur");
+ }
if (new UniversalFile(dir, "Templates:Forge:template.yml").exists() && ((new YAMLConfig(new UniversalFile(dir, "Templates:Forge:template.yml"))).get().getVersion("Version", version)).compareTo(version) != 0) {
Files.move(new UniversalFile(dir, "Templates:Forge").toPath(), new UniversalFile(dir, "Templates:Forge." + stamp + ".x").toPath());
Util.unzip(SubProxy.class.getResourceAsStream("/net/ME1312/SubServers/Bungee/Library/Files/Templates/forge.zip"), new UniversalFile(dir, "Templates"));
diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/SubProtocol.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/SubProtocol.java
index b58978d7..8b3cf394 100644
--- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/SubProtocol.java
+++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/Network/SubProtocol.java
@@ -118,7 +118,7 @@ public class SubProtocol extends SubDataProtocol {
log.setUseParentHandlers(false);
log.addHandler(new Handler() {
private boolean open = true;
- private String prefix = "SubData" + ((channel != 0)? "/Sub-"+channel:"");
+ private String prefix = "SubData" + ((channel != 0)?"/+"+channel:"");
@Override
public void publish(LogRecord record) {
diff --git a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java
index abca994a..1a87301a 100644
--- a/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java
+++ b/SubServers.Client/Bukkit/src/net/ME1312/SubServers/Client/Bukkit/SubCommand.java
@@ -52,7 +52,7 @@ public final class SubCommand extends Command {
@Override
public boolean execute(CommandSender sender, String label, String[] args) {
label = "/" + label;
- if (plugin.api.getSubDataNetwork()[0] == null) {
+ if (plugin.api.getSubDataNetwork()[0] == null || plugin.api.getSubDataNetwork()[0].isClosed()) {
new IllegalStateException("SubData is not connected").printStackTrace();
if (!(sender instanceof ConsoleCommandSender)) sender.sendMessage(ChatColor.RED + "An exception has occurred while running this command");
} else if (plugin.lang == null) {
diff --git a/SubServers.Client/Bukkit/src/plugin.yml b/SubServers.Client/Bukkit/src/plugin.yml
index 8835e406..d8d9013f 100644
--- a/SubServers.Client/Bukkit/src/plugin.yml
+++ b/SubServers.Client/Bukkit/src/plugin.yml
@@ -1,6 +1,6 @@
name: SubServers-Client-Bukkit
main: net.ME1312.SubServers.Client.Bukkit.SubPlugin
-version: "2.17b/p1"
+version: "2.17.1a"
authors: ["ME1312"]
softdepend: [TitleAPI, PlaceholderAPI]
website: "https://github.com/ME1312/SubServers-2"
diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/SubProtocol.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/SubProtocol.java
index 570c05dc..d7973e0a 100644
--- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/SubProtocol.java
+++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/Network/SubProtocol.java
@@ -119,7 +119,7 @@ public class SubProtocol extends SubDataProtocol {
Logger log = Logger.getAnonymousLogger();
log.setUseParentHandlers(false);
log.addHandler(new Handler() {
- private org.slf4j.Logger log = LoggerFactory.getLogger("SubData" + ((channel != 0)? "/Sub-"+channel:""));
+ private org.slf4j.Logger log = LoggerFactory.getLogger("SubData" + ((channel != 0)? "/+"+channel:""));
private boolean open = true;
@Override
diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubCommand.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubCommand.java
index 5da0fd79..de4a3b56 100644
--- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubCommand.java
+++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubCommand.java
@@ -139,7 +139,7 @@ public final class SubCommand implements CommandExecutor {
}
private boolean canRun(CommandSource sender, boolean permitted) throws CommandException {
- if (SubAPI.getInstance().getSubDataNetwork()[0] == null) {
+ if (SubAPI.getInstance().getSubDataNetwork()[0] == null || plugin.api.getSubDataNetwork()[0].isClosed()) {
throw new CommandException(Text.builder("An exception has occurred while running this command").color(TextColors.RED).build(), new IllegalStateException("SubData is not connected"), false);
} else if (plugin.lang == null) {
throw new CommandException(Text.builder("An exception has occurred while running this command").color(TextColors.RED).build(), new IllegalStateException("There are no lang options available at this time"), false);
diff --git a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java
index 12b97cf0..c542c95f 100644
--- a/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java
+++ b/SubServers.Client/Sponge/src/net/ME1312/SubServers/Client/Sponge/SubPlugin.java
@@ -49,7 +49,7 @@ import static net.ME1312.SubServers.Client.Sponge.Library.AccessMode.NO_COMMANDS
/**
* SubServers Client Plugin Class
*/
-@Plugin(id = "subservers-client-sponge", name = "SubServers-Client-Sponge", authors = "ME1312", version = "2.17b/p1", url = "https://github.com/ME1312/SubServers-2", description = "Take control of the server manager — from your servers")
+@Plugin(id = "subservers-client-sponge", name = "SubServers-Client-Sponge", authors = "ME1312", version = "2.17.1a", url = "https://github.com/ME1312/SubServers-2", description = "Take control of the server manager — from your servers")
public final class SubPlugin {
HashMap subdata = new HashMap();
Pair>> lang = null;
diff --git a/SubServers.Console/src/bungee.yml b/SubServers.Console/src/bungee.yml
index 52bb80a0..c497e71d 100644
--- a/SubServers.Console/src/bungee.yml
+++ b/SubServers.Console/src/bungee.yml
@@ -1,4 +1,4 @@
name: SubServers-Console
main: net.ME1312.SubServers.Console.ConsolePlugin
-version: 2.17b/p1
+version: 2.17.1a
author: ME1312
\ No newline at end of file
diff --git a/SubServers.Creator/Purpur/build.sh b/SubServers.Creator/Purpur/build.sh
new file mode 100644
index 00000000..8da8019e
--- /dev/null
+++ b/SubServers.Creator/Purpur/build.sh
@@ -0,0 +1,52 @@
+# SubCreator Purpur Build Script
+#
+#!/usr/bin/env bash
+if [[ -z "$version" ]]
+ then
+ echo ERROR: No Build Version Supplied
+ rm -Rf "$0"
+ exit 1
+fi
+function __DL() {
+ if [[ -x "$(command -v wget)" ]]; then
+ wget -O "$1" "$2"; return $?
+ else
+ curl -o "$1" "$2"; return $?
+ fi
+}
+function __Restore() {
+ if [[ -f "Purpur.old.jar.x" ]]; then
+ if [[ -f "Purpur.jar" ]]; then
+ rm -Rf Purpur.jar
+ fi
+ mv Purpur.old.jar.x Purpur.jar
+ fi
+}
+echo Downloading Purpur...
+if [[ -f "Purpur.jar" ]]; then
+ if [[ -f "Purpur.old.jar.x" ]]; then
+ rm -Rf Purpur.old.jar.x
+ fi
+ mv Purpur.jar Purpur.old.jar.x
+fi
+__DL Purpur.jar "https://purpur.pl3x.net/api/v1/purpur/$version/latest/download"; __RETURN=$?
+if [[ $__RETURN -eq 0 ]]; then
+ if [[ $(stat -c%s "Purpur.jar") -ge 1000000 ]]; then
+ echo Cleaning Up...
+ rm -Rf "$0"
+ exit 0
+ else
+ echo ERROR: Received invalid jarfile when requesting Purpur version $version:
+ cat Purpur.jar
+ printf "\n"
+ __Restore
+ rm -Rf "$0"
+ exit 4
+ fi
+else
+ echo ERROR: Failed downloading Purpur. Is Pl3x.net down?
+ __Restore
+ rm -Rf "$0"
+ exit 3
+fi
+exit 2
\ No newline at end of file
diff --git a/SubServers.Creator/Purpur/eula.txt b/SubServers.Creator/Purpur/eula.txt
new file mode 100644
index 00000000..c33b1495
--- /dev/null
+++ b/SubServers.Creator/Purpur/eula.txt
@@ -0,0 +1,2 @@
+#By using SubCreator to create your server you have indicated your agreement to the Minecraft EULA (https://account.mojang.com/documents/minecraft_eula).
+eula=true
diff --git a/SubServers.Creator/Purpur/server.properties b/SubServers.Creator/Purpur/server.properties
new file mode 100644
index 00000000..1d2a918b
--- /dev/null
+++ b/SubServers.Creator/Purpur/server.properties
@@ -0,0 +1,10 @@
+#Minecraft server properties
+server-ip=SubServers::address
+server-port=SubServers::port
+online-mode=false
+enable-query=false
+broadcast-console-to-ops=false
+announce-player-achievements=false
+network-compression-threshold=-1
+enable-command-block=true
+motd=Some SubServer
diff --git a/SubServers.Creator/Purpur/spigot.yml b/SubServers.Creator/Purpur/spigot.yml
new file mode 100644
index 00000000..865fdfd6
--- /dev/null
+++ b/SubServers.Creator/Purpur/spigot.yml
@@ -0,0 +1,3 @@
+config-version: 4
+settings:
+ bungeecord: true
diff --git a/SubServers.Creator/Purpur/template.yml b/SubServers.Creator/Purpur/template.yml
new file mode 100644
index 00000000..0d9282c2
--- /dev/null
+++ b/SubServers.Creator/Purpur/template.yml
@@ -0,0 +1,12 @@
+Version: '2.16a+'
+Template:
+ Enabled: true
+ Icon: 'purpur_block'
+ Build:
+ Server-Type: 'Spigot'
+ Use-Cache: false
+ Require-Version: true
+ Can-Update: true
+ Executable: 'bash build.sh'
+ Settings:
+ Executable: 'java -Xmx1024M -Dterminal.jline=false -jar Purpur.jar nogui'
\ No newline at end of file
diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java b/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java
index 84772653..b5fa81d4 100644
--- a/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java
+++ b/SubServers.Host/src/net/ME1312/SubServers/Host/ExHost.java
@@ -43,7 +43,7 @@ import java.util.jar.Manifest;
/**
* SubServers.Host Main Class
*/
-@App(name = "SubServers.Host", version = "2.17b/p1", authors = "ME1312", website = "https://github.com/ME1312/SubServers-2", description = "Host subservers on separate machines")
+@App(name = "SubServers.Host", version = "2.17.1a", authors = "ME1312", website = "https://github.com/ME1312/SubServers-2", description = "Host subservers on separate machines")
public final class ExHost {
HashMap subdata = new HashMap();
Pair>> lang = null;
diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubCreatorImpl.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubCreatorImpl.java
index 3a3aad7d..a4b37d9c 100644
--- a/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubCreatorImpl.java
+++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubCreatorImpl.java
@@ -46,6 +46,7 @@ public class SubCreatorImpl {
private String name;
private String nick = null;
private boolean enabled;
+ private boolean internal;
private String icon;
private File directory;
private ServerType type;
@@ -63,14 +64,15 @@ public class SubCreatorImpl {
* @param options Configuration Options
*/
public ServerTemplate(String name, boolean enabled, String icon, File directory, ObjectMap build, ObjectMap options) {
- this(name, enabled, icon, directory, build, options, true);
+ this(name, enabled, false, icon, directory, build, options, true);
}
- private ServerTemplate(String name, boolean enabled, String icon, File directory, ObjectMap build, ObjectMap options, boolean dynamic) {
+ private ServerTemplate(String name, boolean enabled, boolean internal, String icon, File directory, ObjectMap build, ObjectMap 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;
this.enabled = enabled;
+ this.internal = internal;
this.icon = icon;
this.directory = directory;
this.type = (build.contains("Server-Type"))?ServerType.valueOf(build.getRawString("Server-Type").toUpperCase()):ServerType.CUSTOM;
@@ -128,6 +130,15 @@ public class SubCreatorImpl {
enabled = value;
}
+ /**
+ * Get if this Template is for Internal use only
+ *
+ * @return Internal Status
+ */
+ public boolean isInternal() {
+ return internal;
+ }
+
/**
* Get the Item Icon for this Template
*
@@ -237,7 +248,7 @@ public class SubCreatorImpl {
try {
if (file.isDirectory() && !file.getName().endsWith(".x")) {
ObjectMap config = (new UniversalFile(file, "template.yml").exists())?new YAMLConfig(new UniversalFile(file, "template.yml")).get().getMap("Template", new ObjectMap()):new ObjectMap();
- ServerTemplate template = new ServerTemplate(file.getName(), config.getBoolean("Enabled", true), config.getRawString("Icon", "::NULL::"), file, config.getMap("Build", new ObjectMap()), config.getMap("Settings", new ObjectMap()), false);
+ ServerTemplate template = new ServerTemplate(file.getName(), config.getBoolean("Enabled", true), config.getBoolean("Internal", false), config.getRawString("Icon", "::NULL::"), file, config.getMap("Build", new ObjectMap()), config.getMap("Settings", new ObjectMap()), false);
templates.put(file.getName().toLowerCase(), template);
if (config.getKeys().contains("Display")) template.setDisplayName(config.getString("Display"));
}
@@ -294,35 +305,24 @@ public class SubCreatorImpl {
if (templates.get(other.toLowerCase()).isEnabled()) {
if (version != null || !templates.get(other.toLowerCase()).requiresVersion()) {
if (update == null || templates.get(other.toLowerCase()).canUpdate()) {
- ObjectMap config = build(dir, templates.get(other.toLowerCase()), history);
- if (config == null) {
- throw new SubCreatorException();
- } else {
- server.setAll(config);
- }
+ server.setAll(this.build(dir, templates.get(other.toLowerCase()), history));
} else {
log.logger.warn.println("Skipping template that cannot be run in update mode: " + other);
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Skipping template that cannot be run in update mode: " + other));
}
} else {
log.logger.warn.println("Skipping template that requires extra versioning information: " + other);
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Skipping template that requires extra versioning information: " + other));
}
} else {
log.logger.warn.println("Skipping disabled template: " + other);
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Skipping disabled template: " + other));
}
} else {
log.logger.warn.println("Skipping missing template: " + other);
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Skipping missing template: " + other));
}
}
server.setAll(template.getConfigOptions());
try {
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);
+ updateDirectory(template.getDirectory(), dir, template.getBuildOptions().getBoolean("Update-Files", false));
for (ObjectMapValue replacement : template.getBuildOptions().getMap("Replacements", new ObjectMap<>()).getValues()) if (!replacement.isNull()) {
replacements.put(replacement.getHandle().toLowerCase().replace('-', '_').replace(' ', '_'), replacement.asRawString());
@@ -346,7 +346,6 @@ public class SubCreatorImpl {
case FORGE:
if (version != null) {
log.logger.info.println("Searching Versions...");
- ((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")))) + '}'));
ObjectMap spprofile = null;
@@ -357,15 +356,12 @@ public class SubCreatorImpl {
spversion = new Version(profile.getRawString("version"));
}
}
- if (spversion == null)
- throw new InvalidServerException("Cannot find Sponge version for Minecraft " + version.toString());
+ if (spversion == null) 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() + '"');
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Found \"sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "-" + spversion.toString() + '"'));
if (template.getType() == ServerType.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() + '"');
- ((SubDataClient) SubAPI.getInstance().getSubDataNetwork()[0]).sendPacket(new PacketOutExLogMessage(address, "Found \"forge-" + mcfversion.toString() + '"'));
var.put("mcf_version", mcfversion.toString());
}
@@ -388,7 +384,6 @@ public class SubCreatorImpl {
try {
log.logger.info.println("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);
pb.environment().putAll(var);
process = pb.start();
@@ -436,7 +431,6 @@ public class SubCreatorImpl {
declaration.run();
File dir = (update != null)?new File(update.getFullPath()):new File(host.host.getRawString("Directory"),
(template.getConfigOptions().contains("Directory"))?new ReplacementScanner(replacements).replace(template.getConfigOptions().getRawString("Directory")).toString():name);
- dir.mkdirs();
ObjectMap config;
try {
@@ -587,23 +581,21 @@ public class SubCreatorImpl {
}
}
- private void updateDirectory(File from, File to) {
- if (from.isDirectory() && !Files.isSymbolicLink(from.toPath())) {
- if (!to.exists()) {
- to.mkdirs();
- }
-
+ private void updateDirectory(File from, File to, boolean overwrite) {
+ if (!to.exists()) {
+ Util.copyDirectory(from, to);
+ } else if (from.isDirectory() && !Files.isSymbolicLink(from.toPath())) {
String files[] = from.list();
for (String file : files) {
File srcFile = new File(from, file);
File destFile = new File(to, file);
- updateDirectory(srcFile, destFile);
+ updateDirectory(srcFile, destFile, overwrite);
}
} else {
try {
- if (!to.exists() || from.length() != to.length() || !Arrays.equals(generateSHA256(to), generateSHA256(from))) {
+ if (overwrite && (from.length() != to.length() || !Arrays.equals(generateSHA256(to), generateSHA256(from)))) {
if (to.exists()) {
if (to.isDirectory()) Util.deleteDirectory(to);
else to.delete();
diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubLoggerImpl.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubLoggerImpl.java
index 4a99fdce..b861d887 100644
--- a/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubLoggerImpl.java
+++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Executable/SubLoggerImpl.java
@@ -1,8 +1,10 @@
package net.ME1312.SubServers.Host.Executable;
import net.ME1312.Galaxi.Library.Callback.Callback;
+import net.ME1312.Galaxi.Library.Container.ContainedPair;
import net.ME1312.Galaxi.Library.Container.Pair;
import net.ME1312.Galaxi.Library.Container.Value;
+import net.ME1312.Galaxi.Log.LogFilter;
import net.ME1312.Galaxi.Log.LogStream;
import net.ME1312.Galaxi.Log.Logger;
import net.ME1312.Galaxi.Library.Util;
@@ -15,10 +17,12 @@ import net.ME1312.SubServers.Host.Network.Packet.PacketOutExLogMessage;
import net.ME1312.SubServers.Host.SubAPI;
import java.io.*;
+import java.util.LinkedList;
import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -36,6 +40,7 @@ public class SubLoggerImpl {
static boolean logc = true;
File file;
private SubDataClient channel = null;
+ private LinkedList> ccache = null;
private PrintWriter writer = null;
private boolean started = false;
private Thread out = null;
@@ -59,6 +64,25 @@ public class SubLoggerImpl {
this.address = address;
this.log = log;
this.file = file;
+
+ logger.addFilter((stream, message) -> {
+ // Log to NETWORK
+ if (logn) {
+ if (this.address != null && channel != null && !channel.isClosed()) {
+ if (ccache != null) {
+ for (Pair val : ccache) channel.sendPacket(new PacketOutExLogMessage(this.address, val.key(), val.value()));
+ ccache = null;
+ }
+ channel.sendPacket(new PacketOutExLogMessage(this.address, stream.getLevel().getName(), message));
+ } else {
+ if (ccache == null) ccache = new LinkedList>();
+ ccache.add(new ContainedPair<>(stream.getLevel().getName(), message));
+ }
+ }
+
+ // Log to CONSOLE
+ return logc || !started;
+ });
}
/**
@@ -131,6 +155,7 @@ public class SubLoggerImpl {
}
}
+ private static final String PATTERN = "^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|MSG|" + Pattern.quote(Level.INFO.getLocalizedName()) + "|INFO|" + Pattern.quote(Level.WARNING.getLocalizedName()) + "|WARNING|WARN|ERROR|ERR|" + Pattern.quote(Level.SEVERE.getLocalizedName()) + "|SEVERE)\\]?:?(?:\\s*>)?\\s*)";
private void log(String line) {
if (!line.startsWith(">")) {
String msg = line;
@@ -138,15 +163,19 @@ public class SubLoggerImpl {
// REGEX Formatting
String type = "";
- Matcher matcher = Pattern.compile("^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|INFO|WARNING|WARN|ERROR|ERR|SEVERE)\\]?:?(?:\\s*>)?\\s*)").matcher(msg.replaceAll("\u001B\\[[;\\d]*m", ""));
+ Matcher matcher = Pattern.compile(PATTERN).matcher(msg.replaceAll("\u001B\\[[;\\d]*m", ""));
while (matcher.find()) {
type = matcher.group(3).toUpperCase();
}
- msg = msg.replaceAll("^((?:\\s*\\[?([0-9]{2}:[0-9]{2}:[0-9]{2})]?)?[\\s\\/\\\\\\|]*(?:\\[|\\[.*\\/)?(MESSAGE|INFO|WARNING|WARN|ERROR|ERR|SEVERE)\\]?:?(?:\\s*>)?\\s*)", "");
+ msg = msg.replaceAll(PATTERN, "");
// Determine LOG LEVEL
- switch (type) {
+ if (type.equalsIgnoreCase(Level.WARNING.getLocalizedName())) {
+ level = logger.warn;
+ } else if (type.equalsIgnoreCase(Level.SEVERE.getLocalizedName())) {
+ level = logger.severe;
+ } else switch (type) {
case "WARNING":
case "WARN":
level = logger.warn;
@@ -158,15 +187,16 @@ public class SubLoggerImpl {
case "ERR":
level = logger.error;
break;
+ case "MSG":
+ case "MESSAGE":
+ level = logger.message;
+ break;
default:
level = logger.info;
}
- // Log to NETWORK
- if (log.value() && channel != null && !channel.isClosed()) channel.sendPacket(new PacketOutExLogMessage(address, line));
-
- // Log to CONSOLE
- if (log.value() && logc) level.println(TextColor.convertColor(msg));
+ // Log to FILTER
+ if (log.value()) level.println(TextColor.convertColor(msg));
// Log to FILE
if (writer != null) {
@@ -202,7 +232,7 @@ public class SubLoggerImpl {
}
}
if (channel != null && !channel.isClosed()) {
- channel.sendPacket(new PacketOutExLogMessage(address, true));
+ channel.sendPacket(new PacketOutExLogMessage(address));
}
channel = null;
}
diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExUploadTemplates.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExUploadTemplates.java
index 21fca732..935921e7 100644
--- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExUploadTemplates.java
+++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/Packet/PacketExUploadTemplates.java
@@ -36,6 +36,7 @@ public class PacketExUploadTemplates implements PacketIn, PacketObjectOut tinfo = new ObjectMap();
tinfo.set("enabled", template.isEnabled());
+ tinfo.set("internal", template.isInternal());
tinfo.set("display", template.getDisplayName());
tinfo.set("icon", template.getIcon());
tinfo.set("build", template.getBuildOptions().clone());
@@ -54,6 +55,6 @@ public class PacketExUploadTemplates implements PacketIn, PacketObjectOut {
private UUID address;
- private String line;
+ private String level, line;
private boolean terminate;
/**
* New PacketInExLogMessage (Out)
*/
- public PacketOutExLogMessage(UUID address, String line) {
+ public PacketOutExLogMessage(UUID address, String level, String line) {
this.address = address;
+ this.level = level;
this.line = line;
this.terminate = false;
}
@@ -26,10 +27,9 @@ public class PacketOutExLogMessage implements PacketObjectOut {
/**
* New PacketInExLogMessage (Out)
*/
- public PacketOutExLogMessage(UUID address, boolean terminate) {
+ public PacketOutExLogMessage(UUID address) {
this.address = address;
- this.line = null;
- this.terminate = terminate;
+ this.terminate = true;
}
@Override
@@ -38,12 +38,13 @@ public class PacketOutExLogMessage implements PacketObjectOut {
ObjectMap data = new ObjectMap();
data.set(0x0000, address);
- if (line != null) data.set(0x0001, line);
+ if (level != null) data.set(0x0001, level);
+ if (line != null) data.set(0x0002, line);
return data;
}
@Override
public int version() {
- return 0x0001;
+ return 0x0002;
}
}
diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/SubProtocol.java b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/SubProtocol.java
index 1775ebe1..bd3d4bfd 100644
--- a/SubServers.Host/src/net/ME1312/SubServers/Host/Network/SubProtocol.java
+++ b/SubServers.Host/src/net/ME1312/SubServers/Host/Network/SubProtocol.java
@@ -136,7 +136,7 @@ public class SubProtocol extends SubDataProtocol {
}
private Logger getLogger(int channel) {
- return new net.ME1312.Galaxi.Log.Logger("SubData" + ((channel != 0)?File.separator+"Sub-"+channel:"")).toPrimitive();
+ return new net.ME1312.Galaxi.Log.Logger("SubData" + ((channel != 0)?File.separator+"+"+channel:"")).toPrimitive();
}
@Override
diff --git a/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java b/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java
index 532e07c1..0fa84c18 100644
--- a/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java
+++ b/SubServers.Host/src/net/ME1312/SubServers/Host/SubCommand.java
@@ -39,7 +39,7 @@ public class SubCommand {
private final ExHost host;
private static boolean canRun() {
- if (SubAPI.getInstance().getSubDataNetwork()[0] == null) {
+ if (SubAPI.getInstance().getSubDataNetwork()[0] == null || SubAPI.getInstance().getSubDataNetwork()[0].isClosed()) {
throw new IllegalStateException("SubData is not connected");
} else {
return true;
diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java
index fce0cf4b..a7bc56dd 100644
--- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java
+++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/ExProxy.java
@@ -72,7 +72,7 @@ public final class ExProxy extends BungeeCommon implements Listener {
public final Plugin plugin;
public final SubAPI api = new SubAPI(this);
public SubProtocol subprotocol;
- public static final Version version = Version.fromString("2.17b/p1");
+ public static final Version version = Version.fromString("2.17.1a");
public final boolean isPatched;
public long lastReload = -1;
diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubProtocol.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubProtocol.java
index 00c9f646..7b8bc943 100644
--- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubProtocol.java
+++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/Network/SubProtocol.java
@@ -128,7 +128,7 @@ public class SubProtocol extends SubDataProtocol {
}
private Logger getLogger(int channel) {
- return net.ME1312.SubServers.Bungee.Library.Compatibility.Logger.get("SubData" + ((channel != 0)? "/Sub-"+channel:""));
+ return net.ME1312.SubServers.Bungee.Library.Compatibility.Logger.get("SubData" + ((channel != 0)?"/+"+channel:""));
}
@Override
diff --git a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java
index e3d0dac3..98be5e91 100644
--- a/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java
+++ b/SubServers.Sync/src/net/ME1312/SubServers/Sync/SubCommand.java
@@ -63,7 +63,7 @@ public final class SubCommand extends Command implements TabExecutor {
@Override
public void execute(CommandSender sender, String[] args) {
if (!(sender instanceof ProxiedPlayer)) {
- if (plugin.api.getSubDataNetwork()[0] == null) {
+ if (plugin.api.getSubDataNetwork()[0] == null || plugin.api.getSubDataNetwork()[0].isClosed()) {
new IllegalStateException("SubData is not connected").printStackTrace();
if (!(sender instanceof ConsoleCommandSender)) sender.sendMessage(ChatColor.RED + "An exception has occurred while running this command");
} else {