From 6fba60e5703e7e06df9fdef0d38ece194a654fd1 Mon Sep 17 00:00:00 2001 From: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com> Date: Mon, 21 Aug 2023 17:22:44 +0300 Subject: [PATCH] Print archived threads only if explicitly requested in the `channels` command --- .../Commands/GetChannelsCommand.cs | 12 ++++- .../Discord/Data/Channel.cs | 8 ++-- .../Discord/DiscordClient.cs | 45 +++++++++++-------- 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/DiscordChatExporter.Cli/Commands/GetChannelsCommand.cs b/DiscordChatExporter.Cli/Commands/GetChannelsCommand.cs index d1f6311..b371204 100644 --- a/DiscordChatExporter.Cli/Commands/GetChannelsCommand.cs +++ b/DiscordChatExporter.Cli/Commands/GetChannelsCommand.cs @@ -26,6 +26,12 @@ public class GetChannelsCommand : DiscordCommandBase )] public bool IncludeThreads { get; init; } + [CommandOption( + "include-archived-threads", + Description = "Include archived threads in the output." + )] + public bool IncludeArchivedThreads { get; init; } + public override async ValueTask ExecuteAsync(IConsole console) { var cancellationToken = console.RegisterCancellationHandler(); @@ -42,7 +48,9 @@ public class GetChannelsCommand : DiscordCommandBase .FirstOrDefault(); var threads = IncludeThreads - ? (await Discord.GetGuildThreadsAsync(GuildId, cancellationToken)).OrderBy(c => c.Name).ToArray() + ? (await Discord.GetGuildThreadsAsync(GuildId, IncludeArchivedThreads, cancellationToken)) + .OrderBy(c => c.Name) + .ToArray() : Array.Empty(); foreach (var channel in channels) @@ -90,7 +98,7 @@ public class GetChannelsCommand : DiscordCommandBase // Thread status using (console.WithForegroundColor(ConsoleColor.White)) - await console.Output.WriteLineAsync(channelThread.IsActive ? "Active" : "Archived"); + await console.Output.WriteLineAsync(channelThread.IsArchived ? "Archived" : "Active"); } } } diff --git a/DiscordChatExporter.Core/Discord/Data/Channel.cs b/DiscordChatExporter.Core/Discord/Data/Channel.cs index fd4403c..ea55a7e 100644 --- a/DiscordChatExporter.Core/Discord/Data/Channel.cs +++ b/DiscordChatExporter.Core/Discord/Data/Channel.cs @@ -16,7 +16,7 @@ public partial record Channel( int? Position, string? IconUrl, string? Topic, - bool IsActive, + bool IsArchived, Snowflake? LastMessageId) : IHasId { // Used for visual backwards-compatibility with old exports, where @@ -77,10 +77,10 @@ public partial record Channel var topic = json.GetPropertyOrNull("topic")?.GetStringOrNull(); - var isActive = !json + var isArchived = json .GetPropertyOrNull("thread_metadata")? .GetPropertyOrNull("archived")? - .GetBooleanOrNull() ?? true; + .GetBooleanOrNull() ?? false; var lastMessageId = json .GetPropertyOrNull("last_message_id")? @@ -96,7 +96,7 @@ public partial record Channel position, iconUrl, topic, - isActive, + isArchived, lastMessageId ); } diff --git a/DiscordChatExporter.Core/Discord/DiscordClient.cs b/DiscordChatExporter.Core/Discord/DiscordClient.cs index 1d7a504..baaa4d4 100644 --- a/DiscordChatExporter.Core/Discord/DiscordClient.cs +++ b/DiscordChatExporter.Core/Discord/DiscordClient.cs @@ -260,6 +260,7 @@ public class DiscordClient public async IAsyncEnumerable GetGuildThreadsAsync( Snowflake guildId, + bool includeArchived = false, [EnumeratorCancellation] CancellationToken cancellationToken = default) { var tokenKind = _resolvedTokenKind ??= await GetTokenKindAsync(cancellationToken); @@ -285,7 +286,11 @@ public class DiscordClient foreach (var threadJson in response.Value.GetProperty("threads").EnumerateArray()) { - yield return Channel.Parse(threadJson, channel); + var thread = Channel.Parse(threadJson, channel); + if (!includeArchived && thread.IsArchived) + continue; + + yield return thread; currentOffset++; } @@ -314,28 +319,32 @@ public class DiscordClient } } - foreach (var channel in channels) + // Archived threads + if (includeArchived) { - // Public archived threads + foreach (var channel in channels) { - var response = await GetJsonResponseAsync( - $"channels/{channel.Id}/threads/archived/public", - cancellationToken - ); + // Public archived threads + { + var response = await GetJsonResponseAsync( + $"channels/{channel.Id}/threads/archived/public", + cancellationToken + ); - foreach (var threadJson in response.GetProperty("threads").EnumerateArray()) - yield return Channel.Parse(threadJson, channel); - } + foreach (var threadJson in response.GetProperty("threads").EnumerateArray()) + yield return Channel.Parse(threadJson, channel); + } - // Private archived threads - { - var response = await GetJsonResponseAsync( - $"channels/{channel.Id}/threads/archived/private", - cancellationToken - ); + // Private archived threads + { + var response = await GetJsonResponseAsync( + $"channels/{channel.Id}/threads/archived/private", + cancellationToken + ); - foreach (var threadJson in response.GetProperty("threads").EnumerateArray()) - yield return Channel.Parse(threadJson, channel); + foreach (var threadJson in response.GetProperty("threads").EnumerateArray()) + yield return Channel.Parse(threadJson, channel); + } } } }