diff --git a/server/modules/GameManager.js b/server/modules/GameManager.js index 3befba6..3910704 100644 --- a/server/modules/GameManager.js +++ b/server/modules/GameManager.js @@ -175,12 +175,14 @@ class GameManager { : accessCode; }; - transferModeratorPowers = (game, person, logger) => { + transferModeratorPowers = (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); } else { + const oldModerator = game.moderator; if (game.moderator.userType === globals.USER_TYPES.TEMPORARY_MODERATOR) { game.moderator.userType = globals.USER_TYPES.PLAYER; } else if (game.moderator.gameRole) { // the current moderator was at one point a dealt-in player. @@ -196,9 +198,9 @@ class GameManager { } person.userType = globals.USER_TYPES.MODERATOR; game.moderator = person; + this.namespace.to(person.socketId).emit(globals.EVENTS.SYNC_GAME_STATE); + this.namespace.to(oldModerator.socketId).emit(globals.EVENTS.SYNC_GAME_STATE); } - - this.namespace.in(game.accessCode).emit(globals.EVENTS.SYNC_GAME_STATE); } }; @@ -212,7 +214,7 @@ class GameManager { 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, logger); + this.transferModeratorPowers(game, person, namespace, logger); } } }; diff --git a/server/modules/SocketManager.js b/server/modules/SocketManager.js index 515431c..c540dbf 100644 --- a/server/modules/SocketManager.js +++ b/server/modules/SocketManager.js @@ -85,7 +85,7 @@ class SocketManager { if (!person) { person = game.spectators.find((spectator) => spectator.id === args.personId); } - gameManager.transferModeratorPowers(game, person, this.logger); + gameManager.transferModeratorPowers(game, person, namespace, this.logger); break; case EVENT_IDS.CHANGE_NAME: gameManager.changeName(game, args.data, ackFn); diff --git a/spec/unit/server/modules/GameManager_Spec.js b/spec/unit/server/modules/GameManager_Spec.js index 14d6343..96b33a3 100644 --- a/spec/unit/server/modules/GameManager_Spec.js +++ b/spec/unit/server/modules/GameManager_Spec.js @@ -16,19 +16,22 @@ describe('GameManager', () => { spyOn(logger, 'error'); const inObj = { emit: () => {} }; - namespace = { in: () => { return inObj; } }; + namespace = { in: () => { return inObj; }, to: () => { return inObj; } }; gameManager = new GameManager(logger, globals.ENVIRONMENT.PRODUCTION).getInstance(); gameManager.setGameSocketNamespace(namespace); }); beforeEach(() => { + spyOn(namespace, 'to').and.callThrough(); }); describe('#transferModerator', () => { it('Should transfer successfully from a dedicated moderator to a killed player', () => { const personToTransferTo = new Person('1', '123', 'Joe', USER_TYPES.KILLED_PLAYER); + personToTransferTo.socketId = 'socket1'; personToTransferTo.out = true; const moderator = new Person('3', '789', 'Jack', USER_TYPES.MODERATOR); + moderator.socketId = 'socket2'; const game = new Game( 'abc', globals.STATUS.IN_PROGRESS, @@ -40,16 +43,20 @@ describe('GameManager', () => { moderator.id, new Date().toJSON() ); - gameManager.transferModeratorPowers(game, personToTransferTo, logger); + gameManager.transferModeratorPowers(game, personToTransferTo, namespace, logger); expect(game.moderator).toEqual(personToTransferTo); expect(personToTransferTo.userType).toEqual(USER_TYPES.MODERATOR); expect(moderator.userType).toEqual(USER_TYPES.SPECTATOR); + expect(namespace.to).toHaveBeenCalledWith(personToTransferTo.socketId); + expect(namespace.to).toHaveBeenCalledWith(game.moderator.socketId); }); it('Should transfer successfully from a dedicated moderator to a spectator', () => { const personToTransferTo = new Person('1', '123', 'Joe', USER_TYPES.SPECTATOR); + personToTransferTo.socketId = 'socket1'; const moderator = new Person('3', '789', 'Jack', USER_TYPES.MODERATOR); + moderator.socketId = 'socket2'; const game = new Game( 'abc', globals.STATUS.IN_PROGRESS, @@ -62,17 +69,21 @@ describe('GameManager', () => { new Date().toJSON() ); game.spectators.push(personToTransferTo); - gameManager.transferModeratorPowers(game, personToTransferTo, logger); + gameManager.transferModeratorPowers(game, personToTransferTo, namespace, logger); expect(game.moderator).toEqual(personToTransferTo); expect(personToTransferTo.userType).toEqual(USER_TYPES.MODERATOR); expect(moderator.userType).toEqual(USER_TYPES.SPECTATOR); + expect(namespace.to).toHaveBeenCalledWith(personToTransferTo.socketId); + expect(namespace.to).toHaveBeenCalledWith(game.moderator.socketId); }); it('Should transfer successfully from a temporary moderator to a killed player', () => { const personToTransferTo = new Person('1', '123', 'Joe', USER_TYPES.KILLED_PLAYER); personToTransferTo.out = true; + personToTransferTo.socketId = 'socket1'; const tempMod = new Person('3', '789', 'Jack', USER_TYPES.TEMPORARY_MODERATOR); + tempMod.socketId = 'socket2'; const game = new Game( 'abc', globals.STATUS.IN_PROGRESS, @@ -84,15 +95,18 @@ describe('GameManager', () => { tempMod.id, new Date().toJSON() ); - gameManager.transferModeratorPowers(game, personToTransferTo, logger); + gameManager.transferModeratorPowers(game, personToTransferTo, namespace, logger); expect(game.moderator).toEqual(personToTransferTo); expect(personToTransferTo.userType).toEqual(USER_TYPES.MODERATOR); expect(tempMod.userType).toEqual(USER_TYPES.PLAYER); + expect(namespace.to).toHaveBeenCalledWith(personToTransferTo.socketId); + expect(namespace.to).toHaveBeenCalledWith(game.moderator.socketId); }); it('Should make the temporary moderator a dedicated moderator when they take themselves out of the game', () => { const tempMod = new Person('3', '789', 'Jack', USER_TYPES.TEMPORARY_MODERATOR); + tempMod.socketId = 'socket1'; const personToTransferTo = tempMod; tempMod.out = true; const game = new Game( @@ -106,11 +120,12 @@ describe('GameManager', () => { tempMod.id, new Date().toJSON() ); - gameManager.transferModeratorPowers(game, personToTransferTo, logger); + gameManager.transferModeratorPowers(game, personToTransferTo, namespace, logger); expect(game.moderator).toEqual(personToTransferTo); expect(personToTransferTo.userType).toEqual(USER_TYPES.MODERATOR); expect(tempMod.userType).toEqual(USER_TYPES.MODERATOR); + expect(namespace.to).toHaveBeenCalledOnceWith(personToTransferTo.socketId); }); });