"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const express_1 = __importDefault(require("express")); const http_1 = __importDefault(require("http")); const socket_io_1 = require("socket.io"); const admin_ui_1 = require("@socket.io/admin-ui"); const app = (0, express_1.default)(); const server = http_1.default.createServer(app); const io = new socket_io_1.Server(server); class Client { get login() { return this._login; } get password() { return this._password; } get inGame() { return this._inGame; } constructor(login, password) { this._login = login; this._password = password; this._inGame = false; } setInGame(inGame) { this._inGame = inGame; } } class Game { constructor(player1, player2) { this.player1 = player1; this.player2 = player2; this.turn = 1; this.board = [ [0, 0, 0], [0, 0, 0], [0, 0, 0], ]; } } class Room { get availablePlayers() { return this._availablePlayers; } constructor() { this._availablePlayers = new Map(); } addPlayer(player) { this._availablePlayers.set(player.login, player); } removePlayer(player) { this._availablePlayers.delete(player.login); } } let registeredClients = []; let onlineClients = new Map(); let guessersRoom = new Room(); let suggestersRoom = new Room(); app.get("/", (req, res) => { res.send("

Hello world

"); }); 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"); }); }); (0, admin_ui_1.instrument)(io, { auth: false, }); server.listen(9800, () => { console.log("⚡️ listening on *:9800"); });