如何将十六进制值的总和转换回十六进制值
How do I convert sum of hex values back to hex values
我有一个包含很多十六进制值的对象,它是:
var perms = {
// 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,
voicePrioritySpeaker: 0x100
};
这些是 discord API 中的权限。 Discord 中的角色将拥有多个权限,因此,discord 使用 parseInt()
将它们相加并将它们转换为十进制值(常规整数值)并将它们存储在对象的 类 中。
例如,如果角色同时具有 generalCreateInstantInvite
和
generalKickMembers
,role.permissions
的结果将是 9
,因为它是 0x1
和 0x8
的总和,我知道是因为我知道角色有这两个对它们的特定权限。
快速总结:
- 我有一个对象中的权限列表。
- 我有其中一些的十六进制值的总和。
- 我需要以某种方式将总和转换为值本身并将它们放入数组中。
我的问题是,如何让没有任何其他数据的机器人使用权限列表 (perms
) 和权限整数 (9
) 使用它们并输出权限姓名(generalCreateInstantInvite
和
generalKickMembers
) 他们有吗?或者可以有一个算法吗?如果您有任何可能有帮助的链接,请发送。
主要 JavaScript 文件示例:
const Discord = require('discord.js');
const bot = new Discord.Client();
const perms = require('./Storage/perms.js');
bot.on('message', (message) => {
let prefix = '/';
let sender = message.author;
let msg = message.content;
let cont = msg.split(' ');
let args = cont.slice(1);
let cmd = msg.startsWith(prefix) ? cont[0].slice(prefix.length).toUpperCase() : undefined;
if (cmd === 'GETPERMISSIONS') {
let role = message.guild.roles.get(args[0]); // args[0] should be role ID
let rolePerms = role.permissions; // rolePerms is sum of hex values
// Converting back the hex sum to permission names and place in an array...
message.channel.send(permNames.join(' - '));
return;
}
});
最简单的方法是用discord.js转换成Permisions#toArray
像这样使用:
new Discord.Permissions(role.permissions).toArray();
如果角色没有权限,它将给出一个空数组[]
否则它会给出一个充满 Permissions#FLAGS
的数组
[ 'KICK_MEMBERS',
'BAN_MEMBERS',
'MANAGE_CHANNELS',
'MANAGE_GUILD'
]
你显然也可以使用 Permissions Class.
的其他功能
我有一个包含很多十六进制值的对象,它是:
var perms = {
// 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,
voicePrioritySpeaker: 0x100
};
这些是 discord API 中的权限。 Discord 中的角色将拥有多个权限,因此,discord 使用 parseInt()
将它们相加并将它们转换为十进制值(常规整数值)并将它们存储在对象的 类 中。
例如,如果角色同时具有 generalCreateInstantInvite
和
generalKickMembers
,role.permissions
的结果将是 9
,因为它是 0x1
和 0x8
的总和,我知道是因为我知道角色有这两个对它们的特定权限。
快速总结:
- 我有一个对象中的权限列表。
- 我有其中一些的十六进制值的总和。
- 我需要以某种方式将总和转换为值本身并将它们放入数组中。
我的问题是,如何让没有任何其他数据的机器人使用权限列表 (perms
) 和权限整数 (9
) 使用它们并输出权限姓名(generalCreateInstantInvite
和
generalKickMembers
) 他们有吗?或者可以有一个算法吗?如果您有任何可能有帮助的链接,请发送。
主要 JavaScript 文件示例:
const Discord = require('discord.js');
const bot = new Discord.Client();
const perms = require('./Storage/perms.js');
bot.on('message', (message) => {
let prefix = '/';
let sender = message.author;
let msg = message.content;
let cont = msg.split(' ');
let args = cont.slice(1);
let cmd = msg.startsWith(prefix) ? cont[0].slice(prefix.length).toUpperCase() : undefined;
if (cmd === 'GETPERMISSIONS') {
let role = message.guild.roles.get(args[0]); // args[0] should be role ID
let rolePerms = role.permissions; // rolePerms is sum of hex values
// Converting back the hex sum to permission names and place in an array...
message.channel.send(permNames.join(' - '));
return;
}
});
最简单的方法是用discord.js转换成Permisions#toArray
像这样使用:
new Discord.Permissions(role.permissions).toArray();
如果角色没有权限,它将给出一个空数组[]
否则它会给出一个充满 Permissions#FLAGS
[ 'KICK_MEMBERS',
'BAN_MEMBERS',
'MANAGE_CHANNELS',
'MANAGE_GUILD'
]
你显然也可以使用 Permissions Class.