diff --git a/src/Discord.Net/DiscordClient.API.cs b/src/Discord.Net/DiscordClient.API.cs
index bcb9ead2b..c44dcfe69 100644
--- a/src/Discord.Net/DiscordClient.API.cs
+++ b/src/Discord.Net/DiscordClient.API.cs
@@ -1,4 +1,5 @@
-using Discord.Net;
+using Discord.Helpers;
+using Discord.Net;
using Discord.Net.API;
using System;
using System.Collections.Generic;
@@ -423,6 +424,113 @@ namespace Discord
return null;
}
+ //Roles
+ /// Note: due to current API limitations, the created role cannot be returned.
+ public Task CreateRole(Server server)
+ => CreateRole(server?.Id);
+ /// Note: due to current API limitations, the created role cannot be returned.
+ public Task CreateRole(string serverId)
+ {
+ CheckReady();
+ if (serverId == null) throw new NullReferenceException(nameof(serverId));
+
+ return _api.CreateRole(serverId);
+ }
+
+ public Task RenameRole(Role role, string newName)
+ => RenameRole(role?.ServerId, role?.Id, newName);
+ public Task RenameRole(string serverId, string roleId, string newName)
+ {
+ CheckReady();
+ if (roleId == null) throw new NullReferenceException(nameof(roleId));
+ if (newName == null) throw new NullReferenceException(nameof(newName));
+
+ return _api.RenameRole(serverId, roleId, newName);
+ }
+
+ public Task DeleteRole(Role role)
+ => DeleteRole(role?.ServerId, role?.Id);
+ public Task DeleteRole(string serverId, string roleId)
+ {
+ CheckReady();
+ if (roleId == null) throw new NullReferenceException(nameof(roleId));
+
+ return _api.DeleteRole(serverId, roleId);
+ }
+
+ public Task AddRoleMember(Role role, string serverId, string userId)
+ => AddRoleMember(role?.Id, GetMember(serverId, userId));
+ public Task AddRoleMember(Role role, string serverId, User user)
+ => AddRoleMember(role?.Id, GetMember(serverId, user));
+ public Task AddRoleMember(Role role, Server server, string userId)
+ => AddRoleMember(role?.Id, GetMember(server, userId));
+ public Task AddRoleMember(Role role, Server server, User user)
+ => AddRoleMember(role?.Id, GetMember(server, user));
+ public Task AddRoleMember(Role role, Member member)
+ => AddRoleMember(role?.Id, member);
+ public Task AddRoleMember(string roleId, string serverId, string userId)
+ => AddRoleMember(roleId, GetMember(serverId, userId));
+ public Task AddRoleMember(string roleId, string serverId, User user)
+ => AddRoleMember(roleId, GetMember(serverId, user));
+ public Task AddRoleMember(string roleId, Server server, string userId)
+ => AddRoleMember(roleId, GetMember(server, userId));
+ public Task AddRoleMember(string roleId, Server server, User user)
+ => AddRoleMember(roleId, GetMember(server, user));
+ public Task AddRoleMember(string roleId, Member member)
+ {
+ CheckReady();
+ if (roleId == null) throw new NullReferenceException(nameof(roleId));
+ if (member == null) throw new NullReferenceException(nameof(member));
+
+ if (!member.RoleIds.Contains(roleId))
+ {
+ var oldRoles = member.RoleIds;
+ string[] newRoles = new string[oldRoles.Length + 1];
+ for (int i = 0; i < oldRoles.Length; i++)
+ newRoles[i] = oldRoles[i];
+ return _api.SetMemberRoles(member.ServerId, member.UserId, newRoles);
+ }
+ return TaskHelper.CompletedTask;
+ }
+
+ public Task RemoveRoleMember(Role role, string serverId, string userId)
+ => RemoveRoleMember(role?.Id, GetMember(serverId, userId));
+ public Task RemoveRoleMember(Role role, string serverId, User user)
+ => RemoveRoleMember(role?.Id, GetMember(serverId, user));
+ public Task RemoveRoleMember(Role role, Server server, string userId)
+ => RemoveRoleMember(role?.Id, GetMember(server, userId));
+ public Task RemoveRoleMember(Role role, Server server, User user)
+ => RemoveRoleMember(role?.Id, GetMember(server, user));
+ public Task RemoveRoleMember(Role role, Member member)
+ => RemoveRoleMember(role?.Id, member);
+ public Task RemoveRoleMember(string roleId, string serverId, string userId)
+ => RemoveRoleMember(roleId, GetMember(serverId, userId));
+ public Task RemoveRoleMember(string roleId, string serverId, User user)
+ => RemoveRoleMember(roleId, GetMember(serverId, user));
+ public Task RemoveRoleMember(string roleId, Server server, string userId)
+ => RemoveRoleMember(roleId, GetMember(server, userId));
+ public Task RemoveRoleMember(string roleId, Server server, User user)
+ => RemoveRoleMember(roleId, GetMember(server, user));
+ public Task RemoveRoleMember(string roleId, Member member)
+ {
+ CheckReady();
+ if (roleId == null) throw new NullReferenceException(nameof(roleId));
+ if (member == null) throw new NullReferenceException(nameof(member));
+
+ if (member.RoleIds.Contains(roleId))
+ {
+ var oldRoles = member.RoleIds;
+ string[] newRoles = new string[oldRoles.Length - 1];
+ for (int i = 0, j = 0; i < oldRoles.Length; i++)
+ {
+ if (oldRoles[i] != roleId)
+ newRoles[j++] = oldRoles[i];
+ }
+ return _api.SetMemberRoles(member.ServerId, member.UserId, newRoles);
+ }
+ return TaskHelper.CompletedTask;
+ }
+
//Permissions
public Task SetChannelUserPermissions(Channel channel, User user, PackedPermissions allow, PackedPermissions deny)
=> SetChannelPermissions(channel?.Id, user?.Id, "member", allow, deny);
diff --git a/src/Discord.Net/Net/API/DiscordAPIClient.cs b/src/Discord.Net/Net/API/DiscordAPIClient.cs
index 63991c872..280862564 100644
--- a/src/Discord.Net/Net/API/DiscordAPIClient.cs
+++ b/src/Discord.Net/Net/API/DiscordAPIClient.cs
@@ -67,12 +67,17 @@ namespace Discord.Net.API
=> _rest.Get(Endpoints.ChannelMessages(channelId, count));
//Members
- public Task Kick(string serverId, string memberId)
- => _rest.Delete(Endpoints.ServerMember(serverId, memberId));
- public Task Ban(string serverId, string memberId)
- => _rest.Put(Endpoints.ServerBan(serverId, memberId));
- public Task Unban(string serverId, string memberId)
- => _rest.Delete(Endpoints.ServerBan(serverId, memberId));
+ public Task Kick(string serverId, string userId)
+ => _rest.Delete(Endpoints.ServerMember(serverId, userId));
+ public Task Ban(string serverId, string userId)
+ => _rest.Put(Endpoints.ServerBan(serverId, userId));
+ public Task Unban(string serverId, string userId)
+ => _rest.Delete(Endpoints.ServerBan(serverId, userId));
+ public Task SetMemberRoles(string serverId, string userId, string[] roles)
+ {
+ var request = new Requests.ModifyMember { Roles = roles };
+ return _rest.Patch(Endpoints.ServerMember(serverId, userId));
+ }
//Invites
public Task CreateInvite(string channelId, int maxAge, int maxUses, bool isTemporary, bool withXkcdPass)
@@ -86,7 +91,39 @@ namespace Discord.Net.API
=> _rest.Post(Endpoints.Invite(id));
public Task DeleteInvite(string id)
=> _rest.Delete(Endpoints.Invite(id));
-
+
+ //Roles
+ public Task CreateRole(string serverId)
+ {
+ //TODO: Return a result when Discord starts giving us one
+ return _rest.Post(Endpoints.ServerRoles(serverId));
+ }
+ public Task RenameRole(string serverId, string roleId, string newName)
+ {
+ var request = new Requests.ModifyRole { Name = newName };
+ return _rest.Patch(Endpoints.ServerRole(serverId, roleId), request);
+ }
+ public Task SetRolePermissions(string serverId, string roleId, PackedPermissions permissions)
+ {
+ var request = new Requests.ModifyRole { Permissions = permissions.RawValue };
+ return _rest.Patch(Endpoints.ServerRole(serverId, roleId), request);
+ }
+ public Task DeleteRole(string serverId, string roleId)
+ {
+ return _rest.Delete(Endpoints.ServerRole(serverId, roleId));
+ }
+
+ //Permissions
+ public Task SetChannelPermissions(string channelId, string userOrRoleId, string idType, PackedPermissions allow, PackedPermissions deny)
+ {
+ var request = new Requests.SetChannelPermissions { Id = userOrRoleId, Type = idType, Allow = allow.RawValue, Deny = deny.RawValue };
+ return _rest.Put(Endpoints.ChannelPermission(channelId, userOrRoleId), request);
+ }
+ public Task DeleteChannelPermissions(string channelId, string userOrRoleId)
+ {
+ return _rest.Delete(Endpoints.ChannelPermission(channelId, userOrRoleId), null);
+ }
+
//Chat
public Task SendMessage(string channelId, string message, string[] mentions, string nonce)
{
@@ -154,16 +191,5 @@ namespace Discord.Net.API
var request = new Requests.ChangeAvatar { Avatar = $"data:{type},/9j/{base64}", CurrentEmail = currentEmail, CurrentPassword = currentPassword };
return _rest.Patch(Endpoints.UserMe, request);
}
-
- //Permissions
- public Task SetChannelPermissions(string channelId, string userOrRoleId, string idType, PackedPermissions allow, PackedPermissions deny)
- {
- var request = new Requests.SetChannelPermissions { Id = userOrRoleId, Type = idType, Allow = allow.RawValue, Deny = deny.RawValue };
- return _rest.Put(Endpoints.ChannelPermission(channelId, userOrRoleId), request);
- }
- public Task DeleteChannelPermissions(string channelId, string userOrRoleId)
- {
- return _rest.Delete(Endpoints.ChannelPermission(channelId, userOrRoleId), null);
- }
}
}
diff --git a/src/Discord.Net/Net/API/Endpoints.cs b/src/Discord.Net/Net/API/Endpoints.cs
index 1861d0fbf..36306af68 100644
--- a/src/Discord.Net/Net/API/Endpoints.cs
+++ b/src/Discord.Net/Net/API/Endpoints.cs
@@ -26,7 +26,9 @@
public static string ServerChannels(string serverId) => $"guilds/{serverId}/channels";
public static string ServerMember(string serverId, string userId) => $"guilds/{serverId}/members/{userId}";
public static string ServerBan(string serverId, string userId) => $"guilds/{serverId}/bans/{userId}";
-
+ public static string ServerRoles(string serverId) => $"guilds/{serverId}/roles";
+ public static string ServerRole(string serverId, string roleId) => $"guilds/{serverId}/roles/{roleId}";
+
public const string Invites = "invite";
public static string Invite(string inviteId) => $"invite/{inviteId}";
public static string InviteUrl(string inviteId) => $"https://discord.gg/{inviteId}";
diff --git a/src/Discord.Net/Net/API/Requests.cs b/src/Discord.Net/Net/API/Requests.cs
index a9f75bfa1..616ea7e70 100644
--- a/src/Discord.Net/Net/API/Requests.cs
+++ b/src/Discord.Net/Net/API/Requests.cs
@@ -89,6 +89,11 @@ namespace Discord.Net.API
[JsonProperty(PropertyName = "deaf")]
public bool Value;
}
+ public sealed class ModifyMember
+ {
+ [JsonProperty(PropertyName = "roles")]
+ public string[] Roles;
+ }
//Profile
public sealed class ChangeUsername
@@ -126,6 +131,15 @@ namespace Discord.Net.API
public string Avatar;
}
+ //Roles
+ public sealed class ModifyRole
+ {
+ [JsonProperty(PropertyName = "name", NullValueHandling = NullValueHandling.Ignore)]
+ public string Name;
+ [JsonProperty(PropertyName = "permissions", NullValueHandling = NullValueHandling.Ignore)]
+ public uint Permissions;
+ }
+
//Permissions
public sealed class SetChannelPermissions
{