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++)