Files
Michess/types/index.d.ts
Michess 86fbdd39ed fix: resolve all 3 open Gitea issues
Issue #1 - Bot vs Bot Turnierspiele:
- triggerBotMove ruft sich rekursiv selbst auf wenn der nächste Spieler
  auch ein Bot ist (bot vs bot läuft jetzt vollautomatisch durch)
- startNextRoundGames erstellt aktive Spiele für die nächste Runde wenn
  eine Runde endet; bot vs bot Spiele starten sofort ohne Spectator
- updateRoundResult gibt jetzt die nächste Runden-Daten zurück statt void
- Alle Handler (sendMove, claimAbandoned, claimTimeout, triggerBotMove)
  starten die nächste Runde automatisch

Issue #2 - Bot-Schwierigkeit zu hoch:
- randomChance zu StockfishLevel hinzugefügt: Level 1=80%, 2=50%,
  3=15%, 4=3%, 5-6=0% zufällige Züge statt Stockfish-Best-Move
- Gilt sowohl für Socket-Bot-Züge als auch /v1/ai/move REST-Endpoint

Issue #3 - Turnier beenden + Zurück-Button:
- POST /:code/cancel Endpoint (nur Host), setzt status='finished'
- Turnier-Seite: 'Turnier beenden' Button für Host (rot, outline)
- tournamentCode Feld im Game-Typ; wird beim Erstellen von Turnierspielen
  gesetzt (inkl. Folgerunden)
- GamePage zeigt '← Zur Turnierübersicht' Link wenn tournamentCode gesetzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-15 07:46:40 +02:00

122 lines
2.8 KiB
TypeScript

export interface Game {
id?: number;
pgn?: string;
white?: User;
black?: User;
winner?: "white" | "black" | "draw";
endReason?: "draw" | "checkmate" | "stalemate" | "repetition" | "insufficient" | "abandoned" | "timeout" | "resign";
host?: User;
code?: string;
unlisted?: boolean;
timeout?: number;
observers?: User[];
startedAt?: number;
endedAt?: number;
vsAi?: boolean;
aiLevel?: number;
timeControl?: number;
whiteTimeMs?: number;
blackTimeMs?: number;
lastMoveAt?: number;
tournamentCode?: string;
}
export interface User {
id?: number | string; // string for guest IDs
name?: string | null;
email?: string;
wins?: number;
losses?: number;
draws?: number;
elo?: number;
role?: "user" | "admin";
// mainly for players, not spectators
connected?: boolean;
disconnectedOn?: number;
}
export interface FriendRequest {
id?: number;
fromId?: number;
toId?: number;
fromName?: string;
toName?: string;
status?: "pending" | "accepted" | "rejected";
createdAt?: string;
}
export interface Friendship {
id?: number;
userId?: number;
friendId?: number;
friendName?: string;
wins?: number;
losses?: number;
draws?: number;
createdAt?: string;
}
export interface CorrespondenceGame {
id?: number;
code?: string;
white?: { id?: number; name?: string };
black?: { id?: number; name?: string };
pgn?: string;
winner?: "white" | "black" | "draw";
endReason?: "checkmate" | "stalemate" | "repetition" | "insufficient" | "resign" | "timeout" | "draw";
daysPerMove?: number;
lastMoveAt?: number;
startedAt?: number;
endedAt?: number;
}
export interface Tournament {
id?: number;
code?: string;
name?: string;
hostId?: number;
hostName?: string;
status?: "waiting" | "active" | "finished";
timeControl?: number;
maxPlayers?: number;
currentRound?: number;
totalRounds?: number;
players?: TournamentPlayer[];
rounds?: TournamentRound[];
createdAt?: number;
}
export interface TournamentPlayer {
tournamentId?: number;
userId?: number;
userName?: string;
score?: number;
gamesPlayed?: number;
}
export type NotificationType = "friendRequest" | "friendAccepted" | "gameInvite";
export interface AppNotification {
id: string;
type: NotificationType;
fromId: number;
fromName: string;
gameCode?: string;
createdAt: number;
read: boolean;
}
export interface TournamentRound {
id?: number;
tournamentId?: number;
round?: number;
gameCode?: string;
gameId?: number;
whiteId?: number;
whiteName?: string;
blackId?: number;
blackName?: string;
result?: "white" | "black" | "draw" | null;
}