Skip to content

Commit

Permalink
Promisified Guild#fetchAllMembers (#576)
Browse files Browse the repository at this point in the history
  • Loading branch information
LJNeon authored and abalabahaha committed Dec 1, 2019
1 parent 3046b24 commit 9eee8ed
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 4 deletions.
2 changes: 1 addition & 1 deletion index.d.ts
Expand Up @@ -1205,7 +1205,7 @@ declare namespace Eris {
iconURL?: string;
explicitContentFilter: number;
constructor(data: BaseData, client: Client);
fetchAllMembers(): void;
fetchAllMembers(timeout?: number): Promise<number>;
dynamicIconURL(format: string, size: number): string;
createChannel(name: string): Promise<TextChannel>;
createChannel(name: string, type: 0, reason?: string, options?: CreateChannelOptions | string): Promise<TextChannel>;
Expand Down
29 changes: 28 additions & 1 deletion lib/gateway/Shard.js
Expand Up @@ -144,6 +144,16 @@ class Shard extends EventEmitter {
this.connecting = false;
this.ready = false;
this.preReady = false;
if(this.requestMembersPromise !== undefined) {
for(const guildID in this.requestMembersPromise) {
if(!this.requestMembersPromise.hasOwnProperty(guildID)) {
continue;
}
clearTimeout(this.requestMembersPromise[guildID].timeout);
this.requestMembersPromise[guildID].res(this.requestMembersPromise[guildID].received);
}
}
this.requestMembersPromise = {};
this.getAllUsersCount = {};
this.getAllUsersQueue = [];
this.getAllUsersLength = 1;
Expand Down Expand Up @@ -1138,9 +1148,17 @@ class Shard extends EventEmitter {
if(this.getAllUsersCount.hasOwnProperty(guild.id)) {
if(this.getAllUsersCount[guild.id] <= 1) {
delete this.getAllUsersCount[guild.id];
if(this.requestMembersPromise.hasOwnProperty(guild.id)) {
clearTimeout(this.requestMembersPromise[guild.id].timeout);
this.requestMembersPromise[guild.id].res(this.requestMembersPromise[guild.id].received + packet.d.members.length);
delete this.requestMembersPromise[guild.id];
}
this.checkReady();
} else {
--this.getAllUsersCount[guild.id];
if(this.requestMembersPromise.hasOwnProperty(guild.id)) {
this.requestMembersPromise[guild.id].received += packet.d.members.length;
}
}
}

Expand Down Expand Up @@ -1491,14 +1509,23 @@ class Shard extends EventEmitter {
}
}

getGuildMembers(guildID, chunkCount) {
getGuildMembers(guildID, chunkCount, timeout) {
this.getAllUsersCount[guildID] = chunkCount;
if(this.getAllUsersLength + 3 + guildID.length > 4048) { // 4096 - "{\"op\":8,\"d\":{\"guild_id\":[],\"query\":\"\",\"limit\":0}}".length + 1 for lazy comma offset
this.requestGuildMembers(this.getAllUsersQueue);
this.getAllUsersQueue = [guildID];
this.getAllUsersLength = 1 + guildID.length + 3;
} else if(this.ready) {
this.requestGuildMembers([guildID]);

return new Promise((res) => this.requestMembersPromise[guildID] = {
res: res,
received: 0,
timeout: setTimeout(() => {
res(this.requestMembersPromise[guildID].received);
delete this.requestMembersPromise[guildID];
}, timeout || this.client.options.requestTimeout)
});
} else {
this.getAllUsersQueue.push(guildID);
this.getAllUsersLength += guildID.length + 3;
Expand Down
6 changes: 4 additions & 2 deletions lib/structures/Guild.js
Expand Up @@ -195,9 +195,11 @@ class Guild extends Base {

/**
* Request all guild members from Discord
* @arg {Number} [timeout] The number of milliseconds to wait before resolving early. Defaults to the `requestTimeout` client option
* @returns {Promise<Number>} Resolves with the total number of fetched members.
*/
fetchAllMembers() {
this.shard.getGuildMembers(this.id, Math.ceil(this.memberCount / 1000)); // TODO Promise with chunk timeout
fetchAllMembers(timeout) {
return this.shard.getGuildMembers(this.id, Math.ceil(this.memberCount / 1000), timeout);
}

get iconURL() {
Expand Down

0 comments on commit 9eee8ed

Please sign in to comment.