import { Server } from 'socket.io' import { TSocket } from '../../utilities/types' import ZoneRepository from '../../repositories/zoneRepository' import { isCommand } from '../../utilities/chat' import { gameLogger } from '../../utilities/logger' import CharacterManager from '../../managers/characterManager' type TypePayload = { message: string } export default class ChatMessageEvent { constructor( private readonly io: Server, private readonly socket: TSocket ) {} public listen(): void { this.socket.on('chat:send_message', this.handleChatMessage.bind(this)) } private async handleChatMessage(data: TypePayload, callback: (response: boolean) => void): Promise { try { if (!data.message || isCommand(data.message)) { callback(false) return } const character = CharacterManager.getCharacterFromSocket(this.socket) if (!character) { gameLogger.error('chat:send_message error', 'Character not found') callback(false) return } const zone = await ZoneRepository.getById(character.zoneId) if (!zone) { gameLogger.error('chat:send_message error', 'Zone not found') callback(false) return } callback(true) this.io.to(zone.id.toString()).emit('chat:message', { character: character, message: data.message }) } catch (error: any) { gameLogger.error('chat:send_message error', error.message) callback(false) } } }