61 lines
2.0 KiB
TypeScript
61 lines
2.0 KiB
TypeScript
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<any> {
|
|
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).' })
|
|
}
|
|
}
|
|
}
|