Browse Source

GuildUserExtensions removed in favour of atomic role add/remove endpoints (#540)

* Removed GuildUserExtensions and moved the methods to IGuildUser and implementations

* Made changes per fox's suggestion: Change->Modify. New Modify overload.

* Oops

* Per Volt: reimplemented new endpoints

* Fixing broken docstrings

* I forgot that docstrings are XML

* Implemented atomic add/remove role endpoints

* Removed  so people aren't irked

* Added single-item role add/remove methods
tags/1.0-rc
Mateusz Brawański RogueException 8 years ago
parent
commit
efbd3cb681
7 changed files with 70 additions and 31 deletions
  1. +4
    -4
      src/Discord.Net.Core/Entities/Users/GuildUserProperties.cs
  2. +9
    -0
      src/Discord.Net.Core/Entities/Users/IGuildUser.cs
  3. +0
    -27
      src/Discord.Net.Core/Extensions/GuildUserExtensions.cs
  4. +20
    -0
      src/Discord.Net.Rest/DiscordRestApiClient.cs
  5. +12
    -0
      src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs
  6. +13
    -0
      src/Discord.Net.Rest/Entities/Users/UserHelper.cs
  7. +12
    -0
      src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs

+ 4
- 4
src/Discord.Net.Core/Entities/Users/GuildUserProperties.cs View File

@@ -41,16 +41,16 @@ namespace Discord
/// What roles should the user have?
/// </summary>
/// <remarks>
/// To add a role to a user: <see cref="GuildUserExtensions.AddRolesAsync(IGuildUser, IRole[])"/>
/// To remove a role from a user: <see cref="GuildUserExtensions.RemoveRolesAsync(IGuildUser, IRole[])"/>
/// To add a role to a user: <see cref="IGuildUser.AddRolesAsync(IEnumerable&lt;IRole&gt;, RequestOptions)"/>
/// To remove a role from a user: <see cref="IGuildUser.RemoveRolesAsync(IEnumerable&lt;IRole&gt;, RequestOptions)"/>
/// </remarks>
public Optional<IEnumerable<IRole>> Roles { get; set; }
/// <summary>
/// What roles should the user have?
/// </summary>
/// <remarks>
/// To add a role to a user: <see cref="GuildUserExtensions.AddRolesAsync(IGuildUser, IRole[])"/>
/// To remove a role from a user: <see cref="GuildUserExtensions.RemoveRolesAsync(IGuildUser, IRole[])"/>
/// To add a role to a user: <see cref="IGuildUser.AddRolesAsync(IEnumerable&lt;IRole&gt;, RequestOptions)"/>
/// To remove a role from a user: <see cref="IGuildUser.RemoveRolesAsync(IEnumerable&lt;IRole&gt;, RequestOptions)"/>
/// </remarks>
public Optional<IEnumerable<ulong>> RoleIds { get; set; }
/// <summary>


+ 9
- 0
src/Discord.Net.Core/Entities/Users/IGuildUser.cs View File

@@ -28,5 +28,14 @@ namespace Discord
Task KickAsync(RequestOptions options = null);
/// <summary> Modifies this user's properties in this guild. </summary>
Task ModifyAsync(Action<GuildUserProperties> func, RequestOptions options = null);

/// <summary> Adds a role to this user in this guild. </summary>
Task AddRoleAsync(IRole role, RequestOptions options = null);
/// <summary> Adds roles to this user in this guild. </summary>
Task AddRolesAsync(IEnumerable<IRole> roles, RequestOptions options = null);
/// <summary> Removes a role from this user in this guild. </summary>
Task RemoveRoleAsync(IRole role, RequestOptions options = null);
/// <summary> Removes roles from this user in this guild. </summary>
Task RemoveRolesAsync(IEnumerable<IRole> roles, RequestOptions options = null);
}
}

+ 0
- 27
src/Discord.Net.Core/Extensions/GuildUserExtensions.cs View File

@@ -1,27 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Discord
{
public static class GuildUserExtensions
{
public static Task AddRolesAsync(this IGuildUser user, params IRole[] roles)
=> ChangeRolesAsync(user, add: roles);
public static Task AddRolesAsync(this IGuildUser user, IEnumerable<IRole> roles)
=> ChangeRolesAsync(user, add: roles);
public static Task RemoveRolesAsync(this IGuildUser user, params IRole[] roles)
=> ChangeRolesAsync(user, remove: roles);
public static Task RemoveRolesAsync(this IGuildUser user, IEnumerable<IRole> roles)
=> 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);
}
}
}

+ 20
- 0
src/Discord.Net.Rest/DiscordRestApiClient.cs View File

