Store user's id and send it to them.

Right now this is isn't used for anything, it will be eventually be used to allow the same person to reconnect to the same game after a disconnect.
This commit is contained in:
Oliver-Akins 2020-10-21 20:55:01 -06:00
parent aca7d25526
commit 7a3e50d522
5 changed files with 33 additions and 12 deletions

View file

@ -14,7 +14,7 @@ that the host is able to just send that to the other players
import { Server, Socket } from 'socket.io';
import { Game } from '../utils/Game';
import { active_games, log } from '../main';
import { generate_game_code } from '../utils/ids';
import { generate_game_code, generate_user_id } from '../utils/ids';
export const HostGame = (io: Server, socket: Socket, data: HostGame) => {
try {
@ -30,14 +30,16 @@ export const HostGame = (io: Server, socket: Socket, data: HostGame) => {
// Create the game
let game = new Game(game_code);
game.add_player(data.username, socket.id, true);
let uuid = generate_user_id();
game.add_player(data.username, socket.id, uuid, true);
active_games[game_code] = game;
log.info(`${data.username} created a game. (Gamecode: ${game_code})`);
// Respond to client
socket.emit(`HostInformation`, {
success: true,
game_code: game_code
game_code: game_code,
uuid: uuid,
});
} catch (err) {
log.prettyError(err);

View file

@ -10,6 +10,7 @@ Emissions:
*/
import { Server, Socket } from 'socket.io';
import { active_games, log } from '../main';
import { generate_user_id } from '../utils/ids';
export const JoinGame = (io: Server, socket: Socket, data: JoinGame) => {
try {
// Check if it's an active game
@ -25,17 +26,17 @@ export const JoinGame = (io: Server, socket: Socket, data: JoinGame) => {
let game = active_games[data.game_code];
if (game.status !== `lobby`) {
log.error(`Cannot join the game ${game.code}. (state=${game.status})`)
log.warn(`Cannot join the game ${game.code}. (state=${game.status})`);
socket.emit(`GameJoined`, {
success: false,
message: `That game cannot be joined because it is not in the lobby.`,
});
return;
}
};
// Ensure username is not already taken
if (Object.keys(game.players).includes(data.username)) {
log.error(`${data.username} tried joining game ${game.code} but the name is already taken.`);
log.warn(`${data.username} tried joining game ${game.code} but the name is already taken.`);
socket.emit(`GameJoined`, {
success: false,
message: `That username is already taken, please try another.`,
@ -46,15 +47,21 @@ export const JoinGame = (io: Server, socket: Socket, data: JoinGame) => {
// Add to game room
socket.join(game.code);
// Generate a UUID for the user
let uuid: string;
do {
uuid = generate_user_id()
} while (!game.UUID_free(uuid));
// Add the player
game.add_player(data.username, socket.id);
game.add_player(data.username, socket.id, uuid);
log.info(`${data.username} joined game ${game.code}`);
// Alert player who joined
socket.emit(`GameJoined`, {
success: true,
players: game.players,
})
uuid: uuid,
});
// Alert existing players about new player
socket.to(game.code).emit(`NewPlayer`, {

View file

@ -6,6 +6,7 @@ interface response {
interface HostInformation extends response {
// properties depend on `success` being `true`
game_code?: string;
uuid?: string;
}
// Event is only emitted when the JoinGame event is successful, so there is no
@ -16,7 +17,7 @@ interface NewPlayer {
interface GameJoined extends response {
// properties depend on `success` being `true`
players?: string[];
uuid?: string;
}
interface PlayerList extends response {

1
src/types/db.d.ts vendored
View file

@ -3,6 +3,7 @@ interface player {
role: "liberal"|"fascist"|"hitler"|undefined;
socket: string;
host: boolean;
id: string;
}
type game_states = "lobby";

View file

@ -44,12 +44,13 @@ export class Game {
return this.player_len;
};
public add_player(player: string, id: string, is_host:boolean=false): void {
public add_player(player: string, socket_id: string, id: string, is_host:boolean=false): void {
this._players[player] = {
position: undefined,
socket: socket_id,
role: `liberal`,
host: is_host,
socket: id,
id: id,
};
this.player_len++;
};
@ -105,6 +106,15 @@ export class Game {
};
};
public UUID_free(uuid: string): boolean {
for (var player in this._players) {
if (this._players[player].id == uuid) {
return false;
};
};
return true;
}
public toString(): string {
return `Game(code=${this.code},players=${this.player_len})`;
};