Property can be renamed as needed.tags/1.0-rc
| @@ -28,5 +28,10 @@ namespace Discord | |||||
| Task KickAsync(RequestOptions options = null); | Task KickAsync(RequestOptions options = null); | ||||
| /// <summary> Modifies this user's properties in this guild. </summary> | /// <summary> Modifies this user's properties in this guild. </summary> | ||||
| Task ModifyAsync(Action<ModifyGuildMemberParams> func, RequestOptions options = null); | Task ModifyAsync(Action<ModifyGuildMemberParams> func, RequestOptions options = null); | ||||
| /// <summary> The position of the user within the role hirearchy. </summary> | |||||
| /// <remarks> The returned value equal to the position of the highest role the user has, | |||||
| /// or int.MaxValue if user is the server owner. </remarks> | |||||
| int Hirearchy { get; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -21,15 +21,20 @@ namespace Discord | |||||
| return user.RoleIds.Select(r => guild.GetRole(r)); | return user.RoleIds.Select(r => guild.GetRole(r)); | ||||
| } | } | ||||
| public static int CompareRoles(this IGuildUser left, IGuildUser right) { | |||||
| // These should never be empty since the everyone role is always present | |||||
| var roleLeft = left.GetRoles().Max(); | |||||
| var roleRight= right.GetRoles().Max(); | |||||
| return roleLeft.CompareTo(roleRight); | |||||
| internal static int GetHirearchy(this IGuildUser user) { | |||||
| if(user == null) | |||||
| return -1; | |||||
| if(user.Id == user.Guild.OwnerId) | |||||
| return int.MaxValue; | |||||
| return user.GetRoles().Max(r => r.Position); | |||||
| } | } | ||||
| public static int Compare(this IGuildUser user, IRole role) { | |||||
| return user.GetRoles().Max().CompareTo(role); | |||||
| internal static int CompareRole(this IGuildUser user, IRole role) { | |||||
| if(user == null) | |||||
| return -1; | |||||
| if(role == null) | |||||
| return 1; | |||||
| return -user.Hirearchy.CompareTo(role.Position); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -96,8 +96,8 @@ namespace Discord.Rest | |||||
| throw new InvalidOperationException("Unable to return this entity's parent unless it was fetched through that object."); | throw new InvalidOperationException("Unable to return this entity's parent unless it was fetched through that object."); | ||||
| } | } | ||||
| } | } | ||||
| public int CompareTo(IRole role) => this.Compare(role); | |||||
| public int Hirearchy => this.GetHirearchy(); | |||||
| public int CompareTo(IRole role) => this.CompareRole(role); | |||||
| //IVoiceState | //IVoiceState | ||||
| bool IVoiceState.IsSelfDeafened => false; | bool IVoiceState.IsSelfDeafened => false; | ||||
| @@ -96,7 +96,8 @@ namespace Discord.WebSocket | |||||
| IGuild IGuildUser.Guild => Guild; | IGuild IGuildUser.Guild => Guild; | ||||
| ulong IGuildUser.GuildId => Guild.Id; | ulong IGuildUser.GuildId => Guild.Id; | ||||
| IReadOnlyCollection<ulong> IGuildUser.RoleIds => RoleIds; | IReadOnlyCollection<ulong> IGuildUser.RoleIds => RoleIds; | ||||
| public int CompareTo(IRole role) => this.Compare(role); | |||||
| public int CompareTo(IRole role) => this.CompareRole(role); | |||||
| public int Hirearchy => this.GetHirearchy(); | |||||
| //IUser | //IUser | ||||
| Task<IDMChannel> IUser.GetDMChannelAsync(CacheMode mode, RequestOptions options) | Task<IDMChannel> IUser.GetDMChannelAsync(CacheMode mode, RequestOptions options) | ||||