@@ -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 | |||
/// <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 | |||
public Task SetChannelUserPermissions(Channel channel, User user, PackedPermissions allow, PackedPermissions 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)); | |||
//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<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)); | |||
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<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 }; | |||
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 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}"; | |||
@@ -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 | |||
{ | |||