Browse Source

Separated Channel and Server permissions

tags/docs-0.9
RogueException 9 years ago
parent
commit
0df92b1adf
5 changed files with 64 additions and 42 deletions
  1. +12
    -12
      src/Discord.Net/DiscordClient.API.cs
  2. +4
    -4
      src/Discord.Net/Models/Channel.cs
  3. +8
    -7
      src/Discord.Net/Models/Member.cs
  4. +38
    -17
      src/Discord.Net/Models/PackedPermissions.cs
  5. +2
    -2
      src/Discord.Net/Models/Role.cs

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

@@ -444,29 +444,29 @@ namespace Discord
} }


//Permissions //Permissions
public Task SetChannelUserPermissions(Channel channel, Member member, PackedPermissions allow, PackedPermissions deny)
public Task SetChannelUserPermissions(Channel channel, Member member, PackedChannelPermissions allow, PackedChannelPermissions deny)
=> SetChannelPermissions(channel?.Id, member?.UserId, "member", allow, deny); => SetChannelPermissions(channel?.Id, member?.UserId, "member", allow, deny);
public Task SetChannelUserPermissions(string channelId, Member member, PackedPermissions allow, PackedPermissions deny)
public Task SetChannelUserPermissions(string channelId, Member member, PackedChannelPermissions allow, PackedChannelPermissions deny)
=> SetChannelPermissions(channelId, member?.UserId, "member", allow, deny); => SetChannelPermissions(channelId, member?.UserId, "member", allow, deny);
public Task SetChannelUserPermissions(Channel channel, User user, PackedPermissions allow, PackedPermissions deny)
public Task SetChannelUserPermissions(Channel channel, User user, PackedChannelPermissions allow, PackedChannelPermissions deny)
=> SetChannelPermissions(channel?.Id, user?.Id, "member", allow, deny); => SetChannelPermissions(channel?.Id, user?.Id, "member", allow, deny);
public Task SetChannelUserPermissions(string channelId, User user, PackedPermissions allow, PackedPermissions deny)
public Task SetChannelUserPermissions(string channelId, User user, PackedChannelPermissions allow, PackedChannelPermissions deny)
=> SetChannelPermissions(channelId, user?.Id, "member", allow, deny); => SetChannelPermissions(channelId, user?.Id, "member", allow, deny);
public Task SetChannelUserPermissions(Channel channel, string userId, PackedPermissions allow, PackedPermissions deny)
public Task SetChannelUserPermissions(Channel channel, string userId, PackedChannelPermissions allow, PackedChannelPermissions deny)
=> SetChannelPermissions(channel?.Id, userId, "member", allow, deny); => SetChannelPermissions(channel?.Id, userId, "member", allow, deny);
public Task SetChannelUserPermissions(string channelId, string userId, PackedPermissions allow, PackedPermissions deny)
public Task SetChannelUserPermissions(string channelId, string userId, PackedChannelPermissions allow, PackedChannelPermissions deny)
=> SetChannelPermissions(channelId, userId, "member", allow, deny); => SetChannelPermissions(channelId, userId, "member", allow, deny);


public Task SetChannelRolePermissions(Channel channel, Role role, PackedPermissions allow, PackedPermissions deny)
public Task SetChannelRolePermissions(Channel channel, Role role, PackedChannelPermissions allow, PackedChannelPermissions deny)
=> SetChannelPermissions(channel?.Id, role?.Id, "role", allow, deny); => SetChannelPermissions(channel?.Id, role?.Id, "role", allow, deny);
public Task SetChannelRolePermissions(string channelId, Role role, PackedPermissions allow, PackedPermissions deny)
public Task SetChannelRolePermissions(string channelId, Role role, PackedChannelPermissions allow, PackedChannelPermissions deny)
=> SetChannelPermissions(channelId, role?.Id, "role", allow, deny); => SetChannelPermissions(channelId, role?.Id, "role", allow, deny);
public Task SetChannelRolePermissions(Channel channel, string userId, PackedPermissions allow, PackedPermissions deny)
public Task SetChannelRolePermissions(Channel channel, string userId, PackedChannelPermissions allow, PackedChannelPermissions deny)
=> SetChannelPermissions(channel?.Id, userId, "role", allow, deny); => SetChannelPermissions(channel?.Id, userId, "role", allow, deny);
public Task SetChannelRolePermissions(string channelId, string userId, PackedPermissions allow, PackedPermissions deny)
public Task SetChannelRolePermissions(string channelId, string userId, PackedChannelPermissions allow, PackedChannelPermissions deny)
=> SetChannelPermissions(channelId, userId, "role", allow, deny); => SetChannelPermissions(channelId, userId, "role", allow, deny);


