From 08d8d05bde5691b88610131c6048b16d1d2f2a1c Mon Sep 17 00:00:00 2001 From: Brandon Smith Date: Sat, 19 Sep 2015 15:57:12 -0300 Subject: [PATCH] Added several role management functions --- src/Discord.Net/DiscordClient.API.cs | 110 +++++++++++++++++++- src/Discord.Net/Net/API/DiscordAPIClient.cs | 62 +++++++---- src/Discord.Net/Net/API/Endpoints.cs | 4 +- src/Discord.Net/Net/API/Requests.cs | 14 +++ 4 files changed, 170 insertions(+), 20 deletions(-) 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 {