session id detection improvements

This commit is contained in:
Nathaniel Tampus
2023-03-06 13:06:23 +08:00
parent fe0e045fd8
commit 754d149c4a

View File

@@ -1,5 +1,5 @@
import { activeGames } from "../db/models/game.model.js";
import type { Socket } from "socket.io";
import type { DisconnectReason, Socket } from "socket.io";
import { Chess } from "chess.js";
import { io } from "../server.js";
@@ -10,9 +10,9 @@ export async function joinLobby(this: Socket, gameCode: string) {
return;
}
if (game.white?.id === this.request.session.id) {
if (game.white && game.white?.id === this.request.session.user.id) {
game.white.connected = true;
} else if (game.black?.id === this.request.session.id) {
} else if (game.black && game.black?.id === this.request.session.user.id) {
game.black.connected = true;
} else {
if (game.observers === undefined) game.observers = [];
@@ -32,7 +32,7 @@ export async function joinLobby(this: Socket, gameCode: string) {
io.to(game.code as string).emit("receivedLatestGame", game);
}
export async function leaveLobby(this: Socket, code?: string) {
export async function leaveLobby(this: Socket, reason?: DisconnectReason, code?: string) {
if (this.rooms.size >= 3 && !code) {
console.log(`[WARNING] leaveLobby: room size is ${this.rooms.size}, aborting...`);
return;
@@ -40,26 +40,26 @@ export async function leaveLobby(this: Socket, code?: string) {
const game = activeGames.find(
(g) =>
g.code === (code || this.rooms.size === 2 ? Array.from(this.rooms)[1] : 0) ||
g.black?.id === this.request.session.id ||
g.white?.id === this.request.session.id ||
g.observers?.find((o) => this.request.session.id === o.id)
g.black?.id === this.request.session.user.id ||
g.white?.id === this.request.session.user.id ||
g.observers?.find((o) => this.request.session.user.id === o.id)
);
if (game) {
const user = game.observers?.find((o) => o.id === this.request.session.id);
const user = game.observers?.find((o) => o.id === this.request.session.user.id);
if (user) {
game.observers?.splice(game.observers?.indexOf(user), 1);
}
if (game.black?.id === this.request.session.id) {
if (game.black && game.black?.id === this.request.session.user.id) {
game.black.connected = false;
} else if (game.white?.id === this.request.session.id) {
} else if (game.white && game.white?.id === this.request.session.user.id) {
game.white.connected = false;
}
// count sockets
const sockets = await io.in(game.code as string).fetchSockets();
if (sockets.length <= 1) {
if (sockets.length <= 0 || (reason === undefined && sockets.length <= 1)) {
if (game.timeout) clearTimeout(game.timeout);
game.timeout = Number(
setTimeout(() => {
@@ -90,8 +90,8 @@ export async function sendMove(this: Socket, m: { from: string; to: string; prom
const prevTurn = chess.turn();
if (
(prevTurn === "b" && this.request.session.id !== game.black?.id) ||
(prevTurn === "w" && this.request.session.id !== game.white?.id)
(prevTurn === "b" && this.request.session.user.id !== game.black?.id) ||
(prevTurn === "w" && this.request.session.user.id !== game.white?.id)
) {
throw new Error("not turn to move");
}
@@ -135,7 +135,7 @@ export async function sendMove(this: Socket, m: { from: string; to: string; prom
export async function joinAsPlayer(this: Socket) {
const game = activeGames.find((g) => g.code === Array.from(this.rooms)[1]);
if (!game) return;
const user = game.observers?.find((o) => o.id === this.request.session.id);
const user = game.observers?.find((o) => o.id === this.request.session.user.id);
if (!game.white) {
game.white = this.request.session.user;
game.white.connected = true;