From 32b390bb201cb4f2784c4398a0eaa68c32257ad6 Mon Sep 17 00:00:00 2001 From: Dennis Postma Date: Sun, 8 Sep 2024 23:55:30 +0200 Subject: [PATCH] Created psuedo game folder, renamed remove events to delete for consistency (CRUD), updated said events to new format --- .../gameMaster/assetManager/sprite/delete.ts | 59 +++++++++++++++++ .../gameMaster/assetManager/sprite/remove.ts | 47 -------------- .../gameMaster/assetManager/tile/delete.ts | 64 +++++++++++++++++++ .../gameMaster/assetManager/tile/remove.ts | 48 -------------- src/game/zone/zoneCharacter.ts | 14 ++++ 5 files changed, 137 insertions(+), 95 deletions(-) create mode 100644 src/events/gameMaster/assetManager/sprite/delete.ts delete mode 100644 src/events/gameMaster/assetManager/sprite/remove.ts create mode 100644 src/events/gameMaster/assetManager/tile/delete.ts delete mode 100644 src/events/gameMaster/assetManager/tile/remove.ts create mode 100644 src/game/zone/zoneCharacter.ts diff --git a/src/events/gameMaster/assetManager/sprite/delete.ts b/src/events/gameMaster/assetManager/sprite/delete.ts new file mode 100644 index 0000000..43981a7 --- /dev/null +++ b/src/events/gameMaster/assetManager/sprite/delete.ts @@ -0,0 +1,59 @@ +import { Server } from 'socket.io' +import { TSocket } from '../../../../utilities/types' +import fs from 'fs' +import path from 'path' +import prisma from '../../../../utilities/prisma' +import logger from '../../../../utilities/logger' + +type Payload = { + id: string +} + +export default class GMSpriteDeleteEvent { + private readonly public_folder: string + + constructor( + private readonly io: Server, + private readonly socket: TSocket + ) { + this.public_folder = path.join(process.cwd(), 'public', 'sprites') + } + + public listen(): void { + this.socket.on('gm:sprite:delete', this.handleSpriteDelete.bind(this)) + } + + private async handleSpriteDelete(data: Payload, callback: (response: boolean) => void): Promise { + if (this.socket.character?.role !== 'gm') { + callback(false) + return + } + + try { + await this.deleteSpriteFolder(data.id) + await this.deleteSpriteFromDatabase(data.id) + + logger.info(`Sprite ${data.id} deleted.`) + callback(true) + } catch (error: any) { + logger.error('gm:sprite:delete error', error.message) + callback(false) + } + } + + private async deleteSpriteFolder(spriteId: string): Promise { + const finalFilePath = path.join(this.public_folder, spriteId) + + if (fs.existsSync(finalFilePath)) { + await fs.promises.rmdir(finalFilePath, { recursive: true }) + } + } + + private async deleteSpriteFromDatabase(spriteId: string): Promise { + await prisma.sprite.delete({ + where: { + id: spriteId + } + }) + } +} \ No newline at end of file diff --git a/src/events/gameMaster/assetManager/sprite/remove.ts b/src/events/gameMaster/assetManager/sprite/remove.ts deleted file mode 100644 index ca2e12b..0000000 --- a/src/events/gameMaster/assetManager/sprite/remove.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Server } from 'socket.io' -import { TSocket } from '../../../../utilities/types' -import fs from 'fs' -import path from 'path' -import prisma from '../../../../utilities/prisma' - -type Payload = { - id: string -} - -/** - * Handle game master remove sprite event - * @param socket - * @param io - */ -export default function (socket: TSocket, io: Server) { - socket.on('gm:sprite:remove', async (data: Payload, callback: (response: boolean) => void) => { - if (socket.character?.role !== 'gm') { - return - } - - try { - // get root path - const public_folder = path.join(process.cwd(), 'public', 'sprites') - - // remove the sprite folder from the disk - const finalFilePath = path.join(public_folder, data.id) - - // check if the folder exists - if (fs.existsSync(finalFilePath)) { - // then remove - fs.rmdirSync(finalFilePath) - } - - await prisma.sprite.delete({ - where: { - id: data.id - } - }) - - callback(true) - } catch (e) { - console.log(e) - callback(false) - } - }) -} diff --git a/src/events/gameMaster/assetManager/tile/delete.ts b/src/events/gameMaster/assetManager/tile/delete.ts new file mode 100644 index 0000000..8093aa7 --- /dev/null +++ b/src/events/gameMaster/assetManager/tile/delete.ts @@ -0,0 +1,64 @@ +import path from 'path' +import fs from 'fs/promises' +import { Server } from 'socket.io' +import { TSocket } from '../../../../utilities/types' +import prisma from '../../../../utilities/prisma' +import logger from '../../../../utilities/logger' + +type Payload = { + id: string +} + +export default class GMTileDeleteEvent { + private readonly public_folder: string + + constructor( + private readonly io: Server, + private readonly socket: TSocket + ) { + this.public_folder = path.join(process.cwd(), 'public', 'tiles') + } + + public listen(): void { + this.socket.on('gm:tile:delete', this.handleTileDelete.bind(this)) + } + + private async handleTileDelete(data: Payload, callback: (response: boolean) => void): Promise { + if (this.socket.character?.role !== 'gm') { + callback(false) + return + } + + try { + logger.info(`Deleting tile ${data.id}`) + await this.deleteTileFromDatabase(data.id) + await this.deleteTileFile(data.id) + + logger.info(`Tile ${data.id} deleted successfully.`) + callback(true) + } catch (error: any) { + logger.error('gm:tile:delete error', error.message) + callback(false) + } + } + + private async deleteTileFromDatabase(tileId: string): Promise { + await prisma.tile.delete({ + where: { + id: tileId + } + }) + } + + private async deleteTileFile(tileId: string): Promise { + const finalFilePath = path.join(this.public_folder, `${tileId}.png`) + try { + await fs.unlink(finalFilePath) + } catch (error: any) { + if (error.code !== 'ENOENT') { + throw error + } + logger.warn(`File ${finalFilePath} does not exist.`) + } + } +} \ No newline at end of file diff --git a/src/events/gameMaster/assetManager/tile/remove.ts b/src/events/gameMaster/assetManager/tile/remove.ts deleted file mode 100644 index 510c533..0000000 --- a/src/events/gameMaster/assetManager/tile/remove.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Server } from 'socket.io' -import { TSocket } from '../../../../utilities/types' -import path from 'path' -import fs from 'fs' -import prisma from '../../../../utilities/prisma' - -type Payload = { - id: string -} - -/** - * Handle game master remove tile event - * @param socket - * @param io - */ -export default function (socket: TSocket, io: Server) { - socket.on('gm:tile:remove', async (data: Payload, callback: (response: boolean) => void) => { - if (socket.character?.role !== 'gm') { - return - } - - try { - await prisma.tile.delete({ - where: { - id: data.id - } - }) - - // get root path - const public_folder = path.join(process.cwd(), 'public', 'tiles') - - // remove the tile from the disk - const finalFilePath = path.join(public_folder, data.id + '.png') - fs.unlink(finalFilePath, (err) => { - if (err) { - console.log(err) - callback(false) - return - } - - callback(true) - }) - } catch (e) { - console.log(e) - callback(false) - } - }) -} diff --git a/src/game/zone/zoneCharacter.ts b/src/game/zone/zoneCharacter.ts new file mode 100644 index 0000000..ef573e9 --- /dev/null +++ b/src/game/zone/zoneCharacter.ts @@ -0,0 +1,14 @@ +import { Character } from '@prisma/client' + +class ZoneCharacter { + private readonly character: Character + private isMoving: boolean = false + + constructor(character: Character) { + this.character = character + } + + public getCharacter(): Character { + return this.character + } +} \ No newline at end of file