forked from noxious/server
50 lines
1.6 KiB
TypeScript
50 lines
1.6 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 logger from '../../utilities/logger'
|
|
|
|
export default function (socket: TSocket, io: Server) {
|
|
socket.on('character:create', async (data: any) => {
|
|
// zod validate
|
|
try {
|
|
data = ZCharacterCreate.parse(data)
|
|
|
|
const user_id = socket.user?.id as number
|
|
|
|
// Check if character name already exists
|
|
const characterExists = await CharacterRepository.getByName(data.name)
|
|
|
|
if (characterExists) {
|
|
return socket.emit('notification', { message: 'Character name already exists' })
|
|
}
|
|
|
|
let characters: Character[] = (await CharacterRepository.getByUserId(user_id)) as Character[]
|
|
|
|
if (characters.length >= 4) {
|
|
return 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]
|
|
|
|
socket.emit('character:create:success')
|
|
socket.emit('character:list', characters)
|
|
|
|
logger.info('character:create success')
|
|
} catch (error: any) {
|
|
logger.error('character:create error', error)
|
|
return socket.emit('notification', { message: 'Could not create character. Please try again (later).' })
|
|
}
|
|
})
|
|
}
|