From ee960c06a5c274ba9d3eb491466239eb3cac3647 Mon Sep 17 00:00:00 2001 From: bsian03 Date: Tue, 13 Jul 2021 21:25:57 +0100 Subject: [PATCH] Fix possibly undefined member in voiceStateUpdate (#1217) Co-authored-by: Erin --- index.d.ts | 5 +++++ lib/gateway/Shard.js | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/index.d.ts b/index.d.ts index 71cc3dbae..211b3e785 100644 --- a/index.d.ts +++ b/index.d.ts @@ -564,6 +564,7 @@ declare namespace Eris { listener: (member: Member, newChannel: AnyVoiceChannel, oldChannel: AnyVoiceChannel) => void ): T; (event: "voiceStateUpdate", listener: (member: Member, oldState: OldVoiceState) => void): T; + (event: "voiceStateUpdate", listener: (member: UncachedMemberVoiceState, oldState: null) => void): T; (event: "warn" | "debug", listener: (message: string, id: number) => void): T; (event: "webhooksUpdate", listener: (data: WebhookData) => void): T; (event: string, listener: (...args: any[]) => void): T; @@ -991,6 +992,10 @@ declare namespace Eris { } // Voice + interface UncachedMemberVoiceState { + id: string; + voiceState: OldVoiceState; + } interface VoiceConnectData { channel_id: string; endpoint: string; diff --git a/lib/gateway/Shard.js b/lib/gateway/Shard.js index afc0dd63d..99a641251 100644 --- a/lib/gateway/Shard.js +++ b/lib/gateway/Shard.js @@ -724,6 +724,20 @@ class Shard extends EventEmitter { } let member = guild.members.get(packet.d.id = packet.d.user_id); if(!member) { + if(!packet.d.member) { + this.emit("voiceStateUpdate", { + id: packet.d.user_id, + voiceState: { + deaf: packet.d.deaf, + mute: packet.d.mute, + selfDeaf: packet.d.self_deaf, + selfMute: packet.d.self_mute, + selfStream: packet.d.self_stream || false, + selfVideo: packet.d.self_video + } + }, null); + break; + } // Updates the member cache with this member for future events. packet.d.member.id = packet.d.user_id; member = guild.members.add(packet.d.member, guild); @@ -788,8 +802,8 @@ class Shard extends EventEmitter { /** * Fired when a guild member's voice state changes * @event Client#voiceStateUpdate - * @prop {Member} member The member - * @prop {Object} oldState The old voice state + * @prop {Member | Object} member The member. If the member is not cached and Discord doesn't send a member payload, this will be an object with `id` and `voiceState` keys. No other property is guaranteed + * @prop {Object?} oldState The old voice state of the member. If the above caveat applies, this will be null * @prop {Boolean} oldState.deaf The previous server deaf status * @prop {Boolean} oldState.mute The previous server mute status * @prop {Boolean} oldState.selfDeaf The previous self deaf status