diff --git a/package-lock.json b/package-lock.json index 1e519ad..a1d25f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -189,9 +189,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz", - "integrity": "sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.1.tgz", + "integrity": "sha512-ej0phymbFLoCB26dbbq5PGScsf2JAJ4IJHjG10LalgUV36XKTmA4GdA+PVllKvRk0sEKt64X8975qFnkSi0hqA==", "dev": true, "dependencies": { "@types/node": "*", @@ -382,12 +382,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -702,9 +702,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 9d34cf6..a42cb02 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -28,12 +28,12 @@ model User { model Character { id Int @id @default(autoincrement()) + userId Int + user User @relation(fields: [userId], references: [id]) name String position_x Int position_y Int rotation Int - userId Int - user User @relation(fields: [userId], references: [id]) zoneId Int zone Zone @relation(fields: [zoneId], references: [id]) } diff --git a/src/app/UserManager.ts b/src/app/UserManager.ts new file mode 100644 index 0000000..28bc5da --- /dev/null +++ b/src/app/UserManager.ts @@ -0,0 +1,37 @@ +import {User} from "@prisma/client"; + +interface ILoggedInUsers { + users: User[]; +} + +class UserManager { + private loggedInUsers: ILoggedInUsers[] = []; + + // Method to initialize user manager + public async boot() { + console.log('[✅] User manager loaded'); + } + + // Function that adds user to logged in users + public addUser(user: User) { + this.loggedInUsers.push({ + users: [user] + }); + } + + // Function that checks if a user is already logged in + public findUser(user: User) { + return this.loggedInUsers.find((loggedInUser) => { + return loggedInUser.users.includes(user); + }); + } + + // Function that lists all logged in users + public listUsers() { + return this.loggedInUsers.map((loggedInUser) => { + return loggedInUser.users; + }); + } +} + +export default new UserManager(); diff --git a/src/app/ZoneManager.ts b/src/app/ZoneManager.ts index 74836fd..ba727f2 100644 --- a/src/app/ZoneManager.ts +++ b/src/app/ZoneManager.ts @@ -10,7 +10,7 @@ interface ILoadedZone { class ZoneManager { private loadedZones: ILoadedZone[] = []; - // Method to initialize zone loading + // Method to initialize zone manager public async boot() { if (!await ZoneRepository.getById(1)) { const zoneService = new ZoneService(); diff --git a/src/app/events/character.connect.ts b/src/app/events/character.connect.ts index 1f8ea91..bf4291d 100644 --- a/src/app/events/character.connect.ts +++ b/src/app/events/character.connect.ts @@ -1,7 +1,9 @@ import { Socket, Server } from "socket.io"; +import {ISocket} from "../interfaces/socket"; -export default function characterConnect(socket: Socket, io: Server) { +export default function characterConnect(socket: ISocket, io: Server) { socket.on('character:connect', (data) => { + socket.user.username = 'hello' console.log(`---User ${socket.id} has joined.`); }); } \ No newline at end of file diff --git a/src/app/events/characters.get.ts b/src/app/events/characters.get.ts new file mode 100644 index 0000000..5fdfc06 --- /dev/null +++ b/src/app/events/characters.get.ts @@ -0,0 +1,9 @@ +import { Socket, Server } from "socket.io"; +import {ISocket} from "../interfaces/socket"; + +export default function characterConnect(socket: ISocket, io: Server) { + socket.on('characters:get', async (data) => { + console.log(socket.user.username) + console.log(`---characters requested.`); + }); +} \ No newline at end of file diff --git a/src/app/interfaces/character.ts b/src/app/interfaces/character.ts index 3190398..d23e1bc 100644 --- a/src/app/interfaces/character.ts +++ b/src/app/interfaces/character.ts @@ -1,8 +1,8 @@ import { Socket } from 'socket.io'; -import {Character, User} from "@prisma/client"; +import {Character as ICharacter, User} from "@prisma/client"; -interface NQSocket extends Socket +interface Character extends Socket { user?: User, - character?: Character + character?: ICharacter } \ No newline at end of file diff --git a/src/app/interfaces/socket.ts b/src/app/interfaces/socket.ts new file mode 100644 index 0000000..6785b6e --- /dev/null +++ b/src/app/interfaces/socket.ts @@ -0,0 +1,5 @@ +import {Socket} from "socket.io"; + +export interface ISocket extends Socket { + user?: any; +} \ No newline at end of file diff --git a/src/server.ts b/src/server.ts index 8d71e79..c68279e 100644 --- a/src/server.ts +++ b/src/server.ts @@ -8,6 +8,7 @@ import config from './app/utilities/config'; import prisma from './app/utilities/prisma'; import api from "./app/utilities/api"; import ZoneManager from "./app/ZoneManager"; +import UserManager from "./app/UserManager"; export class Server { @@ -54,6 +55,9 @@ export class Server // Add API routes await api.addAuthRoutes(this.app); + // Load user manager + await UserManager.boot(); + // Load zone manager await ZoneManager.boot(); @@ -70,16 +74,12 @@ export class Server const eventsPath = path.join(__dirname, 'app', 'events'); try { const files: string[] = await fs.promises.readdir(eventsPath); - await Promise.all(files.map(async (file) => { - try { - const module = await import(path.join(eventsPath, file)); - module.default(socket, this.io); - } catch (error: any) { - console.error(`[❌] Failed to load event handler ${file}: ${error.message}`); - } - })); + for (const file of files) { + const module = await import(path.join(eventsPath, file)); + module.default(socket, this.io); + } } catch (error: any) { - throw new Error('[❌] Failed to read event handlers directory: ' + error.message); + throw new Error('[❌] Failed to load event handlers: ' + error.message); } } }