From d287ed1d4c2d2f0b96be1969a7b056da95cc2fc2 Mon Sep 17 00:00:00 2001 From: Christopher Felegy Date: Sat, 8 Jun 2019 19:38:31 -0400 Subject: [PATCH] fix: add EmbedTypeConverter with unknown handling Prevents messages with an unknown EmbedType from failing to unmarshal --- src/Discord.Net.Rest/API/Common/Embed.cs | 6 +- .../Net/Converters/DiscordContractResolver.cs | 2 + .../Net/Converters/EmbedTypeConverter.cs | 73 +++++++++++++++++++ 3 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 src/Discord.Net.Rest/Net/Converters/EmbedTypeConverter.cs diff --git a/src/Discord.Net.Rest/API/Common/Embed.cs b/src/Discord.Net.Rest/API/Common/Embed.cs index 1c9fa34e2..fbf20d987 100644 --- a/src/Discord.Net.Rest/API/Common/Embed.cs +++ b/src/Discord.Net.Rest/API/Common/Embed.cs @@ -1,7 +1,7 @@ -#pragma warning disable CS1591 +#pragma warning disable CS1591 using System; using Newtonsoft.Json; -using Newtonsoft.Json.Converters; +using Discord.Net.Converters; namespace Discord.API { @@ -15,7 +15,7 @@ namespace Discord.API public string Url { get; set; } [JsonProperty("color")] public uint? Color { get; set; } - [JsonProperty("type"), JsonConverter(typeof(StringEnumConverter))] + [JsonProperty("type"), JsonConverter(typeof(EmbedTypeConverter))] public EmbedType Type { get; set; } [JsonProperty("timestamp")] public DateTimeOffset? Timestamp { get; set; } diff --git a/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs b/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs index 8a3c1037b..a1ed20c6f 100644 --- a/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs +++ b/src/Discord.Net.Rest/Net/Converters/DiscordContractResolver.cs @@ -77,6 +77,8 @@ namespace Discord.Net.Converters return PermissionTargetConverter.Instance; if (type == typeof(UserStatus)) return UserStatusConverter.Instance; + if (type == typeof(EmbedType)) + return EmbedTypeConverter.Instance; //Special if (type == typeof(API.Image)) diff --git a/src/Discord.Net.Rest/Net/Converters/EmbedTypeConverter.cs b/src/Discord.Net.Rest/Net/Converters/EmbedTypeConverter.cs new file mode 100644 index 000000000..1e03fb698 --- /dev/null +++ b/src/Discord.Net.Rest/Net/Converters/EmbedTypeConverter.cs @@ -0,0 +1,73 @@ +using System; +using Newtonsoft.Json; + +namespace Discord.Net.Converters +{ + internal class EmbedTypeConverter : JsonConverter + { + public static readonly EmbedTypeConverter Instance = new EmbedTypeConverter(); + + public override bool CanConvert(Type objectType) => true; + public override bool CanRead => true; + public override bool CanWrite => true; + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + switch ((string)reader.Value) + { + case "rich": + return EmbedType.Rich; + case "link": + return EmbedType.Link; + case "video": + return EmbedType.Video; + case "image": + return EmbedType.Image; + case "gifv": + return EmbedType.Gifv; + case "article": + return EmbedType.Article; + case "tweet": + return EmbedType.Tweet; + case "html": + return EmbedType.Html; + case "application_news": // TODO 2.2 EmbedType.News + default: + return EmbedType.Unknown; + } + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + switch ((EmbedType)value) + { + case EmbedType.Rich: + writer.WriteValue("rich"); + break; + case EmbedType.Link: + writer.WriteValue("link"); + break; + case EmbedType.Video: + writer.WriteValue("video"); + break; + case EmbedType.Image: + writer.WriteValue("image"); + break; + case EmbedType.Gifv: + writer.WriteValue("gifv"); + break; + case EmbedType.Article: + writer.WriteValue("article"); + break; + case EmbedType.Tweet: + writer.WriteValue("tweet"); + break; + case EmbedType.Html: + writer.WriteValue("html"); + break; + default: + throw new JsonSerializationException("Invalid embed type"); + } + } + } +}