代码之家  ›  专栏  ›  技术社区  ›  KillerVillnave

如何列出在Discord中扮演角色的所有成员。Js公司

  •  7
  • KillerVillnave  · 技术社区  · 8 年前

    如何使用列出角色中的成员 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 回复  |  直到 8 年前
        1
  •  15
  •   newbie    8 年前

    <Role>.members 返回a collection 属于 GuildMember s、 只需映射此集合即可获得所需的属性。

    根据您的场景,下面是一个示例:

    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个字符,因此您可能希望在发送嵌入之前进行一些检查,然后通过将其拆分为多个嵌入消息或使用基于反应的页面来处理过大的嵌入。

        2
  •  3
  •   Wright    8 年前
    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

    但请注意,如果有许多成员担任该角色,则可能会出现错误,告诉您已超过嵌入中可以放入的字符数。在这种情况下,您可以决定发送多个嵌入来拆分用户。

        3
  •  2
  •   StoneCoding    6 年前

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

    消息公会角色。get('415665311828803584')。成员。映射(m=>m.user.tag);

    给了我一个错误。get不是一个函数,可能是因为不一致而发生了一些变化。js、,

    在角色使其工作后添加缓存。

    消息公会角色。隐藏物查找(r=>r.name===参数[0]);

        4
  •  1
  •   Syntle    6 年前

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

        5
  •  0
  •   Dharman vijay    5 年前

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

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