diff --git a/src/client/voice/ClientVoiceManager.js b/src/client/voice/ClientVoiceManager.js index a9081efd5..fce2d3b6e 100644 --- a/src/client/voice/ClientVoiceManager.js +++ b/src/client/voice/ClientVoiceManager.js @@ -72,6 +72,8 @@ class ClientVoiceManager { reject(reason); }); + connection.on('debug', msg => this.client.emit('debug', `[VOICE (${channel.guild.id})]: ${msg}`)); + connection.once('authenticated', () => { connection.once('ready', () => { resolve(connection); diff --git a/src/client/voice/VoiceConnection.js b/src/client/voice/VoiceConnection.js index 0242d541d..4d5c23a86 100644 --- a/src/client/voice/VoiceConnection.js +++ b/src/client/voice/VoiceConnection.js @@ -396,6 +396,8 @@ class VoiceConnection extends EventEmitter { const { ws, udp } = this.sockets; + ws.on('debug', msg => this.emit('debug', msg)); + udp.on('debug', msg => this.emit('debug', msg)); ws.on('error', err => this.emit('error', err)); udp.on('error', err => this.emit('error', err)); ws.on('ready', this.onReady.bind(this)); @@ -431,6 +433,7 @@ class VoiceConnection extends EventEmitter { const dispatcher = this.play(new SingleSilence(), { type: 'opus' }); dispatcher.on('finish', () => { clearTimeout(this.connectTimeout); + this.emit('debug', `Ready with authentication details: ${JSON.stringify(this.authentication)}`); /** * Emitted once the connection is ready, when a promise to join a voice channel resolves, * the connection will already be ready. diff --git a/src/client/voice/networking/VoiceUDPClient.js b/src/client/voice/networking/VoiceUDPClient.js index c1dd9e3d0..6c5182d97 100644 --- a/src/client/voice/networking/VoiceUDPClient.js +++ b/src/client/voice/networking/VoiceUDPClient.js @@ -48,6 +48,7 @@ class VoiceConnectionUDPClient extends EventEmitter { } shutdown() { + this.emit('debug', `[UDP] shutdown requested`); if (this.socket) { this.socket.removeAllListeners('message'); try { @@ -77,7 +78,12 @@ class VoiceConnectionUDPClient extends EventEmitter { if (!this.socket) throw new Error('UDP_SEND_FAIL'); if (!this.discordAddress || !this.discordPort) throw new Error('UDP_ADDRESS_MALFORMED'); this.socket.send(packet, 0, packet.length, this.discordPort, this.discordAddress, error => { - if (error) reject(error); else resolve(packet); + if (error) { + this.emit('debug', `[UDP] >> ERROR: ${error}`); + reject(error); + } else { + resolve(packet); + } }); }); } @@ -85,13 +91,14 @@ class VoiceConnectionUDPClient extends EventEmitter { createUDPSocket(address) { this.discordAddress = address; const socket = this.socket = udp.createSocket('udp4'); - + this.emit('debug', `[UDP] created socket`); socket.once('message', message => { // Stop if the sockets have been deleted because the connection has been closed already if (!this.voiceConnection.sockets.ws) return; const packet = parseLocalPacket(message); if (packet.error) { + this.emit('debug', `[UDP] ERROR: ${packet.error}`); this.emit('error', packet.error); return; } @@ -111,6 +118,8 @@ class VoiceConnectionUDPClient extends EventEmitter { }, }); + this.emit('debug', `[UDP] << ${JSON.stringify(packet)}`); + socket.on('message', buffer => this.voiceConnection.receiver.packets.push(buffer)); }); diff --git a/src/client/voice/networking/VoiceWebSocket.js b/src/client/voice/networking/VoiceWebSocket.js index d556145b4..ea2db4395 100644 --- a/src/client/voice/networking/VoiceWebSocket.js +++ b/src/client/voice/networking/VoiceWebSocket.js @@ -39,6 +39,7 @@ class VoiceWebSocket extends EventEmitter { } shutdown() { + this.emit('debug', `[WS] shutdown requested`); this.dead = true; this.reset(); } @@ -47,6 +48,7 @@ class VoiceWebSocket extends EventEmitter { * Resets the current WebSocket. */ reset() { + this.emit('debug', `[WS] reset requested`); if (this.ws) { if (this.ws.readyState !== WebSocket.CLOSED) this.ws.close(); this.ws = null; @@ -58,6 +60,7 @@ class VoiceWebSocket extends EventEmitter { * Starts connecting to the Voice WebSocket Server. */ connect() { + this.emit('debug', `[WS] connect requested`); if (this.dead) return; if (this.ws) this.reset(); if (this.attempts >= 5) { @@ -66,6 +69,7 @@ class VoiceWebSocket extends EventEmitter { } this.attempts++; + this.emit('debug', `[WS] connecting with ${this.attempts} attempts`); /** * The actual WebSocket used to connect to the Voice WebSocket Server. @@ -84,6 +88,7 @@ class VoiceWebSocket extends EventEmitter { * @returns {Promise} */ send(data) { + this.emit('debug', `[WS] >> ${data}`); return new Promise((resolve, reject) => { if (!this.ws || this.ws.readyState !== WebSocket.OPEN) throw new Error('WS_NOT_OPEN', data); this.ws.send(data, null, error => { @@ -110,6 +115,7 @@ class VoiceWebSocket extends EventEmitter { * Called whenever the WebSocket opens. */ onOpen() { + this.emit('debug', `[WS] opened at gateway ${this.connection.authentication.endpoint}`); this.sendPacket({ op: OPCodes.DISPATCH, d: { @@ -140,6 +146,7 @@ class VoiceWebSocket extends EventEmitter { * Called whenever the connection to the WebSocket server is lost. */ onClose() { + this.emit('debug', `[WS] closed`); if (!this.dead) this.client.setTimeout(this.connect.bind(this), this.attempts * 1000); } @@ -156,6 +163,7 @@ class VoiceWebSocket extends EventEmitter { * @param {Object} packet The received packet */ onPacket(packet) { + this.emit('debug', `[WS] << ${JSON.stringify(packet)}`); switch (packet.op) { case VoiceOPCodes.HELLO: this.setHeartbeat(packet.d.heartbeat_interval);