From a2ed9bf22865171e3804c645ca55c7a135f8825d Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Thu, 29 Oct 2015 18:05:41 +0000 Subject: [PATCH] add catchup options --- lib/Client.js | 112 ++++++++++++++++++++++++++++++++++++----- lib/message.js | 1 - src/Client.js | 133 +++++++++++++++++++++++++++++++++++++------------ src/message.js | 1 - test/bot.1.js | 18 +++---- 5 files changed, 206 insertions(+), 59 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 14d918c0f..2b2d54a77 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -48,7 +48,7 @@ var Client = (function (_EventEmitter) { _EventEmitter.call(this); this.options = options; - this.options.catchup = fals;e; + this.options.catchup = options.catchup; this.options.compress = options.compress; if (this.options.compress) { @@ -86,6 +86,7 @@ var Client = (function (_EventEmitter) { this.guildRoleCreateIgnoreList = {}; this.__idleTime = null; this.__gameId = null; + this.timeoffset = 0; } Client.prototype.sendPacket = function sendPacket(JSONObject) { @@ -450,7 +451,8 @@ var Client = (function (_EventEmitter) { Client.prototype.getChannelLogs = function getChannelLogs(channel) { var amount = arguments.length <= 1 || arguments[1] === undefined ? 500 : arguments[1]; - var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err, logs) {} : arguments[2]; + var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + var callback = arguments.length <= 3 || arguments[3] === undefined ? function (err, logs) {} : arguments[3]; var self = this; @@ -461,7 +463,18 @@ var Client = (function (_EventEmitter) { channelID = channel.id; } - request.get(Endpoints.CHANNELS + "/" + channelID + "/messages?limit=" + amount).set("authorization", self.token).end(function (err, res) { + var params = []; + if (options.before) { + params.push("before=" + (options.before instanceof Message ? options.before.id : options.before)); + } + if (options.after) { + params.push("after=" + (options.after instanceof Message ? options.after.id : options.after)); + } + + var joinedParams = params.join(); + if (joinedParams !== "") joinedParams = "&" + params.join(); + + request.get(Endpoints.CHANNELS + "/" + channelID + "/messages?limit=" + amount + joinedParams).set("authorization", self.token).end(function (err, res) { if (err) { callback(err); @@ -1158,6 +1171,8 @@ var Client = (function (_EventEmitter) { case "READY": + var fs = require("fs");fs.writeFileSync("c:/users/amish/desktop/crapatack.json", JSON.stringify(data)); + self.debug("received ready packet"); self.user = self.addUser(data.user); @@ -1203,7 +1218,7 @@ var Client = (function (_EventEmitter) { setInterval(function () { self.keepAlive.apply(self); }, data.heartbeat_interval); - + self.checkCatchUp(data.read_state); break; case "MESSAGE_CREATE": self.debug("received message"); @@ -1235,6 +1250,8 @@ var Client = (function (_EventEmitter) { self.emit("message", msg); } + self.ack(msg); + break; case "MESSAGE_DELETE": self.debug("message deleted"); @@ -1886,11 +1903,21 @@ var Client = (function (_EventEmitter) { }); }; + Client.prototype.ack = function ack(msg) { + request.post(Endpoints.CHANNELS + "/" + msg.channel.id + "/messages/" + msg.id + "/ack").set("authorization", this.token).end(function (err, res) { + if (err) { + console.log(err); + process.exit(); + } + }); + }; + Client.prototype._sendMessage = function _sendMessage(destination, content, options, mentions) { var self = this; return new Promise(function (resolve, reject) { + var lag = Date.now(); request.post(Endpoints.CHANNELS + "/" + destination + "/messages").set("authorization", self.token).send({ content: content, mentions: mentions, @@ -1900,6 +1927,10 @@ var Client = (function (_EventEmitter) { if (err) { reject(err); } else { + + lag -= Date.parse(res.body.timestamp); + self.timeoffset = lag; + var data = res.body; var mentions = []; @@ -2133,6 +2164,61 @@ var Client = (function (_EventEmitter) { } }; + Client.prototype.checkCatchUp = function checkCatchUp(rstate) { + var self = this; + if (self.options.catchup) { + // mention_count, last_message_id, id + rstate.forEach(function (catchup, index) { + if (self.options.catchupAll) { + self.getChannelLogs(catchup.id, 100000, { after: catchup.last_message_id }).then(function (results) { + + for (var _iterator19 = results, _isArray19 = Array.isArray(_iterator19), _i19 = 0, _iterator19 = _isArray19 ? _iterator19 : _iterator19[Symbol.iterator]();;) { + var _ref19; + + if (_isArray19) { + if (_i19 >= _iterator19.length) break; + _ref19 = _iterator19[_i19++]; + } else { + _i19 = _iterator19.next(); + if (_i19.done) break; + _ref19 = _i19.value; + } + + var m = _ref19; + + if (self.options.catchupIsolate) self.emit("catchupMessage", m);else self.emit("message", m); + } + + self.ack(results[0]); + }); + } else { + self.getChannelLogs(catchup.id, 2500).then(function (results) { + + for (var _iterator20 = results, _isArray20 = Array.isArray(_iterator20), _i20 = 0, _iterator20 = _isArray20 ? _iterator20 : _iterator20[Symbol.iterator]();;) { + var _ref20; + + if (_isArray20) { + if (_i20 >= _iterator20.length) break; + _ref20 = _iterator20[_i20++]; + } else { + _i20 = _iterator20.next(); + if (_i20.done) break; + _ref20 = _i20.value; + } + + var m = _ref20; + + if (m.id == catchup.last_message_id) break; + if (self.options.catchupIsolate) self.emit("catchupMessage", m);else self.emit("message", m); + } + + self.ack(results[0]); + }); + } + }); + } + }; + _createClass(Client, [{ key: "uptime", get: function get() { @@ -2169,19 +2255,19 @@ var Client = (function (_EventEmitter) { get: function get() { var msgs = []; - for (var _iterator19 = this.channelCache, _isArray19 = Array.isArray(_iterator19), _i19 = 0, _iterator19 = _isArray19 ? _iterator19 : _iterator19[Symbol.iterator]();;) { - var _ref19; + for (var _iterator21 = this.channelCache, _isArray21 = Array.isArray(_iterator21), _i21 = 0, _iterator21 = _isArray21 ? _iterator21 : _iterator21[Symbol.iterator]();;) { + var _ref21; - if (_isArray19) { - if (_i19 >= _iterator19.length) break; - _ref19 = _iterator19[_i19++]; + if (_isArray21) { + if (_i21 >= _iterator21.length) break; + _ref21 = _iterator21[_i21++]; } else { - _i19 = _iterator19.next(); - if (_i19.done) break; - _ref19 = _i19.value; + _i21 = _iterator21.next(); + if (_i21.done) break; + _ref21 = _i21.value; } - var channel = _ref19; + var channel = _ref21; msgs = msgs.concat(channel.messages); } diff --git a/lib/message.js b/lib/message.js index 862794826..c9cf1a152 100644 --- a/lib/message.js +++ b/lib/message.js @@ -18,7 +18,6 @@ var Message = (function () { this.everyoneMentioned = data.mention_everyone; this.id = data.id; this.embeds = []; - if (data.embeds) { for (var _iterator = data.embeds, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; diff --git a/src/Client.js b/src/Client.js index f06081a60..39b001783 100644 --- a/src/Client.js +++ b/src/Client.js @@ -35,7 +35,7 @@ class Client extends EventEmitter { super(); this.options = options; - this.options.catchup options.catchup; + this.options.catchup = options.catchup; this.options.compress = options.compress; if (this.options.compress) { @@ -73,6 +73,7 @@ class Client extends EventEmitter { this.guildRoleCreateIgnoreList = {}; this.__idleTime = null; this.__gameId = null; + this.timeoffset = 0; } get uptime() { @@ -512,7 +513,7 @@ class Client extends EventEmitter { }); } - getChannelLogs(channel, amount = 500, callback = function (err, logs) { }) { + getChannelLogs(channel, amount = 500, options = {}, callback = function (err, logs) { }) { var self = this; @@ -523,8 +524,20 @@ class Client extends EventEmitter { channelID = channel.id; } + var params = []; + if (options.before) { + params.push("before=" + (options.before instanceof Message ? options.before.id : options.before)); + } + if (options.after) { + params.push("after=" + (options.after instanceof Message ? options.after.id : options.after)); + } + + var joinedParams = params.join(); + if (joinedParams !== "") + joinedParams = "&" + params.join(); + request - .get(`${Endpoints.CHANNELS}/${channelID}/messages?limit=${amount}`) + .get(`${Endpoints.CHANNELS}/${channelID}/messages?limit=${amount}${joinedParams}`) .set("authorization", self.token) .end(function (err, res) { @@ -560,7 +573,6 @@ class Client extends EventEmitter { } }); - }); } @@ -1138,39 +1150,39 @@ class Client extends EventEmitter { } } - - getBans(serverResource, callback=function(err, arrayOfBans){}){ - + + getBans(serverResource, callback = function (err, arrayOfBans) { }) { + var self = this; - return new Promise(function(resolve, reject){ - + return new Promise(function (resolve, reject) { + var serverID = self.resolveServerID(serverResource); - + request .get(`${Endpoints.SERVERS}/${serverID}/bans`) .set("authorization", self.token) - .end(function(err, res){ - - if(err){ + .end(function (err, res) { + + if (err) { callback(err); reject(err); - }else{ - + } else { + var banList = []; - - for(var user of res.body){ - banList.push( self.addUser(user.user) ); + + for (var user of res.body) { + banList.push(self.addUser(user.user)); } - + callback(null, banList); resolve(banList); - + } - + }); - + }); - + } //def createws @@ -1219,7 +1231,9 @@ class Client extends EventEmitter { switch (dat.t) { case "READY": - + + var fs = require("fs"); fs.writeFileSync("c:/users/amish/desktop/crapatack.json", JSON.stringify(data)); + self.debug("received ready packet"); self.user = self.addUser(data.user); @@ -1241,7 +1255,7 @@ class Client extends EventEmitter { setInterval(function () { self.keepAlive.apply(self); }, data.heartbeat_interval); - self.checkCatchUp(); + self.checkCatchUp(data.read_state); break; case "MESSAGE_CREATE": self.debug("received message"); @@ -1263,6 +1277,8 @@ class Client extends EventEmitter { self.emit("message", msg); } + self.ack(msg); + break; case "MESSAGE_DELETE": self.debug("message deleted"); @@ -1362,15 +1378,15 @@ class Client extends EventEmitter { } break; - + case "GUILD_UPDATE": - + var server = self.getServer("id", data.id); var newserver = self.addServer(data, true); - + self.serverCache.splice(self.serverCache.indexOf(server), 1); self.emit("serverUpdate", server, newserver); - + break; case "GUILD_CREATE": @@ -1664,7 +1680,7 @@ class Client extends EventEmitter { } //def addServer - addServer(data, force=false) { + addServer(data, force = false) { var self = this; var server = this.getServer("id", data.id); @@ -1683,7 +1699,7 @@ class Client extends EventEmitter { server.channels.push(this.addChannel(channel, server.id)); } } - if(data.presences){ + if (data.presences) { for (var presence of data.presences) { var user = self.getUser("id", presence.user.id); user.status = presence.status; @@ -1820,11 +1836,24 @@ class Client extends EventEmitter { }); } + ack(msg) { + request + .post(`${Endpoints.CHANNELS}/${msg.channel.id}/messages/${msg.id}/ack`) + .set("authorization", this.token) + .end(function (err, res) { + if (err) { + console.log(err); + process.exit(); + } + }); + } + _sendMessage(destination, content, options, mentions) { var self = this; return new Promise(function (resolve, reject) { + var lag = Date.now(); request .post(`${Endpoints.CHANNELS}/${destination}/messages`) .set("authorization", self.token) @@ -1838,6 +1867,10 @@ class Client extends EventEmitter { if (err) { reject(err); } else { + + lag -= Date.parse(res.body.timestamp); + self.timeoffset = lag; + var data = res.body; var mentions = []; @@ -2075,9 +2108,43 @@ class Client extends EventEmitter { } } + + checkCatchUp(rstate) { + var self = this; + if (self.options.catchup) { + // mention_count, last_message_id, id + rstate.forEach(function (catchup, index) { + if(self.options.catchupAll){ + self.getChannelLogs(catchup.id, 100000, {after:catchup.last_message_id}).then((results) => { - checkCatchUp(){ - + for (var m of results) { + if(self.options.catchupIsolate) + self.emit("catchupMessage", m); + else + self.emit("message", m); + } + + self.ack(results[0]); + + }); + }else{ + self.getChannelLogs(catchup.id, 2500).then((results) => { + + for (var m of results) { + if(m.id == catchup.last_message_id) + break; + if(self.options.catchupIsolate) + self.emit("catchupMessage", m); + else + self.emit("message", m); + } + + self.ack(results[0]); + + }); + } + }); + } } } diff --git a/src/message.js b/src/message.js index df3820d53..796c8dc5f 100644 --- a/src/message.js +++ b/src/message.js @@ -10,7 +10,6 @@ class Message { this.everyoneMentioned = data.mention_everyone; this.id = data.id; this.embeds = []; - if (data.embeds) { for (var embed of data.embeds) { this.embeds.push( Embeddable.createEmbed(embed) ); diff --git a/test/bot.1.js b/test/bot.1.js index dab1a0e15..2886695e0 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -1,7 +1,8 @@ var Discord = require("../"); var Member = require("../lib/Member.js"); var mybot = new Discord.Client({ - compress : true + compress : true, + catchup : true }); var fs = require("fs"); var request = require("request").defaults({ encoding: null }); @@ -12,7 +13,8 @@ var server, channel, message, sentMessage = false; mybot.on("message", function (message) { - console.log("Everyone mentioned? " + message.everyoneMentioned); + console.log("Everyone mentioned? " + doned); + doned++; if (message.content.substr(0, 3) !== "$$$") { return; } @@ -26,13 +28,11 @@ mybot.on("message", function (message) { user = message.sender; } - mybot.getChannelLogs(message.channel, 5000).then((messages)=>{ - for(var msg of messages){ - mybot.deleteMessage(msg); - } - }) + mybot.reply(message, "Hello! It has been " + ((Date.now() - message.timestamp) - this.timeoffset) + "ms since you sent that."); }); +var doned = 0; + mybot.once("ready", function () { console.log("im ready"); @@ -46,16 +46,12 @@ mybot.once("ready", function () { mybot.on("messageUpdate", function(newMessage, oldMessage){ // links and videos will create a loop - mybot.reply(newMessage, JSON.stringify(newMessage.embeds, null, 4)); }) mybot.on("serverUpdate", function (oldserver, newserver) { console.log("server changed! " + mybot.servers.length); }) -mybot.on("unknown", function (info) { - console.log("unknown!", info); -}) mybot.on("channelUpdate", function (oldChan, newChan) {