diff --git a/lobbybalancer.iml b/lobbybalancer.iml
index 24d4073..8eb60b1 100644
--- a/lobbybalancer.iml
+++ b/lobbybalancer.iml
@@ -116,7 +116,7 @@
-
+
diff --git a/src/main/java/me/jaimemartz/lobbybalancer/LobbyBalancer.java b/src/main/java/me/jaimemartz/lobbybalancer/LobbyBalancer.java
index a7233ea..67517b0 100644
--- a/src/main/java/me/jaimemartz/lobbybalancer/LobbyBalancer.java
+++ b/src/main/java/me/jaimemartz/lobbybalancer/LobbyBalancer.java
@@ -1,7 +1,6 @@
package me.jaimemartz.lobbybalancer;
import com.fasterxml.jackson.databind.ext.Java7Support;
-import com.google.gson.Gson;
import me.jaimemartz.faucet.ConfigFactory;
import me.jaimemartz.lobbybalancer.commands.FallbackCommand;
import me.jaimemartz.lobbybalancer.commands.MainCommand;
@@ -31,7 +30,6 @@ public class LobbyBalancer extends Plugin {
public static final String NONCE_ID = "%%__NONCE__%%";
private static final int LAST_VER_CONFIG_UPDATE = 20600;
- private final Gson gson = new Gson();
private boolean failed = false;
private ConfigFactory factory;
@@ -212,10 +210,6 @@ public class LobbyBalancer extends Plugin {
getLogger().info(String.format("The plugin has been reloaded, took %sms", ending));
}
- public Gson getGson() {
- return gson;
- }
-
public GeolocationManager getGeolocationManager() {
return geolocationManager;
}
diff --git a/src/main/java/me/jaimemartz/lobbybalancer/commands/ManageCommand.java b/src/main/java/me/jaimemartz/lobbybalancer/commands/ManageCommand.java
index ddae97c..75fbc77 100644
--- a/src/main/java/me/jaimemartz/lobbybalancer/commands/ManageCommand.java
+++ b/src/main/java/me/jaimemartz/lobbybalancer/commands/ManageCommand.java
@@ -19,6 +19,7 @@ import net.md_5.bungee.api.plugin.Command;
import java.util.Iterator;
import java.util.Set;
+import java.util.function.Consumer;
public class ManageCommand extends Command {
private final LobbyBalancer plugin;
@@ -57,7 +58,7 @@ public class ManageCommand extends Command {
msgr.send(ConfigEntries.UNKNOWN_SECTION_MESSAGE.get());
}
} else {
- sendHelper(msgr);
+ help.accept(msgr);
}
break;
}
@@ -133,7 +134,7 @@ public class ManageCommand extends Command {
msgr.send(ConfigEntries.UNKNOWN_SECTION_MESSAGE.get());
}
} else {
- sendHelper(msgr);
+ help.accept(msgr);
}
break;
}
@@ -174,25 +175,23 @@ public class ManageCommand extends Command {
default: {
msgr.send("&cThis is not a valid argument for this command!");
- sendHelper(msgr);
+ help.accept(msgr);
}
}
} else {
- sendHelper(msgr);
+ help.accept(msgr);
}
} else {
msgr.send(ChatColor.RED + "You do not have permission to execute this command!");
}
}
- private void sendHelper(Messager msgr) {
- msgr.send(
- "&7&m-----------------------------------------------------",
- "&7Available commands:",
- "&3/section list &7- &cTells you which sections are configured in the plugin",
- "&3/section info &7- &cTells you info about the section",
- "&3/section connect [player] &7- &cConnects you or the specified player to that section",
- "&7&m-----------------------------------------------------"
- );
- }
+ private static final Consumer help = (msgr) -> msgr.send(
+ "&7&m-----------------------------------------------------",
+ "&7Available commands:",
+ "&3/section list &7- &cTells you which sections are configured in the plugin",
+ "&3/section info &7- &cTells you info about the section",
+ "&3/section connect [player] &7- &cConnects you or the specified player to that section",
+ "&7&m-----------------------------------------------------"
+ );
}
diff --git a/src/main/java/me/jaimemartz/lobbybalancer/configuration/ConfigEntries.java b/src/main/java/me/jaimemartz/lobbybalancer/configuration/ConfigEntries.java
index 5dfaadc..a2545a2 100644
--- a/src/main/java/me/jaimemartz/lobbybalancer/configuration/ConfigEntries.java
+++ b/src/main/java/me/jaimemartz/lobbybalancer/configuration/ConfigEntries.java
@@ -44,6 +44,7 @@ public class ConfigEntries implements ConfigEntryHolder {
public static final ConfigEntry REDIS_BUNGEE_ENABLED = new ConfigEntry<>(0, "settings.redis-bungee", false);
public static final ConfigEntry ASSIGN_TARGETS_ENABLED = new ConfigEntry<>(0, "settings.assign-targets", false);
public static final ConfigEntry FALLBACK_PRINCIPAL_ENABLED = new ConfigEntry<>(0, "settings.fallback-principal", true);
+ public static final ConfigEntry SERVERS_UPDATE = new ConfigEntry<>(0, "settings.servers-update", true);
public static final ConfigEntry CONNECTING_MESSAGE = new ConfigEntry<>(0, "settings.messages.connecting", null);
public static final ConfigEntry FAILURE_MESSAGE = new ConfigEntry<>(0, "settings.messages.failure", null);
diff --git a/src/main/java/me/jaimemartz/lobbybalancer/listener/PluginMessageListener.java b/src/main/java/me/jaimemartz/lobbybalancer/listener/PluginMessageListener.java
index 24db395..5d51c3a 100644
--- a/src/main/java/me/jaimemartz/lobbybalancer/listener/PluginMessageListener.java
+++ b/src/main/java/me/jaimemartz/lobbybalancer/listener/PluginMessageListener.java
@@ -2,6 +2,8 @@ package me.jaimemartz.lobbybalancer.listener;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteStreams;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
import me.jaimemartz.lobbybalancer.LobbyBalancer;
import me.jaimemartz.lobbybalancer.connection.ConnectionIntent;
import me.jaimemartz.lobbybalancer.section.ServerSection;
@@ -18,9 +20,14 @@ import java.io.IOException;
public class PluginMessageListener implements Listener {
private final LobbyBalancer plugin;
+ private final Gson gson;
public PluginMessageListener(LobbyBalancer plugin) {
this.plugin = plugin;
+ GsonBuilder builder = new GsonBuilder();
+ builder.serializeNulls();
+ builder.excludeFieldsWithoutExposeAnnotation();
+ gson = builder.create();
}
@EventHandler
@@ -69,7 +76,7 @@ public class PluginMessageListener implements Listener {
}
try {
- String output = plugin.getGson().toJson(section);
+ String output = gson.toJson(section);
out.writeUTF(output);
} catch (IOException e) {
e.printStackTrace();
@@ -94,7 +101,7 @@ public class PluginMessageListener implements Listener {
}
try {
- String output = plugin.getGson().toJson(section);
+ String output = gson.toJson(section);
out.writeUTF(output);
} catch (IOException e) {
e.printStackTrace();
diff --git a/src/main/java/me/jaimemartz/lobbybalancer/section/SectionManager.java b/src/main/java/me/jaimemartz/lobbybalancer/section/SectionManager.java
index 09a7905..dfaa37e 100644
--- a/src/main/java/me/jaimemartz/lobbybalancer/section/SectionManager.java
+++ b/src/main/java/me/jaimemartz/lobbybalancer/section/SectionManager.java
@@ -1,15 +1,20 @@
package me.jaimemartz.lobbybalancer.section;
import me.jaimemartz.lobbybalancer.LobbyBalancer;
+import me.jaimemartz.lobbybalancer.configuration.ConfigEntries;
import net.md_5.bungee.api.config.ServerInfo;
+import net.md_5.bungee.api.scheduler.ScheduledTask;
import net.md_5.bungee.config.Configuration;
-import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
public class SectionManager {
private ServerSection principal;
+ private ScheduledTask updateTask;
private final LobbyBalancer plugin;
private final Map sectionStorage = new ConcurrentHashMap<>();
private final Map sectionServers = new ConcurrentHashMap<>();
@@ -26,25 +31,44 @@ public class SectionManager {
sections.getKeys().forEach(name -> {
plugin.getLogger().info(String.format("Construction of section with name \"%s\"", name));
Configuration section = sections.getSection(name);
- ServerSection object = new ServerSection(name, section);
+ ServerSection object = new ServerSection(plugin, name, section);
sectionStorage.put(name, object);
});
sectionStorage.forEach((name, section) -> {
plugin.getLogger().info(String.format("Pre-Initialization of section with name \"%s\"", name));
- section.preInit(plugin);
+ section.preInit();
});
sectionStorage.forEach((name, section) -> {
plugin.getLogger().info(String.format("Initialization of section with name \"%s\"", name));
- section.load(plugin);
+ section.load();
});
sectionStorage.forEach((name, section) -> {
plugin.getLogger().info(String.format("Post-Initialization of section with name \"%s\"", name));
- section.postInit(plugin);
+ section.postInit();
});
+ if (ConfigEntries.SERVERS_UPDATE.get()) {
+ updateTask = plugin.getProxy().getScheduler().schedule(plugin, () -> {
+ sectionStorage.forEach((name, section) -> {
+ section.getConfiguration().getStringList("servers").forEach(entry -> {
+ Pattern pattern = Pattern.compile(entry);
+ plugin.getProxy().getServers().forEach((key, value) -> {
+ Matcher matcher = pattern.matcher(key);
+ if (matcher.matches()) {
+ if (!section.getServers().contains(value)) {
+ plugin.getLogger().info(String.format("Found a new match with \"%s\" for entry \"%s\"", key, entry));
+ this.register(value, section);
+ section.getServers().add(value);
+ }
+ }
+ });
+ });
+ });
+ }, 1, 1, TimeUnit.MINUTES);
+ }
long ending = System.currentTimeMillis() - starting;
plugin.getLogger().info(String.format("A total of %s section(s) have been loaded in %sms", sectionStorage.size(), ending));
@@ -67,6 +91,10 @@ public class SectionManager {
});
principal = null;
+ if (updateTask != null) {
+ updateTask.cancel();
+ updateTask = null;
+ }
sectionStorage.clear();
sectionServers.clear();
}
diff --git a/src/main/java/me/jaimemartz/lobbybalancer/section/ServerSection.java b/src/main/java/me/jaimemartz/lobbybalancer/section/ServerSection.java
index 836fc98..b4ce500 100644
--- a/src/main/java/me/jaimemartz/lobbybalancer/section/ServerSection.java
+++ b/src/main/java/me/jaimemartz/lobbybalancer/section/ServerSection.java
@@ -1,5 +1,6 @@
package me.jaimemartz.lobbybalancer.section;
+import com.google.gson.annotations.Expose;
import me.jaimemartz.lobbybalancer.LobbyBalancer;
import me.jaimemartz.lobbybalancer.connection.ProviderType;
import me.jaimemartz.lobbybalancer.utils.FixedAdapter;
@@ -8,7 +9,6 @@ import net.md_5.bungee.config.Configuration;
import java.net.InetSocketAddress;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -16,28 +16,30 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ServerSection {
- private transient final Configuration section;
+ private final LobbyBalancer plugin;
+ private Configuration configuration;
+ @Expose private final String name;
+ @Expose private boolean principal;
+ @Expose private int position;
+ @Expose private boolean dummy;
+ @Expose private ServerSection parent;
+ @Expose private boolean inherited = false;
+ @Expose private List servers;
+ @Expose private ProviderType provider;
+ @Expose private ServerInfo server;
+ @Expose private SectionCommand command;
+ @Expose private boolean valid = false;
- private final String name;
- private boolean principal;
- private int position;
- private boolean dummy;
- private ServerSection parent;
- private boolean inherited = false;
- private List servers;
- private ProviderType provider;
- private ServerInfo server;
- private SectionCommand command;
- private boolean valid = false;
-
- public ServerSection(String name, Configuration section) {
+ public ServerSection(LobbyBalancer plugin, String name, Configuration configuration) {
+ this.plugin = plugin;
this.name = name;
- this.section = section;
+ this.configuration = configuration;
this.servers = new ArrayList<>();
}
- public ServerSection(String name, boolean principal, int position, boolean dummy, ServerSection parent, boolean inherited, List servers, ProviderType provider, ServerInfo server, SectionCommand command, boolean valid) {
- this.section = null;
+ public ServerSection(LobbyBalancer plugin, String name, boolean principal, int position, boolean dummy, ServerSection parent, boolean inherited, List servers, ProviderType provider, ServerInfo server, SectionCommand command, boolean valid) {
+ this.plugin = plugin;
+ this.configuration = null;
this.name = name;
this.principal = principal;
this.position = position;
@@ -51,12 +53,12 @@ public class ServerSection {
this.valid = valid;
}
- public void preInit(LobbyBalancer plugin) {
- if (section == null) {
+ public void preInit() {
+ if (configuration == null) {
throw new IllegalStateException("Tried to call an init method with null configuration section");
}
- principal = section.getBoolean("principal", false);
+ principal = configuration.getBoolean("principal", false);
if (principal) {
ServerSection section = plugin.getSectionManager().getPrincipal();
@@ -67,18 +69,18 @@ public class ServerSection {
}
}
- dummy = section.getBoolean("dummy", false);
+ dummy = configuration.getBoolean("dummy", false);
- if (section.contains("parent")) {
- parent = plugin.getSectionManager().getByName(section.getString("parent"));
+ if (configuration.contains("parent")) {
+ parent = plugin.getSectionManager().getByName(configuration.getString("parent"));
if (parent == null) {
throw new IllegalArgumentException(String.format("The section \"%s\" has an invalid parent set", name));
}
}
- if (section.contains("servers")) {
- section.getStringList("servers").forEach(entry -> {
+ if (configuration.contains("servers")) {
+ configuration.getStringList("servers").forEach(entry -> {
Pattern pattern = Pattern.compile(entry);
AtomicBoolean matches = new AtomicBoolean(false);
plugin.getProxy().getServers().forEach((key, value) -> {
@@ -96,15 +98,15 @@ public class ServerSection {
}
});
- plugin.getLogger().info(String.format("Recognized %s server(s) out of %s entries on the section \"%s\"", servers.size(), section.getStringList("servers").size(), this.name));
+ plugin.getLogger().info(String.format("Recognized %s server(s) out of %s entries on the section \"%s\"", servers.size(), configuration.getStringList("servers").size(), this.name));
} else {
throw new IllegalArgumentException(String.format("The section \"%s\" does not have any servers set", name));
}
}
- public void load(LobbyBalancer plugin) {
- if (section == null) {
+ public void load() {
+ if (configuration == null) {
throw new IllegalStateException("Tried to call an init method with null configuration section");
}
@@ -112,9 +114,9 @@ public class ServerSection {
throw new IllegalStateException(String.format("The sections \"%s\" and \"%s\" are parents of each other", this.name, parent.name));
}
- if (section.contains("provider")) {
+ if (configuration.contains("provider")) {
try {
- provider = ProviderType.valueOf(section.getString("provider").toUpperCase());
+ provider = ProviderType.valueOf(configuration.getString("provider").toUpperCase());
if (provider == ProviderType.LOCALIZED) {
Configuration rules = plugin.getConfig().getSection("settings.geolocation.rules");
if (!rules.contains(name)) {
@@ -131,15 +133,14 @@ public class ServerSection {
}
}
- public void postInit(LobbyBalancer plugin) {
- if (section == null) {
+ public void postInit() {
+ if (configuration == null) {
throw new IllegalStateException("Tried to call an init method with null configuration section");
}
Callable callable = () -> {
- int iterations = 0;
-
//Calculate above principal
+ int iterations = 0;
ServerSection current = this;
while (current != null) {
if (current.isPrincipal()) {
@@ -191,16 +192,16 @@ public class ServerSection {
throw new IllegalStateException(String.format("The section \"%s\" does not have a provider", name));
}
- if (section.contains("section-server")) {
+ if (configuration.contains("section-server")) {
int port = (int) Math.floor(Math.random() * (0xFFFF + 1)); //Get a random valid port for our fake server
- server = plugin.getProxy().constructServerInfo("@" + section.getString("section-server"), new InetSocketAddress("0.0.0.0", port), String.format("Server of Section %s", name), false);
+ server = plugin.getProxy().constructServerInfo("@" + configuration.getString("section-server"), new InetSocketAddress("0.0.0.0", port), String.format("Server of Section %s", name), false);
plugin.getSectionManager().register(server, this);
FixedAdapter.getFakeServers().put(server.getName(), server);
plugin.getProxy().getServers().put(server.getName(), server);
}
- if (section.contains("section-command")) {
- Configuration other = section.getSection("section-command");
+ if (configuration.contains("section-command")) {
+ Configuration other = configuration.getSection("section-command");
String name = other.getString("name");
String permission = other.getString("permission");
@@ -217,8 +218,8 @@ public class ServerSection {
return name;
}
- protected Configuration getSection() {
- return section;
+ public Configuration getConfiguration() {
+ return configuration;
}
public boolean isPrincipal() {
@@ -276,4 +277,40 @@ public class ServerSection {
public void setValid(boolean valid) {
this.valid = valid;
}
+
+ public void setPrincipal(boolean principal) {
+ this.principal = principal;
+ }
+
+ public void setPosition(int position) {
+ this.position = position;
+ }
+
+ public void setDummy(boolean dummy) {
+ this.dummy = dummy;
+ }
+
+ public void setParent(ServerSection parent) {
+ this.parent = parent;
+ }
+
+ public void setInherited(boolean inherited) {
+ this.inherited = inherited;
+ }
+
+ public void setServers(List servers) {
+ this.servers = servers;
+ }
+
+ public void setProvider(ProviderType provider) {
+ this.provider = provider;
+ }
+
+ public void setServer(ServerInfo server) {
+ this.server = server;
+ }
+
+ public void setCommand(SectionCommand command) {
+ this.command = command;
+ }
}
\ No newline at end of file
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index f84bf26..4dca09d 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -128,6 +128,9 @@ settings:
# This affects both the fallback command and reconnect kick features
fallback-principal: true
+ # This will update the recognized servers every minute
+ servers-update: true
+
# Comment a message to disable it
messages:
connecting: '&aConnecting to {server}'