Browse Source

Initial commit of changes. Changed permissions from bitwise index to use bitwise flags instead. Modified relevant methods involved

pull/743/head
Chris Johnston 7 years ago
parent
commit
493877a5aa
7 changed files with 263 additions and 271 deletions
  1. +22
    -33
      src/Discord.Net.Core/Entities/Permissions/ChannelPermission.cs
  2. +44
    -44
      src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs
  3. +29
    -35
      src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs
  4. +75
    -67
      src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs
  5. +50
    -49
      src/Discord.Net.Core/Entities/Permissions/OverwritePermissions.cs
  6. +41
    -41
      src/Discord.Net.Core/Utils/Permissions.cs
  7. +2
    -2
      src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs

+ 22
- 33
src/Discord.Net.Core/Entities/Permissions/ChannelPermission.cs View File

@@ -1,40 +1,29 @@
namespace Discord namespace Discord
{ {
public enum ChannelPermission : byte
public enum ChannelPermission : ulong
{ {
//General
CreateInstantInvite = 0,
//KickMembers = 1,
//BanMembers = 2,
//Administrator = 3,
ManageChannel = 4,
//ManageGuild = 5,
CREATE_INSTANT_INVITE = 0x00000001,
MANAGE_CHANNELS = 0x00000010,
ADD_REACTIONS = 0x00000040,
READ_MESSAGES = 0x00000400,
SEND_MESSAGES = 0x00000800,
SEND_TTS_MESSAGES = 0x00001000,
MANAGE_MESSAGES = 0x00002000,
EMBED_LINKS = 0x00004000,
ATTACH_FILES = 0x00008000,
READ_MESSAGE_HISTORY = 0x00010000,
MENTION_EVERYONE = 0x00020000,
USE_EXTERNAL_EMOJIS = 0x00040000,


//Text
AddReactions = 6,
ReadMessages = 10,
SendMessages = 11,
SendTTSMessages = 12,
ManageMessages = 13,
EmbedLinks = 14,
AttachFiles = 15,
ReadMessageHistory = 16,
MentionEveryone = 17,
UseExternalEmojis = 18,
CONNECT = 0x00100000,
SPEAK = 0x00200000,
MUTE_MEMBERS = 0x00400000,
DEAFEN_MEMBERS = 0x00800000,
MOVE_MEMBERS = 0x01000000,
USE_VAD = 0x02000000,


//Voice
Connect = 20,
Speak = 21,
MuteMembers = 22,
DeafenMembers = 23,
MoveMembers = 24,
UseVAD = 25,

//General2
//ChangeNickname = 26,
//ManageNicknames = 27,
ManagePermissions = 28,
ManageWebhooks = 29,
//ManageEmojis = 30
MANAGE_ROLES = 0x10000000,
MANAGE_WEBHOOKS = 0x20000000,
} }
} }

+ 44
- 44
src/Discord.Net.Core/Entities/Permissions/ChannelPermissions.cs View File

@@ -34,48 +34,48 @@ namespace Discord
public ulong RawValue { get; } public ulong RawValue { get; }


/// <summary> If True, a user may create invites. </summary> /// <summary> If True, a user may create invites. </summary>
public bool CreateInstantInvite => Permissions.GetValue(RawValue, ChannelPermission.CreateInstantInvite);
public bool CreateInstantInvite => Permissions.GetValue(RawValue, ChannelPermission.CREATE_INSTANT_INVITE);
/// <summary> If True, a user may create, delete and modify this channel. </summary> /// <summary> If True, a user may create, delete and modify this channel. </summary>
public bool ManageChannel => Permissions.GetValue(RawValue, ChannelPermission.ManageChannel);
public bool ManageChannel => Permissions.GetValue(RawValue, ChannelPermission.MANAGE_CHANNELS);


/// <summary> If true, a user may add reactions. </summary> /// <summary> If true, a user may add reactions. </summary>
public bool AddReactions => Permissions.GetValue(RawValue, ChannelPermission.AddReactions);
public bool AddReactions => Permissions.GetValue(RawValue, ChannelPermission.ADD_REACTIONS);
/// <summary> If True, a user may join channels. </summary> /// <summary> If True, a user may join channels. </summary>
public bool ReadMessages => Permissions.GetValue(RawValue, ChannelPermission.ReadMessages);
public bool ReadMessages => Permissions.GetValue(RawValue, ChannelPermission.READ_MESSAGES);
/// <summary> If True, a user may send messages. </summary> /// <summary> If True, a user may send messages. </summary>
public bool SendMessages => Permissions.GetValue(RawValue, ChannelPermission.SendMessages);
public bool SendMessages => Permissions.GetValue(RawValue, ChannelPermission.SEND_MESSAGES);
/// <summary> If True, a user may send text-to-speech messages. </summary> /// <summary> If True, a user may send text-to-speech messages. </summary>
public bool SendTTSMessages => Permissions.GetValue(RawValue, ChannelPermission.SendTTSMessages);
public bool SendTTSMessages => Permissions.GetValue(RawValue, ChannelPermission.SEND_TTS_MESSAGES);
/// <summary> If True, a user may delete messages. </summary> /// <summary> If True, a user may delete messages. </summary>
public bool ManageMessages => Permissions.GetValue(RawValue, ChannelPermission.ManageMessages);
public bool ManageMessages => Permissions.GetValue(RawValue, ChannelPermission.MANAGE_MESSAGES);
/// <summary> If True, Discord will auto-embed links sent by this user. </summary> /// <summary> If True, Discord will auto-embed links sent by this user. </summary>
public bool EmbedLinks => Permissions.GetValue(RawValue, ChannelPermission.EmbedLinks);
public bool EmbedLinks => Permissions.GetValue(RawValue, ChannelPermission.EMBED_LINKS);
/// <summary> If True, a user may send files. </summary> /// <summary> If True, a user may send files. </summary>
public bool AttachFiles => Permissions.GetValue(RawValue, ChannelPermission.AttachFiles);
public bool AttachFiles => Permissions.GetValue(RawValue, ChannelPermission.ATTACH_FILES);
/// <summary> If True, a user may read previous messages. </summary> /// <summary> If True, a user may read previous messages. </summary>
public bool ReadMessageHistory => Permissions.GetValue(RawValue, ChannelPermission.ReadMessageHistory);
public bool ReadMessageHistory => Permissions.GetValue(RawValue, ChannelPermission.READ_MESSAGE_HISTORY);
/// <summary> If True, a user may mention @everyone. </summary> /// <summary> If True, a user may mention @everyone. </summary>
public bool MentionEveryone => Permissions.GetValue(RawValue, ChannelPermission.MentionEveryone);
public bool MentionEveryone => Permissions.GetValue(RawValue, ChannelPermission.MENTION_EVERYONE);
/// <summary> If True, a user may use custom emoji from other guilds. </summary> /// <summary> If True, a user may use custom emoji from other guilds. </summary>
public bool UseExternalEmojis => Permissions.GetValue(RawValue, ChannelPermission.UseExternalEmojis);
public bool UseExternalEmojis => Permissions.GetValue(RawValue, ChannelPermission.USE_EXTERNAL_EMOJIS);


