From 60bf424f27a91354a678a305a4fcbc7b95efeb5b Mon Sep 17 00:00:00 2001 From: ChomeNS <95471003+ChomeNS@users.noreply.github.com> Date: Thu, 6 Mar 2025 09:21:02 +0700 Subject: [PATCH] refactor: optimize getting player IPs from database stuff --- build-number.txt | 2 +- .../plugins/PlayersDatabasePlugin.java | 25 +++++++++++++++++ .../chomens_bot/plugins/PlayersPlugin.java | 27 +++++-------------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/build-number.txt b/build-number.txt index 8215fe86..3c3948ad 100644 --- a/build-number.txt +++ b/build-number.txt @@ -1 +1 @@ -1693 \ No newline at end of file +1698 \ No newline at end of file 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 39e91523..b392357a 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersDatabasePlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersDatabasePlugin.java @@ -23,6 +23,7 @@ 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 GET_IP = "SELECT JSON_UNQUOTE(JSON_EXTRACT(data, ?)) AS ip FROM players WHERE username = ?;"; 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 @@ -73,6 +74,30 @@ public class PlayersDatabasePlugin extends PlayersPlugin.Listener { } } + public String getPlayerIP (String username) { + if (bot.database == null || bot.database.connection == null) return null; + + try { + final PreparedStatement statement = bot.database.connection.prepareStatement(GET_IP); + + // this may be dangerous but the server address is configured only in the config + // so this should still be safe + statement.setString(1, "$.ips.\"" + bot.getServerString(true) + "\""); + statement.setString(2, username); + + final ResultSet result = statement.executeQuery(); + + if (!result.isBeforeFirst()) return null; // no ip for player in this server + + result.next(); + + return result.getString("ip"); + } catch (SQLException e) { + bot.logger.error(e); + return null; + } + } + public Map findPlayerAlts (String ip) { return findPlayerAlts(ip, false); } public Map findPlayerAlts (String ip, boolean allServer) { try { 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 7f3b758f..19d5625f 100644 --- a/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java +++ b/src/main/java/me/chayapak1/chomens_bot/plugins/PlayersPlugin.java @@ -1,6 +1,5 @@ package me.chayapak1.chomens_bot.plugins; -import com.fasterxml.jackson.databind.JsonNode; import me.chayapak1.chomens_bot.Bot; import me.chayapak1.chomens_bot.data.player.PlayerEntry; import me.chayapak1.chomens_bot.util.ComponentUtilities; @@ -68,32 +67,18 @@ public class PlayersPlugin extends Bot.Listener { } } - public String getPlayerIPFromDatabase (PlayerEntry target) { - final JsonNode data = bot.playersDatabase.getPlayerData(target.profile.getName()); - - if (data == null) return null; - - final JsonNode ipsObject = data.get("ips"); - - if (ipsObject == null || ipsObject.isNull() || !ipsObject.isObject()) return null; - - final JsonNode targetIP = ipsObject.get(bot.getServerString(true)); - - if (targetIP == null || targetIP.isNull() || !targetIP.isTextual()) return null; - - return targetIP.textValue(); - } - public CompletableFuture getPlayerIP (PlayerEntry target) { return getPlayerIP(target, false); } public CompletableFuture getPlayerIP (PlayerEntry target, boolean forceSeen) { final CompletableFuture outputFuture = new CompletableFuture<>(); DatabasePlugin.executorService.submit(() -> { - final String databaseIP = getPlayerIPFromDatabase(target); + if (!forceSeen) { + final String databaseIP = bot.playersDatabase.getPlayerIP(target.profile.getName()); - if (databaseIP != null && !forceSeen) { - outputFuture.complete(databaseIP); - return; + if (databaseIP != null) { + outputFuture.complete(databaseIP); + return; + } } final CompletableFuture trackedCoreFuture = bot.core.runTracked("essentials:seen " + target.profile.getIdAsString());