From 5f812f7c905121130ef4a4eeb8d48cf222b87493 Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Tue, 25 Aug 2015 15:44:18 +0100 Subject: [PATCH] added message sending and PM channel resolving --- lib/Client.js | 425 +++++++++++++++++++++++++++++++++++++---------- lib/PMChannel.js | 63 ++++++- src/Client.js | 161 +++++++++++++++++- src/PMChannel.js | 29 +++- test/bot.js | 8 +- 5 files changed, 579 insertions(+), 107 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 40803a1b6..798921293 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -11,6 +11,7 @@ var Server = require("./Server.js"); var Channel = require("./Channel.js"); var Message = require("./Message.js"); var Invite = require("./Invite.js"); +var PMChannel = require("./PMChannel.js"); //node modules var request = require("superagent"); @@ -52,6 +53,7 @@ var Client = (function () { this.userCache = []; this.channelCache = []; this.serverCache = []; + this.pmChannelCache = []; this.readyTime = null; } @@ -278,6 +280,186 @@ var Client = (function () { }); }); } + }, { + key: "startPM", + value: function startPM(user) { + + var self = this; + + return new Promise(function (resolve, reject) { + var userId = user; + if (user instanceof User) { + userId = user.id; + } + request.post(Endpoints.USERS + "/" + self.user.id + "/channels").set("authorization", self.token).send({ + recipient_id: userId + }).end(function (err, res) { + if (err) { + reject(err); + } else { + resolve(self.addPMChannel(res.body)); + } + }); + }); + } + }, { + key: "sendMessage", + value: function sendMessage(destination, message) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err, msg) {} : arguments[2]; + + var self = this; + + return new Promise(function (resolve, reject) { + + message = resolveMessage(message); + var mentions = resolveMentions(); + destination = resolveDestination(destination); + + if (destination) send(); + + function send() { + + request.post(Endpoints.CHANNELS + "/" + destination + "/messages").set("authorization", self.token).send({ + content: message, + mentions: mentions + }).end(function (err, res) { + + if (err) { + callback(err); + reject(err); + } else { + var data = res.body; + + var mentions = []; + + data.mentions = data.mentions || []; //for some reason this was not defined at some point? + + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = data.mentions[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var mention = _step.value; + + mentions.push(self.addUser(mention)); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"]) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + var channel = self.getChannel("id", data.channel_id); + if (channel) { + var msg = channel.addMessage(new Message(data, channel, mentions, self.addUser(data.author))); + callback(null, msg); + resolve(msg); + } + } + }); + } + + function resolveDestination() { + var channId = false; + + if (destination instanceof Server) { + channId = destination.id; //general is the same as server id + } else if (destination instanceof Channel) { + channId = destination.id; + } else if (destination instanceof Message) { + channId = destination.channel.id; + } else if (destination instanceof User) { + + //check if we have a PM + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = self.pmChannelCache[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var pmc = _step2.value; + + if (pmc.user.equals(destination)) { + return pmc.id; + } + } + + //we don't, at this point we're late + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2["return"]) { + _iterator2["return"](); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + self.startPM(destination).then(function (pmc) { + destination = pmc.id; + send(); + }); + } else { + channId = destination; + } + + return channId; + } + + function resolveMessage() { + var msg = message; + if (message instanceof Array) { + msg = message.join("\n"); + } + return msg; + } + + function resolveMentions() { + var _mentions = []; + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = (message.match(/<@[^>]*>/g) || [])[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var mention = _step3.value; + + _mentions.push(mention.substring(2, mention.length - 1)); + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3["return"]) { + _iterator3["return"](); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + return _mentions; + } + }); + } //def createws }, { @@ -322,34 +504,59 @@ var Client = (function () { self.user = self.addUser(data.user); - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; try { - for (var _iterator = data.guilds[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var _server = _step.value; + for (var _iterator4 = data.guilds[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var _server = _step4.value; var server = self.addServer(_server); } } catch (err) { - _didIteratorError = true; - _iteratorError = err; + _didIteratorError4 = true; + _iteratorError4 = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator["return"]) { - _iterator["return"](); + if (!_iteratorNormalCompletion4 && _iterator4["return"]) { + _iterator4["return"](); } } finally { - if (_didIteratorError) { - throw _iteratorError; + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; + + try { + for (var _iterator5 = data.private_channels[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var _pmc = _step5.value; + + var pmc = self.addPMChannel(_pmc); + } + } catch (err) { + _didIteratorError5 = true; + _iteratorError5 = err; + } finally { + try { + if (!_iteratorNormalCompletion5 && _iterator5["return"]) { + _iterator5["return"](); + } + } finally { + if (_didIteratorError5) { + throw _iteratorError5; } } } self.trigger("ready"); self.readyTime = Date.now(); - self.debug("cached " + self.serverCache.length + " servers, " + self.channelCache.length + " channels and " + self.userCache.length + " users."); + self.debug("cached " + self.serverCache.length + " servers, " + self.channelCache.length + " channels, " + self.pmChannelCache.length + " PMs and " + self.userCache.length + " users."); setInterval(function () { self.keepAlive.apply(self); @@ -361,27 +568,27 @@ var Client = (function () { var mentions = []; data.mentions = data.mentions || []; //for some reason this was not defined at some point? - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; try { - for (var _iterator2 = data.mentions[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var mention = _step2.value; + for (var _iterator6 = data.mentions[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var mention = _step6.value; mentions.push(self.addUser(mention)); } } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; + _didIteratorError6 = true; + _iteratorError6 = err; } finally { try { - if (!_iteratorNormalCompletion2 && _iterator2["return"]) { - _iterator2["return"](); + if (!_iteratorNormalCompletion6 && _iterator6["return"]) { + _iterator6["return"](); } } finally { - if (_didIteratorError2) { - throw _iteratorError2; + if (_didIteratorError6) { + throw _iteratorError6; } } } @@ -426,27 +633,27 @@ var Client = (function () { } var mentions = []; - var _iteratorNormalCompletion3 = true; - var _didIteratorError3 = false; - var _iteratorError3 = undefined; + var _iteratorNormalCompletion7 = true; + var _didIteratorError7 = false; + var _iteratorError7 = undefined; try { - for (var _iterator3 = info.mentions[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { - var mention = _step3.value; + for (var _iterator7 = info.mentions[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { + var mention = _step7.value; mentions.push(self.addUser(mention)); } } catch (err) { - _didIteratorError3 = true; - _iteratorError3 = err; + _didIteratorError7 = true; + _iteratorError7 = err; } finally { try { - if (!_iteratorNormalCompletion3 && _iterator3["return"]) { - _iterator3["return"](); + if (!_iteratorNormalCompletion7 && _iterator7["return"]) { + _iterator7["return"](); } } finally { - if (_didIteratorError3) { - throw _iteratorError3; + if (_didIteratorError7) { + throw _iteratorError7; } } } @@ -640,6 +847,14 @@ var Client = (function () { } return this.getChannel("id", data.id); } + }, { + key: "addPMChannel", + value: function addPMChannel(data) { + if (!this.getPMChannel("id", data.id)) { + this.pmChannelCache.push(new PMChannel(data, this)); + } + return this.getPMChannel("id", data.id); + } //def addServer }, { @@ -651,27 +866,27 @@ var Client = (function () { if (!server) { server = new Server(data, this); if (data.channels) { - var _iteratorNormalCompletion4 = true; - var _didIteratorError4 = false; - var _iteratorError4 = undefined; + var _iteratorNormalCompletion8 = true; + var _didIteratorError8 = false; + var _iteratorError8 = undefined; try { - for (var _iterator4 = data.channels[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { - var channel = _step4.value; + for (var _iterator8 = data.channels[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { + var channel = _step8.value; server.channels.push(this.addChannel(channel, server.id)); } } catch (err) { - _didIteratorError4 = true; - _iteratorError4 = err; + _didIteratorError8 = true; + _iteratorError8 = err; } finally { try { - if (!_iteratorNormalCompletion4 && _iterator4["return"]) { - _iterator4["return"](); + if (!_iteratorNormalCompletion8 && _iterator8["return"]) { + _iterator8["return"](); } } finally { - if (_didIteratorError4) { - throw _iteratorError4; + if (_didIteratorError8) { + throw _iteratorError8; } } } @@ -686,29 +901,29 @@ var Client = (function () { }, { key: "getUser", value: function getUser(key, value) { - var _iteratorNormalCompletion5 = true; - var _didIteratorError5 = false; - var _iteratorError5 = undefined; + var _iteratorNormalCompletion9 = true; + var _didIteratorError9 = false; + var _iteratorError9 = undefined; try { - for (var _iterator5 = this.userCache[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { - var user = _step5.value; + for (var _iterator9 = this.userCache[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { + var user = _step9.value; if (user[key] === value) { return user; } } } catch (err) { - _didIteratorError5 = true; - _iteratorError5 = err; + _didIteratorError9 = true; + _iteratorError9 = err; } finally { try { - if (!_iteratorNormalCompletion5 && _iterator5["return"]) { - _iterator5["return"](); + if (!_iteratorNormalCompletion9 && _iterator9["return"]) { + _iterator9["return"](); } } finally { - if (_didIteratorError5) { - throw _iteratorError5; + if (_didIteratorError9) { + throw _iteratorError9; } } } @@ -720,29 +935,61 @@ var Client = (function () { }, { key: "getChannel", value: function getChannel(key, value) { - var _iteratorNormalCompletion6 = true; - var _didIteratorError6 = false; - var _iteratorError6 = undefined; + var _iteratorNormalCompletion10 = true; + var _didIteratorError10 = false; + var _iteratorError10 = undefined; try { - for (var _iterator6 = this.channelCache[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { - var channel = _step6.value; + for (var _iterator10 = this.channelCache[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) { + var channel = _step10.value; if (channel[key] === value) { return channel; } } } catch (err) { - _didIteratorError6 = true; - _iteratorError6 = err; + _didIteratorError10 = true; + _iteratorError10 = err; } finally { try { - if (!_iteratorNormalCompletion6 && _iterator6["return"]) { - _iterator6["return"](); + if (!_iteratorNormalCompletion10 && _iterator10["return"]) { + _iterator10["return"](); } } finally { - if (_didIteratorError6) { - throw _iteratorError6; + if (_didIteratorError10) { + throw _iteratorError10; + } + } + } + + return this.getPMChannel(key, value); //might be a PM + } + }, { + key: "getPMChannel", + value: function getPMChannel(key, value) { + var _iteratorNormalCompletion11 = true; + var _didIteratorError11 = false; + var _iteratorError11 = undefined; + + try { + for (var _iterator11 = this.pmChannelCache[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) { + var channel = _step11.value; + + if (channel[key] === value) { + return channel; + } + } + } catch (err) { + _didIteratorError11 = true; + _iteratorError11 = err; + } finally { + try { + if (!_iteratorNormalCompletion11 && _iterator11["return"]) { + _iterator11["return"](); + } + } finally { + if (_didIteratorError11) { + throw _iteratorError11; } } } @@ -754,29 +1001,29 @@ var Client = (function () { }, { key: "getServer", value: function getServer(key, value) { - var _iteratorNormalCompletion7 = true; - var _didIteratorError7 = false; - var _iteratorError7 = undefined; + var _iteratorNormalCompletion12 = true; + var _didIteratorError12 = false; + var _iteratorError12 = undefined; try { - for (var _iterator7 = this.serverCache[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { - var server = _step7.value; + for (var _iterator12 = this.serverCache[Symbol.iterator](), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) { + var server = _step12.value; if (server[key] === value) { return server; } } } catch (err) { - _didIteratorError7 = true; - _iteratorError7 = err; + _didIteratorError12 = true; + _iteratorError12 = err; } finally { try { - if (!_iteratorNormalCompletion7 && _iterator7["return"]) { - _iterator7["return"](); + if (!_iteratorNormalCompletion12 && _iterator12["return"]) { + _iterator12["return"](); } } finally { - if (_didIteratorError7) { - throw _iteratorError7; + if (_didIteratorError12) { + throw _iteratorError12; } } } @@ -851,27 +1098,27 @@ var Client = (function () { get: function get() { var msgs = []; - var _iteratorNormalCompletion8 = true; - var _didIteratorError8 = false; - var _iteratorError8 = undefined; + var _iteratorNormalCompletion13 = true; + var _didIteratorError13 = false; + var _iteratorError13 = undefined; try { - for (var _iterator8 = this.channelCache[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { - var channel = _step8.value; + for (var _iterator13 = this.channelCache[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) { + var channel = _step13.value; msgs = msgs.concat(channel.messages); } } catch (err) { - _didIteratorError8 = true; - _iteratorError8 = err; + _didIteratorError13 = true; + _iteratorError13 = err; } finally { try { - if (!_iteratorNormalCompletion8 && _iterator8["return"]) { - _iterator8["return"](); + if (!_iteratorNormalCompletion13 && _iterator13["return"]) { + _iterator13["return"](); } } finally { - if (_didIteratorError8) { - throw _iteratorError8; + if (_didIteratorError13) { + throw _iteratorError13; } } } diff --git a/lib/PMChannel.js b/lib/PMChannel.js index 31911a4d3..ae44d3d60 100644 --- a/lib/PMChannel.js +++ b/lib/PMChannel.js @@ -1,8 +1,61 @@ "use strict"; -var User = require("./user.js").User; +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); -exports.PMChannel = function (user, id) { - this.user = new User(user); - this.id = id; -}; \ No newline at end of file +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var PMChannel = (function () { + function PMChannel(data, client) { + _classCallCheck(this, PMChannel); + + this.user = client.getUser("id", data.recipient.id); + this.id = data.id; + this.messages = []; + } + + _createClass(PMChannel, [{ + key: "addMessage", + value: function addMessage(data) { + if (!this.getMessage("id", data.id)) { + this.messages.push(data); + } + return this.getMessage("id", data.id); + } + }, { + key: "getMessage", + value: function getMessage(key, value) { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = this.messages[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var message = _step.value; + + if (message[key] === value) { + return message; + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"]) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return null; + } + }]); + + return PMChannel; +})(); + +module.exports = PMChannel; \ No newline at end of file diff --git a/src/Client.js b/src/Client.js index 156279419..f4f1ddbaa 100644 --- a/src/Client.js +++ b/src/Client.js @@ -5,6 +5,7 @@ var Server = require("./Server.js"); var Channel = require("./Channel.js"); var Message = require("./Message.js"); var Invite = require("./Invite.js"); +var PMChannel = require("./PMChannel.js"); //node modules var request = require("superagent"); @@ -42,6 +43,7 @@ class Client { this.userCache = []; this.channelCache = []; this.serverCache = []; + this.pmChannelCache = []; this.readyTime = null; } @@ -274,9 +276,9 @@ class Client { var self = this; return new Promise(function (resolve, reject) { - + var destination; - + if (serverOrChannel instanceof Server) { destination = serverOrChannel.id; } else if (serverOrChannel instanceof Channel) { @@ -296,10 +298,10 @@ class Client { .set("authorization", self.token) .send(options) .end(function (err, res) { - if(err){ + if (err) { callback(err); reject(err); - }else{ + } else { var inv = new Invite(res.body, self); callback(null, inv); resolve(inv); @@ -308,6 +310,132 @@ class Client { }); } + + startPM(user) { + + var self = this; + + return new Promise(function (resolve, reject) { + var userId = user; + if (user instanceof User) { + userId = user.id; + } + request + .post(`${Endpoints.USERS}/${self.user.id}/channels`) + .set("authorization", self.token) + .send({ + recipient_id: userId + }) + .end(function (err, res) { + if (err) { + reject(err); + } else { + resolve(self.addPMChannel(res.body)); + } + }); + }); + + } + + sendMessage(destination, message, callback = function (err, msg) { }) { + + var self = this; + + return new Promise(function (resolve, reject) { + + message = resolveMessage(message); + var mentions = resolveMentions(); + destination = resolveDestination(destination); + + if (destination) + send(); + + function send() { + + request + .post(`${Endpoints.CHANNELS}/${destination}/messages`) + .set("authorization", self.token) + .send({ + content: message, + mentions: mentions + }) + .end(function (err, res) { + + if (err) { + callback(err); + reject(err); + } else { + var data = res.body; + + var mentions = []; + + data.mentions = data.mentions || []; //for some reason this was not defined at some point? + + for (var mention of data.mentions) { + mentions.push(self.addUser(mention)); + } + + var channel = self.getChannel("id", data.channel_id); + if (channel) { + var msg = channel.addMessage(new Message(data, channel, mentions, self.addUser(data.author))); + callback(null, msg); + resolve(msg); + } + } + + }); + + } + + function resolveDestination() { + var channId = false; + + if (destination instanceof Server) { + channId = destination.id; //general is the same as server id + } else if (destination instanceof Channel) { + channId = destination.id; + } else if (destination instanceof Message) { + channId = destination.channel.id; + } else if (destination instanceof User) { + + //check if we have a PM + for (var pmc of self.pmChannelCache) { + if (pmc.user.equals(destination)) { + return pmc.id; + } + } + + //we don't, at this point we're late + self.startPM(destination).then(function (pmc) { + destination = pmc.id; + send(); + }); + + } else { + channId = destination; + } + + return channId; + } + + function resolveMessage() { + var msg = message; + if (message instanceof Array) { + msg = message.join("\n"); + } + return msg; + } + + function resolveMentions() { + var _mentions = []; + for (var mention of (message.match(/<@[^>]*>/g) || [])) { + _mentions.push(mention.substring(2, mention.length - 1)); + } + return _mentions; + } + + }); + } //def createws createws() { @@ -355,9 +483,14 @@ class Client { var server = self.addServer(_server); } + + for (var _pmc of data.private_channels) { + var pmc = self.addPMChannel(_pmc); + } + self.trigger("ready"); self.readyTime = Date.now(); - self.debug(`cached ${self.serverCache.length} servers, ${self.channelCache.length} channels and ${self.userCache.length} users.`); + self.debug(`cached ${self.serverCache.length} servers, ${self.channelCache.length} channels, ${self.pmChannelCache.length} PMs and ${self.userCache.length} users.`); setInterval(function () { self.keepAlive.apply(self); @@ -480,7 +613,7 @@ class Client { }*/ - if(self.serverCreateListener.get(data.id)){ + if (self.serverCreateListener.get(data.id)) { var cbs = self.serverCreateListener.get(data.id); cbs[0](server); //promise then callback cbs[1](null, server); //legacy callback @@ -609,6 +742,13 @@ class Client { } return this.getChannel("id", data.id); } + + addPMChannel(data) { + if (!this.getPMChannel("id", data.id)) { + this.pmChannelCache.push(new PMChannel(data, this)); + } + return this.getPMChannel("id", data.id); + } //def addServer addServer(data) { @@ -645,6 +785,15 @@ class Client { return channel; } } + return this.getPMChannel(key, value); //might be a PM + } + + getPMChannel(key, value) { + for (var channel of this.pmChannelCache) { + if (channel[key] === value) { + return channel; + } + } return null; } diff --git a/src/PMChannel.js b/src/PMChannel.js index 1bfe3c155..6b069d50b 100644 --- a/src/PMChannel.js +++ b/src/PMChannel.js @@ -1,6 +1,25 @@ -var User = require("./user.js").User; - -exports.PMChannel = function(user, id){ - this.user = new User(user); - this.id = id; +class PMChannel { + constructor(data, client) { + this.user = client.getUser("id", data.recipient.id); + this.id = data.id; + this.messages = []; + } + + addMessage(data){ + if(!this.getMessage("id", data.id)){ + this.messages.push(data); + } + return this.getMessage("id", data.id); + } + + getMessage(key, value){ + for(var message of this.messages){ + if(message[key] === value){ + return message; + } + } + return null; + } } + +module.exports = PMChannel; \ No newline at end of file diff --git a/test/bot.js b/test/bot.js index 4a6de2d55..59e4783c3 100644 --- a/test/bot.js +++ b/test/bot.js @@ -15,8 +15,12 @@ mybot.on("ready", function () { }) mybot.on("message", function (msg) { - console.log("Another message by " + msg.author.username + "... now I have " + mybot.messages.length + " I have been online for " + mybot.uptime); -}) + + if(msg.content === "pmme"){ + mybot.sendMessage(msg.channel, "You know what "+msg.sender+"? NO"); + } + +}); mybot.on("messageDelete", function (channel, message) {