From e285b3f2aa45401dd4cf99c5f508f446f8f1a70a Mon Sep 17 00:00:00 2001 From: Tux Date: Sun, 27 Sep 2015 11:49:03 -0400 Subject: [PATCH] Better resyncing of missing players on the proxy. --- .../minecraft/redisbungee/RedisBungee.java | 17 ++++++++++++----- .../redisbungee/RedisBungeeListener.java | 8 +------- .../minecraft/redisbungee/RedisUtil.java | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java index c7215e1..e956f88 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java @@ -37,16 +37,14 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.NonNull; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.scheduler.ScheduledTask; import net.md_5.bungee.config.Configuration; import net.md_5.bungee.config.ConfigurationProvider; import net.md_5.bungee.config.YamlConfiguration; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisPool; -import redis.clients.jedis.JedisPoolConfig; -import redis.clients.jedis.JedisPubSub; +import redis.clients.jedis.*; import redis.clients.jedis.exceptions.JedisConnectionException; import redis.clients.jedis.exceptions.JedisException; @@ -343,14 +341,23 @@ public final class RedisBungee extends Plugin { } } + Pipeline pipeline = tmpRsc.pipelined(); + for (String player : players) { if (redisCollection.contains(player)) continue; // Player not online according to Redis but not BungeeCord. getLogger().warning("Player " + player + " is on the proxy but not in Redis."); - tmpRsc.sadd("proxy:" + configuration.getServerId() + ":usersOnline", player); + + ProxiedPlayer proxiedPlayer = ProxyServer.getInstance().getPlayer(UUID.fromString(player)); + if (proxiedPlayer == null) + continue; // We'll deal with it later. + + RedisUtil.createPlayer(proxiedPlayer.getPendingConnection(), pipeline); } + + pipeline.sync(); } } }, 0, 1, TimeUnit.MINUTES); diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeListener.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeListener.java index 001c577..228a937 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeListener.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeListener.java @@ -108,15 +108,9 @@ public class RedisBungeeListener implements Listener { } } - Map playerData = new HashMap<>(4); - playerData.put("online", "0"); - playerData.put("ip", event.getConnection().getAddress().getAddress().getHostAddress()); - playerData.put("proxy", RedisBungee.getConfiguration().getServerId()); - Pipeline pipeline = jedis.pipelined(); - pipeline.sadd("proxy:" + RedisBungee.getApi().getServerId() + ":usersOnline", event.getConnection().getUniqueId().toString()); plugin.getUuidTranslator().persistInfo(event.getConnection().getName(), event.getConnection().getUniqueId(), pipeline); - pipeline.hmset("player:" + event.getConnection().getUniqueId().toString(), playerData); + RedisUtil.createPlayer(event.getConnection(), pipeline); // We're not publishing, the API says we only publish at PostLoginEvent time. pipeline.sync(); diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisUtil.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisUtil.java index 14b7a9c..e1d0c5a 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisUtil.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisUtil.java @@ -29,12 +29,26 @@ package com.imaginarycode.minecraft.redisbungee; import com.google.common.annotations.VisibleForTesting; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import net.md_5.bungee.api.connection.PendingConnection; import redis.clients.jedis.Jedis; import redis.clients.jedis.Pipeline; +import java.util.HashMap; +import java.util.Map; + @VisibleForTesting @NoArgsConstructor(access = AccessLevel.PRIVATE) public class RedisUtil { + protected static void createPlayer(PendingConnection connection, Pipeline pipeline) { + Map playerData = new HashMap<>(4); + playerData.put("online", "0"); + playerData.put("ip", connection.getAddress().getAddress().getHostAddress()); + playerData.put("proxy", RedisBungee.getConfiguration().getServerId()); + + pipeline.sadd("proxy:" + RedisBungee.getApi().getServerId() + ":usersOnline", connection.getUniqueId().toString()); + pipeline.hmset("player:" + connection.getUniqueId().toString(), playerData); + } + // Compatibility restraints prevent me from using using HDEL with multiple keys. public static void cleanUpPlayer(String player, Jedis rsc) { rsc.srem("proxy:" + RedisBungee.getApi().getServerId() + ":usersOnline", player);