From 626094cc2c9bfda5ac2ae7e9e1f947060158e00a Mon Sep 17 00:00:00 2001 From: Gavin McDonald Date: Mon, 21 Apr 2025 16:13:30 -0400 Subject: [PATCH] remove players on disconnect --- lib/GameStore.ts | 12 ++++++++++++ server.ts | 14 ++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/GameStore.ts b/lib/GameStore.ts index c696096..5ed876f 100644 --- a/lib/GameStore.ts +++ b/lib/GameStore.ts @@ -7,10 +7,12 @@ const deck = new Deck(); export default class GameStore { private dms: Map; private spectators: Map; + private players: Map; constructor() { this.dms = new Map(); this.spectators = new Map(); + this.players = new Map(); } createGameIDs() { @@ -61,6 +63,7 @@ export default class GameStore { game.players.add(playerID); game.lastUpdated = Date.now(); + this.players.set(playerID, gameID); return this.gameUpdate(game); } @@ -108,6 +111,15 @@ export default class GameStore { return { dmID, spectatorID, cards, settings }; } + playerExit(playerID: string): GameState { + const gameID = this.players.get(playerID); + + if (!gameID) throw new Error(`Player ${playerID} not found`); + + this.players.delete(playerID); + return this.leaveGame(gameID, playerID); + } + deleteGame(gameID: string): void { this.dms.delete(gameID); this.spectators.delete(gameID); diff --git a/server.ts b/server.ts index 3e5687c..b801d1c 100644 --- a/server.ts +++ b/server.ts @@ -52,7 +52,7 @@ app.prepare().then(() => { } catch (e) { const error = e instanceof Error ? e.message : e; - console.error(Date.now(), 'Error', error); + console.error(Date.now(), 'Error[join]', error); socket.emit('join-error', error); } }); @@ -67,7 +67,7 @@ app.prepare().then(() => { } catch (e) { const error = e instanceof Error ? e.message : e; - console.error(Date.now(), 'Error', error); + console.error(Date.now(), 'Error[flip-card]', error); socket.emit('flip-error', error); } }); @@ -78,12 +78,18 @@ app.prepare().then(() => { broadcast('game-update', gameUpdate); } catch (e) { const error = e instanceof Error ? e.message : e; - console.error(Date.now(), 'Error', error); + console.error(Date.now(), 'Error[settings]', error); } }); socket.on('disconnect', () => { - console.log(Date.now(), `Client disconnected: ${socket.id}`); + try { + const { dmID } = gameStore.playerExit(socket.id); + console.log(Date.now(), `Client disconnected: ${socket.id} from ${dmID}`); + } catch (e) { + const error = e instanceof Error ? e.message : e; + console.error(Date.now(), 'Error[disconnect]', error); + } }); });