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