export interface Settings { port: number; password: string; minimum_players: number; maximum_players: number; waiting_time: number; port_range_min: number; port_range_max: number; games: { name: string; exe: string; }[]; log_level: number; /** Supabase project URL (Settings → API) */ supabase_url?: string; /** Service role key — server only; never ship to Unity or clients */ supabase_service_role_key?: string; /** Secret used to sign session tokens returned to Unity */ auth_jwt_secret?: string; /** * When true, POST /auth/purchase-rc adds RC from a named pack without validating a store receipt. * Set false when real in-app purchase verification is wired up. */ iap_dummy_mode?: boolean; /** Secret for dedicated game server only: PATCH /internal/match/:matchId and .../winner */ dedicated_server_secret?: string; /** Directory for matchmaker.log, history.log (default: "logs" under cwd) */ log_directory?: string; } export interface Player { Name: string; LastSeen: number; /** Authenticated user id (matches public.users.id); first in room = red, second = blue */ UserId: number; /** From latest 10 `matches` rows where user is red or blue; win if winner_id === UserId */ l10_wins: number; l10_losses: number; } export interface Room { Players: Player[]; GameName: string; Port: number; InitTime: number; /** Internal runtime flag: whether the dedicated process has already been started. */ instance_started?: boolean; /** Row id in public.matches; game server uses this with X-Dedicated-Server-Secret */ match_id?: number; /** RC entry fee for this match (matches `public.matches.entry_fee`). */ entry_fee?: number; /** Net RC prize pool for the winner after server fee (derived from `entry_fee`). */ rc_prize?: number; /** Only on GET / responses: authenticated user’s team (Players[0]=red, Players[1]=blue) */ your_team?: 'red' | 'blue' | null; } export interface QueueEntry { Name: string; LastSeen: number; UserId: number; }