/// <summary> If True, a user may connect to a voice channel. </summary> /// <summary> If True, a user may connect to a voice channel. </summary>
public bool Connect => Permissions.GetValue(RawValue, ChannelPermission.Connect);
public bool Connect => Permissions.GetValue(RawValue, ChannelPermission.CONNECT);
/// <summary> If True, a user may speak in a voice channel. </summary> /// <summary> If True, a user may speak in a voice channel. </summary>
public bool Speak => Permissions.GetValue(RawValue, ChannelPermission.Speak);
public bool Speak => Permissions.GetValue(RawValue, ChannelPermission.SPEAK);
/// <summary> If True, a user may mute users. </summary> /// <summary> If True, a user may mute users. </summary>
public bool MuteMembers => Permissions.GetValue(RawValue, ChannelPermission.MuteMembers);
public bool MuteMembers => Permissions.GetValue(RawValue, ChannelPermission.MUTE_MEMBERS);
/// <summary> If True, a user may deafen users. </summary> /// <summary> If True, a user may deafen users. </summary>
public bool DeafenMembers => Permissions.GetValue(RawValue, ChannelPermission.DeafenMembers);
public bool DeafenMembers => Permissions.GetValue(RawValue, ChannelPermission.DEAFEN_MEMBERS);
/// <summary> If True, a user may move other users between voice channels. </summary> /// <summary> If True, a user may move other users between voice channels. </summary>
public bool MoveMembers => Permissions.GetValue(RawValue, ChannelPermission.MoveMembers);
public bool MoveMembers => Permissions.GetValue(RawValue, ChannelPermission.MOVE_MEMBERS);
/// <summary> If True, a user may use voice-activity-detection rather than push-to-talk. </summary> /// <summary> If True, a user may use voice-activity-detection rather than push-to-talk. </summary>
public bool UseVAD => Permissions.GetValue(RawValue, ChannelPermission.UseVAD);
public bool UseVAD => Permissions.GetValue(RawValue, ChannelPermission.USE_VAD);


/// <summary> If True, a user may adjust permissions. This also implictly grants all other permissions. </summary> /// <summary> If True, a user may adjust permissions. This also implictly grants all other permissions. </summary>
public bool ManagePermissions => Permissions.GetValue(RawValue, ChannelPermission.ManagePermissions);
public bool ManagePermissions => Permissions.GetValue(RawValue, ChannelPermission.MANAGE_ROLES);
/// <summary> If True, a user may edit the webhooks for this channel. </summary> /// <summary> If True, a user may edit the webhooks for this channel. </summary>
public bool ManageWebhooks => Permissions.GetValue(RawValue, ChannelPermission.ManageWebhooks);
public bool ManageWebhooks => Permissions.GetValue(RawValue, ChannelPermission.MANAGE_WEBHOOKS);


/// <summary> Creates a new ChannelPermissions with the provided packed value. </summary> /// <summary> Creates a new ChannelPermissions with the provided packed value. </summary>
public ChannelPermissions(ulong rawValue) { RawValue = rawValue; } public ChannelPermissions(ulong rawValue) { RawValue = rawValue; }
@@ -89,26 +89,26 @@ namespace Discord
{ {
ulong value = initialValue; ulong value = initialValue;


Permissions.SetValue(ref value, createInstantInvite, ChannelPermission.CreateInstantInvite);
Permissions.SetValue(ref value, manageChannel, ChannelPermission.ManageChannel);
Permissions.SetValue(ref value, addReactions, ChannelPermission.AddReactions);
Permissions.SetValue(ref value, readMessages, ChannelPermission.ReadMessages);
Permissions.SetValue(ref value, sendMessages, ChannelPermission.SendMessages);
Permissions.SetValue(ref value, sendTTSMessages, ChannelPermission.SendTTSMessages);
Permissions.SetValue(ref value, manageMessages, ChannelPermission.ManageMessages);
Permissions.SetValue(ref value, embedLinks, ChannelPermission.EmbedLinks);
Permissions.SetValue(ref value, attachFiles, ChannelPermission.AttachFiles);
Permissions.SetValue(ref value, readMessageHistory, ChannelPermission.ReadMessageHistory);
Permissions.SetValue(ref value, mentionEveryone, ChannelPermission.MentionEveryone);
Permissions.SetValue(ref value, useExternalEmojis, ChannelPermission.UseExternalEmojis);
Permissions.SetValue(ref value, connect, ChannelPermission.Connect);
Permissions.SetValue(ref value, speak, ChannelPermission.Speak);
Permissions.SetValue(ref value, muteMembers, ChannelPermission.MuteMembers);
Permissions.SetValue(ref value, deafenMembers, ChannelPermission.DeafenMembers);
Permissions.SetValue(ref value, moveMembers, ChannelPermission.MoveMembers);
Permissions.SetValue(ref value, useVoiceActivation, ChannelPermission.UseVAD);
Permissions.SetValue(ref value, managePermissions, ChannelPermission.ManagePermissions);
Permissions.SetValue(ref value, manageWebhooks, ChannelPermission.ManageWebhooks);
Permissions.SetValue(ref value, createInstantInvite, ChannelPermission.CREATE_INSTANT_INVITE);
Permissions.SetValue(ref value, manageChannel, ChannelPermission.MANAGE_CHANNELS);
Permissions.SetValue(ref value, addReactions, ChannelPermission.ADD_REACTIONS);
Permissions.SetValue(ref value, readMessages, ChannelPermission.READ_MESSAGES);
Permissions.SetValue(ref value, sendMessages, ChannelPermission.SEND_MESSAGES);
Permissions.SetValue(ref value, sendTTSMessages, ChannelPermission.SEND_TTS_MESSAGES);
Permissions.SetValue(ref value, manageMessages, ChannelPermission.MANAGE_MESSAGES);
Permissions.SetValue(ref value, embedLinks, ChannelPermission.EMBED_LINKS);
Permissions.SetValue(ref value, attachFiles, ChannelPermission.ATTACH_FILES);
Permissions.SetValue(ref value, readMessageHistory, ChannelPermission.READ_MESSAGE_HISTORY);
Permissions.SetValue(ref value, mentionEveryone, ChannelPermission.MENTION_EVERYONE);
Permissions.SetValue(ref value, useExternalEmojis, ChannelPermission.USE_EXTERNAL_EMOJIS);
Permissions.SetValue(ref value, connect, ChannelPermission.CONNECT);
Permissions.SetValue(ref value, speak, ChannelPermission.SPEAK);
Permissions.SetValue(ref value, muteMembers, ChannelPermission.MUTE_MEMBERS);
Permissions.SetValue(ref value, deafenMembers, ChannelPermission.DEAFEN_MEMBERS);
Permissions.SetValue(ref value, moveMembers, ChannelPermission.MOVE_MEMBERS);
Permissions.SetValue(ref value, useVoiceActivation, ChannelPermission.USE_VAD);
Permissions.SetValue(ref value, managePermissions, ChannelPermission.MANAGE_ROLES);
Permissions.SetValue(ref value, manageWebhooks, ChannelPermission.MANAGE_WEBHOOKS);


RawValue = value; RawValue = value;
} }
@@ -141,11 +141,11 @@ namespace Discord
public List<ChannelPermission> ToList() public List<ChannelPermission> ToList()
{ {
var perms = new List<ChannelPermission>(); var perms = new List<ChannelPermission>();
ulong x = 1;
for (byte i = 0; i < Permissions.MaxBits; i++, x <<= 1)
for (byte i = 0; i < Permissions.MaxBits; i++)
{ {
if ((RawValue & x) != 0)
perms.Add((ChannelPermission)i);
ulong flag = (ulong)Math.Pow(2, i);
if ((RawValue & flag) != 0)
perms.Add((ChannelPermission)flag);
} }
return perms; return perms;
} }


+ 29
- 35
src/Discord.Net.Core/Entities/Permissions/GuildPermission.cs View File

