import { Server } from 'socket.io' import { TSocket } from '../../utilities/types' import ZoneRepository from '../../repositories/zoneRepository' import CharacterManager from '../../managers/characterManager' import { gameLogger } from '../../utilities/logger' export default class ZoneLeaveEvent { constructor( private readonly io: Server, private readonly socket: TSocket ) {} public listen(): void { this.socket.on('zone:character:leave', this.handleZoneLeave.bind(this)) } private async handleZoneLeave(): Promise { try { const character = CharacterManager.getCharacterFromSocket(this.socket) if (!character) { gameLogger.error('zone:character:leave error', 'Character not found') return } if (!character.zoneId) { gameLogger.error('zone:character:leave error', 'Character not in a zone') return } const zone = await ZoneRepository.getById(character.zoneId) if (!zone) { gameLogger.error('zone:character:leave error', 'Zone not found') return } this.socket.leave(zone.id.toString()) // let other clients know of character leaving this.io.to(zone.id.toString()).emit('zone:character:leave', character.id) // remove character from zone manager await CharacterManager.removeCharacter(character) gameLogger.info('zone:character:leave', `Character ${character.id} left zone ${zone.id}`) } catch (error: any) { gameLogger.error('zone:character:leave error', error.message) } } }