From d2d462fe8d78349ae8dd5253179ad1550c40d4a2 Mon Sep 17 00:00:00 2001 From: Finite Reality Date: Fri, 5 Aug 2016 00:32:49 +0100 Subject: [PATCH 1/6] Make IRole inherit IEquatable --- src/Discord.Net/Entities/Roles/IRole.cs | 2 +- src/Discord.Net/Rest/Entities/Roles/Role.cs | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net/Entities/Roles/IRole.cs b/src/Discord.Net/Entities/Roles/IRole.cs index 29975be46..f34f3f69c 100644 --- a/src/Discord.Net/Entities/Roles/IRole.cs +++ b/src/Discord.Net/Entities/Roles/IRole.cs @@ -5,7 +5,7 @@ using Discord.API.Rest; namespace Discord { - public interface IRole : IDeletable, ISnowflakeEntity + public interface IRole : IDeletable, ISnowflakeEntity, IEquatable { /// Gets the color given to users of this role. Color Color { get; } diff --git a/src/Discord.Net/Rest/Entities/Roles/Role.cs b/src/Discord.Net/Rest/Entities/Roles/Role.cs index cbcceb0cf..43f021615 100644 --- a/src/Discord.Net/Rest/Entities/Roles/Role.cs +++ b/src/Discord.Net/Rest/Entities/Roles/Role.cs @@ -57,6 +57,20 @@ namespace Discord await Discord.ApiClient.DeleteGuildRoleAsync(Guild.Id, Id).ConfigureAwait(false); } + public override bool Equals(object other) + { + if (other == null) return false; + Role otherAsRole = other as Role; + if (otherAsRole == null) return false; + else return Equals(otherAsRole); + } + + public bool Equals(Role other) + { + if (other == null) return false; + else return (Id.Equals(other.Id)); + } + public Role Clone() => MemberwiseClone() as Role; public override string ToString() => Name; From 8b8d3f76847e528f698e1e901890e30ba39530a4 Mon Sep 17 00:00:00 2001 From: Finite Reality Date: Fri, 5 Aug 2016 00:46:26 +0100 Subject: [PATCH 2/6] Fix visual studio's complaining --- src/Discord.Net/Rest/Entities/Roles/Role.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net/Rest/Entities/Roles/Role.cs b/src/Discord.Net/Rest/Entities/Roles/Role.cs index 43f021615..1acbd19f5 100644 --- a/src/Discord.Net/Rest/Entities/Roles/Role.cs +++ b/src/Discord.Net/Rest/Entities/Roles/Role.cs @@ -65,12 +65,17 @@ namespace Discord else return Equals(otherAsRole); } - public bool Equals(Role other) + public bool Equals(IRole other) { if (other == null) return false; else return (Id.Equals(other.Id)); } + public override int GetHashCode() + { + return base.GetHashCode(); + } + public Role Clone() => MemberwiseClone() as Role; public override string ToString() => Name; From f444429cf1c18b3c46ac0bde6ac56f5ff3e9184e Mon Sep 17 00:00:00 2001 From: Finite Reality Date: Fri, 5 Aug 2016 01:00:43 +0100 Subject: [PATCH 3/6] Add Contains overload for IEnumerable> Also actually implement GetHashCode --- src/Discord.Net/Extensions/CollectionExtensions.cs | 5 +++++ src/Discord.Net/Rest/Entities/Roles/Role.cs | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net/Extensions/CollectionExtensions.cs b/src/Discord.Net/Extensions/CollectionExtensions.cs index 8eebac817..811189e2b 100644 --- a/src/Discord.Net/Extensions/CollectionExtensions.cs +++ b/src/Discord.Net/Extensions/CollectionExtensions.cs @@ -14,6 +14,11 @@ namespace Discord => new ConcurrentDictionaryWrapper(query, () => source.Count); public static IReadOnlyCollection ToReadOnlyCollection(this IEnumerable query, Func countFunc) => new ConcurrentDictionaryWrapper(query, countFunc); + + public static bool Contains(this IEnumerable> roles, ulong id) + { + return roles.Any(x => x.Id == id); + } } [DebuggerDisplay(@"{DebuggerDisplay,nq}")] diff --git a/src/Discord.Net/Rest/Entities/Roles/Role.cs b/src/Discord.Net/Rest/Entities/Roles/Role.cs index 1acbd19f5..d96525b4a 100644 --- a/src/Discord.Net/Rest/Entities/Roles/Role.cs +++ b/src/Discord.Net/Rest/Entities/Roles/Role.cs @@ -73,7 +73,7 @@ namespace Discord public override int GetHashCode() { - return base.GetHashCode(); + return Id.GetHashCode(); } public Role Clone() => MemberwiseClone() as Role; From 1d96af5f38774880bd6a2833c4866c2a8244c667 Mon Sep 17 00:00:00 2001 From: Finite Reality Date: Fri, 5 Aug 2016 01:05:01 +0100 Subject: [PATCH 4/6] Rename Contains extension to ContainsId --- src/Discord.Net/Extensions/CollectionExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord.Net/Extensions/CollectionExtensions.cs b/src/Discord.Net/Extensions/CollectionExtensions.cs index 811189e2b..37bb382e8 100644 --- a/src/Discord.Net/Extensions/CollectionExtensions.cs +++ b/src/Discord.Net/Extensions/CollectionExtensions.cs @@ -15,7 +15,7 @@ namespace Discord public static IReadOnlyCollection ToReadOnlyCollection(this IEnumerable query, Func countFunc) => new ConcurrentDictionaryWrapper(query, countFunc); - public static bool Contains(this IEnumerable> roles, ulong id) + public static bool ContainsId(this IEnumerable> roles, ulong id) { return roles.Any(x => x.Id == id); } From d17aa198d3d1eae173b08364f2c5c8f64b4492a8 Mon Sep 17 00:00:00 2001 From: Finite Reality Date: Fri, 5 Aug 2016 01:09:48 +0100 Subject: [PATCH 5/6] Change ContainsId to work for any IEntity type --- src/Discord.Net/Extensions/CollectionExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net/Extensions/CollectionExtensions.cs b/src/Discord.Net/Extensions/CollectionExtensions.cs index 37bb382e8..6af92ac4d 100644 --- a/src/Discord.Net/Extensions/CollectionExtensions.cs +++ b/src/Discord.Net/Extensions/CollectionExtensions.cs @@ -15,9 +15,9 @@ namespace Discord public static IReadOnlyCollection ToReadOnlyCollection(this IEnumerable query, Func countFunc) => new ConcurrentDictionaryWrapper(query, countFunc); - public static bool ContainsId(this IEnumerable> roles, ulong id) + public static bool ContainsId(this IEnumerable> roles, T id) where T : IEquatable { - return roles.Any(x => x.Id == id); + return roles.Any(x => x.Id.Equals(id)); } } From 492cd35fe3ad3b4accd42a85b57d6775325ead7e Mon Sep 17 00:00:00 2001 From: Finite Reality Date: Fri, 5 Aug 2016 01:13:42 +0100 Subject: [PATCH 6/6] Remove IEquatable implementation for IRole After a discussion, ends up this was a design choice. Maybe we can get ContainsId to stay? --- src/Discord.Net/Entities/Roles/IRole.cs | 2 +- src/Discord.Net/Rest/Entities/Roles/Role.cs | 19 ------------------- 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/src/Discord.Net/Entities/Roles/IRole.cs b/src/Discord.Net/Entities/Roles/IRole.cs index f34f3f69c..29975be46 100644 --- a/src/Discord.Net/Entities/Roles/IRole.cs +++ b/src/Discord.Net/Entities/Roles/IRole.cs @@ -5,7 +5,7 @@ using Discord.API.Rest; namespace Discord { - public interface IRole : IDeletable, ISnowflakeEntity, IEquatable + public interface IRole : IDeletable, ISnowflakeEntity { /// Gets the color given to users of this role. Color Color { get; } diff --git a/src/Discord.Net/Rest/Entities/Roles/Role.cs b/src/Discord.Net/Rest/Entities/Roles/Role.cs index d96525b4a..cbcceb0cf 100644 --- a/src/Discord.Net/Rest/Entities/Roles/Role.cs +++ b/src/Discord.Net/Rest/Entities/Roles/Role.cs @@ -57,25 +57,6 @@ namespace Discord await Discord.ApiClient.DeleteGuildRoleAsync(Guild.Id, Id).ConfigureAwait(false); } - public override bool Equals(object other) - { - if (other == null) return false; - Role otherAsRole = other as Role; - if (otherAsRole == null) return false; - else return Equals(otherAsRole); - } - - public bool Equals(IRole other) - { - if (other == null) return false; - else return (Id.Equals(other.Id)); - } - - public override int GetHashCode() - { - return Id.GetHashCode(); - } - public Role Clone() => MemberwiseClone() as Role; public override string ToString() => Name;