首页 > 解决方案 > 如何使用 Discord.js 检查消息作者是否具有管理员角色?

问题描述

我正在构建一个 Discord 机器人,我想要一个if只有在消息作者在公会中具有管理员角色时才会进行的声明。

我尝试过拥有特定于角色的权限,但这意味着机器人所在的所有服务器上都必须有完全相同的名称角色。

如何检查消息作者是否具有管理员角色?(该角色具有管理员权限。)

标签: javascriptdiscorddiscord.js

解决方案


由于管理器的实现,必须修改以下某些代码以在最新的主要 Discord.js 版本(本次编辑时为 v12)中使用。

这里确实需要解决三个不同的问题。它们都是相关的,但每个都有不同的直接答案。


如何检查邮件作者是否具有管理员角色

所以,把这一切联系在一起:

if (message.member.roles.has'roleIDHere')) console.log('User is an admin.');

或者

if (message.member.roles.find(role => role.name === 'Admin')) console.log('User is an admin.');

如何检查消息作者的角色是否具有管理员权限

  • 同样,我们需要使用来自Message#member.
  • 再一次,我们需要使用GuildMember#roles集合。
  • 而且...似曾相识...您可以使用 搜索集合Collection#find()
  • 这一次,您应该专门检查Role#hasPermission()谓词函数。

例如:

if (message.member.roles.find(role => role.hasPermission('Administrator'))) console.log('User is an admin.');

您也可以将此概念应用于任何特定角色。


这种情况的最佳方法...

如何检查消息作者是否具有管理员权限

  • 我们继续使用Message#member来访问 GuildMember。
  • 但是,您可以通过该方法一次检查所有成员的权限。GuildMember#hasPermission()

考虑这个简短的例子:

if (message.member.hasPermission('ADMINISTRATOR')) console.log('User is an admin.');

快,对吧?


在尝试检查用户是否是管理员之前,请确保检查您的客户收到的消息不是DM。Message#member未在公会中发送消息时未定义,并且尝试使用它的属性将引发错误。

使用此条件,如果消息是 DM,它将停止:

if (!message.guild) return;

推荐阅读