如何检测被 ping 的用户是不是具有特定角色?

Posted

技术标签:

【中文标题】如何检测被 ping 的用户是不是具有特定角色?【英文标题】:How to detect if a pinged user has a certain role?如何检测被 ping 的用户是否具有特定角色? 【发布时间】:2021-08-16 02:53:20 【问题描述】:

所以,我正在创建一个命令,当用户 ping 命令具有特定角色时,我需要在其中发送特定消息。我唯一能想到的是:

if(message.mentions.users.first().roles.cache.some(r => r.name === "Admin" || "Mod")) 
            message.channel.send('This user has a role!')  
        

我被困在原地,找不到解决办法。答案可能很明显,但凭借我的 javascript 技能,我对所做的每一次更改都感到越来越沮丧。

另外,这是我得到的错误:“TypeError: Cannot read property 'cache' of undefined”

【问题讨论】:

message.mentions.users.first().rolesundefined(因此无法读取 cache 属性)所以我建议从那里开始找出原因。 【参考方案1】:

您的提及访问一个 User 对象,这是一个全局 Discord 用户表示。您想要 Member 对象 - 它是每个服务器的用户表示 - 代替。

const mentionedMember = message.mentions.members.first();

// Use Array#includes for cleaner syntax
if (mentionedMember.roles.cache.some(role => ["Admin", "Mod"].includes(role.name)) 
   message.channel.send('This member has a role!')  

有关用户与会员的更多信息,请参阅This Answer

【讨论】:

非常感谢!这完美地工作并节省了大量空间 如果我的回答有帮助,请随时单击我的回答左侧的复选标记:v【参考方案2】:

您不能在这样的文字上使用 || 运算符,只能在布尔值上使用。

if(message.mentions.users.first().roles.cache.some(r => r.name === "Admin" || r.name === "Mod")) 
        message.channel.send('This user has a role!')  

r.name === "Admin" || "Mod" 中实际发生的情况是 r.name === "Admin" 首先根据 r.name 的值计算 truefalse。然后在 true || "Mod"false || "Mod" "Mod" 字符串被转换为布尔值(true 用于非空字符串)所以你得到 true || truefalse || true 总是评估为 true

【讨论】:

这不是问题所在。我想检查用户是否至少具有上述角色之一。此外,问题在于message.mentions.users.first().roles.cache.some 而不是r => r.name === "Admin" || "Mod"。确切的错误是“无法读取未定义的属性‘缓存’” 啊,你可以在问题中提到错误;不过,您也必须修复这个 ^^^ 才能使其正常工作。 我在不同的命令中使用了我的版本,它运行良好,所以我认为我不需要更改它:) 我认为您的意图是仅当用户具有管理员或国防部角色时才将条件评估为真。这个条件r => r.name === "Admin" || "Mod" 将始终评估为 true,即使用户不是管理员也不是 Mod。 用户没有角色,成员有

以上是关于如何检测被 ping 的用户是不是具有特定角色?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查用户是不是具有特定角色并因此允许某些操作?

如何检查用户是不是具有特定角色 discord.js v12? [复制]

如何检查用户是不是在 Meteor 中具有特定角色

Discord.js 将特定角色添加到数组

Discord.py - 检查用户是不是具有执行命令的特定角色

windows网络故障检测实用小工具!