@@ -1,40 +1,34 @@
namespace Discord namespace Discord
{ {
public enum GuildPermission : byte
public enum GuildPermission : ulong
{ {
//General
CreateInstantInvite = 0,
KickMembers = 1,
BanMembers = 2,
Administrator = 3,
ManageChannels = 4,
ManageGuild = 5,

//Text
AddReactions = 6,
ReadMessages = 10,
SendMessages = 11,
SendTTSMessages = 12,
ManageMessages = 13,
EmbedLinks = 14,
AttachFiles = 15,
ReadMessageHistory = 16,
MentionEveryone = 17,
UseExternalEmojis = 18,

//Voice
Connect = 20,
Speak = 21,
MuteMembers = 22,
DeafenMembers = 23,
MoveMembers = 24,
UseVAD = 25,

//General2
ChangeNickname = 26,
ManageNicknames = 27,
ManageRoles = 28,
ManageWebhooks = 29,
ManageEmojis = 30
CREATE_INSTANT_INVITE = 0x00000001,
KICK_MEMBERS = 0x00000002,
BAN_MEMBERS = 0x00000004,
ADMINISTRATOR = 0x00000008,
MANAGE_CHANNELS = 0x00000010,
MANAGE_GUILD = 0x00000020,
ADD_REACTIONS = 0x00000040,
VIEW_AUDIT_LOG = 0x00000080,
READ_MESSAGES = 0x00000400,
SEND_MESSAGES = 0x00000800,
SEND_TTS_MESSAGES = 0x00001000,
MANAGE_MESSAGES = 0x00002000,
EMBED_LINKS = 0x00004000,
ATTACH_FILES = 0x00008000,
READ_MESSAGE_HISTORY = 0x00010000,
MENTION_EVERYONE = 0x00020000,
USE_EXTERNAL_EMOJIS = 0x00040000,
CONNECT = 0x00100000,
SPEAK = 0x00200000,
MUTE_MEMBERS = 0x00400000,
DEAFEN_MEMBERS = 0x00800000,
MOVE_MEMBERS = 0x01000000,
USE_VAD = 0x02000000,
CHANGE_NICKNAME = 0x04000000,
MANAGE_NICKNAMES = 0x08000000,
MANAGE_ROLES = 0x10000000,
MANAGE_WEBHOOKS = 0x20000000,
MANAGE_EMOJIS = 0x40000000
} }
} }

+ 75
- 67
src/Discord.Net.Core/Entities/Permissions/GuildPermissions.cs View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;


namespace Discord namespace Discord
@@ -11,110 +12,114 @@ namespace Discord
/// <summary> Gets a GuildPermissions that grants all guild permissions for webhook users. </summary> /// <summary> Gets a GuildPermissions that grants all guild permissions for webhook users. </summary>
public static readonly GuildPermissions Webhook = new GuildPermissions(0b00000_0000000_0001101100000_000000); public static readonly GuildPermissions Webhook = new GuildPermissions(0b00000_0000000_0001101100000_000000);
/// <summary> Gets a GuildPermissions that grants all guild permissions. </summary> /// <summary> Gets a GuildPermissions that grants all guild permissions. </summary>
public static readonly GuildPermissions All = new GuildPermissions(0b11111_1111110_0111111110001_111111);
public static readonly GuildPermissions All = new GuildPermissions(0b11111_1111110_0111111110011_111111);


/// <summary> Gets a packed value representing all the permissions in this GuildPermissions. </summary> /// <summary> Gets a packed value representing all the permissions in this GuildPermissions. </summary>
public ulong RawValue { get; } public ulong RawValue { get; }


/// <summary> If True, a user may create invites. </summary> /// <summary> If True, a user may create invites. </summary>
public bool CreateInstantInvite => Permissions.GetValue(RawValue, GuildPermission.CreateInstantInvite);
public bool CreateInstantInvite => Permissions.GetValue(RawValue, GuildPermission.CREATE_INSTANT_INVITE);
/// <summary> If True, a user may ban users from the guild. </summary> /// <summary> If True, a user may ban users from the guild. </summary>
public bool BanMembers => Permissions.GetValue(RawValue, GuildPermission.BanMembers);
public bool BanMembers => Permissions.GetValue(RawValue, GuildPermission.BAN_MEMBERS);
/// <summary> If True, a user may kick users from the guild. </summary> /// <summary> If True, a user may kick users from the guild. </summary>
public bool KickMembers => Permissions.GetValue(RawValue, GuildPermission.KickMembers);
public bool KickMembers => Permissions.GetValue(RawValue, GuildPermission.KICK_MEMBERS);
/// <summary> If True, a user is granted all permissions, and cannot have them revoked via channel permissions. </summary> /// <summary> If True, a user is granted all permissions, and cannot have them revoked via channel permissions. </summary>
public bool Administrator => Permissions.GetValue(RawValue, GuildPermission.Administrator);
public bool Administrator => Permissions.GetValue(RawValue, GuildPermission.ADMINISTRATOR);
/// <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 ManageChannels => Permissions.GetValue(RawValue, GuildPermission.ManageChannels);
public bool ManageChannels => Permissions.GetValue(RawValue, GuildPermission.MANAGE_CHANNELS);
/// <summary> If True, a user may adjust guild properties. </summary> /// <summary> If True, a user may adjust guild properties. </summary>
public bool ManageGuild => Permissions.GetValue(RawValue, GuildPermission.ManageGuild);
public bool ManageGuild => Permissions.GetValue(RawValue, GuildPermission.MANAGE_GUILD);
/// <summary> If true, a user may add reactions. </summary> /// <summary> If true, a user may add reactions. </summary>
public bool AddReactions => Permissions.GetValue(RawValue, GuildPermission.AddReactions);
public bool AddReactions => Permissions.GetValue(RawValue, GuildPermission.ADD_REACTIONS);
/// <summary> If true, a user may view the audit log. </summary>
public bool ViewAuditLog => Permissions.GetValue(RawValue, GuildPermission.VIEW_AUDIT_LOG);

/// <summary> If True, a user may join channels. </summary> /// <summary> If True, a user may join channels. </summary>
public bool ReadMessages => Permissions.GetValue(RawValue, GuildPermission.ReadMessages);
public bool ReadMessages => Permissions.GetValue(RawValue, GuildPermission.READ_MESSAGES);
/// <summary> If True, a user may send messages. </summary> /// <summary> If True, a user may send messages. </summary>
public bool SendMessages => Permissions.GetValue(RawValue, GuildPermission.SendMessages);
public bool SendMessages => Permissions.GetValue(RawValue, GuildPermission.SEND_MESSAGES);
/// <summary> If True, a user may send text-to-speech messages. </summary> /// <summary> If True, a user may send text-to-speech messages. </summary>
public bool SendTTSMessages => Permissions.GetValue(RawValue, GuildPermission.SendTTSMessages);
public bool SendTTSMessages => Permissions.GetValue(RawValue, GuildPermission.SEND_TTS_MESSAGES);
/// <summary> If True, a user may delete messages. </summary> /// <summary> If True, a user may delete messages. </summary>
public bool ManageMessages => Permissions.GetValue(RawValue, GuildPermission.ManageMessages);
public bool ManageMessages => Permissions.GetValue(RawValue, GuildPermission.MANAGE_MESSAGES);
/// <summary> If True, Discord will auto-embed links sent by this user. </summary> /// <summary> If True, Discord will auto-embed links sent by this user. </summary>
public bool EmbedLinks => Permissions.GetValue(RawValue, GuildPermission.EmbedLinks);
public bool EmbedLinks => Permissions.GetValue(RawValue, GuildPermission.EMBED_LINKS);
/// <summary> If True, a user may send files. </summary> /// <summary> If True, a user may send files. </summary>
public bool AttachFiles => Permissions.GetValue(RawValue, GuildPermission.AttachFiles);
public bool AttachFiles => Permissions.GetValue(RawValue, GuildPermission.ATTACH_FILES);
/// <summary> If True, a user may read previous messages. </summary> /// <summary> If True, a user may read previous messages. </summary>
public bool ReadMessageHistory => Permissions.GetValue(RawValue, GuildPermission.ReadMessageHistory);
public bool ReadMessageHistory => Permissions.GetValue(RawValue, GuildPermission.READ_MESSAGE_HISTORY);
/// <summary> If True, a user may mention @everyone. </summary> /// <summary> If True, a user may mention @everyone. </summary>
public bool MentionEveryone => Permissions.GetValue(RawValue, GuildPermission.MentionEveryone);
public bool MentionEveryone => Permissions.GetValue(RawValue, GuildPermission.MENTION_EVERYONE);
/// <summary> If True, a user may use custom emoji from other guilds. </summary> /// <summary> If True, a user may use custom emoji from other guilds. </summary>
public bool UseExternalEmojis => Permissions.GetValue(RawValue, GuildPermission.UseExternalEmojis);
public bool UseExternalEmojis => Permissions.GetValue(RawValue, GuildPermission.USE_EXTERNAL_EMOJIS);


