import { Server } from 'socket.io' import { gameMasterLogger } from '#application/logger' import prisma from '#application/prisma' import { TSocket } from '#application/types' import CharacterRepository from '#repositories/characterRepository' import ZoneRepository from '#repositories/zoneRepository' type Payload = { zoneId: number } export default class ZoneDeleteEvent { constructor( private readonly io: Server, private readonly socket: TSocket ) {} public listen(): void { this.socket.on('gm:zone_editor:zone:delete', this.handleEvent.bind(this)) } private async handleEvent(data: Payload, callback: (response: boolean) => void): Promise { try { const character = await CharacterRepository.getById(this.socket.characterId as number) if (!character) { gameMasterLogger.error('gm:zone_editor:zone:delete error', 'Character not found') callback(false) return } if (character.role !== 'gm') { gameMasterLogger.info(`User ${character.id} tried to delete zone but is not a game master.`) callback(false) return } gameMasterLogger.info(`User ${character.id} has deleted a zone via zone editor.`) const zone = await ZoneRepository.getById(data.zoneId) if (!zone) { gameMasterLogger.error('gm:zone_editor:zone:delete error', 'Zone not found') callback(false) return } await prisma.zone.delete({ where: { id: data.zoneId } }) callback(true) // You might want to emit an event to notify other clients about the deleted zone // this.io.emit('gm:zone_deleted', data.zoneId); } catch (error: any) { gameMasterLogger.error('gm:zone_editor:zone:delete error', error.message) callback(false) } } }