diff --git a/src/client/voice/ClientVoiceManager.js b/src/client/voice/ClientVoiceManager.js index a6a95eee9..d8d3f9fe1 100644 --- a/src/client/voice/ClientVoiceManager.js +++ b/src/client/voice/ClientVoiceManager.js @@ -30,10 +30,15 @@ class ClientVoiceManager { onVoiceStateUpdate({ guild_id, session_id, channel_id }) { const connection = this.connections.get(guild_id); - if (connection) { - connection.channel = this.client.channels.get(channel_id); - connection.setSessionID(session_id); + if (!connection) return; + if (!channel_id) { + connection._disconnect(); + this.connections.delete(guild_id); + return; } + + connection.channel = this.client.channels.get(channel_id); + connection.setSessionID(session_id); } /** diff --git a/src/client/voice/VoiceConnection.js b/src/client/voice/VoiceConnection.js index 93cdd9b07..d57ef2f53 100644 --- a/src/client/voice/VoiceConnection.js +++ b/src/client/voice/VoiceConnection.js @@ -312,6 +312,15 @@ class VoiceConnection extends EventEmitter { this.sendVoiceStateUpdate({ channel_id: null, }); + + this._disconnect(); + } + + /** + * Internally disconnects (doesn't send disconnect packet). + * @private + */ + _disconnect() { this.player.destroy(); this.cleanup(); this.status = Constants.VoiceStatus.DISCONNECTED; @@ -334,6 +343,7 @@ class VoiceConnection extends EventEmitter { ws.removeAllListeners('ready'); ws.removeAllListeners('sessionDescription'); ws.removeAllListeners('speaking'); + ws.shutdown(); } if (udp) udp.removeAllListeners('error'); diff --git a/src/client/websocket/packets/handlers/VoiceStateUpdate.js b/src/client/websocket/packets/handlers/VoiceStateUpdate.js index 162702eb2..2b0b40fc0 100644 --- a/src/client/websocket/packets/handlers/VoiceStateUpdate.js +++ b/src/client/websocket/packets/handlers/VoiceStateUpdate.js @@ -20,7 +20,7 @@ class VoiceStateUpdateHandler extends AbstractHandler { // If the member left the voice channel, unset their speaking property if (!data.channel_id) member.speaking = null; - if (member.user.id === client.user.id && data.channel_id) { + if (member.user.id === client.user.id) { client.emit('self.voiceStateUpdate', data); }