mirror of
https://github.com/BGHDDevelopment/PlayerBalancer.git
synced 2024-11-27 05:05:19 +01:00
Implemented PM-API and added an option to print info about the geolocation checks
This commit is contained in:
parent
c8399b12e0
commit
a3b9aced7f
2
pom.xml
2
pom.xml
@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>me.jaimemartz</groupId>
|
||||
<artifactId>lobbybalancer</artifactId>
|
||||
<version>2.0</version>
|
||||
<version>2.0.1</version>
|
||||
<name>LobbyBalancer</name>
|
||||
|
||||
<repositories>
|
||||
|
@ -1,5 +1,6 @@
|
||||
package me.jaimemartz.lobbybalancer;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.imaginarycode.minecraft.redisbungee.RedisBungee;
|
||||
import me.jaimemartz.faucet.ConfigFactory;
|
||||
import me.jaimemartz.lobbybalancer.commands.BackwardCommand;
|
||||
@ -29,6 +30,7 @@ public class LobbyBalancer extends Plugin {
|
||||
public static final String NONCE_ID = "%%__NONCE__%%";
|
||||
|
||||
private boolean failed = false;
|
||||
private Gson gson;
|
||||
|
||||
private ConfigFactory factory;
|
||||
private PingManager pingManager;
|
||||
@ -40,6 +42,7 @@ public class LobbyBalancer extends Plugin {
|
||||
@Override
|
||||
public void onEnable() {
|
||||
instance = this;
|
||||
gson = new Gson();
|
||||
if (factory == null) {
|
||||
factory = new ConfigFactory(this);
|
||||
factory.register(0, "config.yml");
|
||||
@ -199,6 +202,10 @@ public class LobbyBalancer extends Plugin {
|
||||
return true;
|
||||
}
|
||||
|
||||
public Gson getGson() {
|
||||
return gson;
|
||||
}
|
||||
|
||||
public GeolocationManager getGeolocationManager() {
|
||||
return geolocationManager;
|
||||
}
|
||||
|
@ -21,6 +21,7 @@ public class ConfigEntries implements ConfigEntryHolder {
|
||||
public static final ConfigEntry<List<String>> SERVER_CHECK_MARKER_MOTDS = new ConfigEntry<>(0, "settings.server_check.marker-motds", Arrays.asList("Server is not accessible", "Gamemode has already started"));
|
||||
|
||||
public static final ConfigEntry<Boolean> GEOLOCATION_ENABLED = new ConfigEntry<>(0, "settings.geolocation.enabled", true);
|
||||
public static final ConfigEntry<Boolean> GEOLOCATION_PRINT_INFO = new ConfigEntry<>(0, "settings.geolocation.print-info", true);
|
||||
|
||||
public static final ConfigEntry<Boolean> RECONNECT_KICK_ENABLED = new ConfigEntry<>(0, "settings.reconnect-kick.enabled", true);
|
||||
public static final ConfigEntry<Boolean> RECONNECT_KICK_INVERTED = new ConfigEntry<>(0, "settings.reconnect-kick.inverted", false);
|
||||
|
@ -12,7 +12,7 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class ConnectionIntent {
|
||||
public ConnectionIntent(LobbyBalancer plugin, ProxiedPlayer player, ServerSection section) {
|
||||
protected ConnectionIntent(LobbyBalancer plugin, ProxiedPlayer player, ServerSection section) {
|
||||
ServerInfo target = this.findTarget(plugin, player, section);
|
||||
Messager msgr = new Messager(player);
|
||||
|
||||
@ -44,12 +44,12 @@ public abstract class ConnectionIntent {
|
||||
servers.addAll(section.getServers());
|
||||
|
||||
while (intents-- >= 1) {
|
||||
ServerInfo target = provider.requestTarget(plugin, section, servers, player);
|
||||
if (target == null) continue;
|
||||
|
||||
if (servers.size() == 0) return null;
|
||||
if (servers.size() == 1) return servers.get(0);
|
||||
|
||||
ServerInfo target = provider.requestTarget(plugin, section, servers, player);
|
||||
if (target == null) continue;
|
||||
|
||||
ServerStatus status = plugin.getPingManager().getStatus(target);
|
||||
if (status.isAccessible()) {
|
||||
return target;
|
||||
|
@ -43,9 +43,17 @@ public enum ProviderType {
|
||||
CountryResponse countryResponse = plugin.getGeolocationManager().getReader().country(address);
|
||||
Country country = countryResponse.getCountry();
|
||||
|
||||
if (ConfigEntries.GEOLOCATION_PRINT_INFO.get()) {
|
||||
plugin.getLogger().info(String.format(
|
||||
"Player Address: \"%s\", Country Name: \"%s\"",
|
||||
address.toString(),
|
||||
country.getName()
|
||||
));
|
||||
}
|
||||
|
||||
for (String name : rule.getKeys()) {
|
||||
List<String> countries = rule.getStringList(name);
|
||||
if (countries.contains(country.getName().toUpperCase())) {
|
||||
if (countries.contains(country.getName())) {
|
||||
ServerInfo server = plugin.getProxy().getServerInfo(name);
|
||||
if (server != null) {
|
||||
return server;
|
||||
|
@ -3,11 +3,15 @@ package me.jaimemartz.lobbybalancer.listener;
|
||||
import com.google.common.io.ByteArrayDataInput;
|
||||
import com.google.common.io.ByteStreams;
|
||||
import me.jaimemartz.lobbybalancer.LobbyBalancer;
|
||||
import me.jaimemartz.lobbybalancer.connection.ConnectionIntent;
|
||||
import me.jaimemartz.lobbybalancer.section.ServerSection;
|
||||
import net.md_5.bungee.api.config.ServerInfo;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
import net.md_5.bungee.api.connection.Server;
|
||||
import net.md_5.bungee.api.event.PluginMessageEvent;
|
||||
import net.md_5.bungee.api.plugin.Listener;
|
||||
import net.md_5.bungee.event.EventHandler;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataOutputStream;
|
||||
@ -27,16 +31,88 @@ public class PluginMessageListener implements Listener {
|
||||
String request = in.readUTF();
|
||||
ServerInfo sender = ((Server) event.getSender()).getInfo();
|
||||
switch (request) {
|
||||
default: {
|
||||
case "Connect": {
|
||||
if (event.getReceiver() instanceof ProxiedPlayer) {
|
||||
ProxiedPlayer player = (ProxiedPlayer) event.getReceiver();
|
||||
ServerSection section = plugin.getSectionManager().getByName(in.readUTF());
|
||||
|
||||
if (section == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
new ConnectionIntent(plugin, player, section) {
|
||||
@Override
|
||||
public void connect(ServerInfo server) {
|
||||
player.connect(server);
|
||||
}
|
||||
};
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case "ConnectOther": {
|
||||
ProxiedPlayer player = plugin.getProxy().getPlayer(in.readUTF());
|
||||
if (player == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
ServerSection section = plugin.getSectionManager().getByName(in.readUTF());
|
||||
if (section == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
new ConnectionIntent(plugin, player, section) {
|
||||
@Override
|
||||
public void connect(ServerInfo server) {
|
||||
player.connect(server);
|
||||
}
|
||||
};
|
||||
break;
|
||||
}
|
||||
|
||||
case "GetSectionByName": {
|
||||
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||
DataOutputStream out = new DataOutputStream(stream);
|
||||
|
||||
ServerSection section = plugin.getSectionManager().getByName(in.readUTF());
|
||||
if (section == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
out.writeUTF("The plugin message api for LobbyBalancer is not ready yet, it will be implemented in a future version");
|
||||
String output = plugin.getGson().toJson(section);
|
||||
out.writeUTF(output);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
sender.sendData("LobbyBalancer", stream.toByteArray());
|
||||
break;
|
||||
}
|
||||
|
||||
case "GetSectionByServer": {
|
||||
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||
DataOutputStream out = new DataOutputStream(stream);
|
||||
|
||||
ServerInfo server = plugin.getProxy().getServerInfo(in.readUTF());
|
||||
if (server == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
ServerSection section = plugin.getSectionManager().getByServer(server);
|
||||
if (section == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
String output = plugin.getGson().toJson(section);
|
||||
out.writeUTF(output);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
sender.sendData("LobbyBalancer", stream.toByteArray());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -10,6 +10,7 @@ import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class SectionManager {
|
||||
private ServerSection principal;
|
||||
private final LobbyBalancer plugin;
|
||||
private final Map<String, ServerSection> sectionStorage = new ConcurrentHashMap<>();
|
||||
private final Map<ServerInfo, ServerSection> sectionServers = new ConcurrentHashMap<>();
|
||||
@ -97,4 +98,12 @@ public class SectionManager {
|
||||
public boolean hasSection(String name) {
|
||||
return sectionStorage.containsKey(name);
|
||||
}
|
||||
|
||||
public ServerSection getPrincipal() {
|
||||
return principal;
|
||||
}
|
||||
|
||||
protected void setPrincipal(ServerSection principal) {
|
||||
this.principal = principal;
|
||||
}
|
||||
}
|
||||
|
@ -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.AdapterFix;
|
||||
@ -15,16 +16,34 @@ import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class ServerSection {
|
||||
private final String name;
|
||||
private final Configuration section;
|
||||
private final SectionManager manager;
|
||||
|
||||
@Expose
|
||||
private final String name;
|
||||
|
||||
@Expose
|
||||
private boolean principal;
|
||||
|
||||
@Expose
|
||||
private ServerSection parent;
|
||||
|
||||
@Expose
|
||||
private boolean inherit = false;
|
||||
|
||||
@Expose
|
||||
private List<ServerInfo> servers;
|
||||
|
||||
@Expose
|
||||
private ProviderType provider;
|
||||
|
||||
@Expose
|
||||
private ServerInfo server;
|
||||
|
||||
@Expose
|
||||
private SectionCommand command;
|
||||
|
||||
@Expose
|
||||
private boolean valid = false;
|
||||
|
||||
ServerSection(String name, Configuration section, SectionManager manager) {
|
||||
@ -37,6 +56,14 @@ public class ServerSection {
|
||||
void preInit(LobbyBalancer plugin) {
|
||||
principal = section.getBoolean("principal", false);
|
||||
|
||||
if (principal) {
|
||||
ServerSection section = manager.getPrincipal();
|
||||
if (section != null) {
|
||||
throw new IllegalStateException(String.format("The section \"%s\" is already principal", section.getName()));
|
||||
} else {
|
||||
manager.setPrincipal(this);
|
||||
}
|
||||
}
|
||||
if (ConfigUtils.isSet(section, "parent")) {
|
||||
if (principal) {
|
||||
throw new IllegalStateException(String.format("The principal section \"%s\" has a parent set", name));
|
||||
@ -84,14 +111,6 @@ public class ServerSection {
|
||||
throw new IllegalStateException(String.format("The section \"%s\" and \"%s\" are parents of each other", this.name, parent.name));
|
||||
}
|
||||
|
||||
if (principal) {
|
||||
manager.getSections().forEach((name, section) -> {
|
||||
if (section.isPrincipal() && section != this) {
|
||||
throw new IllegalStateException(String.format("The section \"%s\" is already principal", section.getName()));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (ConfigUtils.isSet(section, "provider")) {
|
||||
try {
|
||||
provider = ProviderType.valueOf(section.getString("provider").toUpperCase());
|
||||
@ -118,23 +137,24 @@ public class ServerSection {
|
||||
sect = sect.parent;
|
||||
}
|
||||
|
||||
LobbyBalancer.printStartupInfo("The section \"%s\" inherits the provider from parent section \"%s\"", this.name, sect.name);
|
||||
LobbyBalancer.printStartupInfo("The section \"%s\" inherits the provider from the section \"%s\"", this.name, sect.name);
|
||||
provider = sect.provider;
|
||||
inherit = true;
|
||||
}
|
||||
|
||||
if (provider == null) {
|
||||
throw new IllegalStateException(String.format("The section \"%s\" does not have a provider", name));
|
||||
}
|
||||
|
||||
if (ConfigUtils.isSet(section, "server")) {
|
||||
if (ConfigUtils.isSet(section, "section-server")) {
|
||||
int port = (int) Math.floor(Math.random() * (0xFFFF + 1));
|
||||
ServerInfo server = plugin.getProxy().constructServerInfo("@" + section.getString("server"), new InetSocketAddress("0.0.0.0", port), String.format("Server of Section %s", name), false);
|
||||
server = plugin.getProxy().constructServerInfo("@" + section.getString("section-server"), new InetSocketAddress("0.0.0.0", port), String.format("Server of Section %s", name), false);
|
||||
plugin.getSectionManager().register(server, this);
|
||||
AdapterFix.addFakeServer(server);
|
||||
}
|
||||
|
||||
if (ConfigUtils.isSet(section, "command")) {
|
||||
Configuration other = section.getSection("command");
|
||||
if (ConfigUtils.isSet(section, "section-command")) {
|
||||
Configuration other = section.getSection("section-command");
|
||||
|
||||
String name = other.getString("name");
|
||||
String permission = other.getString("permission");
|
||||
@ -171,6 +191,10 @@ public class ServerSection {
|
||||
return provider;
|
||||
}
|
||||
|
||||
public boolean isProviderInherit() {
|
||||
return inherit;
|
||||
}
|
||||
|
||||
public ServerInfo getServer() {
|
||||
return server;
|
||||
}
|
||||
|
@ -39,7 +39,7 @@ settings:
|
||||
# The descriptions that mark a server as non accessible
|
||||
marker-motds: ["Server is not accessible", "Gamemode has already started"]
|
||||
|
||||
# This will connect the players to a server
|
||||
# This will connect the player to a server of the parent of the section the player is kicked from
|
||||
reconnect-kick:
|
||||
enabled: true
|
||||
|
||||
@ -61,8 +61,10 @@ settings:
|
||||
# Override the behavior with rules
|
||||
rules: {}
|
||||
|
||||
# This will connect the player to a server of the parent of the section the player is currently on
|
||||
backward-command:
|
||||
enabled: true
|
||||
|
||||
name: 'backward'
|
||||
aliases: ['lobby', 'hub', 'back']
|
||||
permission: ''
|
||||
@ -80,7 +82,15 @@ settings:
|
||||
# WARNING: In testing stage
|
||||
geolocation:
|
||||
enabled: false
|
||||
rules: {}
|
||||
|
||||
# This prints info every time the plugin checks the country of a player (while being used)
|
||||
print-info: true
|
||||
|
||||
# The rules for the LOCALIZED provider, every section using it has to have a rule
|
||||
rules:
|
||||
practice:
|
||||
'EUPractice': ["Country1", "Country2"]
|
||||
'USPractice': ["Country3", "Country4"]
|
||||
|
||||
# This will reload the plugin everytime you execute /greload
|
||||
auto-reload: true
|
||||
@ -106,29 +116,29 @@ sections:
|
||||
general-lobbies:
|
||||
principal: true
|
||||
provider: RANDOM
|
||||
server: 'general-lobbies'
|
||||
section-server: 'general-lobbies'
|
||||
servers: ["Lobby1", "Lobby2", "Lobby3"]
|
||||
eggwars-lobbies:
|
||||
parent: 'general-lobbies'
|
||||
server: 'eggwars-lobbies'
|
||||
section-server: 'eggwars-lobbies'
|
||||
servers: ["EWLobby1", "EWLobby2", "EWLobby3"]
|
||||
eggwars-games:
|
||||
provider: FILLER
|
||||
parent: 'eggwars-lobbies'
|
||||
servers: ["EW1", "EW2", "EW3", "EW4", "EW5"]
|
||||
command:
|
||||
section-command:
|
||||
name: 'playeggwars'
|
||||
permission: ''
|
||||
aliases: []
|
||||
skywars-lobbies:
|
||||
parent: 'general-lobbies'
|
||||
server: 'skywars-lobbies'
|
||||
section-server: 'skywars-lobbies'
|
||||
servers: ["SWLobby1", "SWLobby2", "SWLobby3"]
|
||||
skywars-games:
|
||||
provider: FILLER
|
||||
parent: 'skywars-lobbies'
|
||||
servers: ["SW1", "SW2", "SW3", "SW4", "SW5"]
|
||||
command:
|
||||
section-command:
|
||||
name: 'playskywars'
|
||||
permission: ''
|
||||
aliases: []
|
||||
@ -136,7 +146,7 @@ sections:
|
||||
provider: LOCALIZED
|
||||
parent: 'general-lobbies'
|
||||
servers: ["EUPractice", "USPractice"]
|
||||
command:
|
||||
section-command:
|
||||
name: 'practice'
|
||||
permission: ''
|
||||
aliases: ["rektnoobs"]
|
Loading…
Reference in New Issue
Block a user