diff --git a/server/src/events/StartGame.ts b/server/src/events/StartGame.ts new file mode 100644 index 0000000..719037b --- /dev/null +++ b/server/src/events/StartGame.ts @@ -0,0 +1,74 @@ +import { Server, Socket } from 'socket.io'; +import { conf, games, log } from '../main'; + +export default (io: Server, socket: Socket, data: StartGame) => { + try { + + // Assert game exists + if (!games[data.game_code]) { + log.debug(`Could not find a game with ID ${data.game_code} to start`); + socket.emit(`GameJoined`, { + status: 404, + message: `Game with code "${data.game_code}" could not be found`, + source: `StartGame`, + }); + return; + }; + let game = games[data.game_code]; + + // Make sure we can't start a game that is already started + if (game.ingame) { + socket.emit(`GameStarted`, { + status: 405, + message: `Can't start a game that is already started`, + source: `StartGame` + }); + return; + }; + + // Ensure the questions deck got populated + if (game.questions.size <= 0) { + game.log.error(`Questions deck has no cards before the game started.`); + socket.emit(`GameStarted`, { + status: 507, + message: `Questions deck failed to parse, try again in a few seconds or start a new game.`, + source: `StartGame` + }); + return; + }; + + for (var team of game.teams) { + if (team.writer == null) { + game.log.info(`No writer on team ${team.id}, aborting start.`); + socket.emit(`GameStarted`, { + status: 418, + message: `A team doesn't have a ${conf.game.writer_name}.`, + source: `StartGame` + }); + return; + } else if (team.guessers.length <= 0) { + game.log.info(`No guessers on team ${team.id}, aborting start.`); + socket.emit(`GameStarted`, { + status: 418, + message: `A team does not have any ${conf.game.guesser_name}s.`, + source: `StartGame` + }); + return; + }; + }; + + // Start the game + game.ingame = true; + game.teams[0].addCardsToHand(game.questions.draw(conf.game.hand_size)); + game.teams[1].addCardsToHand(game.questions.draw(conf.game.hand_size)); + + io.to(game.id).emit(`GameStarted`, { status: 200 }); + } + catch (err) { + socket.emit(`GameStarted`, { + status: 500, + message: `${err.name}: ${err.message}`, + source: ``, + }); + } +}; \ No newline at end of file diff --git a/server/src/types/data.d.ts b/server/src/types/data.d.ts index 9619d2b..693786f 100644 --- a/server/src/types/data.d.ts +++ b/server/src/types/data.d.ts @@ -38,6 +38,12 @@ interface LeaveGame { interface GameLeft extends response {} +interface StartGame { + game_code: string; +} +interface GameStarted extends response {} + + interface GetPastQuestions { game_code: string; team: team; diff --git a/server/src/websocket.ts b/server/src/websocket.ts index faa9b8b..6a0cd76 100644 --- a/server/src/websocket.ts +++ b/server/src/websocket.ts @@ -3,6 +3,7 @@ import { Server, Socket } from "socket.io"; import JoinGame from "./events/JoinGame"; import LeaveGame from "./events/LeaveGame"; +import StartGame from "./events/StartGame"; import CreateGame from "./events/CreateGame"; import DeleteGame from "./events/DeleteGame"; import UpdatePlayer from "./events/UpdatePlayer"; @@ -24,6 +25,7 @@ export default async (conf: config) => { // Game Management socket.on(`CreateGame`, (data: CreateGame) => CreateGame(io, socket, data)); + socket.on(`StartGame`, (data: StartGame) => StartGame(io, socket, data)); socket.on(`DeleteGame`, (data: DeleteGame) => DeleteGame(io, socket, data));