fix problem with updating spectator count

This commit is contained in:
AlecM33
2022-12-30 14:26:14 -05:00
parent feee7146ce
commit 138fc08fde
7 changed files with 28 additions and 31 deletions

View File

@@ -50,7 +50,7 @@ export const globals = {
SYNC_GAME_STATE: 'syncGameState',
START_TIMER: 'startTimer',
PLAYER_LEFT: 'playerLeft',
NEW_SPECTATOR: 'newSpectator',
UPDATE_SPECTATORS: 'newSpectator',
RESTART_GAME: 'restartGame'
},
USER_TYPES: {

View File

@@ -203,12 +203,16 @@ export class InProgress {
}
});
if (this.socket.hasListeners(globals.EVENT_IDS.NEW_SPECTATOR)) {
this.socket.removeAllListeners(globals.EVENT_IDS.NEW_SPECTATOR);
if (this.socket.hasListeners(globals.EVENT_IDS.UPDATE_SPECTATORS)) {
this.socket.removeAllListeners(globals.EVENT_IDS.UPDATE_SPECTATORS);
}
this.socket.on(globals.EVENT_IDS.NEW_SPECTATOR, (spectator) => {
stateBucket.currentGameState.spectators.push(spectator);
this.socket.on(globals.EVENT_IDS.UPDATE_SPECTATORS, (updatedSpectatorList) => {
stateBucket.currentGameState.spectators = updatedSpectatorList;
SharedStateUtil.setNumberOfSpectators(
stateBucket.currentGameState.spectators.length,
document.getElementById('spectator-count')
);
if (this.stateBucket.currentGameState.client.userType === globals.USER_TYPES.MODERATOR
|| this.stateBucket.currentGameState.client.userType === globals.USER_TYPES.TEMPORARY_MODERATOR) {
this.displayAvailableModerators();

View File

@@ -99,8 +99,8 @@ export class Lobby {
}
});
this.socket.on(globals.EVENT_IDS.NEW_SPECTATOR, (spectator) => {
this.stateBucket.currentGameState.spectators.push(spectator);
this.socket.on(globals.EVENT_IDS.UPDATE_SPECTATORS, (updatedSpectatorList) => {
this.stateBucket.currentGameState.spectators = updatedSpectatorList;
SharedStateUtil.setNumberOfSpectators(
this.stateBucket.currentGameState.spectators.length,
document.getElementById('spectator-count')

View File

@@ -1,6 +1,5 @@
#join-game-modal {
border-left: 5px solid #b1afcd;
animation: entrance 0.5s forwards;
transform-origin: center;
display: block;
z-index: 1 !important;
@@ -46,15 +45,3 @@
#game-code {
font-family: "Courier New", monospace;
}
@keyframes entrance {
0% {
opacity: 0;
}
90% {
opacity: 1;
}
100% {
opacity: 1;
}
}

View File

@@ -68,7 +68,7 @@ const globals = {
PLAYER_JOINED: 'playerJoined',
PLAYER_LEFT: 'playerLeft',
SYNC_GAME_STATE: 'syncGameState',
NEW_SPECTATOR: 'newSpectator',
UPDATE_SPECTATORS: 'newSpectator',
BROADCAST: 'broadcast'
},
ENVIRONMENT: {

View File

@@ -184,6 +184,11 @@ class GameManager {
transferModeratorPowers = (socket, game, person, namespace, logger) => {
if (person && (person.out || person.userType === globals.USER_TYPES.SPECTATOR)) {
let spectatorsUpdated = false;
if (game.spectators.includes(person)) {
game.spectators.splice(game.spectators.indexOf(person), 1);
spectatorsUpdated = true;
}
logger.debug('game ' + game.accessCode + ': transferring mod powers to ' + person.name);
if (game.moderator === person) {
person.userType = globals.USER_TYPES.MODERATOR;
@@ -197,16 +202,17 @@ class GameManager {
game.moderator.userType = globals.USER_TYPES.KILLED_PLAYER; // restore their state from before being made mod.
} else if (game.moderator.userType === globals.USER_TYPES.MODERATOR) {
game.moderator.userType = globals.USER_TYPES.SPECTATOR;
if (!game.spectators.includes(game.moderator)) {
game.spectators.push(game.moderator);
}
if (game.spectators.includes(person)) {
game.spectators.splice(game.spectators.indexOf(person), 1);
}
namespace.in(game.accessCode).emit(globals.EVENTS.NEW_SPECTATOR);
game.spectators.push(game.moderator);
spectatorsUpdated = true;
}
person.userType = globals.USER_TYPES.MODERATOR;
game.moderator = person;
if (spectatorsUpdated === true) {
namespace.in(game.accessCode).emit(
globals.EVENTS.UPDATE_SPECTATORS,
game.spectators.map((spectator) => GameStateCurator.mapPerson(spectator))
);
}
this.namespace.to(person.socketId).emit(globals.EVENTS.SYNC_GAME_STATE);
this.namespace.to(oldModerator.socketId).emit(globals.EVENTS.SYNC_GAME_STATE);
}
@@ -507,8 +513,8 @@ function addSpectator (game, name, logger, namespace) {
logger.trace('new spectator: ' + spectator.name);
game.spectators.push(spectator);
namespace.in(game.accessCode).emit(
globals.EVENTS.NEW_SPECTATOR,
GameStateCurator.mapPerson(spectator)
globals.EVENTS.UPDATE_SPECTATORS,
game.spectators.map((spectator) => { return GameStateCurator.mapPerson(spectator); })
);
return Promise.resolve(spectator.cookie);
}

View File

@@ -292,7 +292,7 @@ describe('GameManager', () => {
expect(game.spectators.length).toEqual(1);
expect(game.spectators[0].name).toEqual('Jane');
expect(game.spectators[0].userType).toEqual(USER_TYPES.SPECTATOR);
expect(gameManager.namespace.in().emit).toHaveBeenCalledWith(globals.EVENTS.NEW_SPECTATOR, jasmine.anything());
expect(gameManager.namespace.in().emit).toHaveBeenCalledWith(globals.EVENTS.UPDATE_SPECTATORS, jasmine.anything());
});
});