@@ -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 | ||||
{ | { | ||||