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;