【问题标题】:Finding all members with a role in Discord.js在 Discord.js 中查找所有具有角色的成员
【发布时间】:2021-05-10 04:22:16
【问题描述】:

我已经尝试过使用每个人所说的内容,但它总是给我空数组或未定义的数组。我相信我正在使用 discord.js v12。 我真的很确定我确实有这个角色的成员,并且 roleID 是正确的。为什么这是错误的?将 new_channel 与频道进行比较。我想 find 函数中的 ${} 不是必需的,但这不是问题。直到 role.cache.get(importantRole.id) 部分它都正确,但我似乎无法从中获取成员。

let importantRole = await new_channel.guild.roles.cache.find(r => r.name === `${new_channel.name}`)
console.log(importantRole.id) // --> gives the right role ID
let membersWithRole = await new_channel.guild.roles.cache.get(importantRole.id).members.map(m=>m.user.id);
console.log(membersWithRole) // --> gives []

【问题讨论】:

    标签: node.js discord discord.js


    【解决方案1】:

    很可能没有缓存具有该角色的成员。您需要:

    1. 如果您尚未启用 Discord 开发者面板上的 GUILD_MEMBERS 特权意图(如果您的机器人少于 100 个公会,这是一个简单的切换;如果您的机器人有 >100 个公会并且经过验证,您需要申请这些,是为了保护用户隐私),并且
    2. 在 Discord.js 客户端的选项中启用 GUILD_MEMBERS 特权意图(通过 { ws: { intents: [ 'GUILD_MEMBERS' ] } } 传递给 new Client({...}) 的对象
    3. 在此命令/模块/等运行时获取所有公会成员(仅在绝对必要时执行此操作,而不是在间隔时执行,因为它会导致额外的 API 调用)

    另外,没有必要做`${variable}` 因为variable 做同样的事情。 `${...} 语法仅在将变量与字符串 `like${this}` (= 'like' + this) 合并时才需要

    要获取所有公会成员,您可以:

    <Guild>.members.fetch() // => Promise<GuildMemberManager>
    

    请注意,由于某种原因,在我的测试中,resolved promise 的值不能作为有效的GuildMemberManager,所以你应该这样做:

    //                            _ = temporary var
    <Guild>.members.fetch().then((_) => {
        // do something with <Guild>.members.cache
    });
    

    【讨论】:

    • 谢谢。我不知道机器人设置中有 GUILD_MEMBERS 选项,更不用说在这种情况下需要使用了。这似乎成功了。奇怪的是,这是我在代码中第一次遇到这个问题。
    • @mikemaster98 他们最近将这些意图添加到 API。对于涉及公会成员缓存的任何事情,您需要意图。
    猜你喜欢
    • 2018-07-31
    • 2021-11-17
    • 2021-11-03
    • 1970-01-01
    • 2019-02-15
    • 2020-10-20
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    相关资源
    最近更新 更多