/// <summary> If True, a user may connect to a voice channel. </summary> /// <summary> If True, a user may connect to a voice channel. </summary>
public bool Connect => Permissions.GetValue(RawValue, GuildPermission.Connect);
public bool Connect => Permissions.GetValue(RawValue, GuildPermission.CONNECT);
/// <summary> If True, a user may speak in a voice channel. </summary> /// <summary> If True, a user may speak in a voice channel. </summary>
public bool Speak => Permissions.GetValue(RawValue, GuildPermission.Speak);
public bool Speak => Permissions.GetValue(RawValue, GuildPermission.SPEAK);
/// <summary> If True, a user may mute users. </summary> /// <summary> If True, a user may mute users. </summary>
public bool MuteMembers => Permissions.GetValue(RawValue, GuildPermission.MuteMembers);
public bool MuteMembers => Permissions.GetValue(RawValue, GuildPermission.MUTE_MEMBERS);
/// <summary> If True, a user may deafen users. </summary> /// <summary> If True, a user may deafen users. </summary>
public bool DeafenMembers => Permissions.GetValue(RawValue, GuildPermission.DeafenMembers);
public bool DeafenMembers => Permissions.GetValue(RawValue, GuildPermission.DEAFEN_MEMBERS);
/// <summary> If True, a user may move other users between voice channels. </summary> /// <summary> If True, a user may move other users between voice channels. </summary>
public bool MoveMembers => Permissions.GetValue(RawValue, GuildPermission.MoveMembers);
public bool MoveMembers => Permissions.GetValue(RawValue, GuildPermission.MOVE_MEMBERS);
/// <summary> If True, a user may use voice-activity-detection rather than push-to-talk. </summary> /// <summary> If True, a user may use voice-activity-detection rather than push-to-talk. </summary>
public bool UseVAD => Permissions.GetValue(RawValue, GuildPermission.UseVAD);
public bool UseVAD => Permissions.GetValue(RawValue, GuildPermission.USE_VAD);


/// <summary> If True, a user may change their own nickname. </summary> /// <summary> If True, a user may change their own nickname. </summary>
public bool ChangeNickname => Permissions.GetValue(RawValue, GuildPermission.ChangeNickname);
public bool ChangeNickname => Permissions.GetValue(RawValue, GuildPermission.CHANGE_NICKNAME);
/// <summary> If True, a user may change the nickname of other users. </summary> /// <summary> If True, a user may change the nickname of other users. </summary>
public bool ManageNicknames => Permissions.GetValue(RawValue, GuildPermission.ManageNicknames);
public bool ManageNicknames => Permissions.GetValue(RawValue, GuildPermission.MANAGE_NICKNAMES);
/// <summary> If True, a user may adjust roles. </summary> /// <summary> If True, a user may adjust roles. </summary>
public bool ManageRoles => Permissions.GetValue(RawValue, GuildPermission.ManageRoles);
public bool ManageRoles => Permissions.GetValue(RawValue, GuildPermission.MANAGE_ROLES);
/// <summary> If True, a user may edit the webhooks for this guild. </summary> /// <summary> If True, a user may edit the webhooks for this guild. </summary>
public bool ManageWebhooks => Permissions.GetValue(RawValue, GuildPermission.ManageWebhooks);
public bool ManageWebhooks => Permissions.GetValue(RawValue, GuildPermission.MANAGE_WEBHOOKS);
/// <summary> If True, a user may edit the emojis for this guild. </summary> /// <summary> If True, a user may edit the emojis for this guild. </summary>
public bool ManageEmojis => Permissions.GetValue(RawValue, GuildPermission.ManageEmojis);
public bool ManageEmojis => Permissions.GetValue(RawValue, GuildPermission.MANAGE_EMOJIS);


/// <summary> Creates a new GuildPermissions with the provided packed value. </summary> /// <summary> Creates a new GuildPermissions with the provided packed value. </summary>
public GuildPermissions(ulong rawValue) { RawValue = rawValue; } public GuildPermissions(ulong rawValue) { RawValue = rawValue; }


