如何列出在 Discord.Js 中具有角色的所有成员

How do I list all Members with a Role In Discord.Js

如何使用 Discord.js 列出角色中的成员。

我的代码:

client.on("message", message => {
    var guild = message.guild;
    let args = message.content.split(" ").slice(1);
    if (!message.content.startsWith(prefix)) return;
    if (message.author.bot) return; 
    if(message.content.startsWith(prefix + 'go4-add')) {
        guild.member(message.mentions.users.first()).addRole('415665311828803584');                     
    }
});

我将如何列出在嵌入中具有 go4 角色的所有成员。当在频道中输入消息 .go4-list 时,我希望机器人通过嵌入进行响应。

if(message.content.startsWith("//inrole")){
    let roleName = message.content.split(" ").slice(1).join(" ");

    //Filtering the guild members only keeping those with the role
    //Then mapping the filtered array to their usernames
    let membersWithRole = message.guild.members.filter(member => { 
        return member.roles.find("name", roleName);
    }).map(member => {
        return member.user.username;
    })

    let embed = new discord.RichEmbed({
        "title": `Users with the ${roleName} role`,
        "description": membersWithRole.join("\n"),
        "color": 0xFFFF
    });

    return message.channel.send({embed});
}

discord 上的使用示例:

请注意,如果有很多成员担任该角色,您可能会收到一条错误消息,告诉您您已经超出了可以放入嵌入的字符数。在这种情况下,您可以决定发送多个嵌入来拆分用户。

<Role>.members returns a collection of GuildMember秒。只需映射此集合即可获得您想要的属性。

根据您的情况,这是一个示例:

message.guild.roles.get('415665311828803584').members.map(m=>m.user.tag);

这将从具有 "go4" 角色的成员输出一组用户标签。现在你可以.join(...)这个数组到你想要的格式。

此外,guild.member(message.mentions.users.first()).addRole('415665311828803584'); 可以缩短为:message.mentions.members.first().addRole('415665311828803584');

这是一个粗略的示例,说明它的结果:

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

    if(message.content.startsWith(`${prefix}go4-add`)) {
        message.mentions.members.first().addRole('415665311828803584'); // gets the <GuildMember> from a mention and then adds the role to that member                     
    }

    if(message.content == `${prefix}go4-list`) {
        const ListEmbed = new Discord.RichEmbed()
            .setTitle('Users with the go4 role:')
            .setDescription(message.guild.roles.get('415665311828803584').members.map(m=>m.user.tag).join('\n'));
        message.channel.send(ListEmbed);                    
    }
});

正如@Wright 在他的回答中提到的,如果成员过多,它将引发错误,因为嵌入最多只能包含 2048 个字符,因此您可能需要在发送嵌入之前进行一些检查,然后处理通过将它们拆分为多个嵌入消息或使用基于反应的页面来超大嵌入。

从 Discord v12 开始,您现在必须使用 roles.add() 而不是 addRole()

我尝试了新手的解决方案,但没有用

message.guild.roles.get('415665311828803584').members.map(m=>m.user.tag);

给我一个 .get 不是函数的错误,也许 discord.js、

发生了一些变化

在角色生效后添加缓存。

message.guild.roles.cache.find(r => r.name === args[0]);

要在嵌入中提及用户(这看起来比仅文本要好得多)删除 .tag 所以它只是

(m => m.user).join('\n')