private Task SetChannelPermissions(string channelId, string userOrRoleId, string idType, PackedPermissions allow, PackedPermissions deny)
private Task SetChannelPermissions(string channelId, string userOrRoleId, string idType, PackedChannelPermissions allow, PackedChannelPermissions deny)
{ {
CheckReady(); CheckReady();
if (channelId == null) throw new NullReferenceException(nameof(channelId)); if (channelId == null) throw new NullReferenceException(nameof(channelId));
@@ -538,7 +538,7 @@ namespace Discord


public Task EditRole(Role role, string newName) public Task EditRole(Role role, string newName)
=> EditRole(role?.ServerId, role?.Id, newName); => EditRole(role?.ServerId, role?.Id, newName);
public Task EditRole(string serverId, string roleId, string name = null, PackedPermissions permissions = null)
public Task EditRole(string serverId, string roleId, string name = null, PackedServerPermissions permissions = null)
{ {
CheckReady(); CheckReady();
if (serverId == null) throw new NullReferenceException(nameof(serverId)); if (serverId == null) throw new NullReferenceException(nameof(serverId));


+ 4
- 4
src/Discord.Net/Models/Channel.cs View File

@@ -11,8 +11,8 @@ namespace Discord
{ {
public string Type { get; internal set; } public string Type { get; internal set; }
public string Id { get; internal set; } public string Id { get; internal set; }
public PackedPermissions Deny { get; internal set; }
public PackedPermissions Allow { get; internal set; }
public PackedChannelPermissions Deny { get; internal set; }
public PackedChannelPermissions Allow { get; internal set; }
} }


private readonly DiscordClient _client; private readonly DiscordClient _client;
@@ -100,8 +100,8 @@ namespace Discord
{ {
Type = x.Type, Type = x.Type,
Id = x.Id, Id = x.Id,
Deny = new PackedPermissions(true, x.Deny),
Allow = new PackedPermissions(true, x.Allow)
Deny = new PackedChannelPermissions(true, x.Deny),
Allow = new PackedChannelPermissions(true, x.Allow)
}).ToArray(); }).ToArray();
} }
else else


+ 8
- 7
src/Discord.Net/Models/Member.cs View File

@@ -9,7 +9,7 @@ namespace Discord
public class Member public class Member
{ {
private readonly DiscordClient _client; private readonly DiscordClient _client;
private ConcurrentDictionary<string, PackedPermissions> _permissions;
private ConcurrentDictionary<string, PackedChannelPermissions> _permissions;


/// <summary> Returns the name of this user on this server. </summary> /// <summary> Returns the name of this user on this server. </summary>
public string Name { get; internal set; } public string Name { get; internal set; }
@@ -67,7 +67,7 @@ namespace Discord
UserId = userId; UserId = userId;
ServerId = serverId; ServerId = serverId;
Status = UserStatus.Offline; Status = UserStatus.Offline;
_permissions = new ConcurrentDictionary<string, PackedPermissions>();
_permissions = new ConcurrentDictionary<string, PackedChannelPermissions>();
} }


public override string ToString() => UserId; public override string ToString() => UserId;
@@ -137,12 +137,12 @@ namespace Discord


