Builders for Thumbnail and Image embedstags/1.0-rc
| @@ -19,8 +19,12 @@ namespace Discord.API | |||||
| public Optional<EmbedAuthor> Author { get; set; } | public Optional<EmbedAuthor> Author { get; set; } | ||||
| [JsonProperty("footer")] | [JsonProperty("footer")] | ||||
| public Optional<EmbedFooter> Footer { get; set; } | public Optional<EmbedFooter> Footer { get; set; } | ||||
| [JsonProperty("video")] | |||||
| public Optional<EmbedVideo> Video { get; set; } | |||||
| [JsonProperty("thumbnail")] | [JsonProperty("thumbnail")] | ||||
| public Optional<EmbedThumbnail> Thumbnail { get; set; } | public Optional<EmbedThumbnail> Thumbnail { get; set; } | ||||
| [JsonProperty("image")] | |||||
| public Optional<EmbedImage> Image { get; set; } | |||||
| [JsonProperty("provider")] | [JsonProperty("provider")] | ||||
| public Optional<EmbedProvider> Provider { get; set; } | public Optional<EmbedProvider> Provider { get; set; } | ||||
| [JsonProperty("fields")] | [JsonProperty("fields")] | ||||
| @@ -0,0 +1,17 @@ | |||||
| #pragma warning disable CS1591 | |||||
| using Newtonsoft.Json; | |||||
| namespace Discord.API | |||||
| { | |||||
| public class EmbedImage | |||||
| { | |||||
| [JsonProperty("url")] | |||||
| public string Url { get; set; } | |||||
| [JsonProperty("proxy_url")] | |||||
| public string ProxyUrl { get; set; } | |||||
| [JsonProperty("height")] | |||||
| public Optional<int> Height { get; set; } | |||||
| [JsonProperty("width")] | |||||
| public Optional<int> Width { get; set; } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,15 @@ | |||||
| #pragma warning disable CS1591 | |||||
| using Newtonsoft.Json; | |||||
| namespace Discord.API | |||||
| { | |||||
| public class EmbedVideo | |||||
| { | |||||
| [JsonProperty("url")] | |||||
| public string Url { get; set; } | |||||
| [JsonProperty("height")] | |||||
| public Optional<int> Height { get; set; } | |||||
| [JsonProperty("width")] | |||||
| public Optional<int> Width { get; set; } | |||||
| } | |||||
| } | |||||
| @@ -4,6 +4,8 @@ using Embed = Discord.API.Embed; | |||||
| using Field = Discord.API.EmbedField; | using Field = Discord.API.EmbedField; | ||||
| using Author = Discord.API.EmbedAuthor; | using Author = Discord.API.EmbedAuthor; | ||||
| using Footer = Discord.API.EmbedFooter; | using Footer = Discord.API.EmbedFooter; | ||||
| using Thumbnail = Discord.API.EmbedThumbnail; | |||||
| using Image = Discord.API.EmbedImage; | |||||
| namespace Discord | namespace Discord | ||||
| { | { | ||||
| @@ -14,8 +16,7 @@ namespace Discord | |||||
| public EmbedBuilder() | public EmbedBuilder() | ||||
| { | { | ||||
| _model = new Embed(); | |||||
| _model.Type = "rich"; | |||||
| _model = new Embed { Type = "rich" }; | |||||
| _fields = new List<Field>(); | _fields = new List<Field>(); | ||||
| } | } | ||||
| @@ -25,6 +26,8 @@ namespace Discord | |||||
| public Color? Color { get { return _model.Color.HasValue ? new Color(_model.Color.Value) : (Color?)null; } set { _model.Color = value?.RawValue; } } | public Color? Color { get { return _model.Color.HasValue ? new Color(_model.Color.Value) : (Color?)null; } set { _model.Color = value?.RawValue; } } | ||||
| public EmbedAuthorBuilder Author { get; set; } | public EmbedAuthorBuilder Author { get; set; } | ||||
| public EmbedFooterBuilder Footer { get; set; } | public EmbedFooterBuilder Footer { get; set; } | ||||
| public EmbedThumbnailBuilder Thumbnail { get; set; } | |||||
| public EmbedImageBuilder Image { get; set; } | |||||
| public EmbedBuilder WithTitle(string title) | public EmbedBuilder WithTitle(string title) | ||||
| { | { | ||||
| @@ -71,6 +74,30 @@ namespace Discord | |||||
| Footer = footer; | Footer = footer; | ||||
| return this; | return this; | ||||
| } | } | ||||
| public EmbedBuilder WithThumbnail(EmbedThumbnailBuilder thumbnail) | |||||
| { | |||||
| Thumbnail = thumbnail; | |||||
| return this; | |||||
| } | |||||
| public EmbedBuilder WithThumbnail(Action<EmbedThumbnailBuilder> action) | |||||
| { | |||||
| var thumbnail = new EmbedThumbnailBuilder(); | |||||
| action(thumbnail); | |||||
| Thumbnail = thumbnail; | |||||
| return this; | |||||
| } | |||||
| public EmbedBuilder WithImage(EmbedImageBuilder image) | |||||
| { | |||||
| Image = image; | |||||
| return this; | |||||
| } | |||||
| public EmbedBuilder WithImage(Action<EmbedImageBuilder> action) | |||||
| { | |||||
| var image = new EmbedImageBuilder(); | |||||
| action(image); | |||||
| Image = image; | |||||
| return this; | |||||
| } | |||||
| public EmbedBuilder AddField(Action<EmbedFieldBuilder> action) | public EmbedBuilder AddField(Action<EmbedFieldBuilder> action) | ||||
| { | { | ||||
| @@ -84,6 +111,8 @@ namespace Discord | |||||
| { | { | ||||
| _model.Author = Author?.ToModel(); | _model.Author = Author?.ToModel(); | ||||
| _model.Footer = Footer?.ToModel(); | _model.Footer = Footer?.ToModel(); | ||||
| _model.Thumbnail = Thumbnail?.ToModel(); | |||||
| _model.Image = Image?.ToModel(); | |||||
| _model.Fields = _fields.ToArray(); | _model.Fields = _fields.ToArray(); | ||||
| return _model; | return _model; | ||||
| } | } | ||||
| @@ -178,4 +207,44 @@ namespace Discord | |||||
| internal Footer ToModel() => _model; | internal Footer ToModel() => _model; | ||||
| } | } | ||||
| public class EmbedThumbnailBuilder | |||||
| { | |||||
| private Thumbnail _model; | |||||
| public string Url { get { return _model.Url; } set { _model.Url = value; } } | |||||
| public EmbedThumbnailBuilder() | |||||
| { | |||||
| _model = new Thumbnail(); | |||||
| } | |||||
| public EmbedThumbnailBuilder WithUrl(string url) | |||||
| { | |||||
| Url = url; | |||||
| return this; | |||||
| } | |||||
| internal Thumbnail ToModel() => _model; | |||||
| } | |||||
| public class EmbedImageBuilder | |||||
| { | |||||
| private Image _model; | |||||
| public string Url { get { return _model.Url; } set { _model.Url = value; } } | |||||
| public EmbedImageBuilder() | |||||
| { | |||||
| _model = new Image(); | |||||
| } | |||||
| public EmbedImageBuilder WithUrl(string url) | |||||
| { | |||||
| Url = url; | |||||
| return this; | |||||
| } | |||||
| internal Image ToModel() => _model; | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,31 @@ | |||||
| using System.Diagnostics; | |||||
| using Model = Discord.API.EmbedImage; | |||||
| namespace Discord | |||||
| { | |||||
| [DebuggerDisplay("{DebuggerDisplay,nq}")] | |||||
| public struct EmbedImage | |||||
| { | |||||
| public string Url { get; } | |||||
| public string ProxyUrl { get; } | |||||
| public int? Height { get; } | |||||
| public int? Width { get; } | |||||
| private EmbedImage(string url, string proxyUrl, int? height, int? width) | |||||
| { | |||||
| Url = url; | |||||
| ProxyUrl = proxyUrl; | |||||
| Height = height; | |||||
| Width = width; | |||||
| } | |||||
| internal static EmbedImage Create(Model model) | |||||
| { | |||||
| return new EmbedImage(model.Url, model.ProxyUrl, | |||||
| model.Height.IsSpecified ? model.Height.Value : (int?)null, | |||||
| model.Width.IsSpecified ? model.Width.Value : (int?)null); | |||||
| } | |||||
| private string DebuggerDisplay => $"{Url} ({(Width != null && Height != null ? $"{Width}x{Height}" : "0x0")})"; | |||||
| public override string ToString() => Url; | |||||
| } | |||||
| } | |||||
| @@ -25,7 +25,7 @@ namespace Discord | |||||
| model.Width.IsSpecified ? model.Width.Value : (int?)null); | model.Width.IsSpecified ? model.Width.Value : (int?)null); | ||||
| } | } | ||||
| private string DebuggerDisplay => $"{ToString()} ({Url})"; | |||||
| public override string ToString() => Width != null && Height != null ? $"{Width}x{Height}" : "0x0"; | |||||
| private string DebuggerDisplay => $"{Url} ({(Width != null && Height != null ? $"{Width}x{Height}" : "0x0")})"; | |||||
| public override string ToString() => Url; | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,29 @@ | |||||
| using System.Diagnostics; | |||||
| using Model = Discord.API.EmbedVideo; | |||||
| namespace Discord | |||||
| { | |||||
| [DebuggerDisplay("{DebuggerDisplay,nq}")] | |||||
| public struct EmbedVideo | |||||
| { | |||||
| public string Url { get; } | |||||
| public int? Height { get; } | |||||
| public int? Width { get; } | |||||
| private EmbedVideo(string url, int? height, int? width) | |||||
| { | |||||
| Url = url; | |||||
| Height = height; | |||||
| Width = width; | |||||
| } | |||||
| internal static EmbedVideo Create(Model model) | |||||
| { | |||||
| return new EmbedVideo(model.Url, | |||||
| model.Height.IsSpecified ? model.Height.Value : (int?)null, | |||||
| model.Width.IsSpecified ? model.Width.Value : (int?)null); | |||||
| } | |||||
| private string DebuggerDisplay => $"{Url} ({(Width != null && Height != null ? $"{Width}x{Height}" : "0x0")})"; | |||||
| public override string ToString() => Url; | |||||
| } | |||||
| } | |||||
| @@ -9,6 +9,8 @@ namespace Discord | |||||
| string Title { get; } | string Title { get; } | ||||
| string Description { get; } | string Description { get; } | ||||
| Color? Color { get; } | Color? Color { get; } | ||||
| EmbedImage? Image { get; } | |||||
| EmbedVideo? Video { get; } | |||||
| EmbedAuthor? Author { get; } | EmbedAuthor? Author { get; } | ||||
| EmbedFooter? Footer { get; } | EmbedFooter? Footer { get; } | ||||
| EmbedProvider? Provider { get; } | EmbedProvider? Provider { get; } | ||||
| @@ -14,6 +14,8 @@ namespace Discord | |||||
| public string Title { get; } | public string Title { get; } | ||||
| public string Type { get; } | public string Type { get; } | ||||
| public Color? Color { get; } | public Color? Color { get; } | ||||
| public EmbedImage? Image { get; } | |||||
| public EmbedVideo? Video { get; } | |||||
| public EmbedAuthor? Author { get; } | public EmbedAuthor? Author { get; } | ||||
| public EmbedFooter? Footer { get; } | public EmbedFooter? Footer { get; } | ||||
| public EmbedProvider? Provider { get; } | public EmbedProvider? Provider { get; } | ||||
| @@ -25,6 +27,8 @@ namespace Discord | |||||
| string description, | string description, | ||||
| string url, | string url, | ||||
| Color? color, | Color? color, | ||||
| EmbedImage? image, | |||||
| EmbedVideo? video, | |||||
| EmbedAuthor? author, | EmbedAuthor? author, | ||||
| EmbedFooter? footer, | EmbedFooter? footer, | ||||
| EmbedProvider? provider, | EmbedProvider? provider, | ||||
| @@ -36,6 +40,8 @@ namespace Discord | |||||
| Description = description; | Description = description; | ||||
| Url = url; | Url = url; | ||||
| Color = color; | Color = color; | ||||
| Image = image; | |||||
| Video = video; | |||||
| Author = author; | Author = author; | ||||
| Footer = footer; | Footer = footer; | ||||
| Provider = provider; | Provider = provider; | ||||
| @@ -46,6 +52,8 @@ namespace Discord | |||||
| { | { | ||||
| return new Embed(model.Type, model.Title, model.Description, model.Url, | return new Embed(model.Type, model.Title, model.Description, model.Url, | ||||
| model.Color.HasValue ? new Color(model.Color.Value) : (Color?)null, | model.Color.HasValue ? new Color(model.Color.Value) : (Color?)null, | ||||
| model.Image.IsSpecified ? EmbedImage.Create(model.Image.Value) : (EmbedImage?)null, | |||||
| model.Video.IsSpecified ? EmbedVideo.Create(model.Video.Value) : (EmbedVideo?)null, | |||||
| model.Author.IsSpecified ? EmbedAuthor.Create(model.Author.Value) : (EmbedAuthor?)null, | model.Author.IsSpecified ? EmbedAuthor.Create(model.Author.Value) : (EmbedAuthor?)null, | ||||
| model.Footer.IsSpecified ? EmbedFooter.Create(model.Footer.Value) : (EmbedFooter?)null, | model.Footer.IsSpecified ? EmbedFooter.Create(model.Footer.Value) : (EmbedFooter?)null, | ||||
| model.Provider.IsSpecified ? EmbedProvider.Create(model.Provider.Value) : (EmbedProvider?)null, | model.Provider.IsSpecified ? EmbedProvider.Create(model.Provider.Value) : (EmbedProvider?)null, | ||||