import { Server } from 'socket.io' import { TSocket } from '../../../utilities/types' import ZoneRepository from '../../../repositories/zoneRepository' import { Zone } from '@prisma/client' import prisma from '../../../utilities/prisma' import CharacterRepository from '../../../repositories/characterRepository' import { gameMasterLogger } from '../../../utilities/logger' type Payload = { name: string width: number height: number } export default class ZoneCreateEvent { constructor( private readonly io: Server, private readonly socket: TSocket ) {} public listen(): void { this.socket.on('gm:zone_editor:zone:create', this.handleZoneCreate.bind(this)) } private async handleZoneCreate(data: Payload, callback: (response: Zone[]) => void): Promise { try { const character = await CharacterRepository.getById(this.socket.characterId as number) if (!character) { gameMasterLogger.error('gm:zone_editor:zone:create error', 'Character not found') callback([]) return } if (character.role !== 'gm') { gameMasterLogger.info(`User ${character.id} tried to create zone but is not a game master.`) callback([]) return } gameMasterLogger.info(`User ${character.id} has created a new zone via zone editor.`) const zone = await prisma.zone.create({ data: { name: data.name, width: data.width, height: data.height, tiles: Array.from({ length: data.height }, () => Array.from({ length: data.width }, () => 'blank_tile')) } }) const zoneList = await ZoneRepository.getAll() callback(zoneList) // You might want to emit an event to notify other clients about the new zone // this.io.emit('gm:zone_created', zone); } catch (error: any) { gameMasterLogger.error('gm:zone_editor:zone:create error', error.message) this.socket.emit('notification', { message: 'Failed to create zone.' }) callback([]) } } }