Add guild.fetchMembers() 🎉🎉

This commit is contained in:
Amish Shah
2016-08-29 13:20:00 +01:00
parent 727f3de45b
commit 001460acc0
5 changed files with 41 additions and 3 deletions

File diff suppressed because one or more lines are too long

View File

@@ -15,6 +15,7 @@ class GuildMemberRemoveAction extends Action {
if (guild) {
let member = guild.members.get(data.user.id);
if (member) {
guild.memberCount--;
guild._removeMember(member);
this.deleted[guild.id + data.user.id] = member;
client.emit(Constants.Events.GUILD_MEMBER_REMOVE, guild, member);

View File

@@ -11,6 +11,7 @@ class GuildMemberAddHandler extends AbstractHandler {
const guild = client.guilds.get(data.guild_id);
if (guild) {
guild.memberCount++;
guild._addMember(data);
}
}

View File

@@ -9,14 +9,14 @@ class GuildMembersChunkHandler extends AbstractHandler {
const data = packet.d;
const client = this.packetManager.client;
const guild = client.guilds.get(data.guild_id);
const members = [];
if (guild) {
for (const member of guild.members) {
for (const member of data.members) {
members.push(guild._addMember(member, true));
}
}
guild._checkChunks();
client.emit(Constants.Events.GUILD_MEMBERS_CHUNK, guild, members);
}

View File

@@ -70,6 +70,15 @@ class Guild {
}
}
_checkChunks() {
if (this._fetchWaiter) {
if (this.members.size === this.memberCount) {
this._fetchWaiter(this);
this._fetchWaiter = null;
}
}
}
_addMember(guildUser, noEvent) {
if (!(guildUser.user instanceof User)) {
guildUser.user = this.client.dataManager.newUser(guildUser.user);
@@ -100,6 +109,7 @@ class Guild {
this.client.emit(Constants.Events.GUILD_MEMBER_ADD, this, member);
}
this._checkChunks();
return member;
}
@@ -136,6 +146,7 @@ class Guild {
_removeMember(guildMember) {
this.members.delete(guildMember.id);
this._checkChunks();
}
/**
@@ -560,6 +571,31 @@ class Guild {
return this.client.rest.methods.getGuildInvites(this);
}
/**
* 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
* @returns {Promise<Guild, Error>}
*/
fetchMembers(query = '') {
return new Promise((resolve, reject) => {
if (this._fetchWaiter) {
throw new Error('already fetching guild members');
}
this._fetchWaiter = resolve;
this.client.ws.send({
op: Constants.OPCodes.REQUEST_GUILD_MEMBERS,
d: {
guild_id: this.id,
query,
limit: 0,
},
});
this._checkChunks();
setTimeout(() => reject(new Error('members not here in time')), 10000);
});
}
/**
* Gets the URL to this guild's icon (if it has one, otherwise it returns null)
* @type {?String}