From e29a3ec08b743ca62e4cc9b27aa18abf837d0bd0 Mon Sep 17 00:00:00 2001 From: aemino Date: Wed, 26 Jul 2017 01:10:21 -0700 Subject: [PATCH] Handle unexpected disconnects via packets (#1521) --- src/client/voice/ClientVoiceManager.js | 10 +++++++--- src/client/voice/VoiceConnection.js | 12 +++++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/client/voice/ClientVoiceManager.js b/src/client/voice/ClientVoiceManager.js index 400a752cc..daeceb83a 100644 --- a/src/client/voice/ClientVoiceManager.js +++ b/src/client/voice/ClientVoiceManager.js @@ -1,4 +1,5 @@ const Collection = require('../../util/Collection'); +const Constants = require('../../util/Constants'); const VoiceConnection = require('./VoiceConnection'); const { Error } = require('../../errors'); @@ -31,10 +32,13 @@ 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.status !== Constants.VoiceStatus.DISCONNECTED) { + connection._disconnect(); + 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 68b2b0fbb..d15c8ffbc 100644 --- a/src/client/voice/VoiceConnection.js +++ b/src/client/voice/VoiceConnection.js @@ -307,7 +307,14 @@ class VoiceConnection extends EventEmitter { this.sendVoiceStateUpdate({ channel_id: null, }); - this.player.destroy(); + this._disconnect(); + } + + /** + * Internally disconnects (doesn't send disconnect packet.) + * @private + */ + _disconnect() { this.cleanup(); this.status = Constants.VoiceStatus.DISCONNECTED; /** @@ -317,11 +324,14 @@ class VoiceConnection extends EventEmitter { this.emit('disconnect'); } + /** * Cleans up after disconnect. * @private */ cleanup() { + this.player.destroy(); + const { ws, udp } = this.sockets; if (ws) {