diff --git a/src/Discord.Net.Core/Entities/Messages/Embed.cs b/src/Discord.Net.Core/Entities/Messages/Embed.cs index 7fa6f6f36..f503c343a 100644 --- a/src/Discord.Net.Core/Entities/Messages/Embed.cs +++ b/src/Discord.Net.Core/Entities/Messages/Embed.cs @@ -94,5 +94,41 @@ 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); + + public override bool Equals(object obj) + => obj is not null && GetType() == obj.GetType() && Equals(obj as Embed); + + public bool Equals(Embed embed) + => GetHashCode() == embed.GetHashCode(); + + public override int GetHashCode() + { + var hashCode = new HashCode(); + hashCode.Add(Type); + hashCode.Add(Title); + hashCode.Add(Description); + hashCode.Add(Timestamp); + hashCode.Add(Color); + hashCode.Add(Image); + hashCode.Add(Video); + hashCode.Add(Author); + hashCode.Add(Footer); + hashCode.Add(Provider); + hashCode.Add(Thumbnail); + + foreach (var field in Fields) + { + hashCode.Add(field); + } + + return hashCode.ToHashCode(); + } } } diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedAuthor.cs b/src/Discord.Net.Core/Entities/Messages/EmbedAuthor.cs index 3b11f6a8b..12ea10ff7 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,21 @@ 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); + + public override bool Equals(object obj) + => obj is not null && GetType() == obj.GetType() && Equals(obj as EmbedAuthor?); + + public bool Equals(EmbedAuthor embedAuthor) + => GetHashCode() == embedAuthor.GetHashCode(); + + public override int GetHashCode() + => HashCode.Combine(Name, Url, IconUrl); } } diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs index 1e2a7b0d7..a104bc731 100644 --- a/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs +++ b/src/Discord.Net.Core/Entities/Messages/EmbedBuilder.cs @@ -481,6 +481,40 @@ 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); + + public override bool Equals(object obj) + => obj is not null && GetType() == obj.GetType() && Equals(obj as EmbedBuilder); + + public bool Equals(EmbedBuilder embedBuilder) + => GetHashCode() == embedBuilder.GetHashCode(); + + public override int GetHashCode() + { + var hashCode = new HashCode(); + hashCode.Add(_title); + hashCode.Add(_description); + hashCode.Add(_image); + hashCode.Add(_thumbnail); + hashCode.Add(Timestamp); + hashCode.Add(Color); + hashCode.Add(Author); + hashCode.Add(Footer); + hashCode.Add(Url); + + foreach (var field in _fields) + { + hashCode.Add(field); + } + + return hashCode.ToHashCode(); + } } /// @@ -597,6 +631,22 @@ 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); + + public override bool Equals(object obj) + => obj is not null && GetType() == obj.GetType() && Equals(obj as EmbedFieldBuilder); + + public bool Equals(EmbedFieldBuilder embedFieldBuilder) + => GetHashCode() == embedFieldBuilder.GetHashCode(); + + public override int GetHashCode() + => HashCode.Combine(Name, Value, IsInline); } /// @@ -697,6 +747,22 @@ 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); + + public override bool Equals(object obj) + => obj is not null && GetType() == obj.GetType() && Equals(obj as EmbedAuthorBuilder); + + public bool Equals(EmbedAuthorBuilder embedAuthorBuilder) + => GetHashCode() == embedAuthorBuilder.GetHashCode(); + + public override int GetHashCode() + => HashCode.Combine(Name, Url, IconUrl); } /// @@ -777,5 +843,21 @@ 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); + + public override bool Equals(object obj) + => obj is not null && GetType() == obj.GetType() && Equals(obj as EmbedFooterBuilder); + + public bool Equals(EmbedFooterBuilder embedFooterBuilder) + => GetHashCode() == embedFooterBuilder.GetHashCode(); + + public override int GetHashCode() + => HashCode.Combine(Text, IconUrl); } } diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedField.cs b/src/Discord.Net.Core/Entities/Messages/EmbedField.cs index f6aa2af3b..60a86fd10 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,21 @@ 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); + + public override bool Equals(object obj) + => obj is not null && GetType() == obj.GetType() && Equals(obj as EmbedField?); + + public bool Equals(EmbedField embedField) + => GetHashCode() == embedField.GetHashCode(); + + public override int GetHashCode() + => HashCode.Combine(Name, Value, Inline); } } diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedFooter.cs b/src/Discord.Net.Core/Entities/Messages/EmbedFooter.cs index 4c507d017..838aa4fb5 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,21 @@ 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); + + public override bool Equals(object obj) + => obj is not null && GetType() == obj.GetType() && Equals(obj as EmbedFooter?); + + public bool Equals(EmbedFooter embedFooter) + => GetHashCode() == embedFooter.GetHashCode(); + + public override int GetHashCode() + => HashCode.Combine(Text, IconUrl, ProxyUrl); } } diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedImage.cs b/src/Discord.Net.Core/Entities/Messages/EmbedImage.cs index 9ce2bfe73..96e0f3316 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,21 @@ 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); + + public override bool Equals(object obj) + => obj is not null && GetType() == obj.GetType() && Equals(obj as EmbedImage?); + + public bool Equals(EmbedImage embedImage) + => GetHashCode() == embedImage.GetHashCode(); + + public override int GetHashCode() + => HashCode.Combine(Height, Width, Url, ProxyUrl); } } diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedThumbnail.cs b/src/Discord.Net.Core/Entities/Messages/EmbedThumbnail.cs index 7f7b582dc..06eb7cb9c 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,21 @@ 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); + + public override bool Equals(object obj) + => obj is not null && GetType() == obj.GetType() && Equals(obj as EmbedThumbnail?); + + public bool Equals(EmbedThumbnail embedThumbnail) + => GetHashCode() == embedThumbnail.GetHashCode(); + + public override int GetHashCode() + => HashCode.Combine(Width, Height, Url, ProxyUrl); } } diff --git a/src/Discord.Net.Core/Entities/Messages/EmbedVideo.cs b/src/Discord.Net.Core/Entities/Messages/EmbedVideo.cs index ca0300e80..2c77bbf7b 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,21 @@ 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); + + public override bool Equals(object obj) + => obj is not null && GetType() == obj.GetType() && Equals(obj as EmbedVideo?); + + public bool Equals(EmbedVideo embedVideo) + => GetHashCode() == embedVideo.GetHashCode(); + + public override int GetHashCode() + => HashCode.Combine(Width, Height, Url); } }