mirror of
https://github.com/AlecM33/Werewolf.git
synced 2025-12-26 15:57:50 +01:00
Merge pull request #137 from AlecM33/mod-transfer-fix
emit mod transfer events selectively
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user