From 850b0f3d16ae534b11533f40f6d7b79032baf2f2 Mon Sep 17 00:00:00 2001 From: floriankilian <34104015+floriankilian@users.noreply.github.com> Date: Sat, 2 Aug 2025 07:14:10 +0200 Subject: [PATCH] Convert GameServer's message handler from if to switch #1639 Open (#1649) ## Description: Converted the WebSocket message handler from if-statement chain to switch statements. The outer switch handles message types (`intent`, `ping`, `hash`, `winner`) and the inner switch handles intent types (`mark_disconnected`, `kick_player`). ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced - [ ] I have read and accepted the CLA agreement (only required once). ## Please put your Discord username so you can be contacted if a bug or regression is found: [UN] nvm --- *Fixes #1639* --- src/server/GameServer.ts | 141 ++++++++++++++++++++++----------------- 1 file changed, 80 insertions(+), 61 deletions(-) diff --git a/src/server/GameServer.ts b/src/server/GameServer.ts index d76eebeac..b16dae9b3 100644 --- a/src/server/GameServer.ts +++ b/src/server/GameServer.ts @@ -219,74 +219,93 @@ export class GameServer { return; } const clientMsg = parsed.data; - if (clientMsg.type === "intent") { - if (clientMsg.intent.clientID !== client.clientID) { - this.log.warn( - `client id mismatch, client: ${client.clientID}, intent: ${clientMsg.intent.clientID}`, - ); - return; - } - if (clientMsg.intent.type === "mark_disconnected") { - this.log.warn( - `Should not receive mark_disconnected intent from client`, - ); - return; - } - - // Handle kick_player intent via WebSocket - if (clientMsg.intent.type === "kick_player") { - const authenticatedClientID = client.clientID; - - // Check if the authenticated client is the lobby creator - if (authenticatedClientID !== this.LobbyCreatorID) { - this.log.warn(`Only lobby creator can kick players`, { - clientID: authenticatedClientID, - creatorID: this.LobbyCreatorID, - target: clientMsg.intent.target, - gameID: this.id, - }); + switch (clientMsg.type) { + case "intent": { + if (clientMsg.intent.clientID !== client.clientID) { + this.log.warn( + `client id mismatch, client: ${client.clientID}, intent: ${clientMsg.intent.clientID}`, + ); return; } + switch (clientMsg.intent.type) { + case "mark_disconnected": { + this.log.warn( + `Should not receive mark_disconnected intent from client`, + ); + return; + } - // Don't allow lobby creator to kick themselves - if (authenticatedClientID === clientMsg.intent.target) { - this.log.warn(`Cannot kick yourself`, { - clientID: authenticatedClientID, - }); + // Handle kick_player intent via WebSocket + case "kick_player": { + const authenticatedClientID = client.clientID; + + // Check if the authenticated client is the lobby creator + if (authenticatedClientID !== this.LobbyCreatorID) { + this.log.warn(`Only lobby creator can kick players`, { + clientID: authenticatedClientID, + creatorID: this.LobbyCreatorID, + target: clientMsg.intent.target, + gameID: this.id, + }); + return; + } + + // Don't allow lobby creator to kick themselves + if (authenticatedClientID === clientMsg.intent.target) { + this.log.warn(`Cannot kick yourself`, { + clientID: authenticatedClientID, + }); + return; + } + + // Log and execute the kick + this.log.info(`Lobby creator initiated kick of player`, { + creatorID: authenticatedClientID, + target: clientMsg.intent.target, + gameID: this.id, + kickMethod: "websocket", + }); + + this.kickClient(clientMsg.intent.target); + return; + } + default: { + this.addIntent(clientMsg.intent); + break; + } + } + break; + } + case "ping": { + this.lastPingUpdate = Date.now(); + client.lastPing = Date.now(); + break; + } + case "hash": { + client.hashes.set(clientMsg.turnNumber, clientMsg.hash); + break; + } + case "winner": { + if ( + this.outOfSyncClients.has(client.clientID) || + this.kickedClients.has(client.clientID) || + this.winner !== null + ) { return; } - - // Log and execute the kick - this.log.info(`Lobby creator initiated kick of player`, { - creatorID: authenticatedClientID, - target: clientMsg.intent.target, - gameID: this.id, - kickMethod: "websocket", - }); - - this.kickClient(clientMsg.intent.target); - return; + this.winner = clientMsg; + this.archiveGame(); + break; } - - this.addIntent(clientMsg.intent); - } - if (clientMsg.type === "ping") { - this.lastPingUpdate = Date.now(); - client.lastPing = Date.now(); - } - if (clientMsg.type === "hash") { - client.hashes.set(clientMsg.turnNumber, clientMsg.hash); - } - if (clientMsg.type === "winner") { - if ( - this.outOfSyncClients.has(client.clientID) || - this.kickedClients.has(client.clientID) || - this.winner !== null - ) { - return; + default: { + this.log.warn( + `Unknown message type: ${(clientMsg as any).type}`, + { + clientID: client.clientID, + }, + ); + break; } - this.winner = clientMsg; - this.archiveGame(); } } catch (error) { this.log.info(