列出角色中的所有用户

时间:2021-07-29 09:12:59

标签: javascript discord discord.js

我正在编写一些代码,如果我要执行 !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);

2 个答案:

答案 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);
});

enter image description here

如果您不想提及用户,则可以改用 map() method to get their displayName`:

const usersWithRole = members.filter((member) =>
  member.roles.cache.has(role.id),
).map(member => member.displayName);

enter image description here

答案 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);
}