diff --git a/src/main/java/icu/samnyan/aqua/net/games/Models.kt b/src/main/java/icu/samnyan/aqua/net/games/Models.kt index 24eda438..3b88f9a7 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/Models.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/Models.kt @@ -19,7 +19,6 @@ data class GenericGameSummary( val rating: Int, val ratingHighest: Int, val ranks: List, - val detailedRanks: Map>, val maxCombo: Int, val fullCombo: Int, val allPerfect: Int, diff --git a/src/main/java/icu/samnyan/aqua/net/utils/GameHelper.kt b/src/main/java/icu/samnyan/aqua/net/utils/GameHelper.kt index ae637266..10705f85 100644 --- a/src/main/java/icu/samnyan/aqua/net/utils/GameHelper.kt +++ b/src/main/java/icu/samnyan/aqua/net/utils/GameHelper.kt @@ -95,20 +95,11 @@ fun genericUserSummary( val user = userDataRepo.findByCard(card) ?: (404 - "Game data not found") val plays = userPlaylogRepo.findByUserCardExtId(card.extId) - // Detailed ranks: Find the number of each rank in each level category - // map> - // TODO: Not all games have difficulty from 1 to 15 - val detailedRanks = (1..15).associateWith { lvl -> - shownRanks.associate { (_, v) -> v to 0 }.toMutableMap().also { ranks -> - plays.filter { lvl < it.level && it.level < lvl + 1 }.forEach { - shownRanks.find { (s, _) -> it.achievement > s }?.let { (_, v) -> ranks[v] = ranks[v]!! + 1 } - } - } - } - - // Collapse detailed ranks to get non-detailed ranks map - val ranks = detailedRanks.values.first().keys.associateWith { rank -> - detailedRanks.values.sumOf { it[rank] ?: 0 } + // O(6n) ranks algorithm: Loop through the entire list of plays, + // count the number of each rank + val ranks = shownRanks.associate { (_, v) -> v to 0 }.toMutableMap() + plays.forEach { + shownRanks.find { (s, _) -> it.achievement > s }?.let { (_, v) -> ranks[v] = ranks[v]!! + 1 } } return GenericGameSummary( @@ -120,7 +111,6 @@ fun genericUserSummary( rating = user.playerRating, ratingHighest = user.highestRating, ranks = ranks.map { (k, v) -> RankCount(k, v) }, - detailedRanks = detailedRanks, maxCombo = plays.maxOfOrNull { it.maxCombo } ?: 0, fullCombo = plays.count { it.isFullCombo }, allPerfect = plays.count { it.isAllPerfect },