mirror of
https://github.com/AlecM33/Werewolf.git
synced 2025-12-26 15:57:50 +01:00
4-digit access codes
This commit is contained in:
@@ -4,7 +4,7 @@ export const globals = {
|
|||||||
MAX_CUSTOM_ROLE_NAME_LENGTH: 30,
|
MAX_CUSTOM_ROLE_NAME_LENGTH: 30,
|
||||||
MAX_CUSTOM_ROLE_DESCRIPTION_LENGTH: 500,
|
MAX_CUSTOM_ROLE_DESCRIPTION_LENGTH: 500,
|
||||||
TOAST_DURATION_DEFAULT: 6,
|
TOAST_DURATION_DEFAULT: 6,
|
||||||
ACCESS_CODE_LENGTH: 6,
|
ACCESS_CODE_LENGTH: 4,
|
||||||
PLAYER_ID_COOKIE_KEY: 'play-werewolf-anon-id',
|
PLAYER_ID_COOKIE_KEY: 'play-werewolf-anon-id',
|
||||||
ACCESS_CODE_CHAR_POOL: 'abcdefghijklmnopqrstuvwxyz0123456789',
|
ACCESS_CODE_CHAR_POOL: 'abcdefghijklmnopqrstuvwxyz0123456789',
|
||||||
COMMANDS: {
|
COMMANDS: {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
const globals = {
|
const globals = {
|
||||||
ACCESS_CODE_CHAR_POOL: 'BCDFGHJKLMNPQRSTVWXYZ0123456789',
|
ACCESS_CODE_CHAR_POOL: 'BCDFGHJKLMNPQRSTVWXYZ0123456789',
|
||||||
ACCESS_CODE_LENGTH: 6,
|
ACCESS_CODE_LENGTH: 4,
|
||||||
|
ACCESS_CODE_GENERATION_ATTEMPTS: 50,
|
||||||
CLOCK_TICK_INTERVAL_MILLIS: 10,
|
CLOCK_TICK_INTERVAL_MILLIS: 10,
|
||||||
STALE_GAME_HOURS: 12,
|
STALE_GAME_HOURS: 12,
|
||||||
CLIENT_COMMANDS: {
|
CLIENT_COMMANDS: {
|
||||||
@@ -33,7 +34,8 @@ const globals = {
|
|||||||
},
|
},
|
||||||
ERROR_MESSAGE: {
|
ERROR_MESSAGE: {
|
||||||
GAME_IS_FULL: 'This game is full',
|
GAME_IS_FULL: 'This game is full',
|
||||||
BAD_CREATE_REQUEST: 'Game has invalid options.'
|
BAD_CREATE_REQUEST: 'Game has invalid options.',
|
||||||
|
NO_UNIQUE_ACCESS_CODE: 'Could not generate a unique access code.'
|
||||||
},
|
},
|
||||||
EVENTS: {
|
EVENTS: {
|
||||||
PLAYER_JOINED: 'playerJoined',
|
PLAYER_JOINED: 'playerJoined',
|
||||||
|
|||||||
@@ -171,7 +171,10 @@ class GameManager {
|
|||||||
} else {
|
} else {
|
||||||
// to avoid excessive memory build-up, every time a game is created, check for and purge any stale games.
|
// to avoid excessive memory build-up, every time a game is created, check for and purge any stale games.
|
||||||
pruneStaleGames(this.activeGameRunner.activeGames, this.activeGameRunner.timerThreads, this.logger);
|
pruneStaleGames(this.activeGameRunner.activeGames, this.activeGameRunner.timerThreads, this.logger);
|
||||||
const newAccessCode = this.generateAccessCode();
|
const newAccessCode = this.generateAccessCode(globals.ACCESS_CODE_CHAR_POOL);
|
||||||
|
if (newAccessCode === null) {
|
||||||
|
return Promise.reject(globals.ERROR_MESSAGE.NO_UNIQUE_ACCESS_CODE);
|
||||||
|
}
|
||||||
const moderator = initializeModerator(gameParams.moderatorName, gameParams.hasDedicatedModerator);
|
const moderator = initializeModerator(gameParams.moderatorName, gameParams.hasDedicatedModerator);
|
||||||
moderator.assigned = true;
|
moderator.assigned = true;
|
||||||
if (gameParams.timerParams !== null) {
|
if (gameParams.timerParams !== null) {
|
||||||
@@ -205,15 +208,23 @@ class GameManager {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
generateAccessCode = () => {
|
generateAccessCode = (charPool) => {
|
||||||
const numLetters = globals.ACCESS_CODE_CHAR_POOL.length;
|
const charCount = charPool.length;
|
||||||
const codeDigits = [];
|
let codeDigits, accessCode;
|
||||||
let iterations = globals.ACCESS_CODE_LENGTH;
|
let attempts = 0;
|
||||||
while (iterations > 0) {
|
while (!accessCode || (this.activeGameRunner.activeGames[accessCode] && attempts < globals.ACCESS_CODE_GENERATION_ATTEMPTS)) {
|
||||||
iterations--;
|
codeDigits = [];
|
||||||
codeDigits.push(globals.ACCESS_CODE_CHAR_POOL[getRandomInt(numLetters)]);
|
let iterations = globals.ACCESS_CODE_LENGTH;
|
||||||
|
while (iterations > 0) {
|
||||||
|
iterations--;
|
||||||
|
codeDigits.push(charPool[getRandomInt(charCount)]);
|
||||||
|
}
|
||||||
|
accessCode = codeDigits.join('');
|
||||||
|
attempts ++;
|
||||||
}
|
}
|
||||||
return codeDigits.join('');
|
return this.activeGameRunner.activeGames[accessCode]
|
||||||
|
? null
|
||||||
|
: accessCode;
|
||||||
};
|
};
|
||||||
|
|
||||||
transferModeratorPowers = (game, person, namespace, logger) => {
|
transferModeratorPowers = (game, person, namespace, logger) => {
|
||||||
|
|||||||
@@ -260,4 +260,24 @@ describe('GameManager', () => {
|
|||||||
expect(gameManager.namespace.in().emit).toHaveBeenCalledWith(globals.EVENTS.NEW_SPECTATOR, jasmine.anything());
|
expect(gameManager.namespace.in().emit).toHaveBeenCalledWith(globals.EVENTS.NEW_SPECTATOR, jasmine.anything());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('#generateAccessCode', () => {
|
||||||
|
it('should continue to generate access codes up to the max attempts when the generated code is already in use by another game', () => {
|
||||||
|
gameManager.activeGameRunner.activeGames = {
|
||||||
|
'AAAA': {}
|
||||||
|
};
|
||||||
|
|
||||||
|
const accessCode = gameManager.generateAccessCode(['A']);
|
||||||
|
expect(accessCode).toEqual(null); // we might the max generation attempts of 50.
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should generate and return a unique access code', () => {
|
||||||
|
gameManager.activeGameRunner.activeGames = {
|
||||||
|
'AAAA': {}
|
||||||
|
};
|
||||||
|
|
||||||
|
const accessCode = gameManager.generateAccessCode(['B']);
|
||||||
|
expect(accessCode).toEqual('BBBB');
|
||||||
|
});
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user