【问题标题】:Discord.js update cache to pull all members that have roleDiscord.js 更新缓存以拉取所有具有角色的成员
【发布时间】:2022-02-05 17:12:10
【问题描述】:

目前在拉取所有具有特定角色的成员时遇到问题。我目前可以提取名称列表,但只能提取当前缓存的名称。如果我让我的机器人运行几个小时,它会拉得更多,但它永远不会拉动所有具有该角色的成员。我已经阅读了一些关于使用 .fetch() 命令的不同内容,但仍然没有骰子。

const client = new Client({
    intents: [
        Intents.FLAGS.GUILDS,
        Intents.FLAGS.GUILD_MESSAGES,
        Intents.FLAGS.GUILD_VOICE_STATES,
        Intents.FLAGS.GUILD_MEMBERS
    ]
});


msg.channel.send('exporting all members with delcared role');

msg.guild.roles.fetch('guildId');//cache roles i think?
let role = msg.guild.roles.cache.find(r => r.name === 'Sysadmins');


msg.guild.members.fetch('roleId');//cache members i think?
let list = msg.guild.roles.cache.get(roleID).members.map(m => m.nickname)

console.log(role);
console.log(list);

console.log();按预期返回我的昵称,但只有我的昵称,而且我知道至少还有 10 个人担任此角色。

我已经尝试过的其他类似问题:

Similar Question #1

Similar Question #2

【问题讨论】:

    标签: javascript node.js discord.js


    【解决方案1】:

    由于您为 fetch() 方法提供了一个 String 参数,因此只会获取与该 String 匹配的用户,更像是一个 get()。此外,fetch() 方法返回一个 Promise,这意味着必须等待该方法才能实际接收数据。

    您的 fetch() 方法应如下所示:

    await msg.guild.members.fetch();
    

    这样你告诉 Node.js 它必须等到你收到承诺的数据才能继续。

    【讨论】:

    • await 似乎不是问题,看来我需要在 fetch() 中设置数据
    • await 实际上是问题所在,如果您看到Discord.js,它会告诉您获取所有成员的方法。此外,它告诉你 fetch() 方法返回一个 Promise。
    • 我刚刚查看了您的 GitHub 存储库。您尝试使用 return await 进行 fetch() 的方式根本没有区别。要使其正常工作,请先在您的活动中尝试:client.on('messageCreate', async msg => { //TODO here }); 。然后只需使用await msg.guild.members.fetch(); 方法。
    • 好吧,所以我更新了你的建议,我找到了一种获取所有成员的方法,但结果是我需要以另一种方式获取特定角色的所有成员。
    【解决方案2】:

    很接近,但更简单,只有 3 行

    await msg.guild.members.fetch() // fetch all members and cache them
    const role = msg.guild.roles.cache.get("id") // get role from cache by ID (roles are always cached)
    const list = role.members.map(m => m.nickname) // map members by nickname
    

    【讨论】:

    • 这似乎仍然只是为了这个角色而只取我的名字
    • @djbears32 你有 GUILD_MEMBERS 的意图吗?
    • 查看更新问题
    • 你能记录 msg.guild.members.cache.size 吗?
    • 我一定不懂异步函数,让我做一些研究以完全理解您的意思
    【解决方案3】:

    @DanLop 您的回答以及@MrMythical 和其他一些堆栈溢出问题帮助我解决了这个问题。我能够正确使用异步函数来提取我需要的所有数据,这就是我最终得到的。

    解决方案:

    client.on('messageCreate', async msg => {  //TODO here });
    
    let list = client.guilds.cache.get(tempGuildId);
    
    try {
        await list.members.fetch();
    
        let role1 = list.roles.cache.get(roleId).members.map(m => m.displayName);
        console.log(role1);
    } catch (err) {
        console.error(err);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 2021-05-10
      • 2021-11-03
      • 2018-07-31
      • 1970-01-01
      • 2019-02-15
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多