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;