refactor: some alts refactoring and maybe fixes

This commit is contained in:
ChomeNS
2025-01-17 19:53:15 +07:00
parent af78fe2611
commit a8e4b65355
3 changed files with 47 additions and 12 deletions

View File

@@ -1 +1 @@
1471
1477

View File

@@ -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<String> alts = bot.playersDatabase.findPlayerAlts(targetIP, allServer);
final Map<String, JsonNode> altsMap = bot.playersDatabase.findPlayerAlts(targetIP, allServer);
final Component playerComponent = Component
.text(player)
@@ -82,8 +84,36 @@ public class FindAltsCommand extends Command {
)
.appendNewline();
final List<String> 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

View File

@@ -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<String> findPlayerAlts (String ip) { return findPlayerAlts(ip, false); }
public List<String> findPlayerAlts (String ip, boolean allServer) {
public Map<String, JsonNode> findPlayerAlts (String ip) { return findPlayerAlts(ip, false); }
public Map<String, JsonNode> findPlayerAlts (String ip, boolean allServer) {
try {
final List<String> output = new ArrayList<>();
final Map<String, JsonNode> 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;
}