From cfc0f03932753bc715a168f8b0000da8c88d0c34 Mon Sep 17 00:00:00 2001
From: Dennis Postma <dennis@directonline.io>
Date: Fri, 24 May 2024 19:37:15 +0200
Subject: [PATCH] made typescript my bitch

---
 package-lock.json                   | 20 ++++++++--------
 prisma/schema.prisma                |  4 ++--
 src/app/UserManager.ts              | 37 +++++++++++++++++++++++++++++
 src/app/ZoneManager.ts              |  2 +-
 src/app/events/character.connect.ts |  4 +++-
 src/app/events/characters.get.ts    |  9 +++++++
 src/app/interfaces/character.ts     |  6 ++---
 src/app/interfaces/socket.ts        |  5 ++++
 src/server.ts                       | 18 +++++++-------
 9 files changed, 79 insertions(+), 26 deletions(-)
 create mode 100644 src/app/UserManager.ts
 create mode 100644 src/app/events/characters.get.ts
 create mode 100644 src/app/interfaces/socket.ts

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);
         }
     }
 }