diff --git a/docs/docs_client.rst b/docs/docs_client.rst index 62ec89d06..468915a05 100644 --- a/docs/docs_client.rst +++ b/docs/docs_client.rst @@ -564,6 +564,11 @@ Overwrites the permissions of a role or a user in a channel "attachFiles" : true } +forceFetchUsers() +~~~~~~~~~~~~~~~~~ + +As of 12/02/2016, the API will now only return the online users in a server if it has more than 250 users. If you want to be aware of ALL users in a server, use this function. As of yet, it doesn't return anything and users are just silently and gradually added to the relevant servers. + Events ------ diff --git a/lib/Client/Client.js b/lib/Client/Client.js index 8f6175940..75a361733 100644 --- a/lib/Client/Client.js +++ b/lib/Client/Client.js @@ -675,6 +675,12 @@ var Client = (function (_EventEmitter) { return this.setStatus(null, game, callback); }; + //def forceFetchUsers + + Client.prototype.forceFetchUsers = function forceFetchUsers() { + return this.internal.forceFetchUsers(); + }; + _createClass(Client, [{ key: "users", get: function get() { diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index e06b26dfd..ec953262e 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -319,6 +319,21 @@ var InternalClient = (function () { }); }; + // def forceFetchUsers + + InternalClient.prototype.forceFetchUsers = function forceFetchUsers() { + this.sendWS({ + op: 8, + d: { + guild_id: this.servers.map(function (srv) { + return srv.id; + }), + query: "", + limit: 0 + } + }); + }; + // def createServer InternalClient.prototype.createServer = function createServer(name) { @@ -1717,14 +1732,18 @@ var InternalClient = (function () { var user = self.users.get("id", data.user_id); var server = self.servers.get("id", data.guild_id); + console.log("2 meowwww"); if (user && server) { + console.log("1 meowwww"); if (data.channel_id) { // in voice channel + console.log("meowwww"); var channel = self.channels.get("id", data.channel_id); if (channel && channel.type === "voice") { server.eventVoiceStateUpdate(channel, user, data); } else { + console.log("mewarnow"); client.emit("warn", "voice state channel not in cache"); } } else { @@ -1735,6 +1754,33 @@ var InternalClient = (function () { client.emit("warn", "voice state update but user or server not in cache"); } + break; + case _Constants.PacketType.SERVER_MEMBERS_CHUNK: + + var server = self.servers.get("id", data.guild_id); + + if (server) { + + for (var _iterator6 = data.members, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref6; + + if (_isArray6) { + if (_i6 >= _iterator6.length) break; + _ref6 = _iterator6[_i6++]; + } else { + _i6 = _iterator6.next(); + if (_i6.done) break; + _ref6 = _i6.value; + } + + var user = _ref6; + + server.members.add(self.users.get("id", user.id) || self.users.add(new _StructuresUser2["default"](user, client))); + } + } else { + client.emit("warn", "chunk update received but server not in cache"); + } + break; default: client.emit("unknown", packet); diff --git a/lib/Constants.js b/lib/Constants.js index d6773a65a..0268950fe 100644 --- a/lib/Constants.js +++ b/lib/Constants.js @@ -126,6 +126,7 @@ var PacketType = { TYPING: "TYPING_START", SERVER_BAN_ADD: "GUILD_BAN_ADD", SERVER_BAN_REMOVE: "GUILD_BAN_REMOVE", - VOICE_STATE_UPDATE: "VOICE_STATE_UPDATE" + VOICE_STATE_UPDATE: "VOICE_STATE_UPDATE", + SERVER_MEMBERS_CHUNK: "GUILD_MEMBERS_CHUNK" }; exports.PacketType = PacketType; diff --git a/src/Client/Client.js b/src/Client/Client.js index 296d4b642..dd0199c25 100644 --- a/src/Client/Client.js +++ b/src/Client/Client.js @@ -556,4 +556,9 @@ export default class Client extends EventEmitter { setPlayingGame(game, callback = (/*err, {}*/) => { }) { return this.setStatus(null, game, callback); } + + //def forceFetchUsers + forceFetchUsers(){ + return this.internal.forceFetchUsers(); + } } diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js index 3c1d0fb5d..1d1838383 100644 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -249,6 +249,18 @@ export default class InternalClient { }); } + // def forceFetchUsers + forceFetchUsers(){ + this.sendWS({ + op : 8, + d : { + guild_id : this.servers.map(srv => srv.id), + query : "", + limit : 0 + } + }); + } + // def createServer createServer(name, region = "london") { name = this.resolver.resolveString(name); @@ -1526,6 +1538,21 @@ export default class InternalClient { client.emit("warn", "voice state update but user or server not in cache"); } + break; + case PacketType.SERVER_MEMBERS_CHUNK: + + var server = self.servers.get("id", data.guild_id); + + if(server){ + + for(var user of data.members){ + server.members.add(self.users.get("id", user.id) || self.users.add(new User(user, client))); + } + + }else{ + client.emit("warn", "chunk update received but server not in cache"); + } + break; default: client.emit("unknown", packet); diff --git a/src/Constants.js b/src/Constants.js index 4e5b31f8f..92c55fd3b 100644 --- a/src/Constants.js +++ b/src/Constants.js @@ -84,5 +84,6 @@ export const PacketType = { TYPING : "TYPING_START", SERVER_BAN_ADD : "GUILD_BAN_ADD", SERVER_BAN_REMOVE: "GUILD_BAN_REMOVE", - VOICE_STATE_UPDATE : "VOICE_STATE_UPDATE" + VOICE_STATE_UPDATE : "VOICE_STATE_UPDATE", + SERVER_MEMBERS_CHUNK : "GUILD_MEMBERS_CHUNK" }; diff --git a/test/msgbot.js b/test/msgbot.js index a718706f4..744614cc6 100644 --- a/test/msgbot.js +++ b/test/msgbot.js @@ -79,10 +79,13 @@ client.on("message", msg => { console.log("INIT"); +client.forceFetchUsers(); + client.on("debug", msg => console.log("[debug]", msg)); +client.on("unk", msg => console.log("[unknown]", msg)); client.login(process.env["ds_email"], process.env["ds_password"]).catch(console.log); -client.on("presence", (old, news) => console.log(`PRESENCE TEST ${old.username} $$ ${news.username}`)) +//client.on("presence", (old, news) => console.log(`PRESENCE TEST ${old.username} $$ ${news.username}`)) var chan1, chan2; var msg1, msg2;