import { Server } from 'socket.io' import { TSocket } from '../utilities/types' import CharacterManager from '../managers/characterManager' import { gameLogger } from '../utilities/logger' export default class DisconnectEvent { constructor( private readonly io: Server, private readonly socket: TSocket ) {} public listen(): void { this.socket.on('disconnect', this.handleDisconnect.bind(this)) } private async handleDisconnect(data: any): Promise { try { if (!this.socket.user) { gameLogger.info('User disconnected but had no user set') return } this.io.emit('user:disconnect', this.socket.user.id) const character = CharacterManager.getCharacterFromSocket(this.socket) if (!character) { gameLogger.info('User disconnected but had no character set') return } character.resetMovement = true gameLogger.info('User disconnected along with their character') await CharacterManager.removeCharacter(character) this.io.in(character.zoneId.toString()).emit('zone:character:leave', character.id) this.io.emit('character:disconnect', character.id) } catch (error: any) { gameLogger.error('disconnect error', error.message) } } }