From 306ea97f99acb91b2dd28b14f0367e65c48be814 Mon Sep 17 00:00:00 2001 From: Gus Caplan Date: Sat, 21 Jan 2017 10:37:28 -0600 Subject: [PATCH] fix guild member fetching edge cases (#1115) * thx4tipprogrammixluvubye * consistancy * make this loop for some reason * so impatient --- .../packets/handlers/GuildMembersChunk.js | 12 +++++--- src/structures/Guild.js | 30 +++++++++---------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/client/websocket/packets/handlers/GuildMembersChunk.js b/src/client/websocket/packets/handlers/GuildMembersChunk.js index 02a3c3cbd..e67c1d425 100644 --- a/src/client/websocket/packets/handlers/GuildMembersChunk.js +++ b/src/client/websocket/packets/handlers/GuildMembersChunk.js @@ -1,7 +1,7 @@ -// ##untested## - const AbstractHandler = require('./AbstractHandler'); const Constants = require('../../../../util/Constants'); +// uncomment in v12 +// const Collection = require('../../../../util/Collection'); class GuildMembersChunkHandler extends AbstractHandler { handle(packet) { @@ -10,9 +10,13 @@ class GuildMembersChunkHandler extends AbstractHandler { const guild = client.guilds.get(data.guild_id); if (!guild) return; + // uncomment in v12 + // const members = new Collection(); + // + // for (const member of data.members) members.set(member.id, guild._addMember(member, false)); + const members = data.members.map(member => guild._addMember(member, false)); - guild._checkChunks(); client.emit(Constants.Events.GUILD_MEMBERS_CHUNK, members); client.ws.lastHeartbeatAck = true; @@ -22,7 +26,7 @@ class GuildMembersChunkHandler extends AbstractHandler { /** * Emitted whenever a chunk of guild members is received (all members come from the same guild) * @event Client#guildMembersChunk - * @param {GuildMember[]} members The members in the chunk + * @param {Collection} members The members in the chunk */ module.exports = GuildMembersChunkHandler; diff --git a/src/structures/Guild.js b/src/structures/Guild.js index 2a9c3d90d..457593cc9 100644 --- a/src/structures/Guild.js +++ b/src/structures/Guild.js @@ -337,7 +337,6 @@ class Guild { * @returns {Promise} */ fetchMember(user, cache = true) { - if (this._fetchWaiter) return Promise.reject(new Error('Already fetching guild members.')); user = this.client.resolver.resolveUser(user); if (!user) return Promise.reject(new Error('User is not cached. Use Client.fetchUser first.')); if (this.members.has(user.id)) return Promise.resolve(this.members.get(user.id)); @@ -347,17 +346,17 @@ class Guild { /** * Fetches all the members in the guild, even if they are offline. If the guild has less than 250 members, * this should not be necessary. - * @param {string} [query=''] An optional query to provide when fetching members + * @param {string} [query=''] Limit fetch to members with similar usernames * @returns {Promise} */ fetchMembers(query = '') { return new Promise((resolve, reject) => { - if (this._fetchWaiter) throw new Error(`Already fetching guild members in ${this.id}.`); if (this.memberCount === this.members.size) { + // uncomment in v12 + // resolve(this.members) resolve(this); return; } - this._fetchWaiter = resolve; this.client.ws.send({ op: Constants.OPCodes.REQUEST_GUILD_MEMBERS, d: { @@ -366,7 +365,17 @@ class Guild { limit: 0, }, }); - this._checkChunks(); + const handler = (members, guild) => { + if (guild.id !== this.id) return; + if (this.memberCount === this.members.size) { + this.client.removeListener(Constants.Events.GUILD_MEMBERS_CHUNK, handler); + // uncomment in v12 + // resolve(this.members) + resolve(this); + return; + } + }; + this.client.on(Constants.Events.GUILD_MEMBERS_CHUNK, handler); this.client.setTimeout(() => reject(new Error('Members didn\'t arrive in time.')), 120 * 1000); }); } @@ -812,7 +821,6 @@ class Guild { this.client.emit(Constants.Events.GUILD_MEMBER_ADD, member); } - this._checkChunks(); return member; } @@ -842,7 +850,6 @@ class Guild { _removeMember(guildMember) { this.members.delete(guildMember.id); - this._checkChunks(); } _memberSpeakUpdate(user, speaking) { @@ -866,15 +873,6 @@ class Guild { } this.presences.set(id, new Presence(presence)); } - - _checkChunks() { - if (this._fetchWaiter) { - if (this.members.size === this.memberCount) { - this._fetchWaiter(this); - this._fetchWaiter = null; - } - } - } } module.exports = Guild;