Skip to content

Commit 1cc1a7b

Browse files
committed
feat: add ranking getter for API
1 parent 525549c commit 1cc1a7b

File tree

4 files changed

+67
-3
lines changed

4 files changed

+67
-3
lines changed
Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
11
package net.azisaba.kdstatusreloaded.api;
22

33
import net.azisaba.kdstatusreloaded.KDStatusReloaded;
4+
import net.azisaba.kdstatusreloaded.playerkd.PlayerKD;
45
import net.azisaba.kdstatusreloaded.playerkd.model.KDUserData;
56
import org.jspecify.annotations.NullMarked;
67

8+
import java.util.List;
79
import java.util.Optional;
810
import java.util.UUID;
911

1012
@NullMarked
1113
public class KDSAPI {
14+
private static PlayerKD playerKd() {
15+
return KDStatusReloaded.getPlugin().getPlayerKd();
16+
}
17+
1218
public static KDUserData getPlayerData(UUID uuid) {
13-
Optional<KDUserData> data = KDStatusReloaded.getPlugin().getPlayerKd().getPlayerDataWithNoCaching(uuid);
19+
Optional<KDUserData> data = playerKd().getPlayerDataWithNoCaching(uuid);
1420
return data.orElseGet(() -> new KDUserData(uuid, ""));
1521
}
22+
23+
public static int getPlayerRanking(KillCountType type, UUID uuid) {
24+
return playerKd().getRanking(type, uuid);
25+
}
26+
27+
public static List<KDUserData> getTops(KillCountType type, int limit) {
28+
return playerKd().getTops(type, limit);
29+
}
1630
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package net.azisaba.kdstatusreloaded.api;
2+
3+
import java.util.Calendar;
4+
5+
public enum KillCountType {
6+
DAILY("daily_kills"),
7+
MONTHLY("monthly_kills"),
8+
YEARLY("yearly_kills"),
9+
TOTAL("kills");
10+
11+
public String columnName;
12+
KillCountType(String columnName) {
13+
this.columnName = columnName;
14+
}
15+
16+
public long getFirstMilliSecond() {
17+
Calendar cal = Calendar.getInstance();
18+
cal.set(Calendar.MILLISECOND, 0);
19+
cal.set(Calendar.SECOND, 0);
20+
cal.set(Calendar.MINUTE, 0);
21+
cal.set(Calendar.HOUR_OF_DAY, 0);
22+
23+
if (this == DAILY)
24+
return cal.getTimeInMillis();
25+
26+
cal.set(Calendar.DATE, 1);
27+
28+
if (this == MONTHLY)
29+
return cal.getTimeInMillis();
30+
31+
cal.set(Calendar.MONTH, 0);
32+
33+
if (this == YEARLY)
34+
return cal.getTimeInMillis();
35+
36+
return -1;
37+
}
38+
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package net.azisaba.kdstatusreloaded.playerkd;
22

33
import net.azisaba.kdstatusreloaded.KDStatusReloaded;
4+
import net.azisaba.kdstatusreloaded.api.KillCountType;
45
import net.azisaba.kdstatusreloaded.playerkd.model.KDUserData;
56
import net.azisaba.kdstatusreloaded.playerkd.cache.KDCache;
67
import net.azisaba.kdstatusreloaded.playerkd.db.KDDatabase;
@@ -40,6 +41,14 @@ public Optional<KDUserData> getPlayerDataWithNoCaching(UUID uuid) {
4041
return kdDatabase.kdUserDataRepository().findById(uuid);
4142
}
4243

44+
public int getRanking(KillCountType type, UUID uuid) {
45+
return kdDatabase.kdUserDataRepository().getRanking(type.columnName, type.getFirstMilliSecond(), uuid);
46+
}
47+
48+
public List<KDUserData> getTops(KillCountType type, int limit) {
49+
return kdDatabase.kdUserDataRepository().findTop(type.columnName, limit);
50+
}
51+
4352
public void migrate() {
4453
kdDatabase.migrate();
4554
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ public interface KDUserDataRepository {
1717
@SqlQuery("SELECT * FROM kill_death_data WHERE uuid = :uuid")
1818
Optional<KDUserData> findById(@Bind("uuid") UUID uuid);
1919

20-
@SqlQuery("SELECT * FROM kill_death_data ORDER BY kills DESC LIMIT :limit")
21-
List<KDUserData> findTopByTotalKills(@Bind("limit") int limit);
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);
22+
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);
2225

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

0 commit comments

Comments
 (0)