Refactor leaderboard management: replace UserConfig-based implementation with new Leaderboard SQL class, update related classes to use LeaderboardManager, and fix query/logic for best time retrieval.

This commit is contained in:
2025-10-20 16:39:35 +02:00
parent ed672ec07a
commit eb63381b83
4 changed files with 116 additions and 65 deletions
@@ -4,9 +4,8 @@ import de.steamwar.entity.RArmorStand;
import de.steamwar.entity.REntity;
import de.steamwar.entity.REntityServer;
import de.steamwar.lobby.LobbySystem;
import de.steamwar.sql.Leaderboard;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.internal.Statement;
import lombok.AllArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
@@ -20,25 +19,18 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Leaderboard implements Listener {
private static final Statement LEADERBOARD = new Statement("SELECT User, CAST(Value as integer) AS Time from UserConfig WHERE Config = ? ORDER BY CAST(Value as integer) ASC LIMIT ?");
private static final Statement PLAYER_TIME = new Statement("SELECT CAST(Value as integer) AS Time FROM UserConfig WHERE Config = ? AND User = ?");
private static final Statement PLAYER_PLACEMENT = new Statement("SELECT COUNT(*) AS Placement FROM UserConfig WHERE Config = ? AND CAST(Value as integer) < (SELECT CAST(Value as integer) AS Time FROM UserConfig WHERE Config = ? AND User = ?)");
public class LeaderboardManager implements Listener {
private final REntityServer server;
private final String configKey;
private final Location location;
private final int best;
private long bestTime;
private final List<REntity> entities = new ArrayList<>();
private final Map<Integer, REntityServer> playerPlacements = new HashMap<>();
public Leaderboard(REntityServer server, String configKey, Location location, int best) {
public LeaderboardManager(REntityServer server, String configKey, Location location) {
this.server = server;
this.configKey = configKey;
this.location = location;
this.best = best;
Bukkit.getPluginManager().registerEvents(this, LobbySystem.getPlugin());
update();
}
@@ -46,20 +38,20 @@ public class Leaderboard implements Listener {
public void update() {
entities.forEach(REntity::die);
entities.clear();
List<LeaderboardEntry> leaderboard = getLeaderboard();
List<Leaderboard> leaderboard = getLeaderboard();
if (leaderboard.isEmpty()) return;
bestTime = leaderboard.get(0).time;
bestTime = leaderboard.get(0).getTime();
for (int i = 0; i < leaderboard.size(); i++) {
LeaderboardEntry entry = leaderboard.get(i);
Leaderboard entry = leaderboard.get(i);
RArmorStand entity = new RArmorStand(server, location.clone().add(0, (leaderboard.size() - i - 1) * 0.32, 0), RArmorStand.Size.MARKER);
SteamwarUser user = SteamwarUser.get(entry.user);
SteamwarUser user = SteamwarUser.get(entry.getUserId());
String color = "§7";
if (i == 0) {
color = "§6§l";
} else if (i < 3) {
color = "§e";
}
entity.setDisplayName(calcName(user, color, i + 1, entry.time));
entity.setDisplayName(calcName(user, color, i + 1, entry.getTime()));
entity.setInvisible(true);
entities.add(entity);
}
@@ -116,32 +108,27 @@ public class Leaderboard implements Listener {
return st.toString();
}
private List<LeaderboardEntry> getLeaderboard() {
return LEADERBOARD.select(resultSet -> {
List<LeaderboardEntry> leaderboard = new ArrayList<>();
while (resultSet.next()) {
leaderboard.add(new LeaderboardEntry(resultSet.getInt("User"), resultSet.getLong("Time")));
}
return leaderboard;
}, configKey, best);
private boolean isNewBestTime(long time) {
return time < bestTime;
}
private long getPlayerTime(SteamwarUser user) {
return PLAYER_TIME.select(resultSet -> {
if (!resultSet.next()) {
return Long.MAX_VALUE;
}
return resultSet.getLong("Time");
}, configKey, user.getId());
public void updateBestTime(SteamwarUser user, long time) {
Leaderboard.upsert(user.getId(), configKey, time, isNewBestTime(time));
update();
}
private List<Leaderboard> getLeaderboard() {
return Leaderboard.getLeaderboard(configKey);
}
public long getPlayerTime(SteamwarUser user) {
Leaderboard lb = Leaderboard.getPlayerTime(user, configKey);
if(lb != null) return lb.getTime();
return 0;
}
private int getPlayerPlacement(SteamwarUser user) {
return PLAYER_PLACEMENT.select(resultSet -> {
if (!resultSet.next()) {
return Integer.MAX_VALUE;
}
return resultSet.getInt("Placement");
}, configKey, configKey, user.getId());
return Leaderboard.getPlayerPlacement(user, configKey);
}
public static String renderTime(long time) {
@@ -159,13 +146,6 @@ public class Leaderboard implements Listener {
time % 1000);
}
@AllArgsConstructor
private class LeaderboardEntry {
private final int user;
private final long time;
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
SteamwarUser steamwarUser = SteamwarUser.get(event.getPlayer().getUniqueId());