Skip to content

Commit 0f4546b

Browse files
committed
fix: ranking get system
1 parent 712720d commit 0f4546b

File tree

5 files changed

+92
-31
lines changed

5 files changed

+92
-31
lines changed

src/main/java/net/azisaba/kdstatusreloaded/commands/KDStatusCommand.java

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package net.azisaba.kdstatusreloaded.commands;
22

33
import net.azisaba.kdstatusreloaded.KDStatusReloaded;
4+
import net.azisaba.kdstatusreloaded.api.KillCountType;
5+
import net.azisaba.kdstatusreloaded.playerkd.model.KDUserData;
46
import net.azisaba.kdstatusreloaded.utils.Chat;
57
import org.bukkit.command.Command;
68
import org.bukkit.command.CommandExecutor;
@@ -14,7 +16,7 @@
1416

1517
@NullMarked
1618
public class KDStatusCommand implements CommandExecutor, TabCompleter {
17-
private static final List<String> modes = Arrays.asList("check", "migration");
19+
private static final List<String> modes = Arrays.asList("check", "migrate", "flush-all", "show-ranking");
1820

1921
private final KDStatusReloaded plugin;
2022

@@ -29,19 +31,43 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String
2931
return true;
3032
}
3133

32-
if (args[0].equalsIgnoreCase("migration")) {
33-
plugin.getPlayerKd().migrate();
34-
sender.sendMessage("Migrated.");
35-
return true;
36-
}
37-
38-
if(args[0].equalsIgnoreCase("check")) {
39-
var worldConfig = plugin.getPluginConfig().world;
40-
sender.sendMessage("- ShowCountCancelled: " + worldConfig.showCountCancelled);
41-
sender.sendMessage("->>> disables <<<-");
42-
sender.sendMessage("Kill: " + String.join(", ", worldConfig.disableKillWorldList));
43-
sender.sendMessage("Death: " + String.join(", ", worldConfig.disableDeathWorldList));
44-
sender.sendMessage("------------------");
34+
String mode = args[0].toLowerCase();
35+
switch (mode) {
36+
case "check" -> {
37+
var worldConfig = plugin.getPluginConfig().world;
38+
sender.sendMessage("- ShowCountCancelled: " + worldConfig.showCountCancelled);
39+
sender.sendMessage("->>> disables <<<-");
40+
sender.sendMessage("Kill: " + String.join(", ", worldConfig.disableKillWorldList));
41+
sender.sendMessage("Death: " + String.join(", ", worldConfig.disableDeathWorldList));
42+
sender.sendMessage("------------------");
43+
return true;
44+
}
45+
case "flush-all" -> {
46+
plugin.getPlayerKd().flushAll();
47+
}
48+
case "migrate" -> {
49+
plugin.getPlayerKd().migrate();
50+
sender.sendMessage("Migrated.");
51+
return true;
52+
}
53+
case "show-ranking" -> {
54+
if(args.length != 2) {
55+
sender.sendMessage(String.format("/%s show-ranking <type>", label));
56+
return true;
57+
}
58+
KillCountType killCountType = KillCountType.valueOf(args[1].toUpperCase());
59+
List<KDUserData> topList = plugin.getPlayerKd().getTops(killCountType, 7);
60+
sender.sendMessage("======= Ranking =======");
61+
for (int i = 0; i < 7; i++) {
62+
if(topList.size() <= i) {
63+
sender.sendMessage(String.format("%d: なし", i+1));
64+
} else {
65+
KDUserData kdUserData = topList.get(i);
66+
sender.sendMessage(String.format("%d: %s", i + 1, kdUserData.name));
67+
}
68+
}
69+
sender.sendMessage("=======================");
70+
}
4571
}
4672

4773
sender.sendMessage(Chat.f("&cUsage: {0}", cmd.getUsage().replace("{LABEL}", label)));
@@ -53,6 +79,11 @@ public List<String> onTabComplete(CommandSender commandSender, Command command,
5379
if (args.length == 1) {
5480
return modes;
5581
}
82+
if(args.length == 2) {
83+
if(args[0].equalsIgnoreCase("show-ranking")) {
84+
return Arrays.stream(KillCountType.values()).map(t -> t.name().toLowerCase()).toList();
85+
}
86+
}
5687
return Collections.emptyList();
5788
}
5889
}

