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

时间:2018-02-21 03:05:04

标签: javascript 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时,我希望机器人以嵌入方式进行响应。

5 个答案:

答案 0 :(得分:5)

<Role>.members会返回collectionGuildMember个。只需将此系列映射到您想要的属性即可。

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

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

这将从具有&#34; go4&#34;的成员输出一组用户标签。角色。现在,您可以.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个字符,所以你可能想在发出嵌入之前做一些检查然后处理超大嵌入通过将它们分成多个嵌入消息,或者使用基于反应的页面可能。

答案 1 :(得分:1)

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

不和谐时使用示例:

inrole command

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

答案 2 :(得分:0)

自Discord v12起,您现在必须使用roles.add()而不是addRole()

答案 3 :(得分:0)

我尝试过Newbie的解决方案,但是没有用

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

给我一​​个错误:.get不是一个函数,或者使用discord.js有所更改,

在角色起作用后添加缓存。

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

答案 4 :(得分:0)

要在嵌入内容中提及用户(这看起来比纯文本要好得多),请删除.tag就是这样

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