Implemented auth flow with db

This commit is contained in:
Andrew 2023-03-05 14:59:14 +07:00
parent 203c8ece2b
commit d6591a2685
2 changed files with 32 additions and 19 deletions

View file

@ -7,6 +7,9 @@ import { instrument } from "@socket.io/admin-ui";
import { Client, AvailableGame, Game } from "./models"; import { Client, AvailableGame, Game } from "./models";
import { pallette, availableColors } from "./pallette"; import { pallette, availableColors } from "./pallette";
import { DirectusDB } from "./directus_db";
const db = new DirectusDB();
const app = express(); const app = express();
const server = http.createServer(app); const server = http.createServer(app);
@ -18,7 +21,7 @@ const io = new Server(server, {
}, },
}); });
let registeredClients: Client[] = []; let cachedClients: Client[] = [];
let onlineClients: Map<Socket, Client> = new Map<Socket, Client>(); let onlineClients: Map<Socket, Client> = new Map<Socket, Client>();
let availableGames: Map<string, AvailableGame> = new Map<string, AvailableGame>(); let availableGames: Map<string, AvailableGame> = new Map<string, AvailableGame>();
let runningGames: Map<string, Game> = new Map<string, Game>(); let runningGames: Map<string, Game> = new Map<string, Game>();
@ -37,35 +40,37 @@ app.get("/pallette", (req, res) => {
io.on("connection", (socket) => { io.on("connection", (socket) => {
socket.emit("hello", "I don't know you"); 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) { 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"); socket.emit("register", false, "Login or password is too short or too long");
return; 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"); socket.emit("register", false, "User with this login already exists");
return; return;
} }
const client = new Client(login, password, socket); const client = new Client(newUser!.id, login, socket);
registeredClients.push(client); cachedClients.push(client);
onlineClients.set(socket, client); onlineClients.set(socket, client);
socket.emit("register", true, "User registered successfully"); 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) { 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"); socket.emit("login", false, "Login or password is too short or too long");
return; 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; return;
} }
if (registeredClients.find((client) => client.login === login && client.password !== password)) {
socket.emit("login", false, "Wrong password"); onlineClients.set(socket, new Client(user!.id, login, socket));
return;
}
onlineClients.set(socket, new Client(login, password, socket));
socket.emit("login", true, "User logged in successfully"); socket.emit("login", true, "User logged in successfully");
registerSocketLoggedInFunctions(socket); registerSocketLoggedInFunctions(socket);
@ -255,6 +260,10 @@ function registerSocketLoggedInFunctions(socket: Socket) {
client.setInGame(false); client.setInGame(false);
opponentPlayer.setInGame(false); opponentPlayer.setInGame(false);
runningGames.delete(gameId); runningGames.delete(gameId);
db.updateStats(client.id, true, false);
db.updateStats(opponentPlayer.id, true, false);
return; return;
} }
if (game.GameLost()) { if (game.GameLost()) {
@ -264,6 +273,9 @@ function registerSocketLoggedInFunctions(socket: Socket) {
client.setInGame(false); client.setInGame(false);
opponentPlayer.setInGame(false); opponentPlayer.setInGame(false);
runningGames.delete(gameId); runningGames.delete(gameId);
db.updateStats(client.id, false, true);
db.updateStats(opponentPlayer.id, false, true);
} }
} }

View file

@ -2,17 +2,17 @@ import { Socket } from "socket.io";
import { availableColors } from "./pallette"; import { availableColors } from "./pallette";
export class Client { export class Client {
private _id: string;
private _login: string; private _login: string;
private _password: string;
private _inGame: Boolean; private _inGame: Boolean;
private _socket: Socket; private _socket: Socket;
public get id() {
return this._id;
}
public get login() { public get login() {
return this._login; return this._login;
} }
public get password() {
return this._password;
}
public get inGame() { public get inGame() {
return this._inGame; return this._inGame;
} }
@ -20,9 +20,9 @@ export class Client {
return this._socket; return this._socket;
} }
constructor(login: string, password: string, socket: Socket) { constructor(id: string, login: string, socket: Socket) {
this._id = id;
this._login = login; this._login = login;
this._password = password;
this._inGame = false; this._inGame = false;
this._socket = socket; this._socket = socket;
} }
@ -33,6 +33,7 @@ export class Client {
public simplify() { public simplify() {
return { return {
id: this.id,
login: this.login, login: this.login,
inGame: this.inGame, inGame: this.inGame,
}; };