From e489a8004d68ee4cd7a6bf7d6fe922847b830975 Mon Sep 17 00:00:00 2001 From: quin lynch Date: Wed, 25 Aug 2021 07:06:58 -0300 Subject: [PATCH] Fix KeyNotFoundException for stickers in messages --- src/Discord.Net.WebSocket/DiscordSocketClient.cs | 7 ++++++- .../Entities/Guilds/SocketGuild.cs | 6 +++--- .../Entities/Messages/SocketUserMessage.cs | 11 +++++------ .../Entities/Stickers/SocketCustomSticker.cs | 2 +- .../Entities/Stickers/SocketSticker.cs | 2 +- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index 9c5766ba7..455420b6d 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -511,7 +511,12 @@ namespace Discord.WebSocket if (model.GuildId.IsSpecified) { var guild = State.GetGuild(model.GuildId.Value); - sticker = guild.AddOrUpdateSticker(model); + + // since the sticker can be from another guild, check if we are in the guild or its in the cache + if (guild != null) + sticker = guild.AddOrUpdateSticker(model); + else + sticker = SocketSticker.Create(this, model); return sticker; } else diff --git a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs index e34c49811..1d1175f52 100644 --- a/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs +++ b/src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs @@ -1240,10 +1240,10 @@ namespace Discord.WebSocket /// public async ValueTask GetStickerAsync(ulong id, CacheMode mode = CacheMode.AllowDownload, RequestOptions options = null) { - var sticker = _stickers[id]; + var sticker = _stickers.FirstOrDefault(x => x.Key == id); - if (sticker != null) - return sticker; + if (sticker.Value != null) + return sticker.Value; if (mode == CacheMode.CacheOnly) return null; diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs index 8127d54f5..7ff55c613 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs @@ -174,17 +174,16 @@ namespace Discord.WebSocket SocketSticker sticker = null; if (guild != null) - { sticker = guild.GetSticker(stickerItem.Id); - } - if(sticker == null) - { + if (sticker == null) sticker = Discord.GetSticker(stickerItem.Id); - } // if its still null, create an unknown - sticker = SocketUnknownSticker.Create(Discord, stickerItem); + if (sticker == null) + sticker = SocketUnknownSticker.Create(Discord, stickerItem); + + stickers.Add(sticker); } _stickers = stickers.ToImmutable(); diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs index 97aad4f2f..b9c10f4c2 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketCustomSticker.cs @@ -70,7 +70,7 @@ namespace Discord.WebSocket internal SocketCustomSticker Clone() => MemberwiseClone() as SocketCustomSticker; - private string DebuggerDisplay => $"{Name} in {Guild.Name} ({Id})"; + private new string DebuggerDisplay => Guild == null ? base.DebuggerDisplay : $"{Name} in {Guild.Name} ({Id})"; // ICustomSticker ulong? ICustomSticker.AuthorId diff --git a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs index ec3977f19..ce0d3f4fa 100644 --- a/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs +++ b/src/Discord.Net.WebSocket/Entities/Stickers/SocketSticker.cs @@ -76,7 +76,7 @@ namespace Discord.WebSocket } } - private string DebuggerDisplay => $"{Name} ({Id})"; + internal string DebuggerDisplay => $"{Name} ({Id})"; /// public override bool Equals(object obj)