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 { 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<Socket, Client> = new Map<Socket, Client>();
let availableGames: Map<string, AvailableGame> = new Map<string, AvailableGame>();
let runningGames: Map<string, Game> = new Map<string, Game>();
@ -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);
}
}

View file

@ -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,
};