From ad8182fce3654d52ae4cd644731cf635033f4593 Mon Sep 17 00:00:00 2001 From: Todd Gleason <3411064+tg2k@users.noreply.github.com> Date: Tue, 23 Dec 2025 12:16:14 -0700 Subject: [PATCH] Added UnknownComponent classes, and support to MessageComponentConverter and MessageComponentExtensions (#3207) --- .../MessageComponents/UnknownComponent.cs | 34 +++++++++++++++++++ .../API/Common/UnknownComponent.cs | 25 ++++++++++++++ .../Extensions/MessageComponentExtension.cs | 7 ++++ .../Converters/MessageComponentConverter.cs | 3 +- 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/Discord.Net.Core/Entities/Interactions/MessageComponents/UnknownComponent.cs create mode 100644 src/Discord.Net.Rest/API/Common/UnknownComponent.cs diff --git a/src/Discord.Net.Core/Entities/Interactions/MessageComponents/UnknownComponent.cs b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/UnknownComponent.cs new file mode 100644 index 00000000..12c7f283 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Interactions/MessageComponents/UnknownComponent.cs @@ -0,0 +1,34 @@ +namespace Discord; + +/// +/// Represents an unknown message component type that Discord has sent but is not yet supported by the library. +/// +public class UnknownComponent : IMessageComponent +{ + /// + /// Gets the raw component type value from Discord. + /// + public int RawType { get; } + + /// + public ComponentType Type => (ComponentType)RawType; + + /// + public int? Id { get; } + + /// + /// Gets the raw JSON data of this component. + /// + public string RawJson { get; } + + internal UnknownComponent(int rawType, string rawJson, int? id = null) + { + RawType = rawType; + RawJson = rawJson; + Id = id; + } + + /// + IMessageComponentBuilder IMessageComponent.ToBuilder() + => throw new System.NotSupportedException("Unknown components cannot be converted to builders."); +} diff --git a/src/Discord.Net.Rest/API/Common/UnknownComponent.cs b/src/Discord.Net.Rest/API/Common/UnknownComponent.cs new file mode 100644 index 00000000..5fc37da0 --- /dev/null +++ b/src/Discord.Net.Rest/API/Common/UnknownComponent.cs @@ -0,0 +1,25 @@ +using Newtonsoft.Json; + +namespace Discord.API +{ + internal class UnknownComponent : IMessageComponent + { + [JsonProperty("type")] + public int RawType { get; set; } + + public ComponentType Type => (ComponentType)RawType; + + [JsonProperty("id")] + public Optional Id { get; set; } + + int? IMessageComponent.Id => Id.ToNullable(); + + public string RawJson { get; set; } + + public UnknownComponent() { } + + /// + IMessageComponentBuilder IMessageComponent.ToBuilder() + => throw new System.NotSupportedException("Unknown components cannot be converted to builders."); + } +} diff --git a/src/Discord.Net.Rest/Extensions/MessageComponentExtension.cs b/src/Discord.Net.Rest/Extensions/MessageComponentExtension.cs index 1a831a81..e32d32c0 100644 --- a/src/Discord.Net.Rest/Extensions/MessageComponentExtension.cs +++ b/src/Discord.Net.Rest/Extensions/MessageComponentExtension.cs @@ -47,6 +47,9 @@ internal static class MessageComponentExtension case FileUploadComponent fileUpload: return new API.FileUploadComponent(fileUpload); + + case UnknownComponent unknown: + return new API.UnknownComponent { RawType = unknown.RawType, RawJson = unknown.RawJson, Id = unknown.Id ?? Optional.Unspecified }; } return null; @@ -197,7 +200,11 @@ internal static class MessageComponentExtension } default: + { + if (component is API.UnknownComponent unknown) + return new UnknownComponent(unknown.RawType, unknown.RawJson, unknown.Id.ToNullable()); return null; + } } } diff --git a/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs b/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs index 22d34d41..c9421e22 100644 --- a/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs +++ b/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs @@ -69,7 +69,8 @@ namespace Discord.Net.Converters messageComponent = new API.FileUploadComponent(); break; default: - throw new JsonSerializationException($"Unknown component type value '{typeProperty}' while deserializing message component"); + messageComponent = new API.UnknownComponent { RawType = typeProperty, RawJson = jsonObject.ToString() }; + break; } serializer.Populate(jsonObject.CreateReader(), messageComponent); return messageComponent;