【问题标题】:How to overwrite channel permissions with bitfield如何使用位域覆盖通道权限
【发布时间】:2019-03-05 23:03:33
【问题描述】:

我试图让我的机器人保存频道权限,但它只保存其位域。我可以仅使用位域以某种方式覆盖特定角色的通道权限吗?

我试着做这样的事情:

channel.overwritePermissions(role, {
  permissions: perms
});

然后尝试将其更改为:

channel.overwritePermissions(role, {
  bitfield: perms
});

它只是为每个权限添加/

【问题讨论】:

    标签: discord discord.js


    【解决方案1】:

    根据stable分支的docsGuildChannel.overwritePermissions()的用法和你的不一样:

    GuildChannel.overwritePermissions(your_role, {
      VIEW_CHANNEL: false,
      SEND_MESSAGES: null,
      PERMISSIONS_WRITTEN_IN_THIS_FORMAT: true
    });
    

    为了将位域转换为权限名称,您可以使用Permissions.FLAGS,这是一个包含每个权限的所有位域值的对象。这是当前的:

    { CREATE_INSTANT_INVITE: 1,
    KICK_MEMBERS: 2,
    BAN_MEMBERS: 4,
    ADMINISTRATOR: 8,
    MANAGE_CHANNELS: 16,
    MANAGE_GUILD: 32,
    ADD_REACTIONS: 64,
    VIEW_AUDIT_LOG: 128,
    PRIORITY_SPEAKER: 256,
    VIEW_CHANNEL: 1024,
    READ_MESSAGES: 1024,
    SEND_MESSAGES: 2048,
    SEND_TTS_MESSAGES: 4096,
    MANAGE_MESSAGES: 8192,
    EMBED_LINKS: 16384,
    ATTACH_FILES: 32768,
    READ_MESSAGE_HISTORY: 65536,
    MENTION_EVERYONE: 131072,
    EXTERNAL_EMOJIS: 262144,
    USE_EXTERNAL_EMOJIS: 262144,
    CONNECT: 1048576,
    SPEAK: 2097152,
    MUTE_MEMBERS: 4194304,
    DEAFEN_MEMBERS: 8388608,
    MOVE_MEMBERS: 16777216,
    USE_VAD: 33554432,
    CHANGE_NICKNAME: 67108864,
    MANAGE_NICKNAMES: 134217728,
    MANAGE_ROLES: 268435456,
    MANAGE_ROLES_OR_PERMISSIONS: 268435456,
    MANAGE_WEBHOOKS: 536870912,
    MANAGE_EMOJIS: 1073741824 }
    

    要获取权限的名称,您可以简单地向后工作:

    function getPermName(bitfield = 0) {
      for (let key in Discord.Permissions.FLAGS) 
        if (Discord.Permissions.FLAGS[key] == bitfield) return key;
      return null;
    }
    

    一旦你得到名字,你就可以如上所示使用它。

    【讨论】:

    • 是的,但我不知道如何获取特定角色的布尔变量,我只能获取位域,因此如果有一种方法可以使用没有布尔变量的位域覆盖权限。
    【解决方案2】:

    查找简单位域返回的权限名称。

    const { Permissions } = require('discord.js');
    const simpleBitfield = 2048n;
    Object.entries(Permissions.FLAGS).find(p => p[1] == simpleBitfield);
    // outpout: [ 'SEND_MESSAGES', 2048n ]
    

    【讨论】:

      猜你喜欢
      • 2019-10-21
      • 2018-03-04
      • 2018-12-21
      • 2016-10-19
      • 2020-09-01
      • 2022-08-08
      • 2021-02-01
      • 1970-01-01
      • 2021-08-04
      相关资源
      最近更新 更多