【问题标题】:Code returns all members and not the members in the role代码返回所有成员,而不是角色中的成员
【发布时间】:2020-09-30 03:15:18
【问题描述】:

这是代码:

let getMembers = message.guild.members.cache.filter(member => {
    return message.guild.roles.fetch('701142571623252018');
}).map(member => {
    return member.user.username;
});

它返回服务器中的所有成员,但不返回应该执行的特定角色的成员。

这是我的完整代码:

    const targetRole = message.guild.roles.cache.get('701142571623252018');
    if (!targetRole) return console.log('No role found')
    const members = message.guild.members.cache.filter((member) => !member.roles.cache.some((role) => role.id === targetRole.id)).map(m => m.user.username)

    const players = new Discord.MessageEmbed()
      .setColor('#6B238E')
      .setTitle("Players:")
      .setDescription(members);

    message.channel.send(players);
    //console.log(members);

【问题讨论】:

  • message.guild 的内容是什么?
  • 如果先映射然后过滤呢?
  • 我要不要切换这两个?

标签: javascript node.js discord.js


【解决方案1】:

那是因为您的过滤器函数没有返回成员是否具有角色:它返回一个应解析为角色的 Promise,该角色被解释为true,因此所有内容都通过了过滤器。

您实际上不需要获取角色,因为您只需要检查该 ID 是否是成员的角色之一:为此,您可以使用 GuildMember.roles.cache.has(),它将返回角色集合是否具有该 ID 的角色。

你可以这样做:

message.guild.members.cache.filter(member => member.roles.cache.has('701142571623252018'))
  .map(member => member.user.username)

【讨论】:

    【解决方案2】:

    您可以使用filter 和方法collection.some 来检查成员是否具有角色。

    bot.on('message', (message) => {
        const targetRole = message.guild.roles.cache.get('ROLE ID');
        if (!targetRole) return console.log('No role found')
        const members = message.guild.members.cache.filter((member) => member.roles.cache.some((role) => role.id === targetRole.id)).map(m => m.user.username)
    });
    

    V2

    const Discord = require('discord.js')
    const bot = new Discord.Client();
    
    bot.on('message', (message) => {
        const targetRole = message.guild.roles.cache.get('648157497051447317');
        if (!targetRole) return console.log('No role found')
        const members = message.guild.members.cache.filter((member) => member.roles.cache.some((role) => role.id === targetRole.id)).map(m => m.user.username)
        console.log(members)
    });
    
    bot.login('TOKEN HERE')
    

    【讨论】:

    • 当我尝试 console.log(members) 时,它什么也没做
    • 我检查了一下,它工作正常。你确定你登录你的机器人并发送消息吗?
    • 哦,1个问题,你需要有角色的成员吗?还是所有没有角色的成员?
    • 我的错,我启动了错误的机器人哈哈。它仍然说每个人,而不仅仅是扮演角色的人。
    • 我需要所有具有特定角色的成员
    猜你喜欢
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2021-11-03
    • 2021-02-15
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多