fix(android): brancher les classements sur les vrais IDs Play Jeux

La console Play génère les IDs de leaderboard (format CgkI…), contrairement
à l'hypothèse de la spec : l'app demandait des boards questions_N inexistants,
d'où un chargement infini et des scores silencieusement perdus. Remplacer le
mapping par la table des vrais IDs (GameConfig.leaderboardId() devient
nullable, null = pas de board) et logguer les échecs GMS jusqu'ici avalés
par runCatching. Spec corrigée en conséquence (§6, §7).
This commit is contained in:
herel committed 2026-08-31 23:11:22 +02:00
1 parent b7c958cd5b
commit 853541d41b
5 files changed
+60 -14

No files matched your search

@@ -74,7 +74,7 @@ fun App(
scope.launch {
if (gamesServices.isSignedIn() || gamesServices.signIn()) {
if (playerName == null) playerName = gamesServices.playerDisplayName()
gamesServices.showLeaderboard(config.leaderboardId())
config.leaderboardId()?.let { gamesServices.showLeaderboard(it) }
}
}
},
@@ -91,7 +91,9 @@ fun App(
withContext(NonCancellable) {
val score = result.leaderboardScore()
if (score > 0 && (gamesServices.isSignedIn() || gamesServices.signIn())) {
gamesServices.submitScore(result.config.leaderboardId(), score)
result.config.leaderboardId()?.let {
gamesServices.submitScore(it, score)
}
}
}
}
@@ -2,4 +2,17 @@ package com.livrets.games
import com.livrets.game.GameConfig
fun GameConfig.leaderboardId(): String = "questions_$questionCount"
private val leaderboardIds = mapOf(
5 to "CgkIuqy3oN8HEAIQAg",
10 to "CgkIuqy3oN8HEAIQAw",
15 to "CgkIuqy3oN8HEAIQBA",
20 to "CgkIuqy3oN8HEAIQBQ",
25 to "CgkIuqy3oN8HEAIQBg",
30 to "CgkIuqy3oN8HEAIQBw",
35 to "CgkIuqy3oN8HEAIQCA",
40 to "CgkIuqy3oN8HEAIQCQ",
45 to "CgkIuqy3oN8HEAIQCg",
50 to "CgkIuqy3oN8HEAIQCw",
)
fun GameConfig.leaderboardId(): String? = leaderboardIds[questionCount]
@@ -7,6 +7,7 @@ import com.livrets.game.Question
import com.livrets.game.product
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNull
import kotlin.time.Instant
class LeaderboardScoreTest {
@@ -84,7 +85,26 @@ class LeaderboardScoreTest {
@Test
fun `id de board par nombre de questions`() {
assertEquals("questions_10", GameConfig(10, 5, 12).leaderboardId())
assertEquals("questions_5", GameConfig(5, 3, 1).leaderboardId())
val attendu = mapOf(
5 to "CgkIuqy3oN8HEAIQAg",
10 to "CgkIuqy3oN8HEAIQAw",
15 to "CgkIuqy3oN8HEAIQBA",
20 to "CgkIuqy3oN8HEAIQBQ",
25 to "CgkIuqy3oN8HEAIQBg",
30 to "CgkIuqy3oN8HEAIQBw",
35 to "CgkIuqy3oN8HEAIQCA",
40 to "CgkIuqy3oN8HEAIQCQ",
45 to "CgkIuqy3oN8HEAIQCg",
50 to "CgkIuqy3oN8HEAIQCw",
)
attendu.forEach { (questions, id) ->
assertEquals(id, GameConfig(questions, 5, 12).leaderboardId())
}
}
@Test
fun `pas d'id de board hors liste des nombres de questions`() {
assertNull(GameConfig(7, 5, 12).leaderboardId())
assertNull(GameConfig(60, 5, 12).leaderboardId())
}
}