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 0000000000..12c7f2838c
--- /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 0000000000..5fc37da0f3
--- /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 1a831a8179..e32d32c06b 100644
--- a/src/Discord.Net.Rest/Extensions/MessageComponentExtension.cs
+++ b/src/Discord.Net.Rest/Extensions/MessageComponentExtension.cs
@@ -47,6 +47,9 @@ internal static IMessageComponent ToModel(this IMessageComponent component)
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 IMessageComponent ToEntity(this IMessageComponent component)
}
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 22d34d41fb..c9421e228e 100644
--- a/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs
+++ b/src/Discord.Net.Rest/Net/Converters/MessageComponentConverter.cs
@@ -69,7 +69,8 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
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;