2
0
mirror of https://github.com/proxiodev/RedisBungee.git synced 2025-04-20 01:27:07 +00:00
This commit is contained in:
mohammed jasem alaajel 2021-06-25 07:06:48 +04:00
parent aeeb38f3c8
commit 4757a49bdc
10 changed files with 335 additions and 361 deletions

View File

@ -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,13 +62,10 @@ 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
public String call() throws Exception {
try (Jedis tmpRsc = plugin.getPool().getResource()) { try (Jedis tmpRsc = plugin.getPool().getResource()) {
return Objects.requireNonNull(tmpRsc.hget("player:" + uuid, "server"), "user not found"); return Objects.requireNonNull(tmpRsc.hget("player:" + uuid, "server"), "user not found");
} }
}
}); });
} catch (ExecutionException | UncheckedExecutionException e) { } catch (ExecutionException | UncheckedExecutionException e) {
if (e.getCause() instanceof NullPointerException && e.getCause().getMessage().equals("user not found")) if (e.getCause() instanceof NullPointerException && e.getCause().getMessage().equals("user not found"))
@ -81,16 +79,13 @@ 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
public String call() throws Exception {
try (Jedis tmpRsc = plugin.getPool().getResource()) { try (Jedis tmpRsc = plugin.getPool().getResource()) {
return Objects.requireNonNull(tmpRsc.hget("player:" + uuid, "proxy"), "user not found"); return Objects.requireNonNull(tmpRsc.hget("player:" + uuid, "proxy"), "user not found");
} }
}
}); });
} catch (ExecutionException | UncheckedExecutionException e) { } catch (ExecutionException | UncheckedExecutionException e) {
if (e.getCause() instanceof NullPointerException && e.getCause().getMessage().equals("user not found")) if (e.getCause() instanceof NullPointerException && e.getCause().getMessage().equals("user not found"))
@ -107,16 +102,13 @@ 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
public InetAddress call() throws Exception {
try (Jedis tmpRsc = plugin.getPool().getResource()) { try (Jedis tmpRsc = plugin.getPool().getResource()) {
String result = tmpRsc.hget("player:" + uuid, "ip"); String result = tmpRsc.hget("player:" + uuid, "ip");
if (result == null) if (result == null)
throw new NullPointerException("user not found"); throw new NullPointerException("user not found");
return InetAddresses.forString(result); return InetAddresses.forString(result);
} }
}
}); });
} catch (ExecutionException | UncheckedExecutionException e) { } catch (ExecutionException | UncheckedExecutionException e) {
if (e.getCause() instanceof NullPointerException && e.getCause().getMessage().equals("user not found")) if (e.getCause() instanceof NullPointerException && e.getCause().getMessage().equals("user not found"))
@ -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
public Long call() throws Exception {
try (Jedis tmpRsc = plugin.getPool().getResource()) { try (Jedis tmpRsc = plugin.getPool().getResource()) {
String result = tmpRsc.hget("player:" + uuid, "online"); String result = tmpRsc.hget("player:" + uuid, "online");
return result == null ? -1 : Long.valueOf(result); return result == null ? -1 : Long.parseLong(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;
} }
} }

View File

@ -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,12 +142,11 @@ 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;
@ -149,7 +161,6 @@ public final class RedisBungee extends Plugin {
} }
return builder.build(); 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 { }
getLogger().info("found a supported redis version: " + version);
LuaManager manager = new LuaManager(this); LuaManager manager = new LuaManager(this);
serverToPlayersScript = manager.createScript(IOUtil.readInputStreamAsString(getResourceAsStream("lua/server_to_players.lua"))); serverToPlayersScript = manager.createScript(IOUtil.readInputStreamAsString(getResourceAsStream("lua/server_to_players.lua")));
getPlayerCountScript = manager.createScript(IOUtil.readInputStreamAsString(getResourceAsStream("lua/get_player_count.lua"))); getPlayerCountScript = manager.createScript(IOUtil.readInputStreamAsString(getResourceAsStream("lua/get_player_count.lua")));
}
break; break;
} }
} }
@ -268,9 +284,7 @@ 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
public void run() {
try (Jedis rsc = pool.getResource()) { try (Jedis rsc = pool.getResource()) {
long redisTime = getRedisTime(rsc.time()); long redisTime = getRedisTime(rsc.time());
rsc.hset("heartbeats", configuration.getServerId(), String.valueOf(redisTime)); rsc.hset("heartbeats", configuration.getServerId(), String.valueOf(redisTime));
@ -285,7 +299,6 @@ public final class RedisBungee extends Plugin {
} catch (Throwable e) { } catch (Throwable e) {
getLogger().log(Level.SEVERE, "Unable to update data - did your Redis server go away?", 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);
if (configuration.isRegisterBungeeCommands()) { if (configuration.isRegisterBungeeCommands()) {
@ -296,18 +309,16 @@ 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
public void run() {
try (Jedis tmpRsc = pool.getResource()) { try (Jedis tmpRsc = pool.getResource()) {
Set<String> players = getLocalPlayersAsUuidStrings(); Set<String> players = getLocalPlayersAsUuidStrings();
Set<String> playersInRedis = tmpRsc.smembers("proxy:" + configuration.getServerId() + ":usersOnline"); Set<String> playersInRedis = tmpRsc.smembers("proxy:" + configuration.getServerId() + ":usersOnline");
@ -366,7 +377,6 @@ public final class RedisBungee extends Plugin {
} catch (Throwable e) { } catch (Throwable e) {
getLogger().log(Level.SEVERE, "Unable to fix up stored player data", e); getLogger().log(Level.SEVERE, "Unable to fix up stored player data", e);
} }
}
}, 0, 1, TimeUnit.MINUTES); }, 0, 1, TimeUnit.MINUTES);
} }
getProxy().registerChannel("legacy:redisbungee"); getProxy().registerChannel("legacy:redisbungee");
@ -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();
@ -482,17 +493,14 @@ public final class RedisBungee extends Plugin {
} }
} }
FutureTask<Void> task2 = new FutureTask<>(new Callable<Void>() { FutureTask<Void> task2 = new FutureTask<>(() -> {
@Override
public Void call() throws Exception {
httpClient = new OkHttpClient(); httpClient = new OkHttpClient();
Dispatcher dispatcher = new Dispatcher(getExecutorService()); Dispatcher dispatcher = new Dispatcher(getExecutorService());
httpClient.setDispatcher(dispatcher); httpClient.setDispatcher(dispatcher);
NameFetcher.setHttpClient(httpClient); NameFetcher.setHttpClient(httpClient);
UUIDFetcher.setHttpClient(httpClient); UUIDFetcher.setHttpClient(httpClient);
RedisBungee.configuration = new RedisBungeeConfiguration(RedisBungee.this.getPool(), configuration, randomUUID); RedisBungee.getPluginInstance().configuration = new RedisBungeeConfiguration(RedisBungee.this.getPool(), configuration, randomUUID);
return null; 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));
}
});
} }
} }
} }

