From 63b06ff4776dc10d0c3f9f9f63aa1a2c9c91d3ad Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 12 Nov 2016 23:23:38 -0500 Subject: [PATCH] Support Rich Embeds on Entities --- src/Discord.Net.Core/API/Common/Embed.cs | 2 +- .../Entities/Messages/EmbedAuthor.cs | 29 +++++++++++++++++++ .../Entities/Messages/EmbedField.cs | 27 +++++++++++++++++ .../Entities/Messages/EmbedFooter.cs | 27 +++++++++++++++++ .../Entities/Messages/IEmbed.cs | 8 ++++- .../Entities/Messages/Embed.cs | 26 ++++++++++++++--- 6 files changed, 113 insertions(+), 6 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Messages/EmbedAuthor.cs create mode 100644 src/Discord.Net.Core/Entities/Messages/EmbedField.cs create mode 100644 src/Discord.Net.Core/Entities/Messages/EmbedFooter.cs diff --git a/src/Discord.Net.Core/API/Common/Embed.cs b/src/Discord.Net.Core/API/Common/Embed.cs index b19281d24..ed4715237 100644 --- a/src/Discord.Net.Core/API/Common/Embed.cs +++ b/src/Discord.Net.Core/API/Common/Embed.cs @@ -14,7 +14,7 @@ namespace Discord.API [JsonProperty("url")] public string Url { get; set; } [JsonProperty("color")] - public uint Color { get; set; } + public uint? Color { get; set; } [JsonProperty("author")] public Optional Author { get; set; } [JsonProperty("footer")] diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedAuthor.cs b/src/Discord.Net.Core/Entities/Messages/EmbedAuthor.cs new file mode 100644 index 000000000..b0ed0f08f --- /dev/null +++ b/src/Discord.Net.Core/Entities/Messages/EmbedAuthor.cs @@ -0,0 +1,29 @@ +using System.Diagnostics; +using Model = Discord.API.EmbedAuthor; + +namespace Discord +{ + [DebuggerDisplay("{DebuggerDisplay,nq}")] + public struct EmbedAuthor + { + public string Name { get; set; } + public string Url { get; set; } + public string IconUrl { get; set; } + public string ProxyIconUrl { get; set; } + + private EmbedAuthor(string name, string url, string iconUrl, string proxyIconUrl) + { + Name = name; + Url = url; + IconUrl = iconUrl; + ProxyIconUrl = proxyIconUrl; + } + internal static EmbedAuthor Create(Model model) + { + return new EmbedAuthor(model.Name, model.Url, model.IconUrl, model.ProxyIconUrl); + } + + private string DebuggerDisplay => $"{Name} ({Url})"; + public override string ToString() => Name; + } +} diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedField.cs b/src/Discord.Net.Core/Entities/Messages/EmbedField.cs new file mode 100644 index 000000000..257074e41 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Messages/EmbedField.cs @@ -0,0 +1,27 @@ +using System.Diagnostics; +using Model = Discord.API.EmbedField; + +namespace Discord +{ + [DebuggerDisplay("{DebuggerDisplay,nq}")] + public struct EmbedField + { + public string Name { get; set; } + public string Value { get; set; } + public bool Inline { get; set; } + + private EmbedField(string name, string value, bool inline) + { + Name = name; + Value = value; + Inline = inline; + } + internal static EmbedField Create(Model model) + { + return new EmbedField(model.Name, model.Value, model.Inline); + } + + private string DebuggerDisplay => $"{Name} ({Value}"; + public override string ToString() => Name; + } +} diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedFooter.cs b/src/Discord.Net.Core/Entities/Messages/EmbedFooter.cs new file mode 100644 index 000000000..a69e4b077 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Messages/EmbedFooter.cs @@ -0,0 +1,27 @@ +using System.Diagnostics; +using Model = Discord.API.EmbedFooter; + +namespace Discord +{ + [DebuggerDisplay("{DebuggerDisplay,nq}")] + public struct EmbedFooter + { + public string Text { get; set; } + public string IconUrl { get; set; } + public string ProxyUrl { get; set; } + + private EmbedFooter(string text, string iconUrl, string proxyUrl) + { + Text = text; + IconUrl = iconUrl; + ProxyUrl = proxyUrl; + } + internal static EmbedFooter Create(Model model) + { + return new EmbedFooter(model.Text, model.IconUrl, model.ProxyIconUrl); + } + + private string DebuggerDisplay => $"{Text} ({IconUrl})"; + public override string ToString() => Text; + } +} diff --git a/src/Discord.Net.Core/Entities/Messages/IEmbed.cs b/src/Discord.Net.Core/Entities/Messages/IEmbed.cs index 3bca85fd0..311fbff01 100644 --- a/src/Discord.Net.Core/Entities/Messages/IEmbed.cs +++ b/src/Discord.Net.Core/Entities/Messages/IEmbed.cs @@ -1,4 +1,6 @@ -namespace Discord +using System.Collections.Immutable; + +namespace Discord { public interface IEmbed { @@ -6,7 +8,11 @@ string Type { get; } string Title { get; } string Description { get; } + uint? Color { get; } + EmbedAuthor? Author { get; } + EmbedFooter? Footer { get; } EmbedProvider? Provider { get; } EmbedThumbnail? Thumbnail { get; } + ImmutableArray Fields { get; } } } diff --git a/src/Discord.Net.Rest/Entities/Messages/Embed.cs b/src/Discord.Net.Rest/Entities/Messages/Embed.cs index 20979534e..e85bf9cca 100644 --- a/src/Discord.Net.Rest/Entities/Messages/Embed.cs +++ b/src/Discord.Net.Rest/Entities/Messages/Embed.cs @@ -1,4 +1,6 @@ -using System.Diagnostics; +using System.Collections.Immutable; +using System.Diagnostics; +using System.Linq; using Model = Discord.API.Embed; namespace Discord @@ -10,10 +12,23 @@ namespace Discord public string Url { get; } public string Title { get; } public string Type { get; } + public uint? Color { get; } + public EmbedAuthor? Author { get; } + public EmbedFooter? Footer { get; } public EmbedProvider? Provider { get; } public EmbedThumbnail? Thumbnail { get; } + public ImmutableArray Fields { get; } - internal Embed(string type, string title, string description, string url, EmbedProvider? provider, EmbedThumbnail? thumbnail) + internal Embed(string type, + string title, + string description, + string url, + uint? color, + EmbedAuthor? author, + EmbedFooter? footer, + EmbedProvider? provider, + EmbedThumbnail? thumbnail, + ImmutableArray fields) { Type = type; Title = title; @@ -24,9 +39,12 @@ namespace Discord } internal static Embed Create(Model model) { - return new Embed(model.Type, model.Title, model.Description, model.Url, + return new Embed(model.Type, model.Title, model.Description, model.Url, model.Color, + model.Author.IsSpecified ? EmbedAuthor.Create(model.Author.Value) : (EmbedAuthor?)null, + model.Footer.IsSpecified ? EmbedFooter.Create(model.Footer.Value) : (EmbedFooter?)null, model.Provider.IsSpecified ? EmbedProvider.Create(model.Provider.Value) : (EmbedProvider?)null, - model.Thumbnail.IsSpecified ? EmbedThumbnail.Create(model.Thumbnail.Value) : (EmbedThumbnail?)null); + model.Thumbnail.IsSpecified ? EmbedThumbnail.Create(model.Thumbnail.Value) : (EmbedThumbnail?)null, + model.Fields.IsSpecified ? model.Fields.Value.Select(x => EmbedField.Create(x)).ToImmutableArray() : ImmutableArray.Create()); } public override string ToString() => Title;