响应格式
verify-code 200
{
"playerId": "uuid",
"internalEmail": "player:uuid@game.local",
"displayName": "玩家 #042",
"playerNumber": 42
}
publish-login-code 200
{
"message": "Login code published",
"code": "384729"
}
next-question 200
{
"message": "新题目已发布",
"question": {
"id": "q_1717234567890",
"question": "...",
"optionA": "...",
"optionB": "...",
"startTime": "ISO8601"
}
}
RoomState
interface RoomState {
status: 'waiting' | 'playing' | 'ended';
currentQuestion: MinorityQuestion | null;
round: number;
answers: { A: number; B: number } | null;
timeLeft: number;
survivorsCount: number;
eliminatedCount: number;
winner?: string | null;
tie?: string[] | null;
}
PlayerGameState
interface PlayerGameState {
status: 'waiting' | 'playing' | 'eliminated' | 'winner' | 'tie';
round: number;
userAnswer: 'A' | 'B' | null;
timeLeft: number;
}
WinnerEventPayload
{
winnerEmail: string;
winnerDisplay?: string; // e.g. "玩家 #017"
}
TieEventPayload
{
finalists: string[];
finalistsDisplay?: string[];
}
LoginCodePayload
{ code: string; } // 6 digits
NextAuth Session
session.user = {
id: string;
email: string;
name?: string; // displayName for code players
isAdmin: boolean;
isDisplay: boolean;
accessToken: string;
}