From 38597de271ade384bdbb70aad60903c252e7d4c9 Mon Sep 17 00:00:00 2001 From: Amish Shah Date: Wed, 15 Aug 2018 14:02:11 +0100 Subject: [PATCH] voice: patch in default VoiceStateUpdate in case on doesn't exist, cache member --- .../packets/handlers/VoiceStateUpdate.js | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/client/websocket/packets/handlers/VoiceStateUpdate.js b/src/client/websocket/packets/handlers/VoiceStateUpdate.js index 97b32e816..57d1cf8b8 100644 --- a/src/client/websocket/packets/handlers/VoiceStateUpdate.js +++ b/src/client/websocket/packets/handlers/VoiceStateUpdate.js @@ -1,6 +1,7 @@ const AbstractHandler = require('./AbstractHandler'); const { Events } = require('../../../../util/Constants'); +const VoiceState = require('../../../../structures/VoiceState'); class VoiceStateUpdateHandler extends AbstractHandler { handle(packet) { @@ -10,14 +11,23 @@ class VoiceStateUpdateHandler extends AbstractHandler { const guild = client.guilds.get(data.guild_id); if (guild) { // Update the state - let oldState = guild.voiceStates.get(data.user_id); - if (oldState) oldState = oldState._clone(); + const oldState = guild.voiceStates.has(data.user_id) ? + guild.voiceStates.get(data.user_id)._clone() : + new VoiceState(guild, { user_id: data.user_id }); + const newState = guild.voiceStates.add(data); - const member = guild.members.get(data.user_id); + + // Get the member + let member = guild.members.get(data.user_id); + if (member && data.member) { + member._patch(data.member); + } else if (data.member && data.member.user && data.member.joined_at) { + member = guild.members.add(data.member); + } + + // Emit event if (member) { - if (member.user.id === client.user.id && data.channel_id) { - client.emit('self.voiceStateUpdate', data); - } + if (member.user.id === client.user.id && data.channel_id) client.emit('self.voiceStateUpdate', data); client.emit(Events.VOICE_STATE_UPDATE, oldState, newState); } } @@ -27,7 +37,7 @@ class VoiceStateUpdateHandler extends AbstractHandler { /** * Emitted whenever a member changes voice state - e.g. joins/leaves a channel, mutes/unmutes. * @event Client#voiceStateUpdate - * @param {?VoiceState} oldState The voice state before the update + * @param {VoiceState} oldState The voice state before the update * @param {VoiceState} newState The voice state after the update */