我为服务器制作了一个简单的引用机器人,但管理员只希望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,但是会有效吗? 老实说,我现在还不知道。
答案 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()
方法默认返回一个布尔值。