From a8e4b6535525a0f3bf45f7ab7e98d4d50f26ddd7 Mon Sep 17 00:00:00 2001 From: ChomeNS <95471003+ChomeNS@users.noreply.github.com> Date: Fri, 17 Jan 2025 19:53:15 +0700 Subject: [PATCH] refactor: some alts refactoring and maybe fixes --- build-number.txt | 2 +- .../chomens_bot/commands/FindAltsCommand.java | 34 +++++++++++++++++-- .../plugins/PlayersDatabasePlugin.java | 23 ++++++++----- 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/build-number.txt b/build-number.txt index 74532d80..3559f242 100644 --- a/build-number.txt +++ b/build-number.txt @@ -1 +1 @@ -1471 \ No newline at end of file +1477 \ No newline at end of file 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 ed0e8cf2..48fd7c5f 100644 --- a/src/main/java/me/chayapak1/chomens_bot/commands/FindAltsCommand.java +++ b/src/main/java/me/chayapak1/chomens_bot/commands/FindAltsCommand.java @@ -1,5 +1,6 @@ package me.chayapak1.chomens_bot.commands; +import com.fasterxml.jackson.databind.JsonNode; import me.chayapak1.chomens_bot.Bot; import me.chayapak1.chomens_bot.command.Command; import me.chayapak1.chomens_bot.command.CommandContext; @@ -10,6 +11,7 @@ import me.chayapak1.chomens_bot.util.ColorUtilities; import net.kyori.adventure.text.Component; import java.util.List; +import java.util.Map; import java.util.concurrent.CompletableFuture; public class FindAltsCommand extends Command { @@ -59,7 +61,7 @@ public class FindAltsCommand extends Command { } private Component handle (Bot bot, String targetIP, boolean argumentIsIP, String player, boolean allServer) { - final List alts = bot.playersDatabase.findPlayerAlts(targetIP, allServer); + final Map altsMap = bot.playersDatabase.findPlayerAlts(targetIP, allServer); final Component playerComponent = Component .text(player) @@ -82,8 +84,36 @@ public class FindAltsCommand extends Command { ) .appendNewline(); + final List sorted = altsMap.entrySet().stream() + .limit(200) // only find 200 alts because more than this is simply too many + .sorted((a, b) -> { + // a + + final JsonNode aLastSeen = a.getValue().get("lastSeen"); + + if (aLastSeen == null || aLastSeen.isNull()) return 0; + + final JsonNode aTimeNode = aLastSeen.get("time"); + + if (aTimeNode == null || aTimeNode.isNull()) return 0; + + // b + + final JsonNode bLastSeen = b.getValue().get("lastSeen"); + + if (bLastSeen == null || bLastSeen.isNull()) return 0; + + final JsonNode bTimeNode = bLastSeen.get("time"); + + if (bTimeNode == null || bTimeNode.isNull()) return 0; + + return Long.compare(bTimeNode.asLong(), aTimeNode.asLong()); + }) + .map(Map.Entry::getKey) + .toList(); + int i = 0; - for (String username : alts) { + for (String username : sorted) { component = component .append( Component diff --git a/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersDatabasePlugin.java b/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersDatabasePlugin.java index b9c88bc6..3bfa32be 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersDatabasePlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersDatabasePlugin.java @@ -14,8 +14,8 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.time.Instant; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.CompletableFuture; public class PlayersDatabasePlugin extends PlayersPlugin.Listener { @@ -23,8 +23,8 @@ public class PlayersDatabasePlugin extends PlayersPlugin.Listener { private static final String INSERT_PLAYER = "INSERT IGNORE INTO players (username, data) VALUES (?, ?);"; private static final String UPDATE_PLAYER = "UPDATE players SET data = JSON_SET(data, ?, JSON_MERGE_PATCH(data -> ?, ?)) WHERE username = ?;"; private static final String GET_DATA = "SELECT data FROM players WHERE username = ?;"; - private static final String FIND_ALTS_SINGLE_SERVER = "SELECT username FROM players WHERE JSON_CONTAINS(data -> '$.ips', JSON_OBJECT(?, ?));"; - private static final String FIND_ALTS_ALL_SERVERS = "SELECT username FROM players WHERE JSON_SEARCH(data->'$.ips', 'one', ?);"; // 'one' means case-sensitive + private static final String FIND_ALTS_SINGLE_SERVER = "SELECT * FROM players WHERE JSON_CONTAINS(data -> '$.ips', JSON_OBJECT(?, ?));"; + private static final String FIND_ALTS_ALL_SERVERS = "SELECT * FROM players WHERE JSON_SEARCH(data->'$.ips', 'one', ?);"; // 'one' means case-sensitive private static final ObjectMapper objectMapper = new ObjectMapper(); @@ -73,10 +73,10 @@ public class PlayersDatabasePlugin extends PlayersPlugin.Listener { } } - public List findPlayerAlts (String ip) { return findPlayerAlts(ip, false); } - public List findPlayerAlts (String ip, boolean allServer) { + public Map findPlayerAlts (String ip) { return findPlayerAlts(ip, false); } + public Map findPlayerAlts (String ip, boolean allServer) { try { - final List output = new ArrayList<>(); + final Map output = new HashMap<>(); PreparedStatement statement; @@ -93,10 +93,15 @@ public class PlayersDatabasePlugin extends PlayersPlugin.Listener { final ResultSet result = statement.executeQuery(); - while (result.next()) output.add(result.getString("username")); + while (result.next()) { + output.put( + result.getString("username"), + objectMapper.readTree(result.getString("data")) + ); + } return output; - } catch (SQLException e) { + } catch (SQLException | JsonProcessingException e) { bot.logger.error(e); return null; }