Moving to TS, add user lists commands

This commit is contained in:
Andrew 2023-03-03 01:50:23 +07:00
parent 481d119d3b
commit 7585f6a40b
6 changed files with 1034 additions and 106 deletions

243
src/index.ts Normal file
View file

@ -0,0 +1,243 @@
import express, { Express, Request, Response } from "express";
import http from "http";
import { Server, Socket } from "socket.io";
import { instrument } from "@socket.io/admin-ui";
const app = express();
const server = http.createServer(app);
const io = new Server(server);
class Client {
private _login: String;
private _password: String;
private _inGame: Boolean;
public get login() {
return this._login;
}
public get password() {
return this._password;
}
public get inGame() {
return this._inGame;
}
constructor(login: String, password: String) {
this._login = login;
this._password = password;
this._inGame = false;
}
public setInGame(inGame: Boolean) {
this._inGame = inGame;
}
}
class Game {
private player1: Client;
private player2: Client;
private turn: Number;
private board: Number[][];
constructor(player1: Client, player2: Client) {
this.player1 = player1;
this.player2 = player2;
this.turn = 1;
this.board = [
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
];
}
}
class Room {
private _availablePlayers: Map<String, Client>;
public get availablePlayers() {
return this._availablePlayers;
}
constructor() {
this._availablePlayers = new Map<String, Client>();
}
public addPlayer(player: Client) {
this._availablePlayers.set(player.login, player);
}
public removePlayer(player: Client) {
this._availablePlayers.delete(player.login);
}
}
let registeredClients: Client[] = [];
let onlineClients: Map<Socket, Client> = new Map<Socket, Client>();
let guessersRoom: Room = new Room();
let suggestersRoom: Room = new Room();
app.get("/", (req, res) => {
res.send("<h1>Hello world</h1>");
});
io.on("connection", (socket) => {
console.log("someone connected");
socket.emit("hello", "I don't know you");
socket.on("register", (login, password) => {
console.log("user send register with login: " + login + " and password: " + 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");
console.log("user tried to register with too short or too long login or password");
return;
}
if (registeredClients.find((client) => client.login === login)) {
socket.emit("register", false, "User with this login already exists");
console.log("user tried to register with existing login");
return;
}
registeredClients.push(new Client(login, password));
onlineClients.set(socket, new Client(login, password));
socket.emit("register", true, "User registered successfully");
console.log("user registered successfully");
});
socket.on("login", (login, password) => {
console.log("user send login with login: " + login + " and password: " + 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");
console.log("user tried to login with too short or too long login or password");
return;
}
if (!registeredClients.find((client) => client.login === login)) {
socket.emit("login", false, "User with this login does not exist");
console.log("user tried to login with non existing login");
return;
}
if (registeredClients.find((client) => client.login === login && client.password !== password)) {
socket.emit("login", false, "Wrong password");
console.log("user tried to login with wrong password");
return;
}
onlineClients.set(socket, new Client(login, password));
socket.emit("login", true, "User logged in successfully");
io.emit("updateNeeded");
});
socket.on("getUpdate", () => {
const client = onlineClients.get(socket);
if (client === undefined) {
socket.emit("update", false, 403);
return;
}
socket.emit("update", true, {
guessers: Array.from(guessersRoom.availablePlayers.values()).map((e) => e.login),
suggesters: Array.from(suggestersRoom.availablePlayers.values()).map((e) => e.login),
});
});
socket.on("join", (room) => {
const client = onlineClients.get(socket);
if (client === undefined) {
socket.emit("joinResponse", false, 403);
return;
}
if (client.inGame || guessersRoom.availablePlayers.has(client.login) || suggestersRoom.availablePlayers.has(client.login)) {
socket.emit("joinResponse", false, 400);
return;
}
if (room === "guessers") {
guessersRoom.addPlayer(client);
console.log("user " + client.login + " joined guessers");
socket.emit("joinResponse", [true]);
io.emit("updateNeeded");
} else if (room === "suggesters") {
suggestersRoom.addPlayer(client);
console.log("user " + client.login + " joined suggesters");
socket.emit("joinResponse", [true]);
io.emit("updateNeeded");
} else {
socket.emit("joinResponse", false, 400);
console.log("user " + client.login + " tried to join non existing room");
}
});
socket.on("leave", (room) => {
const client = onlineClients.get(socket);
if (client === undefined) {
socket.emit("leaveResponse", false, 403);
return;
}
if (client.inGame || (!guessersRoom.availablePlayers.has(client.login) && !suggestersRoom.availablePlayers.has(client.login))) {
socket.emit("leaveResponse", false, 400);
return;
}
if (room === "guessers") {
guessersRoom.removePlayer(client);
console.log("user " + client.login + " left guessers");
socket.emit("leaveResponse", [true]);
io.emit("updateNeeded");
} else if (room === "suggesters") {
suggestersRoom.removePlayer(client);
console.log("user " + client.login + " left suggesters");
socket.emit("leaveResponse", [true]);
io.emit("updateNeeded");
} else {
socket.emit("leaveResponse", false, 400);
console.log("user " + client.login + " tried to left non existing room");
}
});
socket.on("sendRequest", (sendTo) => {
const client = onlineClients.get(socket);
if (client === undefined) {
socket.emit("sendRequestResponse", false, 403);
return;
}
if (client.inGame || sendTo === client.login) {
socket.emit("sendRequestResponse", false, 400);
return;
}
const otherClientSocket = Array.from(onlineClients.keys()).find((key) => onlineClients.get(key)!!.login === sendTo);
if (otherClientSocket === undefined) {
socket.emit("sendRequestResponse", false, 404);
return;
}
otherClientSocket.emit("gameRequest", client.login);
socket.emit("sendRequestResponse", [true]);
});
socket.on("disconnect", () => {
const client = onlineClients.get(socket);
if (client !== undefined) {
console.log("user " + client.login + " disconnected");
guessersRoom.removePlayer(client);
suggestersRoom.removePlayer(client);
onlineClients.delete(socket);
} else {
console.log("anonymous disconnected");
}
io.emit("updateNeeded");
});
});
instrument(io, {
auth: false,
});
server.listen(9800, () => {
console.log("⚡️ listening on *:9800");
});