From 2bf8b8624309825abc7908711e333bf73530c099 Mon Sep 17 00:00:00 2001 From: Solareon <769465+solareon@users.noreply.github.com> Date: Mon, 6 Apr 2026 09:39:01 +0200 Subject: [PATCH] refactor: make MessageComponent accept type --- .../Data/Components/MessageComponent.cs | 42 ++++++++++++++----- ...mponentKind.cs => MessageComponentType.cs} | 2 +- .../Exporting/MessageGroupTemplate.cshtml | 4 +- 3 files changed, 35 insertions(+), 13 deletions(-) rename DiscordChatExporter.Core/Discord/Data/Components/{MessageComponentKind.cs => MessageComponentType.cs} (93%) diff --git a/DiscordChatExporter.Core/Discord/Data/Components/MessageComponent.cs b/DiscordChatExporter.Core/Discord/Data/Components/MessageComponent.cs index 82622aa9..3881bd2b 100644 --- a/DiscordChatExporter.Core/Discord/Data/Components/MessageComponent.cs +++ b/DiscordChatExporter.Core/Discord/Data/Components/MessageComponent.cs @@ -7,9 +7,9 @@ using JsonExtensions.Reading; namespace DiscordChatExporter.Core.Discord.Data.Components; -// https://docs.discord.com/developers/components/reference#what-is-a-component +// https://docs.discord.com/developers/components/reference#component-object public partial record MessageComponent( - MessageComponentKind Kind, + MessageComponentType Kind, IReadOnlyList Components, ButtonComponent? Button ) @@ -29,21 +29,43 @@ public partial record MessageComponent return null; var type = rawType.Value; - if (!Enum.IsDefined(typeof(MessageComponentKind), type)) + if (!Enum.IsDefined(typeof(MessageComponentType), type)) return null; - var kind = (MessageComponentKind)type; + return Parse((MessageComponentType)type, json); + } - var components = - json.GetPropertyOrNull("components") + private static MessageComponent Parse(MessageComponentType type, JsonElement json) + { + return type switch + { + MessageComponentType.Button => ParseButton(json), + _ => ParseDefault(type, json), + }; + } + + private static MessageComponent ParseDefault(MessageComponentType type, JsonElement json) + { + var components = ParseComponents(json); + + return new MessageComponent(type, components, null); + } + + private static MessageComponent ParseButton(JsonElement json) + { + var components = ParseComponents(json); + var button = ButtonComponent.Parse(json); + + return new MessageComponent(MessageComponentType.Button, components, button); + } + + private static MessageComponent[] ParseComponents(JsonElement json) + { + return json.GetPropertyOrNull("components") ?.EnumerateArrayOrNull() ?.Select(Parse) .WhereNotNull() .ToArray() ?? []; - - var button = kind == MessageComponentKind.Button ? ButtonComponent.Parse(json) : null; - - return new MessageComponent(kind, components, button); } } diff --git a/DiscordChatExporter.Core/Discord/Data/Components/MessageComponentKind.cs b/DiscordChatExporter.Core/Discord/Data/Components/MessageComponentType.cs similarity index 93% rename from DiscordChatExporter.Core/Discord/Data/Components/MessageComponentKind.cs rename to DiscordChatExporter.Core/Discord/Data/Components/MessageComponentType.cs index a7e1c122..527a97f5 100644 --- a/DiscordChatExporter.Core/Discord/Data/Components/MessageComponentKind.cs +++ b/DiscordChatExporter.Core/Discord/Data/Components/MessageComponentType.cs @@ -1,7 +1,7 @@ namespace DiscordChatExporter.Core.Discord.Data.Components; // https://discord.com/developers/docs/components/reference#component-object-component-types -public enum MessageComponentKind +public enum MessageComponentType { ActionRow = 1, Button = 2, diff --git a/DiscordChatExporter.Core/Exporting/MessageGroupTemplate.cshtml b/DiscordChatExporter.Core/Exporting/MessageGroupTemplate.cshtml index 7777619f..658d22e8 100644 --- a/DiscordChatExporter.Core/Exporting/MessageGroupTemplate.cshtml +++ b/DiscordChatExporter.Core/Exporting/MessageGroupTemplate.cshtml @@ -733,10 +733,10 @@ } @* Components *@ - @if (message.Components.Any(c => c.Kind == MessageComponentKind.ActionRow && c.HasButtons)) + @if (message.Components.Any(c => c.Kind == MessageComponentType.ActionRow && c.HasButtons)) {
- @foreach (var actionRow in message.Components.Where(c => c.Kind == MessageComponentKind.ActionRow && c.HasButtons)) + @foreach (var actionRow in message.Components.Where(c => c.Kind == MessageComponentType.ActionRow && c.HasButtons)) {
@foreach (var button in actionRow.Buttons)