From d6591a2685e960cf084c854db7043ff1656163cc Mon Sep 17 00:00:00 2001 From: Andrew nuark G Date: Sun, 5 Mar 2023 14:59:14 +0700 Subject: [PATCH] Implemented auth flow with db --- src/index.ts | 38 +++++++++++++++++++++++++------------- src/models.ts | 13 +++++++------ 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/index.ts b/src/index.ts index 862acc2..9be7cc2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,6 +7,9 @@ import { instrument } from "@socket.io/admin-ui"; import { Client, AvailableGame, Game } from "./models"; import { pallette, availableColors } from "./pallette"; +import { DirectusDB } from "./directus_db"; + +const db = new DirectusDB(); const app = express(); const server = http.createServer(app); @@ -18,7 +21,7 @@ const io = new Server(server, { }, }); -let registeredClients: Client[] = []; +let cachedClients: Client[] = []; let onlineClients: Map = new Map(); let availableGames: Map = new Map(); let runningGames: Map = new Map(); @@ -37,35 +40,37 @@ app.get("/pallette", (req, res) => { io.on("connection", (socket) => { socket.emit("hello", "I don't know you"); - socket.on("register", (login, password) => { + socket.on("register", async (login, password) => { if (login.length < 3 || login.length > 20 || password.length < 3 || password.length > 20) { socket.emit("register", false, "Login or password is too short or too long"); return; } - if (registeredClients.find((client) => client.login === login)) { + + const newUser = await db.registerUser(login, password); + + if (newUser === null) { socket.emit("register", false, "User with this login already exists"); return; } - const client = new Client(login, password, socket); - registeredClients.push(client); + const client = new Client(newUser!.id, login, socket); + cachedClients.push(client); onlineClients.set(socket, client); socket.emit("register", true, "User registered successfully"); }); - socket.on("login", (login, password) => { + socket.on("login", async (login, password) => { if (login.length < 3 || login.length > 20 || password.length < 3 || password.length > 20) { socket.emit("login", false, "Login or password is too short or too long"); return; } - if (!registeredClients.find((client) => client.login === login)) { - socket.emit("login", false, "User with this login does not exist"); + + const user = await db.authenticateUser(login, password); + if (user === null) { + socket.emit("login", false, "Wrong login or password"); return; } - if (registeredClients.find((client) => client.login === login && client.password !== password)) { - socket.emit("login", false, "Wrong password"); - return; - } - onlineClients.set(socket, new Client(login, password, socket)); + + onlineClients.set(socket, new Client(user!.id, login, socket)); socket.emit("login", true, "User logged in successfully"); registerSocketLoggedInFunctions(socket); @@ -255,6 +260,10 @@ function registerSocketLoggedInFunctions(socket: Socket) { client.setInGame(false); opponentPlayer.setInGame(false); runningGames.delete(gameId); + + db.updateStats(client.id, true, false); + db.updateStats(opponentPlayer.id, true, false); + return; } if (game.GameLost()) { @@ -264,6 +273,9 @@ function registerSocketLoggedInFunctions(socket: Socket) { client.setInGame(false); opponentPlayer.setInGame(false); runningGames.delete(gameId); + + db.updateStats(client.id, false, true); + db.updateStats(opponentPlayer.id, false, true); } } diff --git a/src/models.ts b/src/models.ts index fa1b41b..6427379 100644 --- a/src/models.ts +++ b/src/models.ts @@ -2,17 +2,17 @@ import { Socket } from "socket.io"; import { availableColors } from "./pallette"; export class Client { + private _id: string; private _login: string; - private _password: string; private _inGame: Boolean; private _socket: Socket; + public get id() { + return this._id; + } public get login() { return this._login; } - public get password() { - return this._password; - } public get inGame() { return this._inGame; } @@ -20,9 +20,9 @@ export class Client { return this._socket; } - constructor(login: string, password: string, socket: Socket) { + constructor(id: string, login: string, socket: Socket) { + this._id = id; this._login = login; - this._password = password; this._inGame = false; this._socket = socket; } @@ -33,6 +33,7 @@ export class Client { public simplify() { return { + id: this.id, login: this.login, inGame: this.inGame, };