private GuildPermissions(ulong initialValue, bool? createInstantInvite = null, bool? kickMembers = null, private GuildPermissions(ulong initialValue, bool? createInstantInvite = null, bool? kickMembers = null,
bool? banMembers = null, bool? administrator = null, bool? manageChannel = null, bool? manageGuild = null,
bool? addReactions = null,
bool? banMembers = null, bool? administrator = null, bool? manageChannels = null, bool? manageGuild = null,
bool? addReactions = null, bool? viewAuditLog = null,
bool? readMessages = null, bool? sendMessages = null, bool? sendTTSMessages = null, bool? manageMessages = null, bool? readMessages = null, bool? sendMessages = null, bool? sendTTSMessages = null, bool? manageMessages = null,
bool? embedLinks = null, bool? attachFiles = null, bool? readMessageHistory = null, bool? mentionEveryone = null, bool? embedLinks = null, bool? attachFiles = null, bool? readMessageHistory = null, bool? mentionEveryone = null,
bool? userExternalEmojis = null, bool? connect = null, bool? speak = null, bool? muteMembers = null, bool? deafenMembers = null,
bool? useExternalEmojis = null, bool? connect = null, bool? speak = null, bool? muteMembers = null, bool? deafenMembers = null,
bool? moveMembers = null, bool? useVoiceActivation = null, bool? changeNickname = null, bool? manageNicknames = null, bool? moveMembers = null, bool? useVoiceActivation = null, bool? changeNickname = null, bool? manageNicknames = null,
bool? manageRoles = null, bool? manageWebhooks = null, bool? manageEmojis = null) bool? manageRoles = null, bool? manageWebhooks = null, bool? manageEmojis = null)
{ {
ulong value = initialValue; ulong value = initialValue;


Permissions.SetValue(ref value, createInstantInvite, GuildPermission.CreateInstantInvite);
Permissions.SetValue(ref value, banMembers, GuildPermission.BanMembers);
Permissions.SetValue(ref value, kickMembers, GuildPermission.KickMembers);
Permissions.SetValue(ref value, administrator, GuildPermission.Administrator);
Permissions.SetValue(ref value, manageChannel, GuildPermission.ManageChannels);
Permissions.SetValue(ref value, manageGuild, GuildPermission.ManageGuild);
Permissions.SetValue(ref value, addReactions, GuildPermission.AddReactions);
Permissions.SetValue(ref value, readMessages, GuildPermission.ReadMessages);
Permissions.SetValue(ref value, sendMessages, GuildPermission.SendMessages);
Permissions.SetValue(ref value, sendTTSMessages, GuildPermission.SendTTSMessages);
Permissions.SetValue(ref value, manageMessages, GuildPermission.ManageMessages);
Permissions.SetValue(ref value, embedLinks, GuildPermission.EmbedLinks);
Permissions.SetValue(ref value, attachFiles, GuildPermission.AttachFiles);
Permissions.SetValue(ref value, readMessageHistory, GuildPermission.ReadMessageHistory);
Permissions.SetValue(ref value, mentionEveryone, GuildPermission.MentionEveryone);
Permissions.SetValue(ref value, userExternalEmojis, GuildPermission.UseExternalEmojis);
Permissions.SetValue(ref value, connect, GuildPermission.Connect);
Permissions.SetValue(ref value, speak, GuildPermission.Speak);
Permissions.SetValue(ref value, muteMembers, GuildPermission.MuteMembers);
Permissions.SetValue(ref value, deafenMembers, GuildPermission.DeafenMembers);
Permissions.SetValue(ref value, moveMembers, GuildPermission.MoveMembers);
Permissions.SetValue(ref value, useVoiceActivation, GuildPermission.UseVAD);
Permissions.SetValue(ref value, changeNickname, GuildPermission.ChangeNickname);
Permissions.SetValue(ref value, manageNicknames, GuildPermission.ManageNicknames);
Permissions.SetValue(ref value, manageRoles, GuildPermission.ManageRoles);
Permissions.SetValue(ref value, manageWebhooks, GuildPermission.ManageWebhooks);
Permissions.SetValue(ref value, manageEmojis, GuildPermission.ManageEmojis);
Permissions.SetValue(ref value, createInstantInvite, GuildPermission.CREATE_INSTANT_INVITE);
Permissions.SetValue(ref value, banMembers, GuildPermission.BAN_MEMBERS);
Permissions.SetValue(ref value, kickMembers, GuildPermission.KICK_MEMBERS);
Permissions.SetValue(ref value, administrator, GuildPermission.ADMINISTRATOR);
Permissions.SetValue(ref value, manageChannels, GuildPermission.MANAGE_CHANNELS);
Permissions.SetValue(ref value, manageGuild, GuildPermission.MANAGE_GUILD);
Permissions.SetValue(ref value, addReactions, GuildPermission.ADD_REACTIONS);
Permissions.SetValue(ref value, viewAuditLog, GuildPermission.VIEW_AUDIT_LOG);
Permissions.SetValue(ref value, readMessages, GuildPermission.READ_MESSAGES);
Permissions.SetValue(ref value, sendMessages, GuildPermission.SEND_MESSAGES);
Permissions.SetValue(ref value, sendTTSMessages, GuildPermission.SEND_TTS_MESSAGES);
Permissions.SetValue(ref value, manageMessages, GuildPermission.MANAGE_MESSAGES);
Permissions.SetValue(ref value, embedLinks, GuildPermission.EMBED_LINKS);
Permissions.SetValue(ref value, attachFiles, GuildPermission.ATTACH_FILES);
Permissions.SetValue(ref value, readMessageHistory, GuildPermission.READ_MESSAGE_HISTORY);
Permissions.SetValue(ref value, mentionEveryone, GuildPermission.MENTION_EVERYONE);
Permissions.SetValue(ref value, useExternalEmojis, GuildPermission.USE_EXTERNAL_EMOJIS);
Permissions.SetValue(ref value, connect, GuildPermission.CONNECT);
Permissions.SetValue(ref value, speak, GuildPermission.SPEAK);
Permissions.SetValue(ref value, muteMembers, GuildPermission.MUTE_MEMBERS);
Permissions.SetValue(ref value, deafenMembers, GuildPermission.DEAFEN_MEMBERS);
Permissions.SetValue(ref value, moveMembers, GuildPermission.MOVE_MEMBERS);
Permissions.SetValue(ref value, useVoiceActivation, GuildPermission.USE_VAD);
Permissions.SetValue(ref value, changeNickname, GuildPermission.CHANGE_NICKNAME);
Permissions.SetValue(ref value, manageNicknames, GuildPermission.MANAGE_NICKNAMES);
Permissions.SetValue(ref value, manageRoles, GuildPermission.MANAGE_ROLES);
Permissions.SetValue(ref value, manageWebhooks, GuildPermission.MANAGE_WEBHOOKS);
Permissions.SetValue(ref value, manageEmojis, GuildPermission.MANAGE_EMOJIS);


RawValue = value; RawValue = value;
} }
@@ -122,26 +127,26 @@ namespace Discord
/// <summary> Creates a new GuildPermissions with the provided permissions. </summary> /// <summary> Creates a new GuildPermissions with the provided permissions. </summary>
public GuildPermissions(bool createInstantInvite = false, bool kickMembers = false, public GuildPermissions(bool createInstantInvite = false, bool kickMembers = false,
bool banMembers = false, bool administrator = false, bool manageChannels = false, bool manageGuild = false, bool banMembers = false, bool administrator = false, bool manageChannels = false, bool manageGuild = false,
bool addReactions = false,
bool addReactions = false, bool viewAuditLog = false,
bool readMessages = false, bool sendMessages = false, bool sendTTSMessages = false, bool manageMessages = false, bool readMessages = false, bool sendMessages = false, bool sendTTSMessages = false, bool manageMessages = false,
bool embedLinks = false, bool attachFiles = false, bool readMessageHistory = false, bool mentionEveryone = false, bool embedLinks = false, bool attachFiles = false, bool readMessageHistory = false, bool mentionEveryone = false,
bool useExternalEmojis = false, bool connect = false, bool speak = false, bool muteMembers = false, bool deafenMembers = false, bool useExternalEmojis = false, bool connect = false, bool speak = false, bool muteMembers = false, bool deafenMembers = false,
bool moveMembers = false, bool useVoiceActivation = false, bool? changeNickname = false, bool? manageNicknames = false, bool moveMembers = false, bool useVoiceActivation = false, bool? changeNickname = false, bool? manageNicknames = false,
bool manageRoles = false, bool manageWebhooks = false, bool manageEmojis = false) bool manageRoles = false, bool manageWebhooks = false, bool manageEmojis = false)
: this(0, createInstantInvite, manageRoles, kickMembers, banMembers, manageChannels, manageGuild, addReactions,
: this(0, createInstantInvite, manageRoles, kickMembers, banMembers, manageChannels, manageGuild, addReactions, viewAuditLog,
readMessages, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, mentionEveryone, useExternalEmojis, connect, readMessages, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, mentionEveryone, useExternalEmojis, connect,
manageWebhooks, manageEmojis) { } manageWebhooks, manageEmojis) { }


/// <summary> Creates a new GuildPermissions from this one, changing the provided non-null permissions. </summary> /// <summary> Creates a new GuildPermissions from this one, changing the provided non-null permissions. </summary>
public GuildPermissions Modify(bool? createInstantInvite = null, bool? kickMembers = null, public GuildPermissions Modify(bool? createInstantInvite = null, bool? kickMembers = null,
bool? banMembers = null, bool? administrator = null, bool? manageChannels = null, bool? manageGuild = null, bool? banMembers = null, bool? administrator = null, bool? manageChannels = null, bool? manageGuild = null,
bool? addReactions = null,
bool? addReactions = null, bool? viewAuditLog = null,
bool? readMessages = null, bool? sendMessages = null, bool? sendTTSMessages = null, bool? manageMessages = null, bool? readMessages = null, bool? sendMessages = null, bool? sendTTSMessages = null, bool? manageMessages = null,
bool? embedLinks = null, bool? attachFiles = null, bool? readMessageHistory = null, bool? mentionEveryone = null, bool? embedLinks = null, bool? attachFiles = null, bool? readMessageHistory = null, bool? mentionEveryone = null,
bool? useExternalEmojis = null, bool? connect = null, bool? speak = null, bool? muteMembers = null, bool? deafenMembers = null, bool? useExternalEmojis = null, bool? connect = null, bool? speak = null, bool? muteMembers = null, bool? deafenMembers = null,
bool? moveMembers = null, bool? useVoiceActivation = null, bool? changeNickname = null, bool? manageNicknames = null, bool? moveMembers = null, bool? useVoiceActivation = null, bool? changeNickname = null, bool? manageNicknames = null,
bool? manageRoles = null, bool? manageWebhooks = null, bool? manageEmojis = null) bool? manageRoles = null, bool? manageWebhooks = null, bool? manageEmojis = null)
=> new GuildPermissions(RawValue, createInstantInvite, manageRoles, kickMembers, banMembers, manageChannels, manageGuild, addReactions,
=> new GuildPermissions(RawValue, createInstantInvite, manageRoles, kickMembers, banMembers, manageChannels, manageGuild, addReactions, viewAuditLog,
readMessages, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, mentionEveryone, useExternalEmojis, connect, readMessages, sendMessages, sendTTSMessages, manageMessages, embedLinks, attachFiles, mentionEveryone, useExternalEmojis, connect,
speak, muteMembers, deafenMembers, moveMembers, useVoiceActivation, changeNickname, manageNicknames, manageRoles, speak, muteMembers, deafenMembers, moveMembers, useVoiceActivation, changeNickname, manageNicknames, manageRoles,
manageWebhooks, manageEmojis); manageWebhooks, manageEmojis);
@@ -151,11 +156,14 @@ namespace Discord
public List<GuildPermission> ToList() public List<GuildPermission> ToList()
{ {
var perms = new List<GuildPermission>(); var perms = new List<GuildPermission>();
ulong x = 1;
for (byte i = 0; i < Permissions.MaxBits; i++, x <<= 1)

// bitwise operations on raw value
// each of the GuildPermissions increments by 2^i from 0 to MaxBits
for (byte i = 0; i < Permissions.MaxBits; i++)
{ {
if ((RawValue & x) != 0)
perms.Add((GuildPermission)i);
ulong flag = (ulong)Math.Pow(2, i);
if ((RawValue & flag) != 0)
perms.Add((GuildPermission)flag);
} }
return perms; return perms;
} }


