diff --git a/src/Discord.Net.Core/Entities/Messages/Embed.cs b/src/Discord.Net.Core/Entities/Messages/Embed.cs index 5fae7acde..8e7f67879 100644 --- a/src/Discord.Net.Core/Entities/Messages/Embed.cs +++ b/src/Discord.Net.Core/Entities/Messages/Embed.cs @@ -57,7 +57,7 @@ namespace Discord Fields = fields; } - public int Length => Title?.Length + Author?.Name?.Length + Description?.Length + Footer?.Text?.Length + Fields.Sum(f => f.Name.Length + f.Value.ToString().Length) ?? 0; + public int Length => Title?.Length + Author?.Name?.Length + Description?.Length + Footer?.Text?.Length + Provider?.Name?.Length + Fields.Sum(f => f.Name.Length + f.Value.ToString().Length) ?? 0; public override string ToString() => Title; private string DebuggerDisplay => $"{Title} ({Type})"; diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedProvider.cs b/src/Discord.Net.Core/Entities/Messages/EmbedProvider.cs index 24722b158..f26dfba02 100644 --- a/src/Discord.Net.Core/Entities/Messages/EmbedProvider.cs +++ b/src/Discord.Net.Core/Entities/Messages/EmbedProvider.cs @@ -6,8 +6,8 @@ namespace Discord [DebuggerDisplay("{DebuggerDisplay,nq}")] public struct EmbedProvider { - public string Name { get; } - public string Url { get; } + public string Name { get; internal set; } + public string Url { get; internal set; } internal EmbedProvider(string name, string url) { diff --git a/src/Discord.Net.Rest/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Rest/Entities/Messages/EmbedBuilder.cs index f5663cea3..6abf551e0 100644 --- a/src/Discord.Net.Rest/Entities/Messages/EmbedBuilder.cs +++ b/src/Discord.Net.Rest/Entities/Messages/EmbedBuilder.cs @@ -66,11 +66,21 @@ namespace Discord _embed.Image = new EmbedImage(value, null, null, null); } } + public string VideoUrl + { + get => _embed.Video?.Url; + set + { + if (!value.IsNullOrUri()) throw new ArgumentException("Url must be a well-formed URI", nameof(VideoUrl)); + _embed.Video = new EmbedVideo(value, null, null); + } + } public DateTimeOffset? Timestamp { get => _embed.Timestamp; set { _embed.Timestamp = value; } } public Color? Color { get => _embed.Color; set { _embed.Color = value; } } public EmbedAuthorBuilder Author { get; set; } public EmbedFooterBuilder Footer { get; set; } + public EmbedProviderBuilder Provider { get; set; } private List _fields; public List Fields { @@ -109,6 +119,11 @@ namespace Discord ImageUrl = imageUrl; return this; } + public EmbedBuilder WithVideoUrl(string videoUrl) + { + VideoUrl = videoUrl; + return this; + } public EmbedBuilder WithCurrentTimestamp() { Timestamp = DateTimeOffset.UtcNow; @@ -171,6 +186,31 @@ namespace Discord return this; } + public EmbedBuilder WithProvider(EmbedProviderBuilder provider) + { + Provider = provider; + return this; + } + + public EmbedBuilder WithProvider(Action action) + { + var provider = new EmbedProviderBuilder(); + action(provider); + Provider = provider; + return this; + } + + public EmbedBuilder WithProvider(string name, string url = null) + { + var provider = new EmbedProviderBuilder + { + Name = name, + Url = url + }; + Provider = provider; + return this; + } + public EmbedBuilder AddField(string name, object value, bool inline = false) { var field = new EmbedFieldBuilder() @@ -203,6 +243,7 @@ namespace Discord { _embed.Footer = Footer?.Build(); _embed.Author = Author?.Build(); + _embed.Provider = Provider?.Build(); var fields = ImmutableArray.CreateBuilder(Fields.Count); for (int i = 0; i < Fields.Count; i++) fields.Add(Fields[i].Build()); @@ -376,4 +417,39 @@ namespace Discord public EmbedFooter Build() => _footer; } + + public class EmbedProviderBuilder + { + private EmbedProvider _provider; + + public string Name + { + get => _provider.Name; + set => _provider.Name = value; + } + + public string Url + { + get => _provider.Url; + set + { + if (!value.IsNullOrUri()) throw new ArgumentException("Url must be a well-formed URI", nameof(Url)); + } + } + + public EmbedProviderBuilder WithName(string name) + { + Name = name; + return this; + } + + public EmbedProviderBuilder WithUrl(string url) + { + Url = url; + return this; + } + + public EmbedProvider Build() + => _provider; + } } diff --git a/src/Discord.Net.Rest/Extensions/EmbedBuilderExtensions.cs b/src/Discord.Net.Rest/Extensions/EmbedBuilderExtensions.cs index 2eb4ed473..c8c15f042 100644 --- a/src/Discord.Net.Rest/Extensions/EmbedBuilderExtensions.cs +++ b/src/Discord.Net.Rest/Extensions/EmbedBuilderExtensions.cs @@ -43,10 +43,16 @@ namespace Discord IconUrl = embed.Footer?.IconUrl }, ImageUrl = embed.Image?.Url, + Provider = new EmbedProviderBuilder + { + Name = embed.Provider?.Name, + Url = embed.Provider?.Url + }, ThumbnailUrl = embed.Thumbnail?.Url, Timestamp = embed.Timestamp, Title = embed.Title, - Url = embed.Url + Url = embed.Url, + VideoUrl = embed.Video?.Url }; foreach (var field in embed.Fields)