如何使用 Discord.js 检查消息作者是不是具有管理员角色?

Posted

技术标签:

【中文标题】如何使用 Discord.js 检查消息作者是不是具有管理员角色?【英文标题】:How can I check if the message author has an admin role using Discord.js?如何使用 Discord.js 检查消息作者是否具有管理员角色? 【发布时间】:2019-11-17 12:01:38 【问题描述】:

我正在构建一个 Discord 机器人,并且我想要一个 if 语句,只有当消息作者在公会中具有管理员角色时才会继续。

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

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

【问题讨论】:

【参考方案1】:

在 GuildMember 对象上,您有一个可用的 hasPermission 函数。 所以你可以做member.hasPermission('ADMINISTRATOR')

如果您对所有其他可由权限解析的字符串感兴趣,您可以在discord.js docs 中找到它们。

【讨论】:

if (message.content.startsWith('!kick') && member.hasPermission('ADMINISTRATOR')) 是我所做的,但我得到了 ReferenceError: member is not defined 您可能应该发布更多代码以查看上下文。以及如何获取/接收实际的成员对象。 client.on("message", (message) => if (message.content == $prefixavatar && member.hasPermission('ADMINISTRATOR')) message.reply(message.author .avatarURL); );这是代码。但是我得到了和以前一样的错误。 在这种情况下,您需要message.member.hasPermission('ADMINISTRATOR')【参考方案2】:

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

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


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

通过Message#member 属性访问发送消息的GuildMember,而不是返回User 的Message#author。请记住,成员具有角色和权限,而不是用户。

可以使用GuildMember#roles 检索成员角色的Collection。

您可以通过两种主要方式搜索角色:

    ID:Map#has() 属性:Collection#find()

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

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。 再一次,我们需要使用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;

【讨论】:

【参考方案3】:

这些答案似乎已经过时了:

使用:msg.member.roles.cache.has(roleID)

【讨论】:

这显示它是否具有特定 id 的角色,而不是具有管理员权限的角色。此外,“试试这个”的答案在 SO 上并没有真正的价值,因为它们没有向提出问题的人展示他们如何改进,它只向他们展示了他们问题的答案,没有别的。

以上是关于如何使用 Discord.js 检查消息作者是不是具有管理员角色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Discord.js 中检查消息是不是为 DM?

如何检查消息是不是存在? (discord.js)

Discord.js 如何检查用户是不是不接受私信

Discord.js 如何使用 sqlite 快速发送消息作者

检查用户是不是可以在提到的频道 discord.js 中发送消息

Discord.js 如何提及消息作者?