src/main/java/net/azisaba/kdstatusreloaded/playerkd/PlayerKD.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,25 @@ public Optional<KDUserData> getPlayerDataWithNoCaching(UUID uuid) {
4141
return kdDatabase.kdUserDataRepository().findById(uuid);
4242
}
4343

44+
/**
45+
* プレイヤーの順位を取得します。
46+
* @param type キルの種類
47+
* @param uuid プレイヤーのUUID
48+
* @return 順位 (存在しなかった場合は-1)
49+
*/
4450
public int getRanking(KillCountType type, UUID uuid) {
45-
return kdDatabase.kdUserDataRepository().getRanking(type.columnName, type.getFirstMilliSecond(), uuid);
51+
return kdDatabase.kdUserDataRepository().getRanking(type.columnName, type.getFirstMilliSecond(), uuid).orElse(-1);
4652
}
4753

4854
public List<KDUserData> getTops(KillCountType type, int limit) {
49-
return kdDatabase.kdUserDataRepository().findTop(type.columnName, limit);
55+
return kdDatabase.kdUserDataRepository().findTop(type.columnName, type.getFirstMilliSecond(), limit);
5056
}
5157

5258
public void migrate() {
5359
kdDatabase.migrate();
5460
}
61+
62+
public void flushAll() {
63+
kdCache.flushAll();
64+
}
5565
}

src/main/java/net/azisaba/kdstatusreloaded/playerkd/cache/KDCache.java

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,23 @@
33
import net.azisaba.kdstatusreloaded.playerkd.model.KDUserData;
44
import net.azisaba.kdstatusreloaded.playerkd.db.KDUserDataRepository;
55
import org.bukkit.Bukkit;
6+
import org.bukkit.entity.Player;
67
import org.jspecify.annotations.NullMarked;
78

89
import java.util.Calendar;
910
import java.util.HashMap;
1011
import java.util.UUID;
12+
import java.util.function.Function;
1113
import java.util.function.Supplier;
1214

