From 3960bf1fabe9c9cc2ddd43b0d7c17fd549cae51a Mon Sep 17 00:00:00 2001 From: ChomeNS <95471003+ChomeNS@users.noreply.github.com> Date: Sun, 1 Jun 2025 07:47:23 +0700 Subject: [PATCH] refactor: improve how the persistent data in PlayerEntry are stored which fixes the authenticated trust level being wiped when unvanish --- build-number.txt | 2 +- .../chomens_bot/commands/AuthCommand.java | 6 +-- .../chomens_bot/commands/FindAltsCommand.java | 5 +- .../chomens_bot/commands/ListCommand.java | 13 +++-- .../chomens_bot/commands/ValidateCommand.java | 2 +- .../chomens_bot/data/player/PlayerEntry.java | 54 +++++++++++++++---- .../chomens_bot/plugins/AuthPlugin.java | 2 +- .../plugins/CommandHandlerPlugin.java | 4 +- .../chomens_bot/plugins/IPFilterPlugin.java | 2 +- .../chomens_bot/plugins/PlayersPlugin.java | 23 ++++---- 10 files changed, 75 insertions(+), 38 deletions(-) diff --git a/build-number.txt b/build-number.txt index 9f42ddd0..9b3286e6 100644 --- a/build-number.txt +++ b/build-number.txt @@ -1 +1 @@ -3378 \ No newline at end of file +3381 \ No newline at end of file diff --git a/src/main/java/me/chayapak1/chomens_bot/commands/AuthCommand.java b/src/main/java/me/chayapak1/chomens_bot/commands/AuthCommand.java index df2842b7..c3e5ccdd 100644 --- a/src/main/java/me/chayapak1/chomens_bot/commands/AuthCommand.java +++ b/src/main/java/me/chayapak1/chomens_bot/commands/AuthCommand.java @@ -39,20 +39,20 @@ public class AuthCommand extends Command { if (allowSettingOthers && !targetString.isEmpty()) target = bot.players.getEntry(targetString); if (target == null) target = context.sender; - target.authenticatedTrustLevel = trustLevel; + target.persistingData.authenticatedTrustLevel = trustLevel; if (target.equals(context.sender)) { return Component.translatable( "commands.auth.self", bot.colorPalette.defaultColor, - target.authenticatedTrustLevel.component + target.persistingData.authenticatedTrustLevel.component ); } else { return Component.translatable( "commands.auth.others", bot.colorPalette.defaultColor, Component.text(target.profile.getName(), bot.colorPalette.username), - target.authenticatedTrustLevel.component + target.persistingData.authenticatedTrustLevel.component ); } } diff --git a/src/main/java/me/chayapak1/chomens_bot/commands/FindAltsCommand.java b/src/main/java/me/chayapak1/chomens_bot/commands/FindAltsCommand.java index 0533d4d0..b643a55f 100644 --- a/src/main/java/me/chayapak1/chomens_bot/commands/FindAltsCommand.java +++ b/src/main/java/me/chayapak1/chomens_bot/commands/FindAltsCommand.java @@ -54,8 +54,9 @@ public class FindAltsCommand extends Command { final String ipFromUsername; - if (playerInTheServer == null || playerInTheServer.ip == null) ipFromUsername = bot.playersDatabase.getPlayerIP(player); - else ipFromUsername = playerInTheServer.ip; + if (playerInTheServer == null || playerInTheServer.persistingData.ip == null) + ipFromUsername = bot.playersDatabase.getPlayerIP(player); + else ipFromUsername = playerInTheServer.persistingData.ip; if (ipFromUsername == null) { context.sendOutput(handle(bot, player, player, allServer)); diff --git a/src/main/java/me/chayapak1/chomens_bot/commands/ListCommand.java b/src/main/java/me/chayapak1/chomens_bot/commands/ListCommand.java index 612e3b0d..73bad9e0 100644 --- a/src/main/java/me/chayapak1/chomens_bot/commands/ListCommand.java +++ b/src/main/java/me/chayapak1/chomens_bot/commands/ListCommand.java @@ -56,7 +56,7 @@ public class ListCommand extends Command { .append(Component.newline()) .append(Component.newline()) .append( - entry.usernames.isEmpty() + entry.persistingData.usernames.isEmpty() ? Component.translatable( "commands.list.no_other_usernames", NamedTextColor.GRAY @@ -67,7 +67,7 @@ public class ListCommand extends Command { Component .join( JoinConfiguration.commas(true), - entry.usernames + entry.persistingData.usernames .stream() .map(Component::text) .toList() @@ -80,7 +80,7 @@ public class ListCommand extends Command { Component.translatable( "commands.list.vanished", bot.colorPalette.secondary, - Component.text(!entry.listed, bot.colorPalette.string) + Component.text(!entry.persistingData.listed, bot.colorPalette.string) ) ) .append(Component.newline()) @@ -106,7 +106,12 @@ public class ListCommand extends Command { Component.translatable( "commands.list.ip_address", bot.colorPalette.secondary, - Component.text(entry.ip == null ? "N/A" : entry.ip, bot.colorPalette.string) + Component.text( + entry.persistingData.ip == null + ? "N/A" + : entry.persistingData.ip, + bot.colorPalette.string + ) ) ) .append(Component.newline()) diff --git a/src/main/java/me/chayapak1/chomens_bot/commands/ValidateCommand.java b/src/main/java/me/chayapak1/chomens_bot/commands/ValidateCommand.java index a9e2f399..c844ee33 100644 --- a/src/main/java/me/chayapak1/chomens_bot/commands/ValidateCommand.java +++ b/src/main/java/me/chayapak1/chomens_bot/commands/ValidateCommand.java @@ -36,7 +36,7 @@ public class ValidateCommand extends Command { else if (context instanceof ConsoleCommandContext) return Component .translatable("commands.validate.console", NamedTextColor.GREEN); else return Component.translatable( - context.sender.authenticatedTrustLevel != TrustLevel.PUBLIC + context.sender.persistingData.authenticatedTrustLevel != TrustLevel.PUBLIC ? "commands.validate.player_authenticated" : "commands.validate.player", NamedTextColor.GREEN, diff --git a/src/main/java/me/chayapak1/chomens_bot/data/player/PlayerEntry.java b/src/main/java/me/chayapak1/chomens_bot/data/player/PlayerEntry.java index 2fcff448..0f973af4 100644 --- a/src/main/java/me/chayapak1/chomens_bot/data/player/PlayerEntry.java +++ b/src/main/java/me/chayapak1/chomens_bot/data/player/PlayerEntry.java @@ -1,13 +1,14 @@ package me.chayapak1.chomens_bot.data.player; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import me.chayapak1.chomens_bot.command.TrustLevel; import net.kyori.adventure.text.Component; import org.geysermc.mcprotocollib.auth.GameProfile; import org.geysermc.mcprotocollib.protocol.data.game.PlayerListEntry; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode; +import org.jetbrains.annotations.NotNull; import java.security.PublicKey; -import java.util.ArrayList; import java.util.List; public class PlayerEntry { @@ -15,13 +16,10 @@ public class PlayerEntry { public GameMode gamemode; public int latency; public Component displayName; - public final List usernames = new ArrayList<>(); public final long expiresAt; public PublicKey publicKey; public final byte[] keySignature; - public boolean listed; - public String ip; - public TrustLevel authenticatedTrustLevel = TrustLevel.PUBLIC; + public PersistingData persistingData; public PlayerEntry ( final GameProfile profile, @@ -40,7 +38,7 @@ public class PlayerEntry { this.expiresAt = expiresAt; this.publicKey = publicKey; this.keySignature = keySignature; - this.listed = listed; + this.persistingData = new PersistingData(listed); } public PlayerEntry (final PlayerListEntry entry) { @@ -50,10 +48,48 @@ public class PlayerEntry { @Override public String toString () { return "PlayerEntry{" + - "gamemode=" + gamemode + + "profile=" + profile + + ", gamemode=" + gamemode + ", latency=" + latency + - ", listed=" + listed + - ", displayName=" + displayName + + ", persistingData=" + persistingData + '}'; } + + public static final class PersistingData { + public final List usernames = new ObjectArrayList<>(); + public boolean listed; + public String ip = null; + public TrustLevel authenticatedTrustLevel = TrustLevel.PUBLIC; + + public PersistingData (final boolean listed) { + this.listed = listed; + } + + public PersistingData (final PersistingData friend) { + this.usernames.addAll(friend.usernames); + this.listed = friend.listed; + this.ip = friend.ip; + this.authenticatedTrustLevel = friend.authenticatedTrustLevel; + } + + public PersistingData (final PlayerEntry oldEntry) { + final PersistingData friend = oldEntry.persistingData; + + this.usernames.addAll(oldEntry.persistingData.usernames); + this.usernames.addLast(oldEntry.profile.getName()); + this.listed = friend.listed; + this.ip = friend.ip; + this.authenticatedTrustLevel = friend.authenticatedTrustLevel; + } + + @Override + public @NotNull String toString () { + return "PersistingData{" + + "usernames=" + usernames + + ", listed=" + listed + + ", ip='" + ip + '\'' + + ", authenticatedTrustLevel=" + authenticatedTrustLevel + + '}'; + } + } } diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/AuthPlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/AuthPlugin.java index a639df36..71d143a4 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/AuthPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/AuthPlugin.java @@ -43,7 +43,7 @@ public class AuthPlugin implements Listener { cleanup(); - target.authenticatedTrustLevel = TrustLevel.MAX; + target.persistingData.authenticatedTrustLevel = TrustLevel.MAX; bot.logger.log( LogType.AUTH, diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/CommandHandlerPlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/CommandHandlerPlugin.java index bb67b083..aca14154 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/CommandHandlerPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/CommandHandlerPlugin.java @@ -129,7 +129,7 @@ public class CommandHandlerPlugin implements Listener { if (!bypass && !isCommandAllowed(context, command)) return; - final TrustLevel authenticatedTrustLevel = context.sender.authenticatedTrustLevel; + final TrustLevel authenticatedTrustLevel = context.sender.persistingData.authenticatedTrustLevel; final boolean authenticated = isAuthenticated(context, authenticatedTrustLevel); final boolean needsHash = needsHash(command, inGame, authenticated, splitInput.length); @@ -211,7 +211,7 @@ public class CommandHandlerPlugin implements Listener { } if (authenticated) { - final TrustLevel authLevel = context.sender.authenticatedTrustLevel; + final TrustLevel authLevel = context.sender.persistingData.authenticatedTrustLevel; if (authLevel.level < requiredLevel.level) { context.sendOutput(Component.translatable("command_handler.not_enough_roles", NamedTextColor.RED)); return false; diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/IPFilterPlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/IPFilterPlugin.java index 994264d0..4a81b639 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/IPFilterPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/IPFilterPlugin.java @@ -63,7 +63,7 @@ public class IPFilterPlugin implements Listener { private void check (final PlayerEntry target) { if (bot.options.useCorePlaceBlock) return; // it will spam the place block core so i ignored this - final String ip = target.ip; + final String ip = target.persistingData.ip; if (ip == null) return; diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java index d45d269b..26cab5aa 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java @@ -78,12 +78,12 @@ public class PlayersPlugin implements Listener { } private void queryPlayersIP (final PlayerEntry target) { - if (target.ip != null) return; + if (target.persistingData.ip != null) return; final CompletableFuture future = getPlayerIP(target, true); future.thenApply(ip -> { - target.ip = ip; + target.persistingData.ip = ip; bot.listener.dispatch(listener -> listener.onQueriedPlayerIP(target, ip)); @@ -162,7 +162,7 @@ public class PlayersPlugin implements Listener { ( candidate.profile.getName().equals(username) || (checkUUID && candidate.profile.getIdAsString().equals(username)) - || (checkPastUsernames && candidate.usernames.contains(username)) + || (checkPastUsernames && candidate.persistingData.usernames.contains(username)) ) ) { return candidate; @@ -228,7 +228,7 @@ public class PlayersPlugin implements Listener { final PlayerEntry target = getEntry(newEntry); if (target == null) return; - target.listed = newEntry.isListed(); + target.persistingData.listed = newEntry.isListed(); } private void addPlayer (final PlayerListEntry newEntry) { @@ -241,10 +241,8 @@ public class PlayersPlugin implements Listener { if (duplicate != null) { list.removeIf(entry -> entry.equals(duplicate)); - target.listed = true; - - target.usernames.addAll(duplicate.usernames); - target.ip = duplicate.ip; + target.persistingData = new PlayerEntry.PersistingData(duplicate.persistingData); + target.persistingData.listed = true; list.add(target); @@ -330,13 +328,10 @@ public class PlayersPlugin implements Listener { target.expiresAt, target.publicKey, target.keySignature, - target.listed + target.persistingData.listed ); - newTarget.usernames.addAll(target.usernames); - newTarget.usernames.addLast(target.profile.getName()); - - newTarget.ip = target.ip; + newTarget.persistingData = new PlayerEntry.PersistingData(target); list.removeIf(entry -> entry.profile.getId().equals(target.profile.getId())); @@ -349,7 +344,7 @@ public class PlayersPlugin implements Listener { // we already passed all the left and username check, // so the only one left is vanish - target.listed = false; + target.persistingData.listed = false; bot.listener.dispatch(listener -> listener.onPlayerVanished(target)); }