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>
122 lines
2.8 KiB
TypeScript
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;
|
|
}
|