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 CharacterManager from '../../../managers/characterManager' import characterRepository from '../../../repositories/characterRepository' import logger from '../../../utilities/logger' type Payload = { name: string width: number height: number } /** * Handle game master zone create event * @param socket * @param io */ export default function (socket: TSocket, io: Server) { socket.on('gm:zone_editor:zone:create', async (data: Payload, callback: (response: Zone[]) => void) => { const character = await characterRepository.getById(socket.characterId as number); if (!character) return if (character.role !== 'gm') { logger.info(`User ${character.id} tried to create zone but is not a game master.`) return } logger.info(`User ${character.id} has created a new zone via zone editor.`) let zoneList: Zone[] = [] try { 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')) } }) zoneList = await ZoneRepository.getAll() callback(zoneList) // send over zone and characters to socket } catch (e) { console.error(e) socket.emit('notification', { message: 'Failed to create zoneEditor.' }) callback(zoneList) } }) }