From 11d34109a7b88de71d21021344d15567eff52b7c Mon Sep 17 00:00:00 2001 From: Tyrrrz <1935960+Tyrrrz@users.noreply.github.com> Date: Fri, 9 Jun 2023 01:20:32 +0300 Subject: [PATCH] Extract thread status and improve CLI output --- .../Commands/GetChannelsCommand.cs | 39 +++++++++++++------ .../Commands/GetDirectChannelsCommand.cs | 7 +++- .../Commands/GetGuildsCommand.cs | 7 +++- .../Discord/Data/ChannelThread.cs | 7 ++++ 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/DiscordChatExporter.Cli/Commands/GetChannelsCommand.cs b/DiscordChatExporter.Cli/Commands/GetChannelsCommand.cs index 2088e8d1..ac3bf488 100644 --- a/DiscordChatExporter.Cli/Commands/GetChannelsCommand.cs +++ b/DiscordChatExporter.Cli/Commands/GetChannelsCommand.cs @@ -36,19 +36,20 @@ public class GetChannelsCommand : DiscordCommandBase .ThenBy(c => c.Name) .ToArray(); - var threads = Array.Empty(); - if (IncludeThreads) - { - threads = (await Discord.GetGuildThreadsAsync(GuildId, cancellationToken)) - .OrderBy(c => c.Name) - .ToArray(); - } + var channelIdMaxLength = channels + .Select(c => c.Id.ToString().Length) + .OrderDescending() + .FirstOrDefault(); + + var threads = IncludeThreads + ? (await Discord.GetGuildThreadsAsync(GuildId, cancellationToken)).OrderBy(c => c.Name).ToArray() + : Array.Empty(); foreach (var channel in channels) { // Channel ID await console.Output.WriteAsync( - channel.Id.ToString().PadRight(20, ' ') + channel.Id.ToString().PadRight(channelIdMaxLength, ' ') ); // Separator @@ -59,14 +60,20 @@ public class GetChannelsCommand : DiscordCommandBase using (console.WithForegroundColor(ConsoleColor.White)) await console.Output.WriteLineAsync($"{channel.Category.Name} / {channel.Name}"); - foreach (var thread in threads.Where(t => t.ParentId == channel.Id)) + var channelThreads = threads.Where(t => t.ParentId == channel.Id).ToArray(); + var channelThreadIdMaxLength = channelThreads + .Select(t => t.Id.ToString().Length) + .OrderDescending() + .FirstOrDefault(); + + foreach (var thread in channelThreads) { // Indent - await console.Output.WriteAsync('\t'); + await console.Output.WriteAsync(" * "); // Thread ID await console.Output.WriteAsync( - thread.Id.ToString().PadRight(20, ' ') + thread.Id.ToString().PadRight(channelThreadIdMaxLength, ' ') ); // Separator @@ -75,7 +82,15 @@ public class GetChannelsCommand : DiscordCommandBase // Thread name using (console.WithForegroundColor(ConsoleColor.White)) - await console.Output.WriteLineAsync($"Thread / {thread.Name}"); + await console.Output.WriteAsync($"Thread / {thread.Name}"); + + // Separator + using (console.WithForegroundColor(ConsoleColor.DarkGray)) + await console.Output.WriteAsync(" | "); + + // Thread status + using (console.WithForegroundColor(ConsoleColor.White)) + await console.Output.WriteLineAsync(thread.IsActive ? "Active" : "Archived"); } } } diff --git a/DiscordChatExporter.Cli/Commands/GetDirectChannelsCommand.cs b/DiscordChatExporter.Cli/Commands/GetDirectChannelsCommand.cs index d4a999a5..ed731532 100644 --- a/DiscordChatExporter.Cli/Commands/GetDirectChannelsCommand.cs +++ b/DiscordChatExporter.Cli/Commands/GetDirectChannelsCommand.cs @@ -22,11 +22,16 @@ public class GetDirectChannelsCommand : DiscordCommandBase .ThenBy(c => c.Name) .ToArray(); + var channelIdMaxLength = channels + .Select(c => c.Id.ToString().Length) + .OrderDescending() + .FirstOrDefault(); + foreach (var channel in channels) { // Channel ID await console.Output.WriteAsync( - channel.Id.ToString().PadRight(20, ' ') + channel.Id.ToString().PadRight(channelIdMaxLength, ' ') ); // Separator diff --git a/DiscordChatExporter.Cli/Commands/GetGuildsCommand.cs b/DiscordChatExporter.Cli/Commands/GetGuildsCommand.cs index d3a174d1..4635f4b4 100644 --- a/DiscordChatExporter.Cli/Commands/GetGuildsCommand.cs +++ b/DiscordChatExporter.Cli/Commands/GetGuildsCommand.cs @@ -22,11 +22,16 @@ public class GetGuildsCommand : DiscordCommandBase .ThenBy(g => g.Name) .ToArray(); + var guildIdMaxLength = guilds + .Select(g => g.Id.ToString().Length) + .OrderDescending() + .FirstOrDefault(); + foreach (var guild in guilds) { // Guild ID await console.Output.WriteAsync( - guild.Id.ToString().PadRight(20, ' ') + guild.Id.ToString().PadRight(guildIdMaxLength, ' ') ); // Separator diff --git a/DiscordChatExporter.Core/Discord/Data/ChannelThread.cs b/DiscordChatExporter.Core/Discord/Data/ChannelThread.cs index 985ea9df..9f5d6e21 100644 --- a/DiscordChatExporter.Core/Discord/Data/ChannelThread.cs +++ b/DiscordChatExporter.Core/Discord/Data/ChannelThread.cs @@ -12,6 +12,7 @@ public record ChannelThread( Snowflake GuildId, Snowflake ParentId, string Name, + bool IsActive, Snowflake? LastMessageId) : IHasId { public static ChannelThread Parse(JsonElement json) @@ -22,6 +23,11 @@ public record ChannelThread( var parentId = json.GetProperty("parent_id").GetNonWhiteSpaceString().Pipe(Snowflake.Parse); var name = json.GetProperty("name").GetNonWhiteSpaceString(); + var isActive = !json + .GetPropertyOrNull("thread_metadata")? + .GetPropertyOrNull("archived")? + .GetBooleanOrNull() ?? true; + var lastMessageId = json .GetPropertyOrNull("last_message_id")? .GetNonWhiteSpaceStringOrNull()? @@ -33,6 +39,7 @@ public record ChannelThread( guildId, parentId, name, + isActive, lastMessageId ); }