From 4757a49bdc96d6bb27f6a917f3b77d55b3ba508d Mon Sep 17 00:00:00 2001 From: mohammed jasem alaajel Date: Fri, 25 Jun 2021 07:06:48 +0400 Subject: [PATCH] phase 1 --- .../minecraft/redisbungee/DataManager.java | 72 ++--- .../minecraft/redisbungee/RedisBungee.java | 263 ++++++++-------- .../minecraft/redisbungee/RedisBungeeAPI.java | 8 +- .../redisbungee/RedisBungeeCommands.java | 291 +++++++++--------- .../redisbungee/RedisBungeeListener.java | 18 +- .../minecraft/redisbungee/RedisUtil.java | 9 +- .../redisbungee/util/uuid/NameFetcher.java | 1 + .../redisbungee/util/uuid/UUIDTranslator.java | 6 +- .../redisbungee/test/RedisUtilTest.java | 20 +- .../redisbungee/test/UUIDNameTest.java | 8 +- 10 files changed, 335 insertions(+), 361 deletions(-) diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/DataManager.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/DataManager.java index b063a3a..cf6a2cb 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/DataManager.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/DataManager.java @@ -33,6 +33,7 @@ import java.util.logging.Level; * * @since 0.3.3 */ +@SuppressWarnings({"u", "deprecation"}) public class DataManager implements Listener { private final RedisBungee plugin; private final Cache serverCache = createCache(); @@ -61,12 +62,9 @@ public class DataManager implements Listener { return player.getServer() != null ? player.getServer().getInfo().getName() : null; try { - return serverCache.get(uuid, new Callable() { - @Override - public String call() throws Exception { - try (Jedis tmpRsc = plugin.getPool().getResource()) { - return Objects.requireNonNull(tmpRsc.hget("player:" + uuid, "server"), "user not found"); - } + return serverCache.get(uuid, () -> { + try (Jedis tmpRsc = plugin.getPool().getResource()) { + return Objects.requireNonNull(tmpRsc.hget("player:" + uuid, "server"), "user not found"); } }); } catch (ExecutionException | UncheckedExecutionException e) { @@ -81,15 +79,12 @@ public class DataManager implements Listener { ProxiedPlayer player = plugin.getProxy().getPlayer(uuid); if (player != null) - return RedisBungee.getConfiguration().getServerId(); + return plugin.getConfiguration().getServerId(); try { - return proxyCache.get(uuid, new Callable() { - @Override - public String call() throws Exception { - try (Jedis tmpRsc = plugin.getPool().getResource()) { - return Objects.requireNonNull(tmpRsc.hget("player:" + uuid, "proxy"), "user not found"); - } + return proxyCache.get(uuid, () -> { + try (Jedis tmpRsc = plugin.getPool().getResource()) { + return Objects.requireNonNull(tmpRsc.hget("player:" + uuid, "proxy"), "user not found"); } }); } catch (ExecutionException | UncheckedExecutionException e) { @@ -107,15 +102,12 @@ public class DataManager implements Listener { return player.getAddress().getAddress(); try { - return ipCache.get(uuid, new Callable() { - @Override - public InetAddress call() throws Exception { - try (Jedis tmpRsc = plugin.getPool().getResource()) { - String result = tmpRsc.hget("player:" + uuid, "ip"); - if (result == null) - throw new NullPointerException("user not found"); - return InetAddresses.forString(result); - } + return ipCache.get(uuid, () -> { + try (Jedis tmpRsc = plugin.getPool().getResource()) { + String result = tmpRsc.hget("player:" + uuid, "ip"); + if (result == null) + throw new NullPointerException("user not found"); + return InetAddresses.forString(result); } }); } catch (ExecutionException | UncheckedExecutionException e) { @@ -133,13 +125,10 @@ public class DataManager implements Listener { return 0; try { - return lastOnlineCache.get(uuid, new Callable() { - @Override - public Long call() throws Exception { - try (Jedis tmpRsc = plugin.getPool().getResource()) { - String result = tmpRsc.hget("player:" + uuid, "online"); - return result == null ? -1 : Long.valueOf(result); - } + return lastOnlineCache.get(uuid, () -> { + try (Jedis tmpRsc = plugin.getPool().getResource()) { + String result = tmpRsc.hget("player:" + uuid, "online"); + return result == null ? -1 : Long.parseLong(result); } }); } catch (ExecutionException e) { @@ -177,7 +166,7 @@ public class DataManager implements Listener { String source = jsonObject.get("source").getAsString(); - if (source.equals(RedisBungee.getConfiguration().getServerId())) + if (source.equals(plugin.getRedisBungeeAPI().getServerId())) return; DataManagerMessage.Action action = DataManagerMessage.Action.valueOf(jsonObject.get("action").getAsString()); @@ -189,35 +178,20 @@ public class DataManager implements Listener { proxyCache.put(message1.getTarget(), message1.getSource()); lastOnlineCache.put(message1.getTarget(), (long) 0); ipCache.put(message1.getTarget(), message1.getPayload().getAddress()); - plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() { - @Override - public void run() { - plugin.getProxy().getPluginManager().callEvent(new PlayerJoinedNetworkEvent(message1.getTarget())); - } - }); + plugin.getProxy().getScheduler().runAsync(plugin, () -> plugin.getProxy().getPluginManager().callEvent(new PlayerJoinedNetworkEvent(message1.getTarget()))); break; case LEAVE: final DataManagerMessage message2 = RedisBungee.getGson().fromJson(jsonObject, new TypeToken>() { }.getType()); invalidate(message2.getTarget()); lastOnlineCache.put(message2.getTarget(), message2.getPayload().getTimestamp()); - plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() { - @Override - public void run() { - plugin.getProxy().getPluginManager().callEvent(new PlayerLeftNetworkEvent(message2.getTarget())); - } - }); + plugin.getProxy().getScheduler().runAsync(plugin, () -> plugin.getProxy().getPluginManager().callEvent(new PlayerLeftNetworkEvent(message2.getTarget()))); break; case SERVER_CHANGE: - final DataManagerMessage message3 = RedisBungee.getGson().fromJson(jsonObject, new TypeToken>() { + final DataManagerMessage message3 = plugin.getGson().fromJson(jsonObject, new TypeToken>() { }.getType()); serverCache.put(message3.getTarget(), message3.getPayload().getServer()); - plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() { - @Override - public void run() { - plugin.getProxy().getPluginManager().callEvent(new PlayerChangedServerNetworkEvent(message3.getTarget(), message3.getPayload().getOldServer(), message3.getPayload().getServer())); - } - }); + plugin.getProxy().getScheduler().runAsync(plugin, () -> plugin.getProxy().getPluginManager().callEvent(new PlayerChangedServerNetworkEvent(message3.getTarget(), message3.getPayload().getOldServer(), message3.getPayload().getServer()))); break; } } diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java index fb3a027..e1af8e1 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java @@ -40,27 +40,35 @@ import static com.google.common.base.Preconditions.checkArgument; * The only function of interest is {@link #getApi()}, which exposes some functions in this class. */ public final class RedisBungee extends Plugin { + @Getter - private static Gson gson = new Gson(); - private static RedisBungeeAPI api; + private static final Gson gson = new Gson(); + + @Getter + private RedisBungeeAPI redisBungeeAPI; + @Getter(AccessLevel.PACKAGE) - private static PubSubListener psl = null; + private PubSubListener psl = null; + @Getter private JedisPool pool; + @Getter private UUIDTranslator uuidTranslator; + @Getter(AccessLevel.PACKAGE) - private static RedisBungeeConfiguration configuration; + private RedisBungeeConfiguration configuration; + @Getter private DataManager dataManager; + @Getter - private static OkHttpClient httpClient; + private OkHttpClient httpClient; private volatile List serverIds; private final AtomicInteger nagAboutServers = new AtomicInteger(); private final AtomicInteger globalPlayerCount = new AtomicInteger(); private Future integrityCheck; private Future heartbeatTask; - private boolean usingLua; private LuaManager.Script serverToPlayersScript; private LuaManager.Script getPlayerCountScript; @@ -75,10 +83,15 @@ public final class RedisBungee extends Plugin { * @return the {@link RedisBungeeAPI} object */ public static RedisBungeeAPI getApi() { - return api; + return getPluginInstance().getRedisBungeeAPI(); } - static PubSubListener getPubSubListener() { + static RedisBungee getPluginInstance() { + return ((RedisBungee) ProxyServer.getInstance().getPluginManager().getPlugin("RedisBungee")); + } + + + PubSubListener getPubSubListener() { return psl; } @@ -129,27 +142,25 @@ public final class RedisBungee extends Plugin { } } + @SuppressWarnings("unchecked") final Multimap serversToPlayers() { try { - return serverToPlayersCache.get(SERVER_TO_PLAYERS_KEY, new Callable>() { - @Override - public Multimap call() throws Exception { - Collection data = (Collection) serverToPlayersScript.eval(ImmutableList.of(), getServerIds()); + return serverToPlayersCache.get(SERVER_TO_PLAYERS_KEY, () -> { + Collection data = (Collection) serverToPlayersScript.eval(ImmutableList.of(), getServerIds()); - ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); - String key = null; - for (String s : data) { - if (key == null) { - key = s; - continue; - } - - builder.put(key, UUID.fromString(s)); - key = null; + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + String key = null; + for (String s : data) { + if (key == null) { + key = s; + continue; } - return builder.build(); + builder.put(key, UUID.fromString(s)); + key = null; } + + return builder.build(); }); } catch (ExecutionException e) { throw new RuntimeException(e); @@ -161,7 +172,7 @@ public final class RedisBungee extends Plugin { } final int getCurrentCount() { - Long count = (Long) getPlayerCountScript.eval(ImmutableList.of(), ImmutableList.of()); + Long count = (Long) getPlayerCountScript.eval(ImmutableList.of(), ImmutableList.of()); return count.intValue(); } @@ -182,7 +193,7 @@ public final class RedisBungee extends Plugin { keys.add("proxy:" + i + ":usersOnline"); } if (!keys.isEmpty()) { - Set users = rsc.sunion(keys.toArray(new String[keys.size()])); + Set users = rsc.sunion(keys.toArray(new String[0])); if (users != null && !users.isEmpty()) { for (String user : users) { try { @@ -220,6 +231,11 @@ public final class RedisBungee extends Plugin { return Long.parseLong(timeRes.get(0)); } + + @SuppressWarnings("deprecation") + /* + Due replacing executor service is needed here and method from bungeecord api is deprecated :/ + */ @Override public void onEnable() { ThreadFactory factory = ((ThreadPoolExecutor) getExecutorService()).getThreadFactory(); @@ -246,15 +262,15 @@ public final class RedisBungee extends Plugin { for (String s : info.split("\r\n")) { if (s.startsWith("redis_version:")) { String version = s.split(":")[1]; - getLogger().info(version + " <- redis version"); - if (!(usingLua = RedisUtil.canUseLua(version))) { + if (!RedisUtil.isRedisVersionSupported((version))) { getLogger().warning("Your version of Redis (" + version + ") is not at least version 6.2 RedisBungee requires a newer version of Redis."); throw new RuntimeException("Unsupported Redis version detected"); - } else { - LuaManager manager = new LuaManager(this); - serverToPlayersScript = manager.createScript(IOUtil.readInputStreamAsString(getResourceAsStream("lua/server_to_players.lua"))); - getPlayerCountScript = manager.createScript(IOUtil.readInputStreamAsString(getResourceAsStream("lua/get_player_count.lua"))); } + getLogger().info("found a supported redis version: " + version); + LuaManager manager = new LuaManager(this); + serverToPlayersScript = manager.createScript(IOUtil.readInputStreamAsString(getResourceAsStream("lua/server_to_players.lua"))); + getPlayerCountScript = manager.createScript(IOUtil.readInputStreamAsString(getResourceAsStream("lua/get_player_count.lua"))); + break; } } @@ -268,23 +284,20 @@ public final class RedisBungee extends Plugin { } serverIds = getCurrentServerIds(true, false); uuidTranslator = new UUIDTranslator(this); - heartbeatTask = service.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - try (Jedis rsc = pool.getResource()) { - long redisTime = getRedisTime(rsc.time()); - rsc.hset("heartbeats", configuration.getServerId(), String.valueOf(redisTime)); - } catch (JedisConnectionException e) { - // Redis server has disappeared! - getLogger().log(Level.SEVERE, "Unable to update heartbeat - did your Redis server go away?", e); - return; - } - try { - serverIds = getCurrentServerIds(true, false); - globalPlayerCount.set(getCurrentCount()); - } catch (Throwable e) { - getLogger().log(Level.SEVERE, "Unable to update data - did your Redis server go away?", e); - } + heartbeatTask = service.scheduleAtFixedRate(() -> { + try (Jedis rsc = pool.getResource()) { + long redisTime = getRedisTime(rsc.time()); + rsc.hset("heartbeats", configuration.getServerId(), String.valueOf(redisTime)); + } catch (JedisConnectionException e) { + // Redis server has disappeared! + getLogger().log(Level.SEVERE, "Unable to update heartbeat - did your Redis server go away?", e); + return; + } + try { + serverIds = getCurrentServerIds(true, false); + globalPlayerCount.set(getCurrentCount()); + } catch (Throwable e) { + getLogger().log(Level.SEVERE, "Unable to update data - did your Redis server go away?", e); } }, 0, 3, TimeUnit.SECONDS); dataManager = new DataManager(this); @@ -296,76 +309,73 @@ public final class RedisBungee extends Plugin { } getProxy().getPluginManager().registerCommand(this, new RedisBungeeCommands.SendToAll(this)); getProxy().getPluginManager().registerCommand(this, new RedisBungeeCommands.ServerId(this)); - getProxy().getPluginManager().registerCommand(this, new RedisBungeeCommands.ServerIds()); + getProxy().getPluginManager().registerCommand(this, new RedisBungeeCommands.ServerIds(this)); getProxy().getPluginManager().registerCommand(this, new RedisBungeeCommands.PlayerProxyCommand(this)); getProxy().getPluginManager().registerCommand(this, new RedisBungeeCommands.PlistCommand(this)); getProxy().getPluginManager().registerCommand(this, new RedisBungeeCommands.DebugCommand(this)); - api = new RedisBungeeAPI(this); + redisBungeeAPI = new RedisBungeeAPI(this); getProxy().getPluginManager().registerListener(this, new RedisBungeeListener(this, configuration.getExemptAddresses())); getProxy().getPluginManager().registerListener(this, dataManager); psl = new PubSubListener(); getProxy().getScheduler().runAsync(this, psl); - integrityCheck = service.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - try (Jedis tmpRsc = pool.getResource()) { - Set players = getLocalPlayersAsUuidStrings(); - Set playersInRedis = tmpRsc.smembers("proxy:" + configuration.getServerId() + ":usersOnline"); - List lagged = getCurrentServerIds(false, true); + integrityCheck = service.scheduleAtFixedRate(() -> { + try (Jedis tmpRsc = pool.getResource()) { + Set players = getLocalPlayersAsUuidStrings(); + Set playersInRedis = tmpRsc.smembers("proxy:" + configuration.getServerId() + ":usersOnline"); + List lagged = getCurrentServerIds(false, true); - // Clean up lagged players. - for (String s : lagged) { - Set laggedPlayers = tmpRsc.smembers("proxy:" + s + ":usersOnline"); - tmpRsc.del("proxy:" + s + ":usersOnline"); - if (!laggedPlayers.isEmpty()) { - getLogger().info("Cleaning up lagged proxy " + s + " (" + laggedPlayers.size() + " players)..."); - for (String laggedPlayer : laggedPlayers) { - RedisUtil.cleanUpPlayer(laggedPlayer, tmpRsc); - } + // Clean up lagged players. + for (String s : lagged) { + Set laggedPlayers = tmpRsc.smembers("proxy:" + s + ":usersOnline"); + tmpRsc.del("proxy:" + s + ":usersOnline"); + if (!laggedPlayers.isEmpty()) { + getLogger().info("Cleaning up lagged proxy " + s + " (" + laggedPlayers.size() + " players)..."); + for (String laggedPlayer : laggedPlayers) { + RedisUtil.cleanUpPlayer(laggedPlayer, tmpRsc); } } - - Set absentLocally = new HashSet<>(playersInRedis); - absentLocally.removeAll(players); - Set absentInRedis = new HashSet<>(players); - absentInRedis.removeAll(playersInRedis); - - for (String member : absentLocally) { - boolean found = false; - for (String proxyId : getServerIds()) { - if (proxyId.equals(configuration.getServerId())) continue; - if (tmpRsc.sismember("proxy:" + proxyId + ":usersOnline", member)) { - // Just clean up the set. - found = true; - break; - } - } - if (!found) { - RedisUtil.cleanUpPlayer(member, tmpRsc); - getLogger().warning("Player found in set that was not found locally and globally: " + member); - } else { - tmpRsc.srem("proxy:" + configuration.getServerId() + ":usersOnline", member); - getLogger().warning("Player found in set that was not found locally, but is on another proxy: " + member); - } - } - - Pipeline pipeline = tmpRsc.pipelined(); - - for (String player : absentInRedis) { - // Player not online according to Redis but not BungeeCord. - getLogger().warning("Player " + player + " is on the proxy but not in Redis."); - - ProxiedPlayer proxiedPlayer = ProxyServer.getInstance().getPlayer(UUID.fromString(player)); - if (proxiedPlayer == null) - continue; // We'll deal with it later. - - RedisUtil.createPlayer(proxiedPlayer, pipeline, true); - } - - pipeline.sync(); - } catch (Throwable e) { - getLogger().log(Level.SEVERE, "Unable to fix up stored player data", e); } + + Set absentLocally = new HashSet<>(playersInRedis); + absentLocally.removeAll(players); + Set absentInRedis = new HashSet<>(players); + absentInRedis.removeAll(playersInRedis); + + for (String member : absentLocally) { + boolean found = false; + for (String proxyId : getServerIds()) { + if (proxyId.equals(configuration.getServerId())) continue; + if (tmpRsc.sismember("proxy:" + proxyId + ":usersOnline", member)) { + // Just clean up the set. + found = true; + break; + } + } + if (!found) { + RedisUtil.cleanUpPlayer(member, tmpRsc); + getLogger().warning("Player found in set that was not found locally and globally: " + member); + } else { + tmpRsc.srem("proxy:" + configuration.getServerId() + ":usersOnline", member); + getLogger().warning("Player found in set that was not found locally, but is on another proxy: " + member); + } + } + + Pipeline pipeline = tmpRsc.pipelined(); + + for (String player : absentInRedis) { + // Player not online according to Redis but not BungeeCord. + getLogger().warning("Player " + player + " is on the proxy but not in Redis."); + + ProxiedPlayer proxiedPlayer = ProxyServer.getInstance().getPlayer(UUID.fromString(player)); + if (proxiedPlayer == null) + continue; // We'll deal with it later. + + RedisUtil.createPlayer(proxiedPlayer, pipeline, true); + } + + pipeline.sync(); + } catch (Throwable e) { + getLogger().log(Level.SEVERE, "Unable to fix up stored player data", e); } }, 0, 1, TimeUnit.MINUTES); } @@ -395,6 +405,7 @@ public final class RedisBungee extends Plugin { } } + @SuppressWarnings("all") private void loadConfig() throws IOException, JedisConnectionException { if (!getDataFolder().exists()) { getDataFolder().mkdir(); @@ -426,9 +437,9 @@ public final class RedisBungee extends Plugin { // Configuration sanity checks. if (serverId == null || serverId.isEmpty()) { /* - * this check causes the config comments to disappear somehow - * I think due snake yaml limitations so as todo: write our own yaml parser? - */ + * this check causes the config comments to disappear somehow + * I think due snake yaml limitations so as todo: write our own yaml parser? + */ String genId = UUID.randomUUID().toString(); getLogger().info("Generated server id " + genId + " and saving it to config."); configuration.set("server-id", genId); @@ -482,17 +493,14 @@ public final class RedisBungee extends Plugin { } } - FutureTask task2 = new FutureTask<>(new Callable() { - @Override - public Void call() throws Exception { - httpClient = new OkHttpClient(); - Dispatcher dispatcher = new Dispatcher(getExecutorService()); - httpClient.setDispatcher(dispatcher); - NameFetcher.setHttpClient(httpClient); - UUIDFetcher.setHttpClient(httpClient); - RedisBungee.configuration = new RedisBungeeConfiguration(RedisBungee.this.getPool(), configuration, randomUUID); - return null; - } + FutureTask task2 = new FutureTask<>(() -> { + httpClient = new OkHttpClient(); + Dispatcher dispatcher = new Dispatcher(getExecutorService()); + httpClient.setDispatcher(dispatcher); + NameFetcher.setHttpClient(httpClient); + UUIDFetcher.setHttpClient(httpClient); + RedisBungee.getPluginInstance().configuration = new RedisBungeeConfiguration(RedisBungee.this.getPool(), configuration, randomUUID); + return null; }); getProxy().getScheduler().runAsync(this, task2); @@ -518,7 +526,7 @@ public final class RedisBungee extends Plugin { class PubSubListener implements Runnable { private JedisPubSubHandler jpsh; - private Set addedChannels = new HashSet(); + private final Set addedChannels = new HashSet<>(); @Override public void run() { @@ -537,10 +545,12 @@ public final class RedisBungee extends Plugin { try { jpsh.unsubscribe(); } catch (Exception e1) { + /* This may fail with - java.net.SocketException: Broken pipe - redis.clients.jedis.exceptions.JedisConnectionException: JedisPubSub was not subscribed to a Jedis instance */ + getLogger().warning("redis connection broken!"); } broken = true; } @@ -560,7 +570,7 @@ public final class RedisBungee extends Plugin { } public void removeChannel(String... channel) { - addedChannels.removeAll(Arrays.asList(channel)); + Arrays.asList(channel).forEach(addedChannels::remove); jpsh.unsubscribe(channel); } @@ -574,12 +584,7 @@ public final class RedisBungee extends Plugin { @Override public void onMessage(final String s, final String s2) { if (s2.trim().length() == 0) return; - getProxy().getScheduler().runAsync(RedisBungee.this, new Runnable() { - @Override - public void run() { - getProxy().getPluginManager().callEvent(new PubSubMessageEvent(s, s2)); - } - }); + getProxy().getScheduler().runAsync(RedisBungee.this, () -> getProxy().getPluginManager().callEvent(new PubSubMessageEvent(s, s2))); } } } diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java index 4643024..fcd76a1 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java @@ -24,7 +24,7 @@ public class RedisBungeeAPI { this.plugin = plugin; this.reservedChannels = ImmutableList.of( "redisbungee-allservers", - "redisbungee-" + RedisBungee.getConfiguration().getServerId(), + "redisbungee-" + getServerId(), "redisbungee-data" ); } @@ -192,7 +192,7 @@ public class RedisBungeeAPI { * @since 0.2.5 */ public final String getServerId() { - return RedisBungee.getConfiguration().getServerId(); + return plugin.getConfiguration().getServerId(); } /** @@ -213,7 +213,7 @@ public class RedisBungeeAPI { * @since 0.3 */ public final void registerPubSubChannels(String... channels) { - RedisBungee.getPubSubListener().addChannel(channels); + plugin.getPubSubListener().addChannel(channels); } /** @@ -227,7 +227,7 @@ public class RedisBungeeAPI { Preconditions.checkArgument(!reservedChannels.contains(channel), "attempting to unregister internal channel"); } - RedisBungee.getPubSubListener().removeChannel(channels); + plugin.getPubSubListener().removeChannel(channels); } /** diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommands.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommands.java index 3ccc507..35a16c2 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommands.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommands.java @@ -48,35 +48,32 @@ class RedisBungeeCommands { @Override public void execute(final CommandSender sender, final String[] args) { - plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() { - @Override - public void run() { - int count = RedisBungee.getApi().getPlayerCount(); - BaseComponent[] playersOnline = new ComponentBuilder("").color(ChatColor.YELLOW) - .append(playerPlural(count) + " currently online.").create(); - if (args.length > 0 && args[0].equals("showall")) { - Multimap serverToPlayers = RedisBungee.getApi().getServerToPlayers(); - Multimap human = HashMultimap.create(); - for (Map.Entry entry : serverToPlayers.entries()) { - human.put(entry.getKey(), plugin.getUuidTranslator().getNameFromUuid(entry.getValue(), false)); - } - for (String server : new TreeSet<>(serverToPlayers.keySet())) { - TextComponent serverName = new TextComponent(); - serverName.setColor(ChatColor.GREEN); - serverName.setText("[" + server + "] "); - TextComponent serverCount = new TextComponent(); - serverCount.setColor(ChatColor.YELLOW); - serverCount.setText("(" + serverToPlayers.get(server).size() + "): "); - TextComponent serverPlayers = new TextComponent(); - serverPlayers.setColor(ChatColor.WHITE); - serverPlayers.setText(Joiner.on(", ").join(human.get(server))); - sender.sendMessage(serverName, serverCount, serverPlayers); - } - sender.sendMessage(playersOnline); - } else { - sender.sendMessage(playersOnline); - sender.sendMessage(new ComponentBuilder("To see all players online, use /glist showall.").color(ChatColor.YELLOW).create()); + plugin.getProxy().getScheduler().runAsync(plugin, () -> { + int count = plugin.getRedisBungeeAPI().getPlayerCount(); + BaseComponent[] playersOnline = new ComponentBuilder("").color(ChatColor.YELLOW) + .append(playerPlural(count) + " currently online.").create(); + if (args.length > 0 && args[0].equals("showall")) { + Multimap serverToPlayers = plugin.getRedisBungeeAPI().getServerToPlayers(); + Multimap human = HashMultimap.create(); + for (Map.Entry entry : serverToPlayers.entries()) { + human.put(entry.getKey(), plugin.getUuidTranslator().getNameFromUuid(entry.getValue(), false)); } + for (String server : new TreeSet<>(serverToPlayers.keySet())) { + TextComponent serverName = new TextComponent(); + serverName.setColor(ChatColor.GREEN); + serverName.setText("[" + server + "] "); + TextComponent serverCount = new TextComponent(); + serverCount.setColor(ChatColor.YELLOW); + serverCount.setText("(" + serverToPlayers.get(server).size() + "): "); + TextComponent serverPlayers = new TextComponent(); + serverPlayers.setColor(ChatColor.WHITE); + serverPlayers.setText(Joiner.on(", ").join(human.get(server))); + sender.sendMessage(serverName, serverCount, serverPlayers); + } + sender.sendMessage(playersOnline); + } else { + sender.sendMessage(playersOnline); + sender.sendMessage(new ComponentBuilder("To see all players online, use /glist showall.").color(ChatColor.YELLOW).create()); } }); } @@ -92,27 +89,24 @@ class RedisBungeeCommands { @Override public void execute(final CommandSender sender, final String[] args) { - plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() { - @Override - public void run() { - if (args.length > 0) { - UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true); - 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); - message.setText(args[0] + " is on " + si.getName() + "."); - sender.sendMessage(message); - } else { - sender.sendMessage(PLAYER_NOT_FOUND); - } - } else { - sender.sendMessage(NO_PLAYER_SPECIFIED); + plugin.getProxy().getScheduler().runAsync(plugin, () -> { + if (args.length > 0) { + UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true); + if (uuid == null) { + sender.sendMessage(PLAYER_NOT_FOUND); + return; } + ServerInfo si = plugin.getRedisBungeeAPI().getServerFor(uuid); + if (si != null) { + TextComponent message = new TextComponent(); + message.setColor(ChatColor.BLUE); + message.setText(args[0] + " is on " + si.getName() + "."); + sender.sendMessage(message); + } else { + sender.sendMessage(PLAYER_NOT_FOUND); + } + } else { + sender.sendMessage(NO_PLAYER_SPECIFIED); } }); } @@ -128,31 +122,28 @@ class RedisBungeeCommands { @Override public void execute(final CommandSender sender, final String[] args) { - plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() { - @Override - public void run() { - if (args.length > 0) { - UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true); - 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); - message.setText(args[0] + " is currently online."); - } else if (secs != -1) { - message.setColor(ChatColor.BLUE); - message.setText(args[0] + " was last online on " + new SimpleDateFormat().format(secs) + "."); - } else { - message.setColor(ChatColor.RED); - message.setText(args[0] + " has never been online."); - } - sender.sendMessage(message); - } else { - sender.sendMessage(NO_PLAYER_SPECIFIED); + plugin.getProxy().getScheduler().runAsync(plugin, () -> { + if (args.length > 0) { + UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true); + if (uuid == null) { + sender.sendMessage(PLAYER_NOT_FOUND); + return; } + long secs = plugin.getRedisBungeeAPI().getLastOnline(uuid); + TextComponent message = new TextComponent(); + if (secs == 0) { + message.setColor(ChatColor.GREEN); + message.setText(args[0] + " is currently online."); + } else if (secs != -1) { + message.setColor(ChatColor.BLUE); + message.setText(args[0] + " was last online on " + new SimpleDateFormat().format(secs) + "."); + } else { + message.setColor(ChatColor.RED); + message.setText(args[0] + " has never been online."); + } + sender.sendMessage(message); + } else { + sender.sendMessage(NO_PLAYER_SPECIFIED); } }); } @@ -168,27 +159,24 @@ class RedisBungeeCommands { @Override public void execute(final CommandSender sender, final String[] args) { - plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() { - @Override - public void run() { - if (args.length > 0) { - UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true); - 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); - message.setText(args[0] + " is connected from " + ia.toString() + "."); - sender.sendMessage(message); - } else { - sender.sendMessage(PLAYER_NOT_FOUND); - } - } else { - sender.sendMessage(NO_PLAYER_SPECIFIED); + plugin.getProxy().getScheduler().runAsync(plugin, () -> { + if (args.length > 0) { + UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true); + if (uuid == null) { + sender.sendMessage(PLAYER_NOT_FOUND); + return; } + InetAddress ia = plugin.getRedisBungeeAPI().getPlayerIp(uuid); + if (ia != null) { + TextComponent message = new TextComponent(); + message.setColor(ChatColor.GREEN); + message.setText(args[0] + " is connected from " + ia + "."); + sender.sendMessage(message); + } else { + sender.sendMessage(PLAYER_NOT_FOUND); + } + } else { + sender.sendMessage(NO_PLAYER_SPECIFIED); } }); } @@ -197,43 +185,41 @@ class RedisBungeeCommands { public static class PlayerProxyCommand extends Command { private final RedisBungee plugin; - PlayerProxyCommand(RedisBungee plugin) { + PlayerProxyCommand(RedisBungee plugin) { super("pproxy", "redisbungee.command.pproxy"); this.plugin = plugin; } @Override public void execute(final CommandSender sender, final String[] args) { - plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() { - @Override - public void run() { - if (args.length > 0) { - UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true); - if (uuid == null) { - sender.sendMessage(PLAYER_NOT_FOUND); - return; - } - String proxy = RedisBungee.getApi().getProxy(uuid); - if (proxy != null) { - TextComponent message = new TextComponent(); - message.setColor(ChatColor.GREEN); - message.setText(args[0] + " is connected to " + proxy + "."); - sender.sendMessage(message); - } else { - sender.sendMessage(PLAYER_NOT_FOUND); - } - } else { - sender.sendMessage(NO_PLAYER_SPECIFIED); + plugin.getProxy().getScheduler().runAsync(plugin, () -> { + if (args.length > 0) { + UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true); + if (uuid == null) { + sender.sendMessage(PLAYER_NOT_FOUND); + return; } + String proxy = plugin.getRedisBungeeAPI().getProxy(uuid); + if (proxy != null) { + TextComponent message = new TextComponent(); + message.setColor(ChatColor.GREEN); + message.setText(args[0] + " is connected to " + proxy + "."); + sender.sendMessage(message); + } else { + sender.sendMessage(PLAYER_NOT_FOUND); + } + } else { + sender.sendMessage(NO_PLAYER_SPECIFIED); } }); } } public static class SendToAll extends Command { + private final RedisBungee plugin; - SendToAll(RedisBungee plugin) { + SendToAll(RedisBungee plugin) { super("sendtoall", "redisbungee.command.sendtoall", "rsendtoall"); this.plugin = plugin; } @@ -242,7 +228,7 @@ class RedisBungeeCommands { public void execute(CommandSender sender, String[] args) { if (args.length > 0) { String command = Joiner.on(" ").skipNulls().join(args); - RedisBungee.getApi().sendProxyCommand(command); + plugin.getRedisBungeeAPI().sendProxyCommand(command); TextComponent message = new TextComponent(); message.setColor(ChatColor.GREEN); message.setText("Sent the command /" + command + " to all proxies."); @@ -256,7 +242,7 @@ class RedisBungeeCommands { public static class ServerId extends Command { private final RedisBungee plugin; - ServerId(RedisBungee plugin) { + ServerId(RedisBungee plugin) { super("serverid", "redisbungee.command.serverid", "rserverid"); this.plugin = plugin; } @@ -264,21 +250,23 @@ class RedisBungeeCommands { @Override public void execute(CommandSender sender, String[] args) { TextComponent textComponent = new TextComponent(); - textComponent.setText("You are on " + RedisBungee.getApi().getServerId() + "."); + textComponent.setText("You are on " + plugin.getRedisBungeeAPI().getServerId() + "."); textComponent.setColor(ChatColor.YELLOW); sender.sendMessage(textComponent); } } public static class ServerIds extends Command { - public ServerIds() { + private final RedisBungee plugin; + ServerIds(RedisBungee plugin) { super("serverids", "redisbungee.command.serverids"); + this.plugin = plugin; } @Override public void execute(CommandSender sender, String[] strings) { TextComponent textComponent = new TextComponent(); - textComponent.setText("All server IDs: " + Joiner.on(", ").join(RedisBungee.getApi().getAllServers())); + textComponent.setText("All server IDs: " + Joiner.on(", ").join(plugin.getRedisBungeeAPI().getAllServers())); textComponent.setColor(ChatColor.YELLOW); sender.sendMessage(textComponent); } @@ -294,42 +282,39 @@ class RedisBungeeCommands { @Override public void execute(final CommandSender sender, final String[] args) { - plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() { - @Override - public void run() { - String proxy = args.length >= 1 ? args[0] : RedisBungee.getConfiguration().getServerId(); - if (!plugin.getServerIds().contains(proxy)) { - sender.sendMessage(new ComponentBuilder(proxy + " is not a valid proxy. See /serverids for valid proxies.").color(ChatColor.RED).create()); - return; - } - Set players = RedisBungee.getApi().getPlayersOnProxy(proxy); - BaseComponent[] playersOnline = new ComponentBuilder("").color(ChatColor.YELLOW) - .append(playerPlural(players.size()) + " currently on proxy " + proxy + ".").create(); - if (args.length >= 2 && args[1].equals("showall")) { - Multimap serverToPlayers = RedisBungee.getApi().getServerToPlayers(); - Multimap human = HashMultimap.create(); - for (Map.Entry entry : serverToPlayers.entries()) { - if (players.contains(entry.getValue())) { - human.put(entry.getKey(), plugin.getUuidTranslator().getNameFromUuid(entry.getValue(), false)); - } + plugin.getProxy().getScheduler().runAsync(plugin, () -> { + String proxy = args.length >= 1 ? args[0] : plugin.getConfiguration().getServerId(); + if (!plugin.getServerIds().contains(proxy)) { + sender.sendMessage(new ComponentBuilder(proxy + " is not a valid proxy. See /serverids for valid proxies.").color(ChatColor.RED).create()); + return; + } + Set players = plugin.getRedisBungeeAPI().getPlayersOnProxy(proxy); + BaseComponent[] playersOnline = new ComponentBuilder("").color(ChatColor.YELLOW) + .append(playerPlural(players.size()) + " currently on proxy " + proxy + ".").create(); + if (args.length >= 2 && args[1].equals("showall")) { + Multimap serverToPlayers = plugin.getRedisBungeeAPI().getServerToPlayers(); + Multimap human = HashMultimap.create(); + for (Map.Entry entry : serverToPlayers.entries()) { + if (players.contains(entry.getValue())) { + human.put(entry.getKey(), plugin.getUuidTranslator().getNameFromUuid(entry.getValue(), false)); } - for (String server : new TreeSet<>(human.keySet())) { - TextComponent serverName = new TextComponent(); - serverName.setColor(ChatColor.RED); - serverName.setText("[" + server + "] "); - TextComponent serverCount = new TextComponent(); - serverCount.setColor(ChatColor.YELLOW); - serverCount.setText("(" + human.get(server).size() + "): "); - TextComponent serverPlayers = new TextComponent(); - serverPlayers.setColor(ChatColor.WHITE); - serverPlayers.setText(Joiner.on(", ").join(human.get(server))); - sender.sendMessage(serverName, serverCount, serverPlayers); - } - sender.sendMessage(playersOnline); - } else { - sender.sendMessage(playersOnline); - sender.sendMessage(new ComponentBuilder("To see all players online, use /plist " + proxy + " showall.").color(ChatColor.YELLOW).create()); } + for (String server : new TreeSet<>(human.keySet())) { + TextComponent serverName = new TextComponent(); + serverName.setColor(ChatColor.RED); + serverName.setText("[" + server + "] "); + TextComponent serverCount = new TextComponent(); + serverCount.setColor(ChatColor.YELLOW); + serverCount.setText("(" + human.get(server).size() + "): "); + TextComponent serverPlayers = new TextComponent(); + serverPlayers.setColor(ChatColor.WHITE); + serverPlayers.setText(Joiner.on(", ").join(human.get(server))); + sender.sendMessage(serverName, serverCount, serverPlayers); + } + sender.sendMessage(playersOnline); + } else { + sender.sendMessage(playersOnline); + sender.sendMessage(new ComponentBuilder("To see all players online, use /plist " + proxy + " showall.").color(ChatColor.YELLOW).create()); } }); } diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeListener.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeListener.java index 9e4548b..4e5a5f8 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeListener.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeListener.java @@ -145,7 +145,7 @@ public class RedisBungeeListener implements Listener { event.getResponse().getPlayers().setOnline(plugin.getCount()); } - @SuppressWarnings("UnstableApiUsage") + @SuppressWarnings({"UnstableApiUsage", "null"}) @EventHandler public void onPluginMessage(final PluginMessageEvent event) { if ((event.getTag().equals("legacy:redisbungee") || event.getTag().equals("RedisBungee")) && event.getSender() instanceof Server) { @@ -158,6 +158,7 @@ public class RedisBungeeListener implements Listener { ByteArrayDataOutput out = ByteStreams.newDataOutput(); String type; + UUID uuid; switch (subchannel) { case "PlayerList": out.writeUTF("PlayerList"); @@ -168,13 +169,12 @@ public class RedisBungeeListener implements Listener { original = plugin.getPlayers(); } else { try { - original = RedisBungee.getApi().getPlayersOnServer(type); + original = plugin.getRedisBungeeAPI().getPlayersOnServer(type); } catch (IllegalArgumentException ignored) { } } Set players = new HashSet<>(); - for (UUID uuid : original) - players.add(plugin.getUuidTranslator().getNameFromUuid(uuid, false)); + original.forEach((u -> players.add(plugin.getUuidTranslator().getNameFromUuid(u, false)))); out.writeUTF(Joiner.on(',').join(players)); break; case "PlayerCount": @@ -196,7 +196,9 @@ public class RedisBungeeListener implements Listener { String user = in.readUTF(); out.writeUTF("LastOnline"); out.writeUTF(user); - out.writeLong(RedisBungee.getApi().getLastOnline(plugin.getUuidTranslator().getTranslatedUuid(user, true))); + uuid = plugin.getUuidTranslator().getTranslatedUuid(user, true); + assert uuid != null; + out.writeLong(RedisBungee.getApi().getLastOnline(uuid)); break; case "ServerPlayers": String type1 = in.readUTF(); @@ -231,13 +233,15 @@ public class RedisBungeeListener implements Listener { break; case "Proxy": out.writeUTF("Proxy"); - out.writeUTF(RedisBungee.getConfiguration().getServerId()); + out.writeUTF(plugin.getConfiguration().getServerId()); break; case "PlayerProxy": String username = in.readUTF(); out.writeUTF("PlayerProxy"); out.writeUTF(username); - out.writeUTF(RedisBungee.getApi().getProxy(plugin.getUuidTranslator().getTranslatedUuid(username, true))); + uuid = plugin.getUuidTranslator().getTranslatedUuid(username, true); + assert uuid != null; + out.writeUTF(RedisBungee.getApi().getProxy(uuid)); break; default: return; diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisUtil.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisUtil.java index 393c443..d76c7ac 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisUtil.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisUtil.java @@ -25,13 +25,13 @@ public class RedisUtil { Map playerData = new HashMap<>(4); playerData.put("online", "0"); playerData.put("ip", connection.getAddress().getAddress().getHostAddress()); - playerData.put("proxy", RedisBungee.getConfiguration().getServerId()); + playerData.put("proxy", RedisBungee.getPluginInstance().getConfiguration().getServerId()); pipeline.sadd("proxy:" + RedisBungee.getApi().getServerId() + ":usersOnline", connection.getUniqueId().toString()); pipeline.hmset("player:" + connection.getUniqueId().toString(), playerData); if (fireEvent) { - pipeline.publish("redisbungee-data", RedisBungee.getGson().toJson(new DataManager.DataManagerMessage<>( + pipeline.publish("redisbungee-data", RedisBungee.getPluginInstance().getGson().toJson(new DataManager.DataManagerMessage<>( connection.getUniqueId(), DataManager.DataManagerMessage.Action.JOIN, new DataManager.LoginPayload(connection.getAddress().getAddress())))); } @@ -57,7 +57,12 @@ public class RedisUtil { new DataManager.LogoutPayload(timestamp)))); } + @Deprecated public static boolean canUseLua(String redisVersion) { + return isRedisVersionSupported(redisVersion); + } + + public static boolean isRedisVersionSupported(String redisVersion) { // Need to use >=6.2 to use Lua optimizations. String[] args = redisVersion.split("\\."); if (args.length < 2) { diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/util/uuid/NameFetcher.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/util/uuid/NameFetcher.java index b7c035f..8891a97 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/util/uuid/NameFetcher.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/util/uuid/NameFetcher.java @@ -29,6 +29,7 @@ public class NameFetcher { Type listType = new TypeToken>() { }.getType(); + List names = RedisBungee.getGson().fromJson(response, listType); List humanNames = new ArrayList<>(); diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/util/uuid/UUIDTranslator.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/util/uuid/UUIDTranslator.java index 0554dbf..4c12062 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/util/uuid/UUIDTranslator.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/util/uuid/UUIDTranslator.java @@ -74,7 +74,7 @@ public final class UUIDTranslator { String stored = jedis.hget("uuid-cache", player.toLowerCase()); if (stored != null) { // Found an entry value. Deserialize it. - CachedUUIDEntry entry = RedisBungee.getGson().fromJson(stored, CachedUUIDEntry.class); + CachedUUIDEntry entry = plugin.getGson().fromJson(stored, CachedUUIDEntry.class); // Check for expiry: if (entry.expired()) { @@ -132,7 +132,7 @@ public final class UUIDTranslator { String stored = jedis.hget("uuid-cache", player.toString()); if (stored != null) { // Found an entry value. Deserialize it. - CachedUUIDEntry entry = RedisBungee.getGson().fromJson(stored, CachedUUIDEntry.class); + CachedUUIDEntry entry = plugin.getGson().fromJson(stored, CachedUUIDEntry.class); // Check for expiry: if (entry.expired()) { @@ -186,7 +186,7 @@ public final class UUIDTranslator { @RequiredArgsConstructor @Getter - private class CachedUUIDEntry { + private static class CachedUUIDEntry { private final String name; private final UUID uuid; private final Calendar expiry; diff --git a/src/test/java/com/imaginarycode/minecraft/redisbungee/test/RedisUtilTest.java b/src/test/java/com/imaginarycode/minecraft/redisbungee/test/RedisUtilTest.java index 0f89d36..e00cbfc 100644 --- a/src/test/java/com/imaginarycode/minecraft/redisbungee/test/RedisUtilTest.java +++ b/src/test/java/com/imaginarycode/minecraft/redisbungee/test/RedisUtilTest.java @@ -6,15 +6,15 @@ import org.junit.Test; public class RedisUtilTest { @Test - public void testRedisLuaCheck() { - Assert.assertTrue(RedisUtil.canUseLua("6.2.0")); - Assert.assertFalse(RedisUtil.canUseLua("6.1.0")); - Assert.assertFalse(RedisUtil.canUseLua("6.0.0")); - Assert.assertFalse(RedisUtil.canUseLua("2.6.0")); - Assert.assertFalse(RedisUtil.canUseLua("2.2.12")); - Assert.assertFalse(RedisUtil.canUseLua("1.2.4")); - Assert.assertFalse(RedisUtil.canUseLua("2.8.4")); - Assert.assertFalse(RedisUtil.canUseLua("3.0.0")); - Assert.assertFalse(RedisUtil.canUseLua("3.2.1")); + public void testRedisVersion() { + Assert.assertTrue(RedisUtil.isRedisVersionSupported("6.2.0")); + Assert.assertFalse(RedisUtil.isRedisVersionSupported(("6.1.0"))); + Assert.assertFalse(RedisUtil.isRedisVersionSupported(("6.0.0"))); + Assert.assertFalse(RedisUtil.isRedisVersionSupported(("2.6.0"))); + Assert.assertFalse(RedisUtil.isRedisVersionSupported(("2.2.12"))); + Assert.assertFalse(RedisUtil.isRedisVersionSupported(("1.2.4"))); + Assert.assertFalse(RedisUtil.isRedisVersionSupported(("2.8.4"))); + Assert.assertFalse(RedisUtil.isRedisVersionSupported(("3.0.0"))); + Assert.assertFalse(RedisUtil.isRedisVersionSupported(("3.2.1"))); } } diff --git a/src/test/java/com/imaginarycode/minecraft/redisbungee/test/UUIDNameTest.java b/src/test/java/com/imaginarycode/minecraft/redisbungee/test/UUIDNameTest.java index 613f97b..5a722de 100644 --- a/src/test/java/com/imaginarycode/minecraft/redisbungee/test/UUIDNameTest.java +++ b/src/test/java/com/imaginarycode/minecraft/redisbungee/test/UUIDNameTest.java @@ -12,8 +12,8 @@ import java.util.Map; import java.util.UUID; public class UUIDNameTest { - private String[] uuidsToTest = {"68ec43f7234b41b48764dfb38b9ffe8c", "652a2bc4e8cd405db7b698156ee2dc09"}; - private String[] namesToTest = {"vemacs"}; + private final String[] uuidsToTest = {"68ec43f7234b41b48764dfb38b9ffe8c", "652a2bc4e8cd405db7b698156ee2dc09"}; + private final String[] namesToTest = {"vemacs"}; @Test public void testUuidToName() throws IOException { @@ -27,7 +27,7 @@ public class UUIDNameTest { } @Test - public void testNameToUuid() throws IOException { + public void testNameToUuid() { OkHttpClient httpClient = new OkHttpClient(); UUIDFetcher.setHttpClient(httpClient); for (String name : namesToTest) { @@ -44,4 +44,4 @@ public class UUIDNameTest { } } } -} +} \ No newline at end of file