From 5968958ba43f4ebd1bd978a6e843b05e21b61420 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sun, 30 Aug 2015 17:31:18 +0100 Subject: [PATCH 1/5] added avatar bot working on cat --- examples/avatar.js | 41 +++++++++++++++++++++++++++++++++++++++++ examples/catapi.js | 36 ++++++++++++++++++++++++++++++++++++ examples/pingpong.js | 15 +++++++++------ 3 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 examples/avatar.js create mode 100644 examples/catapi.js diff --git a/examples/avatar.js b/examples/avatar.js new file mode 100644 index 000000000..b0eb1bb27 --- /dev/null +++ b/examples/avatar.js @@ -0,0 +1,41 @@ +/* + this bot is an avatar bot, and will give a user their avatar's URL +*/ + +var Discord = require("../"); + +// Get the email and password +var AuthDetails = require("./auth.json"); + +var bot = new Discord.Client(); + +bot.on("ready", function () { + console.log("Ready to begin! Serving in " + bot.channels.length + " channels"); +}); + +bot.on("disconnected", function () { + + console.log("Disconnected!"); + process.exit(1); //exit node.js with an error + +}); + +bot.on("message", function (msg) { + if (msg.content === "$avatar") { + + //see if the user has an avatar + if( msg.sender.avatarURL ){ + bot.reply(msg, msg.sender.avatarURL); + }else{ + //using reply with a message automatically does: + // '@sender, ' for you! + bot.reply(msg, "you don't have an avatar!"); + } + + //alert the console + console.log("served " + msg.sender.username); + + } +}); + +bot.login(AuthDetails.email, AuthDetails.password); \ No newline at end of file diff --git a/examples/catapi.js b/examples/catapi.js new file mode 100644 index 000000000..ae5b7f6aa --- /dev/null +++ b/examples/catapi.js @@ -0,0 +1,36 @@ +/* + this bot will send an image of a cat to a channel. + may be slow depending on your internet connection. +*/ + +var Discord = require("../"); + +// Get the email and password +var AuthDetails = require("./auth.json"); + +var bot = new Discord.Client(); + +bot.on("ready", function () { + console.log("Ready to begin! Serving in " + bot.channels.length + " channels"); +}); + +bot.on("disconnected", function () { + + console.log("Disconnected!"); + process.exit(1); //exit node.js with an error + +}); + +bot.on("message", function (msg) { + if (msg.content === "$cat") { + + //send a message to the channel the ping message was sent in. + bot.sendMessage(msg.channel, "pong!"); + + //alert the console + console.log("pong-ed " + msg.sender.username); + + } +}); + +bot.login(AuthDetails.email, AuthDetails.password); \ No newline at end of file diff --git a/examples/pingpong.js b/examples/pingpong.js index 5a9ddc9ec..d5d90588f 100644 --- a/examples/pingpong.js +++ b/examples/pingpong.js @@ -11,23 +11,26 @@ var AuthDetails = require("./auth.json"); var bot = new Discord.Client(); -bot.on("ready", function(){ +bot.on("ready", function () { console.log("Ready to begin! Serving in " + bot.channels.length + " channels"); }); -bot.on("disconnected", function(){ - +bot.on("disconnected", function () { + console.log("Disconnected!"); process.exit(1); //exit node.js with an error }); -bot.on("message", function(msg){ - if(msg.content.substring(0,4) === "ping"){ +bot.on("message", function (msg) { + if (msg.content.substring(0, 4) === "ping") { //send a message to the channel the ping message was sent in. - bot.sendMessage( msg.channel, "pong!" ); + bot.sendMessage(msg.channel, "pong!"); + //alert the console + console.log("pong-ed " + msg.sender.username); + } }); From 7b1e7d2efa624479a76a1dfba9ada8ac75f56dad Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sun, 30 Aug 2015 20:27:47 +0100 Subject: [PATCH 2/5] Added sendFile queue --- lib/Client.js | 103 +++++++++++++++++++++++++++++++++------------- src/Client.js | 112 +++++++++++++++++++++++++++++++++++--------------- test/bot.1.js | 15 ++++++- 3 files changed, 167 insertions(+), 63 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 2087799c0..64cc60127 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -62,7 +62,7 @@ var Client = (function () { this.pmChannelCache = []; this.readyTime = null; this.checkingQueue = {}; - this.messageQueue = {}; + this.queue = {}; } _createClass(Client, [{ @@ -339,7 +339,7 @@ var Client = (function () { var self = this; - return new Promise(function (resolve, reject) { + var prom = new Promise(function (resolve, reject) { if (timeout) { setTimeout(remove, timeout); } else { @@ -358,6 +358,8 @@ var Client = (function () { }); } }); + + return prom; } }, { key: "updateMessage", @@ -563,23 +565,33 @@ var Client = (function () { self.resolveDestination(destination).then(send)["catch"](error); function send(destination) { - request.post(Endpoints.CHANNELS + "/" + destination + "/messages").set("authorization", self.token).attach("file", fstream, fileName).end(function (err, res) { - - if (err) { - error(err); - } else { - - var chann = self.getChannel("id", destination); - if (chann) { - var msg = chann.addMessage(new Message(res.body, chann, [], self.user)); - callback(null, msg); - resolve(msg); - } + if (~self.options.queue.indexOf("send")) { + //queue send file too + if (!self.queue[destination]) { + self.queue[destination] = []; } - }); + + self.queue[destination].push({ + action: "sendFile", + attachment: fstream, + attachmentName: fileName, + then: good, + error: bad + }); + + self.checkQueue(destination); + } else { + //not queue + self._sendFile(destination, fstream, fileName).then(good)["catch"](bad); + } } - function error(err) { + function good(msg) { + callback(null, msg); + resolve(msg); + } + + function bad(err) { callback(err); reject(err); } @@ -605,18 +617,18 @@ var Client = (function () { } function send(destination) { - if (~self.options.queue.indexOf("sendMessage")) { + if (~self.options.queue.indexOf("send")) { //we're QUEUEING messages, so sending them sequentially based on servers. - if (!self.messageQueue[destination]) { - self.messageQueue[destination] = []; + if (!self.queue[destination]) { + self.queue[destination] = []; } - self.messageQueue[destination].push({ + self.queue[destination].push({ action: "sendMessage", content: message, mentions: mentions, - then: [mgood], - error: [mbad] + then: mgood, + error: mbad }); self.checkQueue(destination); @@ -1395,6 +1407,29 @@ var Client = (function () { }); }); } + }, { + key: "_sendFile", + value: function _sendFile(destination, attachment) { + var attachmentName = arguments.length <= 2 || arguments[2] === undefined ? "DEFAULT BECAUSE YOU DIDN'T SPECIFY WHY.png" : arguments[2]; + + var self = this; + + return new Promise(function (resolve, reject) { + request.post(Endpoints.CHANNELS + "/" + destination + "/messages").set("authorization", self.token).attach("file", attachment, attachmentName).end(function (err, res) { + + if (err) { + reject(err); + } else { + + var chann = self.getChannel("id", destination); + if (chann) { + var msg = chann.addMessage(new Message(res.body, chann, [], self.user)); + resolve(msg); + } + } + }); + }); + } }, { key: "checkQueue", value: function checkQueue(channelID) { @@ -1405,21 +1440,33 @@ var Client = (function () { if (!this.checkingQueue[channelID]) { (function () { var doNext = function doNext() { - if (self.messageQueue[channelID].length === 0) { + if (self.queue[channelID].length === 0) { done(); return; } - var queuedEvent = self.messageQueue[channelID][0]; + var queuedEvent = self.queue[channelID][0]; switch (queuedEvent.action) { case "sendMessage": var msgToSend = queuedEvent; self._sendMessage(channelID, msgToSend.content, msgToSend.mentions).then(function (msg) { - msgToSend.then[0](msg); - self.messageQueue[channelID].shift(); + msgToSend.then(msg); + self.queue[channelID].shift(); doNext(); })["catch"](function (err) { - msgToSend["catch"][0](err); - self.messageQueue[channelID].shift(); + msgToSend["catch"](err); + self.queue[channelID].shift(); + doNext(); + }); + break; + case "sendFile": + var fileToSend = queuedEvent; + self._sendFile(channelID, fileToSend.attachment, fileToSend.attachmentName).then(function (msg) { + fileToSend.then(msg); + self.queue[channelID].shift(); + doNext(); + })["catch"](function (err) { + fileToSend["catch"](err); + self.queue[channelID].shift(); doNext(); }); break; diff --git a/src/Client.js b/src/Client.js index 8e2159b1d..46628e344 100644 --- a/src/Client.js +++ b/src/Client.js @@ -52,7 +52,7 @@ class Client { this.pmChannelCache = []; this.readyTime = null; this.checkingQueue = {}; - this.messageQueue = {}; + this.queue = {}; } get uptime() { @@ -577,30 +577,33 @@ class Client { self.resolveDestination(destination).then(send).catch(error); function send(destination) { - request - .post(`${Endpoints.CHANNELS}/${destination}/messages`) - .set("authorization", self.token) - .attach("file", fstream, fileName) - .end(function (err, res) { - - if (err) { - error(err); - } else { - - var chann = self.getChannel("id", destination); - if (chann) { - var msg = chann.addMessage(new Message(res.body, chann, [], self.user)); - callback(null, msg); - resolve(msg); - } - - - } + if(~self.options.queue.indexOf("send")){ + //queue send file too + if (!self.queue[destination]) { + self.queue[destination] = []; + } + self.queue[destination].push({ + action: "sendFile", + attachment : fstream, + attachmentName : fileName, + then: good, + error: bad }); + + self.checkQueue(destination); + }else{ + //not queue + self._sendFile(destination, fstream, fileName).then(good).catch(bad); + } } - function error(err) { + function good(msg) { + callback(null, msg); + resolve(msg); + } + + function bad(err) { callback(err); reject(err); } @@ -625,18 +628,18 @@ class Client { } function send(destination) { - if (~self.options.queue.indexOf("sendMessage")) { + if (~self.options.queue.indexOf("send")) { //we're QUEUEING messages, so sending them sequentially based on servers. - if (!self.messageQueue[destination]) { - self.messageQueue[destination] = []; + if (!self.queue[destination]) { + self.queue[destination] = []; } - self.messageQueue[destination].push({ + self.queue[destination].push({ action: "sendMessage", content: message, mentions: mentions, - then: [mgood], - error: [mbad] + then: mgood, + error: mbad }); self.checkQueue(destination); @@ -1156,6 +1159,35 @@ class Client { }); } + + _sendFile(destination, attachment, attachmentName = "DEFAULT BECAUSE YOU DIDN'T SPECIFY WHY.png"){ + + var self = this; + + return new Promise(function(resolve, reject){ + request + .post(`${Endpoints.CHANNELS}/${destination}/messages`) + .set("authorization", self.token) + .attach("file", attachment, attachmentName) + .end(function (err, res) { + + if (err) { + reject(err); + } else { + + var chann = self.getChannel("id", destination); + if (chann) { + var msg = chann.addMessage(new Message(res.body, chann, [], self.user)); + resolve(msg); + } + + + } + + }); + }); + + } checkQueue(channelID) { @@ -1167,23 +1199,37 @@ class Client { doNext(); function doNext() { - if (self.messageQueue[channelID].length === 0) { + if (self.queue[channelID].length === 0) { done(); return; } - var queuedEvent = self.messageQueue[channelID][0]; + var queuedEvent = self.queue[channelID][0]; switch (queuedEvent.action) { case "sendMessage": var msgToSend = queuedEvent; self._sendMessage(channelID, msgToSend.content, msgToSend.mentions) .then(function (msg) { - msgToSend.then[0](msg); - self.messageQueue[channelID].shift(); + msgToSend.then(msg); + self.queue[channelID].shift(); doNext(); }) .catch(function (err) { - msgToSend.catch[0](err); - self.messageQueue[channelID].shift(); + msgToSend.catch(err); + self.queue[channelID].shift(); + doNext(); + }); + break; + case "sendFile": + var fileToSend = queuedEvent; + self._sendFile(channelID, fileToSend.attachment, fileToSend.attachmentName) + .then(function (msg){ + fileToSend.then(msg); + self.queue[channelID].shift(); + doNext(); + }) + .catch(function(err){ + fileToSend.catch(err); + self.queue[channelID].shift(); doNext(); }); break; diff --git a/test/bot.1.js b/test/bot.1.js index 6d4c5734d..472a22cf6 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -1,7 +1,8 @@ var Discord = require("../"); var mybot = new Discord.Client({ - queue : ["sendMessage"] + queue : ["send"] }); +var fs = require("fs"); var server, channel, message, sentMessage = false; @@ -11,11 +12,21 @@ mybot.on("message", function(message){ return; } + if( message.content !== "$$$" ){ + return; + } + var action1 = mybot.sendMessage(message.channel, "this is message " + 1); + var action1 = mybot.sendFile(message.channel, fs.createReadStream("./test/image.png")); var action2 = mybot.sendMessage(message.channel, "this is message " + 2).then(log); + var action1 = mybot.sendFile(message.channel, fs.createReadStream("./test/image.png")); + var action2 = mybot.sendMessage(message.channel, "this is message " + 3).then(log); + var action1 = mybot.sendFile(message.channel, fs.createReadStream("./test/image.png")); + var action2 = mybot.sendMessage(message.channel, "this is message " + 4).then(log); + var action1 = mybot.sendFile(message.channel, fs.createReadStream("./test/image.png")); + var action2 = mybot.sendMessage(message.channel, "this is message " + 5).then(log); function log(){ - mybot.sendMessage(message.channel, action1.message ? action1.message : action1.error); } }); From 2fdc5a3ff66a635b79c3d34cfa02872f9e30bc9a Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sun, 30 Aug 2015 21:29:27 +0100 Subject: [PATCH 3/5] Added queue update message --- lib/Client.js | 90 ++++++++++++++++++++++++++++++++++++----------- src/Client.js | 97 +++++++++++++++++++++++++++++++++++++++------------ test/bot.1.js | 36 +++++++++---------- 3 files changed, 162 insertions(+), 61 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 64cc60127..8bb9e87ba 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -368,26 +368,41 @@ var Client = (function () { var self = this; - return new Promise(function (resolve, reject) { + var prom = new Promise(function (resolve, reject) { content = content instanceof Array ? content.join("\n") : content; - request.patch(Endpoints.CHANNELS + "/" + message.channel.id + "/messages/" + message.id).set("authorization", self.token).send({ - content: content, - mentions: [] - }).end(function (err, res) { - if (err) { - callback(err); - reject(err); - } else { - var msg = new Message(res.body, message.channel, message.mentions, message.sender); - callback(null, msg); - resolve(msg); - - message.channel.messages[message.channel.messages.indexOf(message)] = msg; + if (self.options.queue) { + if (!self.queue[message.channel.id]) { + self.queue[message.channel.id] = []; } - }); + self.queue[message.channel.id].push({ + action: "updateMessage", + message: message, + content: content, + then: good, + error: bad + }); + + self.checkQueue(message.channel.id); + } else { + self._updateMessage(message, content).then(good)["catch"](bad); + } + + function good(msg) { + prom.message = msg; + callback(null, msg); + resolve(msg); + } + + function bad(error) { + prom.error = error; + callback(error); + reject(error); + } }); + + return prom; } }, { key: "setUsername", @@ -551,7 +566,7 @@ var Client = (function () { var self = this; - return new Promise(function (resolve, reject) { + var prom = new Promise(function (resolve, reject) { var fstream; @@ -565,7 +580,7 @@ var Client = (function () { self.resolveDestination(destination).then(send)["catch"](error); function send(destination) { - if (~self.options.queue.indexOf("send")) { + if (self.options.queue) { //queue send file too if (!self.queue[destination]) { self.queue[destination] = []; @@ -587,15 +602,19 @@ var Client = (function () { } function good(msg) { + prom.message = msg; callback(null, msg); resolve(msg); } function bad(err) { + prom.error = err; callback(err); reject(err); } }); + + return prom; } }, { key: "sendMessage", @@ -617,7 +636,7 @@ var Client = (function () { } function send(destination) { - if (~self.options.queue.indexOf("send")) { + if (self.options.queue) { //we're QUEUEING messages, so sending them sequentially based on servers. if (!self.queue[destination]) { self.queue[destination] = []; @@ -1430,6 +1449,25 @@ var Client = (function () { }); }); } + }, { + key: "_updateMessage", + value: function _updateMessage(message, content) { + var self = this; + return new Promise(function (resolve, reject) { + request.patch(Endpoints.CHANNELS + "/" + message.channel.id + "/messages/" + message.id).set("authorization", self.token).send({ + content: content, + mentions: [] + }).end(function (err, res) { + if (err) { + reject(err); + } else { + var msg = new Message(res.body, message.channel, message.mentions, message.sender); + resolve(msg); + message.channel.messages[message.channel.messages.indexOf(message)] = msg; + } + }); + }); + } }, { key: "checkQueue", value: function checkQueue(channelID) { @@ -1453,7 +1491,7 @@ var Client = (function () { self.queue[channelID].shift(); doNext(); })["catch"](function (err) { - msgToSend["catch"](err); + msgToSend.error(err); self.queue[channelID].shift(); doNext(); }); @@ -1465,7 +1503,19 @@ var Client = (function () { self.queue[channelID].shift(); doNext(); })["catch"](function (err) { - fileToSend["catch"](err); + fileToSend.error(err); + self.queue[channelID].shift(); + doNext(); + }); + break; + case "updateMessage": + var msgToUpd = queuedEvent; + self._updateMessage(msgToUpd.message, msgToUpd.content).then(function (msg) { + msgToUpd.then(msg); + self.queue[channelID].shift(); + doNext(); + })["catch"](function (err) { + msgToUpd.error(err); self.queue[channelID].shift(); doNext(); }); diff --git a/src/Client.js b/src/Client.js index 46628e344..52ec644d9 100644 --- a/src/Client.js +++ b/src/Client.js @@ -406,31 +406,42 @@ class Client { var self = this; - return new Promise(function (resolve, reject) { + var prom = new Promise(function (resolve, reject) { content = (content instanceof Array ? content.join("\n") : content); - request - .patch(`${Endpoints.CHANNELS}/${message.channel.id}/messages/${message.id}`) - .set("authorization", self.token) - .send({ + if(self.options.queue){ + if (!self.queue[message.channel.id]) { + self.queue[message.channel.id] = []; + } + self.queue[message.channel.id].push({ + action: "updateMessage", + message: message, content: content, - mentions: [] - }) - .end(function (err, res) { - if (err) { - callback(err); - reject(err); - } else { - var msg = new Message(res.body, message.channel, message.mentions, message.sender); - callback(null, msg); - resolve(msg); - - message.channel.messages[message.channel.messages.indexOf(message)] = msg; - } + then: good, + error: bad }); + + self.checkQueue(message.channel.id); + }else{ + self._updateMessage(message, content).then(good).catch(bad); + } + + function good(msg){ + prom.message = msg; + callback(null, msg); + resolve(msg); + } + + function bad(error){ + prom.error = error; + callback(error); + reject(error); + } }); + + return prom; } setUsername(newName, callback = function (err) { }) { @@ -563,7 +574,7 @@ class Client { var self = this; - return new Promise(function (resolve, reject) { + var prom = new Promise(function (resolve, reject) { var fstream; @@ -577,7 +588,7 @@ class Client { self.resolveDestination(destination).then(send).catch(error); function send(destination) { - if(~self.options.queue.indexOf("send")){ + if(self.options.queue){ //queue send file too if (!self.queue[destination]) { self.queue[destination] = []; @@ -599,16 +610,20 @@ class Client { } function good(msg) { + prom.message = msg; callback(null, msg); resolve(msg); } function bad(err) { + prom.error = err; callback(err); reject(err); } }); + + return prom; } @@ -628,7 +643,7 @@ class Client { } function send(destination) { - if (~self.options.queue.indexOf("send")) { + if (self.options.queue) { //we're QUEUEING messages, so sending them sequentially based on servers. if (!self.queue[destination]) { self.queue[destination] = []; @@ -1188,6 +1203,28 @@ class Client { }); } + + _updateMessage(message, content){ + var self = this; + return new Promise(function(resolve, reject){ + request + .patch(`${Endpoints.CHANNELS}/${message.channel.id}/messages/${message.id}`) + .set("authorization", self.token) + .send({ + content: content, + mentions: [] + }) + .end(function (err, res) { + if (err) { + reject(err); + } else { + var msg = new Message(res.body, message.channel, message.mentions, message.sender); + resolve(msg); + message.channel.messages[message.channel.messages.indexOf(message)] = msg; + } + }); + }); + } checkQueue(channelID) { @@ -1214,7 +1251,7 @@ class Client { doNext(); }) .catch(function (err) { - msgToSend.catch(err); + msgToSend.error(err); self.queue[channelID].shift(); doNext(); }); @@ -1228,11 +1265,25 @@ class Client { doNext(); }) .catch(function(err){ - fileToSend.catch(err); + fileToSend.error(err); self.queue[channelID].shift(); doNext(); }); break; + case "updateMessage": + var msgToUpd = queuedEvent; + self._updateMessage(msgToUpd.message, msgToUpd.content) + .then(function(msg){ + msgToUpd.then(msg); + self.queue[channelID].shift(); + doNext(); + }) + .catch(function(err){ + msgToUpd.error(err); + self.queue[channelID].shift(); + doNext(); + }); + break; default: done(); break; diff --git a/test/bot.1.js b/test/bot.1.js index 472a22cf6..31f344fac 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -1,37 +1,37 @@ var Discord = require("../"); var mybot = new Discord.Client({ - queue : ["send"] + queue: ["send"] }); var fs = require("fs"); var server, channel, message, sentMessage = false; -mybot.on("message", function(message){ - - if( mybot.user.equals(message.sender) ){ +mybot.on("message", function (message) { + + if (mybot.user.equals(message.sender)) { return; } - - if( message.content !== "$$$" ){ + + if (message.content !== "$$$") { return; } - + var action1 = mybot.sendMessage(message.channel, "this is message " + 1); - var action1 = mybot.sendFile(message.channel, fs.createReadStream("./test/image.png")); var action2 = mybot.sendMessage(message.channel, "this is message " + 2).then(log); - var action1 = mybot.sendFile(message.channel, fs.createReadStream("./test/image.png")); - var action2 = mybot.sendMessage(message.channel, "this is message " + 3).then(log); - var action1 = mybot.sendFile(message.channel, fs.createReadStream("./test/image.png")); - var action2 = mybot.sendMessage(message.channel, "this is message " + 4).then(log); - var action1 = mybot.sendFile(message.channel, fs.createReadStream("./test/image.png")); - var action2 = mybot.sendMessage(message.channel, "this is message " + 5).then(log); - - function log(){ + + function log() { + console.log("w", action1.message); + mybot.updateMessage(action1.message, "blurg"); + mybot.sendMessage(message.channel, "This is message 3 million minus the million so basically just 3"); } - + }); -function error(err){ +function dump(msg) { + console.log(msg); +} + +function error(err) { console.log(err); } From be0be60947f74c969b9d55ea11ce157cfbe7d47f Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sun, 30 Aug 2015 21:42:09 +0100 Subject: [PATCH 4/5] added deletion queue --- lib/Client.js | 60 +++++++++++++++++++++++++++++++++++++++------ src/Client.js | 67 ++++++++++++++++++++++++++++++++++++++++++--------- test/bot.1.js | 4 +-- 3 files changed, 110 insertions(+), 21 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 8bb9e87ba..059d09628 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -347,15 +347,33 @@ var Client = (function () { } function remove() { - request.del(Endpoints.CHANNELS + "/" + message.channel.id + "/messages/" + message.id).set("authorization", self.token).end(function (err, res) { - if (err) { - callback(err); - reject(err); - } else { - callback(null); - resolve(); + if (self.options.queue) { + if (!self.queue[message.channel.id]) { + self.queue[message.channel.id] = []; } - }); + self.queue[message.channel.id].push({ + action: "deleteMessage", + message: message, + then: good, + error: bad + }); + + self.checkQueue(message.channel.id); + } else { + self._deleteMessage(message).then(good)["catch"](bad); + } + } + + function good() { + prom.success = true; + callback(null); + resolve(); + } + + function bad(err) { + prom.error = err; + callback(err); + reject(err); } }); @@ -1468,6 +1486,20 @@ var Client = (function () { }); }); } + }, { + key: "_deleteMessage", + value: function _deleteMessage(message) { + var self = this; + return new Promise(function (resolve, reject) { + request.del(Endpoints.CHANNELS + "/" + message.channel.id + "/messages/" + message.id).set("authorization", self.token).end(function (err, res) { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + } }, { key: "checkQueue", value: function checkQueue(channelID) { @@ -1520,6 +1552,18 @@ var Client = (function () { doNext(); }); break; + case "deleteMessage": + var msgToDel = queuedEvent; + self._deleteMessage(msgToDel.message).then(function (msg) { + msgToDel.then(msg); + self.queue[channelID].shift(); + doNext(); + })["catch"](function (err) { + msgToDel.error(err); + self.queue[channelID].shift(); + doNext(); + }); + break; default: done(); break; diff --git a/src/Client.js b/src/Client.js index 52ec644d9..3d6523b78 100644 --- a/src/Client.js +++ b/src/Client.js @@ -384,18 +384,33 @@ class Client { } function remove() { - request - .del(`${Endpoints.CHANNELS}/${message.channel.id}/messages/${message.id}`) - .set("authorization", self.token) - .end(function (err, res) { - if (err) { - callback(err); - reject(err); - } else { - callback(null); - resolve(); - } + if(self.options.queue){ + if (!self.queue[message.channel.id]) { + self.queue[message.channel.id] = []; + } + self.queue[message.channel.id].push({ + action: "deleteMessage", + message: message, + then: good, + error: bad }); + + self.checkQueue(message.channel.id); + }else{ + self._deleteMessage(message).then(good).catch(bad); + } + } + + function good(){ + prom.success = true; + callback(null); + resolve(); + } + + function bad(err){ + prom.error = err; + callback(err); + reject(err); } }); @@ -1225,6 +1240,22 @@ class Client { }); }); } + + _deleteMessage(message){ + var self = this; + return new Promise(function(resolve, reject){ + request + .del(`${Endpoints.CHANNELS}/${message.channel.id}/messages/${message.id}`) + .set("authorization", self.token) + .end(function (err, res) { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + } checkQueue(channelID) { @@ -1284,6 +1315,20 @@ class Client { doNext(); }); break; + case "deleteMessage": + var msgToDel = queuedEvent; + self._deleteMessage(msgToDel.message) + .then(function(msg){ + msgToDel.then(msg); + self.queue[channelID].shift(); + doNext(); + }) + .catch(function(err){ + msgToDel.error(err); + self.queue[channelID].shift(); + doNext(); + }); + break; default: done(); break; diff --git a/test/bot.1.js b/test/bot.1.js index 31f344fac..2805bdc78 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -20,11 +20,11 @@ mybot.on("message", function (message) { var action2 = mybot.sendMessage(message.channel, "this is message " + 2).then(log); function log() { - console.log("w", action1.message); mybot.updateMessage(action1.message, "blurg"); mybot.sendMessage(message.channel, "This is message 3 million minus the million so basically just 3"); + mybot.deleteMessage(action1.message); + mybot.sendMessage(message.channel, "This is message RJNGEIKGNER").then(log2); } - }); function dump(msg) { From 68fd2ee9dd016fdab75ff98f369b84c4dc3c4670 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sun, 30 Aug 2015 21:51:02 +0100 Subject: [PATCH 5/5] 3.1.4 - finalised message queueing --- README.md | 34 ++++++++++++++++++++++++++++++++++ lib/Client.js | 4 ++-- package.json | 2 +- src/Client.js | 4 ++-- test/bot.1.js | 2 +- 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f62b29c2e..c0a68bdaa 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,40 @@ Here is a list of other Discord APIs: --- +### Changes in 3.1.4 + +No, not π. But instead, pseduo-synchronous messaging was added! This means that +you can tell your Client to make a queue of "actions" per channel, and it will +work through them one by one. This is a really useful tool if you need to send +messages in a specific order without callback hell. + +It also allows you to store responses - such as created messages - in the returned +promise - named action. Example: + +```js +var mybot = new Discord.Client({ + queue : true //enable queueing, disabled by default +}); + +mybot.on("message", function(msg){ + + mybot.sendMessage(msg.channel, "this is message 1"); + var action = mybot.sendMessage(msg.channel, "this is message 2"); + mybot.sendMessage(msg.channel, "this is message 3").then(rmv); + + function rmv(){ + if(!action.error){ + mybot.deleteMessage(action.message); + } + } + +}); +``` + +This is still in development, and will see many more enhancements in future. + +--- + ### Links **[Documentation](https://github.com/discord-js/discord.js/wiki/Documentation)** diff --git a/lib/Client.js b/lib/Client.js index 059d09628..1c2bb688f 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -19,7 +19,7 @@ var WebSocket = require("ws"); var fs = require("fs"); var defaultOptions = { - queue: [] + queue: false }; var Client = (function () { @@ -35,7 +35,7 @@ var Client = (function () { further efforts will be made to connect. */ this.options = options; - this.options.queue = this.options.queue || []; + this.options.queue = this.options.queue; this.token = token; this.state = 0; this.websocket = null; diff --git a/package.json b/package.json index fd5043bcc..e5d2a0a8e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "discord.js", - "version": "3.1.3", + "version": "3.1.4", "description": "A way to interface with the Discord API", "main": "./lib/index.js", "scripts": { diff --git a/src/Client.js b/src/Client.js index 3d6523b78..31a16fdd9 100644 --- a/src/Client.js +++ b/src/Client.js @@ -13,7 +13,7 @@ var WebSocket = require("ws"); var fs = require("fs"); var defaultOptions = { - queue: [] + queue: false } class Client { @@ -25,7 +25,7 @@ class Client { further efforts will be made to connect. */ this.options = options; - this.options.queue = this.options.queue || []; + this.options.queue = this.options.queue; this.token = token; this.state = 0; this.websocket = null; diff --git a/test/bot.1.js b/test/bot.1.js index 2805bdc78..e9b9f9c9a 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -1,6 +1,6 @@ var Discord = require("../"); var mybot = new Discord.Client({ - queue: ["send"] + queue: true }); var fs = require("fs");