Discord按位权限计算器[关闭]

Posted

技术标签:

【中文标题】Discord按位权限计算器[关闭]【英文标题】:Discord bitwise permission calculator [closed] 【发布时间】:2018-04-11 16:55:09 【问题描述】:

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

似乎我必须使用按位运算符检查权限,但从我谷歌搜索或搜索的所有内容来看,我发现的几乎所有内容似乎都完全不相关。

示例权限: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 是否有我可以研究的工具或示例脚本来确定如何进行此计算?

提前谢谢你!

【问题讨论】:

【参考方案1】:

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

这个例子:

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

【讨论】:

【参考方案2】:

假设您有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 = 1001b,则:

1001 & 1000 = 1000, 1000 > 0 – 用户可以创建帖子 1001 & 0100 = 0000, 0000 == 0 – 用户无法更新帖子 1001 & 0010 = 0000, 0000 == 0 – 用户无法阅读帖子 1001 & 0001 = 0001, 0001 > 0 – 用户可以删除帖子

【讨论】:

回到这里有点晚了,但你的解释是正确的!谢谢! 感谢您简单明了的解释。我的javascript实现const operationMapping = 1: 'create', 2: 'read', 4: 'update', 8: 'delete', ; let numbers = [1, 2, 4, 8]; let result = []; numbers.map(number => if ((operationId & number) > 0) result.push(operationMapping[number]); ); return result;

以上是关于Discord按位权限计算器[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

运算符的计算(按位与按位或异或取反)以及原码反码补码

不按位运算符执行计算

谁能解释这个按位函数来计算 log(n)

C语言里的按位异或运算符

0022和022之间的Umask区别[关闭]

Discord.py 计算对消息的反应