From 71db8555fecfe01d230ca11036a13bf0da30d660 Mon Sep 17 00:00:00 2001 From: Nicholas Tay Date: Wed, 11 May 2016 02:21:55 +1000 Subject: [PATCH] Bulk deletion of messages (#336) (#337) --- lib/Client/Client.js | 16 ++++ lib/Client/InternalClient.js | 178 ++++++++++++++++++++++------------- src/Client/Client.js | 15 +++ src/Client/InternalClient.js | 31 ++++++ 4 files changed, 174 insertions(+), 66 deletions(-) diff --git a/lib/Client/Client.js b/lib/Client/Client.js index 6e5b74371..2b4ede57e 100644 --- a/lib/Client/Client.js +++ b/lib/Client/Client.js @@ -408,6 +408,22 @@ var Client = (function (_EventEmitter) { return this.internal.deleteMessage(message, options).then(dataCallback(callback), errorCallback(callback)); }; + /** + * Bulk deletes messages (if the client has permission to) + * @param {Array} message the message to delete + * @param {function(err: Error)} [callback] callback to the method + * @returns {Promise} Resolves with null if the deletion was successful, otherwise rejects with an Error. + * @example + * // deleting messages + * client.deleteMessages([message1, message2]); + */ + + Client.prototype.deleteMessages = function deleteMessages(messages) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.deleteMessages(messages).then(dataCallback(callback), errorCallback(callback)); + }; + /** * Edits a previously sent message (if the client has permission to) * @param {MessageResolvable} message the message to edit diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index 3ecae194d..8ef6ffbf3 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -837,6 +837,52 @@ var InternalClient = (function () { }); }; + // def deleteMessages + + InternalClient.prototype.deleteMessages = function deleteMessages(_messages) { + if (!_messages instanceof Array) return Promise.reject(new Error("Messages provided must be in an array")); + if (_messages.length < 1) return Promise.reject(new Error("You must provide at least one message to delete")); + + var messages = []; + var channel; + for (var _iterator4 = _messages, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { + var _ref4; + + if (_isArray4) { + if (_i4 >= _iterator4.length) break; + _ref4 = _iterator4[_i4++]; + } else { + _i4 = _iterator4.next(); + if (_i4.done) break; + _ref4 = _i4.value; + } + + var _message = _ref4; + + var message = this.resolver.resolveMessage(_message); + if (!message) return Promise.reject(new Error("Something other than a message could not be resolved in the array...")); + + // ensure same channel + if (!channel) { + channel = message.channel; + } else { + if (message.channel.id !== channel.id) return Promise.reject(new Error("You can only bulk delete messages from the same channel at one time...")); + } + + messages.push(message); + } + + return this.apiRequest("post", _Constants.Endpoints.CHANNEL_MESSAGES(channel.id) + "/bulk_delete", true, { + messages: messages.map(function (m) { + return m.id; + }) + }).then(function () { + return messages.forEach(function (m) { + return channel.messages.remove(m); + }); + }); + }; + // def updateMessage InternalClient.prototype.updateMessage = function updateMessage(msg, _content) { @@ -1068,19 +1114,19 @@ var InternalClient = (function () { if (data.permissions) { newData.permissions = 0; - for (var _iterator4 = data.permissions, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { - var _ref4; + for (var _iterator5 = data.permissions, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref5; - if (_isArray4) { - if (_i4 >= _iterator4.length) break; - _ref4 = _iterator4[_i4++]; + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref5 = _iterator5[_i5++]; } else { - _i4 = _iterator4.next(); - if (_i4.done) break; - _ref4 = _i4.value; + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref5 = _i5.value; } - var perm = _ref4; + var perm = _ref5; if (perm instanceof String || typeof perm === "string") { newData.permissions |= _Constants.Permissions[perm] || 0; @@ -1163,19 +1209,19 @@ var InternalClient = (function () { var roledata = role.server.rolesOf(member); if (roledata) { - for (var _iterator5 = roledata, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { - var _ref5; + for (var _iterator6 = roledata, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref6; - if (_isArray5) { - if (_i5 >= _iterator5.length) break; - _ref5 = _iterator5[_i5++]; + if (_isArray6) { + if (_i6 >= _iterator6.length) break; + _ref6 = _iterator6[_i6++]; } else { - _i5 = _iterator5.next(); - if (_i5.done) break; - _ref5 = _i5.value; + _i6 = _iterator6.next(); + if (_i6.done) break; + _ref6 = _i6.value; } - var r = _ref5; + var r = _ref6; if (r.id == role.id) { return r; @@ -1213,19 +1259,19 @@ var InternalClient = (function () { return r.id; }); - for (var _iterator6 = roles, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { - var _ref6; + for (var _iterator7 = roles, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { + var _ref7; - if (_isArray6) { - if (_i6 >= _iterator6.length) break; - _ref6 = _iterator6[_i6++]; + if (_isArray7) { + if (_i7 >= _iterator7.length) break; + _ref7 = _iterator7[_i7++]; } else { - _i6 = _iterator6.next(); - if (_i6.done) break; - _ref6 = _i6.value; + _i7 = _iterator7.next(); + if (_i7.done) break; + _ref7 = _i7.value; } - var role = _ref6; + var role = _ref7; if (!role.server.memberMap[member.id]) { return Promise.reject(new Error("member not in server")); @@ -1822,26 +1868,7 @@ var InternalClient = (function () { if (!data.unavailable) { client.emit("serverDeleted", server); - for (var _iterator7 = server.channels, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { - var _ref7; - - if (_isArray7) { - if (_i7 >= _iterator7.length) break; - _ref7 = _iterator7[_i7++]; - } else { - _i7 = _iterator7.next(); - if (_i7.done) break; - _ref7 = _i7.value; - } - - var channel = _ref7; - - self.channels.remove(channel); - } - - self.servers.remove(server); - - for (var _iterator8 = server.members, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { + for (var _iterator8 = server.channels, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { var _ref8; if (_isArray8) { @@ -1853,22 +1880,41 @@ var InternalClient = (function () { _ref8 = _i8.value; } - var user = _ref8; + var channel = _ref8; + + self.channels.remove(channel); + } + + self.servers.remove(server); + + for (var _iterator9 = server.members, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { + var _ref9; + + if (_isArray9) { + if (_i9 >= _iterator9.length) break; + _ref9 = _iterator9[_i9++]; + } else { + _i9 = _iterator9.next(); + if (_i9.done) break; + _ref9 = _i9.value; + } + + var user = _ref9; var found = false; - for (var _iterator9 = self.servers, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { - var _ref9; + for (var _iterator10 = self.servers, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { + var _ref10; - if (_isArray9) { - if (_i9 >= _iterator9.length) break; - _ref9 = _iterator9[_i9++]; + if (_isArray10) { + if (_i10 >= _iterator10.length) break; + _ref10 = _iterator10[_i10++]; } else { - _i9 = _iterator9.next(); - if (_i9.done) break; - _ref9 = _i9.value; + _i10 = _iterator10.next(); + if (_i10.done) break; + _ref10 = _i10.value; } - var s = _ref9; + var s = _ref10; if (s.members.get("id", user.id)) { found = true; @@ -2230,19 +2276,19 @@ var InternalClient = (function () { var testtime = Date.now(); - for (var _iterator10 = data.members, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { - var _ref10; + for (var _iterator11 = data.members, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) { + var _ref11; - if (_isArray10) { - if (_i10 >= _iterator10.length) break; - _ref10 = _iterator10[_i10++]; + if (_isArray11) { + if (_i11 >= _iterator11.length) break; + _ref11 = _iterator11[_i11++]; } else { - _i10 = _iterator10.next(); - if (_i10.done) break; - _ref10 = _i10.value; + _i11 = _iterator11.next(); + if (_i11.done) break; + _ref11 = _i11.value; } - var user = _ref10; + var user = _ref11; server.memberMap[user.user.id] = { roles: user.roles.map(function (pid) { diff --git a/src/Client/Client.js b/src/Client/Client.js index cf02c4f8d..4c285fb95 100644 --- a/src/Client/Client.js +++ b/src/Client/Client.js @@ -511,6 +511,21 @@ export default class Client extends EventEmitter { return this.internal.deleteMessage(message, options) .then(dataCallback(callback), errorCallback(callback)); } + + /** + * Bulk deletes messages (if the client has permission to) + * @param {Array} message the message to delete + * @param {function(err: Error)} [callback] callback to the method + * @returns {Promise} Resolves with null if the deletion was successful, otherwise rejects with an Error. + * @example + * // deleting messages + * client.deleteMessages([message1, message2]); + */ + deleteMessages(messages, callback = (/*err, {}*/) => { }) { + return this.internal.deleteMessages(messages) + .then(dataCallback(callback), errorCallback(callback)); + } + /** * Edits a previously sent message (if the client has permission to) * @param {MessageResolvable} message the message to edit diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js index c2f5011b0..0ce154f44 100644 --- a/src/Client/InternalClient.js +++ b/src/Client/InternalClient.js @@ -689,6 +689,37 @@ export default class InternalClient { .then(() => message.channel.messages.remove(message)); } + // def deleteMessages + deleteMessages(_messages) { + if (!_messages instanceof Array) + return Promise.reject(new Error("Messages provided must be in an array")); + if (_messages.length < 1) + return Promise.reject(new Error("You must provide at least one message to delete")) + + var messages = []; + var channel; + for (var _message of _messages) { + var message = this.resolver.resolveMessage(_message); + if (!message) + return Promise.reject(new Error("Something other than a message could not be resolved in the array...")); + + // ensure same channel + if (!channel) { + channel = message.channel; + } else { + if (message.channel.id !== channel.id) + return Promise.reject(new Error("You can only bulk delete messages from the same channel at one time...")); + } + + messages.push(message); + } + + return this.apiRequest("post", `${Endpoints.CHANNEL_MESSAGES(channel.id)}/bulk_delete`, true, { + messages: messages.map(m => m.id) + }) + .then(() => messages.forEach(m => channel.messages.remove(m))); + } + // def updateMessage updateMessage(msg, _content, options = {}) {