| @@ -1,4 +1,5 @@ | |||||
| using Discord.Net; | |||||
| using Discord.Helpers; | |||||
| using Discord.Net; | |||||
| using Discord.Net.API; | using Discord.Net.API; | ||||
| using System; | using System; | ||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| @@ -423,6 +424,113 @@ namespace Discord | |||||
| return null; | return null; | ||||
| } | } | ||||
| //Roles | |||||
| /// <summary>Note: due to current API limitations, the created role cannot be returned. </summary> | |||||
| public Task CreateRole(Server server) | |||||
| => CreateRole(server?.Id); | |||||
| /// <summary>Note: due to current API limitations, the created role cannot be returned. </summary> | |||||
| 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 | //Permissions | ||||
| public Task SetChannelUserPermissions(Channel channel, User user, PackedPermissions allow, PackedPermissions deny) | public Task SetChannelUserPermissions(Channel channel, User user, PackedPermissions allow, PackedPermissions deny) | ||||
| => SetChannelPermissions(channel?.Id, user?.Id, "member", allow, deny); | => SetChannelPermissions(channel?.Id, user?.Id, "member", allow, deny); | ||||
| @@ -67,12 +67,17 @@ namespace Discord.Net.API | |||||
| => _rest.Get<Responses.GetMessages[]>(Endpoints.ChannelMessages(channelId, count)); | => _rest.Get<Responses.GetMessages[]>(Endpoints.ChannelMessages(channelId, count)); | ||||
| //Members | //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 | //Invites | ||||
| public Task<Responses.CreateInvite> CreateInvite(string channelId, int maxAge, int maxUses, bool isTemporary, bool withXkcdPass) | public Task<Responses.CreateInvite> CreateInvite(string channelId, int maxAge, int maxUses, bool isTemporary, bool withXkcdPass) | ||||
| @@ -86,7 +91,39 @@ namespace Discord.Net.API | |||||
| => _rest.Post<Responses.AcceptInvite>(Endpoints.Invite(id)); | => _rest.Post<Responses.AcceptInvite>(Endpoints.Invite(id)); | ||||
| public Task DeleteInvite(string id) | public Task DeleteInvite(string id) | ||||
| => _rest.Delete(Endpoints.Invite(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 | //Chat | ||||
| public Task<Responses.SendMessage> SendMessage(string channelId, string message, string[] mentions, string nonce) | public Task<Responses.SendMessage> 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 }; | var request = new Requests.ChangeAvatar { Avatar = $"data:{type},/9j/{base64}", CurrentEmail = currentEmail, CurrentPassword = currentPassword }; | ||||
| return _rest.Patch<Responses.ChangeProfile>(Endpoints.UserMe, request); | return _rest.Patch<Responses.ChangeProfile>(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); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -26,7 +26,9 @@ | |||||
| public static string ServerChannels(string serverId) => $"guilds/{serverId}/channels"; | public static string ServerChannels(string serverId) => $"guilds/{serverId}/channels"; | ||||
| public static string ServerMember(string serverId, string userId) => $"guilds/{serverId}/members/{userId}"; | 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 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 const string Invites = "invite"; | ||||
| public static string Invite(string inviteId) => $"invite/{inviteId}"; | public static string Invite(string inviteId) => $"invite/{inviteId}"; | ||||
| public static string InviteUrl(string inviteId) => $"https://discord.gg/{inviteId}"; | public static string InviteUrl(string inviteId) => $"https://discord.gg/{inviteId}"; | ||||
| @@ -89,6 +89,11 @@ namespace Discord.Net.API | |||||
| [JsonProperty(PropertyName = "deaf")] | [JsonProperty(PropertyName = "deaf")] | ||||
| public bool Value; | public bool Value; | ||||
| } | } | ||||
| public sealed class ModifyMember | |||||
| { | |||||
| [JsonProperty(PropertyName = "roles")] | |||||
| public string[] Roles; | |||||
| } | |||||
| //Profile | //Profile | ||||
| public sealed class ChangeUsername | public sealed class ChangeUsername | ||||
| @@ -126,6 +131,15 @@ namespace Discord.Net.API | |||||
| public string Avatar; | 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 | //Permissions | ||||
| public sealed class SetChannelPermissions | public sealed class SetChannelPermissions | ||||
| { | { | ||||