diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java index 0292431..838c8d3 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java @@ -6,15 +6,18 @@ */ package com.imaginarycode.minecraft.redisbungee; +import com.google.common.base.Joiner; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; +import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import lombok.NonNull; import net.md_5.bungee.api.ServerPing; 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.*; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Plugin; @@ -44,7 +47,6 @@ public final class RedisBungee extends Plugin implements Listener { private static final ServerPing.PlayerInfo[] EMPTY_PLAYERINFO = new ServerPing.PlayerInfo[]{}; private static Configuration configuration; private JedisPool pool; - private RedisBungee plugin; private static RedisBungeeAPI api; private PubSubListener psl = null; @@ -72,7 +74,7 @@ public final class RedisBungee extends Plugin implements Listener { } final int getCount() { - int c = plugin.getProxy().getOnlineCount(); + int c = getProxy().getOnlineCount(); if (pool != null) { Jedis rsc = pool.getResource(); try { @@ -90,7 +92,7 @@ public final class RedisBungee extends Plugin implements Listener { final Set getPlayers() { Set players = new HashSet<>(); - for (ProxiedPlayer pp : plugin.getProxy().getPlayers()) { + for (ProxiedPlayer pp : getProxy().getPlayers()) { players.add(pp.getName()); } if (pool != null) { @@ -108,17 +110,18 @@ public final class RedisBungee extends Plugin implements Listener { } final Set getPlayersOnServer(@NonNull String server) { + checkArgument(getProxy().getServerInfo(server) != null, "server doesn't exist"); return ImmutableSet.copyOf(serversToPlayers().get(server)); } final ServerInfo getServerFor(@NonNull String name) { ServerInfo server = null; - if (plugin.getProxy().getPlayer(name) != null) return plugin.getProxy().getPlayer(name).getServer().getInfo(); + if (getProxy().getPlayer(name) != null) return getProxy().getPlayer(name).getServer().getInfo(); if (pool != null) { Jedis tmpRsc = pool.getResource(); try { if (tmpRsc.hexists("player:" + name, "server")) - server = plugin.getProxy().getServerInfo(tmpRsc.hget("player:" + name, "server")); + server = getProxy().getServerInfo(tmpRsc.hget("player:" + name, "server")); } finally { pool.returnResource(tmpRsc); } @@ -128,7 +131,7 @@ public final class RedisBungee extends Plugin implements Listener { final long getLastOnline(@NonNull String name) { long time = -1L; - if (plugin.getProxy().getPlayer(name) != null) return 0; + if (getProxy().getPlayer(name) != null) return 0; if (pool != null) { Jedis tmpRsc = pool.getResource(); try { @@ -142,8 +145,8 @@ public final class RedisBungee extends Plugin implements Listener { } final InetAddress getIpAddress(@NonNull String name) { - if (plugin.getProxy().getPlayer(name) != null) - return plugin.getProxy().getPlayer(name).getAddress().getAddress(); + if (getProxy().getPlayer(name) != null) + return getProxy().getPlayer(name).getAddress().getAddress(); InetAddress ia = null; if (pool != null) { Jedis tmpRsc = pool.getResource(); @@ -171,7 +174,6 @@ public final class RedisBungee extends Plugin implements Listener { @Override public void onEnable() { - plugin = this; try { loadConfig(); } catch (IOException e) { @@ -374,6 +376,65 @@ public final class RedisBungee extends Plugin implements Listener { event.setResponse(reply); } + @EventHandler + public void onPluginMessage(PluginMessageEvent event) { + if (event.getTag().equals("RedisBungee") && event.getSender() instanceof Server) { + DataInput in = ByteStreams.newDataInput(event.getData()); + + try { + String subchannel = in.readUTF(); + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + String type; + + switch (subchannel) { + case "PlayerList": + out.writeUTF("Players"); + Set source = Collections.emptySet(); + type = in.readUTF(); + if (type.equals("ALL")) { + out.writeUTF("ALL"); + source = getPlayers(); + } else { + try { + source = getPlayersOnServer(type); + } catch (IllegalArgumentException ignored) { + } + } + out.writeUTF(Joiner.on(',').join(source)); + break; + case "PlayerCount": + out.writeUTF("PlayerCount"); + type = in.readUTF(); + if (type.equals("ALL")) { + out.writeUTF("ALL"); + out.writeInt(getCount()); + } else { + out.writeUTF(type); + try { + out.writeInt(getPlayersOnServer(type).size()); + } catch (IllegalArgumentException e) { + out.writeInt(0); + } + } + out.writeInt(getCount()); + break; + case "LastOnline": + String user = in.readUTF(); + out.writeUTF("LastOnline"); + out.writeUTF(user); + out.writeLong(getLastOnline(user)); + break; + default: + break; + } + + ((Server) event.getSender()).sendData("RedisBungee", out.toByteArray()); + } catch (IOException e) { + throw new RuntimeException("Unable to process plugin message from " + event.getSender().getAddress(), e); + } + } + } + private void cleanUpPlayer(String player, Jedis rsc) { rsc.srem("server:" + configuration.getString("server-id") + ":usersOnline", player); rsc.hdel("player:" + player, "server");