diff --git a/server/modules/GameManager.js b/server/modules/GameManager.js index 3910704..8a2b6aa 100644 --- a/server/modules/GameManager.js +++ b/server/modules/GameManager.js @@ -175,12 +175,13 @@ class GameManager { : accessCode; }; - transferModeratorPowers = (game, person, namespace, logger) => { + transferModeratorPowers = (socket, game, person, namespace, logger) => { if (person && (person.out || person.userType === globals.USER_TYPES.SPECTATOR)) { logger.debug('game ' + game.accessCode + ': transferring mod powers to ' + person.name); if (game.moderator === person) { person.userType = globals.USER_TYPES.MODERATOR; this.namespace.to(person.socketId).emit(globals.EVENTS.SYNC_GAME_STATE); + socket.to(game.accessCode).emit(globals.EVENT_IDS.KILL_PLAYER, person.id); } else { const oldModerator = game.moderator; if (game.moderator.userType === globals.USER_TYPES.TEMPORARY_MODERATOR) { @@ -204,17 +205,18 @@ class GameManager { } }; - killPlayer = (game, person, namespace, logger) => { + killPlayer = (socket, game, person, namespace, logger) => { if (person && !person.out) { logger.debug('game ' + game.accessCode + ': killing player ' + person.name); if (person.userType !== globals.USER_TYPES.TEMPORARY_MODERATOR) { person.userType = globals.USER_TYPES.KILLED_PLAYER; } person.out = true; - namespace.in(game.accessCode).emit(globals.EVENT_IDS.KILL_PLAYER, person.id); // temporary moderators will transfer their powers automatically to the first person they kill. if (game.moderator.userType === globals.USER_TYPES.TEMPORARY_MODERATOR) { - this.transferModeratorPowers(game, person, namespace, logger); + this.transferModeratorPowers(socket, game, person, namespace, logger); + } else { + namespace.in(game.accessCode).emit(globals.EVENT_IDS.KILL_PLAYER, person.id); } } }; diff --git a/server/modules/SocketManager.js b/server/modules/SocketManager.js index c540dbf..9b5afc7 100644 --- a/server/modules/SocketManager.js +++ b/server/modules/SocketManager.js @@ -75,7 +75,7 @@ class SocketManager { gameManager.getTimeRemaining(game, socket); break; case EVENT_IDS.KILL_PLAYER: - gameManager.killPlayer(game, game.people.find((person) => person.id === args.personId), namespace, this.logger); + gameManager.killPlayer(socket, game, game.people.find((person) => person.id === args.personId), namespace, this.logger); break; case EVENT_IDS.REVEAL_PLAYER: gameManager.revealPlayer(game, args.personId); diff --git a/spec/unit/server/modules/GameManager_Spec.js b/spec/unit/server/modules/GameManager_Spec.js index 96b33a3..9286824 100644 --- a/spec/unit/server/modules/GameManager_Spec.js +++ b/spec/unit/server/modules/GameManager_Spec.js @@ -9,7 +9,7 @@ const GameStateCurator = require('../../../../server/modules/GameStateCurator'); const logger = require('../../../../server/modules/Logger.js')(false); describe('GameManager', () => { - let gameManager, namespace; + let gameManager, namespace, socket; beforeAll(() => { spyOn(logger, 'debug'); @@ -17,6 +17,7 @@ describe('GameManager', () => { const inObj = { emit: () => {} }; namespace = { in: () => { return inObj; }, to: () => { return inObj; } }; + socket = { id: '123', emit: () => {}, to: () => { return { emit: () => {} }; } }; gameManager = new GameManager(logger, globals.ENVIRONMENT.PRODUCTION).getInstance(); gameManager.setGameSocketNamespace(namespace); }); @@ -43,7 +44,7 @@ describe('GameManager', () => { moderator.id, new Date().toJSON() ); - gameManager.transferModeratorPowers(game, personToTransferTo, namespace, logger); + gameManager.transferModeratorPowers(socket, game, personToTransferTo, namespace, logger); expect(game.moderator).toEqual(personToTransferTo); expect(personToTransferTo.userType).toEqual(USER_TYPES.MODERATOR); @@ -69,7 +70,7 @@ describe('GameManager', () => { new Date().toJSON() ); game.spectators.push(personToTransferTo); - gameManager.transferModeratorPowers(game, personToTransferTo, namespace, logger); + gameManager.transferModeratorPowers(socket, game, personToTransferTo, namespace, logger); expect(game.moderator).toEqual(personToTransferTo); expect(personToTransferTo.userType).toEqual(USER_TYPES.MODERATOR); @@ -95,7 +96,7 @@ describe('GameManager', () => { tempMod.id, new Date().toJSON() ); - gameManager.transferModeratorPowers(game, personToTransferTo, namespace, logger); + gameManager.transferModeratorPowers(socket, game, personToTransferTo, namespace, logger); expect(game.moderator).toEqual(personToTransferTo); expect(personToTransferTo.userType).toEqual(USER_TYPES.MODERATOR); @@ -120,7 +121,7 @@ describe('GameManager', () => { tempMod.id, new Date().toJSON() ); - gameManager.transferModeratorPowers(game, personToTransferTo, namespace, logger); + gameManager.transferModeratorPowers(socket, game, personToTransferTo, namespace, logger); expect(game.moderator).toEqual(personToTransferTo); expect(personToTransferTo.userType).toEqual(USER_TYPES.MODERATOR); @@ -146,7 +147,7 @@ describe('GameManager', () => { mod.id, new Date().toJSON() ); - gameManager.killPlayer(game, player, namespace, logger); + gameManager.killPlayer(socket, game, player, namespace, logger); expect(player.out).toEqual(true); expect(player.userType).toEqual(USER_TYPES.KILLED_PLAYER); @@ -169,11 +170,11 @@ describe('GameManager', () => { tempMod.id, new Date().toJSON() ); - gameManager.killPlayer(game, tempMod, namespace, logger); + gameManager.killPlayer(socket, game, tempMod, namespace, logger); expect(tempMod.out).toEqual(true); expect(tempMod.userType).toEqual(USER_TYPES.TEMPORARY_MODERATOR); - expect(namespace.in().emit).toHaveBeenCalled(); + expect(namespace.in().emit).not.toHaveBeenCalled(); expect(gameManager.transferModeratorPowers).toHaveBeenCalled(); }); });