From 2f4ae4399604836faecfaeaca01629d8346e3ba0 Mon Sep 17 00:00:00 2001 From: Dennis Postma Date: Sun, 12 May 2024 21:24:14 +0200 Subject: [PATCH] aids --- .../migration.sql | 0 src/app/ZoneManager.ts | 35 ++++++++++--------- src/app/events/character.zone.load.ts | 30 +++++++++++++--- src/app/events/character.zone.load_players.ts | 25 +++++++++++++ src/app/repositories/character.repository.ts | 20 ++++++++++- src/app/repositories/zone.repository.ts | 2 +- src/app/services/user.service.ts | 8 ++++- src/app/services/zone.service.ts | 3 +- src/server.ts | 5 ++- 9 files changed, 100 insertions(+), 28 deletions(-) rename prisma/migrations/{20240511164426_init => 20240512163859_init}/migration.sql (100%) create mode 100644 src/app/events/character.zone.load_players.ts diff --git a/prisma/migrations/20240511164426_init/migration.sql b/prisma/migrations/20240512163859_init/migration.sql similarity index 100% rename from prisma/migrations/20240511164426_init/migration.sql rename to prisma/migrations/20240512163859_init/migration.sql diff --git a/src/app/ZoneManager.ts b/src/app/ZoneManager.ts index 101ee14..74836fd 100644 --- a/src/app/ZoneManager.ts +++ b/src/app/ZoneManager.ts @@ -8,29 +8,16 @@ interface ILoadedZone { } class ZoneManager { - private static instance: ZoneManager; private loadedZones: ILoadedZone[] = []; - private constructor() {} - - // Singleton instance getter - public static getInstance(): ZoneManager { - if (!ZoneManager.instance) { - ZoneManager.instance = new ZoneManager(); - } - return ZoneManager.instance; - } - // Method to initialize zone loading public async boot() { - const zoneRepository = new ZoneRepository(); - - if (!await zoneRepository.getById(1)) { + if (!await ZoneRepository.getById(1)) { const zoneService = new ZoneService(); await zoneService.createDemoZone(); } - const zones = await zoneRepository.getAll(); + const zones = await ZoneRepository.getAll(); for (const zone of zones) { this.loadZone(zone); @@ -62,6 +49,22 @@ class ZoneManager { return loadedZone.zone; }); } + + public addCharacterToZone(zoneId: number, character: Character) { + const loadedZone = this.loadedZones.find((loadedZone) => { + return loadedZone.zone.id === zoneId; + }); + if (loadedZone) { + loadedZone.characters.push(character); + } + } + + public getCharactersInZone(zoneId: number): Character[] { + const loadedZone = this.loadedZones.find((loadedZone) => { + return loadedZone.zone.id === zoneId; + }); + return loadedZone ? loadedZone.characters : []; + } } -export default ZoneManager; +export default new ZoneManager; diff --git a/src/app/events/character.zone.load.ts b/src/app/events/character.zone.load.ts index 0b16d11..2e988f7 100644 --- a/src/app/events/character.zone.load.ts +++ b/src/app/events/character.zone.load.ts @@ -1,7 +1,29 @@ import { Socket, Server } from "socket.io"; +import ZoneRepository from "../repositories/zone.repository"; +import ZoneManager from "../ZoneManager"; -export default function characterZoneLoad(socket: Socket, io: Server) { - socket.on('character:map:load', (data) => { - console.log(`---User ${socket.id} has requested map.`); - }); +interface IZoneLoad { + zoneId?: number; } + +/** + * @TODO: Implement zone loading, check if zone id is given or else load current character zone + * + * Handle character zone load event + * @param socket + * @param io + */ +export default function characterZoneLoad(socket: Socket, io: Server) { + socket.on('character:zone:load', async (data: IZoneLoad) => { + console.log(`---User ${socket.id} has requested zone.`); + + const zone = await ZoneRepository.getById(1); + + // zoneManager.addCharacterToZone(1, socket.user.id) + + io.to(socket.id).emit('character:zone:load', { + success: true, + data: zone + }); + }); +} \ No newline at end of file diff --git a/src/app/events/character.zone.load_players.ts b/src/app/events/character.zone.load_players.ts new file mode 100644 index 0000000..b91b439 --- /dev/null +++ b/src/app/events/character.zone.load_players.ts @@ -0,0 +1,25 @@ +import { Socket, Server } from "socket.io"; +import ZoneRepository from "../repositories/zone.repository"; +import ZoneManager from "../ZoneManager"; + +interface IZoneLoadPlayers { + zoneId: number; +} + +/** + * @TODO: Implement zone loading, check if zone id is given or else load current character zone + * + * Handle character zone load event + * @param socket + * @param io + */ +export default function characterZoneLoad(socket: Socket, io: Server) { + socket.on('character:zone:load:players', async (data: IZoneLoadPlayers) => { + console.log(`---User ${socket.id} has requested zone players for zone.` + data.zoneId); + + io.to(socket.id).emit('character:zone:load:players', { + success: true, + data: ZoneManager.getCharactersInZone(data.zoneId) + }); + }); +} \ No newline at end of file diff --git a/src/app/repositories/character.repository.ts b/src/app/repositories/character.repository.ts index 4900060..325528d 100644 --- a/src/app/repositories/character.repository.ts +++ b/src/app/repositories/character.repository.ts @@ -15,6 +15,24 @@ class CharacterRepository { throw new Error(`Failed to get character by user ID: ${error.message}`); } } + + async create(userId: number, name: string): Promise { + try { + return await prisma.character.create({ + data: { + userId, + name, + position_x: 0, + position_y: 0, + rotation: 0, + zoneId: 1, + }, + }); + } catch (error: any) { + // Handle error + throw new Error(`Failed to create character: ${error.message}`); + } + } } -export default new CharacterService; \ No newline at end of file +export default new CharacterRepository; \ No newline at end of file diff --git a/src/app/repositories/zone.repository.ts b/src/app/repositories/zone.repository.ts index 8b07d19..402529a 100644 --- a/src/app/repositories/zone.repository.ts +++ b/src/app/repositories/zone.repository.ts @@ -50,4 +50,4 @@ class ZoneRepository { } } -export default ZoneRepository; \ No newline at end of file +export default new ZoneRepository; \ No newline at end of file diff --git a/src/app/services/user.service.ts b/src/app/services/user.service.ts index 3bcde63..9d5d4f1 100644 --- a/src/app/services/user.service.ts +++ b/src/app/services/user.service.ts @@ -1,5 +1,6 @@ import bcrypt from "bcryptjs"; import UserRepository from "../repositories/user.repository"; +import CharacterRepository from "../repositories/character.repository"; class UserService { async login(username: string, password: string): Promise { @@ -23,7 +24,12 @@ class UserService { } const hashedPassword = await bcrypt.hash(password, 10); - return await UserRepository.create(username, hashedPassword); + const newUser = await UserRepository.create(username, hashedPassword); + + // @TODO: Create a new character for the user + const newCharacter = await CharacterRepository.create(newUser.id, newUser.username); + + return newUser } } diff --git a/src/app/services/zone.service.ts b/src/app/services/zone.service.ts index 3343398..22ad5c3 100644 --- a/src/app/services/zone.service.ts +++ b/src/app/services/zone.service.ts @@ -5,8 +5,7 @@ class ZoneService { async createDemoZone(): Promise { - const zoneRepo = new ZoneRepository(); - await zoneRepo.create("Demo Zone", 10, 10, [ + await ZoneRepository.create("Demo Zone", 10, 10, [ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], diff --git a/src/server.ts b/src/server.ts index 89b03ea..c2d0128 100644 --- a/src/server.ts +++ b/src/server.ts @@ -55,8 +55,7 @@ export class Server await api.addAuthRoutes(this.app); // Load zone manager - const zoneManager = ZoneManager.getInstance(); - await zoneManager.boot(); + await ZoneManager.boot(); // Listen for socket connections this.io.on('connection', this.handleConnection.bind(this)); @@ -68,7 +67,7 @@ export class Server * @private */ private async handleConnection(socket: Socket) { - const eventsPath = path.join(__dirname, 'events'); + const eventsPath = path.join(__dirname, 'app', 'events'); try { const files: string[] = await fs.promises.readdir(eventsPath); for (const file of files) {