diff --git a/src/Discord.Net.Core/Entities/Messages/Embed.cs b/src/Discord.Net.Core/Entities/Messages/Embed.cs
index 7fa6f6f36..c1478f56c 100644
--- a/src/Discord.Net.Core/Entities/Messages/Embed.cs
+++ b/src/Discord.Net.Core/Entities/Messages/Embed.cs
@@ -94,5 +94,44 @@ namespace Discord
///
public override string ToString() => Title;
private string DebuggerDisplay => $"{Title} ({Type})";
+
+ public static bool operator ==(Embed left, Embed right)
+ => left is null ? right is null
+ : left.Equals(right);
+
+ public static bool operator !=(Embed left, Embed right)
+ => !(left == right);
+
+ ///
+ /// Determines whether the specified object is equal to the current .
+ ///
+ ///
+ /// If the object passes is an , will be called to compare the 2 instances
+ ///
+ /// The object to compare with the current
+ ///
+ public override bool Equals(object obj)
+ => obj is Embed embed && Equals(embed);
+
+ ///
+ /// Determines whether the specified is equal to the current
+ ///
+ /// The to compare with the current
+ ///
+ public bool Equals(Embed embed)
+ => GetHashCode() == embed?.GetHashCode();
+
+ ///
+ public override int GetHashCode()
+ {
+ unchecked
+ {
+ var hash = 17;
+ hash = hash * 23 + (Type, Title, Description, Timestamp, Color, Image, Video, Author, Footer, Provider, Thumbnail).GetHashCode();
+ foreach(var field in Fields)
+ hash = hash * 23 + field.GetHashCode();
+ return hash;
+ }
+ }
}
}
diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedAuthor.cs b/src/Discord.Net.Core/Entities/Messages/EmbedAuthor.cs
index 3b11f6a8b..fdd51e6c9 100644
--- a/src/Discord.Net.Core/Entities/Messages/EmbedAuthor.cs
+++ b/src/Discord.Net.Core/Entities/Messages/EmbedAuthor.cs
@@ -1,3 +1,4 @@
+using System;
using System.Diagnostics;
namespace Discord
@@ -41,5 +42,35 @@ namespace Discord
///
///
public override string ToString() => Name;
+
+ public static bool operator ==(EmbedAuthor? left, EmbedAuthor? right)
+ => left is null ? right is null
+ : left.Equals(right);
+
+ public static bool operator !=(EmbedAuthor? left, EmbedAuthor? right)
+ => !(left == right);
+
+ ///
+ /// Determines whether the specified object is equal to the current .
+ ///
+ ///
+ /// If the object passes is an , will be called to compare the 2 instances
+ ///
+ /// The object to compare with the current
+ ///
+ public override bool Equals(object obj)
+ => obj is EmbedAuthor embedAuthor && Equals(embedAuthor);
+
+ ///
+ /// Determines whether the specified is equal to the current
+ ///
+ /// The to compare with the current
+ ///
+ public bool Equals(EmbedAuthor? embedAuthor)
+ => GetHashCode() == embedAuthor?.GetHashCode();
+
+ ///
+ public override int GetHashCode()
+ => (Name, Url, IconUrl).GetHashCode();
}
}
diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs
index 1e2a7b0d7..db38b9fb7 100644
--- a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs
+++ b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs
@@ -481,6 +481,55 @@ namespace Discord
return new Embed(EmbedType.Rich, Title, Description, Url, Timestamp, Color, _image, null, Author?.Build(), Footer?.Build(), null, _thumbnail, fields.ToImmutable());
}
+
+ public static bool operator ==(EmbedBuilder left, EmbedBuilder right)
+ => left is null ? right is null
+ : left.Equals(right);
+
+ public static bool operator !=(EmbedBuilder left, EmbedBuilder right)
+ => !(left == right);
+
+ ///
+ /// Determines whether the specified object is equal to the current .
+ ///
+ ///
+ /// If the object passes is an , will be called to compare the 2 instances
+ ///
+ /// The object to compare with the current
+ ///
+ public override bool Equals(object obj)
+ => obj is EmbedBuilder embedBuilder && Equals(embedBuilder);
+
+ ///
+ /// Determines whether the specified is equal to the current
+ ///
+ /// The to compare with the current
+ ///
+ public bool Equals(EmbedBuilder embedBuilder)
+ {
+ if (embedBuilder is null)
+ return false;
+
+ if (Fields.Count != embedBuilder.Fields.Count)
+ return false;
+
+ for (var i = 0; i < _fields.Count; i++)
+ if (_fields[i] != embedBuilder._fields[i])
+ return false;
+
+ return _title == embedBuilder?._title
+ && _description == embedBuilder?._description
+ && _image == embedBuilder?._image
+ && _thumbnail == embedBuilder?._thumbnail
+ && Timestamp == embedBuilder?.Timestamp
+ && Color == embedBuilder?.Color
+ && Author == embedBuilder?.Author
+ && Footer == embedBuilder?.Footer
+ && Url == embedBuilder?.Url;
+ }
+
+ ///
+ public override int GetHashCode() => base.GetHashCode();
}
///
@@ -597,6 +646,37 @@ namespace Discord
///
public EmbedField Build()
=> new EmbedField(Name, Value.ToString(), IsInline);
+
+ public static bool operator ==(EmbedFieldBuilder left, EmbedFieldBuilder right)
+ => left is null ? right is null
+ : left.Equals(right);
+
+ public static bool operator !=(EmbedFieldBuilder left, EmbedFieldBuilder right)
+ => !(left == right);
+
+ ///
+ /// Determines whether the specified object is equal to the current .
+ ///
+ ///
+ /// If the object passes is an , will be called to compare the 2 instances
+ ///
+ /// The object to compare with the current
+ ///
+ public override bool Equals(object obj)
+ => obj is EmbedFieldBuilder embedFieldBuilder && Equals(embedFieldBuilder);
+
+ ///
+ /// Determines whether the specified is equal to the current
+ ///
+ /// The to compare with the current
+ ///
+ public bool Equals(EmbedFieldBuilder embedFieldBuilder)
+ => _name == embedFieldBuilder?._name
+ && _value == embedFieldBuilder?._value
+ && IsInline == embedFieldBuilder?.IsInline;
+
+ ///
+ public override int GetHashCode() => base.GetHashCode();
}
///
@@ -697,6 +777,37 @@ namespace Discord
///
public EmbedAuthor Build()
=> new EmbedAuthor(Name, Url, IconUrl, null);
+
+ public static bool operator ==(EmbedAuthorBuilder left, EmbedAuthorBuilder right)
+ => left is null ? right is null
+ : left.Equals(right);
+
+ public static bool operator !=(EmbedAuthorBuilder left, EmbedAuthorBuilder right)
+ => !(left == right);
+
+ ///
+ /// Determines whether the specified object is equal to the current .
+ ///
+ ///
+ /// If the object passes is an , will be called to compare the 2 instances
+ ///
+ /// The object to compare with the current
+ ///
+ public override bool Equals(object obj)
+ => obj is EmbedAuthorBuilder embedAuthorBuilder && Equals(embedAuthorBuilder);
+
+ ///
+ /// Determines whether the specified is equals to the current
+ ///
+ /// The to compare with the current
+ ///
+ public bool Equals(EmbedAuthorBuilder embedAuthorBuilder)
+ => _name == embedAuthorBuilder?._name
+ && Url == embedAuthorBuilder?.Url
+ && IconUrl == embedAuthorBuilder?.IconUrl;
+
+ ///
+ public override int GetHashCode() => base.GetHashCode();
}
///
@@ -777,5 +888,35 @@ namespace Discord
///
public EmbedFooter Build()
=> new EmbedFooter(Text, IconUrl, null);
+
+ public static bool operator ==(EmbedFooterBuilder left, EmbedFooterBuilder right)
+ => left is null ? right is null
+ : left.Equals(right);
+
+ public static bool operator !=(EmbedFooterBuilder left, EmbedFooterBuilder right)
+ => !(left == right);
+
+ ///
+ /// Determines whether the specified object is equal to the current .
+ ///
+ ///
+ /// If the object passes is an , will be called to compare the 2 instances
+ ///
+ /// The object to compare with the current
+ ///
+ public override bool Equals(object obj)
+ => obj is EmbedFooterBuilder embedFooterBuilder && Equals(embedFooterBuilder);
+
+ ///
+ /// Determines whether the specified is equal to the current
+ ///
+ /// The to compare with the current
+ ///
+ public bool Equals(EmbedFooterBuilder embedFooterBuilder)
+ => _text == embedFooterBuilder?._text
+ && IconUrl == embedFooterBuilder?.IconUrl;
+
+ ///
+ public override int GetHashCode() => base.GetHashCode();
}
}
diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedField.cs b/src/Discord.Net.Core/Entities/Messages/EmbedField.cs
index f6aa2af3b..1196869fe 100644
--- a/src/Discord.Net.Core/Entities/Messages/EmbedField.cs
+++ b/src/Discord.Net.Core/Entities/Messages/EmbedField.cs
@@ -1,3 +1,4 @@
+using System;
using System.Diagnostics;
namespace Discord
@@ -36,5 +37,35 @@ namespace Discord
/// A string that resolves to .
///
public override string ToString() => Name;
+
+ public static bool operator ==(EmbedField? left, EmbedField? right)
+ => left is null ? right is null
+ : left.Equals(right);
+
+ public static bool operator !=(EmbedField? left, EmbedField? right)
+ => !(left == right);
+
+ ///
+ /// Determines whether the specified object is equal to the current .
+ ///
+ ///
+ /// If the object passes is an , will be called to compare the 2 instances
+ ///
+ /// The object to compare with the current object
+ ///
+ public override bool Equals(object obj)
+ => obj is EmbedField embedField && Equals(embedField);
+
+ ///
+ /// Determines whether the specified is equal to the current
+ ///
+ ///
+ ///
+ public bool Equals(EmbedField? embedField)
+ => GetHashCode() == embedField?.GetHashCode();
+
+ ///
+ public override int GetHashCode()
+ => (Name, Value, Inline).GetHashCode();
}
}
diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedFooter.cs b/src/Discord.Net.Core/Entities/Messages/EmbedFooter.cs
index 4c507d017..5a1f13158 100644
--- a/src/Discord.Net.Core/Entities/Messages/EmbedFooter.cs
+++ b/src/Discord.Net.Core/Entities/Messages/EmbedFooter.cs
@@ -1,3 +1,4 @@
+using System;
using System.Diagnostics;
namespace Discord
@@ -43,5 +44,35 @@ namespace Discord
/// A string that resolves to .
///
public override string ToString() => Text;
+
+ public static bool operator ==(EmbedFooter? left, EmbedFooter? right)
+ => left is null ? right is null
+ : left.Equals(right);
+
+ public static bool operator !=(EmbedFooter? left, EmbedFooter? right)
+ => !(left == right);
+
+ ///
+ /// Determines whether the specified object is equal to the current .
+ ///
+ ///
+ /// If the object passes is an , will be called to compare the 2 instances
+ ///
+ /// The object to compare with the current
+ ///
+ public override bool Equals(object obj)
+ => obj is EmbedFooter embedFooter && Equals(embedFooter);
+
+ ///
+ /// Determines whether the specified is equal to the current
+ ///
+ /// The to compare with the current
+ ///
+ public bool Equals(EmbedFooter? embedFooter)
+ => GetHashCode() == embedFooter?.GetHashCode();
+
+ ///
+ public override int GetHashCode()
+ => (Text, IconUrl, ProxyUrl).GetHashCode();
}
}
diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedImage.cs b/src/Discord.Net.Core/Entities/Messages/EmbedImage.cs
index 9ce2bfe73..85a638dc8 100644
--- a/src/Discord.Net.Core/Entities/Messages/EmbedImage.cs
+++ b/src/Discord.Net.Core/Entities/Messages/EmbedImage.cs
@@ -1,3 +1,4 @@
+using System;
using System.Diagnostics;
namespace Discord
@@ -53,5 +54,35 @@ namespace Discord
/// A string that resolves to .
///
public override string ToString() => Url;
+
+ public static bool operator ==(EmbedImage? left, EmbedImage? right)
+ => left is null ? right is null
+ : left.Equals(right);
+
+ public static bool operator !=(EmbedImage? left, EmbedImage? right)
+ => !(left == right);
+
+ ///
+ /// Determines whether the specified object is equal to the current .
+ ///
+ ///
+ /// If the object passes is an , will be called to compare the 2 instances
+ ///
+ /// The object to compare with the current
+ ///
+ public override bool Equals(object obj)
+ => obj is EmbedImage embedImage && Equals(embedImage);
+
+ ///
+ /// Determines whether the specified is equal to the current
+ ///
+ /// The to compare with the current
+ ///
+ public bool Equals(EmbedImage? embedImage)
+ => GetHashCode() == embedImage?.GetHashCode();
+
+ ///
+ public override int GetHashCode()
+ => (Height, Width, Url, ProxyUrl).GetHashCode();
}
}
diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedProvider.cs b/src/Discord.Net.Core/Entities/Messages/EmbedProvider.cs
index 960fb3d78..f2ee74613 100644
--- a/src/Discord.Net.Core/Entities/Messages/EmbedProvider.cs
+++ b/src/Discord.Net.Core/Entities/Messages/EmbedProvider.cs
@@ -1,3 +1,4 @@
+using System;
using System.Diagnostics;
namespace Discord
@@ -35,5 +36,35 @@ namespace Discord
/// A string that resolves to .
///
public override string ToString() => Name;
+
+ public static bool operator ==(EmbedProvider? left, EmbedProvider? right)
+ => left is null ? right is null
+ : left.Equals(right);
+
+ public static bool operator !=(EmbedProvider? left, EmbedProvider? right)
+ => !(left == right);
+
+ ///
+ /// Determines whether the specified object is equal to the current .
+ ///
+ ///
+ /// If the object passes is an , will be called to compare the 2 instances
+ ///
+ /// The object to compare with the current
+ ///
+ public override bool Equals(object obj)
+ => obj is EmbedProvider embedProvider && Equals(embedProvider);
+
+ ///
+ /// Determines whether the specified is equal to the current
+ ///
+ /// The to compare with the current
+ ///
+ public bool Equals(EmbedProvider? embedProvider)
+ => GetHashCode() == embedProvider?.GetHashCode();
+
+ ///
+ public override int GetHashCode()
+ => (Name, Url).GetHashCode();
}
}
diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedThumbnail.cs b/src/Discord.Net.Core/Entities/Messages/EmbedThumbnail.cs
index 7f7b582dc..65c8139c3 100644
--- a/src/Discord.Net.Core/Entities/Messages/EmbedThumbnail.cs
+++ b/src/Discord.Net.Core/Entities/Messages/EmbedThumbnail.cs
@@ -1,3 +1,4 @@
+using System;
using System.Diagnostics;
namespace Discord
@@ -53,5 +54,35 @@ namespace Discord
/// A string that resolves to .
///
public override string ToString() => Url;
+
+ public static bool operator ==(EmbedThumbnail? left, EmbedThumbnail? right)
+ => left is null ? right is null
+ : left.Equals(right);
+
+ public static bool operator !=(EmbedThumbnail? left, EmbedThumbnail? right)
+ => !(left == right);
+
+ ///
+ /// Determines whether the specified object is equal to the current .
+ ///
+ ///
+ /// If the object passes is an , will be called to compare the 2 instances
+ ///
+ /// The object to compare with the current
+ ///
+ public override bool Equals(object obj)
+ => obj is EmbedThumbnail embedThumbnail && Equals(embedThumbnail);
+
+ ///
+ /// Determines whether the specified is equal to the current
+ ///
+ /// The to compare with the current
+ ///
+ public bool Equals(EmbedThumbnail? embedThumbnail)
+ => GetHashCode() == embedThumbnail?.GetHashCode();
+
+ ///
+ public override int GetHashCode()
+ => (Width, Height, Url, ProxyUrl).GetHashCode();
}
}
diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedVideo.cs b/src/Discord.Net.Core/Entities/Messages/EmbedVideo.cs
index ca0300e80..0762ed8e7 100644
--- a/src/Discord.Net.Core/Entities/Messages/EmbedVideo.cs
+++ b/src/Discord.Net.Core/Entities/Messages/EmbedVideo.cs
@@ -1,3 +1,4 @@
+using System;
using System.Diagnostics;
namespace Discord
@@ -47,5 +48,35 @@ namespace Discord
/// A string that resolves to .
///
public override string ToString() => Url;
+
+ public static bool operator ==(EmbedVideo? left, EmbedVideo? right)
+ => left is null ? right is null
+ : left.Equals(right);
+
+ public static bool operator !=(EmbedVideo? left, EmbedVideo? right)
+ => !(left == right);
+
+ ///
+ /// Determines whether the specified object is equal to the current .
+ ///
+ ///
+ /// If the object passes is an , will be called to compare the 2 instances
+ ///
+ /// The object to compare with the current
+ ///
+ public override bool Equals(object obj)
+ => obj is EmbedVideo embedVideo && Equals(embedVideo);
+
+ ///
+ /// Determines whether the specified is equal to the current
+ ///
+ /// The to compare with the current
+ ///
+ public bool Equals(EmbedVideo? embedVideo)
+ => GetHashCode() == embedVideo?.GetHashCode();
+
+ ///
+ public override int GetHashCode()
+ => (Width, Height, Url).GetHashCode();
}
}