1315
@NullMarked
1416
public class KDCache {
17+
private static final Function<UUID, String> usernameGetter = (uuid) -> {
18+
var findResult = Bukkit.getOnlinePlayers().stream().filter(p -> p.getUniqueId() == uuid).findFirst();
19+
if(findResult.isEmpty()) throw new RuntimeException("Failed to get name for " + uuid);
20+
return findResult.get().getName();
21+
};
22+
1523
private final HashMap<UUID, KDUserData> cacheMap = new HashMap<>();
1624

1725
private final KDUserDataRepository dataRepository;
@@ -21,23 +29,19 @@ public KDCache(KDUserDataRepository dataRepository) {
2129
}
2230

2331
public KDUserData getData(UUID uuid) {
24-
return get(uuid, () -> {
25-
var findResult = Bukkit.getOnlinePlayers().stream().filter(p -> p.getUniqueId() == uuid).findFirst();
26-
if(findResult.isEmpty()) throw new RuntimeException("Failed to get name for " + uuid);
27-
return findResult.get().getName();
28-
}).clone();
32+
return get(uuid, usernameGetter).clone();
2933
}
3034

3135
// For internal
3236
protected KDUserData get(UUID uuid, String name) {
33-
return get(uuid, () -> name);
37+
return get(uuid, (id) -> name);
3438
}
3539

36-
protected KDUserData get(UUID uuid, Supplier<String> nameSupplier) {
40+
protected KDUserData get(UUID uuid, Function<UUID, String> nameGetter) {
3741
if (!cacheMap.containsKey(uuid)) {
3842
cacheMap.put(
3943
uuid,
40-
dataRepository.findById(uuid).orElse(new KDUserData(uuid, nameSupplier.get()))
44+
dataRepository.findById(uuid).orElse(new KDUserData(uuid, nameGetter.apply(uuid)))
4145
);
4246
}
4347
return cacheMap.get(uuid);
@@ -50,14 +54,19 @@ public void store(UUID uuid, String name) {
5054
);
5155
}
5256

53-
public void remove(UUID uuid) {
54-
KDUserData kdUserData = cacheMap.remove(uuid);
57+
public void remove(Player player) {
58+
KDUserData kdUserData = cacheMap.remove(player.getUniqueId());
5559
if (kdUserData != null) {
60+
kdUserData.name = player.getName();
5661
// If data cached, upsert to db.
5762
dataRepository.upsert(kdUserData);
5863
}
5964
}
6065

66+
public void flushAll() {
67+
cacheMap.forEach((uuid, kdUserData) -> dataRepository.upsert(kdUserData));
68+
}
69+
6170
public boolean isCached(UUID uuid) {
6271
return cacheMap.containsKey(uuid);
6372
}

src/main/java/net/azisaba/kdstatusreloaded/playerkd/db/KDUserDataRepository.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.jdbi.v3.sqlobject.customizer.Bind;
66
import org.jdbi.v3.sqlobject.customizer.BindFields;
77
import org.jdbi.v3.sqlobject.customizer.BindMethods;
8+
import org.jdbi.v3.sqlobject.customizer.Define;
89
import org.jdbi.v3.sqlobject.statement.SqlQuery;
910
import org.jdbi.v3.sqlobject.statement.SqlUpdate;
1011

@@ -17,11 +18,21 @@ public interface KDUserDataRepository {
1718
@SqlQuery("SELECT * FROM kill_death_data WHERE uuid = :uuid")
1819
Optional<KDUserData> findById(@Bind("uuid") UUID uuid);
1920

20-
@SqlQuery("SELECT * FROM kill_death_data ORDER BY :targetColumn DESC LIMIT :limit")
21-
List<KDUserData> findTop(@Bind("targetColumn") String columnName, @Bind("limit") int limit);
21+
@SqlQuery("SELECT * FROM kill_death_data WHERE last_updated > :unitFirstMilli ORDER BY <column> DESC LIMIT :limit")
22+
List<KDUserData> findTop(@Define("column") String columnName, @Bind("unitFirstMilli") long unitFirstMilliSecond, @Bind("limit") int limit);
2223

23-
@SqlQuery("SELECT * FROM (SELECT uuid, :targetColumn, last_updated, RANK() over (ORDER BY :targetColumn DESC) as 'rank' FROM kill_death_data WHERE last_updated > :unitFirstMilli ) s WHERE s.uuid = :uuid")
24-
int getRanking(@Bind("targetColumn") String columnName, @Bind("unitFirstMilli") long unitFirstMilliSecond, @Bind("uuid") UUID uuid);
24+
@SqlQuery("""
25+
SELECT s.rank
26+
FROM (
27+
SELECT uuid,
28+
RANK() OVER (ORDER BY <column> DESC) AS rank
29+
FROM kill_death_data
30+
WHERE last_updated > :unitFirstMilli
31+
AND <column> >= 1
32+
) s
33+
WHERE s.uuid = :uuid
34+
""")
35+
Optional<Integer> getRanking(@Define("column") String columnName, @Bind("unitFirstMilli") long unitFirstMilliSecond, @Bind("uuid") UUID uuid);
2536

2637
@SqlUpdate("INSERT INTO kill_death_data (uuid, name, kills, deaths, daily_kills, monthly_kills, yearly_kills, last_updated) " +
2738
"VALUES (:uuid, :name, :totalKills, :deaths, :dailyKills, :monthlyKills, :yearlyKills, :lastUpdated) " +

src/main/java/net/azisaba/kdstatusreloaded/playerkd/listener/PlayerEventListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public void onPlayerJoin(PlayerJoinEvent e) {
3434

3535
@EventHandler(priority = EventPriority.MONITOR)
3636
public void onPlayerQuit(PlayerQuitEvent e) {
37-
kdCache.remove(e.getPlayer().getUniqueId());
37+
kdCache.remove(e.getPlayer());
3838
}
3939

4040
@EventHandler(priority = EventPriority.MONITOR)

0 commit comments

Comments
 (0)