From 385ef5ca933b0a19c0b07062fc1e08d93aeb423e Mon Sep 17 00:00:00 2001 From: Scott Anderson <662325+scottanderson@users.noreply.github.com> Date: Wed, 13 Aug 2025 11:30:34 -0400 Subject: [PATCH] Fix broken intent handling (#1801) ## Description: Restore code that was accidentally deleted in the previous PR. ## 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 --- .../handler/message/PostJoinHandler.ts | 57 ++++++++++++++++--- 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/src/server/worker/websocket/handler/message/PostJoinHandler.ts b/src/server/worker/websocket/handler/message/PostJoinHandler.ts index f2deb50b4..25ba36c47 100644 --- a/src/server/worker/websocket/handler/message/PostJoinHandler.ts +++ b/src/server/worker/websocket/handler/message/PostJoinHandler.ts @@ -40,13 +40,52 @@ export async function postJoinMessageHandler( ); return; } - if (clientMsg.intent.type === "mark_disconnected") { - log.warn( - `Should not receive mark_disconnected intent from client`, - ); - return; + switch (clientMsg.intent.type) { + case "mark_disconnected": { + log.warn(`Should not receive mark_disconnected intent from client`); + return; + } + + // Handle kick_player intent via WebSocket + case "kick_player": { + const authenticatedClientID = client.clientID; + + // Check if the authenticated client is the lobby creator + if (authenticatedClientID !== gs.lobbyCreatorID) { + log.warn(`Only lobby creator can kick players`, { + clientID: authenticatedClientID, + creatorID: gs.lobbyCreatorID, + gameID: gs.id, + target: clientMsg.intent.target, + }); + return; + } + + // Don't allow lobby creator to kick themselves + if (authenticatedClientID === clientMsg.intent.target) { + log.warn(`Cannot kick yourself`, { + clientID: authenticatedClientID, + }); + return; + } + + // Log and execute the kick + log.info(`Lobby creator initiated kick of player`, { + creatorID: authenticatedClientID, + gameID: gs.id, + kickMethod: "websocket", + target: clientMsg.intent.target, + }); + + gs.kickClient(clientMsg.intent.target); + return; + } + + default: { + gs.addIntent(clientMsg.intent); + break; + } } - gs.addIntent(clientMsg.intent); break; } case "ping": { @@ -82,9 +121,9 @@ function handleWinner( client: Client, clientMsg: ClientSendWinnerMessage) { if ( gs.outOfSyncClients.has(client.clientID) || - gs.kickedClients.has(client.clientID) || - gs.winner !== null || - client.reportedWinner !== null + gs.kickedClients.has(client.clientID) || + gs.winner !== null || + client.reportedWinner !== null ) { return; }