From 4aeb762c1756137e51d80705eeda9712c6796d30 Mon Sep 17 00:00:00 2001 From: Tux Date: Sun, 20 Apr 2014 10:50:45 -0400 Subject: [PATCH] Fix UUIDTranslator bug, add UUID null checking, make plugin messaging asynchronous --- .../redisbungee/RedisBungeeCommands.java | 21 +++- .../redisbungee/RedisBungeeListener.java | 109 +++++++++--------- .../redisbungee/util/UUIDTranslator.java | 4 +- 3 files changed, 76 insertions(+), 58 deletions(-) diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommands.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommands.java index d82514d..2c9ffc8 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommands.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommands.java @@ -102,7 +102,12 @@ class RedisBungeeCommands { @Override public void run() { if (args.length > 0) { - ServerInfo si = RedisBungee.getApi().getServerFor(plugin.getUuidTranslator().getTranslatedUuid(args[0])); + UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0]); + if (uuid == null) { + sender.sendMessage(PLAYER_NOT_FOUND); + return; + } + ServerInfo si = RedisBungee.getApi().getServerFor(uuid); if (si != null) { TextComponent message = new TextComponent(); message.setColor(ChatColor.BLUE); @@ -133,7 +138,12 @@ class RedisBungeeCommands { @Override public void run() { if (args.length > 0) { - long secs = RedisBungee.getApi().getLastOnline(plugin.getUuidTranslator().getTranslatedUuid(args[0])); + UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0]); + if (uuid == null) { + sender.sendMessage(PLAYER_NOT_FOUND); + return; + } + long secs = RedisBungee.getApi().getLastOnline(uuid); TextComponent message = new TextComponent(); if (secs == 0) { message.setColor(ChatColor.GREEN); @@ -170,7 +180,12 @@ class RedisBungeeCommands { @Override public void run() { if (args.length > 0) { - InetAddress ia = RedisBungee.getApi().getPlayerIp(plugin.getUuidTranslator().getTranslatedUuid(args[0])); + UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0]); + if (uuid == null) { + sender.sendMessage(PLAYER_NOT_FOUND); + return; + } + InetAddress ia = RedisBungee.getApi().getPlayerIp(uuid); if (ia != null) { TextComponent message = new TextComponent(); message.setColor(ChatColor.GREEN); diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeListener.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeListener.java index ae53dcc..c73fbfd 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeListener.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeListener.java @@ -22,10 +22,7 @@ import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.event.EventHandler; import redis.clients.jedis.Jedis; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; +import java.util.*; @AllArgsConstructor public class RedisBungeeListener implements Listener { @@ -87,60 +84,66 @@ public class RedisBungeeListener implements Listener { } @EventHandler - public void onPluginMessage(PluginMessageEvent event) { + public void onPluginMessage(final PluginMessageEvent event) { if (event.getTag().equals("RedisBungee") && event.getSender() instanceof Server) { - ByteArrayDataInput in = ByteStreams.newDataInput(event.getData()); + final byte[] data = Arrays.copyOf(event.getData(), event.getData().length); + plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() { + @Override + public void run() { + ByteArrayDataInput in = ByteStreams.newDataInput(data); - String subchannel = in.readUTF(); - ByteArrayDataOutput out = ByteStreams.newDataOutput(); - String type; + String subchannel = in.readUTF(); + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + String type; - switch (subchannel) { - case "PlayerList": - out.writeUTF("Players"); - Set original = Collections.emptySet(); - type = in.readUTF(); - if (type.equals("ALL")) { - out.writeUTF("ALL"); - original = plugin.getPlayers(); - } else { - try { - original = plugin.getPlayersOnServer(type); - } catch (IllegalArgumentException ignored) { - } + switch (subchannel) { + case "PlayerList": + out.writeUTF("Players"); + Set original = Collections.emptySet(); + type = in.readUTF(); + if (type.equals("ALL")) { + out.writeUTF("ALL"); + original = plugin.getPlayers(); + } else { + try { + original = plugin.getPlayersOnServer(type); + } catch (IllegalArgumentException ignored) { + } + } + Set players = new HashSet<>(); + for (UUID uuid : original) + players.add(plugin.getUuidTranslator().getNameFromUuid(uuid)); + out.writeUTF(Joiner.on(',').join(players)); + break; + case "PlayerCount": + out.writeUTF("PlayerCount"); + type = in.readUTF(); + if (type.equals("ALL")) { + out.writeUTF("ALL"); + out.writeInt(plugin.getCount()); + } else { + out.writeUTF(type); + try { + out.writeInt(plugin.getPlayersOnServer(type).size()); + } catch (IllegalArgumentException e) { + out.writeInt(0); + } + } + out.writeInt(plugin.getCurrentCount()); + break; + case "LastOnline": + String user = in.readUTF(); + out.writeUTF("LastOnline"); + out.writeUTF(user); + out.writeLong(plugin.getLastOnline(plugin.getUuidTranslator().getTranslatedUuid(user))); + break; + default: + break; } - Set players = new HashSet<>(); - for (UUID uuid : original) - players.add(plugin.getUuidTranslator().getNameFromUuid(uuid)); - out.writeUTF(Joiner.on(',').join(players)); - break; - case "PlayerCount": - out.writeUTF("PlayerCount"); - type = in.readUTF(); - if (type.equals("ALL")) { - out.writeUTF("ALL"); - out.writeInt(plugin.getCount()); - } else { - out.writeUTF(type); - try { - out.writeInt(plugin.getPlayersOnServer(type).size()); - } catch (IllegalArgumentException e) { - out.writeInt(0); - } - } - out.writeInt(plugin.getCurrentCount()); - break; - case "LastOnline": - String user = in.readUTF(); - out.writeUTF("LastOnline"); - out.writeUTF(user); - out.writeLong(plugin.getLastOnline(plugin.getUuidTranslator().getTranslatedUuid(user))); - break; - default: - break; - } - ((Server) event.getSender()).sendData("RedisBungee", out.toByteArray()); + ((Server) event.getSender()).sendData("RedisBungee", out.toByteArray()); + } + }); } } diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/util/UUIDTranslator.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/util/UUIDTranslator.java index 35225d7..151a2d0 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/util/UUIDTranslator.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/util/UUIDTranslator.java @@ -47,7 +47,7 @@ public class UUIDTranslator { if (stored != null && UUID_PATTERN.matcher(stored).find()) { // This is it! uuid = UUID.fromString(stored); - uuidMap.put(stored, UUID.fromString(stored)); + uuidMap.put(player, UUID.fromString(stored)); return uuid; } @@ -55,7 +55,7 @@ public class UUIDTranslator { uuid = UUIDFetcher.getUUIDOf(player); if (uuid != null) { - uuidMap.put(stored, uuid); + uuidMap.put(player, uuid); jedis.hset("uuids", player, uuid.toString()); }