internal void AddChannel(string channelId) internal void AddChannel(string channelId)
{ {
_permissions.TryAdd(channelId, new PackedPermissions());
_permissions.TryAdd(channelId, new PackedChannelPermissions());
UpdatePermissions(channelId); UpdatePermissions(channelId);
} }
internal bool RemoveChannel(string channelId) internal bool RemoveChannel(string channelId)
{ {
PackedPermissions ignored;
PackedChannelPermissions ignored;
return _permissions.TryRemove(channelId, out ignored); return _permissions.TryRemove(channelId, out ignored);
} }
internal void UpdatePermissions() internal void UpdatePermissions()
@@ -161,7 +161,7 @@ namespace Discord
var serverOverwrites = channel.PermissionOverwrites; var serverOverwrites = channel.PermissionOverwrites;
var channelOverwrites = channel.PermissionOverwrites; var channelOverwrites = channel.PermissionOverwrites;


PackedPermissions permissions;
PackedChannelPermissions permissions;
if (!_permissions.TryGetValue(channelId, out permissions)) return; if (!_permissions.TryGetValue(channelId, out permissions)) return;
uint newPermissions = 0x0; uint newPermissions = 0x0;


@@ -182,9 +182,10 @@ namespace Discord
channel._areMembersStale = true; channel._areMembersStale = true;
} }
} }
public PackedPermissions GetPermissions(string channelId)
//TODO: Add GetServerPermissions
public PackedChannelPermissions GetPermissions(string channelId)
{ {
PackedPermissions perms;
PackedChannelPermissions perms;
if (_permissions.TryGetValue(channelId, out perms)) if (_permissions.TryGetValue(channelId, out perms))
return perms; return perms;
return null; return null;


+ 38
- 17
src/Discord.Net/Models/PackedPermissions.cs View File

@@ -2,31 +2,54 @@


namespace Discord namespace Discord
{ {
public sealed class PackedPermissions
public sealed class PackedServerPermissions : PackedPermissions
{ {
private bool _isLocked;
private uint _rawValue;
public uint RawValue { get { return _rawValue; } internal set { _rawValue = value; } } //Internal set bypasses isLocked for API changes.

public PackedPermissions() { _isLocked = false; }
internal PackedPermissions(bool isLocked) { _isLocked = isLocked; }
internal PackedPermissions(bool isLocked, uint rawValue) { _isLocked = isLocked; _rawValue = rawValue; }
public PackedServerPermissions() : base(false, 0) { }
internal PackedServerPermissions(bool isLocked, uint rawValue) : base(isLocked, rawValue) { }


/// <summary> If True, a user may create invites. </summary>
public bool General_CreateInstantInvite { get { return GetBit(1); } set { SetBit(1, value); } }
/// <summary> If True, a user may ban users from the server. </summary> /// <summary> If True, a user may ban users from the server. </summary>
public bool General_BanMembers { get { return GetBit(2); } set { SetBit(2, value); } } public bool General_BanMembers { get { return GetBit(2); } set { SetBit(2, value); } }
/// <summary> If True, a user may kick users from the server. </summary> /// <summary> If True, a user may kick users from the server. </summary>
public bool General_KickMembers { get { return GetBit(3); } set { SetBit(3, value); } } public bool General_KickMembers { get { return GetBit(3); } set { SetBit(3, value); } }
/// <summary> (Server Roles only) If True, a user may adjust roles. This also implictly grants all other permissions. </summary>
/// <summary> If True, a user may adjust roles. This also implictly grants all other permissions. </summary>
public bool General_ManageRoles { get { return GetBit(4); } set { SetBit(4, value); } } public bool General_ManageRoles { get { return GetBit(4); } set { SetBit(4, value); } }
/// <summary> (Channels only) If True, a user may adjust permissions. This also implictly grants all other permissions. </summary>
public bool General_ManagePermissions { get { return GetBit(4); } set { SetBit(4, value); } }
/// <summary> If True, a user may create, delete and modify channels. </summary> /// <summary> If True, a user may create, delete and modify channels. </summary>
public bool General_ManageChannels { get { return GetBit(5); } set { SetBit(5, value); } } public bool General_ManageChannels { get { return GetBit(5); } set { SetBit(5, value); } }
/// <summary> If True, a user may adjust server properties. </summary> /// <summary> If True, a user may adjust server properties. </summary>
public bool General_ManageServer { get { return GetBit(6); } set { SetBit(6, value); } } public bool General_ManageServer { get { return GetBit(6); } set { SetBit(6, value); } }


public PackedServerPermissions Copy() => new PackedServerPermissions(false, _rawValue);
}

public sealed class PackedChannelPermissions : PackedPermissions
{
public PackedChannelPermissions() : base(false, 0) { }
internal PackedChannelPermissions(bool isLocked, uint rawValue) : base(isLocked, rawValue) { }
/// <summary> If True, a user may adjust permissions. This also implictly grants all other permissions. </summary>
public bool General_ManagePermissions { get { return GetBit(4); } set { SetBit(4, value); } }
/// <summary> If True, a user may create, delete and modify this channel. </summary>
public bool General_ManageChannel { get { return GetBit(5); } set { SetBit(5, value); } }

public PackedChannelPermissions Copy() => new PackedChannelPermissions(false, _rawValue);
}

public abstract class PackedPermissions
{
private bool _isLocked;
protected uint _rawValue;
public uint RawValue { get { return _rawValue; } internal set { _rawValue = value; } } //Internal set bypasses isLocked for API changes.
protected PackedPermissions(bool isLocked, uint rawValue) { _isLocked = isLocked; _rawValue = rawValue; }

/// <summary> If True, a user may create invites. </summary>
public bool General_CreateInstantInvite { get { return GetBit(1); } set { SetBit(1, value); } }
//Bit 2 = BanMembers/???
//Bit 3 = KickMembers/???
//Bit 4 = ManageRoles/ManagePermissions
//Bit 5 = ManageChannels/ManageChannel
//Bit 6 = ManageServer/???

//4 Unused //4 Unused


/// <summary> If True, a user may join channels. </summary> /// <summary> If True, a user may join channels. </summary>
@@ -63,8 +86,8 @@ namespace Discord


//6 Unused //6 Unused


private bool GetBit(int pos) => ((_rawValue >> (pos - 1)) & 1U) == 1;
private void SetBit(int pos, bool value)
protected bool GetBit(int pos) => ((_rawValue >> (pos - 1)) & 1U) == 1;
protected void SetBit(int pos, bool value)
{ {
if (_isLocked) if (_isLocked)
throw new InvalidOperationException("Unable to edit cached permissions directly, use Copy() to make an editable copy."); throw new InvalidOperationException("Unable to edit cached permissions directly, use Copy() to make an editable copy.");
@@ -73,7 +96,5 @@ namespace Discord
else else
_rawValue &= ~(1U << (pos - 1)); _rawValue &= ~(1U << (pos - 1));
} }
public PackedPermissions Copy() => new PackedPermissions(false, _rawValue);
} }
} }

+ 2
- 2
src/Discord.Net/Models/Role.cs View File

@@ -14,7 +14,7 @@ namespace Discord
public string Name { get; internal set; } public string Name { get; internal set; }


/// <summary> Returns the the permissions contained by this role. </summary> /// <summary> Returns the the permissions contained by this role. </summary>
public PackedPermissions Permissions { get; }
public PackedServerPermissions Permissions { get; }


/// <summary> Returns the id of the server this role is a member of. </summary> /// <summary> Returns the id of the server this role is a member of. </summary>
public string ServerId { get; } public string ServerId { get; }
@@ -34,7 +34,7 @@ namespace Discord
_client = client; _client = client;
Id = id; Id = id;
ServerId = serverId; ServerId = serverId;
Permissions = new PackedPermissions(true);
Permissions = new PackedServerPermissions(true, 0);
IsEveryone = isEveryone; IsEveryone = isEveryone;
} }




Loading…
Cancel
Save