diff --git a/DiscordChatExporter.Core/Discord/DiscordClient.cs b/DiscordChatExporter.Core/Discord/DiscordClient.cs index 66d6506..2318c56 100644 --- a/DiscordChatExporter.Core/Discord/DiscordClient.cs +++ b/DiscordChatExporter.Core/Discord/DiscordClient.cs @@ -272,6 +272,7 @@ public class DiscordClient // User accounts can only fetch threads using the search endpoint if (tokenKind == TokenKind.User) { + // Active threads foreach (var channel in channels) { var currentOffset = 0; @@ -279,6 +280,7 @@ public class DiscordClient { var url = new UrlBuilder() .SetPath($"channels/{channel.Id}/threads/search") + .SetQueryParameter("archived", "false") .SetQueryParameter("offset", currentOffset.ToString()) .Build(); @@ -289,11 +291,7 @@ public class DiscordClient foreach (var threadJson in response.Value.GetProperty("threads").EnumerateArray()) { - var thread = Channel.Parse(threadJson, channel); - if (!includeArchived && thread.IsArchived) - continue; - - yield return thread; + yield return Channel.Parse(threadJson, channel); currentOffset++; } @@ -301,6 +299,37 @@ public class DiscordClient break; } } + + // Archived threads + if (includeArchived) + { + foreach (var channel in channels) + { + var currentOffset = 0; + while (true) + { + var url = new UrlBuilder() + .SetPath($"channels/{channel.Id}/threads/search") + .SetQueryParameter("archived", "true") + .SetQueryParameter("offset", currentOffset.ToString()) + .Build(); + + // Can be null on channels that the user cannot access + var response = await TryGetJsonResponseAsync(url, cancellationToken); + if (response is null) + break; + + foreach (var threadJson in response.Value.GetProperty("threads").EnumerateArray()) + { + yield return Channel.Parse(threadJson, channel); + currentOffset++; + } + + if (!response.Value.GetProperty("has_more").GetBoolean()) + break; + } + } + } } // Bot accounts can only fetch threads using the threads endpoint else