找出某人是否有角色

时间:2017-07-26 04:09:48

标签: javascript node.js roles discord.js

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

8 个答案:

答案 0 :(得分:10)

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

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

注意,角色名称必须是您在查找中添加的名称,包括角色名称中的任何表情符号。

答案 1 :(得分:9)

这对我来说适用于版本12.2.0

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

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

答案 2 :(得分:4)

Map.has方法会检查密钥,而不是值,因此您必须使用角色' ids代替。

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

// selectedDates variable consists already selected dates in form of MomentJS objects let result = [...selectedDates]; // Supplying a dateFrom and dateTo const dateFrom = moment().add(-1, "year"); const dateTo = moment(); console.log(`Range from ${dateFrom.format("DD-MM-YYYY")} to ${dateTo.format("DD-MM-YYYY")}`) const dates = []; const indexes = []; // Indexes of common dates // Enumerating to get dates that weekday is equal to supplied weekday (not included here) // Also checking if those dates are already in the selectedDates array and if true then saving their indexes to an array while(dateFrom.add(1, "days").diff(dateTo) < 0) { if (dateFrom.format("dd") === weekday) { dates.push(dateFrom.clone()); const index = selectedDates.findIndex(date => date.isSame(dateFrom, "day")); if (index > -1) { indexes.push(index); } } } // If there are already less dates in the selectedDates array then I want to select what's left // Else just deselect all dates if (dates.length > indexes.length) { const difference = _.differenceWith(dates, selectedDates, (a, b) => a.isSame(b, "day")); result.push(...difference); } else { result = _.differenceWith(selectedDates, dates, (a, b) => a.isSame(b, "day")); } return result;

答案 3 :(得分:3)

我可能对此很迟,但是我也遇到了同样的问题,而解决问题的方法是搜索角色,然后检查变量是否包含任何内容。 假设我要检查邮件的作者是否具有管理员角色:

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

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

}

也许这将对某人有所帮助,请注意,我对js tho不太有经验:) 祝你有美好的一天

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

Discord.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"

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

答案 7 :(得分:0)

discord.js api已更新,并且自.exists()被弃用以来,这是一种更好的方法。

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

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