68 lines
2.4 KiB
TypeScript
68 lines
2.4 KiB
TypeScript
import { ZodError } from 'zod'
|
|
|
|
import { BaseEvent } from '#application/base/baseEvent'
|
|
import { ZCharacterCreate } from '#application/zodTypes'
|
|
import { Character } from '#entities/character'
|
|
import CharacterRepository from '#repositories/characterRepository'
|
|
import MapRepository from '#repositories/mapRepository'
|
|
import UserRepository from '#repositories/userRepository'
|
|
|
|
export default class CharacterCreateEvent extends BaseEvent {
|
|
public listen(): void {
|
|
this.socket.on('character:create', this.handleEvent.bind(this))
|
|
}
|
|
|
|
private async handleEvent(data: any): Promise<any> {
|
|
// zod validate
|
|
try {
|
|
data = ZCharacterCreate.parse(data)
|
|
|
|
const userRepository = new UserRepository()
|
|
const characterRepository = new CharacterRepository()
|
|
const mapRepository = new MapRepository()
|
|
|
|
const user = await userRepository.getById(this.socket.userId!)
|
|
|
|
if (!user) {
|
|
return this.socket.emit('notification', { message: 'User not found' })
|
|
}
|
|
|
|
// 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.getId())
|
|
|
|
if (characters.length >= 4) {
|
|
return this.socket.emit('notification', { message: 'You can only have 4 characters' })
|
|
}
|
|
|
|
// @TODO: Change to default location
|
|
const map = await mapRepository.getFirst()
|
|
|
|
const newCharacter = new Character()
|
|
await newCharacter.setName(data.name).setUser(user).setMap(map!).save()
|
|
|
|
if (!newCharacter) {
|
|
return this.socket.emit('notification', { message: 'Failed to create character. Please try again (later).' })
|
|
}
|
|
|
|
characters = [...characters, newCharacter]
|
|
|
|
this.socket.emit('character:create:success')
|
|
this.socket.emit('character:list', characters)
|
|
|
|
this.logger.info('character:create success')
|
|
} catch (error: any) {
|
|
this.logger.error(`character:create error: ${error.message}`)
|
|
if (error instanceof ZodError) {
|
|
return this.socket.emit('notification', { message: error.issues[0].message })
|
|
}
|
|
return this.socket.emit('notification', { message: 'Could not create character. Please try again (later).' })
|
|
}
|
|
}
|
|
}
|