У меня есть объект, содержащий много шестнадцатеричных значений, а именно:
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
};
Это разрешения в 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;
}
});