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) { if (guild) {
let member = guild.members.get(data.user.id); let member = guild.members.get(data.user.id);
if (member) { if (member) {
guild.memberCount--;
guild._removeMember(member); guild._removeMember(member);
this.deleted[guild.id + data.user.id] = member; this.deleted[guild.id + data.user.id] = member;
client.emit(Constants.Events.GUILD_MEMBER_REMOVE, guild, 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); const guild = client.guilds.get(data.guild_id);
if (guild) { if (guild) {
guild.memberCount++;
guild._addMember(data); guild._addMember(data);
} }
} }

View File

@@ -9,14 +9,14 @@ class GuildMembersChunkHandler extends AbstractHandler {
const data = packet.d; const data = packet.d;
const client = this.packetManager.client; const client = this.packetManager.client;
const guild = client.guilds.get(data.guild_id); const guild = client.guilds.get(data.guild_id);
const members = []; const members = [];
if (guild) { if (guild) {
for (const member of guild.members) { for (const member of data.members) {
members.push(guild._addMember(member, true)); members.push(guild._addMember(member, true));
} }
} }
guild._checkChunks();
client.emit(Constants.Events.GUILD_MEMBERS_CHUNK, guild, members); 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) { _addMember(guildUser, noEvent) {
if (!(guildUser.user instanceof User)) { if (!(guildUser.user instanceof User)) {
guildUser.user = this.client.dataManager.newUser(guildUser.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.client.emit(Constants.Events.GUILD_MEMBER_ADD, this, member);
} }
this._checkChunks();
return member; return member;
} }
@@ -136,6 +146,7 @@ class Guild {
_removeMember(guildMember) { _removeMember(guildMember) {
this.members.delete(guildMember.id); this.members.delete(guildMember.id);
this._checkChunks();
} }
/** /**
@@ -560,6 +571,31 @@ class Guild {
return this.client.rest.methods.getGuildInvites(this); 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) * Gets the URL to this guild's icon (if it has one, otherwise it returns null)
* @type {?String} * @type {?String}