我正在编写一些代码,如果我要执行 !list <role>
(未提及的角色),它会发送一个嵌入列表,列出具有该角色的所有用户。这是我的代码,但每次我运行命令时它都会发送嵌入但不列出角色中的用户。
代码:
const roleName = args.slice(1).join(" ");
const userswithrole = message.guild.members.cache.filter(member => {
message.guild.roles.cache.find(r => r.name === roleName)}).map(member => {
return member.user;
})
const embed = new Discord.MessageEmbed()
.setTitle(`Users with ${roleName} role`)
.setDescription(`${userswithrole.join('\n')}`)
.setColor("RANDOM")
.setFooter(`${message.author.username}`, message.author.avatarURL({ dynamic:true }))
return message.channel.send(embed);
答案 0 :(得分:1)
首先,我认为您不需要删除第一个参数 (args.slice(1)
),因为 args
数组不包含该命令。
其次,userswithrole
目前一团糟,filter
什么也不做。
创建一个新的 role
变量会更容易,检查角色是否以输入的名称退出,如果没有,则返回错误。如果存在具有该名称的角色,您可以过滤 members.cache
并检查 member.roles.cache.has(role.id)
是否存在。它将返回一个成员集合,您可以使用 .array()
方法将其转换为数组,并按照您在示例中所做的换行符join()
。
client.on('message', async (message) => {
if (message.author.bot) return;
const args = message.content.slice(prefix.length).split(/ +/);
const command = args.shift().toLowerCase();
const roleName = args.join(' ');
const roles = await message.guild.roles.fetch();
const role = roles.cache.find(
(r) => r.name.toLowerCase() === roleName.toLowerCase(),
);
if (!role)
return message.channel.send(
`**Error:** ${roleName} is not a valid role on this server`,
);
const members = await message.guild.members.fetch();
const usersWithRole = members.filter((member) =>
member.roles.cache.has(role.id),
);
const embed = new Discord.MessageEmbed()
.setTitle(`Users with ${roleName} role`)
.setDescription(`${usersWithRole.array().join('\n')}`)
.setColor('RANDOM')
.setFooter(
`${message.author.username}`,
message.author.avatarURL({ dynamic: true }),
);
return message.channel.send(embed);
});
如果您不想提及用户,则可以改用 map() method to get their
displayName`:
const usersWithRole = members.filter((member) =>
member.roles.cache.has(role.id),
).map(member => member.displayName);
答案 1 :(得分:1)
Role 有一个 members 属性,用于保存具有此角色的缓存成员。
对于这样的命令,最好先获取所有 GuildMembers,以获得最准确的结果。您需要启用 GuildMember 的 Intent 才能获取工作。
这个例子将使用 async/await,确保你的函数异步,否则使用回调
try {
await message.guild.members.fetch();
const role = message.guild.roles.cache.find(r => r.name === roleName);
const usersWithRole = role.members.map(m => `${m.user.username}`)
.join('\n');
// Embed work here
} catch (err) {
console.error(err);
}