创建频道权限覆盖

时间:2019-06-05 21:05:42

标签: discord.js

我正在创建一个机器人命令,这样当您键入!setup时它将设置整个服务器(创建通道和角色等)。我已经设置了它来创建角色和频道,但是有些频道只能输入特定的角色,而其他角色只能读取该频道。我不知道如何为某些角色设置权限覆盖。

我已经查看了Discord.js文档,但并没有太大帮助。我收到一个错误supplied parameter was neither a user nor a role,但我不知道如何获取角色ID。

message.guild.createRole({
  name: 'Admin',
  color: '#2494ad',
  permissions: ['ADMINISTRATOR', 'VIEW_AUDIT_LOG', 'MANAGE_GUILD', 'MANAGE_CHANNELS', 'SEND_TTS_MESSAGES', 'CREATE_INSTANT_INVITE', 'KICK_MEMBERS', 'BAN_MEMBERS', 'ADD_REACTIONS', 'PRIORITY_SPEAKER', 'READ_MESSAGES', 'SEND_MESSAGES', 'MANAGE_MESSAGES', 'EMBED_LINKS', 'ATTACH_FILES', 'READ_MESSAGE_HISTORY', 'MENTION_EVERYONE', 'USE_EXTERNAL_EMOJIS', 'CONNECT', 'SPEAK', 'MUTE_MEMBERS', 'DEAFEN_MEMBERS', 'MOVE_MEMBERS', 'USE_VAD', 'CHANGE_NICKNAME', 'MANAGE_NICKNAMES', 'MANAGE_ROLES', 'MANAGE_WEBHOOKS', 'MANAGE_EMOJIS']
});

message.guild.createRole({
  name: 'Requesting Role',
  color: '#1bb738',
  permissions: ['READ_MESSAGES', 'SEND_MESSAGES', 'READ_MESSAGE_HISTORY',]
});

//Categories and Channels
message.guild.createChannel('clan-communications', {
  type: 'category',
  permissionOverwrites: [{
    id:'25311096',
    deny: ['SEND_MESSAGES']
  }]
});

//Permissions
message.channel.overwritePermissions('25311096', {
  SEND_MESSAGES: false
});

break;

我希望角色具有整个服务器的基本权限。但是某些角色会覆盖不同的渠道。而是说supplied parameter was neither a user nor a role.

1 个答案:

答案 0 :(得分:0)

首先,欢迎您使用Stack Overflow。希望我们能为您提供帮助。

让我们逐步解决问题,以达到您想要的结果。

创建角色时,应声明一个变量来存储它们。这样,您就可以使用客户端稍后创建的内容。由于Guild.createRole()返回了promise,因此我们可以将完成的结果保存到变量中。

请注意,关键字await必须放在异步上下文中(在async function内)。

const vip = await message.guild.createRole('VIP', { ... });

然后,当您需要使用该角色时,可以引用该变量。

await message.guild.createChannel('VIPs Only', {
  type: 'category',
  permissionOverwrites: [
    {
      id: vip.id,
      allow: ['READ_MESSAGES']
    }, {
      id: message.guild.defaultRole.id, // @everyone role
      deny: ['READ_MESSAGES']
    }
  ]
});

如果角色已经存在,则可以从Collection返回的角色Guild.roles中检索它。

const testRole = message.guild.roles.get('IDhere');
const adminRole = message.guild.roles.find(r => r.name === 'Admin');

其他简单的改进。

  • 在您的代码段中,没有看到任何错误处理。您正在使用的返回承诺方法。如果任何错误发生,则承诺状态将被拒绝。任何未捕获的拒绝承诺都会引发错误。要解决此问题,请将catch()方法附加到每个promise(更好地用于单个处理),或将异步代码包装在try...catch语句中。
  • 创建管理员角色时,知道ADMINISTRATOR权限会自动授予所有其他权限(并允许用户绕过特定于通道的权限)。因此,无需列出任何其他权限,也无需更改任何通道中角色的权限覆盖。
  • 您的代码中的ID似乎无效。不一致ID为snowflakes,由18位数字的字符串表示。您可以通过Discord中的开发人员模式访问它们。但是,除非它们已经存在,否则您不必使用此解决方案对其进行硬编码。
  • Requesting Role角色的权限数组中,您有一个逗号。