diff --git a/src/Discord.Net.Core/Entities/Roles/IRole.cs b/src/Discord.Net.Core/Entities/Roles/IRole.cs index aa34fb019..2e3d63702 100644 --- a/src/Discord.Net.Core/Entities/Roles/IRole.cs +++ b/src/Discord.Net.Core/Entities/Roles/IRole.cs @@ -4,7 +4,7 @@ using System.Threading.Tasks; namespace Discord { - public interface IRole : ISnowflakeEntity, IDeletable, IMentionable + public interface IRole : ISnowflakeEntity, IDeletable, IMentionable, IComparable { /// Gets the guild owning this role. IGuild Guild { get; } @@ -27,4 +27,4 @@ namespace Discord ///// Modifies this role. Task ModifyAsync(Action func, RequestOptions options = null); } -} \ No newline at end of file +} diff --git a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs index b48c76a37..139640e5a 100644 --- a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs +++ b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace Discord { /// A Guild-User pairing. - public interface IGuildUser : IUser, IVoiceState + public interface IGuildUser : IUser, IVoiceState, IComparable { /// Gets when this user joined this guild. DateTimeOffset? JoinedAt { get; } diff --git a/src/Discord.Net.Core/Extensions/GuildUserExtensions.cs b/src/Discord.Net.Core/Extensions/GuildUserExtensions.cs index 57d6a13dc..51e00fb42 100644 --- a/src/Discord.Net.Core/Extensions/GuildUserExtensions.cs +++ b/src/Discord.Net.Core/Extensions/GuildUserExtensions.cs @@ -15,5 +15,17 @@ namespace Discord => RemoveRolesAsync(user, (IEnumerable)roles); public static Task RemoveRolesAsync(this IGuildUser user, IEnumerable roles) => user.ModifyAsync(x => x.RoleIds = user.RoleIds.Except(roles.Select(y => y.Id)).ToArray()); + + public static IEnumerable GetRoles(this IGuildUser user) { + var guild = user.Guild; + return user.RoleIds.Select(r => guild.GetRole(r)); + } + + internal static int Compare(this IGuildUser u1, IGuildUser u2) { + var r1 = u1.GetRoles().Max(); + var r2 = u2.GetRoles().Max(); + var result = r1.CompareTo(r2); + return result != 0 ? result : u1.Id.CompareTo(u2.Id); + } } } diff --git a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs index 6e81ce9df..60d868caa 100644 --- a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs +++ b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs @@ -4,9 +4,7 @@ using System.Diagnostics; using System.Threading.Tasks; using Model = Discord.API.Role; -namespace Discord.Rest -{ - [DebuggerDisplay(@"{DebuggerDisplay,nq}")] +namespace Discord.Rest { [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestRole : RestEntity, IRole { public RestGuild Guild { get; } @@ -51,10 +49,12 @@ namespace Discord.Rest public Task DeleteAsync(RequestOptions options = null) => RoleHelper.DeleteAsync(this, Discord, options); + public override string ToString() => Name; private string DebuggerDisplay => $"{Name} ({Id})"; //IRole IGuild IRole.Guild => Guild; + public int CompareTo(IRole role) => Position.CompareTo(role.Position); } } diff --git a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs index 180ad38bc..6e242e264 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs @@ -96,6 +96,8 @@ namespace Discord.Rest throw new InvalidOperationException("Unable to return this entity's parent unless it was fetched through that object."); } } + + public int CompareTo(IGuildUser user) => this.Compare(user); //IVoiceState bool IVoiceState.IsSelfDeafened => false; @@ -103,5 +105,6 @@ namespace Discord.Rest bool IVoiceState.IsSuppressed => false; IVoiceChannel IVoiceState.VoiceChannel => null; string IVoiceState.VoiceSessionId => null; + } } diff --git a/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs b/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs index 515389da1..d6612dcb6 100644 --- a/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs +++ b/src/Discord.Net.WebSocket/Entities/Roles/SocketRole.cs @@ -57,5 +57,6 @@ namespace Discord.WebSocket //IRole IGuild IRole.Guild => Guild; + public int CompareTo(IRole role) => Position.CompareTo(role.Position); } } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index 5a670c14d..3610b6284 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -96,6 +96,7 @@ namespace Discord.WebSocket IGuild IGuildUser.Guild => Guild; ulong IGuildUser.GuildId => Guild.Id; IReadOnlyCollection IGuildUser.RoleIds => RoleIds; + public int CompareTo(IGuildUser user) => this.Compare(user); //IUser Task IUser.GetDMChannelAsync(CacheMode mode, RequestOptions options)