Как преобразовать сумму шестнадцатеричных значений обратно в шестнадцатеричные значения - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть объект, содержащий много шестнадцатеричных значений, а именно:

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, и я знаю это, потому что знаю, что роль имеетэти два специальных разрешения для них.

Краткое резюме:

  1. У меня есть список разрешений в объекте.
  2. У меня есть сумма шестнадцатеричных значенийнекоторых из них.
  3. Мне нужно каким-то образом преобразовать сумму в сами значения и поместить их в массив.

Мой вопрос: как мне сделать бот, который неУ вас нет никаких данных, кроме списка разрешений (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;
  }
});

1 Ответ

0 голосов
/ 13 февраля 2019

Самый простой способ - использовать discord.js для его преобразования, используя Permisions#toArray Используется так:

new Discord.Permissions(role.permissions).toArray();

, если роль не имеет разрешений, она дастпустой массив [] в противном случае он даст массив, заполненный Permissions#FLAGS

[ 'KICK_MEMBERS',
  'BAN_MEMBERS',
  'MANAGE_CHANNELS',
  'MANAGE_GUILD'
]

Очевидно, вы также можете использовать другие функции Permissions Class.

...