diff --git a/src/Discord.Net.Core/Discord.Net.Core.xml b/src/Discord.Net.Core/Discord.Net.Core.xml index 076aa6db5..dc1641bcd 100644 --- a/src/Discord.Net.Core/Discord.Net.Core.xml +++ b/src/Discord.Net.Core/Discord.Net.Core.xml @@ -4744,8 +4744,11 @@ Builds this builder into a to be used in a . A to be used in a . - A button cannot contain a and a . + A button must contain either a or a , but not both. A button must have an or a . + A link button must contain a URL. + A link must include a protocol (http or https). + A non-link button must contain a custom id @@ -6038,6 +6041,7 @@ The built embed object. Total embed length exceeds . + Any Url must include protocols (i.e http:// or https://). diff --git a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs index 9317c0e64..ff2c99a6c 100644 --- a/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs +++ b/src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs @@ -520,21 +520,29 @@ namespace Discord /// Builds this builder into a to be used in a . /// /// A to be used in a . - /// A button cannot contain a and a . + /// A button must contain either a or a , but not both. /// A button must have an or a . + /// A link button must contain a URL. + /// A URL must include a protocol (http or https). + /// A non-link button must contain a custom id public ButtonComponent Build() { if (string.IsNullOrEmpty(this.Label) && this.Emote == null) throw new InvalidOperationException("A button must have an Emote or a label!"); - if (!string.IsNullOrEmpty(this.Url) && !string.IsNullOrEmpty(this.CustomId)) - throw new InvalidOperationException("A button cannot contain a URL and a CustomId!"); + if (!(string.IsNullOrEmpty(this.Url) ^ string.IsNullOrEmpty(this.CustomId))) + throw new InvalidOperationException("A button must contain either a URL or a CustomId, but not both!"); - if (this.Style == ButtonStyle.Link && !string.IsNullOrEmpty(this.CustomId)) - this.CustomId = null; - - else if (this.Style != ButtonStyle.Link && !string.IsNullOrEmpty(this.Url)) // Thanks 𝑴𝒓π‘ͺπ’‚π’Œπ’†π‘Ίπ’π’‚π’šπ’†π’“ :D - this.Url = null; + if (this.Style == ButtonStyle.Link) + { + if (string.IsNullOrEmpty(this.Url)) + throw new InvalidOperationException("Link buttons must have a link associated with them"); + else if (!Uri.IsWellFormedUriString(this.Url, UriKind.Absolute)) + throw new InvalidOperationException("Urls must be well formatted and include their protocol (either HTTP or HTTPS)"); + } + + else if (string.IsNullOrEmpty(this.CustomId)) + throw new InvalidOperationException("Non-link buttons must have a custom id associated with them"); return new ButtonComponent(this.Style, this.Label, this.Emote, this.CustomId, this.Url, this.Disabled); } diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs index 2ac6efa6b..b7dd6ed02 100644 --- a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs +++ b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs @@ -401,10 +401,24 @@ namespace Discord /// The built embed object. /// /// Total embed length exceeds . + /// Any Url must be well formatted include its protocols (i.e http:// or https://). public Embed Build() { if (Length > MaxEmbedLength) throw new InvalidOperationException($"Total embed length must be less than or equal to {MaxEmbedLength}."); + if (!string.IsNullOrEmpty(Url) && !Uri.IsWellFormedUriString(Url, UriKind.Absolute)) + throw new InvalidOperationException("Url must be well formatted and include its protocol (either HTTP or HTTPS)"); + if (!string.IsNullOrEmpty(ThumbnailUrl) && !Uri.IsWellFormedUriString(ThumbnailUrl, UriKind.Absolute)) + throw new InvalidOperationException("Thumbnail Url must be well formatted and include its protocol (either HTTP or HTTPS)"); + if (!string.IsNullOrEmpty(ImageUrl) && !Uri.IsWellFormedUriString(ImageUrl, UriKind.Absolute)) + throw new InvalidOperationException("Image Url must be well formatted and include its protocol (either HTTP or HTTPS)"); + if (Author != null) + { + if(!string.IsNullOrEmpty(Author.Url) && !Uri.IsWellFormedUriString(Author.Url, UriKind.Absolute)) + throw new InvalidOperationException("Author Url must be well formatted and include its protocol (either HTTP or HTTPS)"); + if (!string.IsNullOrEmpty(Author.IconUrl) && !Uri.IsWellFormedUriString(Author.IconUrl, UriKind.Absolute)) + throw new InvalidOperationException("Author Icon Url must be well formatted and include its protocol (either HTTP or HTTPS)"); + } var fields = ImmutableArray.CreateBuilder(Fields.Count); for (int i = 0; i < Fields.Count; i++)