fix(GuildMemberManager): refactor fetchMany (#6328)

This commit is contained in:
Noel
2021-08-07 11:35:51 +02:00
committed by GitHub
parent ceae5960ed
commit 909c87353e

View File

@@ -378,13 +378,8 @@ class GuildMemberManager extends CachedManager {
query, query,
time = 120e3, time = 120e3,
nonce = SnowflakeUtil.generate(), nonce = SnowflakeUtil.generate(),
force = false,
} = {}) { } = {}) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (!query && !limit && !presences && !user_ids && !force) {
resolve(this.cache);
return;
}
if (!query && !user_ids) query = ''; if (!query && !user_ids) query = '';
if (nonce.length > 32) throw new RangeError('MEMBER_FETCH_NONCE_LENGTH'); if (nonce.length > 32) throw new RangeError('MEMBER_FETCH_NONCE_LENGTH');
this.guild.shard.send({ this.guild.shard.send({
@@ -399,20 +394,19 @@ class GuildMemberManager extends CachedManager {
}, },
}); });
const fetchedMembers = new Collection(); const fetchedMembers = new Collection();
const option = Boolean(query || limit || presences || user_ids);
let i = 0; let i = 0;
const handler = (members, _, chunk) => { const handler = (members, _, chunk) => {
timeout.refresh(); timeout.refresh();
if (chunk.nonce !== nonce) return; if (chunk.nonce !== nonce) return;
i++; i++;
for (const member of members.values()) { for (const member of members.values()) {
if (option || force) fetchedMembers.set(member.id, member); fetchedMembers.set(member.id, member);
} }
if ((option && members.size < 1000) || (limit && fetchedMembers.size >= limit) || i === chunk.count) { if (members.size < 1000 || (limit && fetchedMembers.size >= limit) || i === chunk.count) {
clearTimeout(timeout); clearTimeout(timeout);
this.client.removeListener(Events.GUILD_MEMBERS_CHUNK, handler); this.client.removeListener(Events.GUILD_MEMBERS_CHUNK, handler);
this.client.decrementMaxListeners(); this.client.decrementMaxListeners();
let fetched = option || force ? fetchedMembers : this.cache; let fetched = fetchedMembers;
if (user_ids && !Array.isArray(user_ids) && fetched.size) fetched = fetched.first(); if (user_ids && !Array.isArray(user_ids) && fetched.size) fetched = fetched.first();
resolve(fetched); resolve(fetched);
} }