[+] Ranking endpoint

This commit is contained in:
Azalea
2024-02-28 22:09:53 -05:00
parent 10169b03ce
commit fd482d32a7
5 changed files with 44 additions and 13 deletions

View File

@@ -4,10 +4,7 @@ import ext.API
import ext.RP
import ext.Str
import icu.samnyan.aqua.net.db.AquaUserServices
import icu.samnyan.aqua.net.utils.TrendLog
import icu.samnyan.aqua.net.utils.chu3Scores
import icu.samnyan.aqua.net.utils.findTrend
import icu.samnyan.aqua.net.utils.genericUserSummary
import icu.samnyan.aqua.net.utils.*
import icu.samnyan.aqua.sega.chusan.dao.userdata.UserDataRepository
import icu.samnyan.aqua.sega.chusan.dao.userdata.UserGeneralDataRepository
import icu.samnyan.aqua.sega.chusan.dao.userdata.UserPlaylogRepository
@@ -42,4 +39,6 @@ class Chusan(
genericUserSummary(u, userDataRepository, userPlaylogRepository, shownRanks, ratingComposition)
}
override fun ranking() = genericRanking(userDataRepository, userPlaylogRepository)
}

View File

@@ -4,10 +4,7 @@ import ext.API
import ext.RP
import ext.Str
import icu.samnyan.aqua.net.db.AquaUserServices
import icu.samnyan.aqua.net.utils.TrendLog
import icu.samnyan.aqua.net.utils.findTrend
import icu.samnyan.aqua.net.utils.genericUserSummary
import icu.samnyan.aqua.net.utils.mai2Scores
import icu.samnyan.aqua.net.utils.*
import icu.samnyan.aqua.sega.maimai2.dao.userdata.UserDataRepository
import icu.samnyan.aqua.sega.maimai2.dao.userdata.UserGeneralDataRepository
import icu.samnyan.aqua.sega.maimai2.dao.userdata.UserPlaylogRepository
@@ -41,4 +38,6 @@ class Maimai2(
genericUserSummary(u, userDataRepository, userPlaylogRepository, shownRanks, ratingComposition)
}
override fun ranking() = genericRanking(userDataRepository, userPlaylogRepository)
}

View File

@@ -33,9 +33,22 @@ data class GenericGameSummary(
val recent: List<IGenericGamePlaylog>
)
data class GenericRankingPlayer(
val rank: Int,
val name: String,
val accuracy: Double,
val rating: Int,
val allPerfect: Int,
val fullCombo: Int,
val lastSeen: String
)
interface GameApiController {
@API("trend")
fun trend(@RP username: String): List<TrendOut>
@API("user-summary")
fun userSummary(@RP username: String): GenericGameSummary
@API("ranking")
fun ranking(): List<GenericRankingPlayer>
}

View File

@@ -2,10 +2,7 @@ package icu.samnyan.aqua.net.games
import ext.API
import icu.samnyan.aqua.net.db.AquaUserServices
import icu.samnyan.aqua.net.utils.TrendLog
import icu.samnyan.aqua.net.utils.findTrend
import icu.samnyan.aqua.net.utils.genericUserSummary
import icu.samnyan.aqua.net.utils.ongekiScores
import icu.samnyan.aqua.net.utils.*
import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserDataRepository
import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserGeneralDataRepository
import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserPlaylogRepository
@@ -34,4 +31,6 @@ class Ongeki(
genericUserSummary(u, userDataRepository, userPlaylogRepository, shownRanks, mapOf())
}
override fun ranking() = genericRanking(userDataRepository, userPlaylogRepository)
}

View File

@@ -3,6 +3,7 @@ package icu.samnyan.aqua.net.utils
import ext.minus
import icu.samnyan.aqua.net.db.AquaNetUser
import icu.samnyan.aqua.net.games.GenericGameSummary
import icu.samnyan.aqua.net.games.GenericRankingPlayer
import icu.samnyan.aqua.net.games.RankCount
import icu.samnyan.aqua.net.games.TrendOut
import icu.samnyan.aqua.sega.general.model.Card
@@ -88,7 +89,7 @@ fun genericUserSummary(
name = user.userName,
iconId = user.iconId,
serverRank = userDataRepo.getRanking(user.playerRating),
accuracy = plays.sumOf { it.achievement }.toDouble() / plays.size,
accuracy = plays.sumOf { it.achievement }.toDouble() / plays.size / 10000.0,
rating = user.playerRating,
ratingHighest = user.highestRating,
ranks = ranks.map { (k, v) -> RankCount(k, v) },
@@ -106,4 +107,24 @@ fun genericUserSummary(
)
}
fun genericRanking(
userDataRepo: GenericUserDataRepo<*, *>,
userPlaylogRepo: GenericPlaylogRepo,
): List<GenericRankingPlayer> {
// TODO: pagination
val users = userDataRepo.findAll().sortedByDescending { it.playerRating }
return users.filter { it.card != null }.mapIndexed { i, user ->
val plays = userPlaylogRepo.findByUserCardExtId(user.card!!.extId)
GenericRankingPlayer(
rank = i + 1,
name = user.userName,
accuracy = plays.sumOf { it.achievement }.toDouble() / plays.size / 10000.0,
rating = user.playerRating,
allPerfect = plays.count { it.achievement == 1010000 },
fullCombo = plays.count { it.isFullCombo },
lastSeen = user.lastPlayDate.toString()
)
}
}