Implemented PM-API and added an option to print info about the geolocation checks

This commit is contained in:
Jaime Martinez Rincon 2017-01-09 22:04:15 +01:00
parent c8399b12e0
commit a3b9aced7f
9 changed files with 165 additions and 30 deletions

View File

@ -6,7 +6,7 @@
<groupId>me.jaimemartz</groupId>
<artifactId>lobbybalancer</artifactId>
<version>2.0</version>
<version>2.0.1</version>
<name>LobbyBalancer</name>
<repositories>

View File

@ -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;
}

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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;
}
}
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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"]