代码之家  ›  专栏  ›  技术社区  ›  R. Gillie

找出某人是否有角色

  •  19
  • R. Gillie  · 技术社区  · 7 年前

    我为服务器制作了一个简单的报价机器人,但管理员只希望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,但会工作吗? 老实说,我现在不知道。

    9 回复  |  直到 6 年前
        1
  •  26
  •   Rofaeel Wagdy R. Gillie    4 年前

    不和谐。js api已经更新,现在有了更好的方法 .exists() 已被弃用。

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

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

        2
  •  22
  •   Jonathan J. Pecany Wright    3 年前

    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方法中输入的名称,包括任何表情符号(如果角色名称中有)。

        3
  •  18
  •   yannh    4 年前

    这在12.2.0版本中对我有效

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

    您也可以使用 r.id

        4
  •  9
  •   bubmet    7 年前

    这个 Map.has

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

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

        5
  •  4
  •   mage3339 Raiko    4 年前

    我可能有点晚了,但我也遇到了同样的问题,我解决这个问题的方法是搜索角色,然后检查变量上是否有任何内容。 假设我想检查邮件作者是否具有管理员角色:

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

        6
  •  4
  •   Gabriel Moreira    3 年前

    不一致js版本:v12(稳定)。

    如果你有 role ID ,您可以检查 .roles GuildMember对象上的集合包括它,使用 .has() 。如果您不知道ID,并且希望检查类似“Mod”角色的内容,您可以使用 .some() .

    member.roles.cache.has('role-id-here');
    // returns true if the member has the role
    
    member.roles.cache.some(role => role.name === 'Admin');
    // returns true if any of the member's roles is exactly named "Admin"
    

    const roleById = member.roles.cache.has('123456...');
    //or if you want in message
    const rolebyIdMessage = message.member.roles.cache.has('12346....');
    
    if(member.roles.cache.has(roleById) return message.reply("Member With Role!");
    
        7
  •  2
  •   Kugel Blitz    6 年前

    if(message.guild.roles.find(role => role.name === "VIP"))

        8
  •  2
  •   Lemons    4 年前

    这在最新版本的Discord中是行不通的。js,即v12。您需要添加 if(message.guild.roles.cache.find(roles => role.name === 'VIP'))

        9
  •  0
  •   cigien Jorge Eldis    3 年前

    这可能不是传统的或被认可的,但我已经在这个问题上停留了一段时间,公认答案中的解决方案对我来说总是正确的。无论如何,对我来说有效的是:

    message.mentions.members.first()._roles.includes(role.id)