diff --git a/RedisBungee-Velocity/pom.xml b/RedisBungee-Velocity/pom.xml
index 73ad06b..b96873f 100644
--- a/RedisBungee-Velocity/pom.xml
+++ b/RedisBungee-Velocity/pom.xml
@@ -12,8 +12,8 @@
RedisBungee-Velocity
- 8
- 8
+ 11
+ 11
@@ -48,8 +48,8 @@
maven-compiler-plugin
3.8.1
-
- 1.8
+
+ 11
@@ -130,7 +130,7 @@
com.velocitypowered
velocity-api
- 3.1.0
+ 3.1.2-SNAPSHOT
jar
provided
diff --git a/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommandSource.java b/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommandSource.java
index f843028..c0e8d29 100644
--- a/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommandSource.java
+++ b/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeCommandSource.java
@@ -4,13 +4,10 @@ package com.imaginarycode.minecraft.redisbungee;
import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.permission.Tristate;
import net.kyori.adventure.permission.PermissionChecker;
-import net.kyori.adventure.util.TriState;
-
-import java.util.Collection;
-import java.util.Collections;
public class RedisBungeeCommandSource implements CommandSource {
private static final RedisBungeeCommandSource singleton;
+ private final PermissionChecker permissionChecker = PermissionChecker.always(net.kyori.adventure.util.TriState.TRUE);
static {
singleton = new RedisBungeeCommandSource();
@@ -23,16 +20,16 @@ public class RedisBungeeCommandSource implements CommandSource {
@Override
public boolean hasPermission(String permission) {
- return true;
+ return this.permissionChecker.test(permission);
}
@Override
public Tristate getPermissionValue(String s) {
- return null;
+ return Tristate.TRUE;
}
@Override
public PermissionChecker getPermissionChecker() {
- return PermissionChecker.always(TriState.TRUE);
+ return this.permissionChecker;
}
}
diff --git a/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeVelocityListener.java b/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeVelocityListener.java
index 1d8fb44..4119e73 100644
--- a/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeVelocityListener.java
+++ b/RedisBungee-Velocity/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeVelocityListener.java
@@ -20,21 +20,23 @@ import com.velocitypowered.api.event.connection.DisconnectEvent;
import com.velocitypowered.api.event.connection.LoginEvent;
import com.velocitypowered.api.event.connection.PluginMessageEvent;
import com.velocitypowered.api.event.connection.PostLoginEvent;
+import com.velocitypowered.api.event.connection.PluginMessageEvent.ForwardResult;
import com.velocitypowered.api.event.player.ServerConnectedEvent;
import com.velocitypowered.api.event.proxy.ProxyPingEvent;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ServerConnection;
-import com.velocitypowered.api.proxy.messages.LegacyChannelIdentifier;
import com.velocitypowered.api.proxy.server.ServerPing;
-import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import java.net.InetAddress;
import java.util.*;
+import java.util.stream.Collectors;
public class RedisBungeeVelocityListener extends AbstractRedisBungeeListener {
-
+ // Some messages are using legacy characters
+ private final LegacyComponentSerializer serializer = LegacyComponentSerializer.legacySection();
public RedisBungeeVelocityListener(RedisBungeePlugin> plugin, List exemptAddresses) {
super(plugin, exemptAddresses);
@@ -56,14 +58,14 @@ public class RedisBungeeVelocityListener extends AbstractRedisBungeeListener list = oldPing.getPlayers().map(ServerPing.Players::getSample).orElse(Collections.emptyList());
- event.setPing(new ServerPing(oldPing.getVersion(), new ServerPing.Players(plugin.getCount(), max, list), oldPing.getDescriptionComponent(), oldPing.getFavicon().orElse(null)));
+ ServerPing.Builder ping = event.getPing().asBuilder();
+ ping.onlinePlayers(plugin.getCount());
+ event.setPing(ping.build());
}
@Override
- @SuppressWarnings("UnstableApiUsage")
@Subscribe
public void onPluginMessage(PluginMessageEvent event) {
- if ((event.getIdentifier().getId().equals("legacy:redisbungee") || event.getIdentifier().getId().equals("RedisBungee")) && event.getSource() instanceof ServerConnection) {
- final String currentChannel = event.getIdentifier().getId();
- final byte[] data = Arrays.copyOf(event.getData(), event.getData().length);
- plugin.executeAsync(() -> {
- ByteArrayDataInput in = ByteStreams.newDataInput(data);
-
- String subchannel = in.readUTF();
- ByteArrayDataOutput out = ByteStreams.newDataOutput();
- String type;
-
- switch (subchannel) {
- case "PlayerList":
- out.writeUTF("PlayerList");
- Set original = Collections.emptySet();
- type = in.readUTF();
- if (type.equals("ALL")) {
- out.writeUTF("ALL");
- original = plugin.getPlayers();
- } else {
- try {
- original = plugin.getApi().getPlayersOnServer(type);
- } catch (IllegalArgumentException ignored) {
- }
- }
- Set players = new HashSet<>();
- for (UUID uuid : original)
- players.add(plugin.getUuidTranslator().getNameFromUuid(uuid, false));
- out.writeUTF(Joiner.on(',').join(players));
- break;
- case "PlayerCount":
- out.writeUTF("PlayerCount");
- type = in.readUTF();
- if (type.equals("ALL")) {
- out.writeUTF("ALL");
- out.writeInt(plugin.getCount());
- } else {
- out.writeUTF(type);
- try {
- out.writeInt(plugin.getApi().getPlayersOnServer(type).size());
- } catch (IllegalArgumentException e) {
- out.writeInt(0);
- }
- }
- break;
- case "LastOnline":
- String user = in.readUTF();
- out.writeUTF("LastOnline");
- out.writeUTF(user);
- out.writeLong(plugin.getApi().getLastOnline(Objects.requireNonNull(plugin.getUuidTranslator().getTranslatedUuid(user, true))));
- break;
- case "ServerPlayers":
- String type1 = in.readUTF();
- out.writeUTF("ServerPlayers");
- Multimap multimap = plugin.getApi().getServerToPlayers();
-
- boolean includesUsers;
-
- switch (type1) {
- case "COUNT":
- includesUsers = false;
- break;
- case "PLAYERS":
- includesUsers = true;
- break;
- default:
- // TODO: Should I raise an error?
- return;
- }
-
- out.writeUTF(type1);
-
- if (includesUsers) {
- Multimap human = HashMultimap.create();
- for (Map.Entry entry : multimap.entries()) {
- human.put(entry.getKey(), plugin.getUuidTranslator().getNameFromUuid(entry.getValue(), false));
- }
- serializeMultimap(human, true, out);
- } else {
- serializeMultiset(multimap.keys(), out);
- }
- break;
- case "Proxy":
- out.writeUTF("Proxy");
- out.writeUTF(plugin.getConfiguration().getServerId());
- break;
- case "PlayerProxy":
- String username = in.readUTF();
- out.writeUTF("PlayerProxy");
- out.writeUTF(username);
- out.writeUTF(plugin.getApi().getProxy(Objects.requireNonNull(plugin.getUuidTranslator().getTranslatedUuid(username, true))));
- break;
- default:
- return;
- }
-
- ((ServerConnection) event.getSource()).sendPluginMessage(new LegacyChannelIdentifier(currentChannel), out.toByteArray());
- });
+ if(!(event.getSource() instanceof ServerConnection) || !RedisBungeeVelocityPlugin.IDENTIFIERS.contains(event.getIdentifier())) {
+ return;
}
+
+ event.setResult(ForwardResult.handled());
+
+ plugin.executeAsync(() -> {
+ ByteArrayDataInput in = event.dataAsDataStream();
+
+ String subchannel = in.readUTF();
+ ByteArrayDataOutput out = ByteStreams.newDataOutput();
+ String type;
+
+ switch (subchannel) {
+ case "PlayerList":
+ out.writeUTF("PlayerList");
+ Set original = Collections.emptySet();
+ type = in.readUTF();
+ if (type.equals("ALL")) {
+ out.writeUTF("ALL");
+ original = plugin.getPlayers();
+ } else {
+ try {
+ original = plugin.getApi().getPlayersOnServer(type);
+ } catch (IllegalArgumentException ignored) {
+ }
+ }
+ Set players = original.stream()
+ .map(uuid -> plugin.getUuidTranslator().getNameFromUuid(uuid, false))
+ .collect(Collectors.toSet());
+ out.writeUTF(Joiner.on(',').join(players));
+ break;
+ case "PlayerCount":
+ out.writeUTF("PlayerCount");
+ type = in.readUTF();
+ if (type.equals("ALL")) {
+ out.writeUTF("ALL");
+ out.writeInt(plugin.getCount());
+ } else {
+ out.writeUTF(type);
+ try {
+ out.writeInt(plugin.getApi().getPlayersOnServer(type).size());
+ } catch (IllegalArgumentException e) {
+ out.writeInt(0);
+ }
+ }
+ break;
+ case "LastOnline":
+ String user = in.readUTF();
+ out.writeUTF("LastOnline");
+ out.writeUTF(user);
+ out.writeLong(plugin.getApi().getLastOnline(Objects.requireNonNull(plugin.getUuidTranslator().getTranslatedUuid(user, true))));
+ break;
+ case "ServerPlayers":
+ String type1 = in.readUTF();
+ out.writeUTF("ServerPlayers");
+ Multimap multimap = plugin.getApi().getServerToPlayers();
+
+ boolean includesUsers;
+
+ switch (type1) {
+ case "COUNT":
+ includesUsers = false;
+ break;
+ case "PLAYERS":
+ includesUsers = true;
+ break;
+ default:
+ // TODO: Should I raise an error?
+ return;
+ }
+
+ out.writeUTF(type1);
+
+ if (includesUsers) {
+ Multimap human = HashMultimap.create();
+ for (Map.Entry entry : multimap.entries()) {
+ human.put(entry.getKey(), plugin.getUuidTranslator().getNameFromUuid(entry.getValue(), false));
+ }
+ serializeMultimap(human, true, out);
+ } else {
+ serializeMultiset(multimap.keys(), out);
+ }
+ break;
+ case "Proxy":
+ out.writeUTF("Proxy");
+ out.writeUTF(plugin.getConfiguration().getServerId());
+ break;
+ case "PlayerProxy":
+ String username = in.readUTF();
+ out.writeUTF("PlayerProxy");
+ out.writeUTF(username);
+ out.writeUTF(plugin.getApi().getProxy(Objects.requireNonNull(plugin.getUuidTranslator().getTranslatedUuid(username, true))));
+ break;
+ default:
+ return;
+ }
+
+ ((ServerConnection) event.getSource()).sendPluginMessage(event.getIdentifier(), out.toByteArray());
+ });
+
}
@@ -255,7 +258,7 @@ public class RedisBungeeVelocityListener extends AbstractRedisBungeeListener {
private final ProxyServer server;
private final Logger logger;
- private final File dataFolder;
+ private final Path dataFolder;
private final RedisBungeeAPI api;
private final PubSubListener psl;
private JedisSummoner jedisSummoner;
@@ -73,6 +75,10 @@ public class RedisBungeeVelocityPlugin implements RedisBungeePlugin {
private LuaManager.Script getPlayerCountScript;
private static final Object SERVER_TO_PLAYERS_KEY = new Object();
+ public static final List IDENTIFIERS = List.of(
+ MinecraftChannelIdentifier.create("legacy", "redisbungee"),
+ new LegacyChannelIdentifier("RedisBungee")
+ );
private final Cache