diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs index 1cd35768d..fe13d327e 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.Events.cs @@ -603,13 +603,13 @@ namespace Discord.WebSocket /// /// Fired when a thread is updated within a guild. /// - public event Func ThreadUpdated + public event Func, SocketThreadChannel, Task> ThreadUpdated { add { _threadUpdated.Add(value); } remove { _threadUpdated.Remove(value); } } - internal readonly AsyncEvent> _threadUpdated = new AsyncEvent>(); + internal readonly AsyncEvent, SocketThreadChannel, Task>> _threadUpdated = new(); /// /// Fired when a thread is deleted. diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index b79eeb099..007e9f68a 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -2243,16 +2243,25 @@ namespace Discord.WebSocket return; } - var channel = (SocketThreadChannel)guild.GetChannel(data.Id); + var threadChannel = guild.ThreadChannels.FirstOrDefault(x => x.Id == data.Id); + var before = threadChannel != null + ? new Cacheable(threadChannel.Clone(), data.Id, true, () => Task.FromResult((SocketThreadChannel)null)) + : new Cacheable(null, data.Id, false, () => Task.FromResult((SocketThreadChannel)null)); - if (channel == null) + if (threadChannel != null) { - await UnknownChannelAsync(type, data.Id); - return; - } + threadChannel.Update(State, data); - var before = channel.Clone(); - channel.Update(State, data); + if (data.ThreadMember.IsSpecified) + threadChannel.AddOrUpdateThreadMember(data.ThreadMember.Value, guild.CurrentUser); + } + else + { + // Thread is updated but was not cached, likely meaning the thread was unarchived. + threadChannel = (SocketThreadChannel)guild.AddChannel(State, data); + if (data.ThreadMember.IsSpecified) + threadChannel.AddOrUpdateThreadMember(data.ThreadMember.Value, guild.CurrentUser); + } if (!(guild?.IsSynced ?? true)) { @@ -2260,7 +2269,7 @@ namespace Discord.WebSocket return; } - await TimedInvokeAsync(_threadUpdated, nameof(ThreadUpdated), before, channel).ConfigureAwait(false); + await TimedInvokeAsync(_threadUpdated, nameof(ThreadUpdated), before, threadChannel).ConfigureAwait(false); } break; case "THREAD_DELETE":