| @@ -6,14 +6,23 @@ namespace Discord | |||||
| { | { | ||||
| public static class GuildUserExtensions | public static class GuildUserExtensions | ||||
| { | { | ||||
| //TODO: Should we remove Add/Remove? Encourages race conditions. | |||||
| public static Task AddRolesAsync(this IGuildUser user, params IRole[] roles) | public static Task AddRolesAsync(this IGuildUser user, params IRole[] roles) | ||||
| => AddRolesAsync(user, (IEnumerable<IRole>)roles); | |||||
| => ChangeRolesAsync(user, add: roles); | |||||
| public static Task AddRolesAsync(this IGuildUser user, IEnumerable<IRole> roles) | public static Task AddRolesAsync(this IGuildUser user, IEnumerable<IRole> roles) | ||||
| => user.ModifyAsync(x => x.RoleIds = user.RoleIds.Concat(roles.Select(y => y.Id)).ToArray()); | |||||
| => ChangeRolesAsync(user, add: roles); | |||||
| public static Task RemoveRolesAsync(this IGuildUser user, params IRole[] roles) | public static Task RemoveRolesAsync(this IGuildUser user, params IRole[] roles) | ||||
| => RemoveRolesAsync(user, (IEnumerable<IRole>)roles); | |||||
| => ChangeRolesAsync(user, remove: roles); | |||||
| public static Task RemoveRolesAsync(this IGuildUser user, IEnumerable<IRole> roles) | public static Task RemoveRolesAsync(this IGuildUser user, IEnumerable<IRole> roles) | ||||
| => user.ModifyAsync(x => x.RoleIds = user.RoleIds.Except(roles.Select(y => y.Id)).ToArray()); | |||||
| => ChangeRolesAsync(user, remove: roles); | |||||
| public static async Task ChangeRolesAsync(this IGuildUser user, IEnumerable<IRole> add = null, IEnumerable<IRole> remove = null) | |||||
| { | |||||
| IEnumerable<ulong> roleIds = user.RoleIds; | |||||
| if (remove != null) | |||||
| roleIds = roleIds.Except(remove.Select(x => x.Id)); | |||||
| if (add != null) | |||||
| roleIds = roleIds.Concat(add.Select(x => x.Id)); | |||||
| await user.ModifyAsync(x => x.RoleIds = roleIds.ToArray()).ConfigureAwait(false); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||