diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java index ecaaaa8..24e9a4d 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java @@ -6,7 +6,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; import com.imaginarycode.minecraft.redisbungee.api.RedisBungeePlugin; import com.imaginarycode.minecraft.redisbungee.api.summoners.JedisClusterSummoner; -import com.imaginarycode.minecraft.redisbungee.api.summoners.JedisSummoner; +import com.imaginarycode.minecraft.redisbungee.api.summoners.JedisPooledSummoner; import com.imaginarycode.minecraft.redisbungee.api.summoners.Summoner; import com.imaginarycode.minecraft.redisbungee.api.RedisBungeeMode; import org.checkerframework.checker.nullness.qual.NonNull; @@ -365,10 +365,11 @@ public class RedisBungeeAPI { * @return {@link Jedis} * @since 0.7.0 * @throws IllegalStateException if the {@link #getMode()} is not equal to {@link RedisBungeeMode#SINGLE} + * @see #getJedisPool() */ public Jedis requestJedis() { if (getMode() == RedisBungeeMode.SINGLE) { - return ((JedisSummoner) this.plugin.getSummoner()).obtainResource(); + return getJedisPool().getResource(); } else { throw new IllegalStateException("Mode is not " + RedisBungeeMode.SINGLE); } @@ -380,17 +381,22 @@ public class RedisBungeeAPI { * @return {@link JedisPool} * @since 0.6.5 * @throws IllegalStateException if the {@link #getMode()} is not equal to {@link RedisBungeeMode#SINGLE} + * @throws IllegalStateException if JedisPool compatibility mode is disabled in the config */ public JedisPool getJedisPool() { if (getMode() == RedisBungeeMode.SINGLE) { - return ((JedisSummoner) this.plugin.getSummoner()).getJedisPool(); + JedisPool jedisPool = ((JedisPooledSummoner) this.plugin.getSummoner()).getCompatibilityJedisPool(); + if (jedisPool == null) { + throw new IllegalStateException("JedisPool compatibility mode is disabled"); + } + return jedisPool; } else { throw new IllegalStateException("Mode is not " + RedisBungeeMode.SINGLE); } } /** - * This gives you instance of Jedis Cluster + * This gives you instance of JedisCluster * WARNING DO NOT USE {@link JedisCluster#close()} it will break the functionally * * @return {@link redis.clients.jedis.JedisCluster} @@ -406,7 +412,23 @@ public class RedisBungeeAPI { } /** - * returns Summoner class responsible for Single Jedis {@link Jedis}, Cluster Jedis {@link redis.clients.jedis.JedisCluster} handling + * This gives you instance of JedisPooled + * WARNING: DO NOT USE {@link redis.clients.jedis.JedisPooled#close()} it will break the functionally + * + * @return {@link redis.clients.jedis.JedisPooled} + * @since 0.8.0 + * @throws IllegalStateException if the {@link #getMode()} is not equal to {@link RedisBungeeMode#SINGLE} + */ + public JedisCluster requestJedisPooled() { + if (getMode() == RedisBungeeMode.SINGLE) { + return ((JedisClusterSummoner) this.plugin.getSummoner()).obtainResource(); + } else { + throw new IllegalStateException("Mode is not " + RedisBungeeMode.SINGLE); + } + } + + /** + * returns Summoner class responsible for Single Jedis {@link redis.clients.jedis.JedisPooled} with {@link JedisPool}, Cluster Jedis {@link redis.clients.jedis.JedisCluster} handling * * @return {@link Summoner} * @since 0.8.0 diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/AbstractDataManager.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/AbstractDataManager.java index 8b80ccc..8cfe439 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/AbstractDataManager.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/AbstractDataManager.java @@ -9,8 +9,7 @@ import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.imaginarycode.minecraft.redisbungee.api.tasks.RedisTask; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisCluster; +import redis.clients.jedis.UnifiedJedis; import java.lang.reflect.InvocationTargetException; import java.net.InetAddress; @@ -53,14 +52,8 @@ public abstract class AbstractDataManager { try { return serverCache.get(uuid, new RedisTask(plugin.getApi()) { @Override - public String jedisTask(Jedis jedis) { - return Objects.requireNonNull(jedis.hget("player:" + uuid, "server"), "user not found"); - - } - - @Override - public String clusterJedisTask(JedisCluster jedisCluster) { - return Objects.requireNonNull(jedisCluster.hget("player:" + uuid, "server"), "user not found"); + public String unifiedJedisTask(UnifiedJedis unifiedJedis) { + return Objects.requireNonNull(unifiedJedis.hget("player:" + uuid, "server"), "user not found"); } }); @@ -82,13 +75,8 @@ public abstract class AbstractDataManager { try { return proxyCache.get(uuid, new RedisTask(plugin.getApi()) { @Override - public String jedisTask(Jedis jedis) { - return Objects.requireNonNull(jedis.hget("player:" + uuid, "proxy"), "user not found"); - } - - @Override - public String clusterJedisTask(JedisCluster jedisCluster) { - return Objects.requireNonNull(jedisCluster.hget("player:" + uuid, "proxy"), "user not found"); + public String unifiedJedisTask(UnifiedJedis unifiedJedis) { + return Objects.requireNonNull(unifiedJedis.hget("player:" + uuid, "proxy"), "user not found"); } }); } catch (ExecutionException | UncheckedExecutionException e) { @@ -108,16 +96,8 @@ public abstract class AbstractDataManager { try { return ipCache.get(uuid, new RedisTask(plugin.getApi()) { @Override - public InetAddress jedisTask(Jedis jedis) { - String result = jedis.hget("player:" + uuid, "ip"); - if (result == null) - throw new NullPointerException("user not found"); - return InetAddresses.forString(result); - } - - @Override - public InetAddress clusterJedisTask(JedisCluster jedisCluster) { - String result = jedisCluster.hget("player:" + uuid, "ip"); + public InetAddress unifiedJedisTask(UnifiedJedis unifiedJedis) { + String result = unifiedJedis.hget("player:" + uuid, "ip"); if (result == null) throw new NullPointerException("user not found"); return InetAddresses.forString(result); @@ -139,15 +119,10 @@ public abstract class AbstractDataManager { try { return lastOnlineCache.get(uuid, new RedisTask(plugin.getApi()) { - @Override - public Long jedisTask(Jedis jedis) { - String result = jedis.hget("player:" + uuid, "online"); - return result == null ? -1 : Long.parseLong(result); - } @Override - public Long clusterJedisTask(JedisCluster jedisCluster) { - String result = jedisCluster.hget("player:" + uuid, "online"); + public Long unifiedJedisTask(UnifiedJedis unifiedJedis) { + String result = unifiedJedis.hget("player:" + uuid, "online"); return result == null ? -1 : Long.parseLong(result); } }); diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/PubSubListener.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/PubSubListener.java index b083f8e..042c26b 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/PubSubListener.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/PubSubListener.java @@ -3,6 +3,7 @@ package com.imaginarycode.minecraft.redisbungee.api; import com.imaginarycode.minecraft.redisbungee.api.tasks.RedisTask; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; +import redis.clients.jedis.UnifiedJedis; import redis.clients.jedis.exceptions.JedisConnectionException; import java.util.Arrays; @@ -24,22 +25,12 @@ public class PubSubListener implements Runnable { public void run() { RedisTask subTask = new RedisTask(plugin) { @Override - public Void jedisTask(Jedis jedis) { + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { jpsh = new JedisPubSubHandler(plugin); addedChannels.add("redisbungee-" + plugin.getConfiguration().getProxyId()); addedChannels.add("redisbungee-allservers"); addedChannels.add("redisbungee-data"); - jedis.subscribe(jpsh, addedChannels.toArray(new String[0])); - return null; - } - - @Override - public Void clusterJedisTask(JedisCluster jedisCluster) { - jpsh = new JedisPubSubHandler(plugin); - addedChannels.add("redisbungee-" + plugin.getConfiguration().getProxyId()); - addedChannels.add("redisbungee-allservers"); - addedChannels.add("redisbungee-data"); - jedisCluster.subscribe(jpsh, addedChannels.toArray(new String[0])); + unifiedJedis.subscribe(jpsh, addedChannels.toArray(new String[0])); return null; } }; diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/RedisBungeePlugin.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/RedisBungeePlugin.java index d669ba3..2f84104 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/RedisBungeePlugin.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/RedisBungeePlugin.java @@ -12,8 +12,6 @@ import com.imaginarycode.minecraft.redisbungee.api.tasks.RedisTask; import com.imaginarycode.minecraft.redisbungee.api.util.RedisUtil; import com.imaginarycode.minecraft.redisbungee.api.util.payload.PayloadUtils; import com.imaginarycode.minecraft.redisbungee.api.util.uuid.UUIDTranslator; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisCluster; import redis.clients.jedis.Protocol; import redis.clients.jedis.UnifiedJedis; import redis.clients.jedis.exceptions.JedisConnectionException; @@ -50,34 +48,17 @@ public interface RedisBungeePlugin

extends EventsPlatform, ConfigLoader { default int getCurrentCount() { return new RedisTask(this) { @Override - public Long jedisTask(Jedis jedis) { + public Long unifiedJedisTask(UnifiedJedis unifiedJedis) { long total = 0; - long redisTime = getRedisTime(jedis.time()); - Map heartBeats = jedis.hgetAll("heartbeats"); + long redisTime = getRedisTime(unifiedJedis); + Map heartBeats = unifiedJedis.hgetAll("heartbeats"); for (Map.Entry stringStringEntry : heartBeats.entrySet()) { String k = stringStringEntry.getKey(); String v = stringStringEntry.getValue(); long heartbeatTime = Long.parseLong(v); if (heartbeatTime + 30 >= redisTime) { - total = total + jedis.scard("proxy:" + k + ":usersOnline"); - } - } - return total; - } - - @Override - public Long clusterJedisTask(JedisCluster jedisCluster) { - long total = 0; - long redisTime = getRedisTime(jedisCluster); - Map heartBeats = jedisCluster.hgetAll("heartbeats"); - for (Map.Entry stringStringEntry : heartBeats.entrySet()) { - String k = stringStringEntry.getKey(); - String v = stringStringEntry.getValue(); - - long heartbeatTime = Long.parseLong(v); - if (heartbeatTime + 30 >= redisTime) { - total = total + jedisCluster.scard("proxy:" + k + ":usersOnline"); + total = total + unifiedJedis.scard("proxy:" + k + ":usersOnline"); } } return total; @@ -92,7 +73,7 @@ public interface RedisBungeePlugin

extends EventsPlatform, ConfigLoader { default Set getPlayers() { return new RedisTask>(this) { @Override - public Set jedisTask(Jedis jedis) { + public Set unifiedJedisTask(UnifiedJedis unifiedJedis) { ImmutableSet.Builder setBuilder = ImmutableSet.builder(); try { List keys = new ArrayList<>(); @@ -100,34 +81,7 @@ public interface RedisBungeePlugin

extends EventsPlatform, ConfigLoader { keys.add("proxy:" + i + ":usersOnline"); } if (!keys.isEmpty()) { - Set users = jedis.sunion(keys.toArray(new String[0])); - if (users != null && !users.isEmpty()) { - for (String user : users) { - try { - setBuilder = setBuilder.add(UUID.fromString(user)); - } catch (IllegalArgumentException ignored) { - } - } - } - } - } catch (JedisConnectionException e) { - // Redis server has disappeared! - logFatal("Unable to get connection from pool - did your Redis server go away?"); - throw new RuntimeException("Unable to get all players online", e); - } - return setBuilder.build(); - } - - @Override - public Set clusterJedisTask(JedisCluster jedisCluster) { - ImmutableSet.Builder setBuilder = ImmutableSet.builder(); - try { - List keys = new ArrayList<>(); - for (String i : getProxiesIds()) { - keys.add("proxy:" + i + ":usersOnline"); - } - if (!keys.isEmpty()) { - Set users = jedisCluster.sunion(keys.toArray(new String[0])); + Set users = unifiedJedis.sunion(keys.toArray(new String[0])); if (users != null && !users.isEmpty()) { for (String user : users) { try { @@ -156,28 +110,12 @@ public interface RedisBungeePlugin

extends EventsPlatform, ConfigLoader { default Multimap serversToPlayers() { return new RedisTask>(this) { @Override - public Multimap jedisTask(Jedis jedis) { + public Multimap unifiedJedisTask(UnifiedJedis unifiedJedis) { ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); for (String serverId : getProxiesIds()) { - Set players = jedis.smembers("proxy:" + serverId + ":usersOnline"); + Set players = unifiedJedis.smembers("proxy:" + serverId + ":usersOnline"); for (String player : players) { - String playerServer = jedis.hget("player:" + player, "server"); - if (playerServer == null) { - continue; - } - builder.put(playerServer, UUID.fromString(player)); - } - } - return builder.build(); - } - - @Override - public Multimap clusterJedisTask(JedisCluster jedisCluster) { - ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); - for (String serverId : getProxiesIds()) { - Set players = jedisCluster.smembers("proxy:" + serverId + ":usersOnline"); - for (String player : players) { - String playerServer = jedisCluster.hget("player:" + player, "server"); + String playerServer = unifiedJedis.hget("player:" + player, "server"); if (playerServer == null) { continue; } @@ -193,18 +131,8 @@ public interface RedisBungeePlugin

extends EventsPlatform, ConfigLoader { checkArgument(getProxiesIds().contains(proxyId), proxyId + " is not a valid proxy ID"); return new RedisTask>(this) { @Override - public Set jedisTask(Jedis jedis) { - Set users = jedis.smembers("proxy:" + proxyId + ":usersOnline"); - ImmutableSet.Builder builder = ImmutableSet.builder(); - for (String user : users) { - builder.add(UUID.fromString(user)); - } - return builder.build(); - } - - @Override - public Set clusterJedisTask(JedisCluster jedisCluster) { - Set users = jedisCluster.smembers("proxy:" + proxyId + ":usersOnline"); + public Set unifiedJedisTask(UnifiedJedis unifiedJedis) { + Set users = unifiedJedis.smembers("proxy:" + proxyId + ":usersOnline"); ImmutableSet.Builder builder = ImmutableSet.builder(); for (String user : users) { builder.add(UUID.fromString(user)); @@ -224,11 +152,11 @@ public interface RedisBungeePlugin

extends EventsPlatform, ConfigLoader { default List getCurrentProxiesIds(boolean lagged) { return new RedisTask>(this) { @Override - public List jedisTask(Jedis jedis) { + public List unifiedJedisTask(UnifiedJedis unifiedJedis) { try { - long time = getRedisTime(jedis.time()); + long time = getRedisTime(unifiedJedis); ImmutableList.Builder servers = ImmutableList.builder(); - Map heartbeats = jedis.hgetAll("heartbeats"); + Map heartbeats = unifiedJedis.hgetAll("heartbeats"); for (Map.Entry entry : heartbeats.entrySet()) { try { long stamp = Long.parseLong(entry.getValue()); @@ -236,33 +164,7 @@ public interface RedisBungeePlugin

extends EventsPlatform, ConfigLoader { servers.add(entry.getKey()); } else if (time > stamp + RedisUtil.PROXY_TIMEOUT) { logWarn(entry.getKey() + " is " + (time - stamp) + " seconds behind! (Time not synchronized or server down?) and was removed from heartbeat."); - jedis.hdel("heartbeats", entry.getKey()); - } - } catch (NumberFormatException ignored) { - } - } - return servers.build(); - } catch (JedisConnectionException e) { - logFatal("Unable to fetch server IDs"); - e.printStackTrace(); - return Collections.singletonList(getConfiguration().getProxyId()); - } - } - - @Override - public List clusterJedisTask(JedisCluster jedisCluster) { - try { - long time = getRedisTime(jedisCluster); - ImmutableList.Builder servers = ImmutableList.builder(); - Map heartbeats = jedisCluster.hgetAll("heartbeats"); - for (Map.Entry entry : heartbeats.entrySet()) { - try { - long stamp = Long.parseLong(entry.getValue()); - if (lagged ? time >= stamp + RedisUtil.PROXY_TIMEOUT : time <= stamp + RedisUtil.PROXY_TIMEOUT) { - servers.add(entry.getKey()); - } else if (time > stamp + RedisUtil.PROXY_TIMEOUT) { - logWarn(entry.getKey() + " is " + (time - stamp) + " seconds behind! (Time not synchronized or server down?) and was removed from heartbeat."); - jedisCluster.hdel("heartbeats", entry.getKey()); + unifiedJedis.hdel("heartbeats", entry.getKey()); } } catch (NumberFormatException ignored) { } @@ -282,21 +184,9 @@ public interface RedisBungeePlugin

extends EventsPlatform, ConfigLoader { default void sendChannelMessage(String channel, String message) { new RedisTask(this) { @Override - public Void jedisTask(Jedis jedis) { + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { try { - jedis.publish(channel, message); - } catch (JedisConnectionException e) { - // Redis server has disappeared! - logFatal("Unable to get connection from pool - did your Redis server go away?"); - throw new RuntimeException("Unable to publish channel message", e); - } - return null; - } - - @Override - public Void clusterJedisTask(JedisCluster jedisCluster) { - try { - jedisCluster.publish(channel, message); + unifiedJedis.publish(channel, message); } catch (JedisConnectionException e) { // Redis server has disappeared! logFatal("Unable to get connection from pool - did your Redis server go away?"); @@ -354,14 +244,8 @@ public interface RedisBungeePlugin

extends EventsPlatform, ConfigLoader { if (!getDataManager().handleKick(playerUniqueId, message)) { new RedisTask(this) { @Override - public Void jedisTask(Jedis jedis) { - PayloadUtils.kickPlayerPayload(playerUniqueId, message, jedis); - return null; - } - - @Override - public Void clusterJedisTask(JedisCluster jedisCluster) { - PayloadUtils.kickPlayerPayload(playerUniqueId, message, jedisCluster); + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { + PayloadUtils.kickPlayerPayload(playerUniqueId, message, unifiedJedis); return null; } }.execute(); diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/config/ConfigLoader.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/config/ConfigLoader.java index 5f961d3..6b47170 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/config/ConfigLoader.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/config/ConfigLoader.java @@ -5,7 +5,7 @@ import com.google.common.reflect.TypeToken; import com.imaginarycode.minecraft.redisbungee.api.RedisBungeeMode; import com.imaginarycode.minecraft.redisbungee.api.RedisBungeePlugin; import com.imaginarycode.minecraft.redisbungee.api.summoners.JedisClusterSummoner; -import com.imaginarycode.minecraft.redisbungee.api.summoners.JedisSummoner; +import com.imaginarycode.minecraft.redisbungee.api.summoners.JedisPooledSummoner; import com.imaginarycode.minecraft.redisbungee.api.summoners.Summoner; import ninja.leaping.configurate.ConfigurationNode; import ninja.leaping.configurate.objectmapping.ObjectMappingException; @@ -102,9 +102,15 @@ public interface ConfigLoader { if (redisServer != null && redisServer.isEmpty()) { throw new RuntimeException("No redis server specified"); } - JedisPoolConfig config = new JedisPoolConfig(); - config.setMaxTotal(maxConnections); - summoner = new JedisSummoner(new JedisPool(config, redisServer, redisPort, 0, redisPassword, useSSL)); + JedisPool jedisPool = null; + if (node.getNode("enable-jedis-pool-compatibility").getBoolean(true)) { + JedisPoolConfig config = new JedisPoolConfig(); + config.setMaxTotal(maxConnections); + jedisPool = new JedisPool(config, redisServer, redisPort, 0, redisPassword, useSSL); + } + GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig<>(); + poolConfig.setMaxTotal(maxConnections); + summoner = new JedisPooledSummoner(new JedisPooled(poolConfig, redisServer, redisPort, 0, redisPassword, useSSL), jedisPool); redisBungeeMode = RedisBungeeMode.SINGLE; } plugin.logInfo("Successfully connected to Redis."); diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/summoners/JedisClusterSummoner.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/summoners/JedisClusterSummoner.java index 2f26152..fb5ac1f 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/summoners/JedisClusterSummoner.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/summoners/JedisClusterSummoner.java @@ -6,7 +6,6 @@ import java.io.IOException; public class JedisClusterSummoner implements Summoner { public final JedisCluster jedisCluster; - private boolean closed = false; public JedisClusterSummoner(JedisCluster jedisCluster) { this.jedisCluster = jedisCluster; @@ -15,19 +14,14 @@ public class JedisClusterSummoner implements Summoner { jedisCluster.del("random_data"); } - @Override - public JedisCluster obtainResource() { - return jedisCluster; - } - - @Override - public boolean isAvailable() { - return !closed; - } @Override public void close() throws IOException { - this.closed = true; jedisCluster.close(); } + + @Override + public JedisCluster obtainResource() { + return this.jedisCluster; + } } diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/summoners/JedisSummoner.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/summoners/JedisPooledSummoner.java similarity index 57% rename from RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/summoners/JedisSummoner.java rename to RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/summoners/JedisPooledSummoner.java index 8cd7318..ec270b2 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/summoners/JedisSummoner.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/summoners/JedisPooledSummoner.java @@ -2,14 +2,17 @@ package com.imaginarycode.minecraft.redisbungee.api.summoners; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; +import redis.clients.jedis.JedisPooled; import java.io.IOException; -public class JedisSummoner implements Summoner { +public class JedisPooledSummoner implements Summoner { + private final JedisPooled jedisPooled; private final JedisPool jedisPool; - public JedisSummoner(JedisPool jedisPool) { + public JedisPooledSummoner(JedisPooled jedisPooled, JedisPool jedisPool) { + this.jedisPooled = jedisPooled; this.jedisPool = jedisPool; try (Jedis jedis = this.jedisPool.getResource()) { // Test the connection to make sure configuration is right @@ -18,22 +21,18 @@ public class JedisSummoner implements Summoner { } @Override - public Jedis obtainResource() { - return jedisPool.getResource(); + public JedisPooled obtainResource() { + return this.jedisPooled; } - public JedisPool getJedisPool() { + public JedisPool getCompatibilityJedisPool() { return this.jedisPool; } - @Override - public boolean isAvailable() { - return !jedisPool.isClosed(); - } - @Override public void close() throws IOException { this.jedisPool.close(); + this.jedisPooled.close(); } } diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/summoners/Summoner.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/summoners/Summoner.java index 45e6fad..169144c 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/summoners/Summoner.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/summoners/Summoner.java @@ -14,7 +14,5 @@ public interface Summoner

extends Closeable { P obtainResource(); - boolean isAvailable(); - } diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/HeartbeatTask.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/HeartbeatTask.java index 01376d2..7d62faa 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/HeartbeatTask.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/HeartbeatTask.java @@ -3,6 +3,7 @@ package com.imaginarycode.minecraft.redisbungee.api.tasks; import com.imaginarycode.minecraft.redisbungee.api.RedisBungeePlugin; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; +import redis.clients.jedis.UnifiedJedis; import redis.clients.jedis.exceptions.JedisConnectionException; import java.util.concurrent.TimeUnit; @@ -19,32 +20,12 @@ public class HeartbeatTask extends RedisTask{ this.globalPlayerCount = globalPlayerCount; } - @Override - public Void jedisTask(Jedis jedis) { - try { - long redisTime = plugin.getRedisTime(jedis.time()); - jedis.hset("heartbeats", plugin.getConfiguration().getProxyId(), String.valueOf(redisTime)); - } catch (JedisConnectionException e) { - // Redis server has disappeared! - plugin.logFatal("Unable to update heartbeat - did your Redis server go away?"); - e.printStackTrace(); - return null; - } - try { - plugin.updateProxiesIds(); - globalPlayerCount.set(plugin.getCurrentCount()); - } catch (Throwable e) { - plugin.logFatal("Unable to update data - did your Redis server go away?"); - e.printStackTrace(); - } - return null; - } @Override - public Void clusterJedisTask(JedisCluster jedisCluster) { + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { try { - long redisTime = plugin.getRedisTime(jedisCluster); - jedisCluster.hset("heartbeats", plugin.getConfiguration().getProxyId(), String.valueOf(redisTime)); + long redisTime = plugin.getRedisTime(unifiedJedis); + unifiedJedis.hset("heartbeats", plugin.getConfiguration().getProxyId(), String.valueOf(redisTime)); } catch (JedisConnectionException e) { // Redis server has disappeared! plugin.logFatal("Unable to update heartbeat - did your Redis server go away?"); diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/InitialUtils.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/InitialUtils.java index 3b89c30..5fbcfe1 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/InitialUtils.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/InitialUtils.java @@ -5,6 +5,7 @@ import com.imaginarycode.minecraft.redisbungee.api.util.RedisUtil; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.Protocol; +import redis.clients.jedis.UnifiedJedis; import java.io.IOException; import java.nio.file.Files; @@ -15,9 +16,10 @@ public class InitialUtils { public static void checkRedisVersion(RedisBungeePlugin plugin) { new RedisTask(plugin) { @Override - public Void jedisTask(Jedis jedis) { + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { // This is more portable than INFO

- String info = jedis.info(); + + String info = new String((byte[]) unifiedJedis.sendCommand(Protocol.Command.INFO)); for (String s : info.split("\r\n")) { if (s.startsWith("redis_version:")) { String version = s.split(":")[1]; @@ -26,30 +28,7 @@ public class InitialUtils { plugin.logFatal("Your version of Redis (" + version + ") is not at least version 3.0 RedisBungee requires a newer version of Redis."); throw new RuntimeException("Unsupported Redis version detected"); } - long uuidCacheSize = jedis.hlen("uuid-cache"); - if (uuidCacheSize > 750000) { - plugin.logInfo("Looks like you have a really big UUID cache! Run https://www.spigotmc.org/resources/redisbungeecleaner.8505/ as soon as possible."); - } - break; - } - } - return null; - } - - @Override - public Void clusterJedisTask(JedisCluster jedisCluster) { - // This is more portable than INFO
- - String info = new String((byte[]) jedisCluster.sendCommand(Protocol.Command.INFO)); - for (String s : info.split("\r\n")) { - if (s.startsWith("redis_version:")) { - String version = s.split(":")[1]; - plugin.logInfo(version + " <- redis version"); - if (!RedisUtil.isRedisVersionRight(version)) { - plugin.logFatal("Your version of Redis (" + version + ") is not at least version 3.0 RedisBungee requires a newer version of Redis."); - throw new RuntimeException("Unsupported Redis version detected"); - } - long uuidCacheSize = jedisCluster.hlen("uuid-cache"); + long uuidCacheSize = unifiedJedis.hlen("uuid-cache"); if (uuidCacheSize > 750000) { plugin.logInfo("Looks like you have a really big UUID cache! Run https://www.spigotmc.org/resources/redisbungeecleaner.8505/ as soon as possible."); } @@ -65,7 +44,7 @@ public class InitialUtils { public static void checkIfRecovering(RedisBungeePlugin plugin, Path dataFolder) { new RedisTask(plugin) { @Override - public Void jedisTask(Jedis jedis) { + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { Path crashFile = dataFolder.resolve("restarted_from_crash.txt"); if (Files.exists(crashFile)) { try { @@ -74,34 +53,10 @@ public class InitialUtils { throw new RuntimeException(e); } plugin.logInfo("crash file was deleted"); - } else if (jedis.hexists("heartbeats", plugin.getConfiguration().getProxyId())) { + } else if (unifiedJedis.hexists("heartbeats", plugin.getConfiguration().getProxyId())) { try { - long value = Long.parseLong(jedis.hget("heartbeats", plugin.getConfiguration().getProxyId())); - long redisTime = plugin.getRedisTime(jedis.time()); - if (redisTime < value + RedisUtil.PROXY_TIMEOUT) { - logImposter(plugin); - throw new RuntimeException("Possible impostor instance!"); - } - } catch (NumberFormatException ignored) { - } - } - return null; - } - - @Override - public Void clusterJedisTask(JedisCluster jedisCluster) { - Path crashFile = dataFolder.resolve("restarted_from_crash.txt"); - if (Files.exists(crashFile)) { - try { - Files.delete(crashFile); - } catch (IOException e) { - throw new RuntimeException(e); - } - plugin.logInfo("crash file was deleted"); - } else if (jedisCluster.hexists("heartbeats", plugin.getConfiguration().getProxyId())) { - try { - long value = Long.parseLong(jedisCluster.hget("heartbeats", plugin.getConfiguration().getProxyId())); - long redisTime = plugin.getRedisTime(jedisCluster); + long value = Long.parseLong(unifiedJedis.hget("heartbeats", plugin.getConfiguration().getProxyId())); + long redisTime = plugin.getRedisTime(unifiedJedis); if (redisTime < value + RedisUtil.PROXY_TIMEOUT) { logImposter(plugin); diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/IntegrityCheckTask.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/IntegrityCheckTask.java index c872187..0329298 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/IntegrityCheckTask.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/IntegrityCheckTask.java @@ -2,9 +2,7 @@ package com.imaginarycode.minecraft.redisbungee.api.tasks; import com.imaginarycode.minecraft.redisbungee.api.util.player.PlayerUtils; import com.imaginarycode.minecraft.redisbungee.api.RedisBungeePlugin; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisCluster; -import redis.clients.jedis.Pipeline; +import redis.clients.jedis.UnifiedJedis; import java.util.HashSet; import java.util.List; @@ -22,20 +20,20 @@ public abstract class IntegrityCheckTask extends RedisTask { } @Override - public Void jedisTask(Jedis jedis) { + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { try { Set players = plugin.getLocalPlayersAsUuidStrings(); - Set playersInRedis = jedis.smembers("proxy:" + plugin.getConfiguration().getProxyId() + ":usersOnline"); + Set playersInRedis = unifiedJedis.smembers("proxy:" + plugin.getConfiguration().getProxyId() + ":usersOnline"); List lagged = plugin.getCurrentProxiesIds(true); // Clean up lagged players. for (String s : lagged) { - Set laggedPlayers = jedis.smembers("proxy:" + s + ":usersOnline"); - jedis.del("proxy:" + s + ":usersOnline"); + Set laggedPlayers = unifiedJedis.smembers("proxy:" + s + ":usersOnline"); + unifiedJedis.del("proxy:" + s + ":usersOnline"); if (!laggedPlayers.isEmpty()) { plugin.logInfo("Cleaning up lagged proxy " + s + " (" + laggedPlayers.size() + " players)..."); for (String laggedPlayer : laggedPlayers) { - PlayerUtils.cleanUpPlayer(laggedPlayer, jedis, true); + PlayerUtils.cleanUpPlayer(laggedPlayer, unifiedJedis, true); } } } @@ -49,85 +47,26 @@ public abstract class IntegrityCheckTask extends RedisTask { boolean found = false; for (String proxyId : plugin.getProxiesIds()) { if (proxyId.equals(plugin.getConfiguration().getProxyId())) continue; - if (jedis.sismember("proxy:" + proxyId + ":usersOnline", member)) { + if (unifiedJedis.sismember("proxy:" + proxyId + ":usersOnline", member)) { // Just clean up the set. found = true; break; } } if (!found) { - PlayerUtils.cleanUpPlayer(member, jedis, false); - plugin.logWarn("Player found in set that was not found locally and globally: " + member); - } else { - jedis.srem("proxy:" + plugin.getConfiguration().getProxyId() + ":usersOnline", member); - plugin.logWarn("Player found in set that was not found locally, but is on another proxy: " + member); - } - } - - Pipeline pipeline = jedis.pipelined(); - - for (String player : absentInRedis) { - // Player not online according to Redis but not BungeeCord. - plugin.logWarn("Player " + player + " is on the proxy but not in Redis."); - handlePlatformPlayer(player, pipeline); - } - - pipeline.sync(); - } catch (Throwable e) { - plugin.logFatal("Unable to fix up stored player data"); - e.printStackTrace(); - } - return null; - } - - @Override - public Void clusterJedisTask(JedisCluster jedisCluster) { - try { - Set players = plugin.getLocalPlayersAsUuidStrings(); - Set playersInRedis = jedisCluster.smembers("proxy:" + plugin.getConfiguration().getProxyId() + ":usersOnline"); - List lagged = plugin.getCurrentProxiesIds(true); - - // Clean up lagged players. - for (String s : lagged) { - Set laggedPlayers = jedisCluster.smembers("proxy:" + s + ":usersOnline"); - jedisCluster.del("proxy:" + s + ":usersOnline"); - if (!laggedPlayers.isEmpty()) { - plugin.logInfo("Cleaning up lagged proxy " + s + " (" + laggedPlayers.size() + " players)..."); - for (String laggedPlayer : laggedPlayers) { - PlayerUtils.cleanUpPlayer(laggedPlayer, jedisCluster, true); - } - } - } - - 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 : plugin.getProxiesIds()) { - if (proxyId.equals(plugin.getConfiguration().getProxyId())) continue; - if (jedisCluster.sismember("proxy:" + proxyId + ":usersOnline", member)) { - // Just clean up the set. - found = true; - break; - } - } - if (!found) { - PlayerUtils.cleanUpPlayer(member, jedisCluster, false); + PlayerUtils.cleanUpPlayer(member, unifiedJedis, false); plugin.logWarn("Player found in set that was not found locally and globally: " + member); } else { - jedisCluster.srem("proxy:" + plugin.getConfiguration().getProxyId() + ":usersOnline", member); + unifiedJedis.srem("proxy:" + plugin.getConfiguration().getProxyId() + ":usersOnline", member); plugin.logWarn("Player found in set that was not found locally, but is on another proxy: " + member); } } - // due JedisCluster does not support pipelined. + // due unifiedJedis does not support pipelined. //Pipeline pipeline = jedis.pipelined(); for (String player : absentInRedis) { // Player not online according to Redis but not BungeeCord. - handlePlatformPlayer(player, jedisCluster); + handlePlatformPlayer(player, unifiedJedis); } } catch (Throwable e) { plugin.logFatal("Unable to fix up stored player data"); @@ -137,7 +76,6 @@ public abstract class IntegrityCheckTask extends RedisTask { } - public abstract void handlePlatformPlayer(String player, JedisCluster jedisCluster); + public abstract void handlePlatformPlayer(String player, UnifiedJedis unifiedJedis); - public abstract void handlePlatformPlayer(String player, Pipeline pipeline); } diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/RedisTask.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/RedisTask.java index 27555c2..8d2757b 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/RedisTask.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/RedisTask.java @@ -3,11 +3,11 @@ package com.imaginarycode.minecraft.redisbungee.api.tasks; import com.imaginarycode.minecraft.redisbungee.RedisBungeeAPI; import com.imaginarycode.minecraft.redisbungee.api.RedisBungeePlugin; import com.imaginarycode.minecraft.redisbungee.api.summoners.JedisClusterSummoner; -import com.imaginarycode.minecraft.redisbungee.api.summoners.JedisSummoner; +import com.imaginarycode.minecraft.redisbungee.api.summoners.JedisPooledSummoner; import com.imaginarycode.minecraft.redisbungee.api.summoners.Summoner; import com.imaginarycode.minecraft.redisbungee.api.RedisBungeeMode; import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisCluster; +import redis.clients.jedis.UnifiedJedis; import java.util.concurrent.Callable; @@ -15,7 +15,6 @@ public abstract class RedisTask implements Runnable, Callable { protected final Summoner summoner; protected final RedisBungeeAPI api; - protected Jedis jedis; protected RedisBungeePlugin plugin; @Override @@ -34,25 +33,7 @@ public abstract class RedisTask implements Runnable, Callable { this.summoner = api.getSummoner(); } - // way to reuse jedis inside another RedisTask object - public RedisTask(RedisBungeeAPI api, Jedis jedis) { - this.api = api; - this.summoner = api.getSummoner(); - this.jedis = jedis; - } - - // way to reuse jedis inside another RedisTask object - public RedisTask(RedisBungeePlugin plugin, Jedis jedis) { - this.plugin = plugin; - this.api = plugin.getApi(); - this.summoner = api.getSummoner(); - this.jedis = jedis; - } - - - public abstract V jedisTask(Jedis jedis); - - public abstract V clusterJedisTask(JedisCluster jedisCluster); + public abstract V unifiedJedisTask(UnifiedJedis unifiedJedis); @Override public void run() { @@ -60,19 +41,13 @@ public abstract class RedisTask implements Runnable, Callable { } public V execute(){ + // JedisCluster, JedisPooled in fact is just UnifiedJedis does not need new instance since its single instance anyway. if (api.getMode() == RedisBungeeMode.SINGLE) { - if (this.jedis != null){ - return this.jedisTask(this.jedis); - } - JedisSummoner jedisSummoner = (JedisSummoner) summoner; - try (Jedis newJedis = jedisSummoner.obtainResource()) { - return this.jedisTask(newJedis); - } - + JedisPooledSummoner jedisSummoner = (JedisPooledSummoner) summoner; + return this.unifiedJedisTask(jedisSummoner.obtainResource()); } else if (api.getMode() == RedisBungeeMode.CLUSTER) { - // Jedis cluster does not need new instance since its single instance anyways. JedisClusterSummoner jedisClusterSummoner = (JedisClusterSummoner) summoner; - return this.clusterJedisTask(jedisClusterSummoner.obtainResource()); + return this.unifiedJedisTask(jedisClusterSummoner.obtainResource()); } return null; } diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/ShutdownUtils.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/ShutdownUtils.java index bd38977..7a62d30 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/ShutdownUtils.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/tasks/ShutdownUtils.java @@ -4,6 +4,7 @@ import com.imaginarycode.minecraft.redisbungee.api.util.player.PlayerUtils; import com.imaginarycode.minecraft.redisbungee.api.RedisBungeePlugin; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; +import redis.clients.jedis.UnifiedJedis; import java.util.Set; @@ -12,23 +13,12 @@ public class ShutdownUtils { public static void shutdownCleanup(RedisBungeePlugin plugin) { new RedisTask(plugin) { @Override - public Void jedisTask(Jedis jedis) { - jedis.hdel("heartbeats", plugin.getConfiguration().getProxyId()); - if (jedis.scard("proxy:" + plugin.getConfiguration().getProxyId() + ":usersOnline") > 0) { - Set players = jedis.smembers("proxy:" + plugin.getConfiguration().getProxyId() + ":usersOnline"); + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { + unifiedJedis.hdel("heartbeats", plugin.getConfiguration().getProxyId()); + if (unifiedJedis.scard("proxy:" + plugin.getConfiguration().getProxyId() + ":usersOnline") > 0) { + Set players = unifiedJedis.smembers("proxy:" + plugin.getConfiguration().getProxyId() + ":usersOnline"); for (String member : players) - PlayerUtils.cleanUpPlayer(member, jedis, true); - } - return null; - } - - @Override - public Void clusterJedisTask(JedisCluster jedisCluster) { - jedisCluster.hdel("heartbeats", plugin.getConfiguration().getProxyId()); - if (jedisCluster.scard("proxy:" + plugin.getConfiguration().getProxyId() + ":usersOnline") > 0) { - Set players = jedisCluster.smembers("proxy:" + plugin.getConfiguration().getProxyId() + ":usersOnline"); - for (String member : players) - PlayerUtils.cleanUpPlayer(member, jedisCluster, true); + PlayerUtils.cleanUpPlayer(member, unifiedJedis, true); } return null; } diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/payload/PayloadUtils.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/payload/PayloadUtils.java index 9842c34..c08be00 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/payload/PayloadUtils.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/payload/PayloadUtils.java @@ -6,6 +6,7 @@ import com.imaginarycode.minecraft.redisbungee.api.AbstractDataManager; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.Pipeline; +import redis.clients.jedis.UnifiedJedis; import java.net.InetAddress; import java.util.UUID; @@ -13,76 +14,30 @@ import java.util.UUID; public class PayloadUtils { private static final Gson gson = new Gson(); - public static void playerJoinPayload(UUID uuid, Pipeline pipeline, InetAddress inetAddress) { - pipeline.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( - uuid, RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.JOIN, - new AbstractDataManager.LoginPayload(inetAddress)))); - } - public static void playerJoinPayload(UUID uuid, JedisCluster jedisCluster, InetAddress inetAddress) { - jedisCluster.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( - uuid, RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.JOIN, - new AbstractDataManager.LoginPayload(inetAddress)))); - } - public static void playerJoinPayload(UUID uuid, Jedis jedis, InetAddress inetAddress) { - jedis.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( + public static void playerJoinPayload(UUID uuid, UnifiedJedis unifiedJedis, InetAddress inetAddress) { + unifiedJedis.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( uuid, RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.JOIN, new AbstractDataManager.LoginPayload(inetAddress)))); } - - public static void playerQuitPayload(String uuid, Jedis jedis, long timestamp) { - jedis.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( + public static void playerQuitPayload(String uuid, UnifiedJedis unifiedJedis, long timestamp) { + unifiedJedis.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( UUID.fromString(uuid), RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.LEAVE, new AbstractDataManager.LogoutPayload(timestamp)))); } - public static void playerQuitPayload(String uuid, JedisCluster jedisCluster, long timestamp) { - jedisCluster.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( - UUID.fromString(uuid), RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.LEAVE, - new AbstractDataManager.LogoutPayload(timestamp)))); - } - public static void playerQuitPayload(String uuid, Pipeline pipeline, long timestamp) { - pipeline.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( - UUID.fromString(uuid), RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.LEAVE, - new AbstractDataManager.LogoutPayload(timestamp)))); - } - - - public static void playerServerChangePayload(UUID uuid, Jedis jedis, String newServer, String oldServer) { - jedis.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( - uuid, RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.SERVER_CHANGE, - new AbstractDataManager.ServerChangePayload(newServer, oldServer)))); - } - - public static void playerServerChangePayload(UUID uuid, Pipeline pipeline, String newServer, String oldServer) { - pipeline.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( - uuid, RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.SERVER_CHANGE, - new AbstractDataManager.ServerChangePayload(newServer, oldServer)))); - } - public static void playerServerChangePayload(UUID uuid, JedisCluster jedisCluster, String newServer, String oldServer) { - jedisCluster.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( + public static void playerServerChangePayload(UUID uuid, UnifiedJedis unifiedJedis, String newServer, String oldServer) { + unifiedJedis.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( uuid, RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.SERVER_CHANGE, new AbstractDataManager.ServerChangePayload(newServer, oldServer)))); } - public static void kickPlayerPayload(UUID uuid, String message, Pipeline pipeline) { - pipeline.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( - uuid, RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.KICK, - new AbstractDataManager.KickPayload(message)))); - } - - public static void kickPlayerPayload(UUID uuid, String message, Jedis jedis) { - jedis.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( - uuid, RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.KICK, - new AbstractDataManager.KickPayload(message)))); - } - - public static void kickPlayerPayload(UUID uuid, String message, JedisCluster jedisCluster) { - jedisCluster.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( + public static void kickPlayerPayload(UUID uuid, String message, UnifiedJedis unifiedJedis) { + unifiedJedis.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>( uuid, RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.KICK, new AbstractDataManager.KickPayload(message)))); } diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/player/PlayerUtils.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/player/PlayerUtils.java index 565ce15..e705acb 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/player/PlayerUtils.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/player/PlayerUtils.java @@ -1,37 +1,14 @@ package com.imaginarycode.minecraft.redisbungee.api.util.player; import com.imaginarycode.minecraft.redisbungee.RedisBungeeAPI; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisCluster; -import redis.clients.jedis.Pipeline; +import redis.clients.jedis.UnifiedJedis; import static com.imaginarycode.minecraft.redisbungee.api.util.payload.PayloadUtils.playerQuitPayload; public class PlayerUtils { - public static void cleanUpPlayer(String uuid, Jedis rsc, boolean firePayload) { - rsc.srem("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", uuid); - rsc.hdel("player:" + uuid, "server", "ip", "proxy"); - long timestamp = System.currentTimeMillis(); - rsc.hset("player:" + uuid, "online", String.valueOf(timestamp)); - if (firePayload) { - playerQuitPayload(uuid, rsc, timestamp); - } - } - - public static void cleanUpPlayer(String uuid, Pipeline rsc, boolean firePayload) { - rsc.srem("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", uuid); - rsc.hdel("player:" + uuid, "server", "ip", "proxy"); - long timestamp = System.currentTimeMillis(); - rsc.hset("player:" + uuid, "online", String.valueOf(timestamp)); - if (firePayload) { - playerQuitPayload(uuid, rsc, timestamp); - } - - } - - public static void cleanUpPlayer(String uuid, JedisCluster rsc, boolean firePayload) { + public static void cleanUpPlayer(String uuid, UnifiedJedis rsc, boolean firePayload) { rsc.srem("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", uuid); rsc.hdel("player:" + uuid, "server", "ip", "proxy"); long timestamp = System.currentTimeMillis(); diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/uuid/UUIDTranslator.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/uuid/UUIDTranslator.java index a1ad3f7..53a03ed 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/uuid/UUIDTranslator.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/uuid/UUIDTranslator.java @@ -11,6 +11,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.Pipeline; +import redis.clients.jedis.UnifiedJedis; import redis.clients.jedis.exceptions.JedisException; import java.util.*; @@ -74,17 +75,17 @@ public final class UUIDTranslator { } RedisTask redisTask = new RedisTask(plugin.getApi()) { @Override - public UUID jedisTask(Jedis jedis) { - String stored = jedis.hget("uuid-cache", player.toLowerCase()); + public UUID unifiedJedisTask(UnifiedJedis unifiedJedis) { + String stored = unifiedJedis.hget("uuid-cache", player.toLowerCase()); if (stored != null) { // Found an entry value. Deserialize it. CachedUUIDEntry entry = gson.fromJson(stored, CachedUUIDEntry.class); // Check for expiry: if (entry.expired()) { - jedis.hdel("uuid-cache", player.toLowerCase()); + unifiedJedis.hdel("uuid-cache", player.toLowerCase()); // Doesn't hurt to also remove the UUID entry as well. - jedis.hdel("uuid-cache", entry.getUuid().toString()); + unifiedJedis.hdel("uuid-cache", entry.getUuid().toString()); } else { nameToUuidMap.put(player.toLowerCase(), entry); uuidToNameMap.put(entry.getUuid(), entry); @@ -105,46 +106,7 @@ public final class UUIDTranslator { } for (Map.Entry entry : uuidMap1.entrySet()) { if (entry.getKey().equalsIgnoreCase(player)) { - persistInfo(entry.getKey(), entry.getValue(), jedis); - return entry.getValue(); - } - } - return null; - } - - @Override - public UUID clusterJedisTask(JedisCluster jedisCluster) { - String stored = jedisCluster.hget("uuid-cache", player.toLowerCase()); - if (stored != null) { - // Found an entry value. Deserialize it. - CachedUUIDEntry entry = gson.fromJson(stored, CachedUUIDEntry.class); - - // Check for expiry: - if (entry.expired()) { - jedisCluster.hdel("uuid-cache", player.toLowerCase()); - // Doesn't hurt to also remove the UUID entry as well. - jedisCluster.hdel("uuid-cache", entry.getUuid().toString()); - } else { - nameToUuidMap.put(player.toLowerCase(), entry); - uuidToNameMap.put(entry.getUuid(), entry); - return entry.getUuid(); - } - } - - // That didn't work. Let's ask Mojang. - if (!expensiveLookups || !plugin.isOnlineMode()) - return null; - - Map uuidMap1; - try { - uuidMap1 = new UUIDFetcher(Collections.singletonList(player)).call(); - } catch (Exception e) { - plugin.logFatal("Unable to fetch UUID from Mojang for " + player); - return null; - } - for (Map.Entry entry : uuidMap1.entrySet()) { - if (entry.getKey().equalsIgnoreCase(player)) { - persistInfo(entry.getKey(), entry.getValue(), jedisCluster); + persistInfo(entry.getKey(), entry.getValue(), unifiedJedis); return entry.getValue(); } } @@ -178,57 +140,18 @@ public final class UUIDTranslator { RedisTask redisTask = new RedisTask(plugin.getApi()) { @Override - public String jedisTask(Jedis jedis) { - String stored = jedis.hget("uuid-cache", player.toString()); + public String unifiedJedisTask(UnifiedJedis unifiedJedis) { + String stored = unifiedJedis.hget("uuid-cache", player.toString()); if (stored != null) { // Found an entry value. Deserialize it. CachedUUIDEntry entry = gson.fromJson(stored, CachedUUIDEntry.class); // Check for expiry: if (entry.expired()) { - jedis.hdel("uuid-cache", player.toString()); + unifiedJedis.hdel("uuid-cache", player.toString()); // Doesn't hurt to also remove the named entry as well. // TODO: Since UUIDs are fixed, we could look up the name and see if the UUID matches. - jedis.hdel("uuid-cache", entry.getName()); - } else { - nameToUuidMap.put(entry.getName().toLowerCase(), entry); - uuidToNameMap.put(player, entry); - return entry.getName(); - } - } - - if (!expensiveLookups || !plugin.isOnlineMode()) - return null; - - // That didn't work. Let's ask Mojang. This call may fail, because Mojang is insane. - String name; - try { - List nameHist = NameFetcher.nameHistoryFromUuid(player); - name = Iterables.getLast(nameHist, null); - } catch (Exception e) { - plugin.logFatal("Unable to fetch name from Mojang for " + player); - return null; - } - if (name != null) { - persistInfo(name, player, jedis); - return name; - } - return null; - } - - @Override - public String clusterJedisTask(JedisCluster jedisCluster) { - String stored = jedisCluster.hget("uuid-cache", player.toString()); - if (stored != null) { - // Found an entry value. Deserialize it. - CachedUUIDEntry entry = gson.fromJson(stored, CachedUUIDEntry.class); - - // Check for expiry: - if (entry.expired()) { - jedisCluster.hdel("uuid-cache", player.toString()); - // Doesn't hurt to also remove the named entry as well. - // TODO: Since UUIDs are fixed, we could look up the name and see if the UUID matches. - jedisCluster.hdel("uuid-cache", entry.getName()); + unifiedJedis.hdel("uuid-cache", entry.getName()); } else { nameToUuidMap.put(entry.getName().toLowerCase(), entry); uuidToNameMap.put(player, entry); @@ -250,7 +173,7 @@ public final class UUIDTranslator { } if (name != null) { - persistInfo(name, player, jedisCluster); + persistInfo(name, player, unifiedJedis); return name; } @@ -268,22 +191,10 @@ public final class UUIDTranslator { } } - public void persistInfo(String name, UUID uuid, Jedis jedis) { + public void persistInfo(String name, UUID uuid, UnifiedJedis unifiedJedis) { addToMaps(name, uuid); String json = gson.toJson(uuidToNameMap.get(uuid)); - jedis.hmset("uuid-cache", ImmutableMap.of(name.toLowerCase(), json, uuid.toString(), json)); - } - - public void persistInfo(String name, UUID uuid, Pipeline pipeline) { - addToMaps(name, uuid); - String json = gson.toJson(uuidToNameMap.get(uuid)); - pipeline.hmset("uuid-cache", ImmutableMap.of(name.toLowerCase(), json, uuid.toString(), json)); - } - - public void persistInfo(String name, UUID uuid, JedisCluster jedisCluster) { - addToMaps(name, uuid); - String json = gson.toJson(uuidToNameMap.get(uuid)); - jedisCluster.hmset("uuid-cache", ImmutableMap.of(name.toLowerCase(), json, uuid.toString(), json)); + unifiedJedis.hmset("uuid-cache", ImmutableMap.of(name.toLowerCase(), json, uuid.toString(), json)); } private static class CachedUUIDEntry { diff --git a/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/BungeePlayerUtils.java b/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/BungeePlayerUtils.java index 6ee3038..a171526 100644 --- a/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/BungeePlayerUtils.java +++ b/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/BungeePlayerUtils.java @@ -5,6 +5,7 @@ import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.connection.ProxiedPlayer; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.Pipeline; +import redis.clients.jedis.UnifiedJedis; import java.util.HashMap; import java.util.Map; @@ -13,43 +14,23 @@ import static com.imaginarycode.minecraft.redisbungee.api.util.payload.PayloadUt public class BungeePlayerUtils { - public static void createPlayer(ProxiedPlayer player, Pipeline pipeline, boolean fireEvent) { - createPlayer(player.getPendingConnection(), pipeline, fireEvent); + public static void createPlayer(ProxiedPlayer player, UnifiedJedis unifiedJedis, boolean fireEvent) { + createPlayer(player.getPendingConnection(), unifiedJedis, fireEvent); if (player.getServer() != null) - pipeline.hset("player:" + player.getUniqueId().toString(), "server", player.getServer().getInfo().getName()); + unifiedJedis.hset("player:" + player.getUniqueId().toString(), "server", player.getServer().getInfo().getName()); } - public static void createPlayer(PendingConnection connection, Pipeline pipeline, boolean fireEvent) { + public static void createPlayer(PendingConnection connection, UnifiedJedis unifiedJedis, boolean fireEvent) { Map playerData = new HashMap<>(4); playerData.put("online", "0"); playerData.put("ip", connection.getAddress().getAddress().getHostAddress()); playerData.put("proxy", RedisBungeeAPI.getRedisBungeeApi().getProxyId()); - pipeline.sadd("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", connection.getUniqueId().toString()); - pipeline.hmset("player:" + connection.getUniqueId().toString(), playerData); + unifiedJedis.sadd("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", connection.getUniqueId().toString()); + unifiedJedis.hmset("player:" + connection.getUniqueId().toString(), playerData); if (fireEvent) { - playerJoinPayload(connection.getUniqueId(), pipeline, connection.getAddress().getAddress()); - } - } - - public static void createPlayer(ProxiedPlayer player, JedisCluster jedisCluster, boolean fireEvent) { - createPlayer(player.getPendingConnection(), jedisCluster, fireEvent); - if (player.getServer() != null) - jedisCluster.hset("player:" + player.getUniqueId().toString(), "server", player.getServer().getInfo().getName()); - } - - public static void createPlayer(PendingConnection connection, JedisCluster jedisCluster, boolean fireEvent) { - Map playerData = new HashMap<>(4); - playerData.put("online", "0"); - playerData.put("ip", connection.getAddress().getAddress().getHostAddress()); - playerData.put("proxy", RedisBungeeAPI.getRedisBungeeApi().getProxyId()); - - jedisCluster.sadd("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", connection.getUniqueId().toString()); - jedisCluster.hmset("player:" + connection.getUniqueId().toString(), playerData); - - if (fireEvent) { - playerJoinPayload(connection.getUniqueId(), jedisCluster, connection.getAddress().getAddress()); + playerJoinPayload(connection.getUniqueId(), unifiedJedis, connection.getAddress().getAddress()); } } diff --git a/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeBungeeListener.java b/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeBungeeListener.java index face122..1557669 100644 --- a/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeBungeeListener.java +++ b/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeBungeeListener.java @@ -23,6 +23,7 @@ import net.md_5.bungee.event.EventHandler; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.Pipeline; +import redis.clients.jedis.UnifiedJedis; import java.net.InetAddress; import java.util.*; @@ -40,7 +41,7 @@ public class RedisBungeeBungeeListener extends AbstractRedisBungeeListener(plugin) { @Override - public Void jedisTask(Jedis jedis) { + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { try { if (event.isCancelled()) { return null; @@ -60,41 +61,7 @@ public class RedisBungeeBungeeListener extends AbstractRedisBungeeListener(plugin) { @Override - public Void jedisTask(Jedis jedis) { - // this code was moved out from login event due being async.. - // and it can be cancelled but it will show as false in redis-bungee - // which will register the player into the redis database. - Pipeline pipeline = jedis.pipelined(); - plugin.getUuidTranslator().persistInfo(event.getPlayer().getName(), event.getPlayer().getUniqueId(), pipeline); - BungeePlayerUtils.createPlayer(event.getPlayer(), pipeline, true); - pipeline.sync(); - // the end of moved code. - return null; - } - - @Override - public Void clusterJedisTask(JedisCluster jedisCluster) { - - // due no support to pipeline in jedis cluster just use the instance instead. - plugin.getUuidTranslator().persistInfo(event.getPlayer().getName(), event.getPlayer().getUniqueId(), jedisCluster); - BungeePlayerUtils.createPlayer(event.getPlayer(), jedisCluster, true); + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { + plugin.getUuidTranslator().persistInfo(event.getPlayer().getName(), event.getPlayer().getUniqueId(), unifiedJedis); + BungeePlayerUtils.createPlayer(event.getPlayer(), unifiedJedis, true); return null; } }); @@ -142,17 +94,8 @@ public class RedisBungeeBungeeListener extends AbstractRedisBungeeListener(plugin) { @Override - public Void jedisTask(Jedis jedis) { - Pipeline pipeline = jedis.pipelined(); - PlayerUtils.cleanUpPlayer(event.getPlayer().getUniqueId().toString(), pipeline, true); - pipeline.sync(); - return null; - } - - @Override - public Void clusterJedisTask(JedisCluster jedisCluster) { - // Due some reason JedisCluster does not support pipeline, use instance instead - PlayerUtils.cleanUpPlayer(event.getPlayer().getUniqueId().toString(), jedisCluster, true); + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { + PlayerUtils.cleanUpPlayer(event.getPlayer().getUniqueId().toString(), unifiedJedis, true); return null; } }); @@ -166,16 +109,9 @@ public class RedisBungeeBungeeListener extends AbstractRedisBungeeListener(plugin) { @Override - public Void jedisTask(Jedis jedis) { - jedis.hset("player:" + event.getPlayer().getUniqueId().toString(), "server", event.getServer().getInfo().getName()); - PayloadUtils.playerServerChangePayload(event.getPlayer().getUniqueId(), jedis, currentServer, oldServer); - return null; - } - - @Override - public Void clusterJedisTask(JedisCluster jedisCluster) { - jedisCluster.hset("player:" + event.getPlayer().getUniqueId().toString(), "server", event.getServer().getInfo().getName()); - PayloadUtils.playerServerChangePayload(event.getPlayer().getUniqueId(), jedisCluster, currentServer, oldServer); + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { + unifiedJedis.hset("player:" + event.getPlayer().getUniqueId().toString(), "server", event.getServer().getInfo().getName()); + PayloadUtils.playerServerChangePayload(event.getPlayer().getUniqueId(), unifiedJedis, currentServer, oldServer); return null; } }); diff --git a/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeBungeePlugin.java b/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeBungeePlugin.java index 75c1fbf..8a33da2 100644 --- a/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeBungeePlugin.java +++ b/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeBungeePlugin.java @@ -221,21 +221,12 @@ public class RedisBungeeBungeePlugin extends Plugin implements RedisBungeePlugin IntegrityCheckTask integrityCheckTask = new IntegrityCheckTask(this) { @Override - public void handlePlatformPlayer(String player, JedisCluster jedis) { + public void handlePlatformPlayer(String player, UnifiedJedis unifiedJedis) { ProxiedPlayer proxiedPlayer = ProxyServer.getInstance().getPlayer(UUID.fromString(player)); if (proxiedPlayer == null) return; // We'll deal with it later. - BungeePlayerUtils.createPlayer(proxiedPlayer, jedis, false); - } - - @Override - public void handlePlatformPlayer(String player, Pipeline pipeline) { - ProxiedPlayer proxiedPlayer = ProxyServer.getInstance().getPlayer(UUID.fromString(player)); - if (proxiedPlayer == null) - return; // We'll deal with it later. - - BungeePlayerUtils.createPlayer(proxiedPlayer, pipeline, false); + BungeePlayerUtils.createPlayer(proxiedPlayer, unifiedJedis, false); } }; diff --git a/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeVelocityListener.java b/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeVelocityListener.java index e999fd8..9e71931 100644 --- a/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeVelocityListener.java +++ b/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeVelocityListener.java @@ -30,6 +30,7 @@ import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.Pipeline; +import redis.clients.jedis.UnifiedJedis; import java.net.InetAddress; import java.util.*; @@ -47,7 +48,7 @@ public class RedisBungeeVelocityListener extends AbstractRedisBungeeListener(plugin) { @Override - public Void jedisTask(Jedis jedis) { + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { try { if (!event.getResult().isAllowed()) { return null; @@ -65,37 +66,7 @@ public class RedisBungeeVelocityListener extends AbstractRedisBungeeListener(plugin) { @Override - public Void jedisTask(Jedis jedis) { - Pipeline pipeline = jedis.pipelined(); - plugin.getUuidTranslator().persistInfo(event.getPlayer().getUsername(), event.getPlayer().getUniqueId(), pipeline); - VelocityPlayerUtils.createPlayer(event.getPlayer(), pipeline, true); - pipeline.sync(); - return null; - } - - @Override - public Void clusterJedisTask(JedisCluster jedisCluster) { - plugin.getUuidTranslator().persistInfo(event.getPlayer().getUsername(), event.getPlayer().getUniqueId(), jedisCluster); - VelocityPlayerUtils.createPlayer(event.getPlayer(), jedisCluster, true); + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { + plugin.getUuidTranslator().persistInfo(event.getPlayer().getUsername(), event.getPlayer().getUniqueId(), unifiedJedis); + VelocityPlayerUtils.createPlayer(event.getPlayer(), unifiedJedis, true); return null; } }); @@ -136,16 +98,8 @@ public class RedisBungeeVelocityListener extends AbstractRedisBungeeListener(plugin) { @Override - public Void jedisTask(Jedis jedis) { - Pipeline pipeline = jedis.pipelined(); - PlayerUtils.cleanUpPlayer(event.getPlayer().getUniqueId().toString(), pipeline, true); - pipeline.sync(); - return null; - } - - @Override - public Void clusterJedisTask(JedisCluster jedisCluster) { - PlayerUtils.cleanUpPlayer(event.getPlayer().getUniqueId().toString(), jedisCluster, true); + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { + PlayerUtils.cleanUpPlayer(event.getPlayer().getUniqueId().toString(), unifiedJedis, true); return null; } @@ -159,18 +113,10 @@ public class RedisBungeeVelocityListener extends AbstractRedisBungeeListener serverConnection.getServerInfo().getName()).orElse(null); plugin.executeAsync(new RedisTask(plugin) { - @Override - public Void jedisTask(Jedis jedis) { - jedis.hset("player:" + event.getPlayer().getUniqueId().toString(), "server", currentServer); - PayloadUtils.playerServerChangePayload(event.getPlayer().getUniqueId(), jedis, currentServer, oldServer); - return null; - } - - @Override - public Void clusterJedisTask(JedisCluster jedisCluster) { - jedisCluster.hset("player:" + event.getPlayer().getUniqueId().toString(), "server", currentServer); - PayloadUtils.playerServerChangePayload(event.getPlayer().getUniqueId(), jedisCluster, currentServer, oldServer); + public Void unifiedJedisTask(UnifiedJedis unifiedJedis) { + unifiedJedis.hset("player:" + event.getPlayer().getUniqueId().toString(), "server", currentServer); + PayloadUtils.playerServerChangePayload(event.getPlayer().getUniqueId(), unifiedJedis, currentServer, oldServer); return null; } }); diff --git a/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeVelocityPlugin.java b/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeVelocityPlugin.java index 22639a9..03b670b 100644 --- a/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeVelocityPlugin.java +++ b/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeVelocityPlugin.java @@ -244,19 +244,11 @@ public class RedisBungeeVelocityPlugin implements RedisBungeePlugin { IntegrityCheckTask integrityCheckTask = new IntegrityCheckTask(this) { @Override - public void handlePlatformPlayer(String player, JedisCluster jedisCluster) { + public void handlePlatformPlayer(String player, UnifiedJedis unifiedJedis) { Player playerProxied = getProxy().getPlayer(UUID.fromString(player)).orElse(null); if (playerProxied == null) return; // We'll deal with it later. - VelocityPlayerUtils.createPlayer(playerProxied, jedisCluster, false); - } - - @Override - public void handlePlatformPlayer(String player, Pipeline pipeline) { - Player playerProxied = getProxy().getPlayer(UUID.fromString(player)).orElse(null); - if (playerProxied == null) - return; // We'll deal with it later. - VelocityPlayerUtils.createPlayer(playerProxied, pipeline, false); + VelocityPlayerUtils.createPlayer(playerProxied, unifiedJedis, false); } }; integrityCheck = getProxy().getScheduler().buildTask(this, integrityCheckTask::execute).repeat(30, TimeUnit.SECONDS).schedule(); diff --git a/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/VelocityPlayerUtils.java b/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/VelocityPlayerUtils.java index d297034..44af1dc 100644 --- a/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/VelocityPlayerUtils.java +++ b/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/VelocityPlayerUtils.java @@ -4,6 +4,7 @@ import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ServerConnection; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.Pipeline; +import redis.clients.jedis.UnifiedJedis; import java.util.HashMap; import java.util.Map; @@ -12,38 +13,20 @@ import java.util.Optional; import static com.imaginarycode.minecraft.redisbungee.api.util.payload.PayloadUtils.playerJoinPayload; public class VelocityPlayerUtils { - - protected static void createPlayer(Player player, Pipeline pipeline, boolean fireEvent) { + protected static void createPlayer(Player player, UnifiedJedis unifiedJedis, boolean fireEvent) { Optional server = player.getCurrentServer(); - server.ifPresent(serverConnection -> pipeline.hset("player:" + player.getUniqueId().toString(), "server", serverConnection.getServerInfo().getName())); + server.ifPresent(serverConnection -> unifiedJedis.hset("player:" + player.getUniqueId().toString(), "server", serverConnection.getServerInfo().getName())); Map playerData = new HashMap<>(4); playerData.put("online", "0"); playerData.put("ip", player.getRemoteAddress().getHostName()); playerData.put("proxy", RedisBungeeAPI.getRedisBungeeApi().getProxyId()); - pipeline.sadd("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", player.getUniqueId().toString()); - pipeline.hmset("player:" + player.getUniqueId().toString(), playerData); + unifiedJedis.sadd("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", player.getUniqueId().toString()); + unifiedJedis.hmset("player:" + player.getUniqueId().toString(), playerData); if (fireEvent) { - playerJoinPayload(player.getUniqueId(), pipeline, player.getRemoteAddress().getAddress()); - } - } - - protected static void createPlayer(Player player, JedisCluster jedisCluster, boolean fireEvent) { - Optional server = player.getCurrentServer(); - server.ifPresent(serverConnection -> jedisCluster.hset("player:" + player.getUniqueId().toString(), "server", serverConnection.getServerInfo().getName())); - - Map playerData = new HashMap<>(4); - playerData.put("online", "0"); - playerData.put("ip", player.getRemoteAddress().getHostName()); - playerData.put("proxy", RedisBungeeAPI.getRedisBungeeApi().getProxyId()); - - jedisCluster.sadd("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", player.getUniqueId().toString()); - jedisCluster.hmset("player:" + player.getUniqueId().toString(), playerData); - - if (fireEvent) { - playerJoinPayload(player.getUniqueId(), jedisCluster, player.getRemoteAddress().getAddress()); + playerJoinPayload(player.getUniqueId(), unifiedJedis, player.getRemoteAddress().getAddress()); } } }