Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | /** * Practice-Approved Games * * Determines which games are available for practice session game breaks. * * A game is available for practice breaks when BOTH conditions are met: * 1. The game has `practiceBreakReady: true` in its manifest (game opts in) * 2. The game is in the PRACTICE_APPROVED_GAMES whitelist (manual approval) * * This two-layer approach ensures: * - Games must explicitly declare readiness via their manifest * - Admins can still control which ready games are actually offered */ import { getAvailableGames, getGame } from './game-registry' import type { GameDefinition } from './game-sdk/types' import { PRACTICE_APPROVED_GAMES } from './practice-approved-game-list' import type { PracticeApprovedGameName } from './practice-approved-game-list' export { PRACTICE_APPROVED_GAMES, type PracticeApprovedGameName } /** * Check if a game name is in the practice whitelist */ export function isInPracticeWhitelist(gameName: string): gameName is PracticeApprovedGameName { return PRACTICE_APPROVED_GAMES.includes(gameName as PracticeApprovedGameName) } /** * Check if a game is fully approved for practice breaks. * Requires BOTH whitelist inclusion AND practiceBreakReady manifest flag. */ export function isPracticeApprovedGame(gameName: string): boolean { if (!isInPracticeWhitelist(gameName)) return false const game = getGame(gameName) if (!game) return false return game.manifest.practiceBreakReady === true } /** * Get practice-approved games from the registry. * Returns only games that are both whitelisted AND have practiceBreakReady: true. */ export function getPracticeApprovedGames(): GameDefinition<any, any, any>[] { return getAvailableGames().filter( (game) => isInPracticeWhitelist(game.manifest.name) && game.manifest.practiceBreakReady === true ) } /** * Get a random practice-approved game */ export function getRandomPracticeApprovedGame(): GameDefinition<any, any, any> | undefined { const games = getPracticeApprovedGames() if (games.length === 0) return undefined return games[Math.floor(Math.random() * games.length)] } /** * Get a specific practice-approved game by name * Returns undefined if game is not practice-approved */ export function getPracticeApprovedGame( gameName: string ): GameDefinition<any, any, any> | undefined { if (!isPracticeApprovedGame(gameName)) return undefined return getGame(gameName) } |