import { Zone } from '@prisma/client' import { Server } from 'socket.io' import { gameMasterLogger } from '#application/logger' import { TSocket } from '#application/types' import CharacterRepository from '#repositories/characterRepository' import ZoneRepository from '#repositories/zoneRepository' interface IPayload { zoneId: number } export default class ZoneRequestEvent { constructor( private readonly io: Server, private readonly socket: TSocket ) {} public listen(): void { this.socket.on('gm:zone_editor:zone:request', this.handleEvent.bind(this)) } private async handleEvent(data: IPayload, callback: (response: Zone | null) => void): Promise { try { const character = await CharacterRepository.getById(this.socket.characterId as number) if (!character) { gameMasterLogger.error('gm:zone_editor:zone:request error', 'Character not found') callback(null) return } if (character.role !== 'gm') { gameMasterLogger.info(`User ${character.id} tried to request zone but is not a game master.`) callback(null) return } gameMasterLogger.info(`User ${character.id} has requested zone via zone editor.`) if (!data.zoneId) { gameMasterLogger.info(`User ${character.id} tried to request zone but did not provide a zone id.`) callback(null) return } const zone = await ZoneRepository.getById(data.zoneId) if (!zone) { gameMasterLogger.info(`User ${character.id} tried to request zone ${data.zoneId} but it does not exist.`) callback(null) return } callback(zone) } catch (error: any) { gameMasterLogger.error('gm:zone_editor:zone:request error', error.message) callback(null) } } }