View File

@ -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);
} }
/** /**

View File

@ -48,14 +48,12 @@ 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() {
int count = RedisBungee.getApi().getPlayerCount();
BaseComponent[] playersOnline = new ComponentBuilder("").color(ChatColor.YELLOW) BaseComponent[] playersOnline = new ComponentBuilder("").color(ChatColor.YELLOW)
.append(playerPlural(count) + " currently online.").create(); .append(playerPlural(count) + " currently online.").create();
if (args.length > 0 && args[0].equals("showall")) { if (args.length > 0 && args[0].equals("showall")) {
Multimap<String, UUID> serverToPlayers = RedisBungee.getApi().getServerToPlayers(); Multimap<String, UUID> serverToPlayers = plugin.getRedisBungeeAPI().getServerToPlayers();
Multimap<String, String> human = HashMultimap.create(); Multimap<String, String> human = HashMultimap.create();
for (Map.Entry<String, UUID> entry : serverToPlayers.entries()) { for (Map.Entry<String, UUID> entry : serverToPlayers.entries()) {
human.put(entry.getKey(), plugin.getUuidTranslator().getNameFromUuid(entry.getValue(), false)); human.put(entry.getKey(), plugin.getUuidTranslator().getNameFromUuid(entry.getValue(), false));
@ -77,7 +75,6 @@ class RedisBungeeCommands {
sender.sendMessage(playersOnline); sender.sendMessage(playersOnline);
sender.sendMessage(new ComponentBuilder("To see all players online, use /glist showall.").color(ChatColor.YELLOW).create()); sender.sendMessage(new ComponentBuilder("To see all players online, use /glist showall.").color(ChatColor.YELLOW).create());
} }
}
}); });
} }
} }
@ -92,16 +89,14 @@ 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
public void run() {
if (args.length > 0) { if (args.length > 0) {
UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true); UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true);
if (uuid == null) { if (uuid == null) {
sender.sendMessage(PLAYER_NOT_FOUND); sender.sendMessage(PLAYER_NOT_FOUND);
return; return;
} }
ServerInfo si = RedisBungee.getApi().getServerFor(uuid); ServerInfo si = plugin.getRedisBungeeAPI().getServerFor(uuid);
if (si != null) { if (si != null) {
TextComponent message = new TextComponent(); TextComponent message = new TextComponent();
message.setColor(ChatColor.BLUE); message.setColor(ChatColor.BLUE);
@ -113,7 +108,6 @@ class RedisBungeeCommands {
} else { } else {
sender.sendMessage(NO_PLAYER_SPECIFIED); sender.sendMessage(NO_PLAYER_SPECIFIED);
} }
}
}); });
} }
} }
@ -128,16 +122,14 @@ 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
public void run() {
if (args.length > 0) { if (args.length > 0) {
UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true); UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true);
if (uuid == null) { if (uuid == null) {
sender.sendMessage(PLAYER_NOT_FOUND); sender.sendMessage(PLAYER_NOT_FOUND);
return; return;
} }
long secs = RedisBungee.getApi().getLastOnline(uuid); long secs = plugin.getRedisBungeeAPI().getLastOnline(uuid);
TextComponent message = new TextComponent(); TextComponent message = new TextComponent();
if (secs == 0) { if (secs == 0) {
message.setColor(ChatColor.GREEN); message.setColor(ChatColor.GREEN);
@ -153,7 +145,6 @@ class RedisBungeeCommands {
} else { } else {
sender.sendMessage(NO_PLAYER_SPECIFIED); sender.sendMessage(NO_PLAYER_SPECIFIED);
} }
}
}); });
} }
} }
@ -168,20 +159,18 @@ 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
public void run() {
if (args.length > 0) { if (args.length > 0) {
UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true); UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true);
if (uuid == null) { if (uuid == null) {
sender.sendMessage(PLAYER_NOT_FOUND); sender.sendMessage(PLAYER_NOT_FOUND);
return; return;
} }
InetAddress ia = RedisBungee.getApi().getPlayerIp(uuid); InetAddress ia = plugin.getRedisBungeeAPI().getPlayerIp(uuid);
if (ia != null) { if (ia != null) {
TextComponent message = new TextComponent(); TextComponent message = new TextComponent();
message.setColor(ChatColor.GREEN); message.setColor(ChatColor.GREEN);
message.setText(args[0] + " is connected from " + ia.toString() + "."); message.setText(args[0] + " is connected from " + ia + ".");
sender.sendMessage(message); sender.sendMessage(message);
} else { } else {
sender.sendMessage(PLAYER_NOT_FOUND); sender.sendMessage(PLAYER_NOT_FOUND);
@ -189,7 +178,6 @@ class RedisBungeeCommands {
} else { } else {
sender.sendMessage(NO_PLAYER_SPECIFIED); sender.sendMessage(NO_PLAYER_SPECIFIED);
} }
}
}); });
} }
} }
@ -204,16 +192,14 @@ 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
public void run() {
if (args.length > 0) { if (args.length > 0) {
UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true); UUID uuid = plugin.getUuidTranslator().getTranslatedUuid(args[0], true);
if (uuid == null) { if (uuid == null) {
sender.sendMessage(PLAYER_NOT_FOUND); sender.sendMessage(PLAYER_NOT_FOUND);
return; return;
} }
String proxy = RedisBungee.getApi().getProxy(uuid); String proxy = plugin.getRedisBungeeAPI().getProxy(uuid);
if (proxy != null) { if (proxy != null) {
TextComponent message = new TextComponent(); TextComponent message = new TextComponent();
message.setColor(ChatColor.GREEN); message.setColor(ChatColor.GREEN);
@ -225,12 +211,12 @@ class RedisBungeeCommands {
} else { } else {
sender.sendMessage(NO_PLAYER_SPECIFIED); 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) {
@ -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.");
@ -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,19 +282,17 @@ 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() {
String proxy = args.length >= 1 ? args[0] : RedisBungee.getConfiguration().getServerId();
if (!plugin.getServerIds().contains(proxy)) { if (!plugin.getServerIds().contains(proxy)) {
sender.sendMessage(new ComponentBuilder(proxy + " is not a valid proxy. See /serverids for valid proxies.").color(ChatColor.RED).create()); sender.sendMessage(new ComponentBuilder(proxy + " is not a valid proxy. See /serverids for valid proxies.").color(ChatColor.RED).create());
return; return;
} }
Set<UUID> players = RedisBungee.getApi().getPlayersOnProxy(proxy); Set<UUID> players = plugin.getRedisBungeeAPI().getPlayersOnProxy(proxy);
BaseComponent[] playersOnline = new ComponentBuilder("").color(ChatColor.YELLOW) BaseComponent[] playersOnline = new ComponentBuilder("").color(ChatColor.YELLOW)
.append(playerPlural(players.size()) + " currently on proxy " + proxy + ".").create(); .append(playerPlural(players.size()) + " currently on proxy " + proxy + ".").create();
if (args.length >= 2 && args[1].equals("showall")) { if (args.length >= 2 && args[1].equals("showall")) {
Multimap<String, UUID> serverToPlayers = RedisBungee.getApi().getServerToPlayers(); Multimap<String, UUID> serverToPlayers = plugin.getRedisBungeeAPI().getServerToPlayers();
Multimap<String, String> human = HashMultimap.create(); Multimap<String, String> human = HashMultimap.create();
for (Map.Entry<String, UUID> entry : serverToPlayers.entries()) { for (Map.Entry<String, UUID> entry : serverToPlayers.entries()) {
if (players.contains(entry.getValue())) { if (players.contains(entry.getValue())) {
@ -330,7 +316,6 @@ class RedisBungeeCommands {
sender.sendMessage(playersOnline); sender.sendMessage(playersOnline);
sender.sendMessage(new ComponentBuilder("To see all players online, use /plist " + proxy + " showall.").color(ChatColor.YELLOW).create()); sender.sendMessage(new ComponentBuilder("To see all players online, use /plist " + proxy + " showall.").color(ChatColor.YELLOW).create());
} }
}
}); });
} }
} }

View File

@ -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;

View File

@ -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) {

View File

@ -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<>();

View File

@ -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;

View File

@ -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")));
} }
} }

View File

@ -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) {