From a333548c00d5ebd21d2e223a496b2efd02649a0e Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 31 Oct 2015 23:12:14 +0000 Subject: [PATCH] Added deleting messages --- lib/Client/Client.js | 29 +++++++++++ lib/Client/InternalClient.js | 31 ++++++++++++ lib/Constants.js | 3 ++ lib/Util/Cache.js | 13 +++++ lib/index.js | 4 +- src/Client/Client.js | 97 ++++++++++++++++++++++-------------- src/Client/InternalClient.js | 43 ++++++++++++++-- src/Constants.js | 1 + src/Util/Cache.js | 13 +++++ src/index.js | 5 +- 10 files changed, 195 insertions(+), 44 deletions(-) diff --git a/lib/Client/Client.js b/lib/Client/Client.js index 343f1ead3..012e66c6b 100644 --- a/lib/Client/Client.js +++ b/lib/Client/Client.js @@ -59,6 +59,8 @@ var Client = (function (_EventEmitter) { }); }; + // def sendMessage + Client.prototype.sendMessage = function sendMessage(where, content) { var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; var callback = arguments.length <= 3 || arguments[3] === undefined ? function (e, m) {} : arguments[3]; @@ -81,6 +83,8 @@ var Client = (function (_EventEmitter) { }); }; + // def sendTTSMessage + Client.prototype.sendTTSMessage = function sendTTSMessage(where, content) { var callback = arguments.length <= 2 || arguments[2] === undefined ? function (e, m) {} : arguments[2]; @@ -96,6 +100,8 @@ var Client = (function (_EventEmitter) { }); }; + // def reply + Client.prototype.reply = function reply(where, content) { var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; var callback = arguments.length <= 3 || arguments[3] === undefined ? function (e, m) {} : arguments[3]; @@ -126,6 +132,8 @@ var Client = (function (_EventEmitter) { }); }; + // def replyTTS + Client.prototype.replyTTS = function replyTTS(where, content) { var callback = arguments.length <= 2 || arguments[2] === undefined ? function () {} : arguments[2]; @@ -140,6 +148,27 @@ var Client = (function (_EventEmitter) { }); }; + Client.prototype.deleteMessage = function deleteMessage(msg) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (e) {} : arguments[2]; + + var self = this; + return new Promise(function (resolve, reject) { + if (typeof options === "function") { + // options is the callback + callback = options; + } + + self.internal.deleteMessage(msg).then(function () { + callback(); + resolve(); + })["catch"](function (e) { + callback(e); + reject(e); + }); + }); + }; + return Client; })(EventEmitter); diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index 3957c86e8..aacca0c92 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -184,6 +184,37 @@ var InternalClient = (function () { }); }; + InternalClient.prototype.deleteMessage = function deleteMessage(_message) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var self = this; + return new Promise(function (resolve, reject) { + + var message = self.resolver.resolveMessage(_message); + + if (message) { + var deleteMsg = function deleteMsg() { + request.del(Endpoints.CHANNEL_MESSAGE(message.channel.id, message.id)).set("authorization", self.token).end(function (err, res) { + if (err) { + reject(new Error(err.response.text)); + } else { + message.channel.messages.remove(message); + resolve(); + } + }); + }; + + if (options.wait) { + setTimeout(deleteMsg, options.wait); + } else { + deleteMsg(); + } + } else { + reject(new Error("Supplied message did not resolve to a message!")); + } + }); + }; + InternalClient.prototype.sendWS = function sendWS(object) { this.websocket.send(JSON.stringify(object)); }; diff --git a/lib/Constants.js b/lib/Constants.js index 35e948c93..47c0ea7a9 100644 --- a/lib/Constants.js +++ b/lib/Constants.js @@ -63,6 +63,9 @@ var Endpoints = { }, CHANNEL_PERMISSIONS: function CHANNEL_PERMISSIONS(channelID) { return Endpoints.CHANNEL(channelID) + "/permissions"; + }, + CHANNEL_MESSAGE: function CHANNEL_MESSAGE(channelID, messageID) { + return Endpoints.CHANNEL_MESSAGES(channelID) + "/" + messageID; } }; diff --git a/lib/Util/Cache.js b/lib/Util/Cache.js index 2d428335b..aadc4c46f 100644 --- a/lib/Util/Cache.js +++ b/lib/Util/Cache.js @@ -68,6 +68,19 @@ var Cache = (function (_Array) { } }; + Cache.prototype.remove = function remove(data) { + var index = this.indexOf(data); + if (~index) { + this.splice(index, 1); + } else { + var item = this.get("id", data.id); + if (item) { + this.splice(this.indexOf(item), 1); + } + } + return false; + }; + return Cache; })(Array); diff --git a/lib/index.js b/lib/index.js index b9a1990b2..8651b3a75 100644 --- a/lib/index.js +++ b/lib/index.js @@ -10,8 +10,8 @@ a.on("debug", function (m) { }); a.on("message", function (m) { - if (m.content === "$$$") a.reply(m, "hi man!")["catch"](function (e) { - return console.log(e.stack); + if (m.content === "$$$") a.reply(m, "hi man!").then(function (m) { + a.deleteMessage(m); }); }); diff --git a/src/Client/Client.js b/src/Client/Client.js index e4bacb78e..12a2e5b6d 100644 --- a/src/Client/Client.js +++ b/src/Client/Client.js @@ -3,40 +3,40 @@ var InternalClient = require("./InternalClient.js"); var EventEmitter = require("events"); -class Client extends EventEmitter{ +class Client extends EventEmitter { /* this class is an interface for the internal client. */ - constructor(options){ + constructor(options) { super(); this.options = options || {}; this.internal = new InternalClient(this); } // def login - login(email, password, cb=function(err, token){}){ + login(email, password, cb = function (err, token) { }) { var self = this; return new Promise((resolve, reject) => { - + self.internal.login(email, password) - .then((token)=>{ + .then((token) => { cb(null, token); resolve(token); }) - .catch((e)=>{ + .catch((e) => { cb(e); reject(e); }); - + }); } // def logout - logout(cb=function(err){}){ + logout(cb = function (err) { }) { var self = this; return new Promise((resolve, reject) => { - + self.internal.logout() .then(() => { cb(); @@ -46,19 +46,19 @@ class Client extends EventEmitter{ cb(e); reject(e); }) - + }) } - - sendMessage(where, content, options={}, callback=function(e, m){}){ + // def sendMessage + sendMessage(where, content, options = {}, callback = function (e, m) { }) { var self = this; return new Promise((resolve, reject) => { - - if(typeof options === "function"){ + + if (typeof options === "function") { // options is the callback callback = options; } - + self.internal.sendMessage(where, content, options) .then(m => { callback(null, m); @@ -67,14 +67,15 @@ class Client extends EventEmitter{ callback(e); reject(e); }); - + }); } - sendTTSMessage(where, content, callback=function(e, m){}){ + // def sendTTSMessage + sendTTSMessage(where, content, callback = function (e, m) { }) { var self = this; return new Promise((resolve, reject) => { - self.sendMessage(where, content, {tts:true}) + self.sendMessage(where, content, { tts: true }) .then(m => { callback(null, m); resolve(m); @@ -82,42 +83,43 @@ class Client extends EventEmitter{ callback(e); reject(e); }); - + }); } - - reply(where, content, options={}, callback=function(e,m){}){ + // def reply + reply(where, content, options = {}, callback = function (e, m) { }) { var self = this; return new Promise((resolve, reject) => { - - if(typeof options === "function"){ + + if (typeof options === "function") { // options is the callback callback = options; } - + var msg = self.internal.resolver.resolveMessage(where); - if(msg){ + if (msg) { content = msg.author + ", " + content; self.internal.sendMessage(msg, content, options) - .then(m => { - callback(null, m); - resolve(m); - }).catch(e => { - callback(e); - reject(e); - }); - }else{ + .then(m => { + callback(null, m); + resolve(m); + }).catch(e => { + callback(e); + reject(e); + }); + } else { var err = new Error("Destination not resolvable to a message!"); callback(err); reject(err); } - + }); } - replyTTS(where, content, callback=function(){}){ - return new Promise((resolve, reject)=>{ - self.reply(where, content, {tts:true}) + // def replyTTS + replyTTS(where, content, callback = function () { }) { + return new Promise((resolve, reject) => { + self.reply(where, content, { tts: true }) .then(m => { callback(null, m); resolve(m); @@ -127,6 +129,27 @@ class Client extends EventEmitter{ }); }); } + + deleteMessage(msg, options = {}, callback = function (e) { }) { + var self = this; + return new Promise((resolve, reject) => { + if (typeof options === "function") { + // options is the callback + callback = options; + } + + self.internal.deleteMessage(msg) + .then(() => { + callback(); + resolve(); + }) + .catch(e => { + callback(e); + reject(e); + }); + + }); + } } module.exports = Client; \ No newline at end of file diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js index 918e291ef..e59aa5a58 100644 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -163,7 +163,7 @@ class InternalClient { } // def sendMessage - sendMessage(where, _content, options={}) { + sendMessage(where, _content, options = {}) { var self = this; return new Promise((resolve, reject) => { @@ -180,9 +180,9 @@ class InternalClient { .post(Endpoints.CHANNEL_MESSAGES(destination.id)) .set("authorization", self.token) .send({ - content : content, - mentions : mentions, - tts : options.tts + content: content, + mentions: mentions, + tts: options.tts }) .end((err, res) => { if (err) { @@ -203,6 +203,41 @@ class InternalClient { }); } + deleteMessage(_message, options = {}) { + var self = this; + return new Promise((resolve, reject) => { + + var message = self.resolver.resolveMessage(_message); + + if (message) { + + if(options.wait){ + setTimeout(deleteMsg, options.wait); + }else{ + deleteMsg(); + } + + function deleteMsg(){ + request + .del(Endpoints.CHANNEL_MESSAGE(message.channel.id, message.id)) + .set("authorization", self.token) + .end((err, res) => { + if (err) { + reject(new Error(err.response.text)); + } else { + message.channel.messages.remove(message); + resolve(); + } + }); + } + + }else { + reject(new Error("Supplied message did not resolve to a message!")); + } + + }); + } + sendWS(object) { this.websocket.send(JSON.stringify(object)); } diff --git a/src/Constants.js b/src/Constants.js index b670d8adc..b6ca95ef5 100644 --- a/src/Constants.js +++ b/src/Constants.js @@ -28,6 +28,7 @@ var Endpoints = { CHANNEL_INVITES: (channelID) => `${Endpoints.CHANNEL(channelID) }/invites`, CHANNEL_TYPING: (channelID) => `${Endpoints.CHANNEL(channelID) }/typing`, CHANNEL_PERMISSIONS: (channelID) => `${Endpoints.CHANNEL(channelID) }/permissions`, + CHANNEL_MESSAGE: (channelID, messageID) => `${Endpoints.CHANNEL_MESSAGES(channelID)}/${messageID}` }; var Permissions = { diff --git a/src/Util/Cache.js b/src/Util/Cache.js index b8e91011e..03909470a 100644 --- a/src/Util/Cache.js +++ b/src/Util/Cache.js @@ -46,6 +46,19 @@ class Cache extends Array{ return data; } } + + remove(data){ + var index = this.indexOf(data); + if(~index){ + this.splice(index, 1); + }else{ + var item = this.get("id", data.id); + if(item){ + this.splice(this.indexOf(item), 1); + } + } + return false; + } } module.exports = Cache; \ No newline at end of file diff --git a/src/index.js b/src/index.js index 9700da23b..2494b680e 100644 --- a/src/index.js +++ b/src/index.js @@ -7,7 +7,10 @@ a.on("debug", (m) => console.log("[debug]",m)); a.on("message", m => { if(m.content === "$$$") - a.reply(m, "hi man!").catch(e => console.log(e.stack)); + a.reply(m, "hi man!") + .then( m => { + a.deleteMessage(m); + }); }); a.login(process.env["discordEmail"], process.env["discordPass"]).catch((e)=>console.log(e)); \ No newline at end of file