【问题标题】:Discord.js permissionOverwrites not working but no error at allDiscord.js 权限覆盖不起作用但根本没有错误
【发布时间】:2022-01-20 10:50:07
【问题描述】:

我一直在为我们公司开发票务机器人,但最终无法更新每个频道的用户权限。

我找不到任何问题,并且代码在权限之外完美运行。我正在使用 DiscordJS 12.5.1。

这是我的代码:

module.exports = {
  name: 'ticket',
  category: 'Ticket',
  description: 'Creates a new ticket.',
  aliases: ['new'],
  usage: 'new',
  userperms: [],
  botperms: [],
  run: async (client, message, args, prefix) => {
    const discord = require('discord.js');

    message.guild.channels
      .create(
        `ticket-${message.author.username}-${message.author.discriminator}`,
        {
          permissionOverwrites: [
            {
              id: message.author.id,
              allow: ['CREATE_INSTANT_INVITE'],
              allow: ['SEND_MESSAGES'],
              allow: ['ATTACH_FILES'],
              allow: ['CONNECT'],
              allow: ['ADD_REACTIONS'],
              allow: ['VIEW_CHANNEL'],
            },
          ],
          type: 'text',
          // parent: 'category id',
        },
      )
      .then(async (channel) => {
        let category = client.channels.cache.find(
          (c) => c.name == '➣ Online Tickets' && c.type == 'category',
        );
        if (!category) throw new Error('Category channel does not exist');
        channel.setParent(category.id);

        // channel.permissionOverwrites.create(message.author.id, {VIEW_CHANNEL: true, SEND_MESSAGES: false});
        // channel.permissionOverwrites.create(message.guild.roles.everyone, {VIEW_CHANNEL: false});

        var embedParent = new discord.MessageEmbed()
          .setTitle(`Beste, ${message.author.username}`)
          .setDescription(
            'Een van onze medewerkers helpt je z.s.m! Laat alvast een bericht achter zodat wij je zo goed mogelijk kunnen helpen. Om U zo goed mogelijk te kunnen helpen komen nu enkele vragen, gelieve deze te beantwoorden.\nReageer met 1️⃣ voor een technische vraag \nReageer met 2️⃣ voor boekhouding en juridische vragen.\nReageer met 3️⃣ voor een samenwerking.\nReageer met 4️⃣ voor overige vragen. \n\n ***LET OP: Als U errors krijgt op uw server, kunt U het beste een ticket aanmaken op de website: snip ***',
          )
          .setColor('007BFF')
          .setFooter(
            '© OnlineNode.nl 2021 - Ticket Systeem',
            'https://media.discordapp.net/attachments/735827815521452133/830082858470604870/logo_400x400.png',
          )
          .setTimestamp();

        channel.send(embedParent).then(function (embedParent) {
          embedParent.react('1️⃣');
          embedParent.react('2️⃣');
          embedParent.react('3️⃣');
          embedParent.react('4️⃣');
          //embedParent.react("5️⃣")
        });
        message.guild.channels.cache
          .find((c) => c.name == '????┃-discord-logs')
          .send('New ticket has been submitted!');
      });
  },
};

【问题讨论】:

    标签: javascript node.js discord.js


    【解决方案1】:

    您的permissionOverwrites 数组有一个对象,您可以在其中多次重复allow 键:

    {
      permissionOverwrites: [
        {
          id: message.author.id,
          allow: ['CREATE_INSTANT_INVITE'],
          allow: ['SEND_MESSAGES'],
          allow: ['ATTACH_FILES'],
          allow: ['CONNECT'],
          allow: ['ADD_REACTIONS'],
          allow: ['VIEW_CHANNEL'],
        },
      ],
      type: 'text',
    }
    

    由于一个对象不能有两个同名的键,所以基本上是这样的:

    {
      permissionOverwrites: [
        {
          id: message.author.id,
          allow: ['VIEW_CHANNEL'],
        },
      ],
      type: 'text',
    }
    

    allow 是用户或角色允许的权限数组:

    {
      permissionOverwrites: [
        {
          id: message.author.id,
          allow: [
            'ADD_REACTIONS',
            'ATTACH_FILES',
            'CONNECT',
            'CREATE_INSTANT_INVITE',
            'SEND_MESSAGES',
            'VIEW_CHANNEL',
          ],
        },
      ],
      type: 'text',
    }
    

    另一个错误是当你使用setParent方法设置频道的父频道时,它会覆盖你刚刚添加的权限,并将它们设置为与父频道相同。

    setParent 方法接受 an options object 作为其第二个参数。它的属性之一是lockPermissions。它告诉是否将权限锁定为父权限,其默认值为true。为了防止同步权限,您可以将其设置为false,如下所示:

    channel.setParent(category.id, { lockPermissions: false });
    

    【讨论】:

      【解决方案2】:

      正如 Zsolt Meszaros 所提到的,您的权限需要在一个数组中。

      message.guild.channels
            .create(
              `ticket-${message.author.username}-${message.author.discriminator}`,
              {
                permissionOverwrites: [
                  {
                    id: message.author.id,
                    allow: [
                      'ADD_REACTIONS',
                      'ATTACH_FILES',
                      'CONNECT',
                      'CREATE_INSTANT_INVITE',
                      'SEND_MESSAGES',
                      'VIEW_CHANNEL',
                   ],
                  },
                ],
                type: 'text',
                // parent: 'category id',
              },
            )
      

      另一件事,您的机器人可能正在设置权限,但是在您的代码中不久之后,您更改了频道所属的类别:

      channel.setParent(category.id);
      

      另外,我不确定,但是在您更改类别后,可能会删除权限,然后从该类别的权限中复制,因此您必须在设置之前设置类别权限。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-16
        • 1970-01-01
        • 2021-02-01
        • 2018-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-19
        相关资源
        最近更新 更多