Discord按位许可计算器

时间:2017-10-30 16:17:41

标签: php api bitwise-operators discord

我正在尝试让我的工具/脚本确定登录用户是否具有使用该工具的正确权限。但是Discord正在使用权限int进行响应。

似乎我必须使用按位运算符来检查权限,但是从我用Google搜索或搜索的所有内容中,我发现几乎所有内容都显得无关紧要。

示例权限:2146958591

权限参考

// General generalCreateInstantInvite: 0x1, generalKickMembers: 0x2, generalBanMembers: 0x4, generalAdministrator: 0x8, generalManageChannels: 0x10, generalManageServer: 0x20, generalChangeNickname: 0x4000000, generalManageNicknames: 0x8000000, generalManageRoles: 0x10000000, generalManageWebhooks: 0x20000000, generalManageEmojis: 0x40000000, generalViewAuditLog: 0x80, // Text textAddReactions: 0x40, textReadMessages: 0x400, textSendMessages: 0x800, textSendTTSMessages: 0x1000, textManageMessages: 0x2000, textEmbedLinks: 0x4000, textAttachFiles: 0x8000, textReadMessageHistory: 0x10000, textMentionEveryone: 0x20000, textUseExternalEmojis: 0x40000, // Voice voiceViewChannel: 0x400, voiceConnect: 0x100000, voiceSpeak: 0x200000, voiceMuteMembers: 0x400000, voiceDeafenMembers: 0x800000, voiceMoveMembers: 0x1000000, voiceUseVAD: 0x2000000 是否有可以研究的工具或示例脚本,以确定如何进行此计算?

提前谢谢!

2 个答案:

答案 0 :(得分:3)

要检查给定的权限值是否具有所选权限,请使用按位AND运算符。

示例:

$canKickMembers = ($permissionCode & 0x2) != 0;

答案 1 :(得分:3)

想象一下,您希望每个用户允许或禁止4个不同的操作:

  • 创建帖子
  • 更新帖子
  • 阅读文章
  • 删除帖子。

让我们创建一个包含10的4个字符的字符串。字符串中的第一个字符将表示用户create post操作的可能性。第二个字符 - update post,第三个字符 - read post和第四个字符 - delete post。例如,如果用户拥有权限1001,则可以创建帖子并删除帖子,但无法更新和阅读。

存储此权限的最有效方法是什么?我们在字符串的每个位置都只有01,因此我们可以将这些数据存储在字符串内但不在数字的二进制表示内。因此,用户的权限将是一些十进制数字,此数字的每一位都代表特定操作的权限。

例如,我们的权限字符串1001只是十进制数9= 1*2^0 + 0*2^1 + 0*2^2 + 1*2^3)。

我们可以将每个权限表示为二进制:

  • 创建帖子= 1000
  • 更新帖子= 0100
  • 阅读帖子= 0010
  • 删除帖子= 0001

但是,我们如何检查该用户是否具有特定权限或权限组?这很简单,让我们使用按位运算符&

如果用户权限等于9 = 1001 b,则:

  • 1001 & 1000 = 10001000 > 0 - 用户可以创建帖子
  • 1001 & 0100 = 00000000 == 0 - 用户无法更新帖子
  • 1001 & 0010 = 00000000 == 0 - 用户无法阅读帖子
  • 1001 & 0001 = 00010001 > 0 - 用户可以删除帖子