@@ -388,6 +388,26 @@ namespace Discord.API
break;
}
}
public async Task AddRoleAsync(ulong guildId, ulong userId, ulong roleId, RequestOptions options = null)
{
Preconditions.NotEqual(guildId, 0, nameof(guildId));
Preconditions.NotEqual(userId, 0, nameof(userId));
Preconditions.NotEqual(roleId, 0, nameof(roleId));
options = RequestOptions.CreateOrClone(options);

var ids = new BucketIds(guildId: guildId);
await SendAsync("PUT", () => $"guilds/{guildId}/members/{userId}/roles/{roleId}", ids, options: options);
}
public async Task RemoveRoleAsync(ulong guildId, ulong userId, ulong roleId, RequestOptions options = null)
{
Preconditions.NotEqual(guildId, 0, nameof(guildId));
Preconditions.NotEqual(userId, 0, nameof(userId));
Preconditions.NotEqual(roleId, 0, nameof(roleId));
options = RequestOptions.CreateOrClone(options);

var ids = new BucketIds(guildId: guildId);
await SendAsync("DELETE", () => $"guilds/{guildId}/members/{userId}/roles/{roleId}", ids, options: options);
}
//Channel Messages
public async Task<Message> GetChannelMessageAsync(ulong channelId, ulong messageId, RequestOptions options = null)


+ 12
- 0
src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs View File

@@ -84,6 +84,18 @@ namespace Discord.Rest
}
public Task KickAsync(RequestOptions options = null)
=> UserHelper.KickAsync(this, Discord, options);
/// <inheritdoc />
public Task AddRoleAsync(IRole role, RequestOptions options = null)
=> AddRolesAsync(new[] { role }, options);
/// <inheritdoc />
public Task AddRolesAsync(IEnumerable<IRole> roles, RequestOptions options = null)
=> UserHelper.AddRolesAsync(this, Discord, roles, options);
/// <inheritdoc />
public Task RemoveRoleAsync(IRole role, RequestOptions options = null)
=> RemoveRolesAsync(new[] { role }, options);
/// <inheritdoc />
public Task RemoveRolesAsync(IEnumerable<IRole> roles, RequestOptions options = null)
=> UserHelper.RemoveRolesAsync(this, Discord, roles, options);

public ChannelPermissions GetPermissions(IGuildChannel channel)
{


+ 13
- 0
src/Discord.Net.Rest/Entities/Users/UserHelper.cs View File

@@ -1,5 +1,6 @@
using Discord.API.Rest;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Model = Discord.API.User;
using ImageModel = Discord.API.Image;
@@ -63,5 +64,17 @@ namespace Discord.Rest
var args = new CreateDMChannelParams(user.Id);
return RestDMChannel.Create(client, await client.ApiClient.CreateDMChannelAsync(args, options).ConfigureAwait(false));
}

public static async Task AddRolesAsync(IGuildUser user, BaseDiscordClient client, IEnumerable<IRole> roles, RequestOptions options)
{
foreach (var role in roles)
await client.ApiClient.AddRoleAsync(user.Guild.Id, user.Id, role.Id, options);
}

public static async Task RemoveRolesAsync(IGuildUser user, BaseDiscordClient client, IEnumerable<IRole> roles, RequestOptions options)
{
foreach (var role in roles)
await client.ApiClient.RemoveRoleAsync(user.Guild.Id, user.Id, role.Id, options);
}
}
}

+ 12
- 0
src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs View File

@@ -109,6 +109,18 @@ namespace Discord.WebSocket
=> UserHelper.ModifyAsync(this, Discord, func, options);
public Task KickAsync(RequestOptions options = null)
=> UserHelper.KickAsync(this, Discord, options);
/// <inheritdoc />
public Task AddRoleAsync(IRole role, RequestOptions options = null)
=> AddRolesAsync(new[] { role }, options);
/// <inheritdoc />
public Task AddRolesAsync(IEnumerable<IRole> roles, RequestOptions options = null)
=> UserHelper.AddRolesAsync(this, Discord, roles, options);
/// <inheritdoc />
public Task RemoveRoleAsync(IRole role, RequestOptions options = null)
=> RemoveRolesAsync(new[] { role }, options);
/// <inheritdoc />
public Task RemoveRolesAsync(IEnumerable<IRole> roles, RequestOptions options = null)
=> UserHelper.RemoveRolesAsync(this, Discord, roles, options);

public ChannelPermissions GetPermissions(IGuildChannel channel)
=> new ChannelPermissions(Permissions.ResolveChannel(Guild, this, channel, GuildPermissions.RawValue));


Loading…
Cancel
Save