+ 50
- 49
src/Discord.Net.Core/Entities/Permissions/OverwritePermissions.cs View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;


namespace Discord namespace Discord
@@ -21,47 +22,47 @@ namespace Discord
public ulong DenyValue { get; } public ulong DenyValue { get; }


/// <summary> If Allowed, a user may create invites. </summary> /// <summary> If Allowed, a user may create invites. </summary>
public PermValue CreateInstantInvite => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.CreateInstantInvite);
public PermValue CreateInstantInvite => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.CREATE_INSTANT_INVITE);
/// <summary> If Allowed, a user may create, delete and modify this channel. </summary> /// <summary> If Allowed, a user may create, delete and modify this channel. </summary>
public PermValue ManageChannel => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.ManageChannel);
public PermValue ManageChannel => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.MANAGE_CHANNELS);
/// <summary> If Allowed, a user may add reactions. </summary> /// <summary> If Allowed, a user may add reactions. </summary>
public PermValue AddReactions => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.AddReactions);
public PermValue AddReactions => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.ADD_REACTIONS);
/// <summary> If Allowed, a user may join channels. </summary> /// <summary> If Allowed, a user may join channels. </summary>
public PermValue ReadMessages => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.ReadMessages);
public PermValue ReadMessages => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.READ_MESSAGES);
/// <summary> If Allowed, a user may send messages. </summary> /// <summary> If Allowed, a user may send messages. </summary>
public PermValue SendMessages => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.SendMessages);
public PermValue SendMessages => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.SEND_MESSAGES);
/// <summary> If Allowed, a user may send text-to-speech messages. </summary> /// <summary> If Allowed, a user may send text-to-speech messages. </summary>
public PermValue SendTTSMessages => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.SendTTSMessages);
public PermValue SendTTSMessages => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.SEND_TTS_MESSAGES);
/// <summary> If Allowed, a user may delete messages. </summary> /// <summary> If Allowed, a user may delete messages. </summary>
public PermValue ManageMessages => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.ManageMessages);
public PermValue ManageMessages => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.MANAGE_MESSAGES);
/// <summary> If Allowed, Discord will auto-embed links sent by this user. </summary> /// <summary> If Allowed, Discord will auto-embed links sent by this user. </summary>
public PermValue EmbedLinks => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.EmbedLinks);
public PermValue EmbedLinks => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.EMBED_LINKS);
/// <summary> If Allowed, a user may send files. </summary> /// <summary> If Allowed, a user may send files. </summary>
public PermValue AttachFiles => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.AttachFiles);
public PermValue AttachFiles => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.ATTACH_FILES);
/// <summary> If Allowed, a user may read previous messages. </summary> /// <summary> If Allowed, a user may read previous messages. </summary>
public PermValue ReadMessageHistory => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.ReadMessageHistory);
public PermValue ReadMessageHistory => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.READ_MESSAGE_HISTORY);
/// <summary> If Allowed, a user may mention @everyone. </summary> /// <summary> If Allowed, a user may mention @everyone. </summary>
public PermValue MentionEveryone => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.MentionEveryone);
public PermValue MentionEveryone => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.MENTION_EVERYONE);
/// <summary> If Allowed, a user may use custom emoji from other guilds. </summary> /// <summary> If Allowed, a user may use custom emoji from other guilds. </summary>
public PermValue UseExternalEmojis => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.UseExternalEmojis);
public PermValue UseExternalEmojis => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.USE_EXTERNAL_EMOJIS);


/// <summary> If Allowed, a user may connect to a voice channel. </summary> /// <summary> If Allowed, a user may connect to a voice channel. </summary>
public PermValue Connect => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.Connect);
public PermValue Connect => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.CONNECT);
/// <summary> If Allowed, a user may speak in a voice channel. </summary> /// <summary> If Allowed, a user may speak in a voice channel. </summary>
public PermValue Speak => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.Speak);
public PermValue Speak => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.SPEAK);
/// <summary> If Allowed, a user may mute users. </summary> /// <summary> If Allowed, a user may mute users. </summary>
public PermValue MuteMembers => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.MuteMembers);
public PermValue MuteMembers => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.MUTE_MEMBERS);
/// <summary> If Allowed, a user may deafen users. </summary> /// <summary> If Allowed, a user may deafen users. </summary>
public PermValue DeafenMembers => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.DeafenMembers);
public PermValue DeafenMembers => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.DEAFEN_MEMBERS);
/// <summary> If Allowed, a user may move other users between voice channels. </summary> /// <summary> If Allowed, a user may move other users between voice channels. </summary>
public PermValue MoveMembers => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.MoveMembers);
public PermValue MoveMembers => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.MOVE_MEMBERS);
/// <summary> If Allowed, a user may use voice-activity-detection rather than push-to-talk. </summary> /// <summary> If Allowed, a user may use voice-activity-detection rather than push-to-talk. </summary>
public PermValue UseVAD => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.UseVAD);
public PermValue UseVAD => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.USE_VAD);


/// <summary> If Allowed, a user may adjust permissions. This also implictly grants all other permissions. </summary> /// <summary> If Allowed, a user may adjust permissions. This also implictly grants all other permissions. </summary>
public PermValue ManagePermissions => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.ManagePermissions);
public PermValue ManagePermissions => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.MANAGE_ROLES);
/// <summary> If True, a user may edit the webhooks for this channel. </summary> /// <summary> If True, a user may edit the webhooks for this channel. </summary>
public PermValue ManageWebhooks => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.ManageWebhooks);
public PermValue ManageWebhooks => Permissions.GetValue(AllowValue, DenyValue, ChannelPermission.MANAGE_WEBHOOKS);


