export type CardColor = 'HEARTS' | 'LEAVES' | 'ACORNS' | 'BELLS'; export type CardValue = 'C7' | 'C8' | 'C9' | 'C10' | 'LOWER' | 'UPPER' | 'KING' | 'ACE'; export interface Card { color: CardColor; value: CardValue; } export interface PlayerInfo { order: number; name: string; connected: boolean; player_id?: number; is_bot?: boolean; } export interface MyPlayer { order: number; name: string; token: string; gid: string; } export interface StashData { first_player: number; cards: Record; } export interface GameStatusDetail { active_player?: number; active_round_guesses?: Record; active_round_stashes?: number[]; active_stash?: StashData; previous_stash?: StashData; standings: number[][][]; /** Tips per series/round/seat, same shape as standings. Used to show the * struck-through tip in place of 0 when a tip failed. */ standings_guesses?: number[][][]; } export interface GameStatusPayload { gid: string; completed: boolean; players: PlayerInfo[]; series_number: number; round_number: number; cards_in_round: number; status: GameStatusDetail; } export interface GameInfo { gid: string; name: string; started: boolean; players: PlayerInfo[]; } export type Hand = Record; // --- authentication (TOTP) --- export interface Account { player_id: number; username: string; } export interface Registration { username: string; secret: string; otpauth_uri: string; } // --- history --- export interface HistoryGame { gid: string; name: string; created_at: string | null; ended_at: string | null; players: string[]; my_points: number; /** True = dohraná naplno; false = predčasne ukončená (dá sa obnoviť do lobby). */ completed: boolean; } export interface GameDetailRound { series_number: number; round_number: number; player_id: number; username: string | null; guess: number; points: number; won: boolean; } export interface GameDetail { gid: string; name: string; created_at: string | null; ended_at: string | null; players: { player_id: number; username: string }[]; rounds: GameDetailRound[]; }