From 9989409c13cbe7d32df083a364d249413ab5cbe2 Mon Sep 17 00:00:00 2001 From: Oliver-Akins Date: Sat, 2 Jan 2021 00:33:23 -0700 Subject: [PATCH] Implement LeaveGame event --- server/src/events/LeaveGame.ts | 73 ++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 server/src/events/LeaveGame.ts diff --git a/server/src/events/LeaveGame.ts b/server/src/events/LeaveGame.ts new file mode 100644 index 0000000..92b33cd --- /dev/null +++ b/server/src/events/LeaveGame.ts @@ -0,0 +1,73 @@ +import { games, log } from '../main'; +import { Server, Socket } from 'socket.io'; + +export default (io: Server, socket: Socket, data: LeaveGame) => { + try { + + // Assert game exists + if (!games[data.game_code]) { + log.debug(`Could not find a game with ID ${data.game_code} to leave`); + socket.emit(`GameJoined`, { + status: 404, + message: `Game with code "${data.game_code}" could not be found`, + source: `JoinGame`, + }); + return; + }; + let game = games[data.game_code]; + + // Ensure it's not the host trying to leave so that the game can + // actually start + if (game.host.socket == socket) { + log.debug(`Host `) + socket.emit(`GameLeft`, { + status: 303, + message: `Can't leave the game as the host, use "DeleteGame".`, + source: `LeaveGame`, + }); + return; + }; + + let player = game.players.find(p => p.socket === socket); + + // Ensure we found a player + if (player != null) { + let role = player.role; + let teamID = player.team; + + // Ensure the team is defined + if (teamID) { + let team = game.teams[teamID - 1]; + + switch (role) { + case "guesser": + log.silly(`Removed ${player.name} from guesser role.`); + team.guessers = team.guessers.filter(p => p.socket !== socket); + break; + case "writer": + log.silly(`Removed ${player.name} from writer role.`); + team.writer = null; + break; + }; + + }; + + game.players = game.players.filter(p => p.socket != socket); + + log.debug(`${player.name} left gID:${game.id}`); + socket.to(game.id).emit(`PlayerUpdate`, { + status: 200, + action: `remove`, + players: game.playerData, + }); + socket.emit(`GameLeft`, { status: 200 }); + }; + } + catch (err) { + socket.emit(`GameLeft`, { + status: 500, + message: `${err.name}: ${err.message}`, + source: ``, + }); + } +}; \ No newline at end of file