Browse Source

Added several role management functions

tags/docs-0.9
Brandon Smith 9 years ago
parent
commit
08d8d05bde
4 changed files with 170 additions and 20 deletions
  1. +109
    -1
      src/Discord.Net/DiscordClient.API.cs
  2. +44
    -18
      src/Discord.Net/Net/API/DiscordAPIClient.cs
  3. +3
    -1
      src/Discord.Net/Net/API/Endpoints.cs
  4. +14
    -0
      src/Discord.Net/Net/API/Requests.cs

+ 109
- 1
src/Discord.Net/DiscordClient.API.cs View File

@@ -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);


+ 44
- 18
src/Discord.Net/Net/API/DiscordAPIClient.cs View File

@@ -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);
}
} }
} }

+ 3
- 1
src/Discord.Net/Net/API/Endpoints.cs View File

@@ -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}";


+ 14
- 0
src/Discord.Net/Net/API/Requests.cs View File

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


Loading…
Cancel
Save