/// <summary> Creates a new OverwritePermissions with the provided allow and deny packed values. </summary> /// <summary> Creates a new OverwritePermissions with the provided allow and deny packed values. </summary>
public OverwritePermissions(ulong allowValue, ulong denyValue) public OverwritePermissions(ulong allowValue, ulong denyValue)
@@ -78,26 +79,26 @@ namespace Discord
PermValue? deafenMembers = null, PermValue? moveMembers = null, PermValue? useVoiceActivation = null, PermValue? managePermissions = null, PermValue? deafenMembers = null, PermValue? moveMembers = null, PermValue? useVoiceActivation = null, PermValue? managePermissions = null,
PermValue? manageWebhooks = null) PermValue? manageWebhooks = null)
{ {
Permissions.SetValue(ref allowValue, ref denyValue, createInstantInvite, ChannelPermission.CreateInstantInvite);
Permissions.SetValue(ref allowValue, ref denyValue, manageChannel, ChannelPermission.ManageChannel);
Permissions.SetValue(ref allowValue, ref denyValue, addReactions, ChannelPermission.AddReactions);
Permissions.SetValue(ref allowValue, ref denyValue, readMessages, ChannelPermission.ReadMessages);
Permissions.SetValue(ref allowValue, ref denyValue, sendMessages, ChannelPermission.SendMessages);
Permissions.SetValue(ref allowValue, ref denyValue, sendTTSMessages, ChannelPermission.SendTTSMessages);
Permissions.SetValue(ref allowValue, ref denyValue, manageMessages, ChannelPermission.ManageMessages);
Permissions.SetValue(ref allowValue, ref denyValue, embedLinks, ChannelPermission.EmbedLinks);
Permissions.SetValue(ref allowValue, ref denyValue, attachFiles, ChannelPermission.AttachFiles);
Permissions.SetValue(ref allowValue, ref denyValue, readMessageHistory, ChannelPermission.ReadMessageHistory);
Permissions.SetValue(ref allowValue, ref denyValue, mentionEveryone, ChannelPermission.MentionEveryone);
Permissions.SetValue(ref allowValue, ref denyValue, useExternalEmojis, ChannelPermission.UseExternalEmojis);
Permissions.SetValue(ref allowValue, ref denyValue, connect, ChannelPermission.Connect);
Permissions.SetValue(ref allowValue, ref denyValue, speak, ChannelPermission.Speak);
Permissions.SetValue(ref allowValue, ref denyValue, muteMembers, ChannelPermission.MuteMembers);
Permissions.SetValue(ref allowValue, ref denyValue, deafenMembers, ChannelPermission.DeafenMembers);
Permissions.SetValue(ref allowValue, ref denyValue, moveMembers, ChannelPermission.MoveMembers);
Permissions.SetValue(ref allowValue, ref denyValue, useVoiceActivation, ChannelPermission.UseVAD);
Permissions.SetValue(ref allowValue, ref denyValue, managePermissions, ChannelPermission.ManagePermissions);
Permissions.SetValue(ref allowValue, ref denyValue, manageWebhooks, ChannelPermission.ManageWebhooks);
Permissions.SetValue(ref allowValue, ref denyValue, createInstantInvite, ChannelPermission.CREATE_INSTANT_INVITE);
Permissions.SetValue(ref allowValue, ref denyValue, manageChannel, ChannelPermission.MANAGE_CHANNELS);
Permissions.SetValue(ref allowValue, ref denyValue, addReactions, ChannelPermission.ADD_REACTIONS);
Permissions.SetValue(ref allowValue, ref denyValue, readMessages, ChannelPermission.READ_MESSAGES);
Permissions.SetValue(ref allowValue, ref denyValue, sendMessages, ChannelPermission.SEND_MESSAGES);
Permissions.SetValue(ref allowValue, ref denyValue, sendTTSMessages, ChannelPermission.SEND_TTS_MESSAGES);
Permissions.SetValue(ref allowValue, ref denyValue, manageMessages, ChannelPermission.MANAGE_MESSAGES);
Permissions.SetValue(ref allowValue, ref denyValue, embedLinks, ChannelPermission.EMBED_LINKS);
Permissions.SetValue(ref allowValue, ref denyValue, attachFiles, ChannelPermission.ATTACH_FILES);
Permissions.SetValue(ref allowValue, ref denyValue, readMessageHistory, ChannelPermission.READ_MESSAGE_HISTORY);
Permissions.SetValue(ref allowValue, ref denyValue, mentionEveryone, ChannelPermission.MENTION_EVERYONE);
Permissions.SetValue(ref allowValue, ref denyValue, useExternalEmojis, ChannelPermission.USE_EXTERNAL_EMOJIS);
Permissions.SetValue(ref allowValue, ref denyValue, connect, ChannelPermission.CONNECT);
Permissions.SetValue(ref allowValue, ref denyValue, speak, ChannelPermission.SPEAK);
Permissions.SetValue(ref allowValue, ref denyValue, muteMembers, ChannelPermission.MUTE_MEMBERS);
Permissions.SetValue(ref allowValue, ref denyValue, deafenMembers, ChannelPermission.DEAFEN_MEMBERS);
Permissions.SetValue(ref allowValue, ref denyValue, moveMembers, ChannelPermission.MOVE_MEMBERS);
Permissions.SetValue(ref allowValue, ref denyValue, useVoiceActivation, ChannelPermission.USE_VAD);
Permissions.SetValue(ref allowValue, ref denyValue, managePermissions, ChannelPermission.MANAGE_ROLES);
Permissions.SetValue(ref allowValue, ref denyValue, manageWebhooks, ChannelPermission.MANAGE_WEBHOOKS);


AllowValue = allowValue; AllowValue = allowValue;
DenyValue = denyValue; DenyValue = denyValue;
@@ -128,22 +129,22 @@ namespace Discord
public List<ChannelPermission> ToAllowList() public List<ChannelPermission> ToAllowList()
{ {
var perms = new List<ChannelPermission>(); var perms = new List<ChannelPermission>();
ulong x = 1;
for (byte i = 0; i < Permissions.MaxBits; i++, x <<= 1)
for (byte i = 0; i < Permissions.MaxBits; i++)
{ {
if ((AllowValue & x) != 0)
perms.Add((ChannelPermission)i);
ulong flag = (ulong)Math.Pow(2, i);
if ((AllowValue & flag) != 0)
perms.Add((ChannelPermission)flag);
} }
return perms; return perms;
} }
public List<ChannelPermission> ToDenyList() public List<ChannelPermission> ToDenyList()
{ {
var perms = new List<ChannelPermission>(); var perms = new List<ChannelPermission>();
ulong x = 1;
for (byte i = 0; i < Permissions.MaxBits; i++, x <<= 1)
for (byte i = 0; i < Permissions.MaxBits; i++)
{ {
if ((DenyValue & x) != 0)
perms.Add((ChannelPermission)i);
ulong flag = (ulong)Math.Pow(2, i);
if ((DenyValue & flag) != 0)
perms.Add((ChannelPermission)flag);
} }
return perms; return perms;
} }


+ 41
- 41
src/Discord.Net.Core/Utils/Permissions.cs View File

@@ -7,84 +7,84 @@ namespace Discord
public const int MaxBits = 53; public const int MaxBits = 53;


[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static PermValue GetValue(ulong allow, ulong deny, ChannelPermission bit)
=> GetValue(allow, deny, (byte)bit);
public static PermValue GetValue(ulong allow, ulong deny, ChannelPermission flag)
=> GetValue(allow, deny, (ulong)flag);
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static PermValue GetValue(ulong allow, ulong deny, GuildPermission bit)
=> GetValue(allow, deny, (byte)bit);
public static PermValue GetValue(ulong allow, ulong deny, GuildPermission flag)
=> GetValue(allow, deny, (ulong)flag);
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static PermValue GetValue(ulong allow, ulong deny, byte bit)
public static PermValue GetValue(ulong allow, ulong deny, ulong flag)
{ {
if (HasBit(allow, bit))
if (HasFlag(allow, flag))
return PermValue.Allow; return PermValue.Allow;
else if (HasBit(deny, bit))
else if (HasFlag(deny, flag))
return PermValue.Deny; return PermValue.Deny;
else else
return PermValue.Inherit; return PermValue.Inherit;
} }


[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool GetValue(ulong value, ChannelPermission bit)
=> GetValue(value, (byte)bit);
public static bool GetValue(ulong value, ChannelPermission flag)
=> GetValue(value, (ulong)flag);
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool GetValue(ulong value, GuildPermission bit)
=> GetValue(value, (byte)bit);
public static bool GetValue(ulong value, GuildPermission flag)
=> GetValue(value, (ulong)flag);
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool GetValue(ulong value, byte bit) => HasBit(value, bit);
public static bool GetValue(ulong value, ulong flag) => HasFlag(value, flag);


[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SetValue(ref ulong rawValue, bool? value, ChannelPermission bit)
=> SetValue(ref rawValue, value, (byte)bit);
public static void SetValue(ref ulong rawValue, bool? value, ChannelPermission flag)
=> SetValue(ref rawValue, value, (ulong)flag);
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SetValue(ref ulong rawValue, bool? value, GuildPermission bit)
=> SetValue(ref rawValue, value, (byte)bit);
public static void SetValue(ref ulong rawValue, bool? value, GuildPermission flag)
=> SetValue(ref rawValue, value, (ulong)flag);
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SetValue(ref ulong rawValue, bool? value, byte bit)
public static void SetValue(ref ulong rawValue, bool? value, ulong flag)
{ {
if (value.HasValue) if (value.HasValue)
{ {
if (value == true) if (value == true)
SetBit(ref rawValue, bit);
SetFlag(ref rawValue, flag);
else else
UnsetBit(ref rawValue, bit);
UnsetFlag(ref rawValue, flag);
} }
} }


[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SetValue(ref ulong allow, ref ulong deny, PermValue? value, ChannelPermission bit)
=> SetValue(ref allow, ref deny, value, (byte)bit);
public static void SetValue(ref ulong allow, ref ulong deny, PermValue? value, ChannelPermission flag)
=> SetValue(ref allow, ref deny, value, (ulong)flag);
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SetValue(ref ulong allow, ref ulong deny, PermValue? value, GuildPermission bit)
=> SetValue(ref allow, ref deny, value, (byte)bit);
public static void SetValue(ref ulong allow, ref ulong deny, PermValue? value, GuildPermission flag)
=> SetValue(ref allow, ref deny, value, (ulong)flag);
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SetValue(ref ulong allow, ref ulong deny, PermValue? value, byte bit)
public static void SetValue(ref ulong allow, ref ulong deny, PermValue? value, ulong flag)
{ {
if (value.HasValue) if (value.HasValue)
{ {
switch (value) switch (value)
{ {
case PermValue.Allow: case PermValue.Allow:
SetBit(ref allow, bit);
UnsetBit(ref deny, bit);
SetFlag(ref allow, flag);
UnsetFlag(ref deny, flag);
break; break;
case PermValue.Deny: case PermValue.Deny:
UnsetBit(ref allow, bit);
SetBit(ref deny, bit);
UnsetFlag(ref allow, flag);
SetFlag(ref deny, flag);
break; break;
default: default:
UnsetBit(ref allow, bit);
UnsetBit(ref deny, bit);
UnsetFlag(ref allow, flag);
UnsetFlag(ref deny, flag);
break; break;
} }
} }
} }


[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private static bool HasBit(ulong value, byte bit) => (value & (1U << bit)) != 0;
private static bool HasFlag(ulong value, ulong flag) => (value & flag) != 0;
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SetBit(ref ulong value, byte bit) => value |= (1U << bit);
public static void SetFlag(ref ulong value, ulong flag) => value |= flag;
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void UnsetBit(ref ulong value, byte bit) => value &= ~(1U << bit);
public static void UnsetFlag(ref ulong value, ulong flag) => value &= ~flag;


public static ChannelPermissions ToChannelPerms(IGuildChannel channel, ulong guildPermissions) public static ChannelPermissions ToChannelPerms(IGuildChannel channel, ulong guildPermissions)
=> new ChannelPermissions(guildPermissions & ChannelPermissions.All(channel).RawValue); => new ChannelPermissions(guildPermissions & ChannelPermissions.All(channel).RawValue);
@@ -100,7 +100,7 @@ namespace Discord
{ {
foreach (var roleId in user.RoleIds) foreach (var roleId in user.RoleIds)
resolvedPermissions |= guild.GetRole(roleId)?.Permissions.RawValue ?? 0; resolvedPermissions |= guild.GetRole(roleId)?.Permissions.RawValue ?? 0;
if (GetValue(resolvedPermissions, GuildPermission.Administrator))
if (GetValue(resolvedPermissions, GuildPermission.ADMINISTRATOR))
resolvedPermissions = GuildPermissions.All.RawValue; //Administrators always have all permissions resolvedPermissions = GuildPermissions.All.RawValue; //Administrators always have all permissions
} }
return resolvedPermissions; return resolvedPermissions;
@@ -115,7 +115,7 @@ namespace Discord
ulong resolvedPermissions = 0; ulong resolvedPermissions = 0;


ulong mask = ChannelPermissions.All(channel).RawValue; ulong mask = ChannelPermissions.All(channel).RawValue;
if (GetValue(guildPermissions, GuildPermission.Administrator)) //Includes owner
if (GetValue(guildPermissions, GuildPermission.ADMINISTRATOR)) //Includes owner
resolvedPermissions = mask; //Owners and administrators always have all permissions resolvedPermissions = mask; //Owners and administrators always have all permissions
else else
{ {
@@ -152,18 +152,18 @@ namespace Discord


if (channel is ITextChannel textChannel) if (channel is ITextChannel textChannel)
{ {
if (!GetValue(resolvedPermissions, ChannelPermission.ReadMessages))
if (!GetValue(resolvedPermissions, ChannelPermission.READ_MESSAGES))
{ {
//No read permission on a text channel removes all other permissions //No read permission on a text channel removes all other permissions
resolvedPermissions = 0; resolvedPermissions = 0;
} }
else if (!GetValue(resolvedPermissions, ChannelPermission.SendMessages))
else if (!GetValue(resolvedPermissions, ChannelPermission.SEND_MESSAGES))
{ {
//No send permissions on a text channel removes all send-related permissions //No send permissions on a text channel removes all send-related permissions
resolvedPermissions &= ~(1UL << (int)ChannelPermission.SendTTSMessages);
resolvedPermissions &= ~(1UL << (int)ChannelPermission.MentionEveryone);
resolvedPermissions &= ~(1UL << (int)ChannelPermission.EmbedLinks);
resolvedPermissions &= ~(1UL << (int)ChannelPermission.AttachFiles);
resolvedPermissions &= ~(1UL << (int)ChannelPermission.SEND_TTS_MESSAGES);
resolvedPermissions &= ~(1UL << (int)ChannelPermission.MENTION_EVERYONE);
resolvedPermissions &= ~(1UL << (int)ChannelPermission.EMBED_LINKS);
resolvedPermissions &= ~(1UL << (int)ChannelPermission.ATTACH_FILES);
} }
} }
resolvedPermissions &= mask; //Ensure we didnt get any permissions this channel doesnt support (from guildPerms, for example) resolvedPermissions &= mask; //Ensure we didnt get any permissions this channel doesnt support (from guildPerms, for example)


+ 2
- 2
src/Discord.Net.WebSocket/Entities/Channels/SocketTextChannel.cs View File

@@ -22,7 +22,7 @@ namespace Discord.WebSocket
public override IReadOnlyCollection<SocketGuildUser> Users public override IReadOnlyCollection<SocketGuildUser> Users
=> Guild.Users.Where(x => Permissions.GetValue( => Guild.Users.Where(x => Permissions.GetValue(
Permissions.ResolveChannel(Guild, x, this, Permissions.ResolveGuild(Guild, x)), Permissions.ResolveChannel(Guild, x, this, Permissions.ResolveGuild(Guild, x)),
ChannelPermission.ReadMessages)).ToImmutableArray();
ChannelPermission.READ_MESSAGES)).ToImmutableArray();
internal SocketTextChannel(DiscordSocketClient discord, ulong id, SocketGuild guild) internal SocketTextChannel(DiscordSocketClient discord, ulong id, SocketGuild guild)
: base(discord, id, guild) : base(discord, id, guild)
@@ -103,7 +103,7 @@ namespace Discord.WebSocket
{ {
var guildPerms = Permissions.ResolveGuild(Guild, user); var guildPerms = Permissions.ResolveGuild(Guild, user);
var channelPerms = Permissions.ResolveChannel(Guild, user, this, guildPerms); var channelPerms = Permissions.ResolveChannel(Guild, user, this, guildPerms);
if (Permissions.GetValue(channelPerms, ChannelPermission.ReadMessages))
if (Permissions.GetValue(channelPerms, ChannelPermission.READ_MESSAGES))
return user; return user;
} }
return null; return null;


Loading…
Cancel
Save