找出某人是否有角色

IT技术 javascript node.js roles discord.js
2021-03-12 06:10:04

我为服务器制作了一个简单的报价机器人,但管理员只希望 mod+ 人员能够添加报价以避免垃圾邮件。我去了文档并做了所有事情,但我无法让它工作。这是我所拥有的:

//other code
else if (command === "addquote" && arg) {
    let adminRole = message.guild.roles.find("name", "Admin");
    let modRole = message.guild.roles.find("name", "Mod");

    if(message.member.roles.has(adminRole) || message.member.roles.has(modRole)){
        const hasArr = arr.some((el) => {
            return el.toLowerCase().replace(/\s/g, '') === arg.toLowerCase().replace(/\s/g, '');
        });

        if(hasArr){
            message.channel.send(arg.replace(/\s+/g,' ').trim() + " is already a Quote");
        } else {
            fs.appendFileSync('./Quotes.txt', '\r\n' + arg);
            message.channel.send("Quote added: " + arg);
            arr.push(arg);            
        }   
    }
}

它非常挑剔。如果用户具有 mod 角色,有时它会起作用,大多数时候它不会。如果我做

console.log(message.memeber.roles.has(adminRole));
console.log(message.memeber.roles.has(modRole));

两者都会输出为false,但会起作用吗?老实说,我现在不知道。

6个回答

discord.js api 已更新,并且有更好的方法,因为.exists()已被弃用。

if (message.member.roles.cache.some(role => role.name === 'Whatever')) {}

这比.find()因为.find()返回角色对象(或未定义),然后将其转换为布尔值要好.some()方法默认返回一个布尔值。

@JackNicholsonif (!message.member.roles.some(role => role.name === 'Whatever'))似乎可以解决这个问题。
2021-05-05 06:10:04

message.member.roles是一个集合。而不是获取角色对象,然后寻找它,只需直接在集合中寻找角色。试试这个:

else if (command === "addquote" && arg) {
    if(message.member.roles.find(r => r.name === "Admin") || message.member.roles.find(r => r.name === "Mod")){
        // The rest of your code.
    }

请注意,角色名称必须是您在 find 方法中输入的名称,如果角色名称中有任何表情符号,则包括任何表情符号。

这对 12.2.0 版的我有用

if(message.member.roles.cache.find(r => r.name === "Admin")) {
    // Your code
}

您还可以使用r.id来检查角色 ID

这是最新的答案。
2021-05-08 06:10:04

Map.has钥匙,没有value,所以你必须使用角色ID,而不是方法检查。

message.member.roles.has(adminRole.id)

message.member.roles.has(modRole.id)

啊,谢谢,但是当我进行更正并添加 .id 部分时,我在执行 if 语句时收到一个错误,提示“找不到 null 的属性”
2021-05-21 06:10:04

我可能迟到了,但我遇到了同样的问题,我解决它的方法是搜索角色,然后检查变量是否有任何内容。假设我想检查消息的作者是否具有管理员角色:

client.on('message',message =>{

     adminrole = message.member.roles.cache.find(role => role.name == "Admin");
     if(adminrole != null){memberIsAdmin = true;}else{memberIsAdmin = false;}

}

也许这会对某人有所帮助,请注意,我对 js 不是很有经验 :) 祝大家度过愉快的一天