【问题标题】:How do I list all Members with a Role In Discord.Js如何在 Discord.Js 中列出所有具有角色的成员
【发布时间】:2018-07-31 13:00:35
【问题描述】:

如何使用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 时,我希望机器人通过嵌入进行响应。

【问题讨论】:

  • 1) 您是在询问基本的 Discord.js 示例,还是对使用 Embed 有疑问? 2)为什么你所有的代码都被注释掉了? 3) 您正在尝试创建命令.go4-add? 4) 您正在尝试向消息中提到的第一个用户添加角色?

标签: javascript discord.js


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    给我一​​个错误,说 .get 不是一个函数,可能是 discord.js 改变了一些东西,

    在角色生效后添加缓存。

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

    【讨论】:

    • 我也有同样的问题。它说@StoneCoding已经回答了这个问题,但我看不到这个问题的任何cmets......我错过了什么? :)
    • @Junosha 你在看我在手机上的评论吗,因为我在那里也看不到,imgur.com/s8ILsYo 将我的评论添加为 img
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      <Role>.members 返回 collectionGuildMembers。只需映射此集合即可获得所需的属性。

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

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

      【讨论】:

        【解决方案5】:
        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});
        }
        

        不和谐的使用示例:

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

        【讨论】:

        • const discord = require("discord.js"); const embed = new discord.RichEmbed() 你在说什么? @新手
        猜你喜欢
        • 1970-01-01
        • 2021-05-10
        • 2021-05-02
        • 2021-11-17
        • 2019-02-15
        • 2020-10-20
        • 2021-11-03
        • 1970-01-01
        • 2022-01-13
        相关资源
        最近更新 更多