diff --git a/lib/Client.js b/lib/Client.js index 4d097628b..526ea0d77 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -64,6 +64,7 @@ var Client = (function () { this.pmChannelCache = []; this.readyTime = null; this.checkingQueue = {}; + this.userTypingListener = {}; this.queue = {}; this.__idleTime = null; @@ -352,7 +353,7 @@ var Client = (function () { var self = this; - var prom = new Promise(function (resolve, reject) { + return new Promise(function (resolve, reject) { if (timeout) { setTimeout(remove, timeout); } else { @@ -360,37 +361,25 @@ var Client = (function () { } function remove() { - if (self.options.queue) { - if (!self.queue[message.channel.id]) { - self.queue[message.channel.id] = []; + request.del(Endpoints.CHANNELS + "/" + message.channel.id + "/messages/" + message.id).set("authorization", self.token).end(function (err, res) { + if (err) { + bad(); + } else { + good(); } - 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); + callback(); resolve(); } function bad(err) { - prom.error = err; callback(err); reject(err); } }); - - return prom; } }, { key: "updateMessage", @@ -1127,6 +1116,30 @@ var Client = (function () { break; + case "TYPING_START": + + var userInCache = self.getUser("id", data.user_id); + var channelInCache = self.getChannel("id", data.channel_id); + + if (!self.userTypingListener[data.user_id] || self.userTypingListener[data.user_id] === -1) { + self.trigger("startTyping", userInCache, channelInCache); + } + + self.userTypingListener[data.user_id] = Date.now(); + + setTimeout(function () { + if (self.userTypingListener[data.user_id] === -1) { + return; + } + if (Date.now() - self.userTypingListener[data.user_id] > 6000) { + // stopped typing + self.trigger("stopTyping", userInCache, channelInCache); + self.userTypingListener[data.user_id] = -1; + } + }, 6000); + + break; + default: self.debug("received unknown packet"); self.trigger("unknown", dat); @@ -1598,102 +1611,6 @@ 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) { - var _this = this; - - var self = this; - - if (!this.checkingQueue[channelID]) { - (function () { - var doNext = function doNext() { - if (self.queue[channelID].length === 0) { - done(); - return; - } - var queuedEvent = self.queue[channelID][0]; - switch (queuedEvent.action) { - case "sendMessage": - var msgToSend = queuedEvent; - self._sendMessage(channelID, msgToSend.content, msgToSend.tts, msgToSend.mentions).then(function (msg) { - msgToSend.then(msg); - self.queue[channelID].shift(); - doNext(); - })["catch"](function (err) { - msgToSend.error(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.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; - 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; - } - }; - - var done = function done() { - self.checkingQueue[channelID] = false; - return; - }; - - //if we aren't already checking this queue. - _this.checkingQueue[channelID] = true; - doNext(); - })(); - } - } }, { key: "getGateway", value: function getGateway() { @@ -1925,4 +1842,4 @@ var Client = (function () { return Client; })(); -module.exports = Client; +module.exports = Client; \ No newline at end of file diff --git a/lib/Endpoints.js b/lib/Endpoints.js index e55f0f580..271b465eb 100644 --- a/lib/Endpoints.js +++ b/lib/Endpoints.js @@ -10,4 +10,4 @@ exports.LOGIN = exports.AUTH + "/login"; exports.LOGOUT = exports.AUTH + "/logout"; exports.USERS = exports.API + "/users"; exports.SERVERS = exports.API + "/guilds"; -exports.CHANNELS = exports.API + "/channels"; +exports.CHANNELS = exports.API + "/channels"; \ No newline at end of file diff --git a/lib/Member.js b/lib/Member.js index 471460e77..7d7b03f1a 100644 --- a/lib/Member.js +++ b/lib/Member.js @@ -18,4 +18,4 @@ var Member = (function (_User) { } return Member; -})(User); +})(User); \ No newline at end of file diff --git a/lib/PMChannel.js b/lib/PMChannel.js index 6eb8134de..0dbc0405e 100644 --- a/lib/PMChannel.js +++ b/lib/PMChannel.js @@ -68,4 +68,4 @@ var PMChannel = (function () { return PMChannel; })(); -module.exports = PMChannel; +module.exports = PMChannel; \ No newline at end of file diff --git a/lib/Permissions.js b/lib/Permissions.js index 3b7c8f256..a1f4f3083 100644 --- a/lib/Permissions.js +++ b/lib/Permissions.js @@ -45,4 +45,4 @@ var Permission = (function () { }]); return Permission; -})(); +})(); \ No newline at end of file diff --git a/lib/channel.js b/lib/channel.js index 90a2d7428..bb67fcf4f 100644 --- a/lib/channel.js +++ b/lib/channel.js @@ -98,4 +98,4 @@ var Channel = (function () { return Channel; })(); -module.exports = Channel; +module.exports = Channel; \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index f0c3c0ab7..6a2f82f05 100644 --- a/lib/index.js +++ b/lib/index.js @@ -9,4 +9,4 @@ var Discord = { Client: Client }; -module.exports = Discord; +module.exports = Discord; \ No newline at end of file diff --git a/lib/internal.js b/lib/internal.js index e8b3385da..3acf5940b 100644 --- a/lib/internal.js +++ b/lib/internal.js @@ -200,4 +200,4 @@ Internal.XHR.setUsername = function (token, avatar, email, newPassword, password }); }; -exports.Internal = Internal; +exports.Internal = Internal; \ No newline at end of file diff --git a/lib/invite.js b/lib/invite.js index 7bc8204bd..5f51dc1a9 100644 --- a/lib/invite.js +++ b/lib/invite.js @@ -32,4 +32,4 @@ var Invite = (function () { return Invite; })(); -module.exports = Invite; +module.exports = Invite; \ No newline at end of file diff --git a/lib/message.js b/lib/message.js index f3f3c574a..3dd4ddcae 100644 --- a/lib/message.js +++ b/lib/message.js @@ -76,4 +76,4 @@ var Message = (function () { return Message; })(); -module.exports = Message; +module.exports = Message; \ No newline at end of file diff --git a/lib/server.js b/lib/server.js index 8bd9332a2..c8758d5da 100644 --- a/lib/server.js +++ b/lib/server.js @@ -180,4 +180,4 @@ var Server = (function () { return Server; })(); -module.exports = Server; +module.exports = Server; \ No newline at end of file diff --git a/lib/user.js b/lib/user.js index e2b2ca256..5e38e132e 100644 --- a/lib/user.js +++ b/lib/user.js @@ -54,4 +54,4 @@ var User = (function () { return User; })(); -module.exports = User; +module.exports = User; \ No newline at end of file diff --git a/src/Client.js b/src/Client.js index aa396fb4e..6dd6c0fd9 100644 --- a/src/Client.js +++ b/src/Client.js @@ -54,6 +54,7 @@ class Client { this.pmChannelCache = []; this.readyTime = null; this.checkingQueue = {}; + this.userTypingListener = {}; this.queue = {}; this.__idleTime = null; @@ -389,7 +390,7 @@ class Client { var self = this; - var prom = new Promise(function (resolve, reject) { + return new Promise(function (resolve, reject) { if (timeout) { setTimeout(remove, timeout) } else { @@ -397,37 +398,29 @@ class Client { } function remove() { - if (self.options.queue) { - if (!self.queue[message.channel.id]) { - self.queue[message.channel.id] = []; + request + .del(`${Endpoints.CHANNELS}/${message.channel.id}/messages/${message.id}`) + .set("authorization", self.token) + .end(function (err, res) { + if(err){ + bad(); + }else{ + good(); } - 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); + callback(); resolve(); } function bad(err) { - prom.error = err; callback(err); reject(err); } }); - - return prom; + } updateMessage(message, content, callback = function (err, msg) { }) { @@ -1031,6 +1024,30 @@ class Client { } break; + + case "TYPING_START": + + var userInCache = self.getUser("id", data.user_id); + var channelInCache = self.getChannel("id", data.channel_id); + + if(!self.userTypingListener[data.user_id] || self.userTypingListener[data.user_id] === -1){ + self.trigger("startTyping", userInCache, channelInCache); + } + + self.userTypingListener[data.user_id] = Date.now(); + + setTimeout(function(){ + if(self.userTypingListener[data.user_id] === -1){ + return; + } + if( Date.now() - self.userTypingListener[data.user_id] > 6000 ){ + // stopped typing + self.trigger("stopTyping", userInCache, channelInCache); + self.userTypingListener[data.user_id] = -1; + } + }, 6000); + + break; default: self.debug("received unknown packet"); @@ -1338,108 +1355,6 @@ 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) { - - var self = this; - - if (!this.checkingQueue[channelID]) { - //if we aren't already checking this queue. - this.checkingQueue[channelID] = true; - doNext(); - - function doNext() { - if (self.queue[channelID].length === 0) { - done(); - return; - } - var queuedEvent = self.queue[channelID][0]; - switch (queuedEvent.action) { - case "sendMessage": - var msgToSend = queuedEvent; - self._sendMessage(channelID, msgToSend.content, msgToSend.tts, msgToSend.mentions) - .then(function (msg) { - msgToSend.then(msg); - self.queue[channelID].shift(); - doNext(); - }) - .catch(function (err) { - msgToSend.error(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.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; - 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; - } - } - - function done() { - self.checkingQueue[channelID] = false; - return; - } - } - } - getGateway() { var self = this; return new Promise(function (resolve, reject) { diff --git a/test/bot.1.js b/test/bot.1.js index 2531ad78e..d1eb296a7 100644 --- a/test/bot.1.js +++ b/test/bot.1.js @@ -52,6 +52,13 @@ mybot.on("channelUpdate", function(oldChan, newChan){ }); +mybot.on("startTyping", function(user, channel){ + console.log("start", user); +}); +mybot.on("stopTyping", function(user, channel){ + console.log("stop", user); +}); + function dump(msg) { console.log(msg); }