From ead8287881b49a15fb92c642bd4250a044692fb6 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Mon, 24 Aug 2015 18:31:39 +0100 Subject: [PATCH] added message update listening --- lib/Client.js | 171 +++++++++++++++++++++++++++++++++----------------- src/Client.js | 37 ++++++++++- test/bot.js | 8 ++- 3 files changed, 154 insertions(+), 62 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 47d63ee49..f8fbe77d3 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -161,7 +161,7 @@ var Client = (function () { this.websocket.onmessage = function (e) { var dat = false, - data = false; + data = {}; try { dat = JSON.parse(e.data); @@ -284,6 +284,59 @@ var Client = (function () { //don't have the cache of that message ;( self.trigger("messageDelete", channel); } + break; + case "MESSAGE_UPDATE": + self.debug("message updated"); + + var channel = self.getChannel("id", data.channel_id); + var formerMessage = channel.getMessage("id", data.id); + + if (formerMessage) { + + //new message might be partial, so we need to fill it with whatever the old message was. + var info = {}; + + for (var key in formerMessage) { + info[key] = formerMessage[key]; + } + + for (var key in data) { + info[key] = data[key]; + } + + var mentions = []; + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = data.mentions[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var mention = _step4.value; + + mentions.push(self.addUser(mention)); + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4["return"]) { + _iterator4["return"](); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + var newMessage = new Message(info, channel, mentions, formerMessage.author); + + self.trigger("messageUpdate", newMessage, formerMessage); + } + + // message isn't in cache, and if it's a partial it could cause + // all hell to break loose... best to just act as if nothing happened break; default: @@ -329,50 +382,16 @@ var Client = (function () { }, { key: "getUser", value: function getUser(key, value) { - var _iteratorNormalCompletion4 = true; - var _didIteratorError4 = false; - var _iteratorError4 = undefined; - - try { - for (var _iterator4 = this.userCache[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { - var user = _step4.value; - - if (user[key] === value) { - return user; - } - } - } catch (err) { - _didIteratorError4 = true; - _iteratorError4 = err; - } finally { - try { - if (!_iteratorNormalCompletion4 && _iterator4["return"]) { - _iterator4["return"](); - } - } finally { - if (_didIteratorError4) { - throw _iteratorError4; - } - } - } - - return null; - } - - //def getChannel - }, { - key: "getChannel", - value: function getChannel(key, value) { var _iteratorNormalCompletion5 = true; var _didIteratorError5 = false; var _iteratorError5 = undefined; try { - for (var _iterator5 = this.channelCache[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { - var channel = _step5.value; + for (var _iterator5 = this.userCache[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var user = _step5.value; - if (channel[key] === value) { - return channel; + if (user[key] === value) { + return user; } } } catch (err) { @@ -393,22 +412,20 @@ var Client = (function () { return null; } - //def getServer + //def getChannel }, { - key: "getServer", - value: function getServer() { - var key = arguments.length <= 0 || arguments[0] === undefined ? "id" : arguments[0]; - var value = arguments.length <= 1 || arguments[1] === undefined ? "abc123" : arguments[1]; + key: "getChannel", + value: function getChannel(key, value) { var _iteratorNormalCompletion6 = true; var _didIteratorError6 = false; var _iteratorError6 = undefined; try { - for (var _iterator6 = this.serverCache[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { - var server = _step6.value; + for (var _iterator6 = this.channelCache[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var channel = _step6.value; - if (server[key] === value) { - return server; + if (channel[key] === value) { + return channel; } } } catch (err) { @@ -429,6 +446,42 @@ var Client = (function () { return null; } + //def getServer + }, { + key: "getServer", + value: function getServer() { + var key = arguments.length <= 0 || arguments[0] === undefined ? "id" : arguments[0]; + var value = arguments.length <= 1 || arguments[1] === undefined ? "abc123" : arguments[1]; + var _iteratorNormalCompletion7 = true; + var _didIteratorError7 = false; + var _iteratorError7 = undefined; + + try { + for (var _iterator7 = this.serverCache[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { + var server = _step7.value; + + if (server[key] === value) { + return server; + } + } + } catch (err) { + _didIteratorError7 = true; + _iteratorError7 = err; + } finally { + try { + if (!_iteratorNormalCompletion7 && _iterator7["return"]) { + _iterator7["return"](); + } + } finally { + if (_didIteratorError7) { + throw _iteratorError7; + } + } + } + + return null; + } + //def trySendConnData }, { key: "trySendConnData", @@ -480,27 +533,27 @@ var Client = (function () { get: function get() { var msgs = []; - var _iteratorNormalCompletion7 = true; - var _didIteratorError7 = false; - var _iteratorError7 = undefined; + var _iteratorNormalCompletion8 = true; + var _didIteratorError8 = false; + var _iteratorError8 = undefined; try { - for (var _iterator7 = this.channelCache[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { - var channel = _step7.value; + for (var _iterator8 = this.channelCache[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { + var channel = _step8.value; msgs = msgs.concat(channel.messages); } } catch (err) { - _didIteratorError7 = true; - _iteratorError7 = err; + _didIteratorError8 = true; + _iteratorError8 = err; } finally { try { - if (!_iteratorNormalCompletion7 && _iterator7["return"]) { - _iterator7["return"](); + if (!_iteratorNormalCompletion8 && _iterator8["return"]) { + _iterator8["return"](); } } finally { - if (_didIteratorError7) { - throw _iteratorError7; + if (_didIteratorError8) { + throw _iteratorError8; } } } diff --git a/src/Client.js b/src/Client.js index df79c64e8..a38fb12a9 100644 --- a/src/Client.js +++ b/src/Client.js @@ -166,7 +166,7 @@ class Client { //message this.websocket.onmessage = function (e) { - var dat = false, data = false; + var dat = false, data = {}; try { dat = JSON.parse(e.data); @@ -223,11 +223,44 @@ class Client { if (message) { self.trigger("messageDelete", channel, message); channel.messages.splice(channel.messages.indexOf(message), 1); - }else{ + } else { //don't have the cache of that message ;( self.trigger("messageDelete", channel); } + break; + case "MESSAGE_UPDATE": + self.debug("message updated"); + var channel = self.getChannel("id", data.channel_id); + var formerMessage = channel.getMessage("id", data.id); + + if (formerMessage) { + + //new message might be partial, so we need to fill it with whatever the old message was. + var info = {}; + + for (var key in formerMessage) { + info[key] = formerMessage[key]; + } + + for (var key in data) { + info[key] = data[key]; + } + + var mentions = []; + for (var mention of data.mentions) { + mentions.push(self.addUser(mention)); + } + + var newMessage = new Message(info, channel, mentions, formerMessage.author); + + self.trigger("messageUpdate", newMessage, formerMessage); + + } + + // message isn't in cache, and if it's a partial it could cause + // all hell to break loose... best to just act as if nothing happened + break; default: self.debug("received unknown packet"); diff --git a/test/bot.js b/test/bot.js index 2adab326e..3d87dccca 100644 --- a/test/bot.js +++ b/test/bot.js @@ -18,4 +18,10 @@ mybot.on("messageDelete", function(channel, message){ console.log("MESSAGE WAS DELETED BY " + ( message ? message.author.username : channel.name )); -}); \ No newline at end of file +}); + +mybot.on("messageUpdate", function(message, formerMessage){ + + console.log(message.author.username, "changed", formerMessage.content, "to", message.content); + +}) \ No newline at end of file