查明是否有人有角色
Find out if someone has a role
我为服务器制作了一个简单的报价机器人,但管理员只希望 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,但是可以吗?
老实说,我现在还不知道。
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.
}
注意,角色名称必须是你在查找方法中输入的名称,如果角色名称中有任何表情符号,则包括任何表情符号。
Map.has 方法检查的是键,而不是值,因此您必须改用角色的 ID。
message.member.roles.has(adminRole.id)
message.member.roles.has(modRole.id)
if(message.guild.roles.find(role => role.name === "VIP"))
discord.js api 已更新,由于 .exists()
已被弃用,因此有更好的方法。
if (message.member.roles.cache.some(role => role.name === 'Whatever')) {}
这比 .find()
好,因为 .find()
returns 角色对象(或未定义的)然后被转换为布尔值。 .some()
方法 returns 默认为布尔值。
这对我适用于版本 12.2.0
if(message.member.roles.cache.find(r => r.name === "Admin")) {
// Your code
}
您也可以使用r.id
来查看角色id
我可能迟到了,但我遇到了同样的问题,我解决它的方法是搜索角色,然后检查变量是否有任何内容。
假设我想检查消息的作者是否具有管理员角色:
client.on('message',message =>{
adminrole = message.member.roles.cache.find(role => role.name == "Admin");
if(adminrole != null){memberIsAdmin = true;}else{memberIsAdmin = false;}
}
也许这会对某人有所帮助,请注意,我对 js 不是很有经验:)
祝大家有个美好的一天
这在最新版本的 Discord.js v12 中不起作用。您需要添加 if(message.guild.roles.cache.find(roles => role.name === 'VIP'))
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!");
这可能不是传统的或未批准的,但我已经在这个问题上停留了一段时间,接受的答案中的解决方案对我来说总是返回 true。无论如何,对我有用的是:
message.mentions.members.first()._roles.includes(role.id)
这个returns真假正确
我为服务器制作了一个简单的报价机器人,但管理员只希望 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,但是可以吗? 老实说,我现在还不知道。
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.
}
注意,角色名称必须是你在查找方法中输入的名称,如果角色名称中有任何表情符号,则包括任何表情符号。
Map.has 方法检查的是键,而不是值,因此您必须改用角色的 ID。
message.member.roles.has(adminRole.id)
message.member.roles.has(modRole.id)
if(message.guild.roles.find(role => role.name === "VIP"))
discord.js api 已更新,由于 .exists()
已被弃用,因此有更好的方法。
if (message.member.roles.cache.some(role => role.name === 'Whatever')) {}
这比 .find()
好,因为 .find()
returns 角色对象(或未定义的)然后被转换为布尔值。 .some()
方法 returns 默认为布尔值。
这对我适用于版本 12.2.0
if(message.member.roles.cache.find(r => r.name === "Admin")) {
// Your code
}
您也可以使用r.id
来查看角色id
我可能迟到了,但我遇到了同样的问题,我解决它的方法是搜索角色,然后检查变量是否有任何内容。 假设我想检查消息的作者是否具有管理员角色:
client.on('message',message =>{
adminrole = message.member.roles.cache.find(role => role.name == "Admin");
if(adminrole != null){memberIsAdmin = true;}else{memberIsAdmin = false;}
}
也许这会对某人有所帮助,请注意,我对 js 不是很有经验:) 祝大家有个美好的一天
这在最新版本的 Discord.js v12 中不起作用。您需要添加 if(message.guild.roles.cache.find(roles => role.name === 'VIP'))
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!");
这可能不是传统的或未批准的,但我已经在这个问题上停留了一段时间,接受的答案中的解决方案对我来说总是返回 true。无论如何,对我有用的是:
message.mentions.members.first()._roles.includes(role.id)
这个returns真假正确