diff --git a/pom.xml b/pom.xml index 8871e36..d52b99e 100644 --- a/pom.xml +++ b/pom.xml @@ -134,6 +134,13 @@ jar provided + + net.md-5 + bungeecord-config + 1.7-SNAPSHOT + jar + provided + org.projectlombok lombok diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java index a5bd65e..613a35f 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java @@ -6,7 +6,6 @@ */ package com.imaginarycode.minecraft.redisbungee; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.io.ByteStreams; import net.md_5.bungee.api.ServerPing; @@ -15,11 +14,12 @@ import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.event.*; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; import net.md_5.bungee.event.EventHandler; -import org.yaml.snakeyaml.Yaml; import redis.clients.jedis.*; import redis.clients.jedis.exceptions.JedisConnectionException; -import redis.clients.jedis.exceptions.JedisDataException; import redis.clients.jedis.exceptions.JedisException; import java.io.*; @@ -37,7 +37,7 @@ import java.util.logging.Level; public final class RedisBungee extends Plugin implements Listener { private static final ServerPing.PlayerInfo[] EMPTY_PLAYERINFO = new ServerPing.PlayerInfo[]{}; private RedisBungeeCommandSender commandSender = new RedisBungeeCommandSender(); - private static RedisBungeeConfiguration configuration = new RedisBungeeConfiguration(); + private static Configuration configuration; private JedisPool pool; private RedisBungee plugin; private static RedisBungeeAPI api; @@ -52,7 +52,7 @@ public final class RedisBungee extends Plugin implements Listener { return api; } - protected static RedisBungeeConfiguration getConfiguration() { + protected static Configuration getConfiguration() { return configuration; } @@ -61,8 +61,8 @@ public final class RedisBungee extends Plugin implements Listener { if (pool != null) { Jedis rsc = pool.getResource(); try { - for (String i : getConfiguration().getLinkedServers()) { - if (i.equals(configuration.getServerId())) continue; + for (String i : configuration.getStringList("linked-servers")) { + if (i.equals(configuration.getString("server-id"))) continue; if (rsc.exists("server:" + i + ":playerCount")) c += Integer.valueOf(rsc.get("server:" + i + ":playerCount")); } @@ -81,8 +81,8 @@ public final class RedisBungee extends Plugin implements Listener { if (pool != null) { Jedis rsc = pool.getResource(); try { - for (String i : getConfiguration().getLinkedServers()) { - if (i.equals(configuration.getServerId())) continue; + for (String i : configuration.getStringList("linked-servers")) { + if (i.equals(configuration.getString("server-id"))) continue; players.addAll(rsc.smembers("server:" + i + ":usersOnline")); } } finally { @@ -157,9 +157,9 @@ public final class RedisBungee extends Plugin implements Listener { if (pool != null) { Jedis tmpRsc = pool.getResource(); try { - tmpRsc.set("server:" + configuration.getServerId() + ":playerCount", "0"); // reset - if (tmpRsc.scard("server:" + configuration.getServerId() + ":usersOnline") > 0) { - for (String member : tmpRsc.smembers("server:" + configuration.getServerId() + ":usersOnline")) + tmpRsc.set("server:" + configuration.getString("server-id") + ":playerCount", "0"); // reset + if (tmpRsc.scard("server:" + configuration.getString("server-id") + ":usersOnline") > 0) { + for (String member : tmpRsc.smembers("server:" + configuration.getString("server-id") + ":usersOnline")) cleanUpPlayer(member, tmpRsc); } } finally { @@ -170,7 +170,7 @@ public final class RedisBungee extends Plugin implements Listener { public void run() { Jedis rsc = pool.getResource(); try { - rsc.set("server:" + configuration.getServerId() + ":playerCount", String.valueOf(getProxy().getOnlineCount())); + rsc.set("server:" + configuration.getString("server-id")+ ":playerCount", String.valueOf(getProxy().getOnlineCount())); } finally { pool.returnResource(rsc); } @@ -195,9 +195,9 @@ public final class RedisBungee extends Plugin implements Listener { getProxy().getScheduler().cancel(this); Jedis tmpRsc = pool.getResource(); try { - tmpRsc.set("server:" + configuration.getServerId() + ":playerCount", "0"); // reset - if (tmpRsc.scard("server:" + configuration.getServerId() + ":usersOnline") > 0) { - for (String member : tmpRsc.smembers("server:" + configuration.getServerId() + ":usersOnline")) + tmpRsc.set("server:" + configuration.getString("server-id") + ":playerCount", "0"); // reset + if (tmpRsc.scard("server:" + configuration.getString("server-id") + ":usersOnline") > 0) { + for (String member : tmpRsc.smembers("server:" + configuration.getString("server-id") + ":usersOnline")) cleanUpPlayer(member, tmpRsc); } } catch (JedisException | ClassCastException ignored) { @@ -223,56 +223,25 @@ public final class RedisBungee extends Plugin implements Listener { } } - Yaml yaml = new Yaml(); - Map rawYaml; + configuration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(file); - try (InputStream in = new FileInputStream(file)) { - rawYaml = (Map) yaml.load(in); - } - - String redisServer = "localhost"; - int redisPort = 6379; - String redisPassword = null; - try { - redisServer = ((String) rawYaml.get("redis-server")); - } catch (NullPointerException ignored) { - } - try { - redisPort = ((Integer) rawYaml.get("redis-port")); - } catch (NullPointerException ignored) { - } - try { - redisPassword = ((String) rawYaml.get("redis-password")); - } catch (NullPointerException ignored) { - } - try { - configuration.setServerId((String) rawYaml.get("server-id")); - } catch (NullPointerException ignored) { - } - try { - configuration.setCanonicalGlist((Boolean) rawYaml.get("canonical-glist")); - } catch (NullPointerException ignored) { - } - try { - configuration.setPlayerListInPing(((Boolean) rawYaml.get("player-list-in-ping"))); - } catch (NullPointerException ignored) { - } - List tmp = (List) rawYaml.get("linked-servers"); - - List servers = new ArrayList<>(); - if (tmp != null) - for (Object i : tmp) { - if (i instanceof String) { - servers.add((String) i); - } - } - - configuration.setLinkedServers(ImmutableList.copyOf(servers)); + String redisServer = configuration.getString("redis-server", "localhost"); + int redisPort = configuration.getInt("redis-port", 6379); + String redisPassword = configuration.getString("redis-password"); if (redisPassword != null && (redisPassword.equals("") || redisPassword.equals("none"))) { redisPassword = null; } + // Configuration sanity checks. + if (configuration.getString("server-id").equals("")) { + throw new RuntimeException("server-id is not specified in the configuration or is empty"); + } + + if (configuration.getStringList("linked-servers").equals(Collections.EMPTY_LIST)) { + throw new RuntimeException("linked-servers is not specified in the configuration or is empty"); + } + if (redisServer != null) { if (!redisServer.equals("")) { pool = new JedisPool(new JedisPoolConfig(), redisServer, redisPort, Protocol.DEFAULT_TIMEOUT, redisPassword); @@ -295,6 +264,8 @@ public final class RedisBungee extends Plugin implements Listener { } } } + } else { + throw new RuntimeException("No redis server specified!"); } } @@ -303,7 +274,7 @@ public final class RedisBungee extends Plugin implements Listener { if (pool != null) { Jedis rsc = pool.getResource(); try { - for (String server : configuration.getLinkedServers()) { + for (String server : configuration.getStringList("linked-servers")) { if (rsc.sismember("server:" + server + ":usersOnline", event.getConnection().getName())) { event.setCancelled(true); event.setCancelReason("You are already logged on to this server."); @@ -320,7 +291,7 @@ public final class RedisBungee extends Plugin implements Listener { if (pool != null) { Jedis rsc = pool.getResource(); try { - rsc.sadd("server:" + configuration.getServerId() + ":usersOnline", event.getPlayer().getName()); + rsc.sadd("server:" + configuration.getString("server-id", "") + ":usersOnline", event.getPlayer().getName()); rsc.hset("player:" + event.getPlayer().getName(), "online", "0"); rsc.hset("player:" + event.getPlayer().getName(), "ip", event.getPlayer().getAddress().getAddress().getHostAddress()); } finally { @@ -361,7 +332,7 @@ public final class RedisBungee extends Plugin implements Listener { public void onPing(ProxyPingEvent event) { ServerPing old = event.getResponse(); ServerPing reply = new ServerPing(); - if (configuration.isPlayerListInPing()) { + if (configuration.getBoolean("player-list-in-ping", false)) { Set players = getPlayers(); ServerPing.PlayerInfo[] info = new ServerPing.PlayerInfo[players.size()]; int idx = 0; @@ -380,7 +351,7 @@ public final class RedisBungee extends Plugin implements Listener { } private void cleanUpPlayer(String player, Jedis rsc) { - rsc.srem("server:" + configuration.getServerId() + ":usersOnline", player); + rsc.srem("server:" + configuration.getString("server-id") + ":usersOnline", player); rsc.hdel("player:" + player, "server"); rsc.hdel("player:" + player, "ip"); } @@ -398,7 +369,7 @@ public final class RedisBungee extends Plugin implements Listener { try { rsc = pool.getResource(); jpsh = new JedisPubSubHandler(); - rsc.subscribe(jpsh, "redisbungee-" + configuration.getServerId(), "redisbungee-allservers"); + rsc.subscribe(jpsh, "redisbungee-" + configuration.getString("server-id"), "redisbungee-allservers"); } catch (JedisException | ClassCastException ignored) { } } diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommands.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommands.java index 555ce99..a8ef694 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommands.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommands.java @@ -47,7 +47,7 @@ public class RedisBungeeCommands { BaseComponent[] playersOnline = new ComponentBuilder("").color(ChatColor.YELLOW).append(String.valueOf(count)) .append(" player(s) are currently online.").create(); if (args.length > 0 && args[0].equals("showall")) { - if (RedisBungee.getConfiguration().isCanonicalGlist()) { + if (RedisBungee.getConfiguration().getBoolean("canonical-glist", false)) { Multimap serverToPlayers = HashMultimap.create(); for (String p : RedisBungee.getApi().getPlayersOnline()) { ServerInfo si = RedisBungee.getApi().getServerFor(p); diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeConfiguration.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeConfiguration.java deleted file mode 100644 index 68f347c..0000000 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeConfiguration.java +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright © 2013 tuxed - * This work is free. You can redistribute it and/or modify it under the - * terms of the Do What The Fuck You Want To Public License, Version 2, - * as published by Sam Hocevar. See http://www.wtfpl.net/ for more details. - */ -package com.imaginarycode.minecraft.redisbungee; - -// How about some nasty relection magic, my friend? -// I don't think so. - -import lombok.AccessLevel; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.Collections; -import java.util.List; - -/** - * This class is purely internal. - */ -@Data -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class RedisBungeeConfiguration { - private String serverId = "iluvbungee"; - private boolean canonicalGlist = true; - private boolean playerListInPing = false; - private List linkedServers = Collections.emptyList(); -}