forceFetch fix

This commit is contained in:
abalabahaha
2016-04-12 23:01:45 -07:00
parent 78edc3b371
commit 71dd084667
2 changed files with 358 additions and 317 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -127,6 +127,10 @@ export default class InternalClient {
this.readyTime = null; this.readyTime = null;
this.messageAwaits = {}; this.messageAwaits = {};
this.forceFetchCount = {};
this.forceFetchQueue = [];
this.forceFetchLength = 1;
this.tokenCacher = new TokenCacher(this.client); this.tokenCacher = new TokenCacher(this.client);
this.tokenCacher.init(0); this.tokenCacher.init(0);
} }
@@ -208,7 +212,7 @@ export default class InternalClient {
} else { } else {
// preserve old functionality for non-bots // preserve old functionality for non-bots
if (this.voiceConnections[0]) { if (this.voiceConnections[0]) {
this.voiceConnections[0].destroy(); this.voiceConnections[0].destroy();
} }
return Promise.resolve(); return Promise.resolve();
} }
@@ -309,29 +313,44 @@ export default class InternalClient {
return this.voiceConnections[0]; return this.voiceConnections[0];
} }
// def forceFetchUsers getGuildMembers(guildID, chunkCount) {
forceFetchUsers() { this.forceFetchCount[guildID] = chunkCount;
this.sendWS({ if(this.forceFetchLength + 3 + guildID.length > 4082) { // 4096 - '{"op":8,"d":[]}'.length + 1 for lazy comma offset
op : 8, this.requestGuildMembers(this.forceFetchQueue);
d : { this.forceFetchQueue = [guildID];
guild_id : this.servers.filter(srv => srv.large && srv.memberCount > srv.members.length).map(srv => srv.id), this.forceFetchLength = 1 + guildID.length + 3;
query : "", } else {
limit : 0 this.forceFetchQueue.push(guildID);
} this.forceFetchLength += guildID.length + 3;
});
this.chunkloaderCount = {};
for (var server of this.servers.filter(srv => srv.large && srv.memberCount > srv.members.length)) {
this.chunkloaderCount[server.id] = Math.ceil(server.memberCount / 1000);
} }
return new Promise((resolve, reject) => { }
if (!server) {
resolve(); requestGuildMembers(guildID, query, limit) {
} else { this.sendWS(OPCodes.GET_GUILD_MEMBERS, {
this.chunkloaderCallback = resolve; guild_id: guildID,
} query: query || "",
limit: limit || 0
}); });
} }
checkReady() {
if(!this.readyTime) {
if(this.forceFetchQueue.length > 0) {
this.requestGuildMembers(this.forceFetchQueue);
this.forceFetchQueue = [];
this.forceFetchLength = 1;
} else {
for (var key in this.forceFetchCount) {
if (this.forceFetchCount.hasOwnProperty(key)) {
return;
}
}
this.readyTime = Date.now();
client.emit("ready");
}
}
}
// def createServer // def createServer
createServer(name, region = "london") { createServer(name, region = "london") {
name = this.resolver.resolveString(name); name = this.resolver.resolveString(name);
@@ -1298,9 +1317,12 @@ export default class InternalClient {
self.user = self.users.add(new User(data.user, client)); self.user = self.users.add(new User(data.user, client));
data.guilds.forEach(server => { data.guilds.forEach(server => {
if (!server.unavailable) { if (!server.unavailable) {
self.servers.add(new Server(server, client)); server = self.servers.add(new Server(server, client));
if(self.options.forceFetchUsers && server.members && server.members.length < server.memberCount) {
self.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000));
}
} else { } else {
client.emit("warn", "server was unavailable, could not create (ready)"); client.emit("warn", "server " + guild.id + " was unavailable, could not create (ready)");
} }
}); });
data.private_channels.forEach(pm => { data.private_channels.forEach(pm => {
@@ -1328,13 +1350,7 @@ export default class InternalClient {
client.emit("debug", `ready packet took ${Date.now() - startTime}ms to process`); client.emit("debug", `ready packet took ${Date.now() - startTime}ms to process`);
client.emit("debug", `ready with ${self.servers.length} servers, ${self.channels.length} channels and ${self.users.length} users cached.`); client.emit("debug", `ready with ${self.servers.length} servers, ${self.channels.length} channels and ${self.users.length} users cached.`);
self.readyTime = Date.now(); self.checkReady();
if (self.client.options.forceFetchUsers) {
self.forceFetchUsers().then(() => {client.emit("ready")});
} else {
client.emit("ready");
}
break; break;
case PacketType.MESSAGE_CREATE: case PacketType.MESSAGE_CREATE:
@@ -1399,11 +1415,10 @@ export default class InternalClient {
var server = self.servers.get("id", data.id); var server = self.servers.get("id", data.id);
if (!server) { if (!server) {
if (!data.unavailable) { if (!data.unavailable) {
server = new Server(data, client) server = self.servers.add(new Server(data, client));
self.servers.add(server);
client.emit("serverCreated", server); client.emit("serverCreated", server);
if (server.large && server.members.length < server.memberCount) { if (self.options.forceFetchUsers && server.large && server.members.length < server.memberCount) {
self.sendWS({op: 8, d: {guild_id: server.id, query: "", limit: 0}}); self.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000));
} }
} else { } else {
client.emit("warn", "server was unavailable, could not create"); client.emit("warn", "server was unavailable, could not create");
@@ -1800,16 +1815,33 @@ export default class InternalClient {
server.members.add(self.users.add(new User(user.user, client))); server.members.add(self.users.add(new User(user.user, client)));
} }
if (self.chunkloaderCallback && server.id in self.chunkloaderCount) { xxxx
self.chunkloaderCount[server.id]--; xxxx
if (self.chunkloaderCount[server.id] <= 0) { xxxx
delete self.chunkloaderCount[server.id]; xxxx
if (Object.keys(self.chunkloaderCount).length == 0) { xxxx
self.chunkloaderCallback(); xxxx
self.chunkloaderCallback = null; xxxx
} xxxx
} xxxx
} xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
xxxx
client.emit("debug", (new Date().getTime() - testtime) + "ms for " + data.members.length + " user chunk for server with id " + server.id); client.emit("debug", (new Date().getTime() - testtime) + "ms for " + data.members.length + " user chunk for server with id " + server.id);