import { Server } from 'socket.io' import { TSocket } from '../../utilities/types' import { Character } from '@prisma/client' import CharacterRepository from '../../repositories/characterRepository' import { ZCharacterCreate } from '../../utilities/zodTypes' import prisma from '../../utilities/prisma' import { gameLogger } from '../../utilities/logger' export default class CharacterCreateEvent { constructor( private readonly io: Server, private readonly socket: TSocket ) {} public listen(): void { this.socket.on('character:create', this.handleCharacterCreate.bind(this)) } private async handleCharacterCreate(data: any): Promise { console.log('character:create requested', data) // zod validate try { data = ZCharacterCreate.parse(data) const user_id = this.socket.user?.id as number // Check if character name already exists const characterExists = await CharacterRepository.getByName(data.name) if (characterExists) { return this.socket.emit('notification', { message: 'Character name already exists' }) } let characters: Character[] = (await CharacterRepository.getByUserId(user_id)) as Character[] if (characters.length >= 4) { return this.socket.emit('notification', { message: 'You can only have 4 characters' }) } const character: Character = await prisma.character.create({ data: { name: data.name, userId: user_id // characterTypeId: 1 // @TODO set to chosen character type } }) characters = [...characters, character] this.socket.emit('character:create:success') this.socket.emit('character:list', characters) gameLogger.info('character:create success') } catch (error: any) { console.log(error) gameLogger.error(`character:create error: ${error.message}`) return this.socket.emit('notification', { message: 'Could not create character. Please try again (later).' }) } } }