add catchup options

This commit is contained in:
hydrabolt
2015-10-29 18:05:41 +00:00
parent b6955e771e
commit a2ed9bf228
5 changed files with 206 additions and 59 deletions

View File

@@ -48,7 +48,7 @@ var Client = (function (_EventEmitter) {
_EventEmitter.call(this); _EventEmitter.call(this);
this.options = options; this.options = options;
this.options.catchup = fals;e; this.options.catchup = options.catchup;
this.options.compress = options.compress; this.options.compress = options.compress;
if (this.options.compress) { if (this.options.compress) {
@@ -86,6 +86,7 @@ var Client = (function (_EventEmitter) {
this.guildRoleCreateIgnoreList = {}; this.guildRoleCreateIgnoreList = {};
this.__idleTime = null; this.__idleTime = null;
this.__gameId = null; this.__gameId = null;
this.timeoffset = 0;
} }
Client.prototype.sendPacket = function sendPacket(JSONObject) { Client.prototype.sendPacket = function sendPacket(JSONObject) {
@@ -450,7 +451,8 @@ var Client = (function (_EventEmitter) {
Client.prototype.getChannelLogs = function getChannelLogs(channel) { Client.prototype.getChannelLogs = function getChannelLogs(channel) {
var amount = arguments.length <= 1 || arguments[1] === undefined ? 500 : arguments[1]; 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; var self = this;
@@ -461,7 +463,18 @@ var Client = (function (_EventEmitter) {
channelID = channel.id; 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) { if (err) {
callback(err); callback(err);
@@ -1158,6 +1171,8 @@ var Client = (function (_EventEmitter) {
case "READY": case "READY":
var fs = require("fs");fs.writeFileSync("c:/users/amish/desktop/crapatack.json", JSON.stringify(data));
self.debug("received ready packet"); self.debug("received ready packet");
self.user = self.addUser(data.user); self.user = self.addUser(data.user);
@@ -1203,7 +1218,7 @@ var Client = (function (_EventEmitter) {
setInterval(function () { setInterval(function () {
self.keepAlive.apply(self); self.keepAlive.apply(self);
}, data.heartbeat_interval); }, data.heartbeat_interval);
self.checkCatchUp(data.read_state);
break; break;
case "MESSAGE_CREATE": case "MESSAGE_CREATE":
self.debug("received message"); self.debug("received message");
@@ -1235,6 +1250,8 @@ var Client = (function (_EventEmitter) {
self.emit("message", msg); self.emit("message", msg);
} }
self.ack(msg);
break; break;
case "MESSAGE_DELETE": case "MESSAGE_DELETE":
self.debug("message deleted"); 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) { Client.prototype._sendMessage = function _sendMessage(destination, content, options, mentions) {
var self = this; var self = this;
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
var lag = Date.now();
request.post(Endpoints.CHANNELS + "/" + destination + "/messages").set("authorization", self.token).send({ request.post(Endpoints.CHANNELS + "/" + destination + "/messages").set("authorization", self.token).send({
content: content, content: content,
mentions: mentions, mentions: mentions,
@@ -1900,6 +1927,10 @@ var Client = (function (_EventEmitter) {
if (err) { if (err) {
reject(err); reject(err);
} else { } else {
lag -= Date.parse(res.body.timestamp);
self.timeoffset = lag;
var data = res.body; var data = res.body;
var mentions = []; 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, [{ _createClass(Client, [{
key: "uptime", key: "uptime",
get: function get() { get: function get() {
@@ -2169,19 +2255,19 @@ var Client = (function (_EventEmitter) {
get: function get() { get: function get() {
var msgs = []; var msgs = [];
for (var _iterator19 = this.channelCache, _isArray19 = Array.isArray(_iterator19), _i19 = 0, _iterator19 = _isArray19 ? _iterator19 : _iterator19[Symbol.iterator]();;) { for (var _iterator21 = this.channelCache, _isArray21 = Array.isArray(_iterator21), _i21 = 0, _iterator21 = _isArray21 ? _iterator21 : _iterator21[Symbol.iterator]();;) {
var _ref19; var _ref21;
if (_isArray19) { if (_isArray21) {
if (_i19 >= _iterator19.length) break; if (_i21 >= _iterator21.length) break;
_ref19 = _iterator19[_i19++]; _ref21 = _iterator21[_i21++];
} else { } else {
_i19 = _iterator19.next(); _i21 = _iterator21.next();
if (_i19.done) break; if (_i21.done) break;
_ref19 = _i19.value; _ref21 = _i21.value;
} }
var channel = _ref19; var channel = _ref21;
msgs = msgs.concat(channel.messages); msgs = msgs.concat(channel.messages);
} }

View File

@@ -18,7 +18,6 @@ var Message = (function () {
this.everyoneMentioned = data.mention_everyone; this.everyoneMentioned = data.mention_everyone;
this.id = data.id; this.id = data.id;
this.embeds = []; this.embeds = [];
if (data.embeds) { if (data.embeds) {
for (var _iterator = data.embeds, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { for (var _iterator = data.embeds, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref; var _ref;

View File

@@ -35,7 +35,7 @@ class Client extends EventEmitter {
super(); super();
this.options = options; this.options = options;
this.options.catchup options.catchup; this.options.catchup = options.catchup;
this.options.compress = options.compress; this.options.compress = options.compress;
if (this.options.compress) { if (this.options.compress) {
@@ -73,6 +73,7 @@ class Client extends EventEmitter {
this.guildRoleCreateIgnoreList = {}; this.guildRoleCreateIgnoreList = {};
this.__idleTime = null; this.__idleTime = null;
this.__gameId = null; this.__gameId = null;
this.timeoffset = 0;
} }
get uptime() { 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; var self = this;
@@ -523,8 +524,20 @@ class Client extends EventEmitter {
channelID = channel.id; 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 request
.get(`${Endpoints.CHANNELS}/${channelID}/messages?limit=${amount}`) .get(`${Endpoints.CHANNELS}/${channelID}/messages?limit=${amount}${joinedParams}`)
.set("authorization", self.token) .set("authorization", self.token)
.end(function (err, res) { .end(function (err, res) {
@@ -560,7 +573,6 @@ class Client extends EventEmitter {
} }
}); });
}); });
} }
@@ -1139,27 +1151,27 @@ class Client extends EventEmitter {
} }
getBans(serverResource, callback=function(err, arrayOfBans){}){ getBans(serverResource, callback = function (err, arrayOfBans) { }) {
var self = this; var self = this;
return new Promise(function(resolve, reject){ return new Promise(function (resolve, reject) {
var serverID = self.resolveServerID(serverResource); var serverID = self.resolveServerID(serverResource);
request request
.get(`${Endpoints.SERVERS}/${serverID}/bans`) .get(`${Endpoints.SERVERS}/${serverID}/bans`)
.set("authorization", self.token) .set("authorization", self.token)
.end(function(err, res){ .end(function (err, res) {
if(err){ if (err) {
callback(err); callback(err);
reject(err); reject(err);
}else{ } else {
var banList = []; var banList = [];
for(var user of res.body){ for (var user of res.body) {
banList.push( self.addUser(user.user) ); banList.push(self.addUser(user.user));
} }
callback(null, banList); callback(null, banList);
@@ -1220,6 +1232,8 @@ class Client extends EventEmitter {
case "READY": case "READY":
var fs = require("fs"); fs.writeFileSync("c:/users/amish/desktop/crapatack.json", JSON.stringify(data));
self.debug("received ready packet"); self.debug("received ready packet");
self.user = self.addUser(data.user); self.user = self.addUser(data.user);
@@ -1241,7 +1255,7 @@ class Client extends EventEmitter {
setInterval(function () { setInterval(function () {
self.keepAlive.apply(self); self.keepAlive.apply(self);
}, data.heartbeat_interval); }, data.heartbeat_interval);
self.checkCatchUp(); self.checkCatchUp(data.read_state);
break; break;
case "MESSAGE_CREATE": case "MESSAGE_CREATE":
self.debug("received message"); self.debug("received message");
@@ -1263,6 +1277,8 @@ class Client extends EventEmitter {
self.emit("message", msg); self.emit("message", msg);
} }
self.ack(msg);
break; break;
case "MESSAGE_DELETE": case "MESSAGE_DELETE":
self.debug("message deleted"); self.debug("message deleted");
@@ -1664,7 +1680,7 @@ class Client extends EventEmitter {
} }
//def addServer //def addServer
addServer(data, force=false) { addServer(data, force = false) {
var self = this; var self = this;
var server = this.getServer("id", data.id); var server = this.getServer("id", data.id);
@@ -1683,7 +1699,7 @@ class Client extends EventEmitter {
server.channels.push(this.addChannel(channel, server.id)); server.channels.push(this.addChannel(channel, server.id));
} }
} }
if(data.presences){ if (data.presences) {
for (var presence of data.presences) { for (var presence of data.presences) {
var user = self.getUser("id", presence.user.id); var user = self.getUser("id", presence.user.id);
user.status = presence.status; 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) { _sendMessage(destination, content, options, mentions) {
var self = this; var self = this;
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
var lag = Date.now();
request request
.post(`${Endpoints.CHANNELS}/${destination}/messages`) .post(`${Endpoints.CHANNELS}/${destination}/messages`)
.set("authorization", self.token) .set("authorization", self.token)
@@ -1838,6 +1867,10 @@ class Client extends EventEmitter {
if (err) { if (err) {
reject(err); reject(err);
} else { } else {
lag -= Date.parse(res.body.timestamp);
self.timeoffset = lag;
var data = res.body; var data = res.body;
var mentions = []; var mentions = [];
@@ -2076,8 +2109,42 @@ class Client extends EventEmitter {
} }
checkCatchUp(){ 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) => {
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]);
});
}
});
}
} }
} }

View File

@@ -10,7 +10,6 @@ class Message {
this.everyoneMentioned = data.mention_everyone; this.everyoneMentioned = data.mention_everyone;
this.id = data.id; this.id = data.id;
this.embeds = []; this.embeds = [];
if (data.embeds) { if (data.embeds) {
for (var embed of data.embeds) { for (var embed of data.embeds) {
this.embeds.push( Embeddable.createEmbed(embed) ); this.embeds.push( Embeddable.createEmbed(embed) );

View File

@@ -1,7 +1,8 @@
var Discord = require("../"); var Discord = require("../");
var Member = require("../lib/Member.js"); var Member = require("../lib/Member.js");
var mybot = new Discord.Client({ var mybot = new Discord.Client({
compress : true compress : true,
catchup : true
}); });
var fs = require("fs"); var fs = require("fs");
var request = require("request").defaults({ encoding: null }); var request = require("request").defaults({ encoding: null });
@@ -12,7 +13,8 @@ var server, channel, message, sentMessage = false;
mybot.on("message", function (message) { mybot.on("message", function (message) {
console.log("Everyone mentioned? " + message.everyoneMentioned); console.log("Everyone mentioned? " + doned);
doned++;
if (message.content.substr(0, 3) !== "$$$") { if (message.content.substr(0, 3) !== "$$$") {
return; return;
} }
@@ -26,13 +28,11 @@ mybot.on("message", function (message) {
user = message.sender; user = message.sender;
} }
mybot.getChannelLogs(message.channel, 5000).then((messages)=>{ mybot.reply(message, "Hello! It has been " + ((Date.now() - message.timestamp) - this.timeoffset) + "ms since you sent that.");
for(var msg of messages){
mybot.deleteMessage(msg);
}
})
}); });
var doned = 0;
mybot.once("ready", function () { mybot.once("ready", function () {
console.log("im ready"); console.log("im ready");
@@ -46,16 +46,12 @@ mybot.once("ready", function () {
mybot.on("messageUpdate", function(newMessage, oldMessage){ mybot.on("messageUpdate", function(newMessage, oldMessage){
// links and videos will create a loop // links and videos will create a loop
mybot.reply(newMessage, JSON.stringify(newMessage.embeds, null, 4));
}) })
mybot.on("serverUpdate", function (oldserver, newserver) { mybot.on("serverUpdate", function (oldserver, newserver) {
console.log("server changed! " + mybot.servers.length); console.log("server changed! " + mybot.servers.length);
}) })
mybot.on("unknown", function (info) {
console.log("unknown!", info);
})
mybot.on("channelUpdate", function (oldChan, newChan) { mybot.on("channelUpdate", function (oldChan, newChan) {