問題描述
在 Discord.js 中查找所有具有角色的成員 (Finding all members with a role in Discord.js)
我已經嘗試過使用每個人所說的內容,但它總是給我空數組或未定義的數組。我相信我正在使用 discord.js v12。我真的很確定我確實有這個角色的成員,並且 roleID 是正確的。為什麼這是錯誤的?將 new_channel 與頻道進行比較。我想 find 函數中的 ${}
不是必需的,但這不是問題。直到 roles.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 []
參考解法
方法 1:
Most likely the members with that role are not cached. You need to:
- Enable the
GUILD_MEMBERS
privileged intent on the Discord developer panel if you have not already (if your bot is less than 100 guilds this is a simple toggle; if your bot has >100 guilds and is verified you need to apply for these, it's to protect user privacy), and - Enable the
GUILD_MEMBERS
privileged intent in your Discord.js Client's options (the object that is passed tonew Client({...})
by passing{ ws: { intents: [ 'GUILD_MEMBERS' ] } }
- Fetch all of the guild's members when this command/module/etc runs (only do this when strictly necessary, and not on an interval, as it causes an extra API call)
</ol>
Also, there's no need to do `${variable}`
as variable
does the same thing. The `
and ${...}
syntax are only needed when merging variables with strings `like${this}`
(= 'like' + this
)
To fetch all guild members, you can do:
<Guild>.members.fetch() // => Promise<GuildMemberManager>
Note that for some reason, in my testing, the value of the resolved promise doesn't work as a valid GuildMemberManager
, so you should do:
// _ = temporary var
<Guild>.members.fetch().then((_) => {
// do something with <Guild>.members.cache
});
(by mikemaster98、0xLogN)