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) | ||||