mirror of
https://github.com/proxiodev/RedisBungee.git
synced 2025-04-20 01:27:07 +00:00
phase 1
This commit is contained in:
parent
aeeb38f3c8
commit
4757a49bdc
@ -33,6 +33,7 @@ import java.util.logging.Level;
|
|||||||
*
|
*
|
||||||
* @since 0.3.3
|
* @since 0.3.3
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings({"u", "deprecation"})
|
||||||
public class DataManager implements Listener {
|
public class DataManager implements Listener {
|
||||||
private final RedisBungee plugin;
|
private final RedisBungee plugin;
|
||||||
private final Cache<UUID, String> serverCache = createCache();
|
private final Cache<UUID, String> serverCache = createCache();
|
||||||
@ -61,12 +62,9 @@ public class DataManager implements Listener {
|
|||||||
return player.getServer() != null ? player.getServer().getInfo().getName() : null;
|
return player.getServer() != null ? player.getServer().getInfo().getName() : null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return serverCache.get(uuid, new Callable<String>() {
|
return serverCache.get(uuid, () -> {
|
||||||
@Override
|
try (Jedis tmpRsc = plugin.getPool().getResource()) {
|
||||||
public String call() throws Exception {
|
return Objects.requireNonNull(tmpRsc.hget("player:" + uuid, "server"), "user not found");
|
||||||
try (Jedis tmpRsc = plugin.getPool().getResource()) {
|
|
||||||
return Objects.requireNonNull(tmpRsc.hget("player:" + uuid, "server"), "user not found");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (ExecutionException | UncheckedExecutionException e) {
|
} catch (ExecutionException | UncheckedExecutionException e) {
|
||||||
@ -81,15 +79,12 @@ public class DataManager implements Listener {
|
|||||||
ProxiedPlayer player = plugin.getProxy().getPlayer(uuid);
|
ProxiedPlayer player = plugin.getProxy().getPlayer(uuid);
|
||||||
|
|
||||||
if (player != null)
|
if (player != null)
|
||||||
return RedisBungee.getConfiguration().getServerId();
|
return plugin.getConfiguration().getServerId();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return proxyCache.get(uuid, new Callable<String>() {
|
return proxyCache.get(uuid, () -> {
|
||||||
@Override
|
try (Jedis tmpRsc = plugin.getPool().getResource()) {
|
||||||
public String call() throws Exception {
|
return Objects.requireNonNull(tmpRsc.hget("player:" + uuid, "proxy"), "user not found");
|
||||||
try (Jedis tmpRsc = plugin.getPool().getResource()) {
|
|
||||||
return Objects.requireNonNull(tmpRsc.hget("player:" + uuid, "proxy"), "user not found");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (ExecutionException | UncheckedExecutionException e) {
|
} catch (ExecutionException | UncheckedExecutionException e) {
|
||||||
@ -107,15 +102,12 @@ public class DataManager implements Listener {
|
|||||||
return player.getAddress().getAddress();
|
return player.getAddress().getAddress();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return ipCache.get(uuid, new Callable<InetAddress>() {
|
return ipCache.get(uuid, () -> {
|
||||||
@Override
|
try (Jedis tmpRsc = plugin.getPool().getResource()) {
|
||||||
public InetAddress call() throws Exception {
|
String result = tmpRsc.hget("player:" + uuid, "ip");
|
||||||
try (Jedis tmpRsc = plugin.getPool().getResource()) {
|
if (result == null)
|
||||||
String result = tmpRsc.hget("player:" + uuid, "ip");
|
throw new NullPointerException("user not found");
|
||||||
if (result == null)
|
return InetAddresses.forString(result);
|
||||||
throw new NullPointerException("user not found");
|
|
||||||
return InetAddresses.forString(result);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (ExecutionException | UncheckedExecutionException e) {
|
} catch (ExecutionException | UncheckedExecutionException e) {
|
||||||
@ -133,13 +125,10 @@ public class DataManager implements Listener {
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return lastOnlineCache.get(uuid, new Callable<Long>() {
|
return lastOnlineCache.get(uuid, () -> {
|
||||||
@Override
|
try (Jedis tmpRsc = plugin.getPool().getResource()) {
|
||||||
public Long call() throws Exception {
|
String result = tmpRsc.hget("player:" + uuid, "online");
|
||||||
try (Jedis tmpRsc = plugin.getPool().getResource()) {
|
return result == null ? -1 : Long.parseLong(result);
|
||||||
String result = tmpRsc.hget("player:" + uuid, "online");
|
|
||||||
return result == null ? -1 : Long.valueOf(result);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (ExecutionException e) {
|
} catch (ExecutionException e) {
|
||||||
@ -177,7 +166,7 @@ public class DataManager implements Listener {
|
|||||||
|
|
||||||
String source = jsonObject.get("source").getAsString();
|
String source = jsonObject.get("source").getAsString();
|
||||||
|
|
||||||
if (source.equals(RedisBungee.getConfiguration().getServerId()))
|
if (source.equals(plugin.getRedisBungeeAPI().getServerId()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DataManagerMessage.Action action = DataManagerMessage.Action.valueOf(jsonObject.get("action").getAsString());
|
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());
|
proxyCache.put(message1.getTarget(), message1.getSource());
|
||||||
lastOnlineCache.put(message1.getTarget(), (long) 0);
|
lastOnlineCache.put(message1.getTarget(), (long) 0);
|
||||||
ipCache.put(message1.getTarget(), message1.getPayload().getAddress());
|
ipCache.put(message1.getTarget(), message1.getPayload().getAddress());
|
||||||
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() {
|
plugin.getProxy().getScheduler().runAsync(plugin, () -> plugin.getProxy().getPluginManager().callEvent(new PlayerJoinedNetworkEvent(message1.getTarget())));
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
plugin.getProxy().getPluginManager().callEvent(new PlayerJoinedNetworkEvent(message1.getTarget()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
break;
|
break;
|
||||||
case LEAVE:
|
case LEAVE:
|
||||||
final DataManagerMessage<LogoutPayload> message2 = RedisBungee.getGson().fromJson(jsonObject, new TypeToken<DataManagerMessage<LogoutPayload>>() {
|
final DataManagerMessage<LogoutPayload> message2 = RedisBungee.getGson().fromJson(jsonObject, new TypeToken<DataManagerMessage<LogoutPayload>>() {
|
||||||
}.getType());
|
}.getType());
|
||||||
invalidate(message2.getTarget());
|
invalidate(message2.getTarget());
|
||||||
lastOnlineCache.put(message2.getTarget(), message2.getPayload().getTimestamp());
|
lastOnlineCache.put(message2.getTarget(), message2.getPayload().getTimestamp());
|
||||||
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() {
|
plugin.getProxy().getScheduler().runAsync(plugin, () -> plugin.getProxy().getPluginManager().callEvent(new PlayerLeftNetworkEvent(message2.getTarget())));
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
plugin.getProxy().getPluginManager().callEvent(new PlayerLeftNetworkEvent(message2.getTarget()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
break;
|
break;
|
||||||
case SERVER_CHANGE:
|
case SERVER_CHANGE:
|
||||||
final DataManagerMessage<ServerChangePayload> message3 = RedisBungee.getGson().fromJson(jsonObject, new TypeToken<DataManagerMessage<ServerChangePayload>>() {
|
final DataManagerMessage<ServerChangePayload> message3 = plugin.getGson().fromJson(jsonObject, new TypeToken<DataManagerMessage<ServerChangePayload>>() {
|
||||||
}.getType());
|
}.getType());
|
||||||
serverCache.put(message3.getTarget(), message3.getPayload().getServer());
|
serverCache.put(message3.getTarget(), message3.getPayload().getServer());
|
||||||
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() {
|
plugin.getProxy().getScheduler().runAsync(plugin, () -> plugin.getProxy().getPluginManager().callEvent(new PlayerChangedServerNetworkEvent(message3.getTarget(), message3.getPayload().getOldServer(), message3.getPayload().getServer())));
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
plugin.getProxy().getPluginManager().callEvent(new PlayerChangedServerNetworkEvent(message3.getTarget(), message3.getPayload().getOldServer(), message3.getPayload().getServer()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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.
|
* The only function of interest is {@link #getApi()}, which exposes some functions in this class.
|
||||||
*/
|
*/
|
||||||
public final class RedisBungee extends Plugin {
|
public final class RedisBungee extends Plugin {
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private static Gson gson = new Gson();
|
private static final Gson gson = new Gson();
|
||||||
private static RedisBungeeAPI api;
|
|
||||||
|
@Getter
|
||||||
|
private RedisBungeeAPI redisBungeeAPI;
|
||||||
|
|
||||||
@Getter(AccessLevel.PACKAGE)
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private static PubSubListener psl = null;
|
private PubSubListener psl = null;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private JedisPool pool;
|
private JedisPool pool;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private UUIDTranslator uuidTranslator;
|
private UUIDTranslator uuidTranslator;
|
||||||
|
|
||||||
@Getter(AccessLevel.PACKAGE)
|
@Getter(AccessLevel.PACKAGE)
|
||||||
private static RedisBungeeConfiguration configuration;
|
private RedisBungeeConfiguration configuration;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private DataManager dataManager;
|
private DataManager dataManager;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private static OkHttpClient httpClient;
|
private OkHttpClient httpClient;
|
||||||
private volatile List<String> serverIds;
|
private volatile List<String> serverIds;
|
||||||
private final AtomicInteger nagAboutServers = new AtomicInteger();
|
private final AtomicInteger nagAboutServers = new AtomicInteger();
|
||||||
private final AtomicInteger globalPlayerCount = new AtomicInteger();
|
private final AtomicInteger globalPlayerCount = new AtomicInteger();
|
||||||
private Future<?> integrityCheck;
|
private Future<?> integrityCheck;
|
||||||
private Future<?> heartbeatTask;
|
private Future<?> heartbeatTask;
|
||||||
private boolean usingLua;
|
|
||||||
private LuaManager.Script serverToPlayersScript;
|
private LuaManager.Script serverToPlayersScript;
|
||||||
private LuaManager.Script getPlayerCountScript;
|
private LuaManager.Script getPlayerCountScript;
|
||||||
|
|
||||||
@ -75,10 +83,15 @@ public final class RedisBungee extends Plugin {
|
|||||||
* @return the {@link RedisBungeeAPI} object
|
* @return the {@link RedisBungeeAPI} object
|
||||||
*/
|
*/
|
||||||
public static RedisBungeeAPI getApi() {
|
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;
|
return psl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,27 +142,25 @@ public final class RedisBungee extends Plugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
final Multimap<String, UUID> serversToPlayers() {
|
final Multimap<String, UUID> serversToPlayers() {
|
||||||
try {
|
try {
|
||||||
return serverToPlayersCache.get(SERVER_TO_PLAYERS_KEY, new Callable<Multimap<String, UUID>>() {
|
return serverToPlayersCache.get(SERVER_TO_PLAYERS_KEY, () -> {
|
||||||
@Override
|
Collection<String> data = (Collection<String>) serverToPlayersScript.eval(ImmutableList.of(), getServerIds());
|
||||||
public Multimap<String, UUID> call() throws Exception {
|
|
||||||
Collection<String> data = (Collection<String>) serverToPlayersScript.eval(ImmutableList.<String>of(), getServerIds());
|
|
||||||
|
|
||||||
ImmutableMultimap.Builder<String, UUID> builder = ImmutableMultimap.builder();
|
ImmutableMultimap.Builder<String, UUID> builder = ImmutableMultimap.builder();
|
||||||
String key = null;
|
String key = null;
|
||||||
for (String s : data) {
|
for (String s : data) {
|
||||||
if (key == null) {
|
if (key == null) {
|
||||||
key = s;
|
key = s;
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
builder.put(key, UUID.fromString(s));
|
|
||||||
key = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return builder.build();
|
builder.put(key, UUID.fromString(s));
|
||||||
|
key = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return builder.build();
|
||||||
});
|
});
|
||||||
} catch (ExecutionException e) {
|
} catch (ExecutionException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
@ -161,7 +172,7 @@ public final class RedisBungee extends Plugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final int getCurrentCount() {
|
final int getCurrentCount() {
|
||||||
Long count = (Long) getPlayerCountScript.eval(ImmutableList.<String>of(), ImmutableList.<String>of());
|
Long count = (Long) getPlayerCountScript.eval(ImmutableList.of(), ImmutableList.of());
|
||||||
return count.intValue();
|
return count.intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,7 +193,7 @@ public final class RedisBungee extends Plugin {
|
|||||||
keys.add("proxy:" + i + ":usersOnline");
|
keys.add("proxy:" + i + ":usersOnline");
|
||||||
}
|
}
|
||||||
if (!keys.isEmpty()) {
|
if (!keys.isEmpty()) {
|
||||||
Set<String> users = rsc.sunion(keys.toArray(new String[keys.size()]));
|
Set<String> users = rsc.sunion(keys.toArray(new String[0]));
|
||||||
if (users != null && !users.isEmpty()) {
|
if (users != null && !users.isEmpty()) {
|
||||||
for (String user : users) {
|
for (String user : users) {
|
||||||
try {
|
try {
|
||||||
@ -220,6 +231,11 @@ public final class RedisBungee extends Plugin {
|
|||||||
return Long.parseLong(timeRes.get(0));
|
return Long.parseLong(timeRes.get(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
/*
|
||||||
|
Due replacing executor service is needed here and method from bungeecord api is deprecated :/
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
ThreadFactory factory = ((ThreadPoolExecutor) getExecutorService()).getThreadFactory();
|
ThreadFactory factory = ((ThreadPoolExecutor) getExecutorService()).getThreadFactory();
|
||||||
@ -246,15 +262,15 @@ public final class RedisBungee extends Plugin {
|
|||||||
for (String s : info.split("\r\n")) {
|
for (String s : info.split("\r\n")) {
|
||||||
if (s.startsWith("redis_version:")) {
|
if (s.startsWith("redis_version:")) {
|
||||||
String version = s.split(":")[1];
|
String version = s.split(":")[1];
|
||||||
getLogger().info(version + " <- redis version");
|
if (!RedisUtil.isRedisVersionSupported((version))) {
|
||||||
if (!(usingLua = RedisUtil.canUseLua(version))) {
|
|
||||||
getLogger().warning("Your version of Redis (" + version + ") is not at least version 6.2 RedisBungee requires a newer version of Redis.");
|
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");
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -268,23 +284,20 @@ public final class RedisBungee extends Plugin {
|
|||||||
}
|
}
|
||||||
serverIds = getCurrentServerIds(true, false);
|
serverIds = getCurrentServerIds(true, false);
|
||||||
uuidTranslator = new UUIDTranslator(this);
|
uuidTranslator = new UUIDTranslator(this);
|
||||||
heartbeatTask = service.scheduleAtFixedRate(new Runnable() {
|
heartbeatTask = service.scheduleAtFixedRate(() -> {
|
||||||
@Override
|
try (Jedis rsc = pool.getResource()) {
|
||||||
public void run() {
|
long redisTime = getRedisTime(rsc.time());
|
||||||
try (Jedis rsc = pool.getResource()) {
|
rsc.hset("heartbeats", configuration.getServerId(), String.valueOf(redisTime));
|
||||||
long redisTime = getRedisTime(rsc.time());
|
} catch (JedisConnectionException e) {
|
||||||
rsc.hset("heartbeats", configuration.getServerId(), String.valueOf(redisTime));
|
// Redis server has disappeared!
|
||||||
} catch (JedisConnectionException e) {
|
getLogger().log(Level.SEVERE, "Unable to update heartbeat - did your Redis server go away?", e);
|
||||||
// Redis server has disappeared!
|
return;
|
||||||
getLogger().log(Level.SEVERE, "Unable to update heartbeat - did your Redis server go away?", e);
|
}
|
||||||
return;
|
try {
|
||||||
}
|
serverIds = getCurrentServerIds(true, false);
|
||||||
try {
|
globalPlayerCount.set(getCurrentCount());
|
||||||
serverIds = getCurrentServerIds(true, false);
|
} catch (Throwable e) {
|
||||||
globalPlayerCount.set(getCurrentCount());
|
getLogger().log(Level.SEVERE, "Unable to update data - did your Redis server go away?", e);
|
||||||
} catch (Throwable e) {
|
|
||||||
getLogger().log(Level.SEVERE, "Unable to update data - did your Redis server go away?", e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}, 0, 3, TimeUnit.SECONDS);
|
}, 0, 3, TimeUnit.SECONDS);
|
||||||
dataManager = new DataManager(this);
|
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.SendToAll(this));
|
||||||
getProxy().getPluginManager().registerCommand(this, new RedisBungeeCommands.ServerId(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.PlayerProxyCommand(this));
|
||||||
getProxy().getPluginManager().registerCommand(this, new RedisBungeeCommands.PlistCommand(this));
|
getProxy().getPluginManager().registerCommand(this, new RedisBungeeCommands.PlistCommand(this));
|
||||||
getProxy().getPluginManager().registerCommand(this, new RedisBungeeCommands.DebugCommand(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, new RedisBungeeListener(this, configuration.getExemptAddresses()));
|
||||||
getProxy().getPluginManager().registerListener(this, dataManager);
|
getProxy().getPluginManager().registerListener(this, dataManager);
|
||||||
psl = new PubSubListener();
|
psl = new PubSubListener();
|
||||||
getProxy().getScheduler().runAsync(this, psl);
|
getProxy().getScheduler().runAsync(this, psl);
|
||||||
integrityCheck = service.scheduleAtFixedRate(new Runnable() {
|
integrityCheck = service.scheduleAtFixedRate(() -> {
|
||||||
@Override
|
try (Jedis tmpRsc = pool.getResource()) {
|
||||||
public void run() {
|
Set<String> players = getLocalPlayersAsUuidStrings();
|
||||||
try (Jedis tmpRsc = pool.getResource()) {
|
Set<String> playersInRedis = tmpRsc.smembers("proxy:" + configuration.getServerId() + ":usersOnline");
|
||||||
Set<String> players = getLocalPlayersAsUuidStrings();
|
List<String> lagged = getCurrentServerIds(false, true);
|
||||||
Set<String> playersInRedis = tmpRsc.smembers("proxy:" + configuration.getServerId() + ":usersOnline");
|
|
||||||
List<String> lagged = getCurrentServerIds(false, true);
|
|
||||||
|
|
||||||
// Clean up lagged players.
|
// Clean up lagged players.
|
||||||
for (String s : lagged) {
|
for (String s : lagged) {
|
||||||
Set<String> laggedPlayers = tmpRsc.smembers("proxy:" + s + ":usersOnline");
|
Set<String> laggedPlayers = tmpRsc.smembers("proxy:" + s + ":usersOnline");
|
||||||
tmpRsc.del("proxy:" + s + ":usersOnline");
|
tmpRsc.del("proxy:" + s + ":usersOnline");
|
||||||
if (!laggedPlayers.isEmpty()) {
|
if (!laggedPlayers.isEmpty()) {
|
||||||
getLogger().info("Cleaning up lagged proxy " + s + " (" + laggedPlayers.size() + " players)...");
|
getLogger().info("Cleaning up lagged proxy " + s + " (" + laggedPlayers.size() + " players)...");
|
||||||
for (String laggedPlayer : laggedPlayers) {
|
for (String laggedPlayer : laggedPlayers) {
|
||||||
RedisUtil.cleanUpPlayer(laggedPlayer, tmpRsc);
|
RedisUtil.cleanUpPlayer(laggedPlayer, tmpRsc);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Set<String> absentLocally = new HashSet<>(playersInRedis);
|
|
||||||
absentLocally.removeAll(players);
|
|
||||||
Set<String> 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<String> absentLocally = new HashSet<>(playersInRedis);
|
||||||
|
absentLocally.removeAll(players);
|
||||||
|
Set<String> 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);
|
}, 0, 1, TimeUnit.MINUTES);
|
||||||
}
|
}
|
||||||
@ -395,6 +405,7 @@ public final class RedisBungee extends Plugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("all")
|
||||||
private void loadConfig() throws IOException, JedisConnectionException {
|
private void loadConfig() throws IOException, JedisConnectionException {
|
||||||
if (!getDataFolder().exists()) {
|
if (!getDataFolder().exists()) {
|
||||||
getDataFolder().mkdir();
|
getDataFolder().mkdir();
|
||||||
@ -426,9 +437,9 @@ public final class RedisBungee extends Plugin {
|
|||||||
// Configuration sanity checks.
|
// Configuration sanity checks.
|
||||||
if (serverId == null || serverId.isEmpty()) {
|
if (serverId == null || serverId.isEmpty()) {
|
||||||
/*
|
/*
|
||||||
* this check causes the config comments to disappear somehow
|
* this check causes the config comments to disappear somehow
|
||||||
* I think due snake yaml limitations so as todo: write our own yaml parser?
|
* I think due snake yaml limitations so as todo: write our own yaml parser?
|
||||||
*/
|
*/
|
||||||
String genId = UUID.randomUUID().toString();
|
String genId = UUID.randomUUID().toString();
|
||||||
getLogger().info("Generated server id " + genId + " and saving it to config.");
|
getLogger().info("Generated server id " + genId + " and saving it to config.");
|
||||||
configuration.set("server-id", genId);
|
configuration.set("server-id", genId);
|
||||||
@ -482,17 +493,14 @@ public final class RedisBungee extends Plugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FutureTask<Void> task2 = new FutureTask<>(new Callable<Void>() {
|
FutureTask<Void> task2 = new FutureTask<>(() -> {
|
||||||
@Override
|
httpClient = new OkHttpClient();
|
||||||
public Void call() throws Exception {
|
Dispatcher dispatcher = new Dispatcher(getExecutorService());
|
||||||
httpClient = new OkHttpClient();
|
httpClient.setDispatcher(dispatcher);
|
||||||
Dispatcher dispatcher = new Dispatcher(getExecutorService());
|
NameFetcher.setHttpClient(httpClient);
|
||||||
httpClient.setDispatcher(dispatcher);
|
UUIDFetcher.setHttpClient(httpClient);
|
||||||
NameFetcher.setHttpClient(httpClient);
|
RedisBungee.getPluginInstance().configuration = new RedisBungeeConfiguration(RedisBungee.this.getPool(), configuration, randomUUID);
|
||||||
UUIDFetcher.setHttpClient(httpClient);
|
return null;
|
||||||
RedisBungee.configuration = new RedisBungeeConfiguration(RedisBungee.this.getPool(), configuration, randomUUID);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
getProxy().getScheduler().runAsync(this, task2);
|
getProxy().getScheduler().runAsync(this, task2);
|
||||||
@ -518,7 +526,7 @@ public final class RedisBungee extends Plugin {
|
|||||||
class PubSubListener implements Runnable {
|
class PubSubListener implements Runnable {
|
||||||
private JedisPubSubHandler jpsh;
|
private JedisPubSubHandler jpsh;
|
||||||
|
|
||||||
private Set<String> addedChannels = new HashSet<String>();
|
private final Set<String> addedChannels = new HashSet<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -537,10 +545,12 @@ public final class RedisBungee extends Plugin {
|
|||||||
try {
|
try {
|
||||||
jpsh.unsubscribe();
|
jpsh.unsubscribe();
|
||||||
} catch (Exception e1) {
|
} catch (Exception e1) {
|
||||||
|
|
||||||
/* This may fail with
|
/* This may fail with
|
||||||
- java.net.SocketException: Broken pipe
|
- java.net.SocketException: Broken pipe
|
||||||
- redis.clients.jedis.exceptions.JedisConnectionException: JedisPubSub was not subscribed to a Jedis instance
|
- redis.clients.jedis.exceptions.JedisConnectionException: JedisPubSub was not subscribed to a Jedis instance
|
||||||
*/
|
*/
|
||||||
|
getLogger().warning("redis connection broken!");
|
||||||
}
|
}
|
||||||
broken = true;
|
broken = true;
|
||||||
}
|
}
|
||||||
@ -560,7 +570,7 @@ public final class RedisBungee extends Plugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void removeChannel(String... channel) {
|
public void removeChannel(String... channel) {
|
||||||
addedChannels.removeAll(Arrays.asList(channel));
|
Arrays.asList(channel).forEach(addedChannels::remove);
|
||||||
jpsh.unsubscribe(channel);
|
jpsh.unsubscribe(channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -574,12 +584,7 @@ public final class RedisBungee extends Plugin {
|
|||||||
@Override
|
@Override
|
||||||
public void onMessage(final String s, final String s2) {
|
public void onMessage(final String s, final String s2) {
|
||||||
if (s2.trim().length() == 0) return;
|
if (s2.trim().length() == 0) return;
|
||||||
getProxy().getScheduler().runAsync(RedisBungee.this, new Runnable() {
|
getProxy().getScheduler().runAsync(RedisBungee.this, () -> getProxy().getPluginManager().callEvent(new PubSubMessageEvent(s, s2)));
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
getProxy().getPluginManager().callEvent(new PubSubMessageEvent(s, s2));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ public class RedisBungeeAPI {
|
|||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
this.reservedChannels = ImmutableList.of(
|
this.reservedChannels = ImmutableList.of(
|
||||||
"redisbungee-allservers",
|
"redisbungee-allservers",
|
||||||
"redisbungee-" + RedisBungee.getConfiguration().getServerId(),
|
"redisbungee-" + getServerId(),
|
||||||
"redisbungee-data"
|
"redisbungee-data"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -192,7 +192,7 @@ public class RedisBungeeAPI {
|
|||||||
* @since 0.2.5
|
* @since 0.2.5
|
||||||
*/
|
*/
|
||||||
public final String getServerId() {
|
public final String getServerId() {
|
||||||
return RedisBungee.getConfiguration().getServerId();
|
return plugin.getConfiguration().getServerId();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -213,7 +213,7 @@ public class RedisBungeeAPI {
|
|||||||
* @since 0.3
|
* @since 0.3
|
||||||
*/
|
*/
|
||||||
public final void registerPubSubChannels(String... channels) {
|
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");
|
Preconditions.checkArgument(!reservedChannels.contains(channel), "attempting to unregister internal channel");
|
||||||
}
|
}
|
||||||
|
|
||||||
RedisBungee.getPubSubListener().removeChannel(channels);
|
plugin.getPubSubListener().removeChannel(channels);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,35 +48,32 @@ class RedisBungeeCommands {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(final CommandSender sender, final String[] args) {
|
public void execute(final CommandSender sender, final String[] args) {
|
||||||
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() {
|
plugin.getProxy().getScheduler().runAsync(plugin, () -> {
|
||||||
@Override
|
int count = plugin.getRedisBungeeAPI().getPlayerCount();
|
||||||
public void run() {
|
BaseComponent[] playersOnline = new ComponentBuilder("").color(ChatColor.YELLOW)
|
||||||
int count = RedisBungee.getApi().getPlayerCount();
|
.append(playerPlural(count) + " currently online.").create();
|
||||||
BaseComponent[] playersOnline = new ComponentBuilder("").color(ChatColor.YELLOW)
|
if (args.length > 0 && args[0].equals("showall")) {
|
||||||
.append(playerPlural(count) + " currently online.").create();
|
Multimap<String, UUID> serverToPlayers = plugin.getRedisBungeeAPI().getServerToPlayers();
|
||||||
if (args.length > 0 && args[0].equals("showall")) {
|
Multimap<String, String> human = HashMultimap.create();
|
||||||
Multimap<String, UUID> serverToPlayers = RedisBungee.getApi().getServerToPlayers();
|
for (Map.Entry<String, UUID> entry : serverToPlayers.entries()) {
|
||||||
Multimap<String, String> human = HashMultimap.create();
|
human.put(entry.getKey(), plugin.getUuidTranslator().getNameFromUuid(entry.getValue(), false));
|
||||||
for (Map.Entry<String, UUID> 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());
|
|
||||||
}
|
}
|
||||||
|
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
|
@Override
|
||||||
public void execute(final CommandSender sender, final String[] args) {
|
public void execute(final CommandSender sender, final String[] args) {
|
||||||
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() {
|
plugin.getProxy().getScheduler().runAsync(plugin, () -> {
|
||||||
@Override
|
if (args.length > 0) {
|
||||||
public void run() {
|
UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true);
|
||||||
if (args.length > 0) {
|
if (uuid == null) {
|
||||||
UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true);
|
sender.sendMessage(PLAYER_NOT_FOUND);
|
||||||
if (uuid == null) {
|
return;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
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
|
@Override
|
||||||
public void execute(final CommandSender sender, final String[] args) {
|
public void execute(final CommandSender sender, final String[] args) {
|
||||||
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() {
|
plugin.getProxy().getScheduler().runAsync(plugin, () -> {
|
||||||
@Override
|
if (args.length > 0) {
|
||||||
public void run() {
|
UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true);
|
||||||
if (args.length > 0) {
|
if (uuid == null) {
|
||||||
UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true);
|
sender.sendMessage(PLAYER_NOT_FOUND);
|
||||||
if (uuid == null) {
|
return;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
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
|
@Override
|
||||||
public void execute(final CommandSender sender, final String[] args) {
|
public void execute(final CommandSender sender, final String[] args) {
|
||||||
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() {
|
plugin.getProxy().getScheduler().runAsync(plugin, () -> {
|
||||||
@Override
|
if (args.length > 0) {
|
||||||
public void run() {
|
UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true);
|
||||||
if (args.length > 0) {
|
if (uuid == null) {
|
||||||
UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true);
|
sender.sendMessage(PLAYER_NOT_FOUND);
|
||||||
if (uuid == null) {
|
return;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
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 {
|
public static class PlayerProxyCommand extends Command {
|
||||||
private final RedisBungee plugin;
|
private final RedisBungee plugin;
|
||||||
|
|
||||||
PlayerProxyCommand(RedisBungee plugin) {
|
PlayerProxyCommand(RedisBungee plugin) {
|
||||||
super("pproxy", "redisbungee.command.pproxy");
|
super("pproxy", "redisbungee.command.pproxy");
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(final CommandSender sender, final String[] args) {
|
public void execute(final CommandSender sender, final String[] args) {
|
||||||
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() {
|
plugin.getProxy().getScheduler().runAsync(plugin, () -> {
|
||||||
@Override
|
if (args.length > 0) {
|
||||||
public void run() {
|
UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true);
|
||||||
if (args.length > 0) {
|
if (uuid == null) {
|
||||||
UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true);
|
sender.sendMessage(PLAYER_NOT_FOUND);
|
||||||
if (uuid == null) {
|
return;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
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 {
|
public static class SendToAll extends Command {
|
||||||
|
|
||||||
private final RedisBungee plugin;
|
private final RedisBungee plugin;
|
||||||
|
|
||||||
SendToAll(RedisBungee plugin) {
|
SendToAll(RedisBungee plugin) {
|
||||||
super("sendtoall", "redisbungee.command.sendtoall", "rsendtoall");
|
super("sendtoall", "redisbungee.command.sendtoall", "rsendtoall");
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
}
|
}
|
||||||
@ -242,7 +228,7 @@ class RedisBungeeCommands {
|
|||||||
public void execute(CommandSender sender, String[] args) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
if (args.length > 0) {
|
if (args.length > 0) {
|
||||||
String command = Joiner.on(" ").skipNulls().join(args);
|
String command = Joiner.on(" ").skipNulls().join(args);
|
||||||
RedisBungee.getApi().sendProxyCommand(command);
|
plugin.getRedisBungeeAPI().sendProxyCommand(command);
|
||||||
TextComponent message = new TextComponent();
|
TextComponent message = new TextComponent();
|
||||||
message.setColor(ChatColor.GREEN);
|
message.setColor(ChatColor.GREEN);
|
||||||
message.setText("Sent the command /" + command + " to all proxies.");
|
message.setText("Sent the command /" + command + " to all proxies.");
|
||||||
@ -256,7 +242,7 @@ class RedisBungeeCommands {
|
|||||||
public static class ServerId extends Command {
|
public static class ServerId extends Command {
|
||||||
private final RedisBungee plugin;
|
private final RedisBungee plugin;
|
||||||
|
|
||||||
ServerId(RedisBungee plugin) {
|
ServerId(RedisBungee plugin) {
|
||||||
super("serverid", "redisbungee.command.serverid", "rserverid");
|
super("serverid", "redisbungee.command.serverid", "rserverid");
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
}
|
}
|
||||||
@ -264,21 +250,23 @@ class RedisBungeeCommands {
|
|||||||
@Override
|
@Override
|
||||||
public void execute(CommandSender sender, String[] args) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
TextComponent textComponent = new TextComponent();
|
TextComponent textComponent = new TextComponent();
|
||||||
textComponent.setText("You are on " + RedisBungee.getApi().getServerId() + ".");
|
textComponent.setText("You are on " + plugin.getRedisBungeeAPI().getServerId() + ".");
|
||||||
textComponent.setColor(ChatColor.YELLOW);
|
textComponent.setColor(ChatColor.YELLOW);
|
||||||
sender.sendMessage(textComponent);
|
sender.sendMessage(textComponent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ServerIds extends Command {
|
public static class ServerIds extends Command {
|
||||||
public ServerIds() {
|
private final RedisBungee plugin;
|
||||||
|
ServerIds(RedisBungee plugin) {
|
||||||
super("serverids", "redisbungee.command.serverids");
|
super("serverids", "redisbungee.command.serverids");
|
||||||
|
this.plugin = plugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(CommandSender sender, String[] strings) {
|
public void execute(CommandSender sender, String[] strings) {
|
||||||
TextComponent textComponent = new TextComponent();
|
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);
|
textComponent.setColor(ChatColor.YELLOW);
|
||||||
sender.sendMessage(textComponent);
|
sender.sendMessage(textComponent);
|
||||||
}
|
}
|
||||||
@ -294,42 +282,39 @@ class RedisBungeeCommands {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(final CommandSender sender, final String[] args) {
|
public void execute(final CommandSender sender, final String[] args) {
|
||||||
plugin.getProxy().getScheduler().runAsync(plugin, new Runnable() {
|
plugin.getProxy().getScheduler().runAsync(plugin, () -> {
|
||||||
@Override
|
String proxy = args.length >= 1 ? args[0] : plugin.getConfiguration().getServerId();
|
||||||
public void run() {
|
if (!plugin.getServerIds().contains(proxy)) {
|
||||||
String proxy = args.length >= 1 ? args[0] : RedisBungee.getConfiguration().getServerId();
|
sender.sendMessage(new ComponentBuilder(proxy + " is not a valid proxy. See /serverids for valid proxies.").color(ChatColor.RED).create());
|
||||||
if (!plugin.getServerIds().contains(proxy)) {
|
return;
|
||||||
sender.sendMessage(new ComponentBuilder(proxy + " is not a valid proxy. See /serverids for valid proxies.").color(ChatColor.RED).create());
|
}
|
||||||
return;
|
Set<UUID> players = plugin.getRedisBungeeAPI().getPlayersOnProxy(proxy);
|
||||||
}
|
BaseComponent[] playersOnline = new ComponentBuilder("").color(ChatColor.YELLOW)
|
||||||
Set<UUID> players = RedisBungee.getApi().getPlayersOnProxy(proxy);
|
.append(playerPlural(players.size()) + " currently on proxy " + proxy + ".").create();
|
||||||
BaseComponent[] playersOnline = new ComponentBuilder("").color(ChatColor.YELLOW)
|
if (args.length >= 2 && args[1].equals("showall")) {
|
||||||
.append(playerPlural(players.size()) + " currently on proxy " + proxy + ".").create();
|
Multimap<String, UUID> serverToPlayers = plugin.getRedisBungeeAPI().getServerToPlayers();
|
||||||
if (args.length >= 2 && args[1].equals("showall")) {
|
Multimap<String, String> human = HashMultimap.create();
|
||||||
Multimap<String, UUID> serverToPlayers = RedisBungee.getApi().getServerToPlayers();
|
for (Map.Entry<String, UUID> entry : serverToPlayers.entries()) {
|
||||||
Multimap<String, String> human = HashMultimap.create();
|
if (players.contains(entry.getValue())) {
|
||||||
for (Map.Entry<String, UUID> entry : serverToPlayers.entries()) {
|
human.put(entry.getKey(), plugin.getUuidTranslator().getNameFromUuid(entry.getValue(), false));
|
||||||
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());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -145,7 +145,7 @@ public class RedisBungeeListener implements Listener {
|
|||||||
event.getResponse().getPlayers().setOnline(plugin.getCount());
|
event.getResponse().getPlayers().setOnline(plugin.getCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("UnstableApiUsage")
|
@SuppressWarnings({"UnstableApiUsage", "null"})
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPluginMessage(final PluginMessageEvent event) {
|
public void onPluginMessage(final PluginMessageEvent event) {
|
||||||
if ((event.getTag().equals("legacy:redisbungee") || event.getTag().equals("RedisBungee")) && event.getSender() instanceof Server) {
|
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();
|
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||||
String type;
|
String type;
|
||||||
|
|
||||||
|
UUID uuid;
|
||||||
switch (subchannel) {
|
switch (subchannel) {
|
||||||
case "PlayerList":
|
case "PlayerList":
|
||||||
out.writeUTF("PlayerList");
|
out.writeUTF("PlayerList");
|
||||||
@ -168,13 +169,12 @@ public class RedisBungeeListener implements Listener {
|
|||||||
original = plugin.getPlayers();
|
original = plugin.getPlayers();
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
original = RedisBungee.getApi().getPlayersOnServer(type);
|
original = plugin.getRedisBungeeAPI().getPlayersOnServer(type);
|
||||||
} catch (IllegalArgumentException ignored) {
|
} catch (IllegalArgumentException ignored) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Set<String> players = new HashSet<>();
|
Set<String> players = new HashSet<>();
|
||||||
for (UUID uuid : original)
|
original.forEach((u -> players.add(plugin.getUuidTranslator().getNameFromUuid(u, false))));
|
||||||
players.add(plugin.getUuidTranslator().getNameFromUuid(uuid, false));
|
|
||||||
out.writeUTF(Joiner.on(',').join(players));
|
out.writeUTF(Joiner.on(',').join(players));
|
||||||
break;
|
break;
|
||||||
case "PlayerCount":
|
case "PlayerCount":
|
||||||
@ -196,7 +196,9 @@ public class RedisBungeeListener implements Listener {
|
|||||||
String user = in.readUTF();
|
String user = in.readUTF();
|
||||||
out.writeUTF("LastOnline");
|
out.writeUTF("LastOnline");
|
||||||
out.writeUTF(user);
|
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;
|
break;
|
||||||
case "ServerPlayers":
|
case "ServerPlayers":
|
||||||
String type1 = in.readUTF();
|
String type1 = in.readUTF();
|
||||||
@ -231,13 +233,15 @@ public class RedisBungeeListener implements Listener {
|
|||||||
break;
|
break;
|
||||||
case "Proxy":
|
case "Proxy":
|
||||||
out.writeUTF("Proxy");
|
out.writeUTF("Proxy");
|
||||||
out.writeUTF(RedisBungee.getConfiguration().getServerId());
|
out.writeUTF(plugin.getConfiguration().getServerId());
|
||||||
break;
|
break;
|
||||||
case "PlayerProxy":
|
case "PlayerProxy":
|
||||||
String username = in.readUTF();
|
String username = in.readUTF();
|
||||||
out.writeUTF("PlayerProxy");
|
out.writeUTF("PlayerProxy");
|
||||||
out.writeUTF(username);
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
|
@ -25,13 +25,13 @@ public class RedisUtil {
|
|||||||
Map<String, String> playerData = new HashMap<>(4);
|
Map<String, String> playerData = new HashMap<>(4);
|
||||||
playerData.put("online", "0");
|
playerData.put("online", "0");
|
||||||
playerData.put("ip", connection.getAddress().getAddress().getHostAddress());
|
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.sadd("proxy:" + RedisBungee.getApi().getServerId() + ":usersOnline", connection.getUniqueId().toString());
|
||||||
pipeline.hmset("player:" + connection.getUniqueId().toString(), playerData);
|
pipeline.hmset("player:" + connection.getUniqueId().toString(), playerData);
|
||||||
|
|
||||||
if (fireEvent) {
|
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,
|
connection.getUniqueId(), DataManager.DataManagerMessage.Action.JOIN,
|
||||||
new DataManager.LoginPayload(connection.getAddress().getAddress()))));
|
new DataManager.LoginPayload(connection.getAddress().getAddress()))));
|
||||||
}
|
}
|
||||||
@ -57,7 +57,12 @@ public class RedisUtil {
|
|||||||
new DataManager.LogoutPayload(timestamp))));
|
new DataManager.LogoutPayload(timestamp))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public static boolean canUseLua(String redisVersion) {
|
public static boolean canUseLua(String redisVersion) {
|
||||||
|
return isRedisVersionSupported(redisVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isRedisVersionSupported(String redisVersion) {
|
||||||
// Need to use >=6.2 to use Lua optimizations.
|
// Need to use >=6.2 to use Lua optimizations.
|
||||||
String[] args = redisVersion.split("\\.");
|
String[] args = redisVersion.split("\\.");
|
||||||
if (args.length < 2) {
|
if (args.length < 2) {
|
||||||
|
@ -29,6 +29,7 @@ public class NameFetcher {
|
|||||||
|
|
||||||
Type listType = new TypeToken<List<Name>>() {
|
Type listType = new TypeToken<List<Name>>() {
|
||||||
}.getType();
|
}.getType();
|
||||||
|
|
||||||
List<Name> names = RedisBungee.getGson().fromJson(response, listType);
|
List<Name> names = RedisBungee.getGson().fromJson(response, listType);
|
||||||
|
|
||||||
List<String> humanNames = new ArrayList<>();
|
List<String> humanNames = new ArrayList<>();
|
||||||
|
@ -74,7 +74,7 @@ public final class UUIDTranslator {
|
|||||||
String stored = jedis.hget("uuid-cache", player.toLowerCase());
|
String stored = jedis.hget("uuid-cache", player.toLowerCase());
|
||||||
if (stored != null) {
|
if (stored != null) {
|
||||||
// Found an entry value. Deserialize it.
|
// 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:
|
// Check for expiry:
|
||||||
if (entry.expired()) {
|
if (entry.expired()) {
|
||||||
@ -132,7 +132,7 @@ public final class UUIDTranslator {
|
|||||||
String stored = jedis.hget("uuid-cache", player.toString());
|
String stored = jedis.hget("uuid-cache", player.toString());
|
||||||
if (stored != null) {
|
if (stored != null) {
|
||||||
// Found an entry value. Deserialize it.
|
// 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:
|
// Check for expiry:
|
||||||
if (entry.expired()) {
|
if (entry.expired()) {
|
||||||
@ -186,7 +186,7 @@ public final class UUIDTranslator {
|
|||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Getter
|
@Getter
|
||||||
private class CachedUUIDEntry {
|
private static class CachedUUIDEntry {
|
||||||
private final String name;
|
private final String name;
|
||||||
private final UUID uuid;
|
private final UUID uuid;
|
||||||
private final Calendar expiry;
|
private final Calendar expiry;
|
||||||
|
@ -6,15 +6,15 @@ import org.junit.Test;
|
|||||||
|
|
||||||
public class RedisUtilTest {
|
public class RedisUtilTest {
|
||||||
@Test
|
@Test
|
||||||
public void testRedisLuaCheck() {
|
public void testRedisVersion() {
|
||||||
Assert.assertTrue(RedisUtil.canUseLua("6.2.0"));
|
Assert.assertTrue(RedisUtil.isRedisVersionSupported("6.2.0"));
|
||||||
Assert.assertFalse(RedisUtil.canUseLua("6.1.0"));
|
Assert.assertFalse(RedisUtil.isRedisVersionSupported(("6.1.0")));
|
||||||
Assert.assertFalse(RedisUtil.canUseLua("6.0.0"));
|
Assert.assertFalse(RedisUtil.isRedisVersionSupported(("6.0.0")));
|
||||||
Assert.assertFalse(RedisUtil.canUseLua("2.6.0"));
|
Assert.assertFalse(RedisUtil.isRedisVersionSupported(("2.6.0")));
|
||||||
Assert.assertFalse(RedisUtil.canUseLua("2.2.12"));
|
Assert.assertFalse(RedisUtil.isRedisVersionSupported(("2.2.12")));
|
||||||
Assert.assertFalse(RedisUtil.canUseLua("1.2.4"));
|
Assert.assertFalse(RedisUtil.isRedisVersionSupported(("1.2.4")));
|
||||||
Assert.assertFalse(RedisUtil.canUseLua("2.8.4"));
|
Assert.assertFalse(RedisUtil.isRedisVersionSupported(("2.8.4")));
|
||||||
Assert.assertFalse(RedisUtil.canUseLua("3.0.0"));
|
Assert.assertFalse(RedisUtil.isRedisVersionSupported(("3.0.0")));
|
||||||
Assert.assertFalse(RedisUtil.canUseLua("3.2.1"));
|
Assert.assertFalse(RedisUtil.isRedisVersionSupported(("3.2.1")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,8 +12,8 @@ import java.util.Map;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class UUIDNameTest {
|
public class UUIDNameTest {
|
||||||
private String[] uuidsToTest = {"68ec43f7234b41b48764dfb38b9ffe8c", "652a2bc4e8cd405db7b698156ee2dc09"};
|
private final String[] uuidsToTest = {"68ec43f7234b41b48764dfb38b9ffe8c", "652a2bc4e8cd405db7b698156ee2dc09"};
|
||||||
private String[] namesToTest = {"vemacs"};
|
private final String[] namesToTest = {"vemacs"};
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUuidToName() throws IOException {
|
public void testUuidToName() throws IOException {
|
||||||
@ -27,7 +27,7 @@ public class UUIDNameTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNameToUuid() throws IOException {
|
public void testNameToUuid() {
|
||||||
OkHttpClient httpClient = new OkHttpClient();
|
OkHttpClient httpClient = new OkHttpClient();
|
||||||
UUIDFetcher.setHttpClient(httpClient);
|
UUIDFetcher.setHttpClient(httpClient);
|
||||||
for (String name : namesToTest) {
|
for (String name : namesToTest) {
|
||||||
|
Loading…
Reference in New Issue
Block a user