【问题标题】:查明某人是否有角色
【发布时间】:2018-01-01 04:57:43
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js roles discord.js


    【解决方案1】:

    这可能不是传统的或被批准的,但我已经被这个问题困住了一段时间,接受答案中的解决方案对我来说总是正确的。无论如何,对我有用的是:

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

    这会正确返回真假。

    【讨论】:

      【解决方案2】:

      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】:

        Discord.js 版本:v12(稳定)。

        如果您有 role ID,您可以使用 .has() 检查 GuildMember 对象上的 .roles 集合是否包含它。如果您不知道 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"
        

        IF 示例;

        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!");
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            discord.js api 已更新,由于 .exists() 已被弃用,因此有更好的方法。

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

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

            【讨论】:

            • @JackNicholson if (!message.member.roles.some(role => role.name === 'Whatever')) 似乎可以解决这个问题。
            【解决方案6】:

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

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

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

            【讨论】:

              【解决方案7】:

              这适用于我的版本 12.2.0

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

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

              【讨论】:

              • 这是最新的答案。
              【解决方案8】:

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

              【讨论】:

              • 这将从服务器返回角色,但不验证是否已应用到用户。
              【解决方案9】:

              Map.has 方法检查的是键,而不是值,因此您必须使用角色的 ID。

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

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

              【讨论】:

              • 啊,谢谢,但是当我进行更正并添加 .id 部分时,在执行 if 语句时出现“找不到 null 属性”的错误
              猜你喜欢
              • 2020-09-21
              • 1970-01-01
              • 2020-09-14
              • 2018-12-20
              • 1970-01-01
              • 2021-04-06
              • 2021-07-07
              • 2021-02-24
              • 2018-06-10
              相关资源
              最近更新 更多