diff --git a/lib/Client.js b/lib/Client.js index 40a50d048..1eb4e953b 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -61,7 +61,8 @@ var Client = (function () { this.serverCache = []; this.pmChannelCache = []; this.readyTime = null; - this.optionsQueue = {}; + this.checkingQueue = {}; + this.messageQueue = {}; } _createClass(Client, [{ @@ -607,7 +608,18 @@ var Client = (function () { if (self.options.queue) { //we're QUEUEING messages, so sending them sequentially based on servers. - self.addMessageQueue(destination); + if (!self.messageQueue[destination]) { + self.messageQueue[destination] = []; + } + + self.messageQueue[destination].push({ + content: message, + mentions: mentions, + then: [resolve, callback], + error: [reject, callback] + }); + + self.checkQueue(destination); } else { self._sendMessage(destination, message, mentions).then(mgood)["catch"](mbad); } @@ -1379,6 +1391,45 @@ var Client = (function () { }); }); } + }, { + key: "checkQueue", + value: function checkQueue(channelID) { + var _this = this; + + var self = this; + + if (!this.checkingQueue[channelID]) { + (function () { + var doNext = function doNext() { + if (self.messageQueue[channelID].length === 0) { + done(); + return; + } + var msgToSend = self.messageQueue[channelID][0]; + self._sendMessage(channelID, msgToSend.content, msgToSend.mentions).then(function (msg) { + msgToSend.then[0](msg); + msgToSend.then[1](null, msg); + self.messageQueue[channelID].shift(); + doNext(); + })["catch"](function (err) { + msgToSend["catch"][0](err); + msgToSend["catch"][1](err); + self.messageQueue[channelID].shift(); + doNext(); + }); + }; + + var done = function done() { + self.checkingQueue[channelID] = false; + return; + }; + + //if we aren't already checking this queue. + _this.checkingQueue[channelID] = true; + doNext(); + })(); + } + } }, { key: "uptime", get: function get() { diff --git a/src/Client.js b/src/Client.js index d0aa5d768..c58cdc2ab 100644 --- a/src/Client.js +++ b/src/Client.js @@ -51,7 +51,8 @@ class Client { this.serverCache = []; this.pmChannelCache = []; this.readyTime = null; - this.optionsQueue = {}; + this.checkingQueue = {}; + this.messageQueue = {}; } get uptime() { @@ -625,7 +626,18 @@ class Client { if(self.options.queue){ //we're QUEUEING messages, so sending them sequentially based on servers. - self.addMessageQueue(destination); + if(!self.messageQueue[destination]){ + self.messageQueue[destination] = []; + } + + self.messageQueue[destination].push({ + content : message, + mentions : mentions, + then : [resolve, callback], + error : [reject, callback] + }); + + self.checkQueue(destination); }else{ self._sendMessage(destination, message, mentions).then(mgood).catch(mbad); } @@ -1138,7 +1150,43 @@ class Client { }); } - + + checkQueue(channelID){ + + var self = this; + + if(!this.checkingQueue[channelID]){ + //if we aren't already checking this queue. + this.checkingQueue[channelID] = true; + doNext(); + + function doNext(){ + if(self.messageQueue[channelID].length === 0){ + done(); + return; + } + var msgToSend = self.messageQueue[channelID][0]; + self._sendMessage(channelID, msgToSend.content, msgToSend.mentions) + .then(function(msg){ + msgToSend.then[0](msg); + msgToSend.then[1](null, msg); + self.messageQueue[channelID].shift(); + doNext(); + }) + .catch(function(err){ + msgToSend.catch[0](err); + msgToSend.catch[1](err); + self.messageQueue[channelID].shift(); + doNext(); + }); + } + + function done(){ + self.checkingQueue[channelID] = false; + return; + } + } + } } function getGateway() { diff --git a/test/bot.1.js b/test/bot.1.js new file mode 100644 index 000000000..046cdaa3b --- /dev/null +++ b/test/bot.1.js @@ -0,0 +1,27 @@ +var Discord = require("../"); +var mybot = new Discord.Client({ + queue : true +}); + +var server, channel, message, sentMessage = false; + +mybot.on("message", function(message){ + + if(message.content === "$$$"){ + mybot.sendMessage(message.channel, "this is part 1"); + mybot.sendMessage(message.channel, "this is part 2"); + mybot.sendMessage(message.channel, "this is part 3"); + mybot.sendMessage(message.channel, "this is part 4"); + mybot.sendMessage(message.channel, "this is part 5"); + mybot.sendMessage(message.channel, "this is part 6"); + mybot.sendMessage(message.channel, "this is part 7"); + mybot.sendMessage(message.channel, "this is part 8"); + } + +}); + +function error(err){ + console.log(err); +} + +mybot.login(process.env["ds_email"], process.env["ds_password"]).catch(error); \ No newline at end of file diff --git a/test/msgbot.js b/test/msgbot.js new file mode 100644 index 000000000..e69de29bb