diff --git a/lib/Client/Client.js b/lib/Client/Client.js index 603501591..cb0ba321e 100644 --- a/lib/Client/Client.js +++ b/lib/Client/Client.js @@ -1,616 +1,1485 @@ -"use strict";exports.__esModule = true;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;};})();function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var _InternalClient=require("./InternalClient");var _InternalClient2=_interopRequireDefault(_InternalClient);var _events=require("events");var _events2=_interopRequireDefault(_events);var _StructuresPMChannel=require("../Structures/PMChannel");var _StructuresPMChannel2=_interopRequireDefault(_StructuresPMChannel); // This utility function creates an anonymous error handling wrapper function +"use strict"; + +exports.__esModule = true; + +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; }; })(); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _InternalClient = require("./InternalClient"); + +var _InternalClient2 = _interopRequireDefault(_InternalClient); + +var _events = require("events"); + +var _events2 = _interopRequireDefault(_events); + +var _StructuresPMChannel = require("../Structures/PMChannel"); + +var _StructuresPMChannel2 = _interopRequireDefault(_StructuresPMChannel); + +// This utility function creates an anonymous error handling wrapper function // for a given callback. It is used to allow error handling inside the callback // and using other means. -function errorCallback(callback){return function(error){callback(error);throw error;};} // This utility function creates an anonymous handler function to separate the +function errorCallback(callback) { + return function (error) { + callback(error); + throw error; + }; +} + +// This utility function creates an anonymous handler function to separate the // error and the data arguments inside a callback and return the data if it is // eventually done (for promise propagation). -function dataCallback(callback){return function(data){callback(null,data);return data;};} /** +function dataCallback(callback) { + return function (data) { + callback(null, data); + return data; + }; +} + +/** * Used to interface with the Discord API. - */var Client=(function(_EventEmitter){_inherits(Client,_EventEmitter); /** - * Used to instantiate Discord.Client - * @param {ClientOptions} [options] options that should be passed to the Client. - * @example - * // creates a new Client that will try to reconnect whenever it is disconnected. - * var client = new Discord.Client({ - * autoReconnect : true - * }); - */function Client(){var options=arguments.length <= 0 || arguments[0] === undefined?{}:arguments[0];_classCallCheck(this,Client);_EventEmitter.call(this); /** - * Options that were passed to the client when it was instantiated. - * @readonly - * @type {ClientOptions} - */this.options = options || {};this.options.compress = options.compress || !process.browser;this.options.autoReconnect = options.autoReconnect || true;this.options.rateLimitAsError = options.rateLimitAsError || false;this.options.largeThreshold = options.largeThreshold || 250;this.options.maxCachedMessages = options.maxCachedMessages || 1000;this.options.guildCreateTimeout = options.guildCreateTimeout || 1000;this.options.shardId = options.shardId || 0;this.options.shardCount = options.shardCount || 0;this.options.disableEveryone = options.disableEveryone || false;if(typeof options.shardCount === "number" && typeof options.shardId === "number" && options.shardCount > 0){this.options.shard = [options.shardId,options.shardCount];} /** - * Internal Client that the Client wraps around. - * @readonly - * @type {InternalClient} - */this.internal = new _InternalClient2["default"](this);} /** - * The users that the Client is aware of. Only available after `ready` event has been emitted. - * @type {Cache} a Cache of the Users - * @readonly - * @example - * // log usernames of the users that the client is aware of - * for(var user of client.users){ - * console.log(user.username); - * } - */ /** - * Log the client in using a token. If you want to use methods such as `client.setUsername` or `client.setAvatar`, you must also pass the email and password parameters. - * @param {string} token A valid token that can be used to authenticate the account. - * @param {string} [email] Email of the Discord Account. - * @param {string} [password] Password of the Discord Account. - * @param {function(err: Error, token: string)} [callback] callback callback to the method - * @returns {Promise} Resolves with the token if the login was successful, otherwise it rejects with an error. - * @example - * // log the client in - callback - * client.login("token123", null, null, function(error, token){ - * if(!error){ - * console.log(token); - * } - * }); - * @example - * // log the client in - promise - * client.login("token123") - * .then(token => console.log(token)) - * .catch(err => console.log(err)); - */Client.prototype.loginWithToken = function loginWithToken(token){var email=arguments.length <= 1 || arguments[1] === undefined?null:arguments[1];var password=arguments.length <= 2 || arguments[2] === undefined?null:arguments[2];var callback=arguments.length <= 3 || arguments[3] === undefined?function() /*err, token*/{}:arguments[3];if(typeof email === "function"){ // email is the callback -callback = email;email = null;password = null;}return this.internal.loginWithToken(token,email,password).then(dataCallback(callback),errorCallback(callback));}; /** - * Log the client in using an email and password. - * @param {string} email Email of the Discord Account. - * @param {string} password Password of the Discord Account. - * @param {function(err: Error, token: string)} [callback] callback callback to the method - * @returns {Promise} Resolves with the token if the login was successful, otherwise it rejects with an error. - * @example - * // log the client in - callback - * client.login("jeff@gmail.com", "password", function(error, token){ - * if(!error){ - * console.log(token); - * } - * }); - * @example - * // log the client in - promise - * client.login("jeff@gmail.com", "password") - * .then(token => console.log(token)) - * .catch(err => console.log(err)); - */Client.prototype.login = function login(email,password){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, token*/{}:arguments[2];return this.internal.login(email,password).then(dataCallback(callback),errorCallback(callback));}; /** - * Logs the client out gracefully and closes all WebSocket connections. Client still retains its Caches. - * @param {function(err: Error)} [callback] callback callback to the method - * @returns {Promise} Resolves with null if the logout was successful, otherwise it rejects with an error. - * @example - * // log the client out - callback - * client.logout(function(error){ - * if(error){ - * console.log("Couldn't log out."); - * }else{ - * console.log("Logged out!"); - * } - * }); - * @example - * // log the client out - promise - * client.logout() - * .then(() => console.log("Logged out!")) - * .catch(error => console.log("Couldn't log out.")); - */Client.prototype.logout = function logout(){var callback=arguments.length <= 0 || arguments[0] === undefined?function() /*err, {}*/{}:arguments[0];return this.internal.logout().then(dataCallback(callback),errorCallback(callback));}; /** - * Similar to log out but this should be used if you know you aren't going to be creating the Client again later in your program. - * @param {function(err: Error)} [callback] callback callback to the method - * @returns {Promise} Resolves with null if the destruction was successful, otherwise it rejects with an error. - * @example - * // destroy the client - callback - * client.destroy(function(error){ - * if(error){ - * console.log("Couldn't destroy client."); - * }else{ - * console.log("Client destroyed!"); - * } - * }); - * @example - * // destroy the client - promise - * client.destroy() - * .then(() => console.log("Client destroyed!")) - * .catch(error => console.log("Couldn't destroy client.")); - */Client.prototype.destroy = function destroy(){var _this=this;var callback=arguments.length <= 0 || arguments[0] === undefined?function() /*err, {}*/{}:arguments[0];return this.internal.logout().then(function(){return _this.internal.disconnected(true);}).then(dataCallback(callback),errorCallback(callback));}; /** - * Sends a text message to the specified destination. - * @param {TextChannelResolvable} destination where the message should be sent - * @param {StringResolvable} content message you want to send - * @param {MessageOptions} [options] options you want to apply to the message - * @param {function(err: Error, msg: Message)} [callback] to the method - * @returns {Promise} Resolves with a Message if successful, otherwise rejects with an Error. - * @example - * // sending messages - * client.sendMessage(channel, "Hi there!"); - * client.sendMessage(user, "This is a PM message!"); - * client.sendMessage(server, "This message was sent to the #general channel of the server!"); - * client.sendMessage(channel, "This message is TTS.", {tts : true}); - * @example - * // callbacks - * client.sendMessage(channel, "Hi there!", function(err, msg){ - * if(err){ - * console.log("Couldn't send message"); - * }else{ - * console.log("Message sent!"); - * } - * }); - * @example - * // promises - * client.sendMessage(channel, "Hi there!") - * .then(msg => console.log("Message sent!")) - * .catch(err => console.log("Couldn't send message")); - */Client.prototype.sendMessage = function sendMessage(destination,content){var options=arguments.length <= 2 || arguments[2] === undefined?{}:arguments[2];var callback=arguments.length <= 3 || arguments[3] === undefined?function() /*err, msg*/{}:arguments[3];if(typeof options === "function"){ // options is the callback -callback = options;options = {};}if(typeof content === "object" && content.file){ // content has file -options = content;content = "";}return this.internal.sendMessage(destination,content,options).then(dataCallback(callback),errorCallback(callback));}; /** - * Sends a TTS text message to the specified destination. - * @param {TextChannelResolvable} destination where the message should be sent - * @param {StringResolvable} content message you want to send - * @param {function(err: Error, msg: Message)} [callback] to the method - * @returns {Promise} Resolves with a Message if successful, otherwise rejects with an Error. - * @example - * // sending messages - * client.sendTTSMessage(channel, "This message is TTS."); - * @example - * // callbacks - * client.sendTTSMessage(channel, "Hi there!", function(err, msg){ - * if(err){ - * console.log("Couldn't send message"); - * }else{ - * console.log("Message sent!"); - * } - * }); - * @example - * // promises - * client.sendTTSMessage(channel, "Hi there!") - * .then(msg => console.log("Message sent!")) - * .catch(err => console.log("Couldn't send message")); - */Client.prototype.sendTTSMessage = function sendTTSMessage(destination,content){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, msg*/{}:arguments[2];return this.sendMessage(destination,content,{tts:true}).then(dataCallback(callback),errorCallback(callback));}; /** - * Replies to the author of a message in the same channel the message was sent. - * @param {MessageResolvable} message the message to reply to - * @param {StringResolvable} content message you want to send - * @param {MessageOptions} [options] options you want to apply to the message - * @param {function(err: Error, msg: Message)} [callback] to the method - * @returns {Promise} Resolves with a Message if successful, otherwise rejects with an Error. - * @example - * // reply to messages - * client.reply(message, "Hello there!"); - * client.reply(message, "Hello there, this is a TTS reply!", {tts:true}); - * @example - * // callbacks - * client.reply(message, "Hi there!", function(err, msg){ - * if(err){ - * console.log("Couldn't send message"); - * }else{ - * console.log("Message sent!"); - * } - * }); - * @example - * // promises - * client.reply(message, "Hi there!") - * .then(msg => console.log("Message sent!")) - * .catch(err => console.log("Couldn't send message")); - */Client.prototype.reply = function reply(message,content){var options=arguments.length <= 2 || arguments[2] === undefined?{}:arguments[2];var callback=arguments.length <= 3 || arguments[3] === undefined?function() /*err, msg*/{}:arguments[3];if(typeof options === "function"){ // options is the callback -callback = options;options = {};}var msg=this.internal.resolver.resolveMessage(message);if(msg){if(!(msg.channel instanceof _StructuresPMChannel2["default"])){content = msg.author + ", " + content;}return this.internal.sendMessage(msg,content,options).then(dataCallback(callback),errorCallback(callback));}var err=new Error("Destination not resolvable to a message!");callback(err);return Promise.reject(err);}; /** - * Replies to the author of a message in the same channel the message was sent using TTS. - * @param {MessageResolvable} message the message to reply to - * @param {StringResolvable} content message you want to send - * @param {function(err: Error, msg: Message)} [callback] to the method - * @returns {Promise} Resolves with a Message if successful, otherwise rejects with an Error. - * @example - * // reply to messages - * client.replyTTS(message, "Hello there, this is a TTS reply!"); - * @example - * // callbacks - * client.replyTTS(message, "Hi there!", function(err, msg){ - * if(err){ - * console.log("Couldn't send message"); - * }else{ - * console.log("Message sent!"); - * } - * }); - * @example - * // promises - * client.replyTTS(message, "Hi there!") - * .then(msg => console.log("Message sent!")) - * .catch(err => console.log("Couldn't send message")); - */Client.prototype.replyTTS = function replyTTS(message,content){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, msg*/{}:arguments[2];return this.reply(message,content,{tts:true}).then(dataCallback(callback),errorCallback(callback));}; /** - * Deletes a message (if the client has permission to) - * @param {MessageResolvable} message the message to delete - * @param {MessageDeletionOptions} [options] options to apply when deleting the message - * @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.deleteMessage(message); - * client.deleteMessage(message, {wait:5000}); //deletes after 5 seconds - * @example - * // deleting messages - callback - * client.deleteMessage(message, function(err){ - * if(err){ - * console.log("couldn't delete"); - * } - * }); - * @example - * // deleting messages - promise - * client.deleteMessage(message) - * .then(() => console.log("deleted!")) - * .catch(err => console.log("couldn't delete")); - */Client.prototype.deleteMessage = function deleteMessage(message){var options=arguments.length <= 1 || arguments[1] === undefined?{}:arguments[1];var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];if(typeof options === "function"){ // options is the callback -callback = options;options = {};}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 - * @param {StringResolvable} content the new content of the message - * @param {MessageOptions} [options] options to apply to the message - * @param {function(err: Error, msg: Message)} [callback] callback to the method - * @returns {Promise} Resolves with the newly edited message if successful, otherwise rejects with an Error. - * @example - * // editing messages - * client.updateMessage(message, "This is an edit!"); - * @example - * // editing messages - callback - * client.updateMessage(message, "This is an edit!", function(err, msg){ - * if(err){ - * console.log("couldn't edit"); - * } - * }); - * @example - * // editing messages - promise - * client.updateMessage(message, "This is an edit!") - * .then(msg => console.log("edited!")) - * .catch(err => console.log("couldn't edit")); - */Client.prototype.updateMessage = function updateMessage(message,content){var options=arguments.length <= 2 || arguments[2] === undefined?{}:arguments[2];var callback=arguments.length <= 3 || arguments[3] === undefined?function() /*err, msg*/{}:arguments[3];if(typeof options === "function"){ // options is the callback -callback = options;options = {};}return this.internal.updateMessage(message,content,options).then(dataCallback(callback),errorCallback(callback));}; /** - * Gets the logs of a channel with a specified limit, starting from the most recent message. - * @param {TextChannelResolvable} where the channel to get the logs of - * @param {Number} [limit=50] Integer, the maximum amount of messages to retrieve - * @param {ChannelLogsOptions} [options] options to use when getting the logs - * @param {function(err: Error, logs: Array)} [callback] callback to the method - * @returns {Promise, Error>} Resolves with an array of messages if successful, otherwise rejects with an error. - * @example - * // log content of last 500 messages in channel - callback - * client.getChannelLogs(channel, 500, function(err, logs){ - * if(!err){ - * for(var message of logs){ - * console.log(message.content); - * } - * } - * }); - * @example - * // log content of last 500 messages in channel - promise - * client.getChannelLogs(channel, 500) - * .then(logs => { - * for(var message of logs){ - * console.log(message.content); - * } - * }) - * .catch(err => console.log("couldn't fetch logs")); - */Client.prototype.getChannelLogs = function getChannelLogs(where){var limit=arguments.length <= 1 || arguments[1] === undefined?50:arguments[1];var options=arguments.length <= 2 || arguments[2] === undefined?{}:arguments[2];var callback=arguments.length <= 3 || arguments[3] === undefined?function() /*err, logs*/{}:arguments[3];if(typeof options === "function"){ // options is the callback -callback = options;options = {};}else if(typeof limit === "function"){ // options is the callback -callback = limit;limit = 50;}return this.internal.getChannelLogs(where,limit,options).then(dataCallback(callback),errorCallback(callback));}; /** - * Gets a single message of a server - * @param {ChannelResolvable} channel to get the message from - * @param {function(err: Error, msg: Message} [callback] callback to the method - * @returns {Promise} Resolves with a message if the request was successful, otherwise rejects with an error. - * @example - * // get message object off a snowflake and log its content - callback - * client.getMessage(channel, '192696158886428672', function(err, msg) { - * if(!err) { - * console.log(msg.content); - * } else { - * console.log("couldn't get the message"); - * } - * } - * @example - * //get message object off a snowflake and log its content - promise - * client.getMessage(channel, '192696158886428672') - * .then(msg => { - * console.log(msg.content); - * }) - * .catch(err => console.log("couldn't get the message")); - */Client.prototype.getMessage = function getMessage(channel,messageID){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, msg*/{}:arguments[2];return this.internal.getMessage(channel,messageID).then(dataCallback(callback),errorCallback(callback));}; /** - * Pins a message to a channel. - * @param {MessageResolvable} message to pin. - * @returns {Promise} resolves null if successful, otherwise rejects with an error. - * @example - * // pin message - callback - * client.pinMessage(msg, (err) => { - * if(!err) { - * console.log("Successfully pinned message") - * } else { - * console.log("Couldn't pin the message: " + err); - * } - * }); - * @example - * // pin message - promise - * client.pinMessage(msg) - * .then(() => { - * console.log("Successfully pinned message"); - * }) - * .catch(err => console.log("Couldn't pin the message: " + err)); - */Client.prototype.pinMessage = function pinMessage(msg){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err*/{}:arguments[1];return this.internal.pinMessage(msg).then(dataCallback(callback),errorCallback(callback));}; /** - * Unpins a message to a server. - * @param {MessageResolvable} message to unpin. - * @returns {Promise} resolves null if successful, otherwise rejects with an error. - * @example - * // unpin message - callback - * client.unpinMessage(msg, (err) => { - * if(!err) { - * console.log("Successfully unpinned message") - * } else { - * console.log("Couldn't pin the message: " + err); - * } - * }); - * @example - * // unpin message - promise - * client.unpinMessage(msg) - * .then(() => { - * console.log("Successfully unpinned message"); - * }) - * .catch(err => console.log("Couldn't unpin the message: " + err)); - */Client.prototype.unpinMessage = function unpinMessage(msg){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err*/{}:arguments[1];return this.internal.unpinMessage(msg).then(dataCallback(callback),errorCallback(callback));}; /** - * Gets all pinned messages of a channel. - * @param {TextChannelResolvable} where to get the pins from. - * @returns {Promise, Error>} Resolves with an array of messages if successful, otherwise rejects with an error. - * @example - * // log all pinned messages - callback - * client.getPinnedMessages(channel, (err, messages) => { - * if(!err) { - * for(var message of messages) { - * console.log(message.content); - * } - * } else { - * console.log("Couldn't fetch pins: " + err); - * } - * }); - * @example - * // log all pinned messages - promise - * client.getPinnedMessages(channel) - * .then(messages => { - * for(var message of messages) { - * console.log(message.content); - * } - * }) - * .catch(err => console.log("Couldn't fetch pins: " + err)); - */Client.prototype.getPinnedMessages = function getPinnedMessages(channel){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, messages*/{}:arguments[1];return this.internal.getPinnedMessages(channel).then(dataCallback(callback),errorCallback(callback));}; /** - * Gets the banned users of a server (if the client has permission to) - * @param {ServerResolvable} server server to get banned users of - * @param {function(err: Error, bans: Array)} [callback] callback to the method - * @returns {Promise, Error>} Resolves with an array of users if the request was successful, otherwise rejects with an error. - * @example - * // loop through banned users - callback - * client.getBans(server, function(err, bans){ - * if(!err){ - * for(var user of bans){ - * console.log(user.username + " was banned from " + server.name); - * } - * } - * }); - * @example - * // loop through banned users - promise - * client.getBans(server) - * .then(bans => { - * for(var user of bans){ - * console.log(user.username + " was banned from " + server.name); - * } - * }) - * .catch(err => console.log("couldn't get bans")); - */Client.prototype.getBans = function getBans(server){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, bans*/{}:arguments[1];return this.internal.getBans(server).then(dataCallback(callback),errorCallback(callback));}; /** - * Sends a file (embedded if possible) to the specified channel. - * @param {TextChannelResolvable} destination channel to send the file to - * @param {FileResolvable} attachment the file to send - * @param {string} name name of the file, especially including the extension - * @param {function(err: Error, msg: Message)} [callback] callback to the method - * @returns {Promise} resolves with the sent file as a message if successful, otherwise rejects with an error - * @example - * // send a file - callback - * client.sendFile(channel, new Buffer("Hello this a text file"), "file.txt", function(err, msg){ - * if(err){ - * console.log("Couldn't send file!"); - * } - * }); - * @example - * // send a file - promises - * client.sendFile(channel, "C:/path/to/file.txt", "file.txt") - * .then(msg => console.log("sent file!")) - * .catch(err => console.log("couldn't send file!")); - */Client.prototype.sendFile = function sendFile(destination,attachment,name,content){var callback=arguments.length <= 4 || arguments[4] === undefined?function() /*err, m*/{}:arguments[4];if(typeof content === "function"){ // content is the callback -callback = content;content = undefined; // Will get resolved into original filename in internal -}if(typeof name === "function"){ // name is the callback -callback = name;name = undefined; // Will get resolved into original filename in internal -}return this.internal.sendFile(destination,attachment,name,content).then(dataCallback(callback),errorCallback(callback));}; /** - * Client accepts the specified invite to join a server. If the Client is already in the server, the promise/callback resolve immediately. - * @param {InviteIDResolvable} invite invite to the server - * @param {function(err: Error, server: Server)} [callback] callback to the method. - * @returns {Promise} resolves with the newly joined server if succesful, rejects with an error if not. - * @example - * // join a server - callback - * client.joinServer("https://discord.gg/0BwZcrFhUKZ55bJL", function(err, server){ - * if(!err){ - * console.log("Joined " + server.name); - * } - * }); - * @example - * // join a server - promises - * client.joinServer("https://discord.gg/0BwZcrFhUKZ55bJL") - * .then(server => console.log("Joined " + server.name)) - * .catch(err => console.log("Couldn't join!")); - */Client.prototype.joinServer = function joinServer(invite){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, srv*/{}:arguments[1];return this.internal.joinServer(invite).then(dataCallback(callback),errorCallback(callback));}; /** - * Creates a Discord Server and joins it - * @param {string} name the name of the server - * @param {region} [region=london] the region of the server - * @param {function(err: Error, server: Server)} [callback] callback to the method - * @returns {Promise} resolves with the newly created server if successful, rejects with an error if not. - * @example - * //creating a server - callback - * client.createServer("discord.js", "london", function(err, server){ - * if(err){ - * console.log("could not create server"); - * } - * }); - * @example - * //creating a server - promises - * client.createServer("discord.js", "london") - * .then(server => console.log("Made server!")) - * .catch(error => console.log("Couldn't make server!")); - */Client.prototype.createServer = function createServer(name){var region=arguments.length <= 1 || arguments[1] === undefined?"london":arguments[1];var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, srv*/{}:arguments[2];return this.internal.createServer(name,region).then(dataCallback(callback),errorCallback(callback));}; /** - * Leaves a Discord Server - * @param {ServerResolvable} server the server to leave - * @param {function(err: Error)} [callback] callback to the method - * @returns {Promise} resolves null if successful, otherwise rejects with an error. - */Client.prototype.leaveServer = function leaveServer(server){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.internal.leaveServer(server).then(dataCallback(callback),errorCallback(callback));}; // def updateServer -Client.prototype.updateServer = function updateServer(server,options,region){var callback=arguments.length <= 3 || arguments[3] === undefined?function() /*err, srv*/{}:arguments[3];if(typeof region === "function"){ // region is the callback -callback = region;region = undefined;}else if(region && typeof options === "string"){options = {name:options,region:region};}return this.internal.updateServer(server,options).then(dataCallback(callback),errorCallback(callback));}; /** - * Deletes a Discord Server - * @param {ServerResolvable} server the server to leave - * @param {function(err: Error)} [callback] callback to the method - * @returns {Promise} resolves null if successful, otherwise rejects with an error. - */Client.prototype.deleteServer = function deleteServer(server){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.internal.deleteServer(server).then(dataCallback(callback),errorCallback(callback));}; // def createChannel -Client.prototype.createChannel = function createChannel(server,name){var type=arguments.length <= 2 || arguments[2] === undefined?"text":arguments[2];var callback=arguments.length <= 3 || arguments[3] === undefined?function() /*err, channel*/{}:arguments[3];if(typeof type === "function"){ // options is the callback -callback = type;type = "text";}return this.internal.createChannel(server,name,type).then(dataCallback(callback),errorCallback(callback));}; // def deleteChannel -Client.prototype.deleteChannel = function deleteChannel(channel){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.internal.deleteChannel(channel).then(dataCallback(callback),errorCallback(callback));}; // def banMember -Client.prototype.banMember = function banMember(user,server){var length=arguments.length <= 2 || arguments[2] === undefined?1:arguments[2];var callback=arguments.length <= 3 || arguments[3] === undefined?function() /*err, {}*/{}:arguments[3];if(typeof length === "function"){ // length is the callback -callback = length;length = 1;}return this.internal.banMember(user,server,length).then(dataCallback(callback),errorCallback(callback));}; // def unbanMember -Client.prototype.unbanMember = function unbanMember(user,server){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.unbanMember(user,server).then(dataCallback(callback),errorCallback(callback));}; // def kickMember -Client.prototype.kickMember = function kickMember(user,server){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.kickMember(user,server).then(dataCallback(callback),errorCallback(callback));}; // def moveMember -Client.prototype.moveMember = function moveMember(user,channel){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.moveMember(user,channel).then(dataCallback(callback),errorCallback(callback));}; // def muteMember -Client.prototype.muteMember = function muteMember(user,server){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.muteMember(user,server).then(dataCallback(callback),errorCallback(callback));}; // def unmuteMember -Client.prototype.unmuteMember = function unmuteMember(user,server){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.unmuteMember(user,server).then(dataCallback(callback),errorCallback(callback));}; // def deafenMember -Client.prototype.deafenMember = function deafenMember(user,server){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.deafenMember(user,server).then(dataCallback(callback),errorCallback(callback));}; // def undeafenMember -Client.prototype.undeafenMember = function undeafenMember(user,server){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.undeafenMember(user,server).then(dataCallback(callback),errorCallback(callback));}; // def setNickname -Client.prototype.setNickname = function setNickname(server,nick,user){var callback=arguments.length <= 3 || arguments[3] === undefined?function() /*err, {}*/{}:arguments[3];if(typeof user === "function"){ // user is the callback -callback = user;user = null;}if(!user){user = this.user;}return this.internal.setNickname(server,nick,user).then(dataCallback(callback),errorCallback(callback));}; // def setNote -Client.prototype.setNote = function setNote(user,note){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.setNote(user,note).then(dataCallback(callback),errorCallback(callback));}; // def createRole -Client.prototype.createRole = function createRole(server){var data=arguments.length <= 1 || arguments[1] === undefined?null:arguments[1];var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, role*/{}:arguments[2];if(typeof data === "function"){ // data is the callback -callback = data;data = null;}return this.internal.createRole(server,data).then(dataCallback(callback),errorCallback(callback));}; // def updateRole -Client.prototype.updateRole = function updateRole(role){var data=arguments.length <= 1 || arguments[1] === undefined?null:arguments[1];var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, role*/{}:arguments[2];if(typeof data === "function"){ // data is the callback -callback = data;data = null;}return this.internal.updateRole(role,data).then(dataCallback(callback),errorCallback(callback));}; // def deleteRole -Client.prototype.deleteRole = function deleteRole(role){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.internal.deleteRole(role).then(dataCallback(callback),errorCallback(callback));}; // def addMemberToRole -Client.prototype.addMemberToRole = function addMemberToRole(member,role){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.addMemberToRole(member,role).then(dataCallback(callback),errorCallback(callback));}; // def addUserToRole -Client.prototype.addUserToRole = function addUserToRole(member,role){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.addMemberToRole(member,role,callback);}; // def addUserToRole -Client.prototype.memberHasRole = function memberHasRole(member,role){return this.internal.memberHasRole(member,role);}; // def addUserToRole -Client.prototype.userHasRole = function userHasRole(member,role){return this.memberHasRole(member,role);}; // def removeMemberFromRole -Client.prototype.removeMemberFromRole = function removeMemberFromRole(member,role){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.removeMemberFromRole(member,role).then(dataCallback(callback),errorCallback(callback));}; // def removeUserFromRole -Client.prototype.removeUserFromRole = function removeUserFromRole(member,role){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.removeMemberFromRole(member,role,callback);}; // def createInvite -Client.prototype.createInvite = function createInvite(chanServ,options){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, invite*/{}:arguments[2];if(typeof options === "function"){ // options is the callback -callback = options;options = undefined;}return this.internal.createInvite(chanServ,options).then(dataCallback(callback),errorCallback(callback));}; // def deleteInvite -Client.prototype.deleteInvite = function deleteInvite(invite){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.internal.deleteInvite(invite).then(dataCallback(callback),errorCallback(callback));}; // def getInvite -Client.prototype.getInvite = function getInvite(invite){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, inv*/{}:arguments[1];return this.internal.getInvite(invite).then(dataCallback(callback),errorCallback(callback));}; // def getInvites -Client.prototype.getInvites = function getInvites(channel){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, inv*/{}:arguments[1];return this.internal.getInvites(channel).then(dataCallback(callback),errorCallback(callback));}; // def overwritePermissions -Client.prototype.overwritePermissions = function overwritePermissions(channel,role){var options=arguments.length <= 2 || arguments[2] === undefined?{}:arguments[2];var callback=arguments.length <= 3 || arguments[3] === undefined?function() /*err, {}*/{}:arguments[3];return this.internal.overwritePermissions(channel,role,options).then(dataCallback(callback),errorCallback(callback));}; // def setStatus -Client.prototype.setStatus = function setStatus(idleStatus,game){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];if(typeof game === "function"){ // game is the callback -callback = game;game = null;}else if(typeof idleStatus === "function"){ // idleStatus is the callback -callback = idleStatus;game = null;}return this.internal.setStatus(idleStatus,game).then(dataCallback(callback),errorCallback(callback));}; // def sendTyping -Client.prototype.sendTyping = function sendTyping(channel){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.internal.sendTyping(channel).then(dataCallback(callback),errorCallback(callback));}; // def setChannelTopic -Client.prototype.setChannelTopic = function setChannelTopic(channel,topic){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.setChannelTopic(channel,topic).then(dataCallback(callback),errorCallback(callback));}; // def setChannelName -Client.prototype.setChannelName = function setChannelName(channel,name){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.setChannelName(channel,name).then(dataCallback(callback),errorCallback(callback));}; // def setChannelPosition -Client.prototype.setChannelPosition = function setChannelPosition(channel,position){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.setChannelPosition(channel,position).then(dataCallback(callback),errorCallback(callback));}; // def setChannelUserLimit -Client.prototype.setChannelUserLimit = function setChannelUserLimit(channel,limit){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.setChannelUserLimit(channel,limit).then(dataCallback(callback),errorCallback(callback));}; // def setChannelBitrate -Client.prototype.setChannelBitrate = function setChannelBitrate(channel,kbitrate){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.setChannelBitrate(channel,kbitrate).then(dataCallback(callback),errorCallback(callback));}; // def updateChannel -Client.prototype.updateChannel = function updateChannel(channel,data){var callback=arguments.length <= 2 || arguments[2] === undefined?function() /*err, {}*/{}:arguments[2];return this.internal.updateChannel(channel,data).then(dataCallback(callback),errorCallback(callback));}; // def startTyping -Client.prototype.startTyping = function startTyping(channel){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.internal.startTyping(channel).then(dataCallback(callback),errorCallback(callback));}; // def stopTyping -Client.prototype.stopTyping = function stopTyping(channel){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.internal.stopTyping(channel).then(dataCallback(callback),errorCallback(callback));}; // def updateDetails -Client.prototype.updateDetails = function updateDetails(details){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.internal.updateDetails(details).then(dataCallback(callback),errorCallback(callback));}; // def setUsername -Client.prototype.setUsername = function setUsername(name){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.internal.setUsername(name).then(dataCallback(callback),errorCallback(callback));}; // def setAvatar -Client.prototype.setAvatar = function setAvatar(avatar){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.internal.setAvatar(avatar).then(dataCallback(callback),errorCallback(callback));}; // def joinVoiceChannel -Client.prototype.joinVoiceChannel = function joinVoiceChannel(channel){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, channel*/{}:arguments[1];return this.internal.joinVoiceChannel(channel).then(dataCallback(callback),errorCallback(callback));}; // def leaveVoiceChannel -Client.prototype.leaveVoiceChannel = function leaveVoiceChannel(chann){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.internal.leaveVoiceChannel(chann).then(dataCallback(callback),errorCallback(callback));}; // def addFriend -Client.prototype.addFriend = function addFriend(user){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.internal.addFriend(user).then(dataCallback(callback),errorCallback(callback));}; // def removeFriend -Client.prototype.removeFriend = function removeFriend(user){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.internal.removeFriend(user).then(dataCallback(callback),errorCallback(callback));}; // def getOAuthApplication -Client.prototype.getOAuthApplication = function getOAuthApplication(appID){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, bans*/{}:arguments[1];if(typeof appID === "function"){ // appID is the callback -callback = appID;appID = null;}return this.internal.getOAuthApplication(appID).then(dataCallback(callback),errorCallback(callback));}; // def awaitResponse -Client.prototype.awaitResponse = function awaitResponse(msg){var toSend=arguments.length <= 1 || arguments[1] === undefined?null:arguments[1];var _this2=this;var options=arguments.length <= 2 || arguments[2] === undefined?null:arguments[2];var callback=arguments.length <= 3 || arguments[3] === undefined?function() /*err, newMsg*/{}:arguments[3];var ret;if(toSend){if(typeof toSend === "function"){ // (msg, callback) -callback = toSend;toSend = null;options = null;}else { // (msg, toSend, ...) -if(options){if(typeof options === "function"){ //(msg, toSend, callback) -callback = options;options = null;ret = this.sendMessage(msg,toSend);}else { //(msg, toSend, options, callback) -ret = this.sendMessage(msg,toSend,options);}}else { // (msg, toSend) promise -ret = this.sendMessage(msg,toSend);}}}if(!ret){ret = Promise.resolve();} // (msg) promise -return ret.then(function(){return _this2.internal.awaitResponse(msg);}).then(dataCallback(callback),errorCallback(callback));};Client.prototype.setStatusIdle = function setStatusIdle(){var callback=arguments.length <= 0 || arguments[0] === undefined?function() /*err, {}*/{}:arguments[0];return this.internal.setStatus("idle").then(dataCallback(callback),errorCallback(callback));};Client.prototype.setStatusOnline = function setStatusOnline(){var callback=arguments.length <= 0 || arguments[0] === undefined?function() /*err, {}*/{}:arguments[0];return this.internal.setStatus("online").then(dataCallback(callback),errorCallback(callback));};Client.prototype.setStatusActive = function setStatusActive(callback){return this.setStatusOnline(callback);};Client.prototype.setStatusHere = function setStatusHere(callback){return this.setStatusOnline(callback);};Client.prototype.setStatusAvailable = function setStatusAvailable(callback){return this.setStatusOnline(callback);};Client.prototype.setStatusAway = function setStatusAway(callback){return this.setStatusIdle(callback);};Client.prototype.setPlayingGame = function setPlayingGame(game){var callback=arguments.length <= 1 || arguments[1] === undefined?function() /*err, {}*/{}:arguments[1];return this.setStatus(null,game,callback);};Client.prototype.setStreaming = function setStreaming(name,url,type){var callback=arguments.length <= 3 || arguments[3] === undefined?function() /*err, {}*/{}:arguments[3];return this.setStatus(null,{name:name,url:url,type:type},callback);}; //def forceFetchUsers -Client.prototype.forceFetchUsers = function forceFetchUsers(callback){return this.internal.forceFetchUsers().then(callback);};_createClass(Client,[{key:"users",get:function get(){return this.internal.users;} /** - * The server channels the Client is aware of. Only available after `ready` event has been emitted. - * @type {Cache} a Cache of the Server Channels - * @readonly - * @example - * // log the names of the channels and the server they belong to - * for(var channel of client.channels){ - * console.log(`${channel.name} is part of ${channel.server.name}`) - * } - */},{key:"channels",get:function get(){return this.internal.channels;} /** - * The servers the Client is aware of. Only available after `ready` event has been emitted. - * @type {Cache} a Cache of the Servers - * @readonly - * @example - * // log the names of the servers - * for(var server of client.servers){ - * console.log(server.name) - * } - */},{key:"servers",get:function get(){return this.internal.servers;} /** - * The PM/DM chats the Client is aware of. Only available after `ready` event has been emitted. - * @type {Cache} a Cache of the PM/DM Channels. - * @readonly - * @example - * // log the names of the users the client is participating in a PM with - * for(var pm of client.privateChannels){ - * console.log(`Participating in a DM with ${pm.recipient}`) - * } - */},{key:"privateChannels",get:function get(){return this.internal.private_channels;} /** - * The friends that the Client is aware of. Only available after `ready` event has been emitted. - * @type {Cache|null} a Cache of friend Users (or null if bot account) - * @readonly - * @example - * // log names of the friends that the client is aware of - * for(var user of client.friends){ - * console.log(user.username); - * } - */},{key:"friends",get:function get(){return this.internal.friends;} /** - * The incoming friend requests that the Client is aware of. Only available after `ready` event has been emitted. - * @type {Cache|null} a Cache of incoming friend request Users (or null if bot account) - * @readonly - * @example - * // log names of the incoming friend requests that the client is aware of - * for(var user of client.incomingFriendRequests){ - * console.log(user.username); - * } - */},{key:"incomingFriendRequests",get:function get(){return this.internal.incoming_friend_requests;} /** - * The outgoing friend requests that the Client is aware of. Only available after `ready` event has been emitted. - * @type {Cache} a Cache of outgoing friend request Users - * @readonly - * @example - * // log names of the outgoing friend requests that the client is aware of - * for(var user of client.outgoingFriendRequests){ - * console.log(user.username); - * } - */},{key:"outgoingFriendRequests",get:function get(){return this.internal.outgoing_friend_requests;} /** - * A cache of active voice connection of the Client, or null if not applicable. Only available after `ready` event has been emitted. - * @type {Cache} a Cache of Voice Connections - */},{key:"voiceConnections",get:function get(){return this.internal.voiceConnections;} /** - * The first voice connection the bot has connected to. Available for backwards compatibility. - * @type {VoiceConnection} first voice connection - */},{key:"voiceConnection",get:function get(){return this.internal.voiceConnection;} /** - * Unix timestamp of when the Client first emitted the `ready `event. Only available after `ready` event has been emitted. - * @type {Number} timestamp of ready time - * @example - * // output when the client was ready - * console.log("I was first ready at " + client.readyTime); - */},{key:"readyTime",get:function get(){return this.internal.readyTime;} /** - * How long the client has been ready for in milliseconds. Only available after `ready` event has been emitted. - * @type {Number} number in milliseconds representing uptime of the client - * @example - * // log how long the client has been up for - * console.log("I have been online for " + client.uptime + " milliseconds"); - */},{key:"uptime",get:function get(){return this.internal.uptime;} /** - * A User object that represents the account the client is logged into. Only available after `ready` event has been emitted. - * @type {User} user representing logged in account of client. - * @example - * // log username of logged in account of client - * console.log("Logged in as " + client.user.username); - */},{key:"user",get:function get(){return this.internal.user;} /** - * Object containing user-agent information required for API requests. If not modified, it will use discord.js's defaults. - * @type {UserAgent} - * @example - * // log the stringified user-agent: - * console.log(client.userAgent.full); - */},{key:"userAgent",get:function get(){return this.internal.userAgent;}, /** - * Set the user-agent information provided. Follows the UserAgent typedef format excluding the `full` property. - * @type {UserAgent} - */set:function set(userAgent){this.internal.userAgent = userAgent;}}]);return Client;})(_events2["default"]);exports["default"] = Client;module.exports = exports["default"]; + */ + +var Client = (function (_EventEmitter) { + _inherits(Client, _EventEmitter); + + /** + * Used to instantiate Discord.Client + * @param {ClientOptions} [options] options that should be passed to the Client. + * @example + * // creates a new Client that will try to reconnect whenever it is disconnected. + * var client = new Discord.Client({ + * autoReconnect : true + * }); + */ + + function Client() { + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + _classCallCheck(this, Client); + + _EventEmitter.call(this); + /** + * Options that were passed to the client when it was instantiated. + * @readonly + * @type {ClientOptions} + */ + this.options = options || {}; + this.options.compress = options.compress || !process.browser; + this.options.autoReconnect = options.autoReconnect || true; + this.options.rateLimitAsError = options.rateLimitAsError || false; + this.options.largeThreshold = options.largeThreshold || 250; + this.options.maxCachedMessages = options.maxCachedMessages || 1000; + this.options.guildCreateTimeout = options.guildCreateTimeout || 1000; + this.options.shardId = options.shardId || 0; + this.options.shardCount = options.shardCount || 0; + this.options.disableEveryone = options.disableEveryone || false; + + if (typeof options.shardCount === "number" && typeof options.shardId === "number" && options.shardCount > 0) { + this.options.shard = [options.shardId, options.shardCount]; + } + + /** + * Internal Client that the Client wraps around. + * @readonly + * @type {InternalClient} + */ + this.internal = new _InternalClient2["default"](this); + } + + /** + * The users that the Client is aware of. Only available after `ready` event has been emitted. + * @type {Cache} a Cache of the Users + * @readonly + * @example + * // log usernames of the users that the client is aware of + * for(var user of client.users){ + * console.log(user.username); + * } + */ + + /** + * Log the client in using a token. If you want to use methods such as `client.setUsername` or `client.setAvatar`, you must also pass the email and password parameters. + * @param {string} token A valid token that can be used to authenticate the account. + * @param {string} [email] Email of the Discord Account. + * @param {string} [password] Password of the Discord Account. + * @param {function(err: Error, token: string)} [callback] callback callback to the method + * @returns {Promise} Resolves with the token if the login was successful, otherwise it rejects with an error. + * @example + * // log the client in - callback + * client.login("token123", null, null, function(error, token){ + * if(!error){ + * console.log(token); + * } + * }); + * @example + * // log the client in - promise + * client.login("token123") + * .then(token => console.log(token)) + * .catch(err => console.log(err)); + */ + + Client.prototype.loginWithToken = function loginWithToken(token) { + var email = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + var password = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; + var callback = arguments.length <= 3 || arguments[3] === undefined ? function () /*err, token*/{} : arguments[3]; + + if (typeof email === "function") { + // email is the callback + callback = email; + email = null; + password = null; + } + + return this.internal.loginWithToken(token, email, password).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Log the client in using an email and password. + * @param {string} email Email of the Discord Account. + * @param {string} password Password of the Discord Account. + * @param {function(err: Error, token: string)} [callback] callback callback to the method + * @returns {Promise} Resolves with the token if the login was successful, otherwise it rejects with an error. + * @example + * // log the client in - callback + * client.login("jeff@gmail.com", "password", function(error, token){ + * if(!error){ + * console.log(token); + * } + * }); + * @example + * // log the client in - promise + * client.login("jeff@gmail.com", "password") + * .then(token => console.log(token)) + * .catch(err => console.log(err)); + */ + + Client.prototype.login = function login(email, password) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, token*/{} : arguments[2]; + + return this.internal.login(email, password).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Logs the client out gracefully and closes all WebSocket connections. Client still retains its Caches. + * @param {function(err: Error)} [callback] callback callback to the method + * @returns {Promise} Resolves with null if the logout was successful, otherwise it rejects with an error. + * @example + * // log the client out - callback + * client.logout(function(error){ + * if(error){ + * console.log("Couldn't log out."); + * }else{ + * console.log("Logged out!"); + * } + * }); + * @example + * // log the client out - promise + * client.logout() + * .then(() => console.log("Logged out!")) + * .catch(error => console.log("Couldn't log out.")); + */ + + Client.prototype.logout = function logout() { + var callback = arguments.length <= 0 || arguments[0] === undefined ? function () /*err, {}*/{} : arguments[0]; + + return this.internal.logout().then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Similar to log out but this should be used if you know you aren't going to be creating the Client again later in your program. + * @param {function(err: Error)} [callback] callback callback to the method + * @returns {Promise} Resolves with null if the destruction was successful, otherwise it rejects with an error. + * @example + * // destroy the client - callback + * client.destroy(function(error){ + * if(error){ + * console.log("Couldn't destroy client."); + * }else{ + * console.log("Client destroyed!"); + * } + * }); + * @example + * // destroy the client - promise + * client.destroy() + * .then(() => console.log("Client destroyed!")) + * .catch(error => console.log("Couldn't destroy client.")); + */ + + Client.prototype.destroy = function destroy() { + var _this = this; + + var callback = arguments.length <= 0 || arguments[0] === undefined ? function () /*err, {}*/{} : arguments[0]; + + return this.internal.logout().then(function () { + return _this.internal.disconnected(true); + }).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Sends a text message to the specified destination. + * @param {TextChannelResolvable} destination where the message should be sent + * @param {StringResolvable} content message you want to send + * @param {MessageOptions} [options] options you want to apply to the message + * @param {function(err: Error, msg: Message)} [callback] to the method + * @returns {Promise} Resolves with a Message if successful, otherwise rejects with an Error. + * @example + * // sending messages + * client.sendMessage(channel, "Hi there!"); + * client.sendMessage(user, "This is a PM message!"); + * client.sendMessage(server, "This message was sent to the #general channel of the server!"); + * client.sendMessage(channel, "This message is TTS.", {tts : true}); + * @example + * // callbacks + * client.sendMessage(channel, "Hi there!", function(err, msg){ + * if(err){ + * console.log("Couldn't send message"); + * }else{ + * console.log("Message sent!"); + * } + * }); + * @example + * // promises + * client.sendMessage(channel, "Hi there!") + * .then(msg => console.log("Message sent!")) + * .catch(err => console.log("Couldn't send message")); + */ + + Client.prototype.sendMessage = function sendMessage(destination, content) { + var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + var callback = arguments.length <= 3 || arguments[3] === undefined ? function () /*err, msg*/{} : arguments[3]; + + if (typeof options === "function") { + // options is the callback + callback = options; + options = {}; + } + if (typeof content === "object" && content.file) { + // content has file + options = content; + content = ""; + } + + return this.internal.sendMessage(destination, content, options).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Sends a TTS text message to the specified destination. + * @param {TextChannelResolvable} destination where the message should be sent + * @param {StringResolvable} content message you want to send + * @param {function(err: Error, msg: Message)} [callback] to the method + * @returns {Promise} Resolves with a Message if successful, otherwise rejects with an Error. + * @example + * // sending messages + * client.sendTTSMessage(channel, "This message is TTS."); + * @example + * // callbacks + * client.sendTTSMessage(channel, "Hi there!", function(err, msg){ + * if(err){ + * console.log("Couldn't send message"); + * }else{ + * console.log("Message sent!"); + * } + * }); + * @example + * // promises + * client.sendTTSMessage(channel, "Hi there!") + * .then(msg => console.log("Message sent!")) + * .catch(err => console.log("Couldn't send message")); + */ + + Client.prototype.sendTTSMessage = function sendTTSMessage(destination, content) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, msg*/{} : arguments[2]; + + return this.sendMessage(destination, content, { tts: true }).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Replies to the author of a message in the same channel the message was sent. + * @param {MessageResolvable} message the message to reply to + * @param {StringResolvable} content message you want to send + * @param {MessageOptions} [options] options you want to apply to the message + * @param {function(err: Error, msg: Message)} [callback] to the method + * @returns {Promise} Resolves with a Message if successful, otherwise rejects with an Error. + * @example + * // reply to messages + * client.reply(message, "Hello there!"); + * client.reply(message, "Hello there, this is a TTS reply!", {tts:true}); + * @example + * // callbacks + * client.reply(message, "Hi there!", function(err, msg){ + * if(err){ + * console.log("Couldn't send message"); + * }else{ + * console.log("Message sent!"); + * } + * }); + * @example + * // promises + * client.reply(message, "Hi there!") + * .then(msg => console.log("Message sent!")) + * .catch(err => console.log("Couldn't send message")); + */ + + Client.prototype.reply = function reply(message, content) { + var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + var callback = arguments.length <= 3 || arguments[3] === undefined ? function () /*err, msg*/{} : arguments[3]; + + if (typeof options === "function") { + // options is the callback + callback = options; + options = {}; + } + + var msg = this.internal.resolver.resolveMessage(message); + if (msg) { + if (!(msg.channel instanceof _StructuresPMChannel2["default"])) { + content = msg.author + ", " + content; + } + return this.internal.sendMessage(msg, content, options).then(dataCallback(callback), errorCallback(callback)); + } + var err = new Error("Destination not resolvable to a message!"); + callback(err); + return Promise.reject(err); + }; + + /** + * Replies to the author of a message in the same channel the message was sent using TTS. + * @param {MessageResolvable} message the message to reply to + * @param {StringResolvable} content message you want to send + * @param {function(err: Error, msg: Message)} [callback] to the method + * @returns {Promise} Resolves with a Message if successful, otherwise rejects with an Error. + * @example + * // reply to messages + * client.replyTTS(message, "Hello there, this is a TTS reply!"); + * @example + * // callbacks + * client.replyTTS(message, "Hi there!", function(err, msg){ + * if(err){ + * console.log("Couldn't send message"); + * }else{ + * console.log("Message sent!"); + * } + * }); + * @example + * // promises + * client.replyTTS(message, "Hi there!") + * .then(msg => console.log("Message sent!")) + * .catch(err => console.log("Couldn't send message")); + */ + + Client.prototype.replyTTS = function replyTTS(message, content) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, msg*/{} : arguments[2]; + + return this.reply(message, content, { tts: true }).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Deletes a message (if the client has permission to) + * @param {MessageResolvable} message the message to delete + * @param {MessageDeletionOptions} [options] options to apply when deleting the message + * @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.deleteMessage(message); + * client.deleteMessage(message, {wait:5000}); //deletes after 5 seconds + * @example + * // deleting messages - callback + * client.deleteMessage(message, function(err){ + * if(err){ + * console.log("couldn't delete"); + * } + * }); + * @example + * // deleting messages - promise + * client.deleteMessage(message) + * .then(() => console.log("deleted!")) + * .catch(err => console.log("couldn't delete")); + */ + + Client.prototype.deleteMessage = function deleteMessage(message) { + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + if (typeof options === "function") { + // options is the callback + callback = options; + options = {}; + } + + 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 + * @param {StringResolvable} content the new content of the message + * @param {MessageOptions} [options] options to apply to the message + * @param {function(err: Error, msg: Message)} [callback] callback to the method + * @returns {Promise} Resolves with the newly edited message if successful, otherwise rejects with an Error. + * @example + * // editing messages + * client.updateMessage(message, "This is an edit!"); + * @example + * // editing messages - callback + * client.updateMessage(message, "This is an edit!", function(err, msg){ + * if(err){ + * console.log("couldn't edit"); + * } + * }); + * @example + * // editing messages - promise + * client.updateMessage(message, "This is an edit!") + * .then(msg => console.log("edited!")) + * .catch(err => console.log("couldn't edit")); + */ + + Client.prototype.updateMessage = function updateMessage(message, content) { + var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + var callback = arguments.length <= 3 || arguments[3] === undefined ? function () /*err, msg*/{} : arguments[3]; + + if (typeof options === "function") { + // options is the callback + callback = options; + options = {}; + } + + return this.internal.updateMessage(message, content, options).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Gets the logs of a channel with a specified limit, starting from the most recent message. + * @param {TextChannelResolvable} where the channel to get the logs of + * @param {Number} [limit=50] Integer, the maximum amount of messages to retrieve + * @param {ChannelLogsOptions} [options] options to use when getting the logs + * @param {function(err: Error, logs: Array)} [callback] callback to the method + * @returns {Promise, Error>} Resolves with an array of messages if successful, otherwise rejects with an error. + * @example + * // log content of last 500 messages in channel - callback + * client.getChannelLogs(channel, 500, function(err, logs){ + * if(!err){ + * for(var message of logs){ + * console.log(message.content); + * } + * } + * }); + * @example + * // log content of last 500 messages in channel - promise + * client.getChannelLogs(channel, 500) + * .then(logs => { + * for(var message of logs){ + * console.log(message.content); + * } + * }) + * .catch(err => console.log("couldn't fetch logs")); + */ + + Client.prototype.getChannelLogs = function getChannelLogs(where) { + var limit = arguments.length <= 1 || arguments[1] === undefined ? 50 : arguments[1]; + var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + var callback = arguments.length <= 3 || arguments[3] === undefined ? function () /*err, logs*/{} : arguments[3]; + + if (typeof options === "function") { + // options is the callback + callback = options; + options = {}; + } else if (typeof limit === "function") { + // options is the callback + callback = limit; + limit = 50; + } + + return this.internal.getChannelLogs(where, limit, options).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Gets a single message of a server + * @param {ChannelResolvable} channel to get the message from + * @param {function(err: Error, msg: Message} [callback] callback to the method + * @returns {Promise} Resolves with a message if the request was successful, otherwise rejects with an error. + * @example + * // get message object off a snowflake and log its content - callback + * client.getMessage(channel, '192696158886428672', function(err, msg) { + * if(!err) { + * console.log(msg.content); + * } else { + * console.log("couldn't get the message"); + * } + * } + * @example + * //get message object off a snowflake and log its content - promise + * client.getMessage(channel, '192696158886428672') + * .then(msg => { + * console.log(msg.content); + * }) + * .catch(err => console.log("couldn't get the message")); + */ + + Client.prototype.getMessage = function getMessage(channel, messageID) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, msg*/{} : arguments[2]; + + return this.internal.getMessage(channel, messageID).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Pins a message to a channel. + * @param {MessageResolvable} message to pin. + * @returns {Promise} resolves null if successful, otherwise rejects with an error. + * @example + * // pin message - callback + * client.pinMessage(msg, (err) => { + * if(!err) { + * console.log("Successfully pinned message") + * } else { + * console.log("Couldn't pin the message: " + err); + * } + * }); + * @example + * // pin message - promise + * client.pinMessage(msg) + * .then(() => { + * console.log("Successfully pinned message"); + * }) + * .catch(err => console.log("Couldn't pin the message: " + err)); + */ + + Client.prototype.pinMessage = function pinMessage(msg) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err*/{} : arguments[1]; + + return this.internal.pinMessage(msg).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Unpins a message to a server. + * @param {MessageResolvable} message to unpin. + * @returns {Promise} resolves null if successful, otherwise rejects with an error. + * @example + * // unpin message - callback + * client.unpinMessage(msg, (err) => { + * if(!err) { + * console.log("Successfully unpinned message") + * } else { + * console.log("Couldn't pin the message: " + err); + * } + * }); + * @example + * // unpin message - promise + * client.unpinMessage(msg) + * .then(() => { + * console.log("Successfully unpinned message"); + * }) + * .catch(err => console.log("Couldn't unpin the message: " + err)); + */ + + Client.prototype.unpinMessage = function unpinMessage(msg) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err*/{} : arguments[1]; + + return this.internal.unpinMessage(msg).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Gets all pinned messages of a channel. + * @param {TextChannelResolvable} where to get the pins from. + * @returns {Promise, Error>} Resolves with an array of messages if successful, otherwise rejects with an error. + * @example + * // log all pinned messages - callback + * client.getPinnedMessages(channel, (err, messages) => { + * if(!err) { + * for(var message of messages) { + * console.log(message.content); + * } + * } else { + * console.log("Couldn't fetch pins: " + err); + * } + * }); + * @example + * // log all pinned messages - promise + * client.getPinnedMessages(channel) + * .then(messages => { + * for(var message of messages) { + * console.log(message.content); + * } + * }) + * .catch(err => console.log("Couldn't fetch pins: " + err)); + */ + + Client.prototype.getPinnedMessages = function getPinnedMessages(channel) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, messages*/{} : arguments[1]; + + return this.internal.getPinnedMessages(channel).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Gets the banned users of a server (if the client has permission to) + * @param {ServerResolvable} server server to get banned users of + * @param {function(err: Error, bans: Array)} [callback] callback to the method + * @returns {Promise, Error>} Resolves with an array of users if the request was successful, otherwise rejects with an error. + * @example + * // loop through banned users - callback + * client.getBans(server, function(err, bans){ + * if(!err){ + * for(var user of bans){ + * console.log(user.username + " was banned from " + server.name); + * } + * } + * }); + * @example + * // loop through banned users - promise + * client.getBans(server) + * .then(bans => { + * for(var user of bans){ + * console.log(user.username + " was banned from " + server.name); + * } + * }) + * .catch(err => console.log("couldn't get bans")); + */ + + Client.prototype.getBans = function getBans(server) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, bans*/{} : arguments[1]; + + return this.internal.getBans(server).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Sends a file (embedded if possible) to the specified channel. + * @param {TextChannelResolvable} destination channel to send the file to + * @param {FileResolvable} attachment the file to send + * @param {string} name name of the file, especially including the extension + * @param {function(err: Error, msg: Message)} [callback] callback to the method + * @returns {Promise} resolves with the sent file as a message if successful, otherwise rejects with an error + * @example + * // send a file - callback + * client.sendFile(channel, new Buffer("Hello this a text file"), "file.txt", function(err, msg){ + * if(err){ + * console.log("Couldn't send file!"); + * } + * }); + * @example + * // send a file - promises + * client.sendFile(channel, "C:/path/to/file.txt", "file.txt") + * .then(msg => console.log("sent file!")) + * .catch(err => console.log("couldn't send file!")); + */ + + Client.prototype.sendFile = function sendFile(destination, attachment, name, content) { + var callback = arguments.length <= 4 || arguments[4] === undefined ? function () /*err, m*/{} : arguments[4]; + + if (typeof content === "function") { + // content is the callback + callback = content; + content = undefined; // Will get resolved into original filename in internal + } + if (typeof name === "function") { + // name is the callback + callback = name; + name = undefined; // Will get resolved into original filename in internal + } + + return this.internal.sendFile(destination, attachment, name, content).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Client accepts the specified invite to join a server. If the Client is already in the server, the promise/callback resolve immediately. + * @param {InviteIDResolvable} invite invite to the server + * @param {function(err: Error, server: Server)} [callback] callback to the method. + * @returns {Promise} resolves with the newly joined server if succesful, rejects with an error if not. + * @example + * // join a server - callback + * client.joinServer("https://discord.gg/0BwZcrFhUKZ55bJL", function(err, server){ + * if(!err){ + * console.log("Joined " + server.name); + * } + * }); + * @example + * // join a server - promises + * client.joinServer("https://discord.gg/0BwZcrFhUKZ55bJL") + * .then(server => console.log("Joined " + server.name)) + * .catch(err => console.log("Couldn't join!")); + */ + + Client.prototype.joinServer = function joinServer(invite) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, srv*/{} : arguments[1]; + + return this.internal.joinServer(invite).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Creates a Discord Server and joins it + * @param {string} name the name of the server + * @param {region} [region=london] the region of the server + * @param {function(err: Error, server: Server)} [callback] callback to the method + * @returns {Promise} resolves with the newly created server if successful, rejects with an error if not. + * @example + * //creating a server - callback + * client.createServer("discord.js", "london", function(err, server){ + * if(err){ + * console.log("could not create server"); + * } + * }); + * @example + * //creating a server - promises + * client.createServer("discord.js", "london") + * .then(server => console.log("Made server!")) + * .catch(error => console.log("Couldn't make server!")); + */ + + Client.prototype.createServer = function createServer(name) { + var region = arguments.length <= 1 || arguments[1] === undefined ? "london" : arguments[1]; + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, srv*/{} : arguments[2]; + + return this.internal.createServer(name, region).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Leaves a Discord Server + * @param {ServerResolvable} server the server to leave + * @param {function(err: Error)} [callback] callback to the method + * @returns {Promise} resolves null if successful, otherwise rejects with an error. + */ + + Client.prototype.leaveServer = function leaveServer(server) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.leaveServer(server).then(dataCallback(callback), errorCallback(callback)); + }; + + // def updateServer + + Client.prototype.updateServer = function updateServer(server, options, region) { + var callback = arguments.length <= 3 || arguments[3] === undefined ? function () /*err, srv*/{} : arguments[3]; + + if (typeof region === "function") { + // region is the callback + callback = region; + region = undefined; + } else if (region && typeof options === "string") { + options = { + name: options, + region: region + }; + } + + return this.internal.updateServer(server, options).then(dataCallback(callback), errorCallback(callback)); + }; + + /** + * Deletes a Discord Server + * @param {ServerResolvable} server the server to leave + * @param {function(err: Error)} [callback] callback to the method + * @returns {Promise} resolves null if successful, otherwise rejects with an error. + */ + + Client.prototype.deleteServer = function deleteServer(server) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.deleteServer(server).then(dataCallback(callback), errorCallback(callback)); + }; + + // def createChannel + + Client.prototype.createChannel = function createChannel(server, name) { + var type = arguments.length <= 2 || arguments[2] === undefined ? "text" : arguments[2]; + var callback = arguments.length <= 3 || arguments[3] === undefined ? function () /*err, channel*/{} : arguments[3]; + + if (typeof type === "function") { + // options is the callback + callback = type; + type = "text"; + } + + return this.internal.createChannel(server, name, type).then(dataCallback(callback), errorCallback(callback)); + }; + + // def deleteChannel + + Client.prototype.deleteChannel = function deleteChannel(channel) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.deleteChannel(channel).then(dataCallback(callback), errorCallback(callback)); + }; + + // def banMember + + Client.prototype.banMember = function banMember(user, server) { + var length = arguments.length <= 2 || arguments[2] === undefined ? 1 : arguments[2]; + var callback = arguments.length <= 3 || arguments[3] === undefined ? function () /*err, {}*/{} : arguments[3]; + + if (typeof length === "function") { + // length is the callback + callback = length; + length = 1; + } + + return this.internal.banMember(user, server, length).then(dataCallback(callback), errorCallback(callback)); + }; + + // def unbanMember + + Client.prototype.unbanMember = function unbanMember(user, server) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.unbanMember(user, server).then(dataCallback(callback), errorCallback(callback)); + }; + + // def kickMember + + Client.prototype.kickMember = function kickMember(user, server) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.kickMember(user, server).then(dataCallback(callback), errorCallback(callback)); + }; + + // def moveMember + + Client.prototype.moveMember = function moveMember(user, channel) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.moveMember(user, channel).then(dataCallback(callback), errorCallback(callback)); + }; + + // def muteMember + + Client.prototype.muteMember = function muteMember(user, server) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.muteMember(user, server).then(dataCallback(callback), errorCallback(callback)); + }; + + // def unmuteMember + + Client.prototype.unmuteMember = function unmuteMember(user, server) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.unmuteMember(user, server).then(dataCallback(callback), errorCallback(callback)); + }; + + // def deafenMember + + Client.prototype.deafenMember = function deafenMember(user, server) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.deafenMember(user, server).then(dataCallback(callback), errorCallback(callback)); + }; + + // def undeafenMember + + Client.prototype.undeafenMember = function undeafenMember(user, server) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.undeafenMember(user, server).then(dataCallback(callback), errorCallback(callback)); + }; + + // def setNickname + + Client.prototype.setNickname = function setNickname(server, nick, user) { + var callback = arguments.length <= 3 || arguments[3] === undefined ? function () /*err, {}*/{} : arguments[3]; + + if (typeof user === "function") { + // user is the callback + callback = user; + user = null; + } + if (!user) { + user = this.user; + } + return this.internal.setNickname(server, nick, user).then(dataCallback(callback), errorCallback(callback)); + }; + + // def setNote + + Client.prototype.setNote = function setNote(user, note) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.setNote(user, note).then(dataCallback(callback), errorCallback(callback)); + }; + + // def createRole + + Client.prototype.createRole = function createRole(server) { + var data = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, role*/{} : arguments[2]; + + if (typeof data === "function") { + // data is the callback + callback = data; + data = null; + } + + return this.internal.createRole(server, data).then(dataCallback(callback), errorCallback(callback)); + }; + + // def updateRole + + Client.prototype.updateRole = function updateRole(role) { + var data = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, role*/{} : arguments[2]; + + if (typeof data === "function") { + // data is the callback + callback = data; + data = null; + } + return this.internal.updateRole(role, data).then(dataCallback(callback), errorCallback(callback)); + }; + + // def deleteRole + + Client.prototype.deleteRole = function deleteRole(role) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.deleteRole(role).then(dataCallback(callback), errorCallback(callback)); + }; + + // def addMemberToRole + + Client.prototype.addMemberToRole = function addMemberToRole(member, role) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.addMemberToRole(member, role).then(dataCallback(callback), errorCallback(callback)); + }; + + // def addUserToRole + + Client.prototype.addUserToRole = function addUserToRole(member, role) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.addMemberToRole(member, role, callback); + }; + + // def addUserToRole + + Client.prototype.memberHasRole = function memberHasRole(member, role) { + return this.internal.memberHasRole(member, role); + }; + + // def addUserToRole + + Client.prototype.userHasRole = function userHasRole(member, role) { + return this.memberHasRole(member, role); + }; + + // def removeMemberFromRole + + Client.prototype.removeMemberFromRole = function removeMemberFromRole(member, role) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.removeMemberFromRole(member, role).then(dataCallback(callback), errorCallback(callback)); + }; + + // def removeUserFromRole + + Client.prototype.removeUserFromRole = function removeUserFromRole(member, role) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.removeMemberFromRole(member, role, callback); + }; + + // def createInvite + + Client.prototype.createInvite = function createInvite(chanServ, options) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, invite*/{} : arguments[2]; + + if (typeof options === "function") { + // options is the callback + callback = options; + options = undefined; + } + + return this.internal.createInvite(chanServ, options).then(dataCallback(callback), errorCallback(callback)); + }; + + // def deleteInvite + + Client.prototype.deleteInvite = function deleteInvite(invite) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.deleteInvite(invite).then(dataCallback(callback), errorCallback(callback)); + }; + + // def getInvite + + Client.prototype.getInvite = function getInvite(invite) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, inv*/{} : arguments[1]; + + return this.internal.getInvite(invite).then(dataCallback(callback), errorCallback(callback)); + }; + + // def getInvites + + Client.prototype.getInvites = function getInvites(channel) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, inv*/{} : arguments[1]; + + return this.internal.getInvites(channel).then(dataCallback(callback), errorCallback(callback)); + }; + + // def overwritePermissions + + Client.prototype.overwritePermissions = function overwritePermissions(channel, role) { + var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + var callback = arguments.length <= 3 || arguments[3] === undefined ? function () /*err, {}*/{} : arguments[3]; + + return this.internal.overwritePermissions(channel, role, options).then(dataCallback(callback), errorCallback(callback)); + }; + + // def setStatus + + Client.prototype.setStatus = function setStatus(idleStatus, game) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + if (typeof game === "function") { + // game is the callback + callback = game; + game = null; + } else if (typeof idleStatus === "function") { + // idleStatus is the callback + callback = idleStatus; + game = null; + } + + return this.internal.setStatus(idleStatus, game).then(dataCallback(callback), errorCallback(callback)); + }; + + // def sendTyping + + Client.prototype.sendTyping = function sendTyping(channel) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.sendTyping(channel).then(dataCallback(callback), errorCallback(callback)); + }; + + // def setChannelTopic + + Client.prototype.setChannelTopic = function setChannelTopic(channel, topic) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.setChannelTopic(channel, topic).then(dataCallback(callback), errorCallback(callback)); + }; + + // def setChannelName + + Client.prototype.setChannelName = function setChannelName(channel, name) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.setChannelName(channel, name).then(dataCallback(callback), errorCallback(callback)); + }; + + // def setChannelPosition + + Client.prototype.setChannelPosition = function setChannelPosition(channel, position) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.setChannelPosition(channel, position).then(dataCallback(callback), errorCallback(callback)); + }; + + // def setChannelUserLimit + + Client.prototype.setChannelUserLimit = function setChannelUserLimit(channel, limit) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.setChannelUserLimit(channel, limit).then(dataCallback(callback), errorCallback(callback)); + }; + + // def setChannelBitrate + + Client.prototype.setChannelBitrate = function setChannelBitrate(channel, kbitrate) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.setChannelBitrate(channel, kbitrate).then(dataCallback(callback), errorCallback(callback)); + }; + + // def updateChannel + + Client.prototype.updateChannel = function updateChannel(channel, data) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function () /*err, {}*/{} : arguments[2]; + + return this.internal.updateChannel(channel, data).then(dataCallback(callback), errorCallback(callback)); + }; + + // def startTyping + + Client.prototype.startTyping = function startTyping(channel) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.startTyping(channel).then(dataCallback(callback), errorCallback(callback)); + }; + + // def stopTyping + + Client.prototype.stopTyping = function stopTyping(channel) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.stopTyping(channel).then(dataCallback(callback), errorCallback(callback)); + }; + + // def updateDetails + + Client.prototype.updateDetails = function updateDetails(details) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.updateDetails(details).then(dataCallback(callback), errorCallback(callback)); + }; + + // def setUsername + + Client.prototype.setUsername = function setUsername(name) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.setUsername(name).then(dataCallback(callback), errorCallback(callback)); + }; + + // def setAvatar + + Client.prototype.setAvatar = function setAvatar(avatar) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.setAvatar(avatar).then(dataCallback(callback), errorCallback(callback)); + }; + + // def joinVoiceChannel + + Client.prototype.joinVoiceChannel = function joinVoiceChannel(channel) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, channel*/{} : arguments[1]; + + return this.internal.joinVoiceChannel(channel).then(dataCallback(callback), errorCallback(callback)); + }; + + // def leaveVoiceChannel + + Client.prototype.leaveVoiceChannel = function leaveVoiceChannel(chann) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.leaveVoiceChannel(chann).then(dataCallback(callback), errorCallback(callback)); + }; + + // def addFriend + + Client.prototype.addFriend = function addFriend(user) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.addFriend(user).then(dataCallback(callback), errorCallback(callback)); + }; + + // def removeFriend + + Client.prototype.removeFriend = function removeFriend(user) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.internal.removeFriend(user).then(dataCallback(callback), errorCallback(callback)); + }; + + // def getOAuthApplication + + Client.prototype.getOAuthApplication = function getOAuthApplication(appID) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, bans*/{} : arguments[1]; + + if (typeof appID === "function") { + // appID is the callback + callback = appID; + appID = null; + } + return this.internal.getOAuthApplication(appID).then(dataCallback(callback), errorCallback(callback)); + }; + + // def awaitResponse + + Client.prototype.awaitResponse = function awaitResponse(msg) { + var toSend = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1]; + + var _this2 = this; + + var options = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; + var callback = arguments.length <= 3 || arguments[3] === undefined ? function () /*err, newMsg*/{} : arguments[3]; + + var ret; + + if (toSend) { + if (typeof toSend === "function") { + // (msg, callback) + callback = toSend; + toSend = null; + options = null; + } else { + // (msg, toSend, ...) + if (options) { + if (typeof options === "function") { + //(msg, toSend, callback) + callback = options; + options = null; + ret = this.sendMessage(msg, toSend); + } else { + //(msg, toSend, options, callback) + ret = this.sendMessage(msg, toSend, options); + } + } else { + // (msg, toSend) promise + ret = this.sendMessage(msg, toSend); + } + } + } + + if (!ret) { + ret = Promise.resolve(); + } + // (msg) promise + return ret.then(function () { + return _this2.internal.awaitResponse(msg); + }).then(dataCallback(callback), errorCallback(callback)); + }; + + Client.prototype.setStatusIdle = function setStatusIdle() { + var callback = arguments.length <= 0 || arguments[0] === undefined ? function () /*err, {}*/{} : arguments[0]; + + return this.internal.setStatus("idle").then(dataCallback(callback), errorCallback(callback)); + }; + + Client.prototype.setStatusOnline = function setStatusOnline() { + var callback = arguments.length <= 0 || arguments[0] === undefined ? function () /*err, {}*/{} : arguments[0]; + + return this.internal.setStatus("online").then(dataCallback(callback), errorCallback(callback)); + }; + + Client.prototype.setStatusActive = function setStatusActive(callback) { + return this.setStatusOnline(callback); + }; + + Client.prototype.setStatusHere = function setStatusHere(callback) { + return this.setStatusOnline(callback); + }; + + Client.prototype.setStatusAvailable = function setStatusAvailable(callback) { + return this.setStatusOnline(callback); + }; + + Client.prototype.setStatusAway = function setStatusAway(callback) { + return this.setStatusIdle(callback); + }; + + Client.prototype.setPlayingGame = function setPlayingGame(game) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function () /*err, {}*/{} : arguments[1]; + + return this.setStatus(null, game, callback); + }; + + Client.prototype.setStreaming = function setStreaming(name, url, type) { + var callback = arguments.length <= 3 || arguments[3] === undefined ? function () /*err, {}*/{} : arguments[3]; + + return this.setStatus(null, { name: name, url: url, type: type }, callback); + }; + + //def forceFetchUsers + + Client.prototype.forceFetchUsers = function forceFetchUsers(callback) { + return this.internal.forceFetchUsers().then(callback); + }; + + _createClass(Client, [{ + key: "users", + get: function get() { + return this.internal.users; + } + + /** + * The server channels the Client is aware of. Only available after `ready` event has been emitted. + * @type {Cache} a Cache of the Server Channels + * @readonly + * @example + * // log the names of the channels and the server they belong to + * for(var channel of client.channels){ + * console.log(`${channel.name} is part of ${channel.server.name}`) + * } + */ + }, { + key: "channels", + get: function get() { + return this.internal.channels; + } + + /** + * The servers the Client is aware of. Only available after `ready` event has been emitted. + * @type {Cache} a Cache of the Servers + * @readonly + * @example + * // log the names of the servers + * for(var server of client.servers){ + * console.log(server.name) + * } + */ + }, { + key: "servers", + get: function get() { + return this.internal.servers; + } + + /** + * The PM/DM chats the Client is aware of. Only available after `ready` event has been emitted. + * @type {Cache} a Cache of the PM/DM Channels. + * @readonly + * @example + * // log the names of the users the client is participating in a PM with + * for(var pm of client.privateChannels){ + * console.log(`Participating in a DM with ${pm.recipient}`) + * } + */ + }, { + key: "privateChannels", + get: function get() { + return this.internal.private_channels; + } + + /** + * The friends that the Client is aware of. Only available after `ready` event has been emitted. + * @type {Cache|null} a Cache of friend Users (or null if bot account) + * @readonly + * @example + * // log names of the friends that the client is aware of + * for(var user of client.friends){ + * console.log(user.username); + * } + */ + }, { + key: "friends", + get: function get() { + return this.internal.friends; + } + + /** + * The incoming friend requests that the Client is aware of. Only available after `ready` event has been emitted. + * @type {Cache|null} a Cache of incoming friend request Users (or null if bot account) + * @readonly + * @example + * // log names of the incoming friend requests that the client is aware of + * for(var user of client.incomingFriendRequests){ + * console.log(user.username); + * } + */ + }, { + key: "incomingFriendRequests", + get: function get() { + return this.internal.incoming_friend_requests; + } + + /** + * The outgoing friend requests that the Client is aware of. Only available after `ready` event has been emitted. + * @type {Cache} a Cache of outgoing friend request Users + * @readonly + * @example + * // log names of the outgoing friend requests that the client is aware of + * for(var user of client.outgoingFriendRequests){ + * console.log(user.username); + * } + */ + }, { + key: "outgoingFriendRequests", + get: function get() { + return this.internal.outgoing_friend_requests; + } + + /** + * A cache of active voice connection of the Client, or null if not applicable. Only available after `ready` event has been emitted. + * @type {Cache} a Cache of Voice Connections + */ + }, { + key: "voiceConnections", + get: function get() { + return this.internal.voiceConnections; + } + + /** + * The first voice connection the bot has connected to. Available for backwards compatibility. + * @type {VoiceConnection} first voice connection + */ + }, { + key: "voiceConnection", + get: function get() { + return this.internal.voiceConnection; + } + + /** + * Unix timestamp of when the Client first emitted the `ready `event. Only available after `ready` event has been emitted. + * @type {Number} timestamp of ready time + * @example + * // output when the client was ready + * console.log("I was first ready at " + client.readyTime); + */ + }, { + key: "readyTime", + get: function get() { + return this.internal.readyTime; + } + + /** + * How long the client has been ready for in milliseconds. Only available after `ready` event has been emitted. + * @type {Number} number in milliseconds representing uptime of the client + * @example + * // log how long the client has been up for + * console.log("I have been online for " + client.uptime + " milliseconds"); + */ + }, { + key: "uptime", + get: function get() { + return this.internal.uptime; + } + + /** + * A User object that represents the account the client is logged into. Only available after `ready` event has been emitted. + * @type {User} user representing logged in account of client. + * @example + * // log username of logged in account of client + * console.log("Logged in as " + client.user.username); + */ + }, { + key: "user", + get: function get() { + return this.internal.user; + } + + /** + * Object containing user-agent information required for API requests. If not modified, it will use discord.js's defaults. + * @type {UserAgent} + * @example + * // log the stringified user-agent: + * console.log(client.userAgent.full); + */ + }, { + key: "userAgent", + get: function get() { + return this.internal.userAgent; + }, + + /** + * Set the user-agent information provided. Follows the UserAgent typedef format excluding the `full` property. + * @type {UserAgent} + */ + set: function set(userAgent) { + this.internal.userAgent = userAgent; + } + }]); + + return Client; +})(_events2["default"]); + +exports["default"] = Client; +module.exports = exports["default"]; diff --git a/lib/Client/ConnectionState.js b/lib/Client/ConnectionState.js index 6dcfb4ded..b17e17a5e 100644 --- a/lib/Client/ConnectionState.js +++ b/lib/Client/ConnectionState.js @@ -1 +1,11 @@ -"use strict";exports.__esModule = true;exports["default"] = {IDLE:0,LOGGING_IN:1,LOGGED_IN:2,READY:3,DISCONNECTED:4};module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; +exports["default"] = { + IDLE: 0, + LOGGING_IN: 1, + LOGGED_IN: 2, + READY: 3, + DISCONNECTED: 4 +}; +module.exports = exports["default"]; diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index b18f64210..f192b9816 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -1,132 +1,2636 @@ -"use strict";exports.__esModule = true;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;};})();function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var _superagent=require("superagent");var _superagent2=_interopRequireDefault(_superagent);var _ws=require("ws");var _ws2=_interopRequireDefault(_ws);var _ConnectionState=require("./ConnectionState");var _ConnectionState2=_interopRequireDefault(_ConnectionState);var _querystring=require("querystring");var _querystring2=_interopRequireDefault(_querystring);var _Constants=require("../Constants");var _UtilBucket=require("../Util/Bucket");var _UtilBucket2=_interopRequireDefault(_UtilBucket);var _UtilCache=require("../Util/Cache");var _UtilCache2=_interopRequireDefault(_UtilCache);var _ResolverResolver=require("./Resolver/Resolver");var _ResolverResolver2=_interopRequireDefault(_ResolverResolver);var _StructuresUser=require("../Structures/User");var _StructuresUser2=_interopRequireDefault(_StructuresUser);var _StructuresChannel=require("../Structures/Channel");var _StructuresChannel2=_interopRequireDefault(_StructuresChannel);var _StructuresServerChannel=require("../Structures/ServerChannel");var _StructuresServerChannel2=_interopRequireDefault(_StructuresServerChannel);var _StructuresTextChannel=require("../Structures/TextChannel");var _StructuresTextChannel2=_interopRequireDefault(_StructuresTextChannel);var _StructuresVoiceChannel=require("../Structures/VoiceChannel");var _StructuresVoiceChannel2=_interopRequireDefault(_StructuresVoiceChannel);var _StructuresPMChannel=require("../Structures/PMChannel");var _StructuresPMChannel2=_interopRequireDefault(_StructuresPMChannel);var _StructuresServer=require("../Structures/Server");var _StructuresServer2=_interopRequireDefault(_StructuresServer);var _StructuresMessage=require("../Structures/Message");var _StructuresMessage2=_interopRequireDefault(_StructuresMessage);var _StructuresRole=require("../Structures/Role");var _StructuresRole2=_interopRequireDefault(_StructuresRole);var _StructuresInvite=require("../Structures/Invite");var _StructuresInvite2=_interopRequireDefault(_StructuresInvite);var _VoiceVoiceConnection=require("../Voice/VoiceConnection");var _VoiceVoiceConnection2=_interopRequireDefault(_VoiceVoiceConnection);var _UtilTokenCacher=require("../Util/TokenCacher");var _UtilTokenCacher2=_interopRequireDefault(_UtilTokenCacher);var zlib;var libVersion=require('../../package.json').version;function waitFor(condition){var value=arguments.length <= 1 || arguments[1] === undefined?condition:arguments[1];var interval=arguments.length <= 2 || arguments[2] === undefined?20:arguments[2];return (function(){return new Promise(function(resolve){var int=setInterval(function(){var isDone=condition();if(isDone){if(condition === value){resolve(isDone);}else {resolve(value(isDone));}return clearInterval(int);}},interval);});})();}function delay(ms){return new Promise(function(resolve){return setTimeout(resolve,ms);});}var InternalClient=(function(){function InternalClient(discordClient){_classCallCheck(this,InternalClient);this.setup(discordClient);}InternalClient.prototype.apiRequest = function apiRequest(method,url,useAuth,data,file){var resolve,reject;var promise=new Promise(function(res,rej){resolve = res;reject = rej;});var buckets=[];var match=url.match(/\/channels\/([0-9]+)\/messages(\/[0-9]+)?$/);if(match){if(method === "del" && (match[1] = this.channels.get("id",match[1]) || this.private_channels.get("id",match[1]))){buckets = ["dmsg:" + (match[1].server || {}).id];}else if(this.user.bot){if(method === "post" || method === "patch"){if(this.private_channels.get("id",match[1])){buckets = ["bot:msg:dm","bot:msg:global"];}else if(match[1] = this.channels.get("id",match[1])){buckets = ["bot:msg:guild:" + match[1].server.id,"bot:msg:global"];}}}else {buckets = ["msg"];}}else if(method === "patch"){if(url === "/users/@me" && this.user && data.username && data.username !== this.user.username){buckets = ["username"];}else if(match = url.match(/\/guilds\/([0-9]+)\/members\/[0-9]+$/)){buckets = ["guild_member:" + match[1]];}else if(match = url.match(/\/guilds\/([0-9]+)\/members\/@me\/nick$/)){buckets = ["guild_member_nick:" + match[1]];}}var self=this;var actualCall=function actualCall(){var startTime=Date.now();var ret=_superagent2["default"][method](url);if(useAuth){ret.set("authorization",self.token);}if(file){ret.attach("file",file.file,file.name);if(data){for(var i in data) {if(data[i] !== undefined){ret.field(i,data[i]);}}}}else if(data){ret.send(data);}ret.set('User-Agent',self.userAgentInfo.full);ret.end(function(error,data){if(error){if(data.status === 429){self.client.emit("debug","Encountered 429 at " + url + " | " + self.client.options.shard + " | Buckets" + buckets + " | " + (Date.now() - startTime) + "ms latency");}reject(error);}else {resolve(data.body);}});};var waitFor=1;var i=0;var done=function done(){if(++i === waitFor){actualCall();}};for(var _iterator=buckets,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[Symbol.iterator]();;) {var _ref;if(_isArray){if(_i >= _iterator.length)break;_ref = _iterator[_i++];}else {_i = _iterator.next();if(_i.done)break;_ref = _i.value;}var bucket=_ref;++waitFor;this.buckets[bucket].queue(done);}done();return promise;};InternalClient.prototype.setup = function setup(discordClient){discordClient = discordClient || this.client;this.client = discordClient;this.state = _ConnectionState2["default"].IDLE;this.websocket = null;this.userAgent = {url:'https://github.com/hydrabolt/discord.js',version:require('../../package.json').version};if(this.client.options.compress){zlib = require("zlib");} // creates 4 caches with discriminators based on ID -this.users = new _UtilCache2["default"]();this.friends = new _UtilCache2["default"]();this.blocked_users = new _UtilCache2["default"]();this.outgoing_friend_requests = new _UtilCache2["default"]();this.incoming_friend_requests = new _UtilCache2["default"]();this.channels = new _UtilCache2["default"]();this.servers = new _UtilCache2["default"]();this.unavailableServers = new _UtilCache2["default"]();this.private_channels = new _UtilCache2["default"]();this.autoReconnectInterval = 1000;this.intervals = {typing:[],kai:null,misc:[]};this.voiceConnections = new _UtilCache2["default"]();this.resolver = new _ResolverResolver2["default"](this);this.readyTime = null;this.messageAwaits = {};this.buckets = {"bot:msg:dm":new _UtilBucket2["default"](5,5000),"bot:msg:global":new _UtilBucket2["default"](50,10000),"msg":new _UtilBucket2["default"](10,10000),"username":new _UtilBucket2["default"](2,3600000)};if(!this.tokenCacher){this.tokenCacher = new _UtilTokenCacher2["default"](this.client);this.tokenCacher.init(0);}};InternalClient.prototype.cleanIntervals = function cleanIntervals(){for(var _iterator2=this.intervals.typing.concat(this.intervals.misc).concat(this.intervals.kai),_isArray2=Array.isArray(_iterator2),_i2=0,_iterator2=_isArray2?_iterator2:_iterator2[Symbol.iterator]();;) {var _ref2;if(_isArray2){if(_i2 >= _iterator2.length)break;_ref2 = _iterator2[_i2++];}else {_i2 = _iterator2.next();if(_i2.done)break;_ref2 = _i2.value;}var interval=_ref2;if(interval){clearInterval(interval);}}};InternalClient.prototype.disconnected = function disconnected(){var _this=this;var autoReconnect=arguments.length <= 0 || arguments[0] === undefined?false:arguments[0];this.cleanIntervals();this.voiceConnections.forEach(function(vc){_this.leaveVoiceChannel(vc);});if(autoReconnect){this.autoReconnectInterval = Math.min(this.autoReconnectInterval * (Math.random() + 1),60000);setTimeout(function(){if(!_this.email && !_this.token){return;} // Check whether the email is set (if not, only a token has been used for login) -_this.loginWithToken(_this.token,_this.email,_this.password)["catch"](function(){return _this.disconnected(true);});},this.autoReconnectInterval);}this.client.emit("disconnected");}; //def leaveVoiceChannel -InternalClient.prototype.leaveVoiceChannel = function leaveVoiceChannel(chann){var _this2=this;if(this.user.bot){var leave=function leave(connection){return new Promise(function(resolve,reject){connection.destroy();resolve();});};if(chann instanceof _StructuresVoiceChannel2["default"]){return this.resolver.resolveChannel(chann).then(function(channel){if(!channel){return Promise.reject(new Error("voice channel does not exist"));}if(channel.type !== 'voice'){return Promise.reject(new Error("channel is not a voice channel!"));}var connection=_this2.voiceConnections.get("voiceChannel",channel);if(!connection){return Promise.reject(new Error("not connected to that voice channel"));}return leave(connection);});}else if(chann instanceof _VoiceVoiceConnection2["default"]){return leave(chann);}else {return Promise.reject(new Error("invalid voice channel/connection to leave"));}}else { // preserve old functionality for non-bots -if(this.voiceConnections[0]){this.voiceConnections[0].destroy();}return Promise.resolve();}}; //def awaitResponse -InternalClient.prototype.awaitResponse = function awaitResponse(msg){var _this3=this;return new Promise(function(resolve,reject){msg = _this3.resolver.resolveMessage(msg);if(!msg){reject(new Error("message undefined"));return;}var awaitID=msg.channel.id + msg.author.id;if(!_this3.messageAwaits[awaitID]){_this3.messageAwaits[awaitID] = [];}_this3.messageAwaits[awaitID].push(resolve);});}; //def joinVoiceChannel -InternalClient.prototype.joinVoiceChannel = function joinVoiceChannel(chann){var _this4=this;return this.resolver.resolveChannel(chann).then(function(channel){if(!channel){return Promise.reject(new Error("voice channel does not exist"));}if(channel.type !== 'voice'){return Promise.reject(new Error("channel is not a voice channel!"));}var joinSendWS=function joinSendWS(){_this4.sendWS({op:4,d:{"guild_id":channel.server.id,"channel_id":channel.id,"self_mute":false,"self_deaf":false}});};var joinVoice=function joinVoice(){return new Promise(function(resolve,reject){var session=_this4.sessionID,token,server=channel.server,endpoint;var timeout=null;var check=function check(data){if(data.t === "VOICE_SERVER_UPDATE"){if(data.d.guild_id !== server.id)return; // ensure it is the right server -token = data.d.token;endpoint = data.d.endpoint;if(!token || !endpoint)return;var chan=new _VoiceVoiceConnection2["default"](channel,_this4.client,session,token,server,endpoint);_this4.voiceConnections.add(chan);chan.on("ready",function(){return resolve(chan);});chan.on("error",reject);chan.on("close",reject);if(timeout){clearTimeout(timeout);}_this4.client.removeListener("raw",check);}};timeout = setTimeout(function(){_this4.client.removeListener("raw",check);reject(new Error("No voice server details within 10 seconds"));},10000);_this4.client.on("raw",check);joinSendWS();});};var existingServerConn=_this4.voiceConnections.get("server",channel.server); // same server connection -if(existingServerConn){joinSendWS(); // Just needs to update by sending via WS, movement in cache will be handled by global handler -return Promise.resolve(existingServerConn);}if(!_this4.user.bot && _this4.voiceConnections.length > 0){ // nonbot, one voiceconn only, just like last time just disconnect -return _this4.leaveVoiceChannel().then(joinVoice);}return joinVoice();});}; // Backwards-compatible utility getter method for the first voice connection -// Thanks to #q (@qeled) for suggesting this -InternalClient.prototype.getGuildMembers = function getGuildMembers(serverID,chunkCount){this.forceFetchCount[serverID] = chunkCount;if(this.forceFetchLength + 3 + serverID.length > 4082){ // 4096 - '{"op":8,"d":[]}'.length + 1 for lazy comma offset -this.requestGuildMembers(this.forceFetchQueue);this.forceFetchQueue = [serverID];this.forceFetchLength = 1 + serverID.length + 3;}else {this.forceFetchQueue.push(serverID);this.forceFetchLength += serverID.length + 3;}};InternalClient.prototype.requestGuildMembers = function requestGuildMembers(serverID,query,limit){this.sendWS({op:8,d:{guild_id:serverID,query:query || "",limit:limit || 0}});};InternalClient.prototype.checkReady = function checkReady(){if(!this.readyTime){if(this.forceFetchQueue.length > 0){this.requestGuildMembers(this.forceFetchQueue);this.forceFetchQueue = [];this.forceFetchLength = 1;}else {for(var key in this.forceFetchCount) {if(this.forceFetchCount.hasOwnProperty(key)){return;}}this.readyTime = Date.now();this.client.emit("ready");}}};InternalClient.prototype.restartServerCreateTimeout = function restartServerCreateTimeout(){var _this5=this;if(this.guildCreateTimeout){clearTimeout(this.guildCreateTimeout);this.guildCreateTimeout = null;}if(!this.readyTime){this.guildCreateTimeout = setTimeout(function(){_this5.checkReady();},this.client.options.guildCreateTimeout);}}; // def createServer -InternalClient.prototype.createServer = function createServer(name){var _this6=this;var region=arguments.length <= 1 || arguments[1] === undefined?"london":arguments[1];name = this.resolver.resolveString(name);return this.apiRequest('post',_Constants.Endpoints.SERVERS,true,{name:name,region:region}).then(function(res){ // valid server, wait until it is cached -return waitFor(function(){return _this6.servers.get("id",res.id);});});}; //def joinServer -InternalClient.prototype.joinServer = function joinServer(invite){var _this7=this;invite = this.resolver.resolveInviteID(invite);if(!invite){return Promise.reject(new Error("Not a valid invite"));}return this.apiRequest("post",_Constants.Endpoints.INVITE(invite),true).then(function(res){ // valid server, wait until it is received via ws and cached -return waitFor(function(){return _this7.servers.get("id",res.guild.id);});});}; //def updateServer -InternalClient.prototype.updateServer = function updateServer(server,options){var _this8=this;var server=this.resolver.resolveServer(server);if(!server){return Promise.reject(new Error("server did not resolve"));}var newOptions={name:options.name || server.name,region:options.region || server.region};if(options.icon){newOptions.icon = this.resolver.resolveToBase64(options.icon);}if(options.splash){newOptions.splash = this.resolver.resolveToBase64(options.splash);}if(options.owner){var user=this.resolver.resolveUser(options.owner);if(!user){return Promise.reject(new Error("owner could not be resolved"));}options.owner_id = user.id;}if(options.verificationLevel){options.verification_level = user.verificationLevel;}if(options.afkChannel){var channel=this.resolver.resolveUser(options.afkChannel);if(!channel){return Promise.reject(new Error("afkChannel could not be resolved"));}options.afk_channel_id = channel.id;}if(options.afkTimeout){options.afk_timeout = user.afkTimeout;}return this.apiRequest("patch",_Constants.Endpoints.SERVER(server.id),true,options).then(function(res){ // wait until the name and region are updated -return waitFor(function(){return _this8.servers.get("name",res.name)?_this8.servers.get("name",res.name).region === res.region?_this8.servers.get("id",res.id):false:false;});});}; //def leaveServer -InternalClient.prototype.leaveServer = function leaveServer(srv){var server=this.resolver.resolveServer(srv);if(!server){return Promise.reject(new Error("server did not resolve"));}return this.apiRequest("del",_Constants.Endpoints.ME_SERVER(server.id),true);}; //def deleteServer -InternalClient.prototype.deleteServer = function deleteServer(srv){var server=this.resolver.resolveServer(srv);if(!server){return Promise.reject(new Error("server did not resolve"));}return this.apiRequest("del",_Constants.Endpoints.SERVER(server.id),true);}; // def loginWithToken -// email and password are optional -InternalClient.prototype.loginWithToken = function loginWithToken(token,email,password){var _this9=this;this.setup();this.state = _ConnectionState2["default"].LOGGED_IN;this.token = token;this.email = email;this.password = password;return this.getGateway().then(function(url){_this9.createWS(url);return token;});}; // def login -InternalClient.prototype.login = function login(email,password){var _this10=this;var client=this.client;if(!this.tokenCacher.done){return new Promise(function(resolve,reject){setTimeout(function(){_this10.login(email,password).then(resolve)["catch"](reject);},20);});}else {var tk=this.tokenCacher.getToken(email,password);if(tk){this.client.emit("debug","bypassed direct API login, used cached token");return this.loginWithToken(tk,email,password);}}if(this.state !== _ConnectionState2["default"].DISCONNECTED && this.state !== _ConnectionState2["default"].IDLE){return Promise.reject(new Error("already logging in/logged in/ready!"));}this.state = _ConnectionState2["default"].LOGGING_IN;return this.apiRequest("post",_Constants.Endpoints.LOGIN,false,{email:email,password:password}).then(function(res){_this10.client.emit("debug","direct API login, cached token was unavailable");var token=res.token;_this10.tokenCacher.setToken(email,password,token);return _this10.loginWithToken(token,email,password);},function(error){_this10.websocket = null;throw error;})["catch"](function(error){_this10.websocket = null;_this10.state = _ConnectionState2["default"].DISCONNECTED;client.emit("disconnected");throw error;});}; // def logout -InternalClient.prototype.logout = function logout(){var _this11=this;if(this.state === _ConnectionState2["default"].DISCONNECTED || this.state === _ConnectionState2["default"].IDLE){return Promise.reject(new Error("Client is not logged in!"));}var disconnect=function disconnect(){if(_this11.websocket){_this11.websocket.close(1000);_this11.websocket = null;}_this11.token = null;_this11.email = null;_this11.password = null;_this11.state = _ConnectionState2["default"].DISCONNECTED;return Promise.resolve();};if(!this.user.bot){return this.apiRequest("post",_Constants.Endpoints.LOGOUT,true).then(disconnect);}else {return disconnect();}}; // def startPM -InternalClient.prototype.startPM = function startPM(resUser){var _this12=this;var user=this.resolver.resolveUser(resUser);if(!user){return Promise.reject(new Error("Unable to resolve resUser to a User"));} // start the PM -return this.apiRequest("post",_Constants.Endpoints.ME_CHANNELS,true,{recipient_id:user.id}).then(function(res){return _this12.private_channels.add(new _StructuresPMChannel2["default"](res,_this12.client));});}; // def getGateway -InternalClient.prototype.getGateway = function getGateway(){var _this13=this;if(this.gatewayURL){return Promise.resolve(this.gatewayURL);}return this.apiRequest("get",_Constants.Endpoints.GATEWAY,true).then(function(res){return _this13.gatewayURL = res.url;});}; // def sendMessage -InternalClient.prototype.sendMessage = function sendMessage(where,_content){var _this14=this;var options=arguments.length <= 2 || arguments[2] === undefined?{}:arguments[2];if(options.file){if(typeof options.file !== "object"){options.file = {file:options.file};}if(!options.file.name){if(options.file.file instanceof String || typeof options.file.file === "string"){options.file.name = require("path").basename(options.file.file);}else if(options.file.file.path){ // fs.createReadStream()'s have .path that give the path. Not sure about other streams though. -options.file.name = require("path").basename(options.file.file.path);}else {options.file.name = "default.png"; // Just have to go with default filenames. -}}}return this.resolver.resolveChannel(where).then(function(destination){var content=_this14.resolver.resolveString(_content);if(_this14.client.options.disableEveryone || options.disableEveryone){content = content.replace(/(@)(everyone|here)/g,"$1​$2");}if(options.file){return _this14.resolver.resolveFile(options.file.file).then(function(file){return _this14.apiRequest("post",_Constants.Endpoints.CHANNEL_MESSAGES(destination.id),true,{content:content,tts:options.tts},{name:options.file.name,file:file}).then(function(res){return destination.messages.add(new _StructuresMessage2["default"](res,destination,_this14.client));});});}else {return _this14.apiRequest("post",_Constants.Endpoints.CHANNEL_MESSAGES(destination.id),true,{content:content,tts:options.tts}).then(function(res){return destination.messages.add(new _StructuresMessage2["default"](res,destination,_this14.client));});}});}; // def sendFile -InternalClient.prototype.sendFile = function sendFile(where,_file,name,content){var _this15=this;if(!name){if(_file instanceof String || typeof _file === "string"){name = require("path").basename(_file);}else if(_file && _file.path){ // fs.createReadStream()'s have .path that give the path. Not sure about other streams though. -name = require("path").basename(_file.path);}else {name = "default.png"; // Just have to go with default filenames. -}}if(content){content = {content:this.resolver.resolveString(content)};if(this.client.options.disableEveryone){content.content = content.content.replace(/(@)(everyone|here)/g,"$1​$2");}}return this.resolver.resolveChannel(where).then(function(channel){return _this15.resolver.resolveFile(_file).then(function(file){return _this15.apiRequest("post",_Constants.Endpoints.CHANNEL_MESSAGES(channel.id),true,content,{name:name,file:file}).then(function(res){return channel.messages.add(new _StructuresMessage2["default"](res,channel,_this15.client));});});});}; // def deleteMessage -InternalClient.prototype.deleteMessage = function deleteMessage(_message){var _this16=this;var options=arguments.length <= 1 || arguments[1] === undefined?{}:arguments[1];var message=this.resolver.resolveMessage(_message);if(!message){return Promise.reject(new Error("Supplied message did not resolve to a message!"));}var chain=options.wait?delay(options.wait):Promise.resolve();return chain.then(function(){return _this16.apiRequest("del",_Constants.Endpoints.CHANNEL_MESSAGE(message.channel.id,message.id),true);}).then(function(){return message.channel.messages.remove(message);});}; // 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"));else if(_messages.length === 1)return this.deleteMessage(_messages[0]);var messages=[];var channel;for(var _iterator3=_messages,_isArray3=Array.isArray(_iterator3),_i3=0,_iterator3=_isArray3?_iterator3:_iterator3[Symbol.iterator]();;) {var _ref3;if(_isArray3){if(_i3 >= _iterator3.length)break;_ref3 = _iterator3[_i3++];}else {_i3 = _iterator3.next();if(_i3.done)break;_ref3 = _i3.value;}var _message=_ref3;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..."));if(!message.server)return Promise.reject(new Error("You can only bulk delete messages on guild channels")); // 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){var _this17=this;var options=arguments.length <= 2 || arguments[2] === undefined?{}:arguments[2];var message=this.resolver.resolveMessage(msg);if(!message){return Promise.reject(new Error("Supplied message did not resolve to a message!"));}var content=this.resolver.resolveString(_content);return this.apiRequest("patch",_Constants.Endpoints.CHANNEL_MESSAGE(message.channel.id,message.id),true,{content:content,tts:options.tts}).then(function(res){return message.channel.messages.update(message,new _StructuresMessage2["default"](res,message.channel,_this17.client));});}; // def getChannelLogs -InternalClient.prototype.getChannelLogs = function getChannelLogs(_channel){var _this18=this;var limit=arguments.length <= 1 || arguments[1] === undefined?50:arguments[1];var options=arguments.length <= 2 || arguments[2] === undefined?{}:arguments[2];return this.resolver.resolveChannel(_channel).then(function(channel){var qsObject={limit:limit};if(options.before){var res=_this18.resolver.resolveMessage(options.before);if(res){qsObject.before = res.id;}}if(options.after){var res=_this18.resolver.resolveMessage(options.after);if(res){qsObject.after = res.id;}}if(options.around){var res=_this18.resolver.resolveMessage(options.around);if(res){qsObject.around = res.id;}}return _this18.apiRequest("get",_Constants.Endpoints.CHANNEL_MESSAGES(channel.id) + "?" + _querystring2["default"].stringify(qsObject),true).then(function(res){return res.map(function(msg){return channel.messages.add(new _StructuresMessage2["default"](msg,channel,_this18.client));});});});}; // def getMessage -InternalClient.prototype.getMessage = function getMessage(_channel,messageID){var _this19=this;return this.resolver.resolveChannel(_channel).then(function(channel){if(!_this19.user.bot){return Promise.reject(new Error("Only OAuth bot accounts can use this function"));}if(!(channel instanceof _StructuresTextChannel2["default"] || channel instanceof _StructuresPMChannel2["default"])){return Promise.reject(new Error("Provided channel is not a Text or PMChannel"));}var msg=channel.messages.get("id",messageID);if(msg){return Promise.resolve(msg);}return _this19.apiRequest("get",_Constants.Endpoints.CHANNEL_MESSAGES(channel.id) + "/" + messageID,true).then(function(res){return channel.messages.add(new _StructuresMessage2["default"](res,channel,_this19.client));});});}; // def pinMessage -InternalClient.prototype.pinMessage = function pinMessage(msg){var message=this.resolver.resolveMessage(msg);if(!message){return Promise.reject(new Error("Supplied message did not resolve to a message"));}return this.apiRequest("put","" + _Constants.Endpoints.CHANNEL_PIN(msg.channel.id,msg.id),true);}; // def unpinMessage -InternalClient.prototype.unpinMessage = function unpinMessage(msg){var message=this.resolver.resolveMessage(msg);if(!message){return Promise.reject(new Error("Supplied message did not resolve to a message"));}if(!message.pinned){return Promise.reject(new Error("Supplied message is not pinned"));}return this.apiRequest("del","" + _Constants.Endpoints.CHANNEL_PIN(msg.channel.id,msg.id),true);}; // def getPinnedMessages -InternalClient.prototype.getPinnedMessages = function getPinnedMessages(_channel){var _this20=this;return this.resolver.resolveChannel(_channel).then(function(channel){return _this20.apiRequest("get","" + _Constants.Endpoints.CHANNEL_PINS(channel.id),true).then(function(res){return res.map(function(msg){return channel.messages.add(new _StructuresMessage2["default"](msg,channel,_this20.client));});});});}; // def getBans -InternalClient.prototype.getBans = function getBans(server){var _this21=this;server = this.resolver.resolveServer(server);return this.apiRequest("get",_Constants.Endpoints.SERVER_BANS(server.id),true).then(function(res){return res.map(function(ban){return _this21.users.add(new _StructuresUser2["default"](ban.user,_this21.client));});});}; // def createChannel -InternalClient.prototype.createChannel = function createChannel(server,name){var _this22=this;var type=arguments.length <= 2 || arguments[2] === undefined?"text":arguments[2];server = this.resolver.resolveServer(server);return this.apiRequest("post",_Constants.Endpoints.SERVER_CHANNELS(server.id),true,{name:name,type:type}).then(function(res){var channel;if(res.type === "text"){channel = new _StructuresTextChannel2["default"](res,_this22.client,server);}else {channel = new _StructuresVoiceChannel2["default"](res,_this22.client,server);}return server.channels.add(_this22.channels.add(channel));});}; // def deleteChannel -InternalClient.prototype.deleteChannel = function deleteChannel(_channel){var _this23=this;return this.resolver.resolveChannel(_channel).then(function(channel){return _this23.apiRequest("del",_Constants.Endpoints.CHANNEL(channel.id),true).then(function(){if(channel.server){channel.server.channels.remove(channel);_this23.channels.remove(channel);}else {_this23.private_channels.remove(channel);}});});}; // def banMember -InternalClient.prototype.banMember = function banMember(user,server){var length=arguments.length <= 2 || arguments[2] === undefined?1:arguments[2];user = this.resolver.resolveUser(user);server = this.resolver.resolveServer(server);return this.apiRequest("put",_Constants.Endpoints.SERVER_BANS(server.id) + "/" + user.id + "?delete-message-days=" + length,true);}; // def unbanMember -InternalClient.prototype.unbanMember = function unbanMember(user,server){server = this.resolver.resolveServer(server);user = this.resolver.resolveUser(user);return this.apiRequest("del",_Constants.Endpoints.SERVER_BANS(server.id) + "/" + user.id,true);}; // def kickMember -InternalClient.prototype.kickMember = function kickMember(user,server){user = this.resolver.resolveUser(user);server = this.resolver.resolveServer(server);return this.apiRequest("del",_Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id,true);}; // def moveMember -InternalClient.prototype.moveMember = function moveMember(user,channel){var _this24=this;user = this.resolver.resolveUser(user);return this.resolver.resolveChannel(channel).then(function(channel){var server=channel.server; // Make sure `channel` is a voice channel -if(channel.type !== "voice"){throw new Error("Can't moveMember into a non-voice channel");}else {return _this24.apiRequest("patch",_Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id,true,{channel_id:channel.id}).then(function(res){user.voiceChannel = channel;return res;});}});}; // def muteMember -InternalClient.prototype.muteMember = function muteMember(user,server){user = this.resolver.resolveUser(user);server = this.resolver.resolveServer(server);return this.apiRequest("patch",_Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id,true,{mute:true});}; // def unmuteMember -InternalClient.prototype.unmuteMember = function unmuteMember(user,server){user = this.resolver.resolveUser(user);server = this.resolver.resolveServer(server);return this.apiRequest("patch",_Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id,true,{mute:false});}; // def deafenMember -InternalClient.prototype.deafenMember = function deafenMember(user,server){user = this.resolver.resolveUser(user);server = this.resolver.resolveServer(server);return this.apiRequest("patch",_Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id,true,{deaf:true});}; // def undeafenMember -InternalClient.prototype.undeafenMember = function undeafenMember(user,server){user = this.resolver.resolveUser(user);server = this.resolver.resolveServer(server);return this.apiRequest("patch",_Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id,true,{deaf:false});}; // def setNickname -InternalClient.prototype.setNickname = function setNickname(server,nick,user){nick = nick || "";user = this.resolver.resolveUser(user);server = this.resolver.resolveServer(server);return this.apiRequest("patch",_Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + (user.id === this.user.id?"@me/nick":user.id),true,{nick:nick});}; //def setNote -InternalClient.prototype.setNote = function setNote(user,note){user = this.resolver.resolveUser(user);note = note || "";if(!user){return Promise.reject(new Error("Failed to resolve user"));}return this.apiRequest("put",_Constants.Endpoints.ME_NOTES + "/" + user.id,true,{note:note});}; // def createRole -InternalClient.prototype.createRole = function createRole(server,data){var _this25=this;server = this.resolver.resolveServer(server);return this.apiRequest("post",_Constants.Endpoints.SERVER_ROLES(server.id),true).then(function(res){var role=server.roles.add(new _StructuresRole2["default"](res,server,_this25.client));if(data){return _this25.updateRole(role,data);}return role;});}; // def updateRole -InternalClient.prototype.updateRole = function updateRole(role,data){var _this26=this;role = this.resolver.resolveRole(role);var server=this.resolver.resolveServer(role.server);var newData={color:"color" in data?data.color:role.color,hoist:"hoist" in data?data.hoist:role.hoist,name:"name" in data?data.name:role.name,position:"position" in data?data.position:role.position,permissions:"permissions" in data?data.permissions:role.permissions,mentionable:"mentionable" in data?data.mentionable:role.mentionable};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;if(_isArray4){if(_i4 >= _iterator4.length)break;_ref4 = _iterator4[_i4++];}else {_i4 = _iterator4.next();if(_i4.done)break;_ref4 = _i4.value;}var perm=_ref4;if(perm instanceof String || typeof perm === "string"){newData.permissions |= _Constants.Permissions[perm] || 0;}else {newData.permissions |= perm;}}}return this.apiRequest("patch",_Constants.Endpoints.SERVER_ROLES(server.id) + "/" + role.id,true,newData).then(function(res){return server.roles.update(role,new _StructuresRole2["default"](res,server,_this26.client));});}; // def deleteRole -InternalClient.prototype.deleteRole = function deleteRole(role){if(role.server.id === role.id){return Promise.reject(new Error("Stop trying to delete the @everyone role. It is futile"));}else {return this.apiRequest("del",_Constants.Endpoints.SERVER_ROLES(role.server.id) + "/" + role.id,true);}}; //def addMemberToRole -InternalClient.prototype.addMemberToRole = function addMemberToRole(member,roles){var _this27=this;member = this.resolver.resolveUser(member);if(!member){return Promise.reject(new Error("user not found"));}if(!Array.isArray(roles) || roles.length === 0){roles = this.resolver.resolveRole(roles);if(roles){roles = [roles];}else {return Promise.reject(new Error("invalid array of roles"));}}else {roles = roles.map(function(r){return _this27.resolver.resolveRole(r);});}if(roles.some(function(role){return !role.server.memberMap[member.id];})){return Promise.reject(new Error("Role does not exist on same server as member"));}var roleIDs=roles[0].server.memberMap[member.id].roles.map(function(r){return r && r.id || r;});for(var i=0;i < roles.length;i++) {if(! ~roleIDs.indexOf(roles[i].id)){roleIDs.push(roles[i].id);};};return this.apiRequest("patch",_Constants.Endpoints.SERVER_MEMBERS(roles[0].server.id) + "/" + member.id,true,{roles:roleIDs});};InternalClient.prototype.memberHasRole = function memberHasRole(member,role){role = this.resolver.resolveRole(role);member = this.resolver.resolveUser(member);if(!role){throw new Error("invalid role");}if(!member){throw new Error("user not found");}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;if(_isArray5){if(_i5 >= _iterator5.length)break;_ref5 = _iterator5[_i5++];}else {_i5 = _iterator5.next();if(_i5.done)break;_ref5 = _i5.value;}var r=_ref5;if(r.id == role.id){return r;}}}return null;}; //def removeMemberFromRole -InternalClient.prototype.removeMemberFromRole = function removeMemberFromRole(member,roles){var _this28=this;member = this.resolver.resolveUser(member);if(!member){return Promise.reject(new Error("user not found"));}if(!Array.isArray(roles) || roles.length === 0){roles = this.resolver.resolveRole(roles);if(roles){roles = [roles];}else {return Promise.reject(new Error("invalid array of roles"));}}else {roles = roles.map(function(r){return _this28.resolver.resolveRole(r);});}var roleIDs=roles[0].server.memberMap[member.id].roles.map(function(r){return r && r.id || r;});for(var _iterator6=roles,_isArray6=Array.isArray(_iterator6),_i6=0,_iterator6=_isArray6?_iterator6:_iterator6[Symbol.iterator]();;) {var _ref6;if(_isArray6){if(_i6 >= _iterator6.length)break;_ref6 = _iterator6[_i6++];}else {_i6 = _iterator6.next();if(_i6.done)break;_ref6 = _i6.value;}var role=_ref6;if(!role.server.memberMap[member.id]){return Promise.reject(new Error("member not in server"));}for(var item in roleIDs) {if(roleIDs[item] === role.id){roleIDs.splice(item,1);break;}}}return this.apiRequest("patch",_Constants.Endpoints.SERVER_MEMBERS(roles[0].server.id) + "/" + member.id,true,{roles:roleIDs});}; // def createInvite -InternalClient.prototype.createInvite = function createInvite(chanServ,options){var _this29=this;return this.resolver.resolveChannel(chanServ).then(function(channel){if(!options){options = {validate:null};}else {options.max_age = options.maxAge || 0;options.max_uses = options.maxUses || 0;options.temporary = options.temporary || false;options.xkcdpass = options.xkcd || false;}return _this29.apiRequest("post",_Constants.Endpoints.CHANNEL_INVITES(channel.id),true,options).then(function(res){return new _StructuresInvite2["default"](res,_this29.channels.get("id",res.channel.id),_this29.client);});});}; //def deleteInvite -InternalClient.prototype.deleteInvite = function deleteInvite(invite){invite = this.resolver.resolveInviteID(invite);if(!invite){throw new Error("Not a valid invite");}return this.apiRequest("del",_Constants.Endpoints.INVITE(invite),true);}; //def getInvite -InternalClient.prototype.getInvite = function getInvite(invite){var _this30=this;invite = this.resolver.resolveInviteID(invite);if(!invite){return Promise.reject(new Error("Not a valid invite"));}return this.apiRequest("get",_Constants.Endpoints.INVITE(invite),true).then(function(res){if(!_this30.channels.has("id",res.channel.id)){return new _StructuresInvite2["default"](res,null,_this30.client);}return _this30.apiRequest("post",_Constants.Endpoints.CHANNEL_INVITES(res.channel.id),true,{validate:invite}).then(function(res2){return new _StructuresInvite2["default"](res2,_this30.channels.get("id",res.channel.id),_this30.client);});});}; //def getInvites -InternalClient.prototype.getInvites = function getInvites(channel){var _this31=this;if(!(channel instanceof _StructuresChannel2["default"])){var server=this.resolver.resolveServer(channel);if(server){return this.apiRequest("get",_Constants.Endpoints.SERVER_INVITES(server.id),true).then(function(res){return res.map(function(data){return new _StructuresInvite2["default"](data,_this31.channels.get("id",data.channel.id),_this31.client);});});}}return this.resolver.resolveChannel(channel).then(function(channel){return _this31.apiRequest("get",_Constants.Endpoints.CHANNEL_INVITES(channel.id),true).then(function(res){return res.map(function(data){return new _StructuresInvite2["default"](data,_this31.channels.get("id",data.channel.id),_this31.client);});});});}; //def overwritePermissions -InternalClient.prototype.overwritePermissions = function overwritePermissions(channel,role,updated){var _this32=this;return this.resolver.resolveChannel(channel).then(function(channel){if(!channel instanceof _StructuresServerChannel2["default"]){return Promise.reject(new Error("Not a server channel"));}var data={allow:0,deny:0};if(role instanceof String || typeof role === "string"){role = _this32.resolver.resolveUser(role) || _this32.resolver.resolveRole(role);}if(role instanceof _StructuresUser2["default"]){data.id = role.id;data.type = "member";}else if(role instanceof _StructuresRole2["default"]){data.id = role.id;data.type = "role";}else {return Promise.reject(new Error("Role could not be resolved"));}var previousOverwrite=channel.permissionOverwrites.get("id",data.id);if(previousOverwrite){data.allow |= previousOverwrite.allow;data.deny |= previousOverwrite.deny;}for(var perm in updated) {if(updated[perm] === true){data.allow |= _Constants.Permissions[perm] || 0;data.deny &= ~(_Constants.Permissions[perm] || 0);}else if(updated[perm] === false){data.allow &= ~(_Constants.Permissions[perm] || 0);data.deny |= _Constants.Permissions[perm] || 0;}else {data.allow &= ~(_Constants.Permissions[perm] || 0);data.deny &= ~(_Constants.Permissions[perm] || 0);}}return _this32.apiRequest("put",_Constants.Endpoints.CHANNEL_PERMISSIONS(channel.id) + "/" + data.id,true,data);});}; //def setStatus -InternalClient.prototype.setStatus = function setStatus(idleStatus,game){if(idleStatus === "online" || idleStatus === "here" || idleStatus === "available"){this.idleStatus = null;}else if(idleStatus === "idle" || idleStatus === "away"){this.idleStatus = Date.now();}else {this.idleStatus = this.idleStatus || null; //undefined -} // convert undefined and empty string to null -if(typeof game === "string" && !game.length)game = null;this.game = game === null?null:!game?this.game || null:typeof game === "string"?{name:game}:game;var packet={op:3,d:{idle_since:this.idleStatus,game:this.game}};this.sendWS(packet);this.user.status = this.idleStatus?"idle":"online";this.user.game = this.game;return Promise.resolve();}; //def sendTyping -InternalClient.prototype.sendTyping = function sendTyping(channel){var _this33=this;return this.resolver.resolveChannel(channel).then(function(channel){return _this33.apiRequest("post",_Constants.Endpoints.CHANNEL(channel.id) + "/typing",true);});}; //def startTyping -InternalClient.prototype.startTyping = function startTyping(channel){var _this34=this;return this.resolver.resolveChannel(channel).then(function(channel){if(_this34.intervals.typing[channel.id]){ // typing interval already exists, leave it alone -throw new Error("Already typing in that channel");}_this34.intervals.typing[channel.id] = setInterval(function(){return _this34.sendTyping(channel)["catch"](function(error){return _this34.emit("error",error);});},4000);return _this34.sendTyping(channel);});}; //def stopTyping -InternalClient.prototype.stopTyping = function stopTyping(channel){var _this35=this;return this.resolver.resolveChannel(channel).then(function(channel){if(!_this35.intervals.typing[channel.id]){ // typing interval doesn"t exist -throw new Error("Not typing in that channel");}clearInterval(_this35.intervals.typing[channel.id]);_this35.intervals.typing[channel.id] = false;});}; //def updateDetails -InternalClient.prototype.updateDetails = function updateDetails(data){if(!this.user.bot && !(this.email || data.email)){throw new Error("Must provide email since a token was used to login");}var options={avatar:this.resolver.resolveToBase64(data.avatar) || this.user.avatar,username:data.username || this.user.username};if(this.email || data.email){options.email = data.email || this.email;options.new_password = data.newPassword || null;options.password = data.password || this.password;}return this.apiRequest("patch",_Constants.Endpoints.ME,true,options);}; //def setAvatar -InternalClient.prototype.setAvatar = function setAvatar(avatar){return this.updateDetails({avatar:avatar});}; //def setUsername -InternalClient.prototype.setUsername = function setUsername(username){return this.updateDetails({username:username});}; //def setChannelTopic -InternalClient.prototype.setChannelTopic = function setChannelTopic(channel){var topic=arguments.length <= 1 || arguments[1] === undefined?"":arguments[1];topic = topic || "";return this.updateChannel(channel,{topic:topic});}; //def setChannelName -InternalClient.prototype.setChannelName = function setChannelName(channel,name){name = name || "unnamed-channel";return this.updateChannel(channel,{name:name});}; //def setChannelPosition -InternalClient.prototype.setChannelPosition = function setChannelPosition(channel,position){position = position || 0;return this.updateChannel(channel,{position:position});}; //def setChannelUserLimit -InternalClient.prototype.setChannelUserLimit = function setChannelUserLimit(channel,limit){limit = limit || 0; // default 0 = no limit -return this.updateChannel(channel,{userLimit:limit});}; //def setChannelBitrate -InternalClient.prototype.setChannelBitrate = function setChannelBitrate(channel,kbitrate){kbitrate = kbitrate || 64; // default 64kbps -return this.updateChannel(channel,{bitrate:kbitrate});}; //def updateChannel -InternalClient.prototype.updateChannel = function updateChannel(channel,data){var _this36=this;return this.resolver.resolveChannel(channel).then(function(channel){if(!channel){return Promise.reject(new Error("Failed to resolve channel"));}data = {name:data.name || channel.name,topic:data.topic || channel.topic,position:data.position?data.position:channel.position,user_limit:data.userLimit?data.userLimit:channel.userLimit,bitrate:data.bitrate?data.bitrate:channel.bitrate?channel.bitrate:undefined};if(data.position < 0){return Promise.reject(new Error("Position cannot be less than 0"));}if(data.user_limit < 0 || data.user_limit > 99){return Promise.reject(new Error("User limit must be between 0-99"));}if(data.kbitrate < 8 || data.kbitrate > 96){return Promise.reject(new Error("Bitrate must be between 8-96kbps"));}if(data.bitrate){data.bitrate *= 1000; // convert to bits before sending -}return _this36.apiRequest("patch",_Constants.Endpoints.CHANNEL(channel.id),true,data).then(function(res){channel.name = data.name;channel.topic = data.topic;channel.position = data.position;channel.userLimit = data.user_limit;channel.bitrate = Math.ceil(data.bitrate / 1000);channel._bitrate = data.bitrate;});});}; //def addFriend -InternalClient.prototype.addFriend = function addFriend(user){if(this.user.bot)return Promise.reject(new Error("user is a bot, bot's do not have friends support"));var id;if(user instanceof String || typeof user === "string")id = user;else if(user instanceof _StructuresUser2["default"]){user = this.resolver.resolveUser(user);id = user.id;}else {if(user.username && user.discriminator) // add by username and discriminator (pass in an object) -return this.apiRequest("put",_Constants.Endpoints.FRIENDS,true,user);else return Promise.reject("invalid user");}return this.apiRequest("put",_Constants.Endpoints.FRIENDS + "/" + id,true,{});}; //def removeFriend -InternalClient.prototype.removeFriend = function removeFriend(user){if(this.user.bot)return Promise.reject(new Error("user is a bot, bot's do not have friends support"));user = this.resolver.resolveUser(user);return this.apiRequest("delete",_Constants.Endpoints.FRIENDS + "/" + user.id,true);}; //def getOAuthApplication -InternalClient.prototype.getOAuthApplication = function getOAuthApplication(appID){appID = appID || "@me";return this.apiRequest("get",_Constants.Endpoints.OAUTH2_APPLICATION(appID),true);}; //def ack -InternalClient.prototype.ack = function ack(msg){msg = this.resolver.resolveMessage(msg);if(!msg){Promise.reject(new Error("Message does not exist"));}return this.apiRequest("post",_Constants.Endpoints.CHANNEL_MESSAGE(msg.channel.id,msg.id) + "/ack",true);};InternalClient.prototype.sendWS = function sendWS(object){if(this.websocket){this.websocket.send(JSON.stringify(object));}};InternalClient.prototype.createWS = function createWS(url){var _this37=this;var self=this;var client=self.client;if(this.websocket){return false;}this.websocket = new _ws2["default"](url);this.websocket.onopen = function(){var data={op:2,d:{token:self.token,v:3,compress:self.client.options.compress,large_threshold:self.client.options.largeThreshold,properties:{"$os":process.platform,"$browser":"discord.js","$device":"discord.js","$referrer":"","$referring_domain":""}}};if(self.client.options.shard){data.d.shard = self.client.options.shard;}self.sendWS(data);};this.websocket.onclose = function(event){self.websocket = null;self.state = _ConnectionState2["default"].DISCONNECTED;if(event && event.code){client.emit("warn","WS close: " + event.code);var err;if(event.code === 4001){err = new Error("Gateway received invalid OP code");}else if(event.code === 4005){err = new Error("Gateway received invalid message");}else if(event.code === 4003){err = new Error("Not authenticated");}else if(event.code === 4004){err = new Error("Authentication failed");}else if(event.code === 4005){err = new Error("Already authenticated");}if(event.code === 4006 || event.code === 4009){err = new Error("Invalid session");}else if(event.code === 4007){_this37.seq = 0;err = new Error("Invalid sequence number");}else if(event.code === 4008){err = new Error("Gateway connection was ratelimited");}else if(event.code === 4010){err = new Error("Invalid shard key");}if(err){client.emit("error",err);}}self.disconnected(_this37.client.options.autoReconnect);};this.websocket.onerror = function(e){client.emit("error",e);self.websocket = null;self.state = _ConnectionState2["default"].DISCONNECTED;self.disconnected(_this37.client.options.autoReconnect);};this.websocket.onmessage = function(e){if(e.data instanceof Buffer){if(!zlib)zlib = require("zlib");e.data = zlib.inflateSync(e.data).toString();}var packet,data;try{packet = JSON.parse(e.data);data = packet.d;}catch(e) {client.emit("error",e);return;}client.emit("raw",packet);switch(packet.t){case _Constants.PacketType.READY:var startTime=Date.now();self.intervals.kai = setInterval(function(){return self.sendWS({op:1,d:Date.now()});},data.heartbeat_interval);self.user = self.users.add(new _StructuresUser2["default"](data.user,client));_this37.forceFetchCount = {};_this37.forceFetchQueue = [];_this37.forceFetchLength = 1;_this37.autoReconnectInterval = 1000;_this37.sessionID = data.session_id;data.guilds.forEach(function(server){if(!server.unavailable){server = self.servers.add(new _StructuresServer2["default"](server,client));if(self.client.options.forceFetchUsers && server.members && server.members.length < server.memberCount){self.getGuildMembers(server.id,Math.ceil(server.memberCount / 1000));}}else {client.emit("debug","server " + server.id + " was unavailable, could not create (ready)");self.unavailableServers.add(server);}});data.private_channels.forEach(function(pm){self.private_channels.add(new _StructuresPMChannel2["default"](pm,client));});if(!data.user.bot){ // bots dont have friends -data.relationships.forEach(function(friend){if(friend.type === 1){ // is a friend -self.friends.add(new _StructuresUser2["default"](friend.user,client));}else if(friend.type === 2){ // incoming friend requests -self.blocked_users.add(new _StructuresUser2["default"](friend.user,client));}else if(friend.type === 3){ // incoming friend requests -self.incoming_friend_requests.add(new _StructuresUser2["default"](friend.user,client));}else if(friend.type === 4){ // outgoing friend requests -self.outgoing_friend_requests.add(new _StructuresUser2["default"](friend.user,client));}else {client.emit("warn","unknown friend type " + friend.type);}});}else {self.friends = null;self.blocked_users = null;self.incoming_friend_requests = null;self.outgoing_friend_requests = null;} // add notes to users -if(data.notes){for(note in data.notes) {var user=self.users.get("id",note);if(user){var newUser=user;newUser.note = data.notes[note];self.users.update(user,newUser);}else {client.emit("warn","note in ready packet but user not cached");}}}self.state = _ConnectionState2["default"].READY;client.emit("debug","ready packet took " + (Date.now() - startTime) + "ms to process");client.emit("debug","ready with " + self.servers.length + " servers, " + self.unavailableServers.length + " unavailable servers, " + self.channels.length + " channels and " + self.users.length + " users cached.");self.restartServerCreateTimeout();break;case _Constants.PacketType.MESSAGE_CREATE: // format: https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format -var channel=self.channels.get("id",data.channel_id) || self.private_channels.get("id",data.channel_id);if(channel){var msg=channel.messages.add(new _StructuresMessage2["default"](data,channel,client));channel.lastMessageID = msg.id;if(self.messageAwaits[channel.id + msg.author.id]){self.messageAwaits[channel.id + msg.author.id].map(function(fn){return fn(msg);});self.messageAwaits[channel.id + msg.author.id] = null;client.emit("message",msg,true); //2nd param is isAwaitedMessage -}else {client.emit("message",msg);}}else {client.emit("warn","message created but channel is not cached");}break;case _Constants.PacketType.MESSAGE_DELETE:var channel=self.channels.get("id",data.channel_id) || self.private_channels.get("id",data.channel_id);if(channel){ // potentially blank -var msg=channel.messages.get("id",data.id);client.emit("messageDeleted",msg,channel);if(msg){channel.messages.remove(msg);}else {client.emit("debug","message was deleted but message is not cached");}}else {client.emit("warn","message was deleted but channel is not cached");}break;case _Constants.PacketType.MESSAGE_UPDATE: // format https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format -var channel=self.channels.get("id",data.channel_id) || self.private_channels.get("id",data.channel_id);if(channel){ // potentially blank -var msg=channel.messages.get("id",data.id);if(msg){ // old message exists -data.nonce = data.nonce || msg.nonce;data.attachments = data.attachments || msg.attachments;data.tts = data.tts || msg.tts;data.embeds = data.embeds || msg.embeds;data.timestamp = data.timestamp || msg.timestamp;data.mention_everyone = data.mention_everyone || msg.everyoneMentioned;data.content = data.content || msg.content;data.mentions = data.mentions || msg.mentions;data.author = data.author || msg.author;msg = new _StructuresMessage2["default"](msg,channel,client);}else if(!data.author || !data.content){break;}var nmsg=new _StructuresMessage2["default"](data,channel,client);client.emit("messageUpdated",msg,nmsg);if(msg){channel.messages.update(msg,nmsg);}}else {client.emit("warn","message was updated but channel is not cached");}break;case _Constants.PacketType.SERVER_CREATE:var server=self.servers.get("id",data.id);if(!server){if(!data.unavailable){server = self.servers.add(new _StructuresServer2["default"](data,client));if(client.readyTime){client.emit("serverCreated",server);}if(self.client.options.forceFetchUsers && server.large && server.members.length < server.memberCount){self.getGuildMembers(server.id,Math.ceil(server.memberCount / 1000));}var unavailable=self.unavailableServers.get("id",server.id);if(unavailable){self.unavailableServers.remove(unavailable);}self.restartServerCreateTimeout();}else {client.emit("debug","server was unavailable, could not create");}}break;case _Constants.PacketType.SERVER_DELETE:var server=self.servers.get("id",data.id);if(server){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]();;) {var _ref8;if(_isArray8){if(_i8 >= _iterator8.length)break;_ref8 = _iterator8[_i8++];}else {_i8 = _iterator8.next();if(_i8.done)break;_ref8 = _i8.value;}var user=_ref8;var found=false;for(var _iterator9=self.servers,_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 s=_ref9;if(s.members.get("id",user.id)){found = true;break;}}if(!found){self.users.remove(user);}}}else {client.emit("debug","server was unavailable, could not update");}self.buckets["bot:msg:guild:" + packet.d.id] = self.buckets["dmsg:" + packet.d.id] = self.buckets["bdmsg:" + packet.d.id] = self.buckets["guild_member:" + packet.d.id] = self.buckets["guild_member_nick:" + packet.d.id] = undefined;}else {client.emit("warn","server was deleted but it was not in the cache");}break;case _Constants.PacketType.SERVER_UPDATE:var server=self.servers.get("id",data.id);if(server){ // server exists -data.members = data.members || [];data.channels = data.channels || [];var newserver=new _StructuresServer2["default"](data,client);newserver.members = server.members;newserver.memberMap = server.memberMap;newserver.channels = server.channels;if(newserver.equalsStrict(server)){ // already the same don't do anything -client.emit("debug","received server update but server already updated");}else {client.emit("serverUpdated",new _StructuresServer2["default"](server,client),newserver);self.servers.update(server,newserver);}}else if(!server){client.emit("warn","server was updated but it was not in the cache");self.servers.add(new _StructuresServer2["default"](data,client));client.emit("serverCreated",server);}break;case _Constants.PacketType.CHANNEL_CREATE:var channel=self.channels.get("id",data.id);if(!channel){var server=self.servers.get("id",data.guild_id);if(server){var chan=null;if(data.type === "text"){chan = self.channels.add(new _StructuresTextChannel2["default"](data,client,server));}else {chan = self.channels.add(new _StructuresVoiceChannel2["default"](data,client,server));}client.emit("channelCreated",server.channels.add(chan));}else if(data.is_private){client.emit("channelCreated",self.private_channels.add(new _StructuresPMChannel2["default"](data,client)));}else {client.emit("warn","channel created but server does not exist");}}else {client.emit("warn","channel created but already in cache");}break;case _Constants.PacketType.CHANNEL_DELETE:var channel=self.channels.get("id",data.id) || self.private_channels.get("id",data.id);if(channel){if(channel.server){ // accounts for PMs -channel.server.channels.remove(channel);self.channels.remove(channel);}else {self.private_channels.remove(channel);}client.emit("channelDeleted",channel);}else {client.emit("warn","channel deleted but already out of cache?");}break;case _Constants.PacketType.CHANNEL_UPDATE:var channel=self.channels.get("id",data.id) || self.private_channels.get("id",data.id);if(channel){if(channel instanceof _StructuresPMChannel2["default"]){ //PM CHANNEL -client.emit("channelUpdated",new _StructuresPMChannel2["default"](channel,client),self.private_channels.update(channel,new _StructuresPMChannel2["default"](data,client)));}else {if(channel.server){if(channel.type === "text"){ //TEXT CHANNEL -var chan=new _StructuresTextChannel2["default"](data,client,channel.server);chan.messages = channel.messages;client.emit("channelUpdated",channel,chan);channel.server.channels.update(channel,chan);self.channels.update(channel,chan);}else { //VOICE CHANNEL -data.members = channel.members;var chan=new _StructuresVoiceChannel2["default"](data,client,channel.server);client.emit("channelUpdated",channel,chan);channel.server.channels.update(channel,chan);self.channels.update(channel,chan);}}else {client.emit("warn","channel updated but server non-existant");}}}else {client.emit("warn","channel updated but not in cache");}break;case _Constants.PacketType.SERVER_ROLE_CREATE:var server=self.servers.get("id",data.guild_id);if(server){client.emit("serverRoleCreated",server.roles.add(new _StructuresRole2["default"](data.role,server,client)),server);}else {client.emit("warn","server role made but server not in cache");}break;case _Constants.PacketType.SERVER_ROLE_DELETE:var server=self.servers.get("id",data.guild_id);if(server){var role=server.roles.get("id",data.role_id);if(role){server.roles.remove(role);client.emit("serverRoleDeleted",role);}else {client.emit("warn","server role deleted but role not in cache");}}else {client.emit("warn","server role deleted but server not in cache");}break;case _Constants.PacketType.SERVER_ROLE_UPDATE:var server=self.servers.get("id",data.guild_id);if(server){var role=server.roles.get("id",data.role.id);if(role){var newRole=new _StructuresRole2["default"](data.role,server,client);client.emit("serverRoleUpdated",new _StructuresRole2["default"](role,server,client),newRole);server.roles.update(role,newRole);}else {client.emit("warn","server role updated but role not in cache");}}else {client.emit("warn","server role updated but server not in cache");}break;case _Constants.PacketType.SERVER_MEMBER_ADD:var server=self.servers.get("id",data.guild_id);if(server){server.memberMap[data.user.id] = {roles:data.roles,mute:false,selfMute:false,deaf:false,selfDeaf:false,joinedAt:Date.parse(data.joined_at),nick:data.nick || null};server.memberCount++;client.emit("serverNewMember",server,server.members.add(self.users.add(new _StructuresUser2["default"](data.user,client))));}else {client.emit("warn","server member added but server doesn't exist in cache");}break;case _Constants.PacketType.SERVER_MEMBER_REMOVE:var server=self.servers.get("id",data.guild_id);if(server){var user=self.users.get("id",data.user.id);if(user){client.emit("serverMemberRemoved",server,user);server.memberMap[data.user.id] = null;server.members.remove(user);server.memberCount--;}else {client.emit("warn","server member removed but user doesn't exist in cache");}}else {client.emit("warn","server member removed but server doesn't exist in cache");}break;case _Constants.PacketType.SERVER_MEMBER_UPDATE:var server=self.servers.get("id",data.guild_id);if(server){var user=self.users.add(new _StructuresUser2["default"](data.user,client));if(user){var oldMember=null;if(server.memberMap[data.user.id]){oldMember = {roles:server.memberMap[data.user.id].roles,mute:server.memberMap[data.user.id].mute,selfMute:server.memberMap[data.user.id].selfMute,deaf:server.memberMap[data.user.id].deaf,selfDeaf:server.memberMap[data.user.id].selfDeaf,nick:server.memberMap[data.user.id].nick};}else {server.memberMap[data.user.id] = {};}server.memberMap[data.user.id].roles = data.roles?data.roles:server.memberMap[data.user.id].roles;server.memberMap[data.user.id].mute = data.mute || server.memberMap[data.user.id].mute;server.memberMap[data.user.id].selfMute = data.self_mute === undefined?server.memberMap[data.user.id].selfMute:data.self_mute;server.memberMap[data.user.id].deaf = data.deaf || server.memberMap[data.user.id].deaf;server.memberMap[data.user.id].selfDeaf = data.self_deaf === undefined?server.memberMap[data.user.id].selfDeaf:data.self_deaf;server.memberMap[data.user.id].nick = data.nick === undefined?server.memberMap[data.user.id].nick:data.nick || null;client.emit("serverMemberUpdated",server,user,oldMember);}else {client.emit("warn","server member removed but user doesn't exist in cache");}}else {client.emit("warn","server member updated but server doesn't exist in cache");}break;case _Constants.PacketType.PRESENCE_UPDATE:var user=self.users.add(new _StructuresUser2["default"](data.user,client));var server=self.servers.get("id",data.guild_id);if(user && server){server.members.add(user);data.user.username = data.user.username || user.username;data.user.id = data.user.id || user.id;data.user.avatar = data.user.avatar !== undefined?data.user.avatar:user.avatar;data.user.discriminator = data.user.discriminator || user.discriminator;data.user.status = data.status || user.status;data.user.game = data.game !== undefined?data.game:user.game;data.user.bot = data.user.bot !== undefined?data.user.bot:user.bot;var presenceUser=new _StructuresUser2["default"](data.user,client);if(!presenceUser.equalsStrict(user)){client.emit("presence",user,presenceUser);self.users.update(user,presenceUser);}}else {client.emit("warn","presence update but user/server not in cache");}break;case _Constants.PacketType.USER_UPDATE:var user=self.users.get("id",data.id);if(user){data.username = data.username || user.username;data.id = data.id || user.id;data.avatar = data.avatar || user.avatar;data.discriminator = data.discriminator || user.discriminator;_this37.email = data.email || _this37.email;var presenceUser=new _StructuresUser2["default"](data,client);client.emit("presence",user,presenceUser);self.users.update(user,presenceUser);}else {client.emit("warn","user update but user not in cache (this should never happen)");}break;case _Constants.PacketType.TYPING:var user=self.users.get("id",data.user_id);var channel=self.channels.get("id",data.channel_id) || self.private_channels.get("id",data.channel_id);if(user && channel){if(user.typing.since){user.typing.since = Date.now();user.typing.channel = channel;}else {user.typing.since = Date.now();user.typing.channel = channel;client.emit("userTypingStarted",user,channel);}setTimeout(function(){if(Date.now() - user.typing.since > 5500){ // they haven't typed since -user.typing.since = null;user.typing.channel = null;client.emit("userTypingStopped",user,channel);}},6000);}else {client.emit("warn","user typing but user or channel not existant in cache");}break;case _Constants.PacketType.SERVER_BAN_ADD:var user=self.users.get("id",data.user.id);var server=self.servers.get("id",data.guild_id);if(user && server){client.emit("userBanned",user,server);}else {client.emit("warn","user banned but user/server not in cache.");}break;case _Constants.PacketType.SERVER_BAN_REMOVE:var user=self.users.get("id",data.user.id);var server=self.servers.get("id",data.guild_id);if(user && server){client.emit("userUnbanned",user,server);}else {client.emit("warn","user unbanned but user/server not in cache.");}break;case _Constants.PacketType.USER_NOTE_UPDATE:if(_this37.user.bot){return;}var user=self.users.get("id",data.id);var oldNote=user.note;var note=data.note || null; // user in cache -if(user){var updatedUser=user;updatedUser.note = note;client.emit("noteUpdated",user,oldNote);self.users.update(user,updatedUser);}else {client.emit("warn","note updated but user not in cache");}break;case _Constants.PacketType.VOICE_STATE_UPDATE:var user=self.users.get("id",data.user_id);var server=self.servers.get("id",data.guild_id);var connection=self.voiceConnections.get("server",server);if(user && server){if(data.channel_id){ // in voice channel -var channel=self.channels.get("id",data.channel_id);if(channel && channel.type === "voice"){server.eventVoiceStateUpdate(channel,user,data);}else {client.emit("warn","voice state channel not in cache");}}else { // not in voice channel -client.emit("voiceLeave",server.eventVoiceLeave(user),user);}}else {client.emit("warn","voice state update but user or server not in cache");}if(user && user.id === self.user.id){ // only for detecting self user movements for connections. -var connection=self.voiceConnections.get("server",server); // existing connection, perhaps channel moved -if(connection && connection.voiceChannel && connection.voiceChannel.id !== data.channel_id){ // moved, update info -connection.voiceChannel = self.channels.get("id",data.channel_id);client.emit("voiceMoved",connection.voiceChannel); // Moved to a new channel -}}break;case _Constants.PacketType.SERVER_MEMBERS_CHUNK:var server=self.servers.get("id",data.guild_id);if(server){var testtime=Date.now();for(var _iterator10=data.members,_isArray10=Array.isArray(_iterator10),_i10=0,_iterator10=_isArray10?_iterator10:_iterator10[Symbol.iterator]();;) {var _ref10;if(_isArray10){if(_i10 >= _iterator10.length)break;_ref10 = _iterator10[_i10++];}else {_i10 = _iterator10.next();if(_i10.done)break;_ref10 = _i10.value;}var user=_ref10;server.memberMap[user.user.id] = {roles:user.roles,mute:user.mute,selfMute:false,deaf:user.deaf,selfDeaf:false,joinedAt:Date.parse(user.joined_at),nick:user.nick || null};server.members.add(self.users.add(new _StructuresUser2["default"](user.user,client)));}if(self.forceFetchCount.hasOwnProperty(server.id)){if(self.forceFetchCount[server.id] <= 1){delete self.forceFetchCount[server.id];self.checkReady();}else {self.forceFetchCount[server.id]--;}}client.emit("debug",Date.now() - testtime + "ms for " + data.members.length + " user chunk for server with id " + server.id);}else {client.emit("warn","chunk update received but server not in cache");}break;case _Constants.PacketType.FRIEND_ADD:if(_this37.user.bot){return;}if(data.type === 1){ // accepted/got accepted a friend request -var inUser=self.incoming_friend_requests.get("id",data.id);if(inUser){ // client accepted another user -self.incoming_friend_requests.remove(self.friends.add(new _StructuresUser2["default"](data.user,client)));return;}var outUser=self.outgoing_friend_requests.get("id",data.id);if(outUser){ // another user accepted the client -self.outgoing_friend_requests.remove(self.friends.add(new _StructuresUser2["default"](data.user,client)));client.emit("friendRequestAccepted",outUser);return;}}else if(data.type === 2){ // client received block -self.blocked_users.add(new _StructuresUser2["default"](data.user,client));}else if(data.type === 3){ // client received friend request -client.emit("friendRequestReceived",self.incoming_friend_requests.add(new _StructuresUser2["default"](data.user,client)));}else if(data.type === 4){ // client sent friend request -self.outgoing_friend_requests.add(new _StructuresUser2["default"](data.user,client));}break;case _Constants.PacketType.FRIEND_REMOVE:if(_this37.user.bot){return;}var user=self.friends.get("id",data.id);if(user){self.friends.remove(user);client.emit("friendRemoved",user);return;}user = self.blocked_users.get("id",data.id);if(user){ // they rejected friend request -self.blocked_users.remove(user);return;}user = self.incoming_friend_requests.get("id",data.id);if(user){ // they rejected outgoing friend request OR client user manually deleted incoming thru web client/other clients -var rejectedUser=self.outgoing_friend_requests.get("id",user.id);if(rejectedUser){ // other person rejected outgoing -client.emit("friendRequestRejected",self.outgoing_friend_requests.remove(rejectedUser));return;} // incoming deleted manually -self.incoming_friend_requests.remove(user);return;}user = self.outgoing_friend_requests.get("id",data.id);if(user){ // client cancelled incoming friend request OR client user manually deleted outgoing thru web client/other clients -var incomingCancel=self.incoming_friend_requests.get("id",user.id);if(incomingCancel){ // client cancelled incoming -self.incoming_friend_requests.remove(user);return;} // outgoing deleted manually -self.outgoing_friend_requests.remove(user);return;}break;default:client.emit("unknown",packet);break;}};};_createClass(InternalClient,[{key:"uptime",get:function get(){return this.readyTime?Date.now() - this.readyTime:null;}},{key:"userAgent",set:function set(info){info.full = "DiscordBot (" + info.url + ", " + info.version + ")";this.userAgentInfo = info;},get:function get(){return this.userAgentInfo;}},{key:"voiceConnection",get:function get(){return this.voiceConnections[0];}}]);return InternalClient;})();exports["default"] = InternalClient;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +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; }; })(); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var _superagent = require("superagent"); + +var _superagent2 = _interopRequireDefault(_superagent); + +var _ws = require("ws"); + +var _ws2 = _interopRequireDefault(_ws); + +var _ConnectionState = require("./ConnectionState"); + +var _ConnectionState2 = _interopRequireDefault(_ConnectionState); + +var _querystring = require("querystring"); + +var _querystring2 = _interopRequireDefault(_querystring); + +var _Constants = require("../Constants"); + +var _UtilBucket = require("../Util/Bucket"); + +var _UtilBucket2 = _interopRequireDefault(_UtilBucket); + +var _UtilCache = require("../Util/Cache"); + +var _UtilCache2 = _interopRequireDefault(_UtilCache); + +var _ResolverResolver = require("./Resolver/Resolver"); + +var _ResolverResolver2 = _interopRequireDefault(_ResolverResolver); + +var _StructuresUser = require("../Structures/User"); + +var _StructuresUser2 = _interopRequireDefault(_StructuresUser); + +var _StructuresChannel = require("../Structures/Channel"); + +var _StructuresChannel2 = _interopRequireDefault(_StructuresChannel); + +var _StructuresServerChannel = require("../Structures/ServerChannel"); + +var _StructuresServerChannel2 = _interopRequireDefault(_StructuresServerChannel); + +var _StructuresTextChannel = require("../Structures/TextChannel"); + +var _StructuresTextChannel2 = _interopRequireDefault(_StructuresTextChannel); + +var _StructuresVoiceChannel = require("../Structures/VoiceChannel"); + +var _StructuresVoiceChannel2 = _interopRequireDefault(_StructuresVoiceChannel); + +var _StructuresPMChannel = require("../Structures/PMChannel"); + +var _StructuresPMChannel2 = _interopRequireDefault(_StructuresPMChannel); + +var _StructuresServer = require("../Structures/Server"); + +var _StructuresServer2 = _interopRequireDefault(_StructuresServer); + +var _StructuresMessage = require("../Structures/Message"); + +var _StructuresMessage2 = _interopRequireDefault(_StructuresMessage); + +var _StructuresRole = require("../Structures/Role"); + +var _StructuresRole2 = _interopRequireDefault(_StructuresRole); + +var _StructuresInvite = require("../Structures/Invite"); + +var _StructuresInvite2 = _interopRequireDefault(_StructuresInvite); + +var _VoiceVoiceConnection = require("../Voice/VoiceConnection"); + +var _VoiceVoiceConnection2 = _interopRequireDefault(_VoiceVoiceConnection); + +var _UtilTokenCacher = require("../Util/TokenCacher"); + +var _UtilTokenCacher2 = _interopRequireDefault(_UtilTokenCacher); + +var zlib; +var libVersion = require('../../package.json').version; + +function waitFor(condition) { + var value = arguments.length <= 1 || arguments[1] === undefined ? condition : arguments[1]; + var interval = arguments.length <= 2 || arguments[2] === undefined ? 20 : arguments[2]; + return (function () { + return new Promise(function (resolve) { + var int = setInterval(function () { + var isDone = condition(); + if (isDone) { + if (condition === value) { + resolve(isDone); + } else { + resolve(value(isDone)); + } + return clearInterval(int); + } + }, interval); + }); + })(); +} + +function delay(ms) { + return new Promise(function (resolve) { + return setTimeout(resolve, ms); + }); +} + +var InternalClient = (function () { + function InternalClient(discordClient) { + _classCallCheck(this, InternalClient); + + this.setup(discordClient); + } + + InternalClient.prototype.apiRequest = function apiRequest(method, url, useAuth, data, file) { + var resolve, reject; + var promise = new Promise(function (res, rej) { + resolve = res; + reject = rej; + }); + var buckets = []; + var match = url.match(/\/channels\/([0-9]+)\/messages(\/[0-9]+)?$/); + if (match) { + if (method === "del" && (match[1] = this.channels.get("id", match[1]) || this.private_channels.get("id", match[1]))) { + buckets = ["dmsg:" + (match[1].server || {}).id]; + } else if (this.user.bot) { + if (method === "post" || method === "patch") { + if (this.private_channels.get("id", match[1])) { + buckets = ["bot:msg:dm", "bot:msg:global"]; + } else if (match[1] = this.channels.get("id", match[1])) { + buckets = ["bot:msg:guild:" + match[1].server.id, "bot:msg:global"]; + } + } + } else { + buckets = ["msg"]; + } + } else if (method === "patch") { + if (url === "/users/@me" && this.user && data.username && data.username !== this.user.username) { + buckets = ["username"]; + } else if (match = url.match(/\/guilds\/([0-9]+)\/members\/[0-9]+$/)) { + buckets = ["guild_member:" + match[1]]; + } else if (match = url.match(/\/guilds\/([0-9]+)\/members\/@me\/nick$/)) { + buckets = ["guild_member_nick:" + match[1]]; + } + } + + var self = this; + + var actualCall = function actualCall() { + var startTime = Date.now(); + var ret = _superagent2["default"][method](url); + if (useAuth) { + ret.set("authorization", self.token); + } + if (file) { + ret.attach("file", file.file, file.name); + if (data) { + for (var i in data) { + if (data[i] !== undefined) { + ret.field(i, data[i]); + } + } + } + } else if (data) { + ret.send(data); + } + ret.set('User-Agent', self.userAgentInfo.full); + ret.end(function (error, data) { + if (error) { + if (data.status === 429) { + self.client.emit("debug", "Encountered 429 at " + url + " | " + self.client.options.shard + " | Buckets" + buckets + " | " + (Date.now() - startTime) + "ms latency"); + } + reject(error); + } else { + resolve(data.body); + } + }); + }; + var waitFor = 1; + var i = 0; + var done = function done() { + if (++i === waitFor) { + actualCall(); + } + }; + for (var _iterator = buckets, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var bucket = _ref; + + ++waitFor; + this.buckets[bucket].queue(done); + } + done(); + return promise; + }; + + InternalClient.prototype.setup = function setup(discordClient) { + discordClient = discordClient || this.client; + this.client = discordClient; + this.state = _ConnectionState2["default"].IDLE; + this.websocket = null; + this.userAgent = { + url: 'https://github.com/hydrabolt/discord.js', + version: require('../../package.json').version + }; + + if (this.client.options.compress) { + zlib = require("zlib"); + } + + // creates 4 caches with discriminators based on ID + this.users = new _UtilCache2["default"](); + this.friends = new _UtilCache2["default"](); + this.blocked_users = new _UtilCache2["default"](); + this.outgoing_friend_requests = new _UtilCache2["default"](); + this.incoming_friend_requests = new _UtilCache2["default"](); + this.channels = new _UtilCache2["default"](); + this.servers = new _UtilCache2["default"](); + this.unavailableServers = new _UtilCache2["default"](); + this.private_channels = new _UtilCache2["default"](); + this.autoReconnectInterval = 1000; + + this.intervals = { + typing: [], + kai: null, + misc: [] + }; + + this.voiceConnections = new _UtilCache2["default"](); + this.resolver = new _ResolverResolver2["default"](this); + this.readyTime = null; + this.messageAwaits = {}; + this.buckets = { + "bot:msg:dm": new _UtilBucket2["default"](5, 5000), + "bot:msg:global": new _UtilBucket2["default"](50, 10000), + "msg": new _UtilBucket2["default"](10, 10000), + "username": new _UtilBucket2["default"](2, 3600000) + }; + + if (!this.tokenCacher) { + this.tokenCacher = new _UtilTokenCacher2["default"](this.client); + this.tokenCacher.init(0); + } + }; + + InternalClient.prototype.cleanIntervals = function cleanIntervals() { + for (var _iterator2 = this.intervals.typing.concat(this.intervals.misc).concat(this.intervals.kai), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var interval = _ref2; + + if (interval) { + clearInterval(interval); + } + } + }; + + InternalClient.prototype.disconnected = function disconnected() { + var _this = this; + + var autoReconnect = arguments.length <= 0 || arguments[0] === undefined ? false : arguments[0]; + + this.cleanIntervals(); + + this.voiceConnections.forEach(function (vc) { + _this.leaveVoiceChannel(vc); + }); + + if (autoReconnect) { + this.autoReconnectInterval = Math.min(this.autoReconnectInterval * (Math.random() + 1), 60000); + setTimeout(function () { + if (!_this.email && !_this.token) { + return; + } + + // Check whether the email is set (if not, only a token has been used for login) + _this.loginWithToken(_this.token, _this.email, _this.password)["catch"](function () { + return _this.disconnected(true); + }); + }, this.autoReconnectInterval); + } + + this.client.emit("disconnected"); + }; + + //def leaveVoiceChannel + + InternalClient.prototype.leaveVoiceChannel = function leaveVoiceChannel(chann) { + var _this2 = this; + + if (this.user.bot) { + var leave = function leave(connection) { + return new Promise(function (resolve, reject) { + connection.destroy(); + resolve(); + }); + }; + + if (chann instanceof _StructuresVoiceChannel2["default"]) { + return this.resolver.resolveChannel(chann).then(function (channel) { + if (!channel) { + return Promise.reject(new Error("voice channel does not exist")); + } + + if (channel.type !== 'voice') { + return Promise.reject(new Error("channel is not a voice channel!")); + } + + var connection = _this2.voiceConnections.get("voiceChannel", channel); + if (!connection) { + return Promise.reject(new Error("not connected to that voice channel")); + } + return leave(connection); + }); + } else if (chann instanceof _VoiceVoiceConnection2["default"]) { + return leave(chann); + } else { + return Promise.reject(new Error("invalid voice channel/connection to leave")); + } + } else { + // preserve old functionality for non-bots + if (this.voiceConnections[0]) { + this.voiceConnections[0].destroy(); + } + return Promise.resolve(); + } + }; + + //def awaitResponse + + InternalClient.prototype.awaitResponse = function awaitResponse(msg) { + var _this3 = this; + + return new Promise(function (resolve, reject) { + + msg = _this3.resolver.resolveMessage(msg); + + if (!msg) { + reject(new Error("message undefined")); + return; + } + + var awaitID = msg.channel.id + msg.author.id; + + if (!_this3.messageAwaits[awaitID]) { + _this3.messageAwaits[awaitID] = []; + } + + _this3.messageAwaits[awaitID].push(resolve); + }); + }; + + //def joinVoiceChannel + + InternalClient.prototype.joinVoiceChannel = function joinVoiceChannel(chann) { + var _this4 = this; + + return this.resolver.resolveChannel(chann).then(function (channel) { + if (!channel) { + return Promise.reject(new Error("voice channel does not exist")); + } + + if (channel.type !== 'voice') { + return Promise.reject(new Error("channel is not a voice channel!")); + } + + var joinSendWS = function joinSendWS() { + _this4.sendWS({ + op: 4, + d: { + "guild_id": channel.server.id, + "channel_id": channel.id, + "self_mute": false, + "self_deaf": false + } + }); + }; + + var joinVoice = function joinVoice() { + return new Promise(function (resolve, reject) { + var session = _this4.sessionID, + token, + server = channel.server, + endpoint; + + var timeout = null; + + var check = function check(data) { + if (data.t === "VOICE_SERVER_UPDATE") { + if (data.d.guild_id !== server.id) return; // ensure it is the right server + token = data.d.token; + endpoint = data.d.endpoint; + if (!token || !endpoint) return; + var chan = new _VoiceVoiceConnection2["default"](channel, _this4.client, session, token, server, endpoint); + _this4.voiceConnections.add(chan); + + chan.on("ready", function () { + return resolve(chan); + }); + chan.on("error", reject); + chan.on("close", reject); + + if (timeout) { + clearTimeout(timeout); + } + _this4.client.removeListener("raw", check); + } + }; + + timeout = setTimeout(function () { + _this4.client.removeListener("raw", check); + reject(new Error("No voice server details within 10 seconds")); + }, 10000); + + _this4.client.on("raw", check); + joinSendWS(); + }); + }; + + var existingServerConn = _this4.voiceConnections.get("server", channel.server); // same server connection + if (existingServerConn) { + joinSendWS(); // Just needs to update by sending via WS, movement in cache will be handled by global handler + return Promise.resolve(existingServerConn); + } + + if (!_this4.user.bot && _this4.voiceConnections.length > 0) { + // nonbot, one voiceconn only, just like last time just disconnect + return _this4.leaveVoiceChannel().then(joinVoice); + } + + return joinVoice(); + }); + }; + + // Backwards-compatible utility getter method for the first voice connection + // Thanks to #q (@qeled) for suggesting this + + InternalClient.prototype.getGuildMembers = function getGuildMembers(serverID, chunkCount) { + this.forceFetchCount[serverID] = chunkCount; + if (this.forceFetchLength + 3 + serverID.length > 4082) { + // 4096 - '{"op":8,"d":[]}'.length + 1 for lazy comma offset + this.requestGuildMembers(this.forceFetchQueue); + this.forceFetchQueue = [serverID]; + this.forceFetchLength = 1 + serverID.length + 3; + } else { + this.forceFetchQueue.push(serverID); + this.forceFetchLength += serverID.length + 3; + } + }; + + InternalClient.prototype.requestGuildMembers = function requestGuildMembers(serverID, query, limit) { + this.sendWS({ op: 8, + d: { + guild_id: serverID, + query: query || "", + limit: limit || 0 + } + }); + }; + + InternalClient.prototype.checkReady = function checkReady() { + if (!this.readyTime) { + if (this.forceFetchQueue.length > 0) { + this.requestGuildMembers(this.forceFetchQueue); + this.forceFetchQueue = []; + this.forceFetchLength = 1; + } else { + for (var key in this.forceFetchCount) { + if (this.forceFetchCount.hasOwnProperty(key)) { + return; + } + } + this.readyTime = Date.now(); + this.client.emit("ready"); + } + } + }; + + InternalClient.prototype.restartServerCreateTimeout = function restartServerCreateTimeout() { + var _this5 = this; + + if (this.guildCreateTimeout) { + clearTimeout(this.guildCreateTimeout); + this.guildCreateTimeout = null; + } + if (!this.readyTime) { + this.guildCreateTimeout = setTimeout(function () { + _this5.checkReady(); + }, this.client.options.guildCreateTimeout); + } + }; + + // def createServer + + InternalClient.prototype.createServer = function createServer(name) { + var _this6 = this; + + var region = arguments.length <= 1 || arguments[1] === undefined ? "london" : arguments[1]; + + name = this.resolver.resolveString(name); + + return this.apiRequest('post', _Constants.Endpoints.SERVERS, true, { name: name, region: region }).then(function (res) { + // valid server, wait until it is cached + return waitFor(function () { + return _this6.servers.get("id", res.id); + }); + }); + }; + + //def joinServer + + InternalClient.prototype.joinServer = function joinServer(invite) { + var _this7 = this; + + invite = this.resolver.resolveInviteID(invite); + if (!invite) { + return Promise.reject(new Error("Not a valid invite")); + } + + return this.apiRequest("post", _Constants.Endpoints.INVITE(invite), true).then(function (res) { + // valid server, wait until it is received via ws and cached + return waitFor(function () { + return _this7.servers.get("id", res.guild.id); + }); + }); + }; + + //def updateServer + + InternalClient.prototype.updateServer = function updateServer(server, options) { + var _this8 = this; + + var server = this.resolver.resolveServer(server); + if (!server) { + return Promise.reject(new Error("server did not resolve")); + } + + var newOptions = { + name: options.name || server.name, + region: options.region || server.region + }; + + if (options.icon) { + newOptions.icon = this.resolver.resolveToBase64(options.icon); + } + if (options.splash) { + newOptions.splash = this.resolver.resolveToBase64(options.splash); + } + if (options.owner) { + var user = this.resolver.resolveUser(options.owner); + if (!user) { + return Promise.reject(new Error("owner could not be resolved")); + } + options.owner_id = user.id; + } + if (options.verificationLevel) { + options.verification_level = user.verificationLevel; + } + if (options.afkChannel) { + var channel = this.resolver.resolveUser(options.afkChannel); + if (!channel) { + return Promise.reject(new Error("afkChannel could not be resolved")); + } + options.afk_channel_id = channel.id; + } + if (options.afkTimeout) { + options.afk_timeout = user.afkTimeout; + } + + return this.apiRequest("patch", _Constants.Endpoints.SERVER(server.id), true, options).then(function (res) { + // wait until the name and region are updated + return waitFor(function () { + return _this8.servers.get("name", res.name) ? _this8.servers.get("name", res.name).region === res.region ? _this8.servers.get("id", res.id) : false : false; + }); + }); + }; + + //def leaveServer + + InternalClient.prototype.leaveServer = function leaveServer(srv) { + var server = this.resolver.resolveServer(srv); + if (!server) { + return Promise.reject(new Error("server did not resolve")); + } + + return this.apiRequest("del", _Constants.Endpoints.ME_SERVER(server.id), true); + }; + + //def deleteServer + + InternalClient.prototype.deleteServer = function deleteServer(srv) { + var server = this.resolver.resolveServer(srv); + if (!server) { + return Promise.reject(new Error("server did not resolve")); + } + + return this.apiRequest("del", _Constants.Endpoints.SERVER(server.id), true); + }; + + // def loginWithToken + // email and password are optional + + InternalClient.prototype.loginWithToken = function loginWithToken(token, email, password) { + var _this9 = this; + + this.setup(); + + this.state = _ConnectionState2["default"].LOGGED_IN; + this.token = token; + this.email = email; + this.password = password; + + return this.getGateway().then(function (url) { + _this9.createWS(url); + return token; + }); + }; + + // def login + + InternalClient.prototype.login = function login(email, password) { + var _this10 = this; + + var client = this.client; + + if (!this.tokenCacher.done) { + return new Promise(function (resolve, reject) { + setTimeout(function () { + _this10.login(email, password).then(resolve)["catch"](reject); + }, 20); + }); + } else { + var tk = this.tokenCacher.getToken(email, password); + if (tk) { + this.client.emit("debug", "bypassed direct API login, used cached token"); + return this.loginWithToken(tk, email, password); + } + } + + if (this.state !== _ConnectionState2["default"].DISCONNECTED && this.state !== _ConnectionState2["default"].IDLE) { + return Promise.reject(new Error("already logging in/logged in/ready!")); + } + + this.state = _ConnectionState2["default"].LOGGING_IN; + + return this.apiRequest("post", _Constants.Endpoints.LOGIN, false, { + email: email, + password: password + }).then(function (res) { + _this10.client.emit("debug", "direct API login, cached token was unavailable"); + var token = res.token; + _this10.tokenCacher.setToken(email, password, token); + return _this10.loginWithToken(token, email, password); + }, function (error) { + _this10.websocket = null; + throw error; + })["catch"](function (error) { + _this10.websocket = null; + _this10.state = _ConnectionState2["default"].DISCONNECTED; + client.emit("disconnected"); + throw error; + }); + }; + + // def logout + + InternalClient.prototype.logout = function logout() { + var _this11 = this; + + if (this.state === _ConnectionState2["default"].DISCONNECTED || this.state === _ConnectionState2["default"].IDLE) { + return Promise.reject(new Error("Client is not logged in!")); + } + + var disconnect = function disconnect() { + if (_this11.websocket) { + _this11.websocket.close(1000); + _this11.websocket = null; + } + _this11.token = null; + _this11.email = null; + _this11.password = null; + _this11.state = _ConnectionState2["default"].DISCONNECTED; + return Promise.resolve(); + }; + + if (!this.user.bot) { + return this.apiRequest("post", _Constants.Endpoints.LOGOUT, true).then(disconnect); + } else { + return disconnect(); + } + }; + + // def startPM + + InternalClient.prototype.startPM = function startPM(resUser) { + var _this12 = this; + + var user = this.resolver.resolveUser(resUser); + if (!user) { + return Promise.reject(new Error("Unable to resolve resUser to a User")); + } + // start the PM + return this.apiRequest("post", _Constants.Endpoints.ME_CHANNELS, true, { + recipient_id: user.id + }).then(function (res) { + return _this12.private_channels.add(new _StructuresPMChannel2["default"](res, _this12.client)); + }); + }; + + // def getGateway + + InternalClient.prototype.getGateway = function getGateway() { + var _this13 = this; + + if (this.gatewayURL) { + return Promise.resolve(this.gatewayURL); + } + return this.apiRequest("get", _Constants.Endpoints.GATEWAY, true).then(function (res) { + return _this13.gatewayURL = res.url; + }); + }; + + // def sendMessage + + InternalClient.prototype.sendMessage = function sendMessage(where, _content) { + var _this14 = this; + + var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + + if (options.file) { + if (typeof options.file !== "object") { + options.file = { + file: options.file + }; + } + if (!options.file.name) { + if (options.file.file instanceof String || typeof options.file.file === "string") { + options.file.name = require("path").basename(options.file.file); + } else if (options.file.file.path) { + // fs.createReadStream()'s have .path that give the path. Not sure about other streams though. + options.file.name = require("path").basename(options.file.file.path); + } else { + options.file.name = "default.png"; // Just have to go with default filenames. + } + } + } + + return this.resolver.resolveChannel(where).then(function (destination) { + var content = _this14.resolver.resolveString(_content); + + if (_this14.client.options.disableEveryone || options.disableEveryone) { + content = content.replace(/(@)(everyone|here)/g, "$1​$2"); + } + + if (options.file) { + return _this14.resolver.resolveFile(options.file.file).then(function (file) { + return _this14.apiRequest("post", _Constants.Endpoints.CHANNEL_MESSAGES(destination.id), true, { + content: content, + tts: options.tts + }, { + name: options.file.name, + file: file + }).then(function (res) { + return destination.messages.add(new _StructuresMessage2["default"](res, destination, _this14.client)); + }); + }); + } else { + return _this14.apiRequest("post", _Constants.Endpoints.CHANNEL_MESSAGES(destination.id), true, { + content: content, + tts: options.tts + }).then(function (res) { + return destination.messages.add(new _StructuresMessage2["default"](res, destination, _this14.client)); + }); + } + }); + }; + + // def sendFile + + InternalClient.prototype.sendFile = function sendFile(where, _file, name, content) { + var _this15 = this; + + if (!name) { + if (_file instanceof String || typeof _file === "string") { + name = require("path").basename(_file); + } else if (_file && _file.path) { + // fs.createReadStream()'s have .path that give the path. Not sure about other streams though. + name = require("path").basename(_file.path); + } else { + name = "default.png"; // Just have to go with default filenames. + } + } + + if (content) { + content = { + content: this.resolver.resolveString(content) + }; + if (this.client.options.disableEveryone) { + content.content = content.content.replace(/(@)(everyone|here)/g, "$1​$2"); + } + } + + return this.resolver.resolveChannel(where).then(function (channel) { + return _this15.resolver.resolveFile(_file).then(function (file) { + return _this15.apiRequest("post", _Constants.Endpoints.CHANNEL_MESSAGES(channel.id), true, content, { + name: name, + file: file + }).then(function (res) { + return channel.messages.add(new _StructuresMessage2["default"](res, channel, _this15.client)); + }); + }); + }); + }; + + // def deleteMessage + + InternalClient.prototype.deleteMessage = function deleteMessage(_message) { + var _this16 = this; + + var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + var message = this.resolver.resolveMessage(_message); + if (!message) { + return Promise.reject(new Error("Supplied message did not resolve to a message!")); + } + + var chain = options.wait ? delay(options.wait) : Promise.resolve(); + return chain.then(function () { + return _this16.apiRequest("del", _Constants.Endpoints.CHANNEL_MESSAGE(message.channel.id, message.id), true); + }).then(function () { + return message.channel.messages.remove(message); + }); + }; + + // 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"));else if (_messages.length === 1) return this.deleteMessage(_messages[0]); + + var messages = []; + var channel; + for (var _iterator3 = _messages, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref3; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref3 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) break; + _ref3 = _i3.value; + } + + var _message = _ref3; + + 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...")); + if (!message.server) return Promise.reject(new Error("You can only bulk delete messages on guild channels")); + + // 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) { + var _this17 = this; + + var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + + var message = this.resolver.resolveMessage(msg); + + if (!message) { + return Promise.reject(new Error("Supplied message did not resolve to a message!")); + } + + var content = this.resolver.resolveString(_content); + + return this.apiRequest("patch", _Constants.Endpoints.CHANNEL_MESSAGE(message.channel.id, message.id), true, { + content: content, + tts: options.tts + }).then(function (res) { + return message.channel.messages.update(message, new _StructuresMessage2["default"](res, message.channel, _this17.client)); + }); + }; + + // def getChannelLogs + + InternalClient.prototype.getChannelLogs = function getChannelLogs(_channel) { + var _this18 = this; + + var limit = arguments.length <= 1 || arguments[1] === undefined ? 50 : arguments[1]; + var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + + return this.resolver.resolveChannel(_channel).then(function (channel) { + var qsObject = { limit: limit }; + if (options.before) { + var res = _this18.resolver.resolveMessage(options.before); + if (res) { + qsObject.before = res.id; + } + } + if (options.after) { + var res = _this18.resolver.resolveMessage(options.after); + if (res) { + qsObject.after = res.id; + } + } + if (options.around) { + var res = _this18.resolver.resolveMessage(options.around); + if (res) { + qsObject.around = res.id; + } + } + + return _this18.apiRequest("get", _Constants.Endpoints.CHANNEL_MESSAGES(channel.id) + "?" + _querystring2["default"].stringify(qsObject), true).then(function (res) { + return res.map(function (msg) { + return channel.messages.add(new _StructuresMessage2["default"](msg, channel, _this18.client)); + }); + }); + }); + }; + + // def getMessage + + InternalClient.prototype.getMessage = function getMessage(_channel, messageID) { + var _this19 = this; + + return this.resolver.resolveChannel(_channel).then(function (channel) { + if (!_this19.user.bot) { + return Promise.reject(new Error("Only OAuth bot accounts can use this function")); + } + + if (!(channel instanceof _StructuresTextChannel2["default"] || channel instanceof _StructuresPMChannel2["default"])) { + return Promise.reject(new Error("Provided channel is not a Text or PMChannel")); + } + + var msg = channel.messages.get("id", messageID); + if (msg) { + return Promise.resolve(msg); + } + + return _this19.apiRequest("get", _Constants.Endpoints.CHANNEL_MESSAGES(channel.id) + "/" + messageID, true).then(function (res) { + return channel.messages.add(new _StructuresMessage2["default"](res, channel, _this19.client)); + }); + }); + }; + + // def pinMessage + + InternalClient.prototype.pinMessage = function pinMessage(msg) { + var message = this.resolver.resolveMessage(msg); + + if (!message) { + return Promise.reject(new Error("Supplied message did not resolve to a message")); + } + + return this.apiRequest("put", "" + _Constants.Endpoints.CHANNEL_PIN(msg.channel.id, msg.id), true); + }; + + // def unpinMessage + + InternalClient.prototype.unpinMessage = function unpinMessage(msg) { + var message = this.resolver.resolveMessage(msg); + + if (!message) { + return Promise.reject(new Error("Supplied message did not resolve to a message")); + } + + if (!message.pinned) { + return Promise.reject(new Error("Supplied message is not pinned")); + } + + return this.apiRequest("del", "" + _Constants.Endpoints.CHANNEL_PIN(msg.channel.id, msg.id), true); + }; + + // def getPinnedMessages + + InternalClient.prototype.getPinnedMessages = function getPinnedMessages(_channel) { + var _this20 = this; + + return this.resolver.resolveChannel(_channel).then(function (channel) { + return _this20.apiRequest("get", "" + _Constants.Endpoints.CHANNEL_PINS(channel.id), true).then(function (res) { + return res.map(function (msg) { + return channel.messages.add(new _StructuresMessage2["default"](msg, channel, _this20.client)); + }); + }); + }); + }; + + // def getBans + + InternalClient.prototype.getBans = function getBans(server) { + var _this21 = this; + + server = this.resolver.resolveServer(server); + + return this.apiRequest("get", _Constants.Endpoints.SERVER_BANS(server.id), true).then(function (res) { + return res.map(function (ban) { + return _this21.users.add(new _StructuresUser2["default"](ban.user, _this21.client)); + }); + }); + }; + + // def createChannel + + InternalClient.prototype.createChannel = function createChannel(server, name) { + var _this22 = this; + + var type = arguments.length <= 2 || arguments[2] === undefined ? "text" : arguments[2]; + + server = this.resolver.resolveServer(server); + + return this.apiRequest("post", _Constants.Endpoints.SERVER_CHANNELS(server.id), true, { + name: name, + type: type + }).then(function (res) { + var channel; + if (res.type === "text") { + channel = new _StructuresTextChannel2["default"](res, _this22.client, server); + } else { + channel = new _StructuresVoiceChannel2["default"](res, _this22.client, server); + } + return server.channels.add(_this22.channels.add(channel)); + }); + }; + + // def deleteChannel + + InternalClient.prototype.deleteChannel = function deleteChannel(_channel) { + var _this23 = this; + + return this.resolver.resolveChannel(_channel).then(function (channel) { + return _this23.apiRequest("del", _Constants.Endpoints.CHANNEL(channel.id), true).then(function () { + if (channel.server) { + channel.server.channels.remove(channel); + _this23.channels.remove(channel); + } else { + _this23.private_channels.remove(channel); + } + }); + }); + }; + + // def banMember + + InternalClient.prototype.banMember = function banMember(user, server) { + var length = arguments.length <= 2 || arguments[2] === undefined ? 1 : arguments[2]; + + user = this.resolver.resolveUser(user); + server = this.resolver.resolveServer(server); + + return this.apiRequest("put", _Constants.Endpoints.SERVER_BANS(server.id) + "/" + user.id + "?delete-message-days=" + length, true); + }; + + // def unbanMember + + InternalClient.prototype.unbanMember = function unbanMember(user, server) { + + server = this.resolver.resolveServer(server); + user = this.resolver.resolveUser(user); + + return this.apiRequest("del", _Constants.Endpoints.SERVER_BANS(server.id) + "/" + user.id, true); + }; + + // def kickMember + + InternalClient.prototype.kickMember = function kickMember(user, server) { + user = this.resolver.resolveUser(user); + server = this.resolver.resolveServer(server); + + return this.apiRequest("del", _Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id, true); + }; + + // def moveMember + + InternalClient.prototype.moveMember = function moveMember(user, channel) { + var _this24 = this; + + user = this.resolver.resolveUser(user); + return this.resolver.resolveChannel(channel).then(function (channel) { + var server = channel.server; + + // Make sure `channel` is a voice channel + if (channel.type !== "voice") { + throw new Error("Can't moveMember into a non-voice channel"); + } else { + return _this24.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id, true, { channel_id: channel.id }).then(function (res) { + user.voiceChannel = channel; + return res; + }); + } + }); + }; + + // def muteMember + + InternalClient.prototype.muteMember = function muteMember(user, server) { + user = this.resolver.resolveUser(user); + server = this.resolver.resolveServer(server); + return this.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id, true, { mute: true }); + }; + + // def unmuteMember + + InternalClient.prototype.unmuteMember = function unmuteMember(user, server) { + user = this.resolver.resolveUser(user); + server = this.resolver.resolveServer(server); + return this.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id, true, { mute: false }); + }; + + // def deafenMember + + InternalClient.prototype.deafenMember = function deafenMember(user, server) { + user = this.resolver.resolveUser(user); + server = this.resolver.resolveServer(server); + return this.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id, true, { deaf: true }); + }; + + // def undeafenMember + + InternalClient.prototype.undeafenMember = function undeafenMember(user, server) { + user = this.resolver.resolveUser(user); + server = this.resolver.resolveServer(server); + return this.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id, true, { deaf: false }); + }; + + // def setNickname + + InternalClient.prototype.setNickname = function setNickname(server, nick, user) { + nick = nick || ""; + user = this.resolver.resolveUser(user); + server = this.resolver.resolveServer(server); + return this.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + (user.id === this.user.id ? "@me/nick" : user.id), true, { nick: nick }); + }; + + //def setNote + + InternalClient.prototype.setNote = function setNote(user, note) { + user = this.resolver.resolveUser(user); + note = note || ""; + + if (!user) { + return Promise.reject(new Error("Failed to resolve user")); + } + + return this.apiRequest("put", _Constants.Endpoints.ME_NOTES + "/" + user.id, true, { note: note }); + }; + + // def createRole + + InternalClient.prototype.createRole = function createRole(server, data) { + var _this25 = this; + + server = this.resolver.resolveServer(server); + + return this.apiRequest("post", _Constants.Endpoints.SERVER_ROLES(server.id), true).then(function (res) { + var role = server.roles.add(new _StructuresRole2["default"](res, server, _this25.client)); + + if (data) { + return _this25.updateRole(role, data); + } + return role; + }); + }; + + // def updateRole + + InternalClient.prototype.updateRole = function updateRole(role, data) { + var _this26 = this; + + role = this.resolver.resolveRole(role); + var server = this.resolver.resolveServer(role.server); + + var newData = { + color: "color" in data ? data.color : role.color, + hoist: "hoist" in data ? data.hoist : role.hoist, + name: "name" in data ? data.name : role.name, + position: "position" in data ? data.position : role.position, + permissions: "permissions" in data ? data.permissions : role.permissions, + mentionable: "mentionable" in data ? data.mentionable : role.mentionable + }; + + 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; + + if (_isArray4) { + if (_i4 >= _iterator4.length) break; + _ref4 = _iterator4[_i4++]; + } else { + _i4 = _iterator4.next(); + if (_i4.done) break; + _ref4 = _i4.value; + } + + var perm = _ref4; + + if (perm instanceof String || typeof perm === "string") { + newData.permissions |= _Constants.Permissions[perm] || 0; + } else { + newData.permissions |= perm; + } + } + } + + return this.apiRequest("patch", _Constants.Endpoints.SERVER_ROLES(server.id) + "/" + role.id, true, newData).then(function (res) { + return server.roles.update(role, new _StructuresRole2["default"](res, server, _this26.client)); + }); + }; + + // def deleteRole + + InternalClient.prototype.deleteRole = function deleteRole(role) { + if (role.server.id === role.id) { + return Promise.reject(new Error("Stop trying to delete the @everyone role. It is futile")); + } else { + return this.apiRequest("del", _Constants.Endpoints.SERVER_ROLES(role.server.id) + "/" + role.id, true); + } + }; + + //def addMemberToRole + + InternalClient.prototype.addMemberToRole = function addMemberToRole(member, roles) { + var _this27 = this; + + member = this.resolver.resolveUser(member); + + if (!member) { + return Promise.reject(new Error("user not found")); + } + + if (!Array.isArray(roles) || roles.length === 0) { + roles = this.resolver.resolveRole(roles); + if (roles) { + roles = [roles]; + } else { + return Promise.reject(new Error("invalid array of roles")); + } + } else { + roles = roles.map(function (r) { + return _this27.resolver.resolveRole(r); + }); + } + + if (roles.some(function (role) { + return !role.server.memberMap[member.id]; + })) { + return Promise.reject(new Error("Role does not exist on same server as member")); + } + + var roleIDs = roles[0].server.memberMap[member.id].roles.map(function (r) { + return r && r.id || r; + }); + + for (var i = 0; i < roles.length; i++) { + if (! ~roleIDs.indexOf(roles[i].id)) { + roleIDs.push(roles[i].id); + }; + }; + + return this.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(roles[0].server.id) + "/" + member.id, true, { + roles: roleIDs + }); + }; + + InternalClient.prototype.memberHasRole = function memberHasRole(member, role) { + role = this.resolver.resolveRole(role); + member = this.resolver.resolveUser(member); + + if (!role) { + throw new Error("invalid role"); + } + if (!member) { + throw new Error("user not found"); + } + + 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; + + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref5 = _iterator5[_i5++]; + } else { + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref5 = _i5.value; + } + + var r = _ref5; + + if (r.id == role.id) { + return r; + } + } + } + return null; + }; + + //def removeMemberFromRole + + InternalClient.prototype.removeMemberFromRole = function removeMemberFromRole(member, roles) { + var _this28 = this; + + member = this.resolver.resolveUser(member); + + if (!member) { + return Promise.reject(new Error("user not found")); + } + + if (!Array.isArray(roles) || roles.length === 0) { + roles = this.resolver.resolveRole(roles); + if (roles) { + roles = [roles]; + } else { + return Promise.reject(new Error("invalid array of roles")); + } + } else { + roles = roles.map(function (r) { + return _this28.resolver.resolveRole(r); + }); + } + + var roleIDs = roles[0].server.memberMap[member.id].roles.map(function (r) { + return r && r.id || r; + }); + + for (var _iterator6 = roles, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref6; + + if (_isArray6) { + if (_i6 >= _iterator6.length) break; + _ref6 = _iterator6[_i6++]; + } else { + _i6 = _iterator6.next(); + if (_i6.done) break; + _ref6 = _i6.value; + } + + var role = _ref6; + + if (!role.server.memberMap[member.id]) { + return Promise.reject(new Error("member not in server")); + } + for (var item in roleIDs) { + if (roleIDs[item] === role.id) { + roleIDs.splice(item, 1); + break; + } + } + } + + return this.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(roles[0].server.id) + "/" + member.id, true, { + roles: roleIDs + }); + }; + + // def createInvite + + InternalClient.prototype.createInvite = function createInvite(chanServ, options) { + var _this29 = this; + + return this.resolver.resolveChannel(chanServ).then(function (channel) { + if (!options) { + options = { + validate: null + }; + } else { + options.max_age = options.maxAge || 0; + options.max_uses = options.maxUses || 0; + options.temporary = options.temporary || false; + options.xkcdpass = options.xkcd || false; + } + + return _this29.apiRequest("post", _Constants.Endpoints.CHANNEL_INVITES(channel.id), true, options).then(function (res) { + return new _StructuresInvite2["default"](res, _this29.channels.get("id", res.channel.id), _this29.client); + }); + }); + }; + + //def deleteInvite + + InternalClient.prototype.deleteInvite = function deleteInvite(invite) { + invite = this.resolver.resolveInviteID(invite); + if (!invite) { + throw new Error("Not a valid invite"); + } + return this.apiRequest("del", _Constants.Endpoints.INVITE(invite), true); + }; + + //def getInvite + + InternalClient.prototype.getInvite = function getInvite(invite) { + var _this30 = this; + + invite = this.resolver.resolveInviteID(invite); + if (!invite) { + return Promise.reject(new Error("Not a valid invite")); + } + + return this.apiRequest("get", _Constants.Endpoints.INVITE(invite), true).then(function (res) { + if (!_this30.channels.has("id", res.channel.id)) { + return new _StructuresInvite2["default"](res, null, _this30.client); + } + return _this30.apiRequest("post", _Constants.Endpoints.CHANNEL_INVITES(res.channel.id), true, { validate: invite }).then(function (res2) { + return new _StructuresInvite2["default"](res2, _this30.channels.get("id", res.channel.id), _this30.client); + }); + }); + }; + + //def getInvites + + InternalClient.prototype.getInvites = function getInvites(channel) { + var _this31 = this; + + if (!(channel instanceof _StructuresChannel2["default"])) { + var server = this.resolver.resolveServer(channel); + if (server) { + return this.apiRequest("get", _Constants.Endpoints.SERVER_INVITES(server.id), true).then(function (res) { + return res.map(function (data) { + return new _StructuresInvite2["default"](data, _this31.channels.get("id", data.channel.id), _this31.client); + }); + }); + } + } + return this.resolver.resolveChannel(channel).then(function (channel) { + return _this31.apiRequest("get", _Constants.Endpoints.CHANNEL_INVITES(channel.id), true).then(function (res) { + return res.map(function (data) { + return new _StructuresInvite2["default"](data, _this31.channels.get("id", data.channel.id), _this31.client); + }); + }); + }); + }; + + //def overwritePermissions + + InternalClient.prototype.overwritePermissions = function overwritePermissions(channel, role, updated) { + var _this32 = this; + + return this.resolver.resolveChannel(channel).then(function (channel) { + if (!channel instanceof _StructuresServerChannel2["default"]) { + return Promise.reject(new Error("Not a server channel")); + } + + var data = { + allow: 0, + deny: 0 + }; + + if (role instanceof String || typeof role === "string") { + role = _this32.resolver.resolveUser(role) || _this32.resolver.resolveRole(role); + } + + if (role instanceof _StructuresUser2["default"]) { + data.id = role.id; + data.type = "member"; + } else if (role instanceof _StructuresRole2["default"]) { + data.id = role.id; + data.type = "role"; + } else { + return Promise.reject(new Error("Role could not be resolved")); + } + + var previousOverwrite = channel.permissionOverwrites.get("id", data.id); + + if (previousOverwrite) { + data.allow |= previousOverwrite.allow; + data.deny |= previousOverwrite.deny; + } + + for (var perm in updated) { + if (updated[perm] === true) { + data.allow |= _Constants.Permissions[perm] || 0; + data.deny &= ~(_Constants.Permissions[perm] || 0); + } else if (updated[perm] === false) { + data.allow &= ~(_Constants.Permissions[perm] || 0); + data.deny |= _Constants.Permissions[perm] || 0; + } else { + data.allow &= ~(_Constants.Permissions[perm] || 0); + data.deny &= ~(_Constants.Permissions[perm] || 0); + } + } + + return _this32.apiRequest("put", _Constants.Endpoints.CHANNEL_PERMISSIONS(channel.id) + "/" + data.id, true, data); + }); + }; + + //def setStatus + + InternalClient.prototype.setStatus = function setStatus(idleStatus, game) { + + if (idleStatus === "online" || idleStatus === "here" || idleStatus === "available") { + this.idleStatus = null; + } else if (idleStatus === "idle" || idleStatus === "away") { + this.idleStatus = Date.now(); + } else { + this.idleStatus = this.idleStatus || null; //undefined + } + + // convert undefined and empty string to null + if (typeof game === "string" && !game.length) game = null; + + this.game = game === null ? null : !game ? this.game || null : typeof game === "string" ? { name: game } : game; + + var packet = { + op: 3, + d: { + idle_since: this.idleStatus, + game: this.game + } + }; + + this.sendWS(packet); + + this.user.status = this.idleStatus ? "idle" : "online"; + this.user.game = this.game; + + return Promise.resolve(); + }; + + //def sendTyping + + InternalClient.prototype.sendTyping = function sendTyping(channel) { + var _this33 = this; + + return this.resolver.resolveChannel(channel).then(function (channel) { + return _this33.apiRequest("post", _Constants.Endpoints.CHANNEL(channel.id) + "/typing", true); + }); + }; + + //def startTyping + + InternalClient.prototype.startTyping = function startTyping(channel) { + var _this34 = this; + + return this.resolver.resolveChannel(channel).then(function (channel) { + + if (_this34.intervals.typing[channel.id]) { + // typing interval already exists, leave it alone + throw new Error("Already typing in that channel"); + } + + _this34.intervals.typing[channel.id] = setInterval(function () { + return _this34.sendTyping(channel)["catch"](function (error) { + return _this34.emit("error", error); + }); + }, 4000); + + return _this34.sendTyping(channel); + }); + }; + + //def stopTyping + + InternalClient.prototype.stopTyping = function stopTyping(channel) { + var _this35 = this; + + return this.resolver.resolveChannel(channel).then(function (channel) { + + if (!_this35.intervals.typing[channel.id]) { + // typing interval doesn"t exist + throw new Error("Not typing in that channel"); + } + + clearInterval(_this35.intervals.typing[channel.id]); + _this35.intervals.typing[channel.id] = false; + }); + }; + + //def updateDetails + + InternalClient.prototype.updateDetails = function updateDetails(data) { + if (!this.user.bot && !(this.email || data.email)) { + throw new Error("Must provide email since a token was used to login"); + } + + var options = { + avatar: this.resolver.resolveToBase64(data.avatar) || this.user.avatar, + username: data.username || this.user.username + }; + + if (this.email || data.email) { + options.email = data.email || this.email; + options.new_password = data.newPassword || null; + options.password = data.password || this.password; + } + + return this.apiRequest("patch", _Constants.Endpoints.ME, true, options); + }; + + //def setAvatar + + InternalClient.prototype.setAvatar = function setAvatar(avatar) { + return this.updateDetails({ avatar: avatar }); + }; + + //def setUsername + + InternalClient.prototype.setUsername = function setUsername(username) { + return this.updateDetails({ username: username }); + }; + + //def setChannelTopic + + InternalClient.prototype.setChannelTopic = function setChannelTopic(channel) { + var topic = arguments.length <= 1 || arguments[1] === undefined ? "" : arguments[1]; + + topic = topic || ""; + + return this.updateChannel(channel, { topic: topic }); + }; + + //def setChannelName + + InternalClient.prototype.setChannelName = function setChannelName(channel, name) { + name = name || "unnamed-channel"; + + return this.updateChannel(channel, { name: name }); + }; + + //def setChannelPosition + + InternalClient.prototype.setChannelPosition = function setChannelPosition(channel, position) { + position = position || 0; + + return this.updateChannel(channel, { position: position }); + }; + + //def setChannelUserLimit + + InternalClient.prototype.setChannelUserLimit = function setChannelUserLimit(channel, limit) { + limit = limit || 0; // default 0 = no limit + + return this.updateChannel(channel, { userLimit: limit }); + }; + + //def setChannelBitrate + + InternalClient.prototype.setChannelBitrate = function setChannelBitrate(channel, kbitrate) { + kbitrate = kbitrate || 64; // default 64kbps + + return this.updateChannel(channel, { bitrate: kbitrate }); + }; + + //def updateChannel + + InternalClient.prototype.updateChannel = function updateChannel(channel, data) { + var _this36 = this; + + return this.resolver.resolveChannel(channel).then(function (channel) { + if (!channel) { + return Promise.reject(new Error("Failed to resolve channel")); + } + + data = { + name: data.name || channel.name, + topic: data.topic || channel.topic, + position: data.position ? data.position : channel.position, + user_limit: data.userLimit ? data.userLimit : channel.userLimit, + bitrate: data.bitrate ? data.bitrate : channel.bitrate ? channel.bitrate : undefined + }; + + if (data.position < 0) { + return Promise.reject(new Error("Position cannot be less than 0")); + } + + if (data.user_limit < 0 || data.user_limit > 99) { + return Promise.reject(new Error("User limit must be between 0-99")); + } + + if (data.kbitrate < 8 || data.kbitrate > 96) { + return Promise.reject(new Error("Bitrate must be between 8-96kbps")); + } + + if (data.bitrate) { + data.bitrate *= 1000; // convert to bits before sending + } + + return _this36.apiRequest("patch", _Constants.Endpoints.CHANNEL(channel.id), true, data).then(function (res) { + channel.name = data.name; + channel.topic = data.topic; + channel.position = data.position; + channel.userLimit = data.user_limit; + channel.bitrate = Math.ceil(data.bitrate / 1000); + channel._bitrate = data.bitrate; + }); + }); + }; + + //def addFriend + + InternalClient.prototype.addFriend = function addFriend(user) { + if (this.user.bot) return Promise.reject(new Error("user is a bot, bot's do not have friends support")); + + var id; + if (user instanceof String || typeof user === "string") id = user;else if (user instanceof _StructuresUser2["default"]) { + user = this.resolver.resolveUser(user); + id = user.id; + } else { + if (user.username && user.discriminator) // add by username and discriminator (pass in an object) + return this.apiRequest("put", _Constants.Endpoints.FRIENDS, true, user);else return Promise.reject("invalid user"); + } + + return this.apiRequest("put", _Constants.Endpoints.FRIENDS + "/" + id, true, {}); + }; + + //def removeFriend + + InternalClient.prototype.removeFriend = function removeFriend(user) { + if (this.user.bot) return Promise.reject(new Error("user is a bot, bot's do not have friends support")); + + user = this.resolver.resolveUser(user); + + return this.apiRequest("delete", _Constants.Endpoints.FRIENDS + "/" + user.id, true); + }; + + //def getOAuthApplication + + InternalClient.prototype.getOAuthApplication = function getOAuthApplication(appID) { + appID = appID || "@me"; + return this.apiRequest("get", _Constants.Endpoints.OAUTH2_APPLICATION(appID), true); + }; + + //def ack + + InternalClient.prototype.ack = function ack(msg) { + msg = this.resolver.resolveMessage(msg); + + if (!msg) { + Promise.reject(new Error("Message does not exist")); + } + + return this.apiRequest("post", _Constants.Endpoints.CHANNEL_MESSAGE(msg.channel.id, msg.id) + "/ack", true); + }; + + InternalClient.prototype.sendWS = function sendWS(object) { + if (this.websocket) { + this.websocket.send(JSON.stringify(object)); + } + }; + + InternalClient.prototype.createWS = function createWS(url) { + var _this37 = this; + + var self = this; + var client = self.client; + + if (this.websocket) { + return false; + } + + this.websocket = new _ws2["default"](url); + + this.websocket.onopen = function () { + var data = { + op: 2, + d: { + token: self.token, + v: 3, + compress: self.client.options.compress, + large_threshold: self.client.options.largeThreshold, + properties: { + "$os": process.platform, + "$browser": "discord.js", + "$device": "discord.js", + "$referrer": "", + "$referring_domain": "" + } + } + }; + + if (self.client.options.shard) { + data.d.shard = self.client.options.shard; + } + + self.sendWS(data); + }; + + this.websocket.onclose = function (event) { + self.websocket = null; + self.state = _ConnectionState2["default"].DISCONNECTED; + if (event && event.code) { + client.emit("warn", "WS close: " + event.code); + var err; + if (event.code === 4001) { + err = new Error("Gateway received invalid OP code"); + } else if (event.code === 4005) { + err = new Error("Gateway received invalid message"); + } else if (event.code === 4003) { + err = new Error("Not authenticated"); + } else if (event.code === 4004) { + err = new Error("Authentication failed"); + } else if (event.code === 4005) { + err = new Error("Already authenticated"); + }if (event.code === 4006 || event.code === 4009) { + err = new Error("Invalid session"); + } else if (event.code === 4007) { + _this37.seq = 0; + err = new Error("Invalid sequence number"); + } else if (event.code === 4008) { + err = new Error("Gateway connection was ratelimited"); + } else if (event.code === 4010) { + err = new Error("Invalid shard key"); + } + if (err) { + client.emit("error", err); + } + } + self.disconnected(_this37.client.options.autoReconnect); + }; + + this.websocket.onerror = function (e) { + client.emit("error", e); + self.websocket = null; + self.state = _ConnectionState2["default"].DISCONNECTED; + self.disconnected(_this37.client.options.autoReconnect); + }; + + this.websocket.onmessage = function (e) { + if (e.data instanceof Buffer) { + if (!zlib) zlib = require("zlib"); + e.data = zlib.inflateSync(e.data).toString(); + } + + var packet, data; + try { + packet = JSON.parse(e.data); + data = packet.d; + } catch (e) { + client.emit("error", e); + return; + } + + client.emit("raw", packet); + switch (packet.t) { + + case _Constants.PacketType.READY: + var startTime = Date.now(); + self.intervals.kai = setInterval(function () { + return self.sendWS({ op: 1, d: Date.now() }); + }, data.heartbeat_interval); + + self.user = self.users.add(new _StructuresUser2["default"](data.user, client)); + + _this37.forceFetchCount = {}; + _this37.forceFetchQueue = []; + _this37.forceFetchLength = 1; + _this37.autoReconnectInterval = 1000; + _this37.sessionID = data.session_id; + + data.guilds.forEach(function (server) { + if (!server.unavailable) { + server = self.servers.add(new _StructuresServer2["default"](server, client)); + if (self.client.options.forceFetchUsers && server.members && server.members.length < server.memberCount) { + self.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000)); + } + } else { + client.emit("debug", "server " + server.id + " was unavailable, could not create (ready)"); + self.unavailableServers.add(server); + } + }); + data.private_channels.forEach(function (pm) { + self.private_channels.add(new _StructuresPMChannel2["default"](pm, client)); + }); + if (!data.user.bot) { + // bots dont have friends + data.relationships.forEach(function (friend) { + if (friend.type === 1) { + // is a friend + self.friends.add(new _StructuresUser2["default"](friend.user, client)); + } else if (friend.type === 2) { + // incoming friend requests + self.blocked_users.add(new _StructuresUser2["default"](friend.user, client)); + } else if (friend.type === 3) { + // incoming friend requests + self.incoming_friend_requests.add(new _StructuresUser2["default"](friend.user, client)); + } else if (friend.type === 4) { + // outgoing friend requests + self.outgoing_friend_requests.add(new _StructuresUser2["default"](friend.user, client)); + } else { + client.emit("warn", "unknown friend type " + friend.type); + } + }); + } else { + self.friends = null; + self.blocked_users = null; + self.incoming_friend_requests = null; + self.outgoing_friend_requests = null; + } + + // add notes to users + if (data.notes) { + for (note in data.notes) { + var user = self.users.get("id", note); + if (user) { + var newUser = user; + newUser.note = data.notes[note]; + + self.users.update(user, newUser); + } else { + client.emit("warn", "note in ready packet but user not cached"); + } + } + } + + self.state = _ConnectionState2["default"].READY; + + client.emit("debug", "ready packet took " + (Date.now() - startTime) + "ms to process"); + client.emit("debug", "ready with " + self.servers.length + " servers, " + self.unavailableServers.length + " unavailable servers, " + self.channels.length + " channels and " + self.users.length + " users cached."); + + self.restartServerCreateTimeout(); + + break; + + case _Constants.PacketType.MESSAGE_CREATE: + // format: https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format + var channel = self.channels.get("id", data.channel_id) || self.private_channels.get("id", data.channel_id); + if (channel) { + var msg = channel.messages.add(new _StructuresMessage2["default"](data, channel, client)); + channel.lastMessageID = msg.id; + + if (self.messageAwaits[channel.id + msg.author.id]) { + self.messageAwaits[channel.id + msg.author.id].map(function (fn) { + return fn(msg); + }); + self.messageAwaits[channel.id + msg.author.id] = null; + client.emit("message", msg, true); //2nd param is isAwaitedMessage + } else { + client.emit("message", msg); + } + } else { + client.emit("warn", "message created but channel is not cached"); + } + break; + case _Constants.PacketType.MESSAGE_DELETE: + var channel = self.channels.get("id", data.channel_id) || self.private_channels.get("id", data.channel_id); + if (channel) { + // potentially blank + var msg = channel.messages.get("id", data.id); + client.emit("messageDeleted", msg, channel); + if (msg) { + channel.messages.remove(msg); + } else { + client.emit("debug", "message was deleted but message is not cached"); + } + } else { + client.emit("warn", "message was deleted but channel is not cached"); + } + break; + case _Constants.PacketType.MESSAGE_UPDATE: + // format https://discordapi.readthedocs.org/en/latest/reference/channels/messages.html#message-format + var channel = self.channels.get("id", data.channel_id) || self.private_channels.get("id", data.channel_id); + if (channel) { + // potentially blank + var msg = channel.messages.get("id", data.id); + + if (msg) { + // old message exists + data.nonce = data.nonce || msg.nonce; + data.attachments = data.attachments || msg.attachments; + data.tts = data.tts || msg.tts; + data.embeds = data.embeds || msg.embeds; + data.timestamp = data.timestamp || msg.timestamp; + data.mention_everyone = data.mention_everyone || msg.everyoneMentioned; + data.content = data.content || msg.content; + data.mentions = data.mentions || msg.mentions; + data.author = data.author || msg.author; + msg = new _StructuresMessage2["default"](msg, channel, client); + } else if (!data.author || !data.content) { + break; + } + var nmsg = new _StructuresMessage2["default"](data, channel, client); + client.emit("messageUpdated", msg, nmsg); + if (msg) { + channel.messages.update(msg, nmsg); + } + } else { + client.emit("warn", "message was updated but channel is not cached"); + } + break; + case _Constants.PacketType.SERVER_CREATE: + var server = self.servers.get("id", data.id); + if (!server) { + if (!data.unavailable) { + server = self.servers.add(new _StructuresServer2["default"](data, client)); + if (client.readyTime) { + client.emit("serverCreated", server); + } + if (self.client.options.forceFetchUsers && server.large && server.members.length < server.memberCount) { + self.getGuildMembers(server.id, Math.ceil(server.memberCount / 1000)); + } + var unavailable = self.unavailableServers.get("id", server.id); + if (unavailable) { + self.unavailableServers.remove(unavailable); + } + self.restartServerCreateTimeout(); + } else { + client.emit("debug", "server was unavailable, could not create"); + } + } + break; + case _Constants.PacketType.SERVER_DELETE: + var server = self.servers.get("id", data.id); + if (server) { + 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]();;) { + var _ref8; + + if (_isArray8) { + if (_i8 >= _iterator8.length) break; + _ref8 = _iterator8[_i8++]; + } else { + _i8 = _iterator8.next(); + if (_i8.done) break; + _ref8 = _i8.value; + } + + var user = _ref8; + + var found = false; + for (var _iterator9 = self.servers, _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 s = _ref9; + + if (s.members.get("id", user.id)) { + found = true; + break; + } + } + if (!found) { + self.users.remove(user); + } + } + } else { + client.emit("debug", "server was unavailable, could not update"); + } + self.buckets["bot:msg:guild:" + packet.d.id] = self.buckets["dmsg:" + packet.d.id] = self.buckets["bdmsg:" + packet.d.id] = self.buckets["guild_member:" + packet.d.id] = self.buckets["guild_member_nick:" + packet.d.id] = undefined; + } else { + client.emit("warn", "server was deleted but it was not in the cache"); + } + break; + case _Constants.PacketType.SERVER_UPDATE: + var server = self.servers.get("id", data.id); + if (server) { + // server exists + data.members = data.members || []; + data.channels = data.channels || []; + var newserver = new _StructuresServer2["default"](data, client); + newserver.members = server.members; + newserver.memberMap = server.memberMap; + newserver.channels = server.channels; + if (newserver.equalsStrict(server)) { + // already the same don't do anything + client.emit("debug", "received server update but server already updated"); + } else { + client.emit("serverUpdated", new _StructuresServer2["default"](server, client), newserver); + self.servers.update(server, newserver); + } + } else if (!server) { + client.emit("warn", "server was updated but it was not in the cache"); + self.servers.add(new _StructuresServer2["default"](data, client)); + client.emit("serverCreated", server); + } + break; + case _Constants.PacketType.CHANNEL_CREATE: + + var channel = self.channels.get("id", data.id); + + if (!channel) { + + var server = self.servers.get("id", data.guild_id); + if (server) { + var chan = null; + if (data.type === "text") { + chan = self.channels.add(new _StructuresTextChannel2["default"](data, client, server)); + } else { + chan = self.channels.add(new _StructuresVoiceChannel2["default"](data, client, server)); + } + client.emit("channelCreated", server.channels.add(chan)); + } else if (data.is_private) { + client.emit("channelCreated", self.private_channels.add(new _StructuresPMChannel2["default"](data, client))); + } else { + client.emit("warn", "channel created but server does not exist"); + } + } else { + client.emit("warn", "channel created but already in cache"); + } + + break; + case _Constants.PacketType.CHANNEL_DELETE: + var channel = self.channels.get("id", data.id) || self.private_channels.get("id", data.id); + if (channel) { + + if (channel.server) { + // accounts for PMs + channel.server.channels.remove(channel); + self.channels.remove(channel); + } else { + self.private_channels.remove(channel); + } + + client.emit("channelDeleted", channel); + } else { + client.emit("warn", "channel deleted but already out of cache?"); + } + break; + case _Constants.PacketType.CHANNEL_UPDATE: + var channel = self.channels.get("id", data.id) || self.private_channels.get("id", data.id); + if (channel) { + + if (channel instanceof _StructuresPMChannel2["default"]) { + //PM CHANNEL + client.emit("channelUpdated", new _StructuresPMChannel2["default"](channel, client), self.private_channels.update(channel, new _StructuresPMChannel2["default"](data, client))); + } else { + if (channel.server) { + if (channel.type === "text") { + //TEXT CHANNEL + var chan = new _StructuresTextChannel2["default"](data, client, channel.server); + chan.messages = channel.messages; + client.emit("channelUpdated", channel, chan); + channel.server.channels.update(channel, chan); + self.channels.update(channel, chan); + } else { + //VOICE CHANNEL + data.members = channel.members; + var chan = new _StructuresVoiceChannel2["default"](data, client, channel.server); + client.emit("channelUpdated", channel, chan); + channel.server.channels.update(channel, chan); + self.channels.update(channel, chan); + } + } else { + client.emit("warn", "channel updated but server non-existant"); + } + } + } else { + client.emit("warn", "channel updated but not in cache"); + } + break; + case _Constants.PacketType.SERVER_ROLE_CREATE: + var server = self.servers.get("id", data.guild_id); + if (server) { + client.emit("serverRoleCreated", server.roles.add(new _StructuresRole2["default"](data.role, server, client)), server); + } else { + client.emit("warn", "server role made but server not in cache"); + } + break; + case _Constants.PacketType.SERVER_ROLE_DELETE: + var server = self.servers.get("id", data.guild_id); + if (server) { + var role = server.roles.get("id", data.role_id); + if (role) { + server.roles.remove(role); + client.emit("serverRoleDeleted", role); + } else { + client.emit("warn", "server role deleted but role not in cache"); + } + } else { + client.emit("warn", "server role deleted but server not in cache"); + } + break; + case _Constants.PacketType.SERVER_ROLE_UPDATE: + var server = self.servers.get("id", data.guild_id); + if (server) { + var role = server.roles.get("id", data.role.id); + if (role) { + var newRole = new _StructuresRole2["default"](data.role, server, client); + client.emit("serverRoleUpdated", new _StructuresRole2["default"](role, server, client), newRole); + server.roles.update(role, newRole); + } else { + client.emit("warn", "server role updated but role not in cache"); + } + } else { + client.emit("warn", "server role updated but server not in cache"); + } + break; + case _Constants.PacketType.SERVER_MEMBER_ADD: + var server = self.servers.get("id", data.guild_id); + if (server) { + + server.memberMap[data.user.id] = { + roles: data.roles, + mute: false, + selfMute: false, + deaf: false, + selfDeaf: false, + joinedAt: Date.parse(data.joined_at), + nick: data.nick || null + }; + + server.memberCount++; + + client.emit("serverNewMember", server, server.members.add(self.users.add(new _StructuresUser2["default"](data.user, client)))); + } else { + client.emit("warn", "server member added but server doesn't exist in cache"); + } + break; + case _Constants.PacketType.SERVER_MEMBER_REMOVE: + var server = self.servers.get("id", data.guild_id); + if (server) { + var user = self.users.get("id", data.user.id); + if (user) { + client.emit("serverMemberRemoved", server, user); + server.memberMap[data.user.id] = null; + server.members.remove(user); + server.memberCount--; + } else { + client.emit("warn", "server member removed but user doesn't exist in cache"); + } + } else { + client.emit("warn", "server member removed but server doesn't exist in cache"); + } + break; + case _Constants.PacketType.SERVER_MEMBER_UPDATE: + var server = self.servers.get("id", data.guild_id); + if (server) { + var user = self.users.add(new _StructuresUser2["default"](data.user, client)); + if (user) { + var oldMember = null; + if (server.memberMap[data.user.id]) { + oldMember = { + roles: server.memberMap[data.user.id].roles, + mute: server.memberMap[data.user.id].mute, + selfMute: server.memberMap[data.user.id].selfMute, + deaf: server.memberMap[data.user.id].deaf, + selfDeaf: server.memberMap[data.user.id].selfDeaf, + nick: server.memberMap[data.user.id].nick + }; + } else { + server.memberMap[data.user.id] = {}; + } + server.memberMap[data.user.id].roles = data.roles ? data.roles : server.memberMap[data.user.id].roles; + server.memberMap[data.user.id].mute = data.mute || server.memberMap[data.user.id].mute; + server.memberMap[data.user.id].selfMute = data.self_mute === undefined ? server.memberMap[data.user.id].selfMute : data.self_mute; + server.memberMap[data.user.id].deaf = data.deaf || server.memberMap[data.user.id].deaf; + server.memberMap[data.user.id].selfDeaf = data.self_deaf === undefined ? server.memberMap[data.user.id].selfDeaf : data.self_deaf; + server.memberMap[data.user.id].nick = data.nick === undefined ? server.memberMap[data.user.id].nick : data.nick || null; + client.emit("serverMemberUpdated", server, user, oldMember); + } else { + client.emit("warn", "server member removed but user doesn't exist in cache"); + } + } else { + client.emit("warn", "server member updated but server doesn't exist in cache"); + } + break; + case _Constants.PacketType.PRESENCE_UPDATE: + + var user = self.users.add(new _StructuresUser2["default"](data.user, client)); + var server = self.servers.get("id", data.guild_id); + + if (user && server) { + + server.members.add(user); + + data.user.username = data.user.username || user.username; + data.user.id = data.user.id || user.id; + data.user.avatar = data.user.avatar !== undefined ? data.user.avatar : user.avatar; + data.user.discriminator = data.user.discriminator || user.discriminator; + data.user.status = data.status || user.status; + data.user.game = data.game !== undefined ? data.game : user.game; + data.user.bot = data.user.bot !== undefined ? data.user.bot : user.bot; + + var presenceUser = new _StructuresUser2["default"](data.user, client); + + if (!presenceUser.equalsStrict(user)) { + client.emit("presence", user, presenceUser); + self.users.update(user, presenceUser); + } + } else { + client.emit("warn", "presence update but user/server not in cache"); + } + + break; + case _Constants.PacketType.USER_UPDATE: + + var user = self.users.get("id", data.id); + + if (user) { + + data.username = data.username || user.username; + data.id = data.id || user.id; + data.avatar = data.avatar || user.avatar; + data.discriminator = data.discriminator || user.discriminator; + _this37.email = data.email || _this37.email; + + var presenceUser = new _StructuresUser2["default"](data, client); + + client.emit("presence", user, presenceUser); + self.users.update(user, presenceUser); + } else { + client.emit("warn", "user update but user not in cache (this should never happen)"); + } + + break; + case _Constants.PacketType.TYPING: + + var user = self.users.get("id", data.user_id); + var channel = self.channels.get("id", data.channel_id) || self.private_channels.get("id", data.channel_id); + + if (user && channel) { + if (user.typing.since) { + user.typing.since = Date.now(); + user.typing.channel = channel; + } else { + user.typing.since = Date.now(); + user.typing.channel = channel; + client.emit("userTypingStarted", user, channel); + } + setTimeout(function () { + if (Date.now() - user.typing.since > 5500) { + // they haven't typed since + user.typing.since = null; + user.typing.channel = null; + client.emit("userTypingStopped", user, channel); + } + }, 6000); + } else { + client.emit("warn", "user typing but user or channel not existant in cache"); + } + break; + case _Constants.PacketType.SERVER_BAN_ADD: + var user = self.users.get("id", data.user.id); + var server = self.servers.get("id", data.guild_id); + + if (user && server) { + client.emit("userBanned", user, server); + } else { + client.emit("warn", "user banned but user/server not in cache."); + } + break; + case _Constants.PacketType.SERVER_BAN_REMOVE: + var user = self.users.get("id", data.user.id); + var server = self.servers.get("id", data.guild_id); + + if (user && server) { + client.emit("userUnbanned", user, server); + } else { + client.emit("warn", "user unbanned but user/server not in cache."); + } + break; + case _Constants.PacketType.USER_NOTE_UPDATE: + if (_this37.user.bot) { + return; + } + var user = self.users.get("id", data.id); + var oldNote = user.note; + var note = data.note || null; + + // user in cache + if (user) { + var updatedUser = user; + updatedUser.note = note; + + client.emit("noteUpdated", user, oldNote); + + self.users.update(user, updatedUser); + } else { + client.emit("warn", "note updated but user not in cache"); + } + break; + case _Constants.PacketType.VOICE_STATE_UPDATE: + var user = self.users.get("id", data.user_id); + var server = self.servers.get("id", data.guild_id); + var connection = self.voiceConnections.get("server", server); + + if (user && server) { + + if (data.channel_id) { + // in voice channel + var channel = self.channels.get("id", data.channel_id); + if (channel && channel.type === "voice") { + server.eventVoiceStateUpdate(channel, user, data); + } else { + client.emit("warn", "voice state channel not in cache"); + } + } else { + // not in voice channel + client.emit("voiceLeave", server.eventVoiceLeave(user), user); + } + } else { + client.emit("warn", "voice state update but user or server not in cache"); + } + + if (user && user.id === self.user.id) { + // only for detecting self user movements for connections. + var connection = self.voiceConnections.get("server", server); + // existing connection, perhaps channel moved + if (connection && connection.voiceChannel && connection.voiceChannel.id !== data.channel_id) { + // moved, update info + connection.voiceChannel = self.channels.get("id", data.channel_id); + client.emit("voiceMoved", connection.voiceChannel); // Moved to a new channel + } + } + + break; + case _Constants.PacketType.SERVER_MEMBERS_CHUNK: + + var server = self.servers.get("id", data.guild_id); + + if (server) { + + var testtime = Date.now(); + + for (var _iterator10 = data.members, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { + var _ref10; + + if (_isArray10) { + if (_i10 >= _iterator10.length) break; + _ref10 = _iterator10[_i10++]; + } else { + _i10 = _iterator10.next(); + if (_i10.done) break; + _ref10 = _i10.value; + } + + var user = _ref10; + + server.memberMap[user.user.id] = { + roles: user.roles, + mute: user.mute, + selfMute: false, + deaf: user.deaf, + selfDeaf: false, + joinedAt: Date.parse(user.joined_at), + nick: user.nick || null + }; + server.members.add(self.users.add(new _StructuresUser2["default"](user.user, client))); + } + + if (self.forceFetchCount.hasOwnProperty(server.id)) { + if (self.forceFetchCount[server.id] <= 1) { + delete self.forceFetchCount[server.id]; + self.checkReady(); + } else { + self.forceFetchCount[server.id]--; + } + } + + client.emit("debug", Date.now() - testtime + "ms for " + data.members.length + " user chunk for server with id " + server.id); + } else { + client.emit("warn", "chunk update received but server not in cache"); + } + + break; + case _Constants.PacketType.FRIEND_ADD: + if (_this37.user.bot) { + return; + } + if (data.type === 1) { + // accepted/got accepted a friend request + var inUser = self.incoming_friend_requests.get("id", data.id); + if (inUser) { + // client accepted another user + self.incoming_friend_requests.remove(self.friends.add(new _StructuresUser2["default"](data.user, client))); + return; + } + + var outUser = self.outgoing_friend_requests.get("id", data.id); + if (outUser) { + // another user accepted the client + self.outgoing_friend_requests.remove(self.friends.add(new _StructuresUser2["default"](data.user, client))); + client.emit("friendRequestAccepted", outUser); + return; + } + } else if (data.type === 2) { + // client received block + self.blocked_users.add(new _StructuresUser2["default"](data.user, client)); + } else if (data.type === 3) { + // client received friend request + client.emit("friendRequestReceived", self.incoming_friend_requests.add(new _StructuresUser2["default"](data.user, client))); + } else if (data.type === 4) { + // client sent friend request + self.outgoing_friend_requests.add(new _StructuresUser2["default"](data.user, client)); + } + break; + case _Constants.PacketType.FRIEND_REMOVE: + if (_this37.user.bot) { + return; + } + var user = self.friends.get("id", data.id); + if (user) { + self.friends.remove(user); + client.emit("friendRemoved", user); + return; + } + + user = self.blocked_users.get("id", data.id); + if (user) { + // they rejected friend request + self.blocked_users.remove(user); + return; + } + + user = self.incoming_friend_requests.get("id", data.id); + if (user) { + // they rejected outgoing friend request OR client user manually deleted incoming thru web client/other clients + var rejectedUser = self.outgoing_friend_requests.get("id", user.id); + if (rejectedUser) { + // other person rejected outgoing + client.emit("friendRequestRejected", self.outgoing_friend_requests.remove(rejectedUser)); + return; + } + + // incoming deleted manually + self.incoming_friend_requests.remove(user); + return; + } + + user = self.outgoing_friend_requests.get("id", data.id); + if (user) { + // client cancelled incoming friend request OR client user manually deleted outgoing thru web client/other clients + var incomingCancel = self.incoming_friend_requests.get("id", user.id); + if (incomingCancel) { + // client cancelled incoming + self.incoming_friend_requests.remove(user); + return; + } + + // outgoing deleted manually + self.outgoing_friend_requests.remove(user); + return; + } + break; + default: + client.emit("unknown", packet); + break; + } + }; + }; + + _createClass(InternalClient, [{ + key: "uptime", + get: function get() { + return this.readyTime ? Date.now() - this.readyTime : null; + } + }, { + key: "userAgent", + set: function set(info) { + info.full = "DiscordBot (" + info.url + ", " + info.version + ")"; + this.userAgentInfo = info; + }, + get: function get() { + return this.userAgentInfo; + } + }, { + key: "voiceConnection", + get: function get() { + return this.voiceConnections[0]; + } + }]); + + return InternalClient; +})(); + +exports["default"] = InternalClient; +module.exports = exports["default"]; diff --git a/lib/Client/Resolver/Resolver.js b/lib/Client/Resolver/Resolver.js index b14998111..7416c1f35 100644 --- a/lib/Client/Resolver/Resolver.js +++ b/lib/Client/Resolver/Resolver.js @@ -1,34 +1,382 @@ -"use strict"; /* global Buffer */ /** +"use strict"; +/* global Buffer */ + +/** * Resolves supplied data type to a Channel. If a String, it should be a Channel ID. * @typedef {(Channel|Server|Message|User|String)} ChannelResolvable -*/ /** +*/ +/** * Resolves supplied data type to a TextChannel or PMChannel. If a String, it should be a Channel ID. * @typedef {(TextChannel|PMChannel|Server|Message|User|String)} TextChannelResolvable -*/ /** +*/ +/** * If given an array, turns it into a newline-separated string. * @typedef {(String|Array)} StringResolvable -*/ /** +*/ +/** * Resolves supplied data type to a Message. If a channel, it is the latest message from that channel. * @typedef {(Message|TextChannel|PMChannel)} MessageResolvable -*/ /** +*/ +/** * Resolves supplied data type to a Server. If a String, it should be the server's ID. * @typedef {(Server|ServerChannel|Message|String)} ServerResolvable - */ /** + */ +/** * Resolves supplied data type to something that can be attached to a message. If a String, it can be an URL or a path to a local file. * @typedef {(String|ReadableStream|Buffer)} FileResolvable - */ /** + */ +/** * Resolves supplied data type to an invite ID. If a String, it should be an ID or a direct URL to the invite. * @typedef {(Invite|String)} InviteIDResolvable - */exports.__esModule = true;function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var _fs=require("fs");var _fs2=_interopRequireDefault(_fs);var _superagent=require("superagent");var _superagent2=_interopRequireDefault(_superagent);var _StructuresUser=require("../../Structures/User");var _StructuresUser2=_interopRequireDefault(_StructuresUser);var _StructuresChannel=require("../../Structures/Channel");var _StructuresChannel2=_interopRequireDefault(_StructuresChannel);var _StructuresTextChannel=require("../../Structures/TextChannel");var _StructuresTextChannel2=_interopRequireDefault(_StructuresTextChannel);var _StructuresVoiceChannel=require("../../Structures/VoiceChannel");var _StructuresVoiceChannel2=_interopRequireDefault(_StructuresVoiceChannel);var _StructuresServerChannel=require("../../Structures/ServerChannel");var _StructuresServerChannel2=_interopRequireDefault(_StructuresServerChannel);var _StructuresPMChannel=require("../../Structures/PMChannel");var _StructuresPMChannel2=_interopRequireDefault(_StructuresPMChannel);var _StructuresRole=require("../../Structures/Role");var _StructuresRole2=_interopRequireDefault(_StructuresRole);var _StructuresServer=require("../../Structures/Server");var _StructuresServer2=_interopRequireDefault(_StructuresServer);var _StructuresMessage=require("../../Structures/Message");var _StructuresMessage2=_interopRequireDefault(_StructuresMessage);var _StructuresInvite=require("../../Structures/Invite");var _StructuresInvite2=_interopRequireDefault(_StructuresInvite);var _VoiceVoiceConnection=require("../../Voice/VoiceConnection");var _VoiceVoiceConnection2=_interopRequireDefault(_VoiceVoiceConnection);var Resolver=(function(){function Resolver(internal){_classCallCheck(this,Resolver);this.internal = internal;}Resolver.prototype.resolveToBase64 = function resolveToBase64(resource){if(resource instanceof Buffer){resource = resource.toString("base64");resource = "data:image/jpg;base64," + resource;}return resource;};Resolver.prototype.resolveInviteID = function resolveInviteID(resource){if(resource instanceof _StructuresInvite2["default"]){return resource.id;}if(typeof resource === "string" || resource instanceof String){if(resource.indexOf("http") === 0){var split=resource.split("/");return split.pop();}return resource;}return null;};Resolver.prototype.resolveServer = function resolveServer(resource){if(resource instanceof _StructuresServer2["default"]){return resource;}if(resource instanceof _StructuresServerChannel2["default"]){return resource.server;}if(resource instanceof String || typeof resource === "string"){return this.internal.servers.get("id",resource);}if(resource instanceof _StructuresMessage2["default"]){if(resource.channel instanceof _StructuresTextChannel2["default"]){return resource.channel.server;}}return null;};Resolver.prototype.resolveRole = function resolveRole(resource){if(resource instanceof _StructuresRole2["default"]){return resource;}if(resource instanceof String || typeof resource === "string"){var role=null;for(var _iterator=this.internal.servers,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[Symbol.iterator]();;) {var _ref;if(_isArray){if(_i >= _iterator.length)break;_ref = _iterator[_i++];}else {_i = _iterator.next();if(_i.done)break;_ref = _i.value;}var server=_ref;if(role = server.roles.get("id",resource)){return role;}}}return null;};Resolver.prototype.resolveFile = function resolveFile(resource){if(typeof resource === "string" || resource instanceof String){if(/^https?:\/\//.test(resource)){return new Promise(function(resolve,reject){_superagent2["default"].get(resource).buffer().parse(function(res,cb){res.setEncoding("binary");res.data = "";res.on("data",function(chunk){res.data += chunk;});res.on("end",function(){cb(null,new Buffer(res.data,"binary"));});}).end(function(err,res){if(err){return reject(err);}return resolve(res.body);});});}else {return Promise.resolve(resource);}}return Promise.resolve(resource);};Resolver.prototype.resolveMentions = function resolveMentions(resource,channel){var _mentions=[];var changed=resource;for(var _iterator2=resource.match(/<@\!?[0-9]+>/g) || [],_isArray2=Array.isArray(_iterator2),_i2=0,_iterator2=_isArray2?_iterator2:_iterator2[Symbol.iterator]();;) {var _ref2;if(_isArray2){if(_i2 >= _iterator2.length)break;_ref2 = _iterator2[_i2++];}else {_i2 = _iterator2.next();if(_i2.done)break;_ref2 = _i2.value;}var mention=_ref2; // username mention -if(mention[2] === '!'){var user=this.internal.users.get("id",mention.substring(3,mention.length - 1));if(user){_mentions.push(user);var details=channel.server && channel.server.detailsOf(user);if(details){changed = changed.replace(new RegExp(mention,"g"),"@" + (details.nick || user.username + "#" + user.discriminator));}}}else {var user=this.internal.users.get("id",mention.substring(2,mention.length - 1));if(user){_mentions.push(user);changed = changed.replace(new RegExp(mention,"g"),"@" + (user.username + "#" + user.discriminator));}}}if(channel && channel.server && channel.server.roles){for(var _iterator3=resource.match(/<@&[0-9]+>/g) || [],_isArray3=Array.isArray(_iterator3),_i3=0,_iterator3=_isArray3?_iterator3:_iterator3[Symbol.iterator]();;) {var _ref3;if(_isArray3){if(_i3 >= _iterator3.length)break;_ref3 = _iterator3[_i3++];}else {_i3 = _iterator3.next();if(_i3.done)break;_ref3 = _i3.value;}var mention=_ref3; // role mention -var role=channel.server.roles.get("id",mention.substring(3,mention.length - 1));if(role){changed = changed.replace(new RegExp(mention,"g"),"@" + role.name);}}}for(var _iterator4=resource.match(/<#[0-9]+>/g) || [],_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 mention=_ref4; // channel mention -var channel=this.internal.channels.get("id",mention.substring(2,mention.length - 1));if(channel){changed = changed.replace(new RegExp(mention,"g"),"#" + channel.name);}}return [_mentions,changed];};Resolver.prototype.resolveString = function resolveString(resource){ // accepts Array, Channel, Server, User, Message, String and anything -// toString()-able -if(resource instanceof Array){resource = resource.join("\n");}return resource.toString();};Resolver.prototype.resolveUser = function resolveUser(resource){ /* - accepts a Message, Channel, Server, String ID, User, PMChannel - */if(resource instanceof _StructuresUser2["default"]){return resource;}if(resource instanceof _StructuresMessage2["default"]){return resource.author;}if(resource instanceof _StructuresTextChannel2["default"]){var lmsg=resource.lastMessage;if(lmsg){return lmsg.author;}}if(resource instanceof _StructuresServer2["default"]){return resource.owner;}if(resource instanceof _StructuresPMChannel2["default"]){return resource.recipient;}if(resource instanceof String || typeof resource === "string"){return this.internal.users.get("id",resource);}return null;};Resolver.prototype.resolveMessage = function resolveMessage(resource){ // accepts a Message, PMChannel & TextChannel -if(resource instanceof _StructuresTextChannel2["default"] || resource instanceof _StructuresPMChannel2["default"]){return resource.lastMessage;}if(resource instanceof _StructuresMessage2["default"]){return resource;}return null;};Resolver.prototype.resolveChannel = function resolveChannel(resource){ /* - accepts a Message, Channel, VoiceConnection, Server, String ID, User - */if(resource instanceof _StructuresMessage2["default"]){return Promise.resolve(resource.channel);}if(resource instanceof _StructuresChannel2["default"]){return Promise.resolve(resource);}if(resource instanceof _VoiceVoiceConnection2["default"]){return Promise.resolve(resource.voiceChannel);}if(resource instanceof _StructuresServer2["default"]){return Promise.resolve(resource.defaultChannel);}if(resource instanceof String || typeof resource === "string"){var user=this.internal.users.get("id",resource);if(user){resource = user;}else {return Promise.resolve(this.internal.channels.get("id",resource) || this.internal.private_channels.get("id",resource));}}if(resource instanceof _StructuresUser2["default"]){ // see if a PM exists -for(var _iterator5=this.internal.private_channels,_isArray5=Array.isArray(_iterator5),_i5=0,_iterator5=_isArray5?_iterator5:_iterator5[Symbol.iterator]();;) {var _ref5;if(_isArray5){if(_i5 >= _iterator5.length)break;_ref5 = _iterator5[_i5++];}else {_i5 = _iterator5.next();if(_i5.done)break;_ref5 = _i5.value;}var pmchat=_ref5;if(pmchat.recipient.equals(resource)){return Promise.resolve(pmchat);}} // PM does not exist :\ -return this.internal.startPM(resource);}var error=new Error("Could not resolve channel");error.resource = resource;return Promise.reject(error);};return Resolver;})();exports["default"] = Resolver;module.exports = exports["default"]; + */ + +exports.__esModule = true; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var _fs = require("fs"); + +var _fs2 = _interopRequireDefault(_fs); + +var _superagent = require("superagent"); + +var _superagent2 = _interopRequireDefault(_superagent); + +var _StructuresUser = require("../../Structures/User"); + +var _StructuresUser2 = _interopRequireDefault(_StructuresUser); + +var _StructuresChannel = require("../../Structures/Channel"); + +var _StructuresChannel2 = _interopRequireDefault(_StructuresChannel); + +var _StructuresTextChannel = require("../../Structures/TextChannel"); + +var _StructuresTextChannel2 = _interopRequireDefault(_StructuresTextChannel); + +var _StructuresVoiceChannel = require("../../Structures/VoiceChannel"); + +var _StructuresVoiceChannel2 = _interopRequireDefault(_StructuresVoiceChannel); + +var _StructuresServerChannel = require("../../Structures/ServerChannel"); + +var _StructuresServerChannel2 = _interopRequireDefault(_StructuresServerChannel); + +var _StructuresPMChannel = require("../../Structures/PMChannel"); + +var _StructuresPMChannel2 = _interopRequireDefault(_StructuresPMChannel); + +var _StructuresRole = require("../../Structures/Role"); + +var _StructuresRole2 = _interopRequireDefault(_StructuresRole); + +var _StructuresServer = require("../../Structures/Server"); + +var _StructuresServer2 = _interopRequireDefault(_StructuresServer); + +var _StructuresMessage = require("../../Structures/Message"); + +var _StructuresMessage2 = _interopRequireDefault(_StructuresMessage); + +var _StructuresInvite = require("../../Structures/Invite"); + +var _StructuresInvite2 = _interopRequireDefault(_StructuresInvite); + +var _VoiceVoiceConnection = require("../../Voice/VoiceConnection"); + +var _VoiceVoiceConnection2 = _interopRequireDefault(_VoiceVoiceConnection); + +var Resolver = (function () { + function Resolver(internal) { + _classCallCheck(this, Resolver); + + this.internal = internal; + } + + Resolver.prototype.resolveToBase64 = function resolveToBase64(resource) { + if (resource instanceof Buffer) { + resource = resource.toString("base64"); + resource = "data:image/jpg;base64," + resource; + } + return resource; + }; + + Resolver.prototype.resolveInviteID = function resolveInviteID(resource) { + if (resource instanceof _StructuresInvite2["default"]) { + return resource.id; + } + if (typeof resource === "string" || resource instanceof String) { + if (resource.indexOf("http") === 0) { + var split = resource.split("/"); + return split.pop(); + } + return resource; + } + return null; + }; + + Resolver.prototype.resolveServer = function resolveServer(resource) { + if (resource instanceof _StructuresServer2["default"]) { + return resource; + } + if (resource instanceof _StructuresServerChannel2["default"]) { + return resource.server; + } + if (resource instanceof String || typeof resource === "string") { + return this.internal.servers.get("id", resource); + } + if (resource instanceof _StructuresMessage2["default"]) { + if (resource.channel instanceof _StructuresTextChannel2["default"]) { + return resource.channel.server; + } + } + return null; + }; + + Resolver.prototype.resolveRole = function resolveRole(resource) { + if (resource instanceof _StructuresRole2["default"]) { + return resource; + } + if (resource instanceof String || typeof resource === "string") { + var role = null; + for (var _iterator = this.internal.servers, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var server = _ref; + + if (role = server.roles.get("id", resource)) { + return role; + } + } + } + return null; + }; + + Resolver.prototype.resolveFile = function resolveFile(resource) { + if (typeof resource === "string" || resource instanceof String) { + if (/^https?:\/\//.test(resource)) { + return new Promise(function (resolve, reject) { + _superagent2["default"].get(resource).buffer().parse(function (res, cb) { + res.setEncoding("binary"); + res.data = ""; + res.on("data", function (chunk) { + res.data += chunk; + }); + res.on("end", function () { + cb(null, new Buffer(res.data, "binary")); + }); + }).end(function (err, res) { + if (err) { + return reject(err); + } + return resolve(res.body); + }); + }); + } else { + return Promise.resolve(resource); + } + } + return Promise.resolve(resource); + }; + + Resolver.prototype.resolveMentions = function resolveMentions(resource, channel) { + var _mentions = []; + var changed = resource; + for (var _iterator2 = resource.match(/<@\!?[0-9]+>/g) || [], _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var mention = _ref2; + // username mention + if (mention[2] === '!') { + var user = this.internal.users.get("id", mention.substring(3, mention.length - 1)); + if (user) { + _mentions.push(user); + var details = channel.server && channel.server.detailsOf(user); + if (details) { + changed = changed.replace(new RegExp(mention, "g"), "@" + (details.nick || user.username + "#" + user.discriminator)); + } + } + } else { + var user = this.internal.users.get("id", mention.substring(2, mention.length - 1)); + if (user) { + _mentions.push(user); + changed = changed.replace(new RegExp(mention, "g"), "@" + (user.username + "#" + user.discriminator)); + } + } + } + if (channel && channel.server && channel.server.roles) { + for (var _iterator3 = resource.match(/<@&[0-9]+>/g) || [], _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref3; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref3 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) break; + _ref3 = _i3.value; + } + + var mention = _ref3; + // role mention + var role = channel.server.roles.get("id", mention.substring(3, mention.length - 1)); + if (role) { + changed = changed.replace(new RegExp(mention, "g"), "@" + role.name); + } + } + } + for (var _iterator4 = resource.match(/<#[0-9]+>/g) || [], _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 mention = _ref4; + // channel mention + var channel = this.internal.channels.get("id", mention.substring(2, mention.length - 1)); + if (channel) { + changed = changed.replace(new RegExp(mention, "g"), "#" + channel.name); + } + } + return [_mentions, changed]; + }; + + Resolver.prototype.resolveString = function resolveString(resource) { + + // accepts Array, Channel, Server, User, Message, String and anything + // toString()-able + + if (resource instanceof Array) { + resource = resource.join("\n"); + } + + return resource.toString(); + }; + + Resolver.prototype.resolveUser = function resolveUser(resource) { + /* + accepts a Message, Channel, Server, String ID, User, PMChannel + */ + if (resource instanceof _StructuresUser2["default"]) { + return resource; + } + if (resource instanceof _StructuresMessage2["default"]) { + return resource.author; + } + if (resource instanceof _StructuresTextChannel2["default"]) { + var lmsg = resource.lastMessage; + if (lmsg) { + return lmsg.author; + } + } + if (resource instanceof _StructuresServer2["default"]) { + return resource.owner; + } + if (resource instanceof _StructuresPMChannel2["default"]) { + return resource.recipient; + } + if (resource instanceof String || typeof resource === "string") { + return this.internal.users.get("id", resource); + } + + return null; + }; + + Resolver.prototype.resolveMessage = function resolveMessage(resource) { + // accepts a Message, PMChannel & TextChannel + + if (resource instanceof _StructuresTextChannel2["default"] || resource instanceof _StructuresPMChannel2["default"]) { + return resource.lastMessage; + } + if (resource instanceof _StructuresMessage2["default"]) { + return resource; + } + + return null; + }; + + Resolver.prototype.resolveChannel = function resolveChannel(resource) { + /* + accepts a Message, Channel, VoiceConnection, Server, String ID, User + */ + + if (resource instanceof _StructuresMessage2["default"]) { + return Promise.resolve(resource.channel); + } + if (resource instanceof _StructuresChannel2["default"]) { + return Promise.resolve(resource); + } + if (resource instanceof _VoiceVoiceConnection2["default"]) { + return Promise.resolve(resource.voiceChannel); + } + if (resource instanceof _StructuresServer2["default"]) { + return Promise.resolve(resource.defaultChannel); + } + if (resource instanceof String || typeof resource === "string") { + var user = this.internal.users.get("id", resource); + if (user) { + resource = user; + } else { + return Promise.resolve(this.internal.channels.get("id", resource) || this.internal.private_channels.get("id", resource)); + } + } + if (resource instanceof _StructuresUser2["default"]) { + // see if a PM exists + for (var _iterator5 = this.internal.private_channels, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref5; + + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref5 = _iterator5[_i5++]; + } else { + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref5 = _i5.value; + } + + var pmchat = _ref5; + + if (pmchat.recipient.equals(resource)) { + return Promise.resolve(pmchat); + } + } + + // PM does not exist :\ + return this.internal.startPM(resource); + } + var error = new Error("Could not resolve channel"); + error.resource = resource; + return Promise.reject(error); + }; + + return Resolver; +})(); + +exports["default"] = Resolver; +module.exports = exports["default"]; diff --git a/lib/Constants.js b/lib/Constants.js index 4627ae62c..2178a927d 100644 --- a/lib/Constants.js +++ b/lib/Constants.js @@ -1,8 +1,155 @@ -"use strict";exports.__esModule = true;var Constants={};var API=Constants.API = "https://discordapp.com/api";var Endpoints=Constants.Endpoints = { // general endpoints -LOGIN:API + "/auth/login",LOGOUT:API + "/auth/logout",ME:API + "/users/@me",ME_CHANNELS:API + "/users/@me/channels",ME_SERVER:function ME_SERVER(serverID){return Endpoints.ME + "/guilds/" + serverID;},OAUTH2_APPLICATION:function OAUTH2_APPLICATION(appID){return API + "/oauth2/applications/" + appID;},ME_NOTES:API + "/users/@me/notes",GATEWAY:API + "/gateway",AVATAR:function AVATAR(userID,avatar){return API + "/users/" + userID + "/avatars/" + avatar + ".jpg";},INVITE:function INVITE(id){return API + "/invite/" + id;}, // servers -SERVERS:API + "/guilds",SERVER:function SERVER(serverID){return Endpoints.SERVERS + "/" + serverID;},SERVER_ICON:function SERVER_ICON(serverID,hash){return Endpoints.SERVER(serverID) + "/icons/" + hash + ".jpg";},SERVER_PRUNE:function SERVER_PRUNE(serverID){return Endpoints.SERVER(serverID) + "/prune";},SERVER_EMBED:function SERVER_EMBED(serverID){return Endpoints.SERVER(serverID) + "/embed";},SERVER_INVITES:function SERVER_INVITES(serverID){return Endpoints.SERVER(serverID) + "/invites";},SERVER_ROLES:function SERVER_ROLES(serverID){return Endpoints.SERVER(serverID) + "/roles";},SERVER_BANS:function SERVER_BANS(serverID){return Endpoints.SERVER(serverID) + "/bans";},SERVER_INTEGRATIONS:function SERVER_INTEGRATIONS(serverID){return Endpoints.SERVER(serverID) + "/integrations";},SERVER_MEMBERS:function SERVER_MEMBERS(serverID){return Endpoints.SERVER(serverID) + "/members";},SERVER_CHANNELS:function SERVER_CHANNELS(serverID){return Endpoints.SERVER(serverID) + "/channels";}, // channels -CHANNELS:API + "/channels",CHANNEL:function CHANNEL(channelID){return Endpoints.CHANNELS + "/" + channelID;},CHANNEL_MESSAGES:function CHANNEL_MESSAGES(channelID){return Endpoints.CHANNEL(channelID) + "/messages";},CHANNEL_INVITES:function CHANNEL_INVITES(channelID){return Endpoints.CHANNEL(channelID) + "/invites";},CHANNEL_TYPING:function CHANNEL_TYPING(channelID){return Endpoints.CHANNEL(channelID) + "/typing";},CHANNEL_PERMISSIONS:function CHANNEL_PERMISSIONS(channelID){return Endpoints.CHANNEL(channelID) + "/permissions";},CHANNEL_MESSAGE:function CHANNEL_MESSAGE(channelID,messageID){return Endpoints.CHANNEL_MESSAGES(channelID) + "/" + messageID;},CHANNEL_PINS:function CHANNEL_PINS(channelID){return Endpoints.CHANNEL(channelID) + "/pins";},CHANNEL_PIN:function CHANNEL_PIN(channelID,messageID){return Endpoints.CHANNEL_PINS(channelID) + "/" + messageID;}, // friends -FRIENDS:API + "/users/@me/relationships"};Constants.Permissions = { // general -createInstantInvite:1 << 0,kickMembers:1 << 1,banMembers:1 << 2,administrator:1 << 3,manageChannels:1 << 4,manageChannel:1 << 4,manageServer:1 << 5,changeNickname:1 << 26,manageNicknames:1 << 27,manageRoles:1 << 28,managePermissions:1 << 28, // text -readMessages:1 << 10,sendMessages:1 << 11,sendTTSMessages:1 << 12,manageMessages:1 << 13,embedLinks:1 << 14,attachFiles:1 << 15,readMessageHistory:1 << 16,mentionEveryone:1 << 17, // voice -voiceConnect:1 << 20,voiceSpeak:1 << 21,voiceMuteMembers:1 << 22,voiceDeafenMembers:1 << 23,voiceMoveMembers:1 << 24,voiceUseVAD:1 << 25};Constants.PacketType = {CHANNEL_CREATE:"CHANNEL_CREATE",CHANNEL_DELETE:"CHANNEL_DELETE",CHANNEL_UPDATE:"CHANNEL_UPDATE",MESSAGE_CREATE:"MESSAGE_CREATE",MESSAGE_DELETE:"MESSAGE_DELETE",MESSAGE_UPDATE:"MESSAGE_UPDATE",PRESENCE_UPDATE:"PRESENCE_UPDATE",READY:"READY",SERVER_BAN_ADD:"GUILD_BAN_ADD",SERVER_BAN_REMOVE:"GUILD_BAN_REMOVE",SERVER_CREATE:"GUILD_CREATE",SERVER_DELETE:"GUILD_DELETE",SERVER_MEMBER_ADD:"GUILD_MEMBER_ADD",SERVER_MEMBER_REMOVE:"GUILD_MEMBER_REMOVE",SERVER_MEMBER_UPDATE:"GUILD_MEMBER_UPDATE",SERVER_MEMBERS_CHUNK:"GUILD_MEMBERS_CHUNK",SERVER_ROLE_CREATE:"GUILD_ROLE_CREATE",SERVER_ROLE_DELETE:"GUILD_ROLE_DELETE",SERVER_ROLE_UPDATE:"GUILD_ROLE_UPDATE",SERVER_UPDATE:"GUILD_UPDATE",TYPING:"TYPING_START",USER_UPDATE:"USER_UPDATE",USER_NOTE_UPDATE:"USER_NOTE_UPDATE",VOICE_STATE_UPDATE:"VOICE_STATE_UPDATE",FRIEND_ADD:"RELATIONSHIP_ADD",FRIEND_REMOVE:"RELATIONSHIP_REMOVE"};exports["default"] = Constants;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; +var Constants = {}; + +var API = Constants.API = "https://discordapp.com/api"; + +var Endpoints = Constants.Endpoints = { + // general endpoints + LOGIN: API + "/auth/login", + LOGOUT: API + "/auth/logout", + ME: API + "/users/@me", + ME_CHANNELS: API + "/users/@me/channels", + ME_SERVER: function ME_SERVER(serverID) { + return Endpoints.ME + "/guilds/" + serverID; + }, + OAUTH2_APPLICATION: function OAUTH2_APPLICATION(appID) { + return API + "/oauth2/applications/" + appID; + }, + ME_NOTES: API + "/users/@me/notes", + GATEWAY: API + "/gateway", + AVATAR: function AVATAR(userID, avatar) { + return API + "/users/" + userID + "/avatars/" + avatar + ".jpg"; + }, + INVITE: function INVITE(id) { + return API + "/invite/" + id; + }, + + // servers + SERVERS: API + "/guilds", + SERVER: function SERVER(serverID) { + return Endpoints.SERVERS + "/" + serverID; + }, + SERVER_ICON: function SERVER_ICON(serverID, hash) { + return Endpoints.SERVER(serverID) + "/icons/" + hash + ".jpg"; + }, + SERVER_PRUNE: function SERVER_PRUNE(serverID) { + return Endpoints.SERVER(serverID) + "/prune"; + }, + SERVER_EMBED: function SERVER_EMBED(serverID) { + return Endpoints.SERVER(serverID) + "/embed"; + }, + SERVER_INVITES: function SERVER_INVITES(serverID) { + return Endpoints.SERVER(serverID) + "/invites"; + }, + SERVER_ROLES: function SERVER_ROLES(serverID) { + return Endpoints.SERVER(serverID) + "/roles"; + }, + SERVER_BANS: function SERVER_BANS(serverID) { + return Endpoints.SERVER(serverID) + "/bans"; + }, + SERVER_INTEGRATIONS: function SERVER_INTEGRATIONS(serverID) { + return Endpoints.SERVER(serverID) + "/integrations"; + }, + SERVER_MEMBERS: function SERVER_MEMBERS(serverID) { + return Endpoints.SERVER(serverID) + "/members"; + }, + SERVER_CHANNELS: function SERVER_CHANNELS(serverID) { + return Endpoints.SERVER(serverID) + "/channels"; + }, + + // channels + CHANNELS: API + "/channels", + CHANNEL: function CHANNEL(channelID) { + return Endpoints.CHANNELS + "/" + channelID; + }, + CHANNEL_MESSAGES: function CHANNEL_MESSAGES(channelID) { + return Endpoints.CHANNEL(channelID) + "/messages"; + }, + CHANNEL_INVITES: function CHANNEL_INVITES(channelID) { + return Endpoints.CHANNEL(channelID) + "/invites"; + }, + CHANNEL_TYPING: function CHANNEL_TYPING(channelID) { + return Endpoints.CHANNEL(channelID) + "/typing"; + }, + CHANNEL_PERMISSIONS: function CHANNEL_PERMISSIONS(channelID) { + return Endpoints.CHANNEL(channelID) + "/permissions"; + }, + CHANNEL_MESSAGE: function CHANNEL_MESSAGE(channelID, messageID) { + return Endpoints.CHANNEL_MESSAGES(channelID) + "/" + messageID; + }, + CHANNEL_PINS: function CHANNEL_PINS(channelID) { + return Endpoints.CHANNEL(channelID) + "/pins"; + }, + CHANNEL_PIN: function CHANNEL_PIN(channelID, messageID) { + return Endpoints.CHANNEL_PINS(channelID) + "/" + messageID; + }, + + // friends + FRIENDS: API + "/users/@me/relationships" +}; + +Constants.Permissions = { + // general + createInstantInvite: 1 << 0, + kickMembers: 1 << 1, + banMembers: 1 << 2, + administrator: 1 << 3, + manageChannels: 1 << 4, + manageChannel: 1 << 4, + manageServer: 1 << 5, + changeNickname: 1 << 26, + manageNicknames: 1 << 27, + manageRoles: 1 << 28, + managePermissions: 1 << 28, + // text + readMessages: 1 << 10, + sendMessages: 1 << 11, + sendTTSMessages: 1 << 12, + manageMessages: 1 << 13, + embedLinks: 1 << 14, + attachFiles: 1 << 15, + readMessageHistory: 1 << 16, + mentionEveryone: 1 << 17, + // voice + voiceConnect: 1 << 20, + voiceSpeak: 1 << 21, + voiceMuteMembers: 1 << 22, + voiceDeafenMembers: 1 << 23, + voiceMoveMembers: 1 << 24, + voiceUseVAD: 1 << 25 + +}; + +Constants.PacketType = { + CHANNEL_CREATE: "CHANNEL_CREATE", + CHANNEL_DELETE: "CHANNEL_DELETE", + CHANNEL_UPDATE: "CHANNEL_UPDATE", + MESSAGE_CREATE: "MESSAGE_CREATE", + MESSAGE_DELETE: "MESSAGE_DELETE", + MESSAGE_UPDATE: "MESSAGE_UPDATE", + PRESENCE_UPDATE: "PRESENCE_UPDATE", + READY: "READY", + SERVER_BAN_ADD: "GUILD_BAN_ADD", + SERVER_BAN_REMOVE: "GUILD_BAN_REMOVE", + SERVER_CREATE: "GUILD_CREATE", + SERVER_DELETE: "GUILD_DELETE", + SERVER_MEMBER_ADD: "GUILD_MEMBER_ADD", + SERVER_MEMBER_REMOVE: "GUILD_MEMBER_REMOVE", + SERVER_MEMBER_UPDATE: "GUILD_MEMBER_UPDATE", + SERVER_MEMBERS_CHUNK: "GUILD_MEMBERS_CHUNK", + SERVER_ROLE_CREATE: "GUILD_ROLE_CREATE", + SERVER_ROLE_DELETE: "GUILD_ROLE_DELETE", + SERVER_ROLE_UPDATE: "GUILD_ROLE_UPDATE", + SERVER_UPDATE: "GUILD_UPDATE", + TYPING: "TYPING_START", + USER_UPDATE: "USER_UPDATE", + USER_NOTE_UPDATE: "USER_NOTE_UPDATE", + VOICE_STATE_UPDATE: "VOICE_STATE_UPDATE", + FRIEND_ADD: "RELATIONSHIP_ADD", + FRIEND_REMOVE: "RELATIONSHIP_REMOVE" +}; + +exports["default"] = Constants; +module.exports = exports["default"]; diff --git a/lib/Structures/Channel.js b/lib/Structures/Channel.js index d7940170f..7f3980cec 100644 --- a/lib/Structures/Channel.js +++ b/lib/Structures/Channel.js @@ -1 +1,50 @@ -"use strict";exports.__esModule = true;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;};})();function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var _UtilEquality=require("../Util/Equality");var _UtilEquality2=_interopRequireDefault(_UtilEquality);var _UtilArgumentRegulariser=require("../Util/ArgumentRegulariser");var Channel=(function(_Equality){_inherits(Channel,_Equality);function Channel(data,client){_classCallCheck(this,Channel);_Equality.call(this);this.id = data.id;this.client = client;}Channel.prototype["delete"] = function _delete(){return this.client.deleteChannel.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};_createClass(Channel,[{key:"createdAt",get:function get(){return new Date(+this.id / 4194304 + 1420070400000);}},{key:"isPrivate",get:function get(){return !this.server;}}]);return Channel;})(_UtilEquality2["default"]);exports["default"] = Channel;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +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; }; })(); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _UtilEquality = require("../Util/Equality"); + +var _UtilEquality2 = _interopRequireDefault(_UtilEquality); + +var _UtilArgumentRegulariser = require("../Util/ArgumentRegulariser"); + +var Channel = (function (_Equality) { + _inherits(Channel, _Equality); + + function Channel(data, client) { + _classCallCheck(this, Channel); + + _Equality.call(this); + this.id = data.id; + this.client = client; + } + + Channel.prototype["delete"] = function _delete() { + return this.client.deleteChannel.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + _createClass(Channel, [{ + key: "createdAt", + get: function get() { + return new Date(+this.id / 4194304 + 1420070400000); + } + }, { + key: "isPrivate", + get: function get() { + return !this.server; + } + }]); + + return Channel; +})(_UtilEquality2["default"]); + +exports["default"] = Channel; +module.exports = exports["default"]; diff --git a/lib/Structures/ChannelPermissions.js b/lib/Structures/ChannelPermissions.js index b8ba80312..81773a75e 100644 --- a/lib/Structures/ChannelPermissions.js +++ b/lib/Structures/ChannelPermissions.js @@ -1,7 +1,78 @@ -"use strict";exports.__esModule = true;function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var _Constants=require("../Constants");var ChannelPermissions=(function(){function ChannelPermissions(permissions){_classCallCheck(this,ChannelPermissions);this.permissions = permissions;}ChannelPermissions.prototype.serialise = function serialise(explicit){var _this=this;var hp=function hp(perm){return _this.hasPermission(perm,explicit);};return { // general -createInstantInvite:hp(_Constants.Permissions.createInstantInvite),kickMembers:hp(_Constants.Permissions.kickMembers),banMembers:hp(_Constants.Permissions.banMembers),managePermissions:hp(_Constants.Permissions.managePermissions),manageChannel:hp(_Constants.Permissions.manageChannel),manageServer:hp(_Constants.Permissions.manageServer), // text -readMessages:hp(_Constants.Permissions.readMessages),sendMessages:hp(_Constants.Permissions.sendMessages),sendTTSMessages:hp(_Constants.Permissions.sendTTSMessages),manageMessages:hp(_Constants.Permissions.manageMessages),embedLinks:hp(_Constants.Permissions.embedLinks),attachFiles:hp(_Constants.Permissions.attachFiles),readMessageHistory:hp(_Constants.Permissions.readMessageHistory),mentionEveryone:hp(_Constants.Permissions.mentionEveryone), // voice -voiceConnect:hp(_Constants.Permissions.voiceConnect),voiceSpeak:hp(_Constants.Permissions.voiceSpeak),voiceMuteMembers:hp(_Constants.Permissions.voiceMuteMembers),voiceDeafenMembers:hp(_Constants.Permissions.voiceDeafenMembers),voiceMoveMembers:hp(_Constants.Permissions.voiceMoveMembers),voiceUseVAD:hp(_Constants.Permissions.voiceUseVAD)};};ChannelPermissions.prototype.serialize = function serialize(){ // ;n; -return this.serialise();};ChannelPermissions.prototype.hasPermission = function hasPermission(perm){var explicit=arguments.length <= 1 || arguments[1] === undefined?false:arguments[1];if(perm instanceof String || typeof perm === "string"){perm = _Constants.Permissions[perm];}if(!perm){return false;}if(!explicit){ // implicit permissions allowed -if(!!(this.permissions & _Constants.Permissions.manageRoles)){ // manageRoles allowed, they have all permissions -return true;}}return !!(this.permissions & perm);};return ChannelPermissions;})();exports["default"] = ChannelPermissions;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var _Constants = require("../Constants"); + +var ChannelPermissions = (function () { + function ChannelPermissions(permissions) { + _classCallCheck(this, ChannelPermissions); + + this.permissions = permissions; + } + + ChannelPermissions.prototype.serialise = function serialise(explicit) { + var _this = this; + + var hp = function hp(perm) { + return _this.hasPermission(perm, explicit); + }; + + return { + // general + createInstantInvite: hp(_Constants.Permissions.createInstantInvite), + kickMembers: hp(_Constants.Permissions.kickMembers), + banMembers: hp(_Constants.Permissions.banMembers), + managePermissions: hp(_Constants.Permissions.managePermissions), + manageChannel: hp(_Constants.Permissions.manageChannel), + manageServer: hp(_Constants.Permissions.manageServer), + // text + readMessages: hp(_Constants.Permissions.readMessages), + sendMessages: hp(_Constants.Permissions.sendMessages), + sendTTSMessages: hp(_Constants.Permissions.sendTTSMessages), + manageMessages: hp(_Constants.Permissions.manageMessages), + embedLinks: hp(_Constants.Permissions.embedLinks), + attachFiles: hp(_Constants.Permissions.attachFiles), + readMessageHistory: hp(_Constants.Permissions.readMessageHistory), + mentionEveryone: hp(_Constants.Permissions.mentionEveryone), + // voice + voiceConnect: hp(_Constants.Permissions.voiceConnect), + voiceSpeak: hp(_Constants.Permissions.voiceSpeak), + voiceMuteMembers: hp(_Constants.Permissions.voiceMuteMembers), + voiceDeafenMembers: hp(_Constants.Permissions.voiceDeafenMembers), + voiceMoveMembers: hp(_Constants.Permissions.voiceMoveMembers), + voiceUseVAD: hp(_Constants.Permissions.voiceUseVAD) + }; + }; + + ChannelPermissions.prototype.serialize = function serialize() { + // ;n; + return this.serialise(); + }; + + ChannelPermissions.prototype.hasPermission = function hasPermission(perm) { + var explicit = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; + + if (perm instanceof String || typeof perm === "string") { + perm = _Constants.Permissions[perm]; + } + if (!perm) { + return false; + } + if (!explicit) { + // implicit permissions allowed + if (!!(this.permissions & _Constants.Permissions.manageRoles)) { + // manageRoles allowed, they have all permissions + return true; + } + } + return !!(this.permissions & perm); + }; + + return ChannelPermissions; +})(); + +exports["default"] = ChannelPermissions; +module.exports = exports["default"]; diff --git a/lib/Structures/Invite.js b/lib/Structures/Invite.js index 8d39a8e8f..77b4be4db 100644 --- a/lib/Structures/Invite.js +++ b/lib/Structures/Invite.js @@ -1 +1,47 @@ -"use strict";exports.__esModule = true;function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var Invite=(function(){function Invite(data,chan,client){_classCallCheck(this,Invite);this.maxAge = data.max_age;this.code = data.code;if(chan){this.channel = chan;this.server = chan.server;}else {this.channel = data.channel;this.server = data.guild;}this.revoked = data.revoked;this.createdAt = Date.parse(data.created_at);this.temporary = data.temporary;this.uses = data.uses;this.maxUses = data.max_uses;if(data.inviter){this.inviter = client.internal.users.get("id",data.inviter.id);}this.xkcd = data.xkcdpass;}Invite.prototype.toString = function toString(){return "https://discord.gg/" + this.code;};Invite.prototype["delete"] = function _delete(){return this.client.deleteInvite.apply(this.client,reg(this,arguments));};Invite.prototype.join = function join(){return this.client.joinServer.apply(this.client,reg(this,arguments));};return Invite;})();exports["default"] = Invite;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Invite = (function () { + function Invite(data, chan, client) { + _classCallCheck(this, Invite); + + this.maxAge = data.max_age; + this.code = data.code; + if (chan) { + this.channel = chan; + this.server = chan.server; + } else { + this.channel = data.channel; + this.server = data.guild; + } + this.revoked = data.revoked; + this.createdAt = Date.parse(data.created_at); + this.temporary = data.temporary; + this.uses = data.uses; + this.maxUses = data.max_uses; + if (data.inviter) { + this.inviter = client.internal.users.get("id", data.inviter.id); + } + this.xkcd = data.xkcdpass; + } + + Invite.prototype.toString = function toString() { + return "https://discord.gg/" + this.code; + }; + + Invite.prototype["delete"] = function _delete() { + return this.client.deleteInvite.apply(this.client, reg(this, arguments)); + }; + + Invite.prototype.join = function join() { + return this.client.joinServer.apply(this.client, reg(this, arguments)); + }; + + return Invite; +})(); + +exports["default"] = Invite; +module.exports = exports["default"]; diff --git a/lib/Structures/Message.js b/lib/Structures/Message.js index 833b78fc3..c906ef57c 100644 --- a/lib/Structures/Message.js +++ b/lib/Structures/Message.js @@ -1,8 +1,151 @@ -"use strict"; /** +"use strict"; + +/** * Options that can be applied to a message before sending it. * @typedef {(object)} MessageOptions * @property {boolean} [tts=false] Whether or not the message should be sent as text-to-speech. -*/exports.__esModule = true;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;};})();function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var _UtilCache=require("../Util/Cache");var _UtilCache2=_interopRequireDefault(_UtilCache);var _User=require("./User");var _User2=_interopRequireDefault(_User);var _UtilArgumentRegulariser=require("../Util/ArgumentRegulariser");var _UtilEquality=require("../Util/Equality");var _UtilEquality2=_interopRequireDefault(_UtilEquality);var Message=(function(_Equality){_inherits(Message,_Equality);function Message(data,channel,client){var _this=this;_classCallCheck(this,Message);_Equality.call(this);this.channel = channel;this.server = channel.server;this.client = client;this.nonce = data.nonce;this.attachments = data.attachments;this.tts = data.tts;this.embeds = data.embeds;this.timestamp = Date.parse(data.timestamp);this.everyoneMentioned = data.mention_everyone || data.everyoneMentioned;this.pinned = data.pinned;this.id = data.id;if(data.edited_timestamp){this.editedTimestamp = Date.parse(data.edited_timestamp);}if(data.author instanceof _User2["default"]){this.author = data.author;}else if(data.author){this.author = client.internal.users.add(new _User2["default"](data.author,client));}this.content = data.content;var mentionData=client.internal.resolver.resolveMentions(data.content,channel);this.cleanContent = mentionData[1];this.mentions = [];mentionData[0].forEach(function(mention){ // this is .add and not .get because it allows the bot to cache -// users from messages from logs who may have left the server and were -// not previously cached. -if(mention instanceof _User2["default"]){_this.mentions.push(mention);}else {_this.mentions.push(client.internal.users.add(new _User2["default"](mention,client)));}});}Message.prototype.isMentioned = function isMentioned(user){user = this.client.internal.resolver.resolveUser(user);if(!user){return false;}for(var _iterator=this.mentions,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[Symbol.iterator]();;) {var _ref;if(_isArray){if(_i >= _iterator.length)break;_ref = _iterator[_i++];}else {_i = _iterator.next();if(_i.done)break;_ref = _i.value;}var mention=_ref;if(mention.id == user.id){return true;}}return false;};Message.prototype.toString = function toString(){return this.content;};Message.prototype["delete"] = function _delete(){return this.client.deleteMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Message.prototype.update = function update(){return this.client.updateMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Message.prototype.edit = function edit(){return this.client.updateMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Message.prototype.reply = function reply(){return this.client.reply.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Message.prototype.replyTTS = function replyTTS(){return this.client.replyTTS.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Message.prototype.pin = function pin(){return this.client.pinMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Message.prototype.unpin = function unpin(){return this.client.unpinMessage.apply(this.client,req(this,arguments));};_createClass(Message,[{key:"sender",get:function get(){return this.author;}}]);return Message;})(_UtilEquality2["default"]);exports["default"] = Message;module.exports = exports["default"]; +*/ + +exports.__esModule = true; + +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; }; })(); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _UtilCache = require("../Util/Cache"); + +var _UtilCache2 = _interopRequireDefault(_UtilCache); + +var _User = require("./User"); + +var _User2 = _interopRequireDefault(_User); + +var _UtilArgumentRegulariser = require("../Util/ArgumentRegulariser"); + +var _UtilEquality = require("../Util/Equality"); + +var _UtilEquality2 = _interopRequireDefault(_UtilEquality); + +var Message = (function (_Equality) { + _inherits(Message, _Equality); + + function Message(data, channel, client) { + var _this = this; + + _classCallCheck(this, Message); + + _Equality.call(this); + this.channel = channel; + this.server = channel.server; + this.client = client; + this.nonce = data.nonce; + this.attachments = data.attachments; + this.tts = data.tts; + this.embeds = data.embeds; + this.timestamp = Date.parse(data.timestamp); + this.everyoneMentioned = data.mention_everyone !== undefined ? data.mention_everyone : data.everyoneMentioned; + this.pinned = data.pinned; + this.id = data.id; + + if (data.edited_timestamp) { + this.editedTimestamp = Date.parse(data.edited_timestamp); + } + + if (data.author instanceof _User2["default"]) { + this.author = data.author; + } else if (data.author) { + this.author = client.internal.users.add(new _User2["default"](data.author, client)); + } + + this.content = data.content; + + var mentionData = client.internal.resolver.resolveMentions(data.content, channel); + this.cleanContent = mentionData[1]; + this.mentions = []; + + mentionData[0].forEach(function (mention) { + // this is .add and not .get because it allows the bot to cache + // users from messages from logs who may have left the server and were + // not previously cached. + if (mention instanceof _User2["default"]) { + _this.mentions.push(mention); + } else { + _this.mentions.push(client.internal.users.add(new _User2["default"](mention, client))); + } + }); + } + + Message.prototype.isMentioned = function isMentioned(user) { + user = this.client.internal.resolver.resolveUser(user); + if (!user) { + return false; + } + for (var _iterator = this.mentions, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var mention = _ref; + + if (mention.id == user.id) { + return true; + } + } + return false; + }; + + Message.prototype.toString = function toString() { + return this.content; + }; + + Message.prototype["delete"] = function _delete() { + return this.client.deleteMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Message.prototype.update = function update() { + return this.client.updateMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Message.prototype.edit = function edit() { + return this.client.updateMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Message.prototype.reply = function reply() { + return this.client.reply.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Message.prototype.replyTTS = function replyTTS() { + return this.client.replyTTS.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Message.prototype.pin = function pin() { + return this.client.pinMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Message.prototype.unpin = function unpin() { + return this.client.unpinMessage.apply(this.client, req(this, arguments)); + }; + + _createClass(Message, [{ + key: "sender", + get: function get() { + return this.author; + } + }]); + + return Message; +})(_UtilEquality2["default"]); + +exports["default"] = Message; +module.exports = exports["default"]; diff --git a/lib/Structures/PMChannel.js b/lib/Structures/PMChannel.js index 3139ff51a..956cdf1ac 100644 --- a/lib/Structures/PMChannel.js +++ b/lib/Structures/PMChannel.js @@ -1 +1,94 @@ -"use strict";exports.__esModule = true;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;};})();function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var _Channel2=require("./Channel");var _Channel3=_interopRequireDefault(_Channel2);var _User=require("./User");var _User2=_interopRequireDefault(_User);var _UtilCache=require("../Util/Cache");var _UtilCache2=_interopRequireDefault(_UtilCache);var _UtilArgumentRegulariser=require("../Util/ArgumentRegulariser");var PMChannel=(function(_Channel){_inherits(PMChannel,_Channel);function PMChannel(data,client){_classCallCheck(this,PMChannel);_Channel.call(this,data,client);this.type = data.type || "text";this.lastMessageID = data.last_message_id || data.lastMessageID;this.messages = new _UtilCache2["default"]("id",client.options.maxCachedMessages);this.recipient = this.client.internal.users.add(new _User2["default"](data.recipient,this.client));} /* warning! may return null */PMChannel.prototype.toString = function toString(){return this.recipient.toString();};PMChannel.prototype.sendMessage = function sendMessage(){return this.client.sendMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};PMChannel.prototype.send = function send(){return this.client.sendMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};PMChannel.prototype.sendTTSMessage = function sendTTSMessage(){return this.client.sendTTSMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};PMChannel.prototype.sendTTS = function sendTTS(){return this.client.sendTTSMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};PMChannel.prototype.sendFile = function sendFile(){return this.client.sendFile.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};PMChannel.prototype.startTyping = function startTyping(){return this.client.startTyping.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};PMChannel.prototype.stopTyping = function stopTyping(){return this.client.stopTyping.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};PMChannel.prototype.getLogs = function getLogs(){return this.client.getChannelLogs.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};PMChannel.prototype.getMessage = function getMessage(){return this.client.getMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};_createClass(PMChannel,[{key:"lastMessage",get:function get(){return this.messages.get("id",this.lastMessageID);}}]);return PMChannel;})(_Channel3["default"]);exports["default"] = PMChannel;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +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; }; })(); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _Channel2 = require("./Channel"); + +var _Channel3 = _interopRequireDefault(_Channel2); + +var _User = require("./User"); + +var _User2 = _interopRequireDefault(_User); + +var _UtilCache = require("../Util/Cache"); + +var _UtilCache2 = _interopRequireDefault(_UtilCache); + +var _UtilArgumentRegulariser = require("../Util/ArgumentRegulariser"); + +var PMChannel = (function (_Channel) { + _inherits(PMChannel, _Channel); + + function PMChannel(data, client) { + _classCallCheck(this, PMChannel); + + _Channel.call(this, data, client); + + this.type = data.type || "text"; + this.lastMessageID = data.last_message_id || data.lastMessageID; + this.messages = new _UtilCache2["default"]("id", client.options.maxCachedMessages); + this.recipient = this.client.internal.users.add(new _User2["default"](data.recipient, this.client)); + } + + /* warning! may return null */ + + PMChannel.prototype.toString = function toString() { + return this.recipient.toString(); + }; + + PMChannel.prototype.sendMessage = function sendMessage() { + return this.client.sendMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + PMChannel.prototype.send = function send() { + return this.client.sendMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + PMChannel.prototype.sendTTSMessage = function sendTTSMessage() { + return this.client.sendTTSMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + PMChannel.prototype.sendTTS = function sendTTS() { + return this.client.sendTTSMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + PMChannel.prototype.sendFile = function sendFile() { + return this.client.sendFile.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + PMChannel.prototype.startTyping = function startTyping() { + return this.client.startTyping.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + PMChannel.prototype.stopTyping = function stopTyping() { + return this.client.stopTyping.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + PMChannel.prototype.getLogs = function getLogs() { + return this.client.getChannelLogs.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + PMChannel.prototype.getMessage = function getMessage() { + return this.client.getMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + _createClass(PMChannel, [{ + key: "lastMessage", + get: function get() { + return this.messages.get("id", this.lastMessageID); + } + }]); + + return PMChannel; +})(_Channel3["default"]); + +exports["default"] = PMChannel; +module.exports = exports["default"]; diff --git a/lib/Structures/PermissionOverwrite.js b/lib/Structures/PermissionOverwrite.js index 7a6c593b2..6682c168a 100644 --- a/lib/Structures/PermissionOverwrite.js +++ b/lib/Structures/PermissionOverwrite.js @@ -1,6 +1,89 @@ -"use strict";exports.__esModule = true;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;};})();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var _Constants=require("../Constants");var PermissionOverwrite=(function(){function PermissionOverwrite(data){_classCallCheck(this,PermissionOverwrite);this.id = data.id;this.type = data.type; // member or role -this.deny = data.deny;this.allow = data.allow;} // returns an array of allowed permissions -PermissionOverwrite.prototype.setAllowed = function setAllowed(allowedArray){var _this=this;allowedArray.forEach(function(permission){if(permission instanceof String || typeof permission === "string"){permission = _Constants.Permissions[permission];}if(permission){_this.allow |= 1 << permission;}});};PermissionOverwrite.prototype.setDenied = function setDenied(deniedArray){var _this2=this;deniedArray.forEach(function(permission){if(permission instanceof String || typeof permission === "string"){permission = _Constants.Permissions[permission];}if(permission){_this2.deny |= 1 << permission;}});};_createClass(PermissionOverwrite,[{key:"allowed",get:function get(){var allowed=[];for(var permName in _Constants.Permissions) {if(permName === "manageRoles" || permName === "manageChannels"){ // these permissions do not exist in overwrites. -continue;}if(!!(this.allow & _Constants.Permissions[permName])){allowed.push(permName);}}return allowed;} // returns an array of denied permissions -},{key:"denied",get:function get(){var denied=[];for(var permName in _Constants.Permissions) {if(permName === "manageRoles" || permName === "manageChannels"){ // these permissions do not exist in overwrites. -continue;}if(!!(this.deny & _Constants.Permissions[permName])){denied.push(permName);}}return denied;}}]);return PermissionOverwrite;})();exports["default"] = PermissionOverwrite;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +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; }; })(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var _Constants = require("../Constants"); + +var PermissionOverwrite = (function () { + function PermissionOverwrite(data) { + _classCallCheck(this, PermissionOverwrite); + + this.id = data.id; + this.type = data.type; // member or role + this.deny = data.deny; + this.allow = data.allow; + } + + // returns an array of allowed permissions + + PermissionOverwrite.prototype.setAllowed = function setAllowed(allowedArray) { + var _this = this; + + allowedArray.forEach(function (permission) { + if (permission instanceof String || typeof permission === "string") { + permission = _Constants.Permissions[permission]; + } + if (permission) { + _this.allow |= 1 << permission; + } + }); + }; + + PermissionOverwrite.prototype.setDenied = function setDenied(deniedArray) { + var _this2 = this; + + deniedArray.forEach(function (permission) { + if (permission instanceof String || typeof permission === "string") { + permission = _Constants.Permissions[permission]; + } + if (permission) { + _this2.deny |= 1 << permission; + } + }); + }; + + _createClass(PermissionOverwrite, [{ + key: "allowed", + get: function get() { + var allowed = []; + for (var permName in _Constants.Permissions) { + if (permName === "manageRoles" || permName === "manageChannels") { + // these permissions do not exist in overwrites. + continue; + } + + if (!!(this.allow & _Constants.Permissions[permName])) { + allowed.push(permName); + } + } + return allowed; + } + + // returns an array of denied permissions + }, { + key: "denied", + get: function get() { + var denied = []; + for (var permName in _Constants.Permissions) { + if (permName === "manageRoles" || permName === "manageChannels") { + // these permissions do not exist in overwrites. + continue; + } + + if (!!(this.deny & _Constants.Permissions[permName])) { + denied.push(permName); + } + } + return denied; + } + }]); + + return PermissionOverwrite; +})(); + +exports["default"] = PermissionOverwrite; +module.exports = exports["default"]; diff --git a/lib/Structures/Role.js b/lib/Structures/Role.js index f9fbafd16..468d52af7 100644 --- a/lib/Structures/Role.js +++ b/lib/Structures/Role.js @@ -1,4 +1,15 @@ -"use strict";exports.__esModule = true;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;};})();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var _Constants=require("../Constants");var _UtilArgumentRegulariser=require("../Util/ArgumentRegulariser"); /* +"use strict"; +exports.__esModule = true; + +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; }; })(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var _Constants = require("../Constants"); + +var _UtilArgumentRegulariser = require("../Util/ArgumentRegulariser"); + +/* example data @@ -9,15 +20,172 @@ example data id: '110007368451915776', hoist: false, color: 0 } -*/var DefaultRole=[_Constants.Permissions.createInstantInvite,_Constants.Permissions.readMessages,_Constants.Permissions.readMessageHistory,_Constants.Permissions.sendMessages,_Constants.Permissions.sendTTSMessages,_Constants.Permissions.embedLinks,_Constants.Permissions.attachFiles,_Constants.Permissions.readMessageHistory,_Constants.Permissions.mentionEveryone,_Constants.Permissions.voiceConnect,_Constants.Permissions.voiceSpeak,_Constants.Permissions.voiceUseVAD].reduce(function(previous,current){return previous | current;},0);var Role=(function(){function Role(data,server,client){_classCallCheck(this,Role);this.position = data.position || -1;this.permissions = data.permissions || (data.name === "@everyone"?DefaultRole:0);this.name = data.name || "@everyone";this.managed = data.managed || false;this.id = data.id;this.hoist = data.hoist || false;this.color = data.color || 0;this.server = server;this.client = client;this.mentionable = data.mentionable || false;}Role.prototype.serialise = function serialise(explicit){var _this=this;var hp=function hp(perm){return _this.hasPermission(perm,explicit);};return { // general -createInstantInvite:hp(_Constants.Permissions.createInstantInvite),kickMembers:hp(_Constants.Permissions.kickMembers),banMembers:hp(_Constants.Permissions.banMembers),manageRoles:hp(_Constants.Permissions.manageRoles),manageChannels:hp(_Constants.Permissions.manageChannels),manageServer:hp(_Constants.Permissions.manageServer), // text -readMessages:hp(_Constants.Permissions.readMessages),sendMessages:hp(_Constants.Permissions.sendMessages),sendTTSMessages:hp(_Constants.Permissions.sendTTSMessages),manageMessages:hp(_Constants.Permissions.manageMessages),embedLinks:hp(_Constants.Permissions.embedLinks),attachFiles:hp(_Constants.Permissions.attachFiles),readMessageHistory:hp(_Constants.Permissions.readMessageHistory),mentionEveryone:hp(_Constants.Permissions.mentionEveryone), // voice -voiceConnect:hp(_Constants.Permissions.voiceConnect),voiceSpeak:hp(_Constants.Permissions.voiceSpeak),voiceMuteMembers:hp(_Constants.Permissions.voiceMuteMembers),voiceDeafenMembers:hp(_Constants.Permissions.voiceDeafenMembers),voiceMoveMembers:hp(_Constants.Permissions.voiceMoveMembers),voiceUseVAD:hp(_Constants.Permissions.voiceUseVAD)};};Role.prototype.serialize = function serialize(){ // ;n; -return this.serialise();};Role.prototype.hasPermission = function hasPermission(perm){var explicit=arguments.length <= 1 || arguments[1] === undefined?false:arguments[1];if(perm instanceof String || typeof perm === "string"){perm = _Constants.Permissions[perm];}if(!perm){return false;}if(!explicit){ // implicit permissions allowed -if(!!(this.permissions & _Constants.Permissions.manageRoles)){ // manageRoles allowed, they have all permissions -return true;}} // e.g. -// !!(36953089 & Permissions.manageRoles) = not allowed to manage roles -// !!(36953089 & (1 << 21)) = voice speak allowed -return !!(this.permissions & perm);};Role.prototype.setPermission = function setPermission(permission,value){if(permission instanceof String || typeof permission === "string"){permission = _Constants.Permissions[permission];}if(permission){ // valid permission -if(value){this.permissions |= permission;}else {this.permissions &= ~permission;}}};Role.prototype.setPermissions = function setPermissions(obj){var _this2=this;obj.forEach(function(value,permission){if(permission instanceof String || typeof permission === "string"){permission = _Constants.Permissions[permission];}if(permission){ // valid permission -_this2.setPermission(permission,value);}});};Role.prototype.colorAsHex = function colorAsHex(){var val=this.color.toString(16);while(val.length < 6) {val = "0" + val;}return "#" + val;};Role.prototype["delete"] = function _delete(){return this.client.deleteRole.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Role.prototype.edit = function edit(){return this.client.updateRole.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Role.prototype.update = function update(){return this.client.updateRole.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Role.prototype.addMember = function addMember(member,callback){return this.client.addMemberToRole.apply(this.client,[member,this,callback]);};Role.prototype.addUser = function addUser(member,callback){return this.client.addUserToRole.apply(this.client,[member,this,callback]);};Role.prototype.removeMember = function removeMember(member,callback){return this.client.removeMemberFromRole.apply(this.client,[member,this,callback]);};Role.prototype.removeUser = function removeUser(member,callback){return this.client.removeUserFromRole.apply(this.client,[member,this,callback]);};Role.prototype.mention = function mention(){if(this.mentionable)return "<@&" + this.id + ">";return this.name;};Role.prototype.toString = function toString(){return this.mention();};_createClass(Role,[{key:"createdAt",get:function get(){return new Date(+this.id / 4194304 + 1420070400000);}}]);return Role;})();exports["default"] = Role;module.exports = exports["default"]; +*/ + +var DefaultRole = [_Constants.Permissions.createInstantInvite, _Constants.Permissions.readMessages, _Constants.Permissions.readMessageHistory, _Constants.Permissions.sendMessages, _Constants.Permissions.sendTTSMessages, _Constants.Permissions.embedLinks, _Constants.Permissions.attachFiles, _Constants.Permissions.readMessageHistory, _Constants.Permissions.mentionEveryone, _Constants.Permissions.voiceConnect, _Constants.Permissions.voiceSpeak, _Constants.Permissions.voiceUseVAD].reduce(function (previous, current) { + return previous | current; +}, 0); + +var Role = (function () { + function Role(data, server, client) { + _classCallCheck(this, Role); + + this.position = data.position || -1; + this.permissions = data.permissions || (data.name === "@everyone" ? DefaultRole : 0); + this.name = data.name || "@everyone"; + this.managed = data.managed || false; + this.id = data.id; + this.hoist = data.hoist || false; + this.color = data.color || 0; + this.server = server; + this.client = client; + this.mentionable = data.mentionable || false; + } + + Role.prototype.serialise = function serialise(explicit) { + var _this = this; + + var hp = function hp(perm) { + return _this.hasPermission(perm, explicit); + }; + + return { + // general + createInstantInvite: hp(_Constants.Permissions.createInstantInvite), + kickMembers: hp(_Constants.Permissions.kickMembers), + banMembers: hp(_Constants.Permissions.banMembers), + manageRoles: hp(_Constants.Permissions.manageRoles), + manageChannels: hp(_Constants.Permissions.manageChannels), + manageServer: hp(_Constants.Permissions.manageServer), + // text + readMessages: hp(_Constants.Permissions.readMessages), + sendMessages: hp(_Constants.Permissions.sendMessages), + sendTTSMessages: hp(_Constants.Permissions.sendTTSMessages), + manageMessages: hp(_Constants.Permissions.manageMessages), + embedLinks: hp(_Constants.Permissions.embedLinks), + attachFiles: hp(_Constants.Permissions.attachFiles), + readMessageHistory: hp(_Constants.Permissions.readMessageHistory), + mentionEveryone: hp(_Constants.Permissions.mentionEveryone), + // voice + voiceConnect: hp(_Constants.Permissions.voiceConnect), + voiceSpeak: hp(_Constants.Permissions.voiceSpeak), + voiceMuteMembers: hp(_Constants.Permissions.voiceMuteMembers), + voiceDeafenMembers: hp(_Constants.Permissions.voiceDeafenMembers), + voiceMoveMembers: hp(_Constants.Permissions.voiceMoveMembers), + voiceUseVAD: hp(_Constants.Permissions.voiceUseVAD) + }; + }; + + Role.prototype.serialize = function serialize() { + // ;n; + return this.serialise(); + }; + + Role.prototype.hasPermission = function hasPermission(perm) { + var explicit = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; + + if (perm instanceof String || typeof perm === "string") { + perm = _Constants.Permissions[perm]; + } + if (!perm) { + return false; + } + if (!explicit) { + // implicit permissions allowed + if (!!(this.permissions & _Constants.Permissions.manageRoles)) { + // manageRoles allowed, they have all permissions + return true; + } + } + // e.g. + // !!(36953089 & Permissions.manageRoles) = not allowed to manage roles + // !!(36953089 & (1 << 21)) = voice speak allowed + + return !!(this.permissions & perm); + }; + + Role.prototype.setPermission = function setPermission(permission, value) { + if (permission instanceof String || typeof permission === "string") { + permission = _Constants.Permissions[permission]; + } + if (permission) { + // valid permission + if (value) { + this.permissions |= permission; + } else { + this.permissions &= ~permission; + } + } + }; + + Role.prototype.setPermissions = function setPermissions(obj) { + var _this2 = this; + + obj.forEach(function (value, permission) { + if (permission instanceof String || typeof permission === "string") { + permission = _Constants.Permissions[permission]; + } + if (permission) { + // valid permission + _this2.setPermission(permission, value); + } + }); + }; + + Role.prototype.colorAsHex = function colorAsHex() { + var val = this.color.toString(16); + while (val.length < 6) { + val = "0" + val; + } + return "#" + val; + }; + + Role.prototype["delete"] = function _delete() { + return this.client.deleteRole.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Role.prototype.edit = function edit() { + return this.client.updateRole.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Role.prototype.update = function update() { + return this.client.updateRole.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Role.prototype.addMember = function addMember(member, callback) { + return this.client.addMemberToRole.apply(this.client, [member, this, callback]); + }; + + Role.prototype.addUser = function addUser(member, callback) { + return this.client.addUserToRole.apply(this.client, [member, this, callback]); + }; + + Role.prototype.removeMember = function removeMember(member, callback) { + return this.client.removeMemberFromRole.apply(this.client, [member, this, callback]); + }; + + Role.prototype.removeUser = function removeUser(member, callback) { + return this.client.removeUserFromRole.apply(this.client, [member, this, callback]); + }; + + Role.prototype.mention = function mention() { + if (this.mentionable) return "<@&" + this.id + ">"; + return this.name; + }; + + Role.prototype.toString = function toString() { + return this.mention(); + }; + + _createClass(Role, [{ + key: "createdAt", + get: function get() { + return new Date(+this.id / 4194304 + 1420070400000); + } + }]); + + return Role; +})(); + +exports["default"] = Role; +module.exports = exports["default"]; diff --git a/lib/Structures/Server.js b/lib/Structures/Server.js index b0312fd27..7512f7f63 100644 --- a/lib/Structures/Server.js +++ b/lib/Structures/Server.js @@ -1,6 +1,441 @@ -"use strict"; /** +"use strict"; + +/** * Types of region for a server, include: `us-west`, `us-east`, `us-south`, `us-central`, `singapore`, `london`, `sydney`, `amsterdam` and `frankfurt` * @typedef {(string)} region - */exports.__esModule = true;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;};})();function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var _UtilBucket=require("../Util/Bucket");var _UtilBucket2=_interopRequireDefault(_UtilBucket);var _UtilEquality=require("../Util/Equality");var _UtilEquality2=_interopRequireDefault(_UtilEquality);var _Constants=require("../Constants");var _UtilCache=require("../Util/Cache");var _UtilCache2=_interopRequireDefault(_UtilCache);var _User=require("./User");var _User2=_interopRequireDefault(_User);var _TextChannel=require("./TextChannel");var _TextChannel2=_interopRequireDefault(_TextChannel);var _VoiceChannel=require("./VoiceChannel");var _VoiceChannel2=_interopRequireDefault(_VoiceChannel);var _Role=require("./Role");var _Role2=_interopRequireDefault(_Role);var _UtilArgumentRegulariser=require("../Util/ArgumentRegulariser");var strictKeys=["region","ownerID","name","id","icon","afkTimeout","afkChannelID"];var Server=(function(_Equality){_inherits(Server,_Equality);function Server(data,client){var _this=this;_classCallCheck(this,Server);_Equality.call(this);this.client = client;this.id = data.id;if(data.owner_id){ // new server data -client.internal.buckets["bot:msg:guild:" + this.id] = new _UtilBucket2["default"](5,5000);client.internal.buckets["dmsg:" + this.id] = new _UtilBucket2["default"](5,1000);client.internal.buckets["bdmsg:" + this.id] = new _UtilBucket2["default"](1,1000);client.internal.buckets["guild_member:" + this.id] = new _UtilBucket2["default"](10,10000);client.internal.buckets["guild_member_nick:" + this.id] = new _UtilBucket2["default"](1,1000);}this.region = data.region;this.ownerID = data.owner_id || data.ownerID;this.name = data.name;this.members = new _UtilCache2["default"]();this.channels = new _UtilCache2["default"]();this.roles = new _UtilCache2["default"]();this.icon = data.icon;this.afkTimeout = data.afk_timeout;this.afkChannelID = data.afk_channel_id || data.afkChannelID;this.memberMap = data.memberMap || {};this.memberCount = data.member_count || data.memberCount;this.large = data.large || this.memberCount > 250;if(data.roles instanceof _UtilCache2["default"]){data.roles.forEach(function(role){return _this.roles.add(role);});}else {data.roles.forEach(function(dataRole){_this.roles.add(new _Role2["default"](dataRole,_this,client));});}if(data.members instanceof _UtilCache2["default"]){data.members.forEach(function(member){return _this.members.add(member);});}else {data.members.forEach(function(dataUser){_this.memberMap[dataUser.user.id] = {roles:dataUser.roles,mute:dataUser.mute,selfMute:dataUser.self_mute,deaf:dataUser.deaf,selfDeaf:dataUser.self_deaf,joinedAt:Date.parse(dataUser.joined_at),nick:dataUser.nick || null};_this.members.add(client.internal.users.add(new _User2["default"](dataUser.user,client)));});}if(data.channels instanceof _UtilCache2["default"]){data.channels.forEach(function(channel){return _this.channels.add(channel);});}else {data.channels.forEach(function(dataChannel){if(dataChannel.type === "text"){_this.channels.add(client.internal.channels.add(new _TextChannel2["default"](dataChannel,client,_this)));}else {_this.channels.add(client.internal.channels.add(new _VoiceChannel2["default"](dataChannel,client,_this)));}});}if(data.presences){for(var _iterator=data.presences,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[Symbol.iterator]();;) {var _ref;if(_isArray){if(_i >= _iterator.length)break;_ref = _iterator[_i++];}else {_i = _iterator.next();if(_i.done)break;_ref = _i.value;}var presence=_ref;var user=client.internal.users.get("id",presence.user.id);if(user){user.status = presence.status;user.game = presence.game;}}}if(data.voice_states){for(var _iterator2=data.voice_states,_isArray2=Array.isArray(_iterator2),_i2=0,_iterator2=_isArray2?_iterator2:_iterator2[Symbol.iterator]();;) {var _ref2;if(_isArray2){if(_i2 >= _iterator2.length)break;_ref2 = _iterator2[_i2++];}else {_i2 = _iterator2.next();if(_i2.done)break;_ref2 = _i2.value;}var voiceState=_ref2;var _user=this.members.get("id",voiceState.user_id);if(_user){this.memberMap[_user.id] = this.memberMap[_user.id] || {};this.memberMap[_user.id].mute = voiceState.mute || this.memberMap[_user.id].mute;this.memberMap[_user.id].selfMute = voiceState.self_mute === undefined?this.memberMap[_user.id].selfMute:voiceState.self_mute;this.memberMap[_user.id].deaf = voiceState.deaf || this.memberMap[_user.id].deaf;this.memberMap[_user.id].selfDeaf = voiceState.self_deaf === undefined?this.memberMap[_user.id].selfDeaf:voiceState.self_deaf;var channel=this.channels.get("id",voiceState.channel_id);if(channel){this.eventVoiceJoin(_user,channel);}else {this.client.emit("warn","channel doesn't exist even though READY expects them to");}}else {this.client.emit("warn","user doesn't exist even though READY expects them to");}}}}Server.prototype.detailsOf = function detailsOf(user){var _this2=this;user = this.client.internal.resolver.resolveUser(user);if(user){var result=this.memberMap[user.id] || {};if(result && result.roles){result.roles = result.roles.map(function(pid){return _this2.roles.get("id",pid) || pid;});}return result;}else {return {};}};Server.prototype.detailsOfUser = function detailsOfUser(user){return this.detailsOf(user);};Server.prototype.detailsOfMember = function detailsOfMember(user){return this.detailsOf(user);};Server.prototype.details = function details(user){return this.detailsOf(user);};Server.prototype.rolesOfUser = function rolesOfUser(user){return this.detailsOf(user).roles || [];};Server.prototype.rolesOfMember = function rolesOfMember(member){return this.rolesOfUser(member);};Server.prototype.rolesOf = function rolesOf(user){return this.rolesOfUser(user);};Server.prototype.toString = function toString(){return this.name;};Server.prototype.eventVoiceJoin = function eventVoiceJoin(user,channel){ // removes from other speaking channels first -var oldChannel=this.eventVoiceLeave(user);channel.members.add(user);user.voiceChannel = channel;if(oldChannel.id && channel.id !== oldChannel.id){this.client.emit("voiceLeave",oldChannel,user);this.client.emit("voiceSwitch",oldChannel,channel,user);}this.client.emit("voiceJoin",channel,user);};Server.prototype.eventVoiceStateUpdate = function eventVoiceStateUpdate(channel,user,data){if(!user.voiceChannel || user.voiceChannel.id !== channel.id){return this.eventVoiceJoin(user,channel);}if(!this.memberMap[user.id]){this.memberMap[user.id] = {};}var oldState={mute:this.memberMap[user.id].mute,selfMute:this.memberMap[user.id].self_mute,deaf:this.memberMap[user.id].deaf,selfDeaf:this.memberMap[user.id].self_deaf};this.memberMap[user.id].mute = data.mute;this.memberMap[user.id].selfMute = data.self_mute;this.memberMap[user.id].deaf = data.deaf;this.memberMap[user.id].selfDeaf = data.self_deaf;if(oldState.mute !== undefined && (oldState.mute != data.mute || oldState.self_mute != data.self_mute || oldState.deaf != data.deaf || oldState.self_deaf != data.self_deaf)){this.client.emit("voiceStateUpdate",channel,user,oldState,this.memberMap[user.id]);}else {this.eventVoiceJoin(user,channel);}};Server.prototype.eventVoiceLeave = function eventVoiceLeave(user){for(var _iterator3=this.channels.getAll("type","voice"),_isArray3=Array.isArray(_iterator3),_i3=0,_iterator3=_isArray3?_iterator3:_iterator3[Symbol.iterator]();;) {var _ref3;if(_isArray3){if(_i3 >= _iterator3.length)break;_ref3 = _iterator3[_i3++];}else {_i3 = _iterator3.next();if(_i3.done)break;_ref3 = _i3.value;}var chan=_ref3;if(chan.members.has("id",user.id)){chan.members.remove(user);user.voiceChannel = null;return chan;}}return {server:this};};Server.prototype.equalsStrict = function equalsStrict(obj){if(obj instanceof Server){for(var _iterator4=strictKeys,_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 key=_ref4;if(obj[key] !== this[key]){return false;}}}else {return false;}return true;};Server.prototype.leave = function leave(){return this.client.leaveServer.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Server.prototype["delete"] = function _delete(){return this.client.leaveServer.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Server.prototype.createInvite = function createInvite(){return this.client.createInvite.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Server.prototype.createRole = function createRole(){return this.client.createRole.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Server.prototype.banMember = function banMember(user,tlength,callback){return this.client.banMember.apply(this.client,[user,this,tlength,callback]);};Server.prototype.banUser = function banUser(user,tlength,callback){return this.client.banMember.apply(this.client,[user,this,tlength,callback]);};Server.prototype.ban = function ban(user,tlength,callback){return this.client.banMember.apply(this.client,[user,this,tlength,callback]);};Server.prototype.unbanMember = function unbanMember(user,callback){return this.client.unbanMember.apply(this.client,[user,this,callback]);};Server.prototype.unbanUser = function unbanUser(user,callback){return this.client.unbanMember.apply(this.client,[user,this,callback]);};Server.prototype.unban = function unban(user,callback){return this.client.unbanMember.apply(this.client,[user,this,callback]);};Server.prototype.kickMember = function kickMember(user,callback){return this.client.kickMember.apply(this.client,[user,this,callback]);};Server.prototype.kickUser = function kickUser(user,callback){return this.client.kickMember.apply(this.client,[user,this,callback]);};Server.prototype.kick = function kick(user,callback){return this.client.kickMember.apply(this.client,[user,this,callback]);};Server.prototype.getBans = function getBans(){return this.client.getBans.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Server.prototype.createChannel = function createChannel(){return this.client.createChannel.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Server.prototype.setNickname = function setNickname(){return this.client.setNickname.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};Server.prototype.membersWithRole = function membersWithRole(role){return this.members.filter(function(m){return m.hasRole(role);});};Server.prototype.usersWithRole = function usersWithRole(role){return this.membersWithRole(role);};_createClass(Server,[{key:"createdAt",get:function get(){return new Date(+this.id / 4194304 + 1420070400000);}},{key:"iconURL",get:function get(){if(!this.icon){return null;}else {return _Constants.Endpoints.SERVER_ICON(this.id,this.icon);}}},{key:"afkChannel",get:function get(){return this.channels.get("id",this.afkChannelID);}},{key:"defaultChannel",get:function get(){return this.channels.get("id",this.id);}},{key:"generalChannel",get:function get(){return this.defaultChannel;}},{key:"general",get:function get(){return this.defaultChannel;}},{key:"owner",get:function get(){return this.members.get("id",this.ownerID);}}]);return Server;})(_UtilEquality2["default"]);exports["default"] = Server;module.exports = exports["default"]; + */ + +exports.__esModule = true; + +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; }; })(); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _UtilBucket = require("../Util/Bucket"); + +var _UtilBucket2 = _interopRequireDefault(_UtilBucket); + +var _UtilEquality = require("../Util/Equality"); + +var _UtilEquality2 = _interopRequireDefault(_UtilEquality); + +var _Constants = require("../Constants"); + +var _UtilCache = require("../Util/Cache"); + +var _UtilCache2 = _interopRequireDefault(_UtilCache); + +var _User = require("./User"); + +var _User2 = _interopRequireDefault(_User); + +var _TextChannel = require("./TextChannel"); + +var _TextChannel2 = _interopRequireDefault(_TextChannel); + +var _VoiceChannel = require("./VoiceChannel"); + +var _VoiceChannel2 = _interopRequireDefault(_VoiceChannel); + +var _Role = require("./Role"); + +var _Role2 = _interopRequireDefault(_Role); + +var _UtilArgumentRegulariser = require("../Util/ArgumentRegulariser"); + +var strictKeys = ["region", "ownerID", "name", "id", "icon", "afkTimeout", "afkChannelID"]; + +var Server = (function (_Equality) { + _inherits(Server, _Equality); + + function Server(data, client) { + var _this = this; + + _classCallCheck(this, Server); + + _Equality.call(this); + + this.client = client; + this.id = data.id; + + if (data.owner_id) { + // new server data + client.internal.buckets["bot:msg:guild:" + this.id] = new _UtilBucket2["default"](5, 5000); + client.internal.buckets["dmsg:" + this.id] = new _UtilBucket2["default"](5, 1000); + client.internal.buckets["bdmsg:" + this.id] = new _UtilBucket2["default"](1, 1000); + client.internal.buckets["guild_member:" + this.id] = new _UtilBucket2["default"](10, 10000); + client.internal.buckets["guild_member_nick:" + this.id] = new _UtilBucket2["default"](1, 1000); + } + + this.region = data.region; + this.ownerID = data.owner_id || data.ownerID; + this.name = data.name; + this.members = new _UtilCache2["default"](); + this.channels = new _UtilCache2["default"](); + this.roles = new _UtilCache2["default"](); + this.icon = data.icon; + this.afkTimeout = data.afk_timeout; + this.afkChannelID = data.afk_channel_id || data.afkChannelID; + this.memberMap = data.memberMap || {}; + this.memberCount = data.member_count || data.memberCount; + this.large = data.large || this.memberCount > 250; + + if (data.roles instanceof _UtilCache2["default"]) { + data.roles.forEach(function (role) { + return _this.roles.add(role); + }); + } else { + data.roles.forEach(function (dataRole) { + _this.roles.add(new _Role2["default"](dataRole, _this, client)); + }); + } + + if (data.members instanceof _UtilCache2["default"]) { + data.members.forEach(function (member) { + return _this.members.add(member); + }); + } else { + data.members.forEach(function (dataUser) { + _this.memberMap[dataUser.user.id] = { + roles: dataUser.roles, + mute: dataUser.mute, + selfMute: dataUser.self_mute, + deaf: dataUser.deaf, + selfDeaf: dataUser.self_deaf, + joinedAt: Date.parse(dataUser.joined_at), + nick: dataUser.nick || null + }; + _this.members.add(client.internal.users.add(new _User2["default"](dataUser.user, client))); + }); + } + + if (data.channels instanceof _UtilCache2["default"]) { + data.channels.forEach(function (channel) { + return _this.channels.add(channel); + }); + } else { + data.channels.forEach(function (dataChannel) { + if (dataChannel.type === "text") { + _this.channels.add(client.internal.channels.add(new _TextChannel2["default"](dataChannel, client, _this))); + } else { + _this.channels.add(client.internal.channels.add(new _VoiceChannel2["default"](dataChannel, client, _this))); + } + }); + } + + if (data.presences) { + for (var _iterator = data.presences, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var presence = _ref; + + var user = client.internal.users.get("id", presence.user.id); + if (user) { + user.status = presence.status; + user.game = presence.game; + } + } + } + + if (data.voice_states) { + for (var _iterator2 = data.voice_states, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var voiceState = _ref2; + + var _user = this.members.get("id", voiceState.user_id); + if (_user) { + this.memberMap[_user.id] = this.memberMap[_user.id] || {}; + this.memberMap[_user.id].mute = voiceState.mute || this.memberMap[_user.id].mute; + this.memberMap[_user.id].selfMute = voiceState.self_mute === undefined ? this.memberMap[_user.id].selfMute : voiceState.self_mute; + this.memberMap[_user.id].deaf = voiceState.deaf || this.memberMap[_user.id].deaf; + this.memberMap[_user.id].selfDeaf = voiceState.self_deaf === undefined ? this.memberMap[_user.id].selfDeaf : voiceState.self_deaf; + var channel = this.channels.get("id", voiceState.channel_id); + if (channel) { + this.eventVoiceJoin(_user, channel); + } else { + this.client.emit("warn", "channel doesn't exist even though READY expects them to"); + } + } else { + this.client.emit("warn", "user doesn't exist even though READY expects them to"); + } + } + } + } + + Server.prototype.detailsOf = function detailsOf(user) { + var _this2 = this; + + user = this.client.internal.resolver.resolveUser(user); + if (user) { + var result = this.memberMap[user.id] || {}; + if (result && result.roles) { + result.roles = result.roles.map(function (pid) { + return _this2.roles.get("id", pid) || pid; + }); + } + return result; + } else { + return {}; + } + }; + + Server.prototype.detailsOfUser = function detailsOfUser(user) { + return this.detailsOf(user); + }; + + Server.prototype.detailsOfMember = function detailsOfMember(user) { + return this.detailsOf(user); + }; + + Server.prototype.details = function details(user) { + return this.detailsOf(user); + }; + + Server.prototype.rolesOfUser = function rolesOfUser(user) { + return this.detailsOf(user).roles || []; + }; + + Server.prototype.rolesOfMember = function rolesOfMember(member) { + return this.rolesOfUser(member); + }; + + Server.prototype.rolesOf = function rolesOf(user) { + return this.rolesOfUser(user); + }; + + Server.prototype.toString = function toString() { + return this.name; + }; + + Server.prototype.eventVoiceJoin = function eventVoiceJoin(user, channel) { + // removes from other speaking channels first + var oldChannel = this.eventVoiceLeave(user); + + channel.members.add(user); + user.voiceChannel = channel; + + if (oldChannel.id && channel.id !== oldChannel.id) { + this.client.emit("voiceLeave", oldChannel, user); + this.client.emit("voiceSwitch", oldChannel, channel, user); + } + + this.client.emit("voiceJoin", channel, user); + }; + + Server.prototype.eventVoiceStateUpdate = function eventVoiceStateUpdate(channel, user, data) { + if (!user.voiceChannel || user.voiceChannel.id !== channel.id) { + return this.eventVoiceJoin(user, channel); + } + if (!this.memberMap[user.id]) { + this.memberMap[user.id] = {}; + } + var oldState = { + mute: this.memberMap[user.id].mute, + selfMute: this.memberMap[user.id].self_mute, + deaf: this.memberMap[user.id].deaf, + selfDeaf: this.memberMap[user.id].self_deaf + }; + this.memberMap[user.id].mute = data.mute; + this.memberMap[user.id].selfMute = data.self_mute; + this.memberMap[user.id].deaf = data.deaf; + this.memberMap[user.id].selfDeaf = data.self_deaf; + if (oldState.mute !== undefined && (oldState.mute != data.mute || oldState.self_mute != data.self_mute || oldState.deaf != data.deaf || oldState.self_deaf != data.self_deaf)) { + this.client.emit("voiceStateUpdate", channel, user, oldState, this.memberMap[user.id]); + } else { + this.eventVoiceJoin(user, channel); + } + }; + + Server.prototype.eventVoiceLeave = function eventVoiceLeave(user) { + for (var _iterator3 = this.channels.getAll("type", "voice"), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref3; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref3 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) break; + _ref3 = _i3.value; + } + + var chan = _ref3; + + if (chan.members.has("id", user.id)) { + chan.members.remove(user); + user.voiceChannel = null; + return chan; + } + } + return { server: this }; + }; + + Server.prototype.equalsStrict = function equalsStrict(obj) { + if (obj instanceof Server) { + for (var _iterator4 = strictKeys, _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 key = _ref4; + + if (obj[key] !== this[key]) { + return false; + } + } + } else { + return false; + } + return true; + }; + + Server.prototype.leave = function leave() { + return this.client.leaveServer.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Server.prototype["delete"] = function _delete() { + return this.client.leaveServer.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Server.prototype.createInvite = function createInvite() { + return this.client.createInvite.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Server.prototype.createRole = function createRole() { + return this.client.createRole.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Server.prototype.banMember = function banMember(user, tlength, callback) { + return this.client.banMember.apply(this.client, [user, this, tlength, callback]); + }; + + Server.prototype.banUser = function banUser(user, tlength, callback) { + return this.client.banMember.apply(this.client, [user, this, tlength, callback]); + }; + + Server.prototype.ban = function ban(user, tlength, callback) { + return this.client.banMember.apply(this.client, [user, this, tlength, callback]); + }; + + Server.prototype.unbanMember = function unbanMember(user, callback) { + return this.client.unbanMember.apply(this.client, [user, this, callback]); + }; + + Server.prototype.unbanUser = function unbanUser(user, callback) { + return this.client.unbanMember.apply(this.client, [user, this, callback]); + }; + + Server.prototype.unban = function unban(user, callback) { + return this.client.unbanMember.apply(this.client, [user, this, callback]); + }; + + Server.prototype.kickMember = function kickMember(user, callback) { + return this.client.kickMember.apply(this.client, [user, this, callback]); + }; + + Server.prototype.kickUser = function kickUser(user, callback) { + return this.client.kickMember.apply(this.client, [user, this, callback]); + }; + + Server.prototype.kick = function kick(user, callback) { + return this.client.kickMember.apply(this.client, [user, this, callback]); + }; + + Server.prototype.getBans = function getBans() { + return this.client.getBans.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Server.prototype.createChannel = function createChannel() { + return this.client.createChannel.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Server.prototype.setNickname = function setNickname() { + return this.client.setNickname.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + Server.prototype.membersWithRole = function membersWithRole(role) { + return this.members.filter(function (m) { + return m.hasRole(role); + }); + }; + + Server.prototype.usersWithRole = function usersWithRole(role) { + return this.membersWithRole(role); + }; + + _createClass(Server, [{ + key: "createdAt", + get: function get() { + return new Date(+this.id / 4194304 + 1420070400000); + } + }, { + key: "iconURL", + get: function get() { + if (!this.icon) { + return null; + } else { + return _Constants.Endpoints.SERVER_ICON(this.id, this.icon); + } + } + }, { + key: "afkChannel", + get: function get() { + return this.channels.get("id", this.afkChannelID); + } + }, { + key: "defaultChannel", + get: function get() { + return this.channels.get("id", this.id); + } + }, { + key: "generalChannel", + get: function get() { + return this.defaultChannel; + } + }, { + key: "general", + get: function get() { + return this.defaultChannel; + } + }, { + key: "owner", + get: function get() { + return this.members.get("id", this.ownerID); + } + }]); + + return Server; +})(_UtilEquality2["default"]); + +exports["default"] = Server; +module.exports = exports["default"]; diff --git a/lib/Structures/ServerChannel.js b/lib/Structures/ServerChannel.js index cd5b2cef0..e299920ba 100644 --- a/lib/Structures/ServerChannel.js +++ b/lib/Structures/ServerChannel.js @@ -1 +1,162 @@ -"use strict";exports.__esModule = true;function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var _Channel2=require("./Channel");var _Channel3=_interopRequireDefault(_Channel2);var _UtilCache=require("../Util/Cache");var _UtilCache2=_interopRequireDefault(_UtilCache);var _PermissionOverwrite=require("./PermissionOverwrite");var _PermissionOverwrite2=_interopRequireDefault(_PermissionOverwrite);var _ChannelPermissions=require("./ChannelPermissions");var _ChannelPermissions2=_interopRequireDefault(_ChannelPermissions);var _UtilArgumentRegulariser=require("../Util/ArgumentRegulariser");var ServerChannel=(function(_Channel){_inherits(ServerChannel,_Channel);function ServerChannel(data,client,server){var _this=this;_classCallCheck(this,ServerChannel);_Channel.call(this,data,client);this.name = data.name;this.type = data.type;this.position = data.position;this.permissionOverwrites = data.permissionOverwrites || new _UtilCache2["default"]();this.server = server;if(!data.permissionOverwrites){data.permission_overwrites.forEach(function(permission){_this.permissionOverwrites.add(new _PermissionOverwrite2["default"](permission));});}}ServerChannel.prototype.permissionsOf = function permissionsOf(userOrRole){userOrRole = this.client.internal.resolver.resolveUser(userOrRole);if(userOrRole){if(this.server.ownerID === userOrRole.id){return new _ChannelPermissions2["default"](4294967295);}var everyoneRole=this.server.roles.get("id",this.server.id);var userRoles=[everyoneRole].concat(this.server.rolesOf(userOrRole) || []);var userRolesID=userRoles.filter(function(v){return !!v;}).map(function(v){return v.id;});var roleOverwrites=[],memberOverwrites=[];this.permissionOverwrites.forEach(function(overwrite){if(overwrite.type === "member" && overwrite.id === userOrRole.id){memberOverwrites.push(overwrite);}else if(overwrite.type === "role" && ~userRolesID.indexOf(overwrite.id)){roleOverwrites.push(overwrite);}});var permissions=0;for(var _iterator=userRoles,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[Symbol.iterator]();;) {var _ref;if(_isArray){if(_i >= _iterator.length)break;_ref = _iterator[_i++];}else {_i = _iterator.next();if(_i.done)break;_ref = _i.value;}var serverRole=_ref;if(serverRole){permissions |= serverRole.permissions;}}for(var _iterator2=roleOverwrites.concat(memberOverwrites),_isArray2=Array.isArray(_iterator2),_i2=0,_iterator2=_isArray2?_iterator2:_iterator2[Symbol.iterator]();;) {var _ref2;if(_isArray2){if(_i2 >= _iterator2.length)break;_ref2 = _iterator2[_i2++];}else {_i2 = _iterator2.next();if(_i2.done)break;_ref2 = _i2.value;}var overwrite=_ref2;if(overwrite){permissions = permissions & ~overwrite.deny;permissions = permissions | overwrite.allow;}}return new _ChannelPermissions2["default"](permissions);}else {userOrRole = this.client.internal.resolver.resolveRole(userOrRole);if(userOrRole){var permissions=this.server.roles.get("id",this.server.id).permissions | userOrRole.permissions;var overwrite=this.permissionOverwrites.get("id",this.server.id);permissions = permissions & ~overwrite.deny | overwrite.allow;overwrite = this.permissionOverwrites.get("id",userOrRole.id);if(overwrite){permissions = permissions & ~overwrite.deny | overwrite.allow;}return new _ChannelPermissions2["default"](permissions);}else {return null;}}};ServerChannel.prototype.permsOf = function permsOf(user){return this.permissionsOf(user);};ServerChannel.prototype.mention = function mention(){return "<#" + this.id + ">";};ServerChannel.prototype.toString = function toString(){return this.mention();};ServerChannel.prototype.setName = function setName(){return this.client.setChannelName.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};ServerChannel.prototype.setPosition = function setPosition(){return this.client.setChannelPosition.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};ServerChannel.prototype.update = function update(){return this.client.updateChannel.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};return ServerChannel;})(_Channel3["default"]);exports["default"] = ServerChannel;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _Channel2 = require("./Channel"); + +var _Channel3 = _interopRequireDefault(_Channel2); + +var _UtilCache = require("../Util/Cache"); + +var _UtilCache2 = _interopRequireDefault(_UtilCache); + +var _PermissionOverwrite = require("./PermissionOverwrite"); + +var _PermissionOverwrite2 = _interopRequireDefault(_PermissionOverwrite); + +var _ChannelPermissions = require("./ChannelPermissions"); + +var _ChannelPermissions2 = _interopRequireDefault(_ChannelPermissions); + +var _UtilArgumentRegulariser = require("../Util/ArgumentRegulariser"); + +var ServerChannel = (function (_Channel) { + _inherits(ServerChannel, _Channel); + + function ServerChannel(data, client, server) { + var _this = this; + + _classCallCheck(this, ServerChannel); + + _Channel.call(this, data, client); + this.name = data.name; + this.type = data.type; + this.position = data.position; + this.permissionOverwrites = data.permissionOverwrites || new _UtilCache2["default"](); + this.server = server; + if (!data.permissionOverwrites) { + data.permission_overwrites.forEach(function (permission) { + _this.permissionOverwrites.add(new _PermissionOverwrite2["default"](permission)); + }); + } + } + + ServerChannel.prototype.permissionsOf = function permissionsOf(userOrRole) { + userOrRole = this.client.internal.resolver.resolveUser(userOrRole); + if (userOrRole) { + if (this.server.ownerID === userOrRole.id) { + return new _ChannelPermissions2["default"](4294967295); + } + var everyoneRole = this.server.roles.get("id", this.server.id); + + var userRoles = [everyoneRole].concat(this.server.rolesOf(userOrRole) || []); + var userRolesID = userRoles.filter(function (v) { + return !!v; + }).map(function (v) { + return v.id; + }); + var roleOverwrites = [], + memberOverwrites = []; + + this.permissionOverwrites.forEach(function (overwrite) { + if (overwrite.type === "member" && overwrite.id === userOrRole.id) { + memberOverwrites.push(overwrite); + } else if (overwrite.type === "role" && ~userRolesID.indexOf(overwrite.id)) { + roleOverwrites.push(overwrite); + } + }); + + var permissions = 0; + + for (var _iterator = userRoles, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var serverRole = _ref; + + if (serverRole) { + permissions |= serverRole.permissions; + } + } + + for (var _iterator2 = roleOverwrites.concat(memberOverwrites), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var overwrite = _ref2; + + if (overwrite) { + permissions = permissions & ~overwrite.deny; + permissions = permissions | overwrite.allow; + } + } + + return new _ChannelPermissions2["default"](permissions); + } else { + userOrRole = this.client.internal.resolver.resolveRole(userOrRole); + if (userOrRole) { + var permissions = this.server.roles.get("id", this.server.id).permissions | userOrRole.permissions; + var overwrite = this.permissionOverwrites.get("id", this.server.id); + permissions = permissions & ~overwrite.deny | overwrite.allow; + overwrite = this.permissionOverwrites.get("id", userOrRole.id); + if (overwrite) { + permissions = permissions & ~overwrite.deny | overwrite.allow; + } + return new _ChannelPermissions2["default"](permissions); + } else { + return null; + } + } + }; + + ServerChannel.prototype.permsOf = function permsOf(user) { + return this.permissionsOf(user); + }; + + ServerChannel.prototype.mention = function mention() { + return "<#" + this.id + ">"; + }; + + ServerChannel.prototype.toString = function toString() { + return this.mention(); + }; + + ServerChannel.prototype.setName = function setName() { + return this.client.setChannelName.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + ServerChannel.prototype.setPosition = function setPosition() { + return this.client.setChannelPosition.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + ServerChannel.prototype.update = function update() { + return this.client.updateChannel.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + return ServerChannel; +})(_Channel3["default"]); + +exports["default"] = ServerChannel; +module.exports = exports["default"]; diff --git a/lib/Structures/TextChannel.js b/lib/Structures/TextChannel.js index 2b140d51d..e833c5256 100644 --- a/lib/Structures/TextChannel.js +++ b/lib/Structures/TextChannel.js @@ -1 +1,89 @@ -"use strict";exports.__esModule = true;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;};})();function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var _ServerChannel2=require("./ServerChannel");var _ServerChannel3=_interopRequireDefault(_ServerChannel2);var _UtilCache=require("../Util/Cache");var _UtilCache2=_interopRequireDefault(_UtilCache);var _UtilArgumentRegulariser=require("../Util/ArgumentRegulariser");var TextChannel=(function(_ServerChannel){_inherits(TextChannel,_ServerChannel);function TextChannel(data,client,server){_classCallCheck(this,TextChannel);_ServerChannel.call(this,data,client,server);this.topic = data.topic;this.lastMessageID = data.last_message_id || data.lastMessageID;this.messages = new _UtilCache2["default"]("id",client.options.maxCachedMessages);} /* warning! may return null */TextChannel.prototype.setTopic = function setTopic(){return this.client.setChannelTopic.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};TextChannel.prototype.sendMessage = function sendMessage(){return this.client.sendMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};TextChannel.prototype.send = function send(){return this.client.sendMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};TextChannel.prototype.sendTTSMessage = function sendTTSMessage(){return this.client.sendTTSMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};TextChannel.prototype.sendTTS = function sendTTS(){return this.client.sendTTSMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};TextChannel.prototype.sendFile = function sendFile(){return this.client.sendFile.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};TextChannel.prototype.getLogs = function getLogs(){return this.client.getChannelLogs.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};TextChannel.prototype.getMessage = function getMessage(){return this.client.getMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};TextChannel.prototype.startTyping = function startTyping(){return this.client.startTyping.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};TextChannel.prototype.stopTyping = function stopTyping(){return this.client.stopTyping.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};_createClass(TextChannel,[{key:"lastMessage",get:function get(){return this.messages.get("id",this.lastMessageID);}}]);return TextChannel;})(_ServerChannel3["default"]);exports["default"] = TextChannel;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +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; }; })(); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _ServerChannel2 = require("./ServerChannel"); + +var _ServerChannel3 = _interopRequireDefault(_ServerChannel2); + +var _UtilCache = require("../Util/Cache"); + +var _UtilCache2 = _interopRequireDefault(_UtilCache); + +var _UtilArgumentRegulariser = require("../Util/ArgumentRegulariser"); + +var TextChannel = (function (_ServerChannel) { + _inherits(TextChannel, _ServerChannel); + + function TextChannel(data, client, server) { + _classCallCheck(this, TextChannel); + + _ServerChannel.call(this, data, client, server); + + this.topic = data.topic; + this.lastMessageID = data.last_message_id || data.lastMessageID; + this.messages = new _UtilCache2["default"]("id", client.options.maxCachedMessages); + } + + /* warning! may return null */ + + TextChannel.prototype.setTopic = function setTopic() { + return this.client.setChannelTopic.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + TextChannel.prototype.sendMessage = function sendMessage() { + return this.client.sendMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + TextChannel.prototype.send = function send() { + return this.client.sendMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + TextChannel.prototype.sendTTSMessage = function sendTTSMessage() { + return this.client.sendTTSMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + TextChannel.prototype.sendTTS = function sendTTS() { + return this.client.sendTTSMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + TextChannel.prototype.sendFile = function sendFile() { + return this.client.sendFile.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + TextChannel.prototype.getLogs = function getLogs() { + return this.client.getChannelLogs.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + TextChannel.prototype.getMessage = function getMessage() { + return this.client.getMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + TextChannel.prototype.startTyping = function startTyping() { + return this.client.startTyping.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + TextChannel.prototype.stopTyping = function stopTyping() { + return this.client.stopTyping.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + _createClass(TextChannel, [{ + key: "lastMessage", + get: function get() { + return this.messages.get("id", this.lastMessageID); + } + }]); + + return TextChannel; +})(_ServerChannel3["default"]); + +exports["default"] = TextChannel; +module.exports = exports["default"]; diff --git a/lib/Structures/User.js b/lib/Structures/User.js index cb6ca7ad6..f1179972a 100644 --- a/lib/Structures/User.js +++ b/lib/Structures/User.js @@ -1 +1,135 @@ -"use strict";exports.__esModule = true;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;};})();function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var _UtilEquality=require("../Util/Equality");var _UtilEquality2=_interopRequireDefault(_UtilEquality);var _Constants=require("../Constants");var _UtilArgumentRegulariser=require("../Util/ArgumentRegulariser");var User=(function(_Equality){_inherits(User,_Equality);function User(data,client){_classCallCheck(this,User);_Equality.call(this);this.client = client;this.username = data.username;this.discriminator = data.discriminator;this.id = data.id;this.avatar = data.avatar;this.bot = !!data.bot;this.status = data.status || "offline";this.game = data.game || null;this.typing = {since:null,channel:null};this.note = data.note || null;this.voiceChannel = null;this.voiceState = {};this.speaking = false;}User.prototype.mention = function mention(){return "<@" + this.id + ">";};User.prototype.toString = function toString(){return this.mention();};User.prototype.equalsStrict = function equalsStrict(obj){if(obj instanceof User)return this.id === obj.id && this.username === obj.username && this.discriminator === obj.discriminator && this.avatar === obj.avatar && this.status === obj.status && (this.game === obj.game || this.game && obj.game && this.game.name === obj.game.name);else return false;};User.prototype.equals = function equals(obj){if(obj instanceof User)return this.id === obj.id && this.username === obj.username && this.discriminator === obj.discriminator && this.avatar === obj.avatar;else return false;};User.prototype.sendMessage = function sendMessage(){return this.client.sendMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};User.prototype.send = function send(){return this.client.sendMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};User.prototype.sendTTSMessage = function sendTTSMessage(){return this.client.sendTTSMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};User.prototype.sendTTS = function sendTTS(){return this.client.sendTTSMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};User.prototype.sendFile = function sendFile(){return this.client.sendFile.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};User.prototype.startTyping = function startTyping(){return this.client.startTyping.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};User.prototype.stopTyping = function stopTyping(){return this.client.stopTyping.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};User.prototype.addTo = function addTo(role,callback){return this.client.addMemberToRole.apply(this.client,[this,role,callback]);};User.prototype.removeFrom = function removeFrom(role,callback){return this.client.removeMemberFromRole.apply(this.client,[this,role,callback]);};User.prototype.getLogs = function getLogs(){return this.client.getChannelLogs.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};User.prototype.getMessage = function getMessage(){return this.client.getMessage.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};User.prototype.hasRole = function hasRole(role){return this.client.memberHasRole.apply(this.client,[this,role]);};_createClass(User,[{key:"createdAt",get:function get(){return new Date(+this.id / 4194304 + 1420070400000);}},{key:"avatarURL",get:function get(){if(!this.avatar){return null;}else {return _Constants.Endpoints.AVATAR(this.id,this.avatar);}}},{key:"name",get:function get(){return this.username;}}]);return User;})(_UtilEquality2["default"]);exports["default"] = User;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +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; }; })(); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _UtilEquality = require("../Util/Equality"); + +var _UtilEquality2 = _interopRequireDefault(_UtilEquality); + +var _Constants = require("../Constants"); + +var _UtilArgumentRegulariser = require("../Util/ArgumentRegulariser"); + +var User = (function (_Equality) { + _inherits(User, _Equality); + + function User(data, client) { + _classCallCheck(this, User); + + _Equality.call(this); + this.client = client; + this.username = data.username; + this.discriminator = data.discriminator; + this.id = data.id; + this.avatar = data.avatar; + this.bot = !!data.bot; + this.status = data.status || "offline"; + this.game = data.game || null; + this.typing = { + since: null, + channel: null + }; + this.note = data.note || null; + this.voiceChannel = null; + this.voiceState = {}; + this.speaking = false; + } + + User.prototype.mention = function mention() { + return "<@" + this.id + ">"; + }; + + User.prototype.toString = function toString() { + return this.mention(); + }; + + User.prototype.equalsStrict = function equalsStrict(obj) { + if (obj instanceof User) return this.id === obj.id && this.username === obj.username && this.discriminator === obj.discriminator && this.avatar === obj.avatar && this.status === obj.status && (this.game === obj.game || this.game && obj.game && this.game.name === obj.game.name);else return false; + }; + + User.prototype.equals = function equals(obj) { + if (obj instanceof User) return this.id === obj.id && this.username === obj.username && this.discriminator === obj.discriminator && this.avatar === obj.avatar;else return false; + }; + + User.prototype.sendMessage = function sendMessage() { + return this.client.sendMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + User.prototype.send = function send() { + return this.client.sendMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + User.prototype.sendTTSMessage = function sendTTSMessage() { + return this.client.sendTTSMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + User.prototype.sendTTS = function sendTTS() { + return this.client.sendTTSMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + User.prototype.sendFile = function sendFile() { + return this.client.sendFile.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + User.prototype.startTyping = function startTyping() { + return this.client.startTyping.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + User.prototype.stopTyping = function stopTyping() { + return this.client.stopTyping.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + User.prototype.addTo = function addTo(role, callback) { + return this.client.addMemberToRole.apply(this.client, [this, role, callback]); + }; + + User.prototype.removeFrom = function removeFrom(role, callback) { + return this.client.removeMemberFromRole.apply(this.client, [this, role, callback]); + }; + + User.prototype.getLogs = function getLogs() { + return this.client.getChannelLogs.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + User.prototype.getMessage = function getMessage() { + return this.client.getMessage.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + User.prototype.hasRole = function hasRole(role) { + return this.client.memberHasRole.apply(this.client, [this, role]); + }; + + _createClass(User, [{ + key: "createdAt", + get: function get() { + return new Date(+this.id / 4194304 + 1420070400000); + } + }, { + key: "avatarURL", + get: function get() { + if (!this.avatar) { + return null; + } else { + return _Constants.Endpoints.AVATAR(this.id, this.avatar); + } + } + }, { + key: "name", + get: function get() { + return this.username; + } + }]); + + return User; +})(_UtilEquality2["default"]); + +exports["default"] = User; +module.exports = exports["default"]; diff --git a/lib/Structures/VoiceChannel.js b/lib/Structures/VoiceChannel.js index fc2d07440..51f99e0ba 100644 --- a/lib/Structures/VoiceChannel.js +++ b/lib/Structures/VoiceChannel.js @@ -1,3 +1,52 @@ -"use strict";exports.__esModule = true;function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var _ServerChannel2=require("./ServerChannel");var _ServerChannel3=_interopRequireDefault(_ServerChannel2);var _UtilCache=require("../Util/Cache");var _UtilCache2=_interopRequireDefault(_UtilCache);var _UtilArgumentRegulariser=require("../Util/ArgumentRegulariser");var VoiceChannel=(function(_ServerChannel){_inherits(VoiceChannel,_ServerChannel);function VoiceChannel(data,client,server){_classCallCheck(this,VoiceChannel);_ServerChannel.call(this,data,client,server);this.members = data.members || new _UtilCache2["default"]();this.userLimit = data.user_limit || 0;this._bitrate = data.bitrate || 64000; // incase somebody wants to access the bps value??? -this.bitrate = Math.round(this._bitrate / 1000); // store as kbps -}VoiceChannel.prototype.join = function join(){var callback=arguments.length <= 0 || arguments[0] === undefined?function(){}:arguments[0];return this.client.joinVoiceChannel.apply(this.client,[this,callback]);};VoiceChannel.prototype.setUserLimit = function setUserLimit(){return this.client.setChannelUserLimit.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};VoiceChannel.prototype.setBitrate = function setBitrate(){return this.client.setChannelBitrate.apply(this.client,_UtilArgumentRegulariser.reg(this,arguments));};return VoiceChannel;})(_ServerChannel3["default"]);exports["default"] = VoiceChannel;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _ServerChannel2 = require("./ServerChannel"); + +var _ServerChannel3 = _interopRequireDefault(_ServerChannel2); + +var _UtilCache = require("../Util/Cache"); + +var _UtilCache2 = _interopRequireDefault(_UtilCache); + +var _UtilArgumentRegulariser = require("../Util/ArgumentRegulariser"); + +var VoiceChannel = (function (_ServerChannel) { + _inherits(VoiceChannel, _ServerChannel); + + function VoiceChannel(data, client, server) { + _classCallCheck(this, VoiceChannel); + + _ServerChannel.call(this, data, client, server); + this.members = data.members || new _UtilCache2["default"](); + this.userLimit = data.user_limit || 0; + this._bitrate = data.bitrate || 64000; // incase somebody wants to access the bps value??? + this.bitrate = Math.round(this._bitrate / 1000); // store as kbps + } + + VoiceChannel.prototype.join = function join() { + var callback = arguments.length <= 0 || arguments[0] === undefined ? function () {} : arguments[0]; + + return this.client.joinVoiceChannel.apply(this.client, [this, callback]); + }; + + VoiceChannel.prototype.setUserLimit = function setUserLimit() { + return this.client.setChannelUserLimit.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + VoiceChannel.prototype.setBitrate = function setBitrate() { + return this.client.setChannelBitrate.apply(this.client, _UtilArgumentRegulariser.reg(this, arguments)); + }; + + return VoiceChannel; +})(_ServerChannel3["default"]); + +exports["default"] = VoiceChannel; +module.exports = exports["default"]; diff --git a/lib/Util/ArgumentRegulariser.js b/lib/Util/ArgumentRegulariser.js index 3afa86308..cee9d5a57 100644 --- a/lib/Util/ArgumentRegulariser.js +++ b/lib/Util/ArgumentRegulariser.js @@ -1 +1,8 @@ -"use strict";exports.__esModule = true;exports.reg = reg;function reg(c,a){return [c].concat(Array.prototype.slice.call(a));} +"use strict"; + +exports.__esModule = true; +exports.reg = reg; + +function reg(c, a) { + return [c].concat(Array.prototype.slice.call(a)); +} diff --git a/lib/Util/Bucket.js b/lib/Util/Bucket.js index 6e992dd9d..745ae1fad 100644 --- a/lib/Util/Bucket.js +++ b/lib/Util/Bucket.js @@ -1,2 +1,55 @@ -"use strict";exports.__esModule = true;function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var Bucket=(function(){ // Adapted from Eris -function Bucket(tokenLimit,interval){_classCallCheck(this,Bucket);this.tokenLimit = tokenLimit;this.interval = interval;this.extraTime = 500;this.lastReset = this.tokens = this.lastSend = 0;this._queue = [];}Bucket.prototype.queue = function queue(func){this._queue.push(func);this.check();};Bucket.prototype.check = function check(){var _this=this;if(this.timeout || this._queue.length === 0){return;}if(this.lastReset + this.interval + this.extraTime < Date.now()){this.lastReset = Date.now();this.tokens = Math.max(0,this.tokens - this.tokenLimit);}var val;while(this._queue.length > 0 && this.tokens < this.tokenLimit) {this.tokens++;this._queue.shift()();this.lastSend = Date.now();}if(this._queue.length > 0 && !this.timeout){this.timeout = setTimeout(function(){_this.timeout = null;_this.check();},this.tokens < this.tokenLimit?1:Math.max(0,this.lastReset + this.interval + this.extraTime - Date.now()));}};return Bucket;})();exports["default"] = Bucket;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Bucket = (function () { + // Adapted from Eris + + function Bucket(tokenLimit, interval) { + _classCallCheck(this, Bucket); + + this.tokenLimit = tokenLimit; + this.interval = interval; + this.extraTime = 500; + this.lastReset = this.tokens = this.lastSend = 0; + this._queue = []; + } + + Bucket.prototype.queue = function queue(func) { + this._queue.push(func); + this.check(); + }; + + Bucket.prototype.check = function check() { + var _this = this; + + if (this.timeout || this._queue.length === 0) { + return; + } + if (this.lastReset + this.interval + this.extraTime < Date.now()) { + this.lastReset = Date.now(); + this.tokens = Math.max(0, this.tokens - this.tokenLimit); + } + + var val; + while (this._queue.length > 0 && this.tokens < this.tokenLimit) { + this.tokens++; + this._queue.shift()(); + this.lastSend = Date.now(); + } + + if (this._queue.length > 0 && !this.timeout) { + this.timeout = setTimeout(function () { + _this.timeout = null; + _this.check(); + }, this.tokens < this.tokenLimit ? 1 : Math.max(0, this.lastReset + this.interval + this.extraTime - Date.now())); + } + }; + + return Bucket; +})(); + +exports["default"] = Bucket; +module.exports = exports["default"]; diff --git a/lib/Util/Cache.js b/lib/Util/Cache.js index 2f1fd0c30..cd11d7ced 100644 --- a/lib/Util/Cache.js +++ b/lib/Util/Cache.js @@ -1 +1,153 @@ -"use strict";exports.__esModule = true;function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var discrimS=Symbol();var discrimCacheS=Symbol();var Cache=(function(_Array){_inherits(Cache,_Array);function Cache(discrim,limit){_classCallCheck(this,Cache);_Array.call(this);this[discrimS] = discrim || "id";this[discrimCacheS] = {};this.limit = limit;}Cache.prototype.get = function get(key,value){if(typeof key === 'function'){var valid=key;key = null;}else if(key && !value){return this[discrimCacheS][key] || null;}else if(key === this[discrimS] && typeof value === "string"){return this[discrimCacheS][value] || null;}else if(value && value.constructor.name === 'RegExp'){var valid=function valid(item){return value.test(item);};}else if(typeof value !== 'function'){var valid=function valid(item){return item == value;};}for(var _iterator=this,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[Symbol.iterator]();;) {var _ref;if(_isArray){if(_i >= _iterator.length)break;_ref = _iterator[_i++];}else {_i = _iterator.next();if(_i.done)break;_ref = _i.value;}var item=_ref;if(valid(key == null?item:item[key])){return item;}}return null;};Cache.prototype.has = function has(key,value){return !!this.get(key,value);};Cache.prototype.getAll = function getAll(key,value){var found=new Cache(this[discrimS]);if(typeof key === 'function'){var valid=key;key = null;}else if(value && value.constructor.name === 'RegExp'){var valid=function valid(item){return value.test(item);};}else if(typeof value !== 'function'){var valid=function valid(item){return item == value;};}for(var _iterator2=this,_isArray2=Array.isArray(_iterator2),_i2=0,_iterator2=_isArray2?_iterator2:_iterator2[Symbol.iterator]();;) {var _ref2;if(_isArray2){if(_i2 >= _iterator2.length)break;_ref2 = _iterator2[_i2++];}else {_i2 = _iterator2.next();if(_i2.done)break;_ref2 = _i2.value;}var item=_ref2;if(valid(key == null?item:item[key])){found.add(item);}}return found;};Cache.prototype.add = function add(data){var cacheKey=data[this[discrimS]];if(this[discrimCacheS][cacheKey]){return this[discrimCacheS][cacheKey];}if(this.limit && this.length >= this.limit){this.splice(0,1);}this.push(data);this[discrimCacheS][cacheKey] = data;return data;};Cache.prototype.update = function update(old,data){var obj=this[discrimCacheS][old[this[discrimS]]];if(obj){for(var key in data) {if(data.hasOwnProperty(key)){obj[key] = data[key];}}return obj;}return false;};Cache.prototype.random = function random(){return this[Math.floor(Math.random() * this.length)];};Cache.prototype.remove = function remove(data){if(!this[discrimCacheS][data[this[discrimS]]])return false;delete this[discrimCacheS][data[this[discrimS]]];for(var i in this) {if(this[i] && this[i][this[discrimS]] === data[this[discrimS]]){this.splice(i,1);return true;}}return false;};return Cache;})(Array);exports["default"] = Cache;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var discrimS = Symbol(); +var discrimCacheS = Symbol(); + +var Cache = (function (_Array) { + _inherits(Cache, _Array); + + function Cache(discrim, limit) { + _classCallCheck(this, Cache); + + _Array.call(this); + this[discrimS] = discrim || "id"; + this[discrimCacheS] = {}; + this.limit = limit; + } + + Cache.prototype.get = function get(key, value) { + if (typeof key === 'function') { + var valid = key; + key = null; + } else if (key && !value) { + return this[discrimCacheS][key] || null; + } else if (key === this[discrimS] && typeof value === "string") { + return this[discrimCacheS][value] || null; + } else if (value && value.constructor.name === 'RegExp') { + var valid = function valid(item) { + return value.test(item); + }; + } else if (typeof value !== 'function') { + var valid = function valid(item) { + return item == value; + }; + } + + for (var _iterator = this, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var item = _ref; + + if (valid(key == null ? item : item[key])) { + return item; + } + } + + return null; + }; + + Cache.prototype.has = function has(key, value) { + return !!this.get(key, value); + }; + + Cache.prototype.getAll = function getAll(key, value) { + var found = new Cache(this[discrimS]); + + if (typeof key === 'function') { + var valid = key; + key = null; + } else if (value && value.constructor.name === 'RegExp') { + var valid = function valid(item) { + return value.test(item); + }; + } else if (typeof value !== 'function') { + var valid = function valid(item) { + return item == value; + }; + } + + for (var _iterator2 = this, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + var item = _ref2; + + if (valid(key == null ? item : item[key])) { + found.add(item); + } + } + + return found; + }; + + Cache.prototype.add = function add(data) { + var cacheKey = data[this[discrimS]]; + if (this[discrimCacheS][cacheKey]) { + return this[discrimCacheS][cacheKey]; + } + if (this.limit && this.length >= this.limit) { + this.splice(0, 1); + } + this.push(data); + this[discrimCacheS][cacheKey] = data; + return data; + }; + + Cache.prototype.update = function update(old, data) { + var obj = this[discrimCacheS][old[this[discrimS]]]; + if (obj) { + for (var key in data) { + if (data.hasOwnProperty(key)) { + obj[key] = data[key]; + } + } + return obj; + } + return false; + }; + + Cache.prototype.random = function random() { + return this[Math.floor(Math.random() * this.length)]; + }; + + Cache.prototype.remove = function remove(data) { + if (!this[discrimCacheS][data[this[discrimS]]]) return false; + + delete this[discrimCacheS][data[this[discrimS]]]; + for (var i in this) { + if (this[i] && this[i][this[discrimS]] === data[this[discrimS]]) { + this.splice(i, 1); + return true; + } + } + return false; + }; + + return Cache; +})(Array); + +exports["default"] = Cache; +module.exports = exports["default"]; diff --git a/lib/Util/Equality.js b/lib/Util/Equality.js index bd131dd79..6c4f7caf7 100644 --- a/lib/Util/Equality.js +++ b/lib/Util/Equality.js @@ -8,5 +8,38 @@ instances sometimes. Instead, use objectThatExtendsEquality.equals() -*/"use strict";exports.__esModule = true;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;};})();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var Equality=(function(){function Equality(){_classCallCheck(this,Equality);}Equality.prototype.equals = function equals(object){return object && object[this.eqDiscriminator] === this[this.eqDiscriminator];};Equality.prototype.equalsStrict = function equalsStrict(object){ // override per class type -return;};_createClass(Equality,[{key:"eqDiscriminator",get:function get(){return "id";}}]);return Equality;})();exports["default"] = Equality;module.exports = exports["default"]; +*/ +"use strict"; + +exports.__esModule = true; + +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; }; })(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Equality = (function () { + function Equality() { + _classCallCheck(this, Equality); + } + + Equality.prototype.equals = function equals(object) { + return object && object[this.eqDiscriminator] === this[this.eqDiscriminator]; + }; + + Equality.prototype.equalsStrict = function equalsStrict(object) { + // override per class type + return; + }; + + _createClass(Equality, [{ + key: "eqDiscriminator", + get: function get() { + return "id"; + } + }]); + + return Equality; +})(); + +exports["default"] = Equality; +module.exports = exports["default"]; diff --git a/lib/Util/TokenCacher-shim.js b/lib/Util/TokenCacher-shim.js index edd0d2397..f483e9575 100644 --- a/lib/Util/TokenCacher-shim.js +++ b/lib/Util/TokenCacher-shim.js @@ -1,2 +1,29 @@ // Shim for the token cacher in the browser. -"use strict";exports.__esModule = true;function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var TokenCacher=(function(){function TokenCacher(){_classCallCheck(this,TokenCacher);}TokenCacher.prototype.setToken = function setToken(){};TokenCacher.prototype.save = function save(){};TokenCacher.prototype.getToken = function getToken(){return null;};TokenCacher.prototype.init = function init(ind){this.done = true;};return TokenCacher;})();exports["default"] = TokenCacher;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var TokenCacher = (function () { + function TokenCacher() { + _classCallCheck(this, TokenCacher); + } + + TokenCacher.prototype.setToken = function setToken() {}; + + TokenCacher.prototype.save = function save() {}; + + TokenCacher.prototype.getToken = function getToken() { + return null; + }; + + TokenCacher.prototype.init = function init(ind) { + this.done = true; + }; + + return TokenCacher; +})(); + +exports["default"] = TokenCacher; +module.exports = exports["default"]; diff --git a/lib/Util/TokenCacher.js b/lib/Util/TokenCacher.js index 626e7279a..7e75b72a3 100644 --- a/lib/Util/TokenCacher.js +++ b/lib/Util/TokenCacher.js @@ -1,12 +1,157 @@ -"use strict"; /* global process */exports.__esModule = true;function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var _fs=require("fs");var _fs2=_interopRequireDefault(_fs);var _events=require("events");var _events2=_interopRequireDefault(_events);var _crypto=require("crypto");var _crypto2=_interopRequireDefault(_crypto);var savePaths=[process.env.APPDATA || (process.platform == "darwin"?process.env.HOME + "Library/Preferences":"/var/local"),process.env[process.platform == "win32"?"USERPROFILE":"HOME"],process.cwd(),"/tmp"];var algo="aes-256-ctr";function secureEmail(email,password){return new Buffer(_crypto2["default"].createHash("sha256").update(email + password,"utf8").digest()).toString("hex");}function exists(path){ // Node deprecated the `fs.exists` method apparently... -try{_fs2["default"].accessSync(path);return true;}catch(e) {return false;}}var TokenCacher=(function(_EventEmitter){_inherits(TokenCacher,_EventEmitter);function TokenCacher(client,options){_classCallCheck(this,TokenCacher);_EventEmitter.call(this);this.client = client;this.savePath = null;this.error = false;this.done = false;this.data = {};}TokenCacher.prototype.setToken = function setToken(){var email=arguments.length <= 0 || arguments[0] === undefined?"":arguments[0];var password=arguments.length <= 1 || arguments[1] === undefined?"":arguments[1];var token=arguments.length <= 2 || arguments[2] === undefined?"":arguments[2];email = secureEmail(email,password);var cipher=_crypto2["default"].createCipher(algo,password);var crypted=cipher.update("valid" + token,"utf8","hex");crypted += cipher.final("hex");this.data[email] = crypted;this.save();};TokenCacher.prototype.save = function save(){_fs2["default"].writeFile(this.savePath,JSON.stringify(this.data));};TokenCacher.prototype.getToken = function getToken(){var email=arguments.length <= 0 || arguments[0] === undefined?"":arguments[0];var password=arguments.length <= 1 || arguments[1] === undefined?"":arguments[1];email = secureEmail(email,password);if(this.data[email]){try{var decipher=_crypto2["default"].createDecipher(algo,password);var dec=decipher.update(this.data[email],"hex","utf8");dec += decipher.final("utf8");return dec.indexOf("valid") === 0?dec.substr(5):false;}catch(e) { // not a valid token -return null;}}else {return null;}};TokenCacher.prototype.init = function init(ind){var _this=this;var self=this;var savePath=savePaths[ind]; // Use one async function at the beginning, so the entire function is async, -// then later use only sync functions to increase readability -_fs2["default"].stat(savePath,function(err,dirStats){ // Directory does not exist. -if(err)error(err);else {try{var storeDirPath=savePath + "/.discordjs";var filePath=storeDirPath + "/tokens.json";if(!exists(storeDirPath)){ // First, make sure the directory exists, otherwise the next -// call will fail. -_fs2["default"].mkdirSync(storeDirPath);}if(!exists(filePath)){ // This will create an empty file if the file doesn't exist, and error -// if it does exist. We previously checked that it doesn't exist so we -// can do this safely. -_fs2["default"].closeSync(_fs2["default"].openSync(filePath,'wx'));}var data=_fs2["default"].readFileSync(filePath);try{_this.data = JSON.parse(data);_this.savePath = filePath;_this.emit('ready');_this.done = true;}catch(e) { // not valid JSON, make it valid and then write -_fs2["default"].writeFileSync(filePath,'{}');_this.savePath = filePath;_this.emit("ready");_this.done = true;}}catch(e) {error(e);}}});function error(e){ind++;if(!savePaths[ind]){self.emit("error");self.error = e;self.done = true;}else {self.init(ind);}}};return TokenCacher;})(_events2["default"]);exports["default"] = TokenCacher;module.exports = exports["default"]; +"use strict"; +/* global process */ + +exports.__esModule = true; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _fs = require("fs"); + +var _fs2 = _interopRequireDefault(_fs); + +var _events = require("events"); + +var _events2 = _interopRequireDefault(_events); + +var _crypto = require("crypto"); + +var _crypto2 = _interopRequireDefault(_crypto); + +var savePaths = [process.env.APPDATA || (process.platform == "darwin" ? process.env.HOME + "Library/Preferences" : "/var/local"), process.env[process.platform == "win32" ? "USERPROFILE" : "HOME"], process.cwd(), "/tmp"]; + +var algo = "aes-256-ctr"; + +function secureEmail(email, password) { + return new Buffer(_crypto2["default"].createHash("sha256").update(email + password, "utf8").digest()).toString("hex"); +} + +function exists(path) { + // Node deprecated the `fs.exists` method apparently... + try { + _fs2["default"].accessSync(path); + return true; + } catch (e) { + return false; + } +} + +var TokenCacher = (function (_EventEmitter) { + _inherits(TokenCacher, _EventEmitter); + + function TokenCacher(client, options) { + _classCallCheck(this, TokenCacher); + + _EventEmitter.call(this); + this.client = client; + this.savePath = null; + this.error = false; + this.done = false; + this.data = {}; + } + + TokenCacher.prototype.setToken = function setToken() { + var email = arguments.length <= 0 || arguments[0] === undefined ? "" : arguments[0]; + var password = arguments.length <= 1 || arguments[1] === undefined ? "" : arguments[1]; + var token = arguments.length <= 2 || arguments[2] === undefined ? "" : arguments[2]; + + email = secureEmail(email, password); + var cipher = _crypto2["default"].createCipher(algo, password); + var crypted = cipher.update("valid" + token, "utf8", "hex"); + crypted += cipher.final("hex"); + this.data[email] = crypted; + this.save(); + }; + + TokenCacher.prototype.save = function save() { + _fs2["default"].writeFile(this.savePath, JSON.stringify(this.data)); + }; + + TokenCacher.prototype.getToken = function getToken() { + var email = arguments.length <= 0 || arguments[0] === undefined ? "" : arguments[0]; + var password = arguments.length <= 1 || arguments[1] === undefined ? "" : arguments[1]; + + email = secureEmail(email, password); + + if (this.data[email]) { + + try { + var decipher = _crypto2["default"].createDecipher(algo, password); + var dec = decipher.update(this.data[email], "hex", "utf8"); + dec += decipher.final("utf8"); + return dec.indexOf("valid") === 0 ? dec.substr(5) : false; + } catch (e) { + // not a valid token + return null; + } + } else { + return null; + } + }; + + TokenCacher.prototype.init = function init(ind) { + var _this = this; + + var self = this; + var savePath = savePaths[ind]; + + // Use one async function at the beginning, so the entire function is async, + // then later use only sync functions to increase readability + _fs2["default"].stat(savePath, function (err, dirStats) { + // Directory does not exist. + if (err) error(err);else { + try { + var storeDirPath = savePath + "/.discordjs"; + var filePath = storeDirPath + "/tokens.json"; + + if (!exists(storeDirPath)) { + // First, make sure the directory exists, otherwise the next + // call will fail. + _fs2["default"].mkdirSync(storeDirPath); + } + if (!exists(filePath)) { + // This will create an empty file if the file doesn't exist, and error + // if it does exist. We previously checked that it doesn't exist so we + // can do this safely. + _fs2["default"].closeSync(_fs2["default"].openSync(filePath, 'wx')); + } + + var data = _fs2["default"].readFileSync(filePath); + try { + _this.data = JSON.parse(data); + _this.savePath = filePath; + _this.emit('ready'); + _this.done = true; + } catch (e) { + // not valid JSON, make it valid and then write + _fs2["default"].writeFileSync(filePath, '{}'); + _this.savePath = filePath; + _this.emit("ready"); + _this.done = true; + } + } catch (e) { + error(e); + } + } + }); + + function error(e) { + ind++; + if (!savePaths[ind]) { + self.emit("error"); + self.error = e; + self.done = true; + } else { + self.init(ind); + } + } + }; + + return TokenCacher; +})(_events2["default"]); + +exports["default"] = TokenCacher; +module.exports = exports["default"]; diff --git a/lib/Voice/AudioEncoder.js b/lib/Voice/AudioEncoder.js index 9df264c61..d6a8b9505 100644 --- a/lib/Voice/AudioEncoder.js +++ b/lib/Voice/AudioEncoder.js @@ -1,3 +1,204 @@ -"use strict";exports.__esModule = true;function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var _child_process=require("child_process");var _child_process2=_interopRequireDefault(_child_process); // no opus! -var _VolumeTransformer=require("./VolumeTransformer");var _VolumeTransformer2=_interopRequireDefault(_VolumeTransformer);var opus;try{opus = require("node-opus");}catch(e) {}var AudioEncoder=(function(){function AudioEncoder(){_classCallCheck(this,AudioEncoder);if(opus){this.opus = new opus.OpusEncoder(48000,2);}this.choice = false;this.sanityCheckPassed = undefined;}AudioEncoder.prototype.sanityCheck = function sanityCheck(){var _opus=this.opus;var encodeZeroes=function encodeZeroes(){try{var zeroes=new Buffer(1920);zeroes.fill(0);return _opus.encode(zeroes,1920).readUIntBE(0,3);}catch(err) {return false;}};if(this.sanityCheckPassed === undefined)this.sanityCheckPassed = encodeZeroes() === 16056318;return this.sanityCheckPassed;};AudioEncoder.prototype.opusBuffer = function opusBuffer(buffer){return this.opus.encode(buffer,1920);};AudioEncoder.prototype.getCommand = function getCommand(force){if(this.choice && force)return choice;var choices=["avconv","ffmpeg"];for(var _iterator=choices,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[Symbol.iterator]();;) {var _ref;if(_isArray){if(_i >= _iterator.length)break;_ref = _iterator[_i++];}else {_i = _iterator.next();if(_i.done)break;_ref = _i.value;}var choice=_ref;var p=_child_process2["default"].spawnSync(choice);if(!p.error){this.choice = choice;return choice;}}return "help";};AudioEncoder.prototype.encodeStream = function encodeStream(stream,options){var _this=this;return new Promise(function(resolve,reject){_this.volume = new _VolumeTransformer2["default"](options.volume);var enc=_child_process2["default"].spawn(_this.getCommand(),['-i','-','-f','s16le','-ar','48000','-ss',options.seek || 0,'-ac',2,'pipe:1']);var dest=stream.pipe(enc.stdin);dest.on('unpipe',function(){return dest.destroy();});dest.on('error',function(err){return dest.destroy();});_this.hookEncodingProcess(resolve,reject,enc,stream);});};AudioEncoder.prototype.encodeFile = function encodeFile(file,options){var _this2=this;return new Promise(function(resolve,reject){_this2.volume = new _VolumeTransformer2["default"](options.volume);var enc=_child_process2["default"].spawn(_this2.getCommand(),['-i',file,'-f','s16le','-ar','48000','-ss',options.seek || 0,'-ac',2,'pipe:1']);_this2.hookEncodingProcess(resolve,reject,enc);});};AudioEncoder.prototype.encodeArbitraryFFmpeg = function encodeArbitraryFFmpeg(ffmpegOptions,volume){var _this3=this;return new Promise(function(resolve,reject){_this3.volume = new _VolumeTransformer2["default"](volume); // add options discord.js needs -var options=ffmpegOptions.concat(['-f','s16le','-ar','48000','-ac',2,'pipe:1']);var enc=_child_process2["default"].spawn(_this3.getCommand(),options);_this3.hookEncodingProcess(resolve,reject,enc);});};AudioEncoder.prototype.hookEncodingProcess = function hookEncodingProcess(resolve,reject,enc,stream){var _this4=this;var processKilled=false;function killProcess(cause){if(processKilled)return;enc.stdin.pause();enc.kill("SIGKILL");processKilled = true;reject(cause);}var ffmpegErrors="";enc.stdout.pipe(this.volume);enc.stderr.on("data",function(data){ffmpegErrors += "\n" + new Buffer(data).toString().trim();});enc.stdout.once("end",function(){killProcess("end");});enc.stdout.once("error",function(){enc.stdout.emit("end");});enc.once("exit",function(code,signal){if(code){reject(new Error("FFMPEG: " + ffmpegErrors));}});this.volume.once("readable",function(){var data={proc:enc,stream:_this4.volume,channels:2};if(stream){data.instream = stream;}resolve(data);});this.volume.once("end",function(){killProcess("end");});this.volume.once("error",function(){killProcess("end");});this.volume.on("end",function(){killProcess("end");});this.volume.on("close",function(){killProcess("close");});};return AudioEncoder;})();exports["default"] = AudioEncoder;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var _child_process = require("child_process"); + +var _child_process2 = _interopRequireDefault(_child_process); + +// no opus! + +var _VolumeTransformer = require("./VolumeTransformer"); + +var _VolumeTransformer2 = _interopRequireDefault(_VolumeTransformer); + +var opus; +try { + opus = require("node-opus"); +} catch (e) {} + +var AudioEncoder = (function () { + function AudioEncoder() { + _classCallCheck(this, AudioEncoder); + + if (opus) { + this.opus = new opus.OpusEncoder(48000, 2); + } + this.choice = false; + this.sanityCheckPassed = undefined; + } + + AudioEncoder.prototype.sanityCheck = function sanityCheck() { + var _opus = this.opus; + var encodeZeroes = function encodeZeroes() { + try { + var zeroes = new Buffer(1920); + zeroes.fill(0); + return _opus.encode(zeroes, 1920).readUIntBE(0, 3); + } catch (err) { + return false; + } + }; + if (this.sanityCheckPassed === undefined) this.sanityCheckPassed = encodeZeroes() === 16056318; + return this.sanityCheckPassed; + }; + + AudioEncoder.prototype.opusBuffer = function opusBuffer(buffer) { + + return this.opus.encode(buffer, 1920); + }; + + AudioEncoder.prototype.getCommand = function getCommand(force) { + if (this.choice && force) return choice; + + var choices = ["avconv", "ffmpeg"]; + + for (var _iterator = choices, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + var choice = _ref; + + var p = _child_process2["default"].spawnSync(choice); + if (!p.error) { + this.choice = choice; + return choice; + } + } + + return "help"; + }; + + AudioEncoder.prototype.encodeStream = function encodeStream(stream, options) { + var _this = this; + + return new Promise(function (resolve, reject) { + _this.volume = new _VolumeTransformer2["default"](options.volume); + + var enc = _child_process2["default"].spawn(_this.getCommand(), ['-i', '-', '-f', 's16le', '-ar', '48000', '-ss', options.seek || 0, '-ac', 2, 'pipe:1']); + + var dest = stream.pipe(enc.stdin); + + dest.on('unpipe', function () { + return dest.destroy(); + }); + dest.on('error', function (err) { + return dest.destroy(); + }); + + _this.hookEncodingProcess(resolve, reject, enc, stream); + }); + }; + + AudioEncoder.prototype.encodeFile = function encodeFile(file, options) { + var _this2 = this; + + return new Promise(function (resolve, reject) { + _this2.volume = new _VolumeTransformer2["default"](options.volume); + + var enc = _child_process2["default"].spawn(_this2.getCommand(), ['-i', file, '-f', 's16le', '-ar', '48000', '-ss', options.seek || 0, '-ac', 2, 'pipe:1']); + + _this2.hookEncodingProcess(resolve, reject, enc); + }); + }; + + AudioEncoder.prototype.encodeArbitraryFFmpeg = function encodeArbitraryFFmpeg(ffmpegOptions, volume) { + var _this3 = this; + + return new Promise(function (resolve, reject) { + _this3.volume = new _VolumeTransformer2["default"](volume); + + // add options discord.js needs + var options = ffmpegOptions.concat(['-f', 's16le', '-ar', '48000', '-ac', 2, 'pipe:1']); + var enc = _child_process2["default"].spawn(_this3.getCommand(), options); + + _this3.hookEncodingProcess(resolve, reject, enc); + }); + }; + + AudioEncoder.prototype.hookEncodingProcess = function hookEncodingProcess(resolve, reject, enc, stream) { + var _this4 = this; + + var processKilled = false; + + function killProcess(cause) { + if (processKilled) return; + + enc.stdin.pause(); + enc.kill("SIGKILL"); + + processKilled = true; + + reject(cause); + } + + var ffmpegErrors = ""; + + enc.stdout.pipe(this.volume); + + enc.stderr.on("data", function (data) { + ffmpegErrors += "\n" + new Buffer(data).toString().trim(); + }); + + enc.stdout.once("end", function () { + killProcess("end"); + }); + + enc.stdout.once("error", function () { + enc.stdout.emit("end"); + }); + + enc.once("exit", function (code, signal) { + if (code) { + reject(new Error("FFMPEG: " + ffmpegErrors)); + } + }); + + this.volume.once("readable", function () { + var data = { + proc: enc, + stream: _this4.volume, + channels: 2 + }; + + if (stream) { + data.instream = stream; + } + + resolve(data); + }); + + this.volume.once("end", function () { + killProcess("end"); + }); + + this.volume.once("error", function () { + killProcess("end"); + }); + + this.volume.on("end", function () { + killProcess("end"); + }); + + this.volume.on("close", function () { + killProcess("close"); + }); + }; + + return AudioEncoder; +})(); + +exports["default"] = AudioEncoder; +module.exports = exports["default"]; diff --git a/lib/Voice/StreamIntent.js b/lib/Voice/StreamIntent.js index 8218edfe1..37b981a14 100644 --- a/lib/Voice/StreamIntent.js +++ b/lib/Voice/StreamIntent.js @@ -1,2 +1,28 @@ -"use strict"; // represents an intent of streaming music -exports.__esModule = true;function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var _events=require("events");var _events2=_interopRequireDefault(_events);var StreamIntent=(function(_EventEmitter){_inherits(StreamIntent,_EventEmitter);function StreamIntent(){_classCallCheck(this,StreamIntent);_EventEmitter.call(this);}return StreamIntent;})(_events2["default"]);exports["default"] = StreamIntent;module.exports = exports["default"]; +"use strict"; +// represents an intent of streaming music +exports.__esModule = true; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _events = require("events"); + +var _events2 = _interopRequireDefault(_events); + +var StreamIntent = (function (_EventEmitter) { + _inherits(StreamIntent, _EventEmitter); + + function StreamIntent() { + _classCallCheck(this, StreamIntent); + + _EventEmitter.call(this); + } + + return StreamIntent; +})(_events2["default"]); + +exports["default"] = StreamIntent; +module.exports = exports["default"]; diff --git a/lib/Voice/VoiceConnection.js b/lib/Voice/VoiceConnection.js index 9e5957397..bf7d78464 100644 --- a/lib/Voice/VoiceConnection.js +++ b/lib/Voice/VoiceConnection.js @@ -1,14 +1,522 @@ -"use strict"; /* +"use strict"; +/* Major credit to izy521 who is the creator of https://github.com/izy521/discord.io, without his help voice chat in discord.js would not have been possible! -*/exports.__esModule = true;function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var _ws=require("ws");var _ws2=_interopRequireDefault(_ws);var _dns=require("dns");var _dns2=_interopRequireDefault(_dns);var _dgram=require("dgram");var _dgram2=_interopRequireDefault(_dgram);var _AudioEncoder=require("./AudioEncoder");var _AudioEncoder2=_interopRequireDefault(_AudioEncoder);var _VoicePacket=require("./VoicePacket");var _VoicePacket2=_interopRequireDefault(_VoicePacket);var _VolumeTransformer=require("./VolumeTransformer");var _VolumeTransformer2=_interopRequireDefault(_VolumeTransformer);var _StreamIntent=require("./StreamIntent");var _StreamIntent2=_interopRequireDefault(_StreamIntent);var _events=require("events");var _events2=_interopRequireDefault(_events);var _unpipe=require("unpipe");var _unpipe2=_interopRequireDefault(_unpipe);var MODE_xsalsa20_poly1305="xsalsa20_poly1305";var MODE_plain="plain";var VoiceConnection=(function(_EventEmitter){_inherits(VoiceConnection,_EventEmitter);function VoiceConnection(channel,client,session,token,server,endpoint){_classCallCheck(this,VoiceConnection);_EventEmitter.call(this);this.id = channel.id;this.voiceChannel = channel;this.client = client;this.session = session;this.token = token;this.server = server;this.endpoint = endpoint.split(":")[0];this.vWS = null; // vWS means voice websocket -this.ready = false;this.vWSData = {};this.encoder = new _AudioEncoder2["default"]();this.udp = null;this.playingIntent = null;this.playing = false;this.streamTime = 0;this.streamProc = null;this.KAI = null;this.timestamp = 0;this.sequence = 0;this.mode = null;this.secret = null;this.volume = new _VolumeTransformer2["default"]();this.paused = false;this.init();}VoiceConnection.prototype.destroy = function destroy(){this.stopPlaying();if(this.KAI){clearInterval(this.KAI);}this.client.internal.sendWS({op:4,d:{guild_id:this.server.id,channel_id:null,self_mute:true,self_deaf:false}});this.client.internal.voiceConnections.remove(this);try{this.vWS.close();}catch(e) {}try{this.udp.close();}catch(e) {}};VoiceConnection.prototype.stopPlaying = function stopPlaying(){this.playing = false;this.playingIntent = null;if(this.instream){ //not all streams implement these... -//and even file stream don't seem to implement them properly... -_unpipe2["default"](this.instream);if(this.instream.end){this.instream.end();}if(this.instream.destroy){this.instream.destroy();}this.instream = null;}if(this.streamProc){this.streamProc.stdin.pause();this.streamProc.kill("SIGKILL");this.streamProc = null;}};VoiceConnection.prototype.playStream = function playStream(stream){var channels=arguments.length <= 1 || arguments[1] === undefined?2:arguments[1];var self=this,startTime=Date.now(),count=0,length=20,retStream=new _StreamIntent2["default"](),onWarning=false;this.volume = stream;this.playing = true;this.playingIntent = retStream;function send(){if(self.paused){startTime += Date.now() - (startTime + count * length);setTimeout(send,length);return;}if(!self.playingIntent || !self.playing){self.setSpeaking(false);self.stopPlaying();retStream.emit("end");return;}try{var buffer=stream.read(1920 * channels);if(!buffer){if(onWarning){self.setSpeaking(false);self.stopPlaying();retStream.emit("end");return;}else {onWarning = true;setTimeout(send,length * 10); // give chance for some data in 200ms to appear -return;}}if(buffer.length !== 1920 * channels){var newBuffer=new Buffer(1920 * channels).fill(0);buffer.copy(newBuffer);buffer = newBuffer;}count++;self.sequence + 1 < 65535?self.sequence += 1:self.sequence = 0;self.timestamp + 960 < 4294967295?self.timestamp += 960:self.timestamp = 0;self.sendBuffer(buffer,self.sequence,self.timestamp,function(e){});var nextTime=startTime + count * length;self.streamTime = count * length;setTimeout(send,length + (nextTime - Date.now()));if(!self.playing)self.setSpeaking(true);retStream.emit("time",self.streamTime);}catch(e) {retStream.emit("error",e);}}self.setSpeaking(true);send();return retStream;};VoiceConnection.prototype.setSpeaking = function setSpeaking(value){this.playing = value;if(this.vWS.readyState === _ws2["default"].OPEN)this.vWS.send(JSON.stringify({op:5,d:{speaking:value,delay:0}}));};VoiceConnection.prototype.sendPacket = function sendPacket(packet){var callback=arguments.length <= 1 || arguments[1] === undefined?function(err){}:arguments[1];var self=this;self.playing = true;try{if(self.vWS.readyState === _ws2["default"].OPEN)self.udp.send(packet,0,packet.length,self.vWSData.port,self.endpoint,callback);}catch(e) {self.playing = false;callback(e);return false;}};VoiceConnection.prototype.sendBuffer = function sendBuffer(rawbuffer,sequence,timestamp,callback){var self=this;self.playing = true;try{if(!self.encoder.opus){self.playing = false;throw new Error("node-opus not found! Perhaps you didn't install it.");return;}if(!self.encoder.sanityCheck()){self.playing = false;throw new Error("node-opus sanity check failed! Try re-installing node-opus.");return;}var buffer=self.encoder.opusBuffer(rawbuffer);var packet=new _VoicePacket2["default"](buffer,sequence,timestamp,self.vWSData.ssrc,self.secret);return self.sendPacket(packet,callback);}catch(e) {self.playing = false;self.emit("error",e);return false;}};VoiceConnection.prototype.playFile = function playFile(stream){var _this=this;var options=arguments.length <= 1 || arguments[1] === undefined?false:arguments[1];var callback=arguments.length <= 2 || arguments[2] === undefined?function(err,str){}:arguments[2];var self=this;self.stopPlaying();if(typeof options === "function"){ // options is the callback -callback = options;}if(typeof options !== "object"){options = {};}options.volume = options.volume !== undefined?options.volume:this.getVolume();return new Promise(function(resolve,reject){_this.encoder.encodeFile(stream,options)["catch"](error).then(function(data){self.streamProc = data.proc;var intent=self.playStream(data.stream,2);resolve(intent);callback(null,intent);});function error(){var e=arguments.length <= 0 || arguments[0] === undefined?true:arguments[0];reject(e);callback(e);}});};VoiceConnection.prototype.playRawStream = function playRawStream(stream){var _this2=this;var options=arguments.length <= 1 || arguments[1] === undefined?false:arguments[1];var callback=arguments.length <= 2 || arguments[2] === undefined?function(err,str){}:arguments[2];var self=this;self.stopPlaying();if(typeof options === "function"){ // options is the callback -callback = options;}if(typeof options !== "object"){options = {};}options.volume = options.volume !== undefined?options.volume:this.getVolume();return new Promise(function(resolve,reject){_this2.encoder.encodeStream(stream,options)["catch"](error).then(function(data){self.streamProc = data.proc;self.instream = data.instream;var intent=self.playStream(data.stream);resolve(intent);callback(null,intent);});function error(){var e=arguments.length <= 0 || arguments[0] === undefined?true:arguments[0];reject(e);callback(e);}});};VoiceConnection.prototype.playArbitraryFFmpeg = function playArbitraryFFmpeg(ffmpegOptions,volume){var _this3=this;var callback=arguments.length <= 2 || arguments[2] === undefined?function(err,str){}:arguments[2];var self=this;self.stopPlaying();if(typeof volume === "function"){ // volume is the callback -callback = volume;}if(!ffmpegOptions instanceof Array){ffmpegOptions = [];}var volume=volume !== undefined?volume:this.getVolume();return new Promise(function(resolve,reject){_this3.encoder.encodeArbitraryFFmpeg(ffmpegOptions,volume)["catch"](error).then(function(data){self.streamProc = data.proc;self.instream = data.instream;var intent=self.playStream(data.stream);resolve(intent);callback(null,intent);});function error(){var e=arguments.length <= 0 || arguments[0] === undefined?true:arguments[0];reject(e);callback(e);}});};VoiceConnection.prototype.init = function init(){var _this4=this;var self=this;_dns2["default"].lookup(this.endpoint,function(err,address,family){var vWS=self.vWS = new _ws2["default"]("wss://" + _this4.endpoint,null,{rejectUnauthorized:false});_this4.endpoint = address;var udpClient=self.udp = _dgram2["default"].createSocket("udp4");var firstPacket=true;var discordIP="",discordPort="";udpClient.bind({exclusive:true});udpClient.on('message',function(msg,rinfo){var buffArr=JSON.parse(JSON.stringify(msg)).data;if(firstPacket === true){for(var i=4;i < buffArr.indexOf(0,i);i++) {discordIP += String.fromCharCode(buffArr[i]);}discordPort = msg.readUIntLE(msg.length - 2,2).toString(10);var modes=self.vWSData.modes;var mode=MODE_xsalsa20_poly1305;if(modes.indexOf(MODE_xsalsa20_poly1305) < 0){mode = MODE_plain;self.client.emit("debug","Encrypted mode not reported as supported by the server, using 'plain'");}vWS.send(JSON.stringify({"op":1,"d":{"protocol":"udp","data":{"address":discordIP,"port":Number(discordPort),"mode":mode}}}));firstPacket = false;}});vWS.on("open",function(){vWS.send(JSON.stringify({op:0,d:{server_id:self.server.id,user_id:self.client.internal.user.id,session_id:self.session,token:self.token}}));});var KAI;vWS.on("message",function(msg){var data=JSON.parse(msg);switch(data.op){case 2:self.vWSData = data.d;self.KAI = KAI = self.client.internal.intervals.misc["voiceKAI"] = setInterval(function(){if(vWS && vWS.readyState === _ws2["default"].OPEN)vWS.send(JSON.stringify({op:3,d:null}));},data.d.heartbeat_interval);var udpPacket=new Buffer(70);udpPacket.writeUIntBE(data.d.ssrc,0,4);udpClient.send(udpPacket,0,udpPacket.length,data.d.port,self.endpoint,function(err){if(err)self.emit("error",err);});break;case 4:if(data.d.secret_key && data.d.secret_key.length > 0){var buffer=new ArrayBuffer(data.d.secret_key.length);self.secret = new Uint8Array(buffer);for(var i=0;i < _this4.secret.length;i++) {self.secret[i] = data.d.secret_key[i];}}self.ready = true;self.mode = data.d.mode;self.emit("ready",self);break;case 5:var user=self.server.members.get("id",data.d.user_id);if(user){var speaking=data.d.speaking;var channel=user.voiceChannel;if(channel){user.speaking = speaking;self.client.emit("voiceSpeaking",channel,user);}else {self.client.emit("warn","channel doesn't exist even though SPEAKING expects them to");}}else {self.client.emit("warn","user doesn't exist even though SPEAKING expects them to");}break;}});vWS.on("error",function(err,msg){self.emit("error",err,msg);});vWS.on("close",function(code){self.emit("close",code);});});};VoiceConnection.prototype.wrapVolume = function wrapVolume(stream){stream.pipe(this.volume);return this.volume;};VoiceConnection.prototype.setVolume = function setVolume(volume){this.volume.set(volume);};VoiceConnection.prototype.getVolume = function getVolume(){return this.volume.get();};VoiceConnection.prototype.mute = function mute(){this.lastVolume = this.volume.get();this.setVolume(0);};VoiceConnection.prototype.unmute = function unmute(){this.setVolume(this.lastVolume);this.lastVolume = undefined;};VoiceConnection.prototype.pause = function pause(){this.paused = true;this.setSpeaking(false);this.playingIntent.emit("pause");};VoiceConnection.prototype.resume = function resume(){this.paused = false;this.setSpeaking(true);this.playingIntent.emit("resume");};return VoiceConnection;})(_events2["default"]);exports["default"] = VoiceConnection;module.exports = exports["default"]; +*/ + +exports.__esModule = true; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _ws = require("ws"); + +var _ws2 = _interopRequireDefault(_ws); + +var _dns = require("dns"); + +var _dns2 = _interopRequireDefault(_dns); + +var _dgram = require("dgram"); + +var _dgram2 = _interopRequireDefault(_dgram); + +var _AudioEncoder = require("./AudioEncoder"); + +var _AudioEncoder2 = _interopRequireDefault(_AudioEncoder); + +var _VoicePacket = require("./VoicePacket"); + +var _VoicePacket2 = _interopRequireDefault(_VoicePacket); + +var _VolumeTransformer = require("./VolumeTransformer"); + +var _VolumeTransformer2 = _interopRequireDefault(_VolumeTransformer); + +var _StreamIntent = require("./StreamIntent"); + +var _StreamIntent2 = _interopRequireDefault(_StreamIntent); + +var _events = require("events"); + +var _events2 = _interopRequireDefault(_events); + +var _unpipe = require("unpipe"); + +var _unpipe2 = _interopRequireDefault(_unpipe); + +var MODE_xsalsa20_poly1305 = "xsalsa20_poly1305"; +var MODE_plain = "plain"; + +var VoiceConnection = (function (_EventEmitter) { + _inherits(VoiceConnection, _EventEmitter); + + function VoiceConnection(channel, client, session, token, server, endpoint) { + _classCallCheck(this, VoiceConnection); + + _EventEmitter.call(this); + this.id = channel.id; + this.voiceChannel = channel; + this.client = client; + this.session = session; + this.token = token; + this.server = server; + this.endpoint = endpoint.split(":")[0]; + this.vWS = null; // vWS means voice websocket + this.ready = false; + this.vWSData = {}; + this.encoder = new _AudioEncoder2["default"](); + this.udp = null; + this.playingIntent = null; + this.playing = false; + this.streamTime = 0; + this.streamProc = null; + this.KAI = null; + this.timestamp = 0; + this.sequence = 0; + + this.mode = null; + this.secret = null; + + this.volume = new _VolumeTransformer2["default"](); + this.paused = false; + this.init(); + } + + VoiceConnection.prototype.destroy = function destroy() { + this.stopPlaying(); + if (this.KAI) { + clearInterval(this.KAI); + } + this.client.internal.sendWS({ + op: 4, + d: { + guild_id: this.server.id, + channel_id: null, + self_mute: true, + self_deaf: false + } + }); + this.client.internal.voiceConnections.remove(this); + try { + this.vWS.close(); + } catch (e) {} + try { + this.udp.close(); + } catch (e) {} + }; + + VoiceConnection.prototype.stopPlaying = function stopPlaying() { + this.playing = false; + this.playingIntent = null; + if (this.instream) { + //not all streams implement these... + //and even file stream don't seem to implement them properly... + _unpipe2["default"](this.instream); + if (this.instream.end) { + this.instream.end(); + } + if (this.instream.destroy) { + this.instream.destroy(); + } + this.instream = null; + } + if (this.streamProc) { + this.streamProc.stdin.pause(); + this.streamProc.kill("SIGKILL"); + this.streamProc = null; + } + }; + + VoiceConnection.prototype.playStream = function playStream(stream) { + var channels = arguments.length <= 1 || arguments[1] === undefined ? 2 : arguments[1]; + + var self = this, + startTime = Date.now(), + count = 0, + length = 20, + retStream = new _StreamIntent2["default"](), + onWarning = false; + + this.volume = stream; + this.playing = true; + this.playingIntent = retStream; + + function send() { + if (self.paused) { + startTime += Date.now() - (startTime + count * length); + setTimeout(send, length); + return; + } + if (!self.playingIntent || !self.playing) { + self.setSpeaking(false); + self.stopPlaying(); + retStream.emit("end"); + return; + } + try { + + var buffer = stream.read(1920 * channels); + + if (!buffer) { + if (onWarning) { + self.setSpeaking(false); + self.stopPlaying(); + retStream.emit("end"); + return; + } else { + onWarning = true; + setTimeout(send, length * 10); // give chance for some data in 200ms to appear + return; + } + } + + if (buffer.length !== 1920 * channels) { + var newBuffer = new Buffer(1920 * channels).fill(0); + buffer.copy(newBuffer); + buffer = newBuffer; + } + + count++; + self.sequence + 1 < 65535 ? self.sequence += 1 : self.sequence = 0; + self.timestamp + 960 < 4294967295 ? self.timestamp += 960 : self.timestamp = 0; + + self.sendBuffer(buffer, self.sequence, self.timestamp, function (e) {}); + + var nextTime = startTime + count * length; + + self.streamTime = count * length; + + setTimeout(send, length + (nextTime - Date.now())); + + if (!self.playing) self.setSpeaking(true); + + retStream.emit("time", self.streamTime); + } catch (e) { + retStream.emit("error", e); + } + } + self.setSpeaking(true); + send(); + + return retStream; + }; + + VoiceConnection.prototype.setSpeaking = function setSpeaking(value) { + this.playing = value; + if (this.vWS.readyState === _ws2["default"].OPEN) this.vWS.send(JSON.stringify({ + op: 5, + d: { + speaking: value, + delay: 0 + } + })); + }; + + VoiceConnection.prototype.sendPacket = function sendPacket(packet) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function (err) {} : arguments[1]; + + var self = this; + self.playing = true; + try { + if (self.vWS.readyState === _ws2["default"].OPEN) self.udp.send(packet, 0, packet.length, self.vWSData.port, self.endpoint, callback); + } catch (e) { + self.playing = false; + callback(e); + return false; + } + }; + + VoiceConnection.prototype.sendBuffer = function sendBuffer(rawbuffer, sequence, timestamp, callback) { + var self = this; + self.playing = true; + try { + if (!self.encoder.opus) { + self.playing = false; + throw new Error("node-opus not found! Perhaps you didn't install it."); + return; + } + + if (!self.encoder.sanityCheck()) { + self.playing = false; + throw new Error("node-opus sanity check failed! Try re-installing node-opus."); + return; + } + + var buffer = self.encoder.opusBuffer(rawbuffer); + var packet = new _VoicePacket2["default"](buffer, sequence, timestamp, self.vWSData.ssrc, self.secret); + return self.sendPacket(packet, callback); + } catch (e) { + self.playing = false; + self.emit("error", e); + return false; + } + }; + + VoiceConnection.prototype.playFile = function playFile(stream) { + var _this = this; + + var options = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err, str) {} : arguments[2]; + + var self = this; + self.stopPlaying(); + if (typeof options === "function") { + // options is the callback + callback = options; + } + if (typeof options !== "object") { + options = {}; + } + options.volume = options.volume !== undefined ? options.volume : this.getVolume(); + return new Promise(function (resolve, reject) { + _this.encoder.encodeFile(stream, options)["catch"](error).then(function (data) { + self.streamProc = data.proc; + var intent = self.playStream(data.stream, 2); + resolve(intent); + callback(null, intent); + }); + function error() { + var e = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; + + reject(e); + callback(e); + } + }); + }; + + VoiceConnection.prototype.playRawStream = function playRawStream(stream) { + var _this2 = this; + + var options = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err, str) {} : arguments[2]; + + var self = this; + self.stopPlaying(); + if (typeof options === "function") { + // options is the callback + callback = options; + } + if (typeof options !== "object") { + options = {}; + } + options.volume = options.volume !== undefined ? options.volume : this.getVolume(); + return new Promise(function (resolve, reject) { + _this2.encoder.encodeStream(stream, options)["catch"](error).then(function (data) { + self.streamProc = data.proc; + self.instream = data.instream; + var intent = self.playStream(data.stream); + resolve(intent); + callback(null, intent); + }); + function error() { + var e = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; + + reject(e); + callback(e); + } + }); + }; + + VoiceConnection.prototype.playArbitraryFFmpeg = function playArbitraryFFmpeg(ffmpegOptions, volume) { + var _this3 = this; + + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err, str) {} : arguments[2]; + + var self = this; + self.stopPlaying(); + if (typeof volume === "function") { + // volume is the callback + callback = volume; + } + if (!ffmpegOptions instanceof Array) { + ffmpegOptions = []; + } + var volume = volume !== undefined ? volume : this.getVolume(); + return new Promise(function (resolve, reject) { + _this3.encoder.encodeArbitraryFFmpeg(ffmpegOptions, volume)["catch"](error).then(function (data) { + self.streamProc = data.proc; + self.instream = data.instream; + var intent = self.playStream(data.stream); + resolve(intent); + callback(null, intent); + }); + function error() { + var e = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0]; + + reject(e); + callback(e); + } + }); + }; + + VoiceConnection.prototype.init = function init() { + var _this4 = this; + + var self = this; + _dns2["default"].lookup(this.endpoint, function (err, address, family) { + var vWS = self.vWS = new _ws2["default"]("wss://" + _this4.endpoint, null, { rejectUnauthorized: false }); + _this4.endpoint = address; + var udpClient = self.udp = _dgram2["default"].createSocket("udp4"); + + var firstPacket = true; + + var discordIP = "", + discordPort = ""; + + udpClient.bind({ exclusive: true }); + udpClient.on('message', function (msg, rinfo) { + var buffArr = JSON.parse(JSON.stringify(msg)).data; + if (firstPacket === true) { + for (var i = 4; i < buffArr.indexOf(0, i); i++) { + discordIP += String.fromCharCode(buffArr[i]); + } + discordPort = msg.readUIntLE(msg.length - 2, 2).toString(10); + + var modes = self.vWSData.modes; + var mode = MODE_xsalsa20_poly1305; + if (modes.indexOf(MODE_xsalsa20_poly1305) < 0) { + mode = MODE_plain; + self.client.emit("debug", "Encrypted mode not reported as supported by the server, using 'plain'"); + } + + vWS.send(JSON.stringify({ + "op": 1, + "d": { + "protocol": "udp", + "data": { + "address": discordIP, + "port": Number(discordPort), + "mode": mode + } + } + })); + firstPacket = false; + } + }); + + vWS.on("open", function () { + vWS.send(JSON.stringify({ + op: 0, + d: { + server_id: self.server.id, + user_id: self.client.internal.user.id, + session_id: self.session, + token: self.token + } + })); + }); + + var KAI; + + vWS.on("message", function (msg) { + var data = JSON.parse(msg); + switch (data.op) { + case 2: + self.vWSData = data.d; + + self.KAI = KAI = self.client.internal.intervals.misc["voiceKAI"] = setInterval(function () { + if (vWS && vWS.readyState === _ws2["default"].OPEN) vWS.send(JSON.stringify({ + op: 3, + d: null + })); + }, data.d.heartbeat_interval); + + var udpPacket = new Buffer(70); + udpPacket.writeUIntBE(data.d.ssrc, 0, 4); + udpClient.send(udpPacket, 0, udpPacket.length, data.d.port, self.endpoint, function (err) { + if (err) self.emit("error", err); + }); + break; + case 4: + if (data.d.secret_key && data.d.secret_key.length > 0) { + var buffer = new ArrayBuffer(data.d.secret_key.length); + self.secret = new Uint8Array(buffer); + for (var i = 0; i < _this4.secret.length; i++) { + self.secret[i] = data.d.secret_key[i]; + } + } + + self.ready = true; + self.mode = data.d.mode; + self.emit("ready", self); + + break; + case 5: + var user = self.server.members.get("id", data.d.user_id); + + if (user) { + var speaking = data.d.speaking; + var channel = user.voiceChannel; + + if (channel) { + user.speaking = speaking; + self.client.emit("voiceSpeaking", channel, user); + } else { + self.client.emit("warn", "channel doesn't exist even though SPEAKING expects them to"); + } + } else { + self.client.emit("warn", "user doesn't exist even though SPEAKING expects them to"); + } + + break; + } + }); + + vWS.on("error", function (err, msg) { + self.emit("error", err, msg); + }); + + vWS.on("close", function (code) { + self.emit("close", code); + }); + }); + }; + + VoiceConnection.prototype.wrapVolume = function wrapVolume(stream) { + stream.pipe(this.volume); + + return this.volume; + }; + + VoiceConnection.prototype.setVolume = function setVolume(volume) { + this.volume.set(volume); + }; + + VoiceConnection.prototype.getVolume = function getVolume() { + return this.volume.get(); + }; + + VoiceConnection.prototype.mute = function mute() { + this.lastVolume = this.volume.get(); + this.setVolume(0); + }; + + VoiceConnection.prototype.unmute = function unmute() { + this.setVolume(this.lastVolume); + this.lastVolume = undefined; + }; + + VoiceConnection.prototype.pause = function pause() { + this.paused = true; + this.setSpeaking(false); + this.playingIntent.emit("pause"); + }; + + VoiceConnection.prototype.resume = function resume() { + this.paused = false; + this.setSpeaking(true); + this.playingIntent.emit("resume"); + }; + + return VoiceConnection; +})(_events2["default"]); + +exports["default"] = VoiceConnection; +module.exports = exports["default"]; diff --git a/lib/Voice/VoicePacket.js b/lib/Voice/VoicePacket.js index f604ad9d4..df10e3c68 100644 --- a/lib/Voice/VoicePacket.js +++ b/lib/Voice/VoicePacket.js @@ -1,3 +1,51 @@ -"use strict";exports.__esModule = true;function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var nacl;try{nacl = require("tweetnacl");}catch(e) { // no tweetnacl! -}var nonce=new Buffer(24);nonce.fill(0);var VoicePacket=function VoicePacket(data,sequence,time,ssrc,secret){_classCallCheck(this,VoicePacket);if(!nacl){throw new Error("tweetnacl not found! Perhaps you didn't install it.");}var mac=secret?16:0;var packetLength=data.length + 12 + mac;var audioBuffer=data;var returnBuffer=new Buffer(packetLength);returnBuffer.fill(0);returnBuffer[0] = 0x80;returnBuffer[1] = 0x78;returnBuffer.writeUIntBE(sequence,2,2);returnBuffer.writeUIntBE(time,4,4);returnBuffer.writeUIntBE(ssrc,8,4);if(secret){ // copy first 12 bytes -returnBuffer.copy(nonce,0,0,12);audioBuffer = nacl.secretbox(data,nonce,secret);}for(var i=0;i < audioBuffer.length;i++) {returnBuffer[i + 12] = audioBuffer[i];}return returnBuffer;};exports["default"] = VoicePacket;module.exports = exports["default"]; +"use strict"; + +exports.__esModule = true; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var nacl; +try { + nacl = require("tweetnacl"); +} catch (e) { + // no tweetnacl! +} + +var nonce = new Buffer(24); +nonce.fill(0); + +var VoicePacket = function VoicePacket(data, sequence, time, ssrc, secret) { + _classCallCheck(this, VoicePacket); + + if (!nacl) { + throw new Error("tweetnacl not found! Perhaps you didn't install it."); + } + var mac = secret ? 16 : 0; + var packetLength = data.length + 12 + mac; + + var audioBuffer = data; + var returnBuffer = new Buffer(packetLength); + + returnBuffer.fill(0); + returnBuffer[0] = 0x80; + returnBuffer[1] = 0x78; + + returnBuffer.writeUIntBE(sequence, 2, 2); + returnBuffer.writeUIntBE(time, 4, 4); + returnBuffer.writeUIntBE(ssrc, 8, 4); + + if (secret) { + // copy first 12 bytes + returnBuffer.copy(nonce, 0, 0, 12); + audioBuffer = nacl.secretbox(data, nonce, secret); + } + + for (var i = 0; i < audioBuffer.length; i++) { + returnBuffer[i + 12] = audioBuffer[i]; + } + + return returnBuffer; +}; + +exports["default"] = VoicePacket; +module.exports = exports["default"]; diff --git a/lib/Voice/VolumeTransformer.js b/lib/Voice/VolumeTransformer.js index d772fb22c..b0b1f5c48 100644 --- a/lib/Voice/VolumeTransformer.js +++ b/lib/Voice/VolumeTransformer.js @@ -1,13 +1,91 @@ -'use strict';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;};})();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError('Cannot call a class as a function');}}function _inherits(subClass,superClass){if(typeof superClass !== 'function' && superClass !== null){throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var Transform=require('stream').Transform; /** +'use strict'; + +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; }; })(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var Transform = require('stream').Transform; + +/** * @see https://github.com/reneraab/pcm-volume/blob/master/index.js Inspired by this script - */var Volume=(function(_Transform){_inherits(Volume,_Transform);function Volume(volume){_classCallCheck(this,Volume);_Transform.call(this);this.set(volume);} // Set the volume so that a value of 0.5 is half the perceived volume and -// 2.0 is double the perceived volume. -Volume.prototype.setVolumeLogarithmic = function setVolumeLogarithmic(value){this.volume = Math.pow(value,1.660964);}; // Set the volume to a value specified as decibels. -Volume.prototype.setVolumeDecibels = function setVolumeDecibels(db){this.volume = Math.pow(10,db / 20);};Volume.prototype.get = function get(){return this.volume;};Volume.prototype.set = function set(volume){this.volume = volume === undefined?1:volume;};Volume.prototype._transform = function _transform(buffer,encoding,callback){var out=new Buffer(buffer.length);for(var i=0;i < buffer.length;i += 2) { // Check whether the index is actually in range - sometimes it's possible -// that it skips ahead too far before the end condition of the for can -// kick in. -if(i >= buffer.length - 1){break;} // Read Int16, multiple with multiplier and round down -//console.log(this.volume, this.multiplier, buffer.readInt16LE(i)); -var uint=Math.floor(this.multiplier * buffer.readInt16LE(i)); // Ensure value stays within 16bit -uint = Math.min(32767,uint);uint = Math.max(-32767,uint); // Write 2 new bytes into other buffer; -out.writeInt16LE(uint,i);}this.push(out);callback();};_createClass(Volume,[{key:'volume',get:function get(){return this._volume === undefined?1:this._volume;},set:function set(value){this._volume = value;}},{key:'multiplier',get:function get(){return this.volume;}}]);return Volume;})(Transform);module.exports = Volume; + */ + +var Volume = (function (_Transform) { + _inherits(Volume, _Transform); + + function Volume(volume) { + _classCallCheck(this, Volume); + + _Transform.call(this); + this.set(volume); + } + + // Set the volume so that a value of 0.5 is half the perceived volume and + // 2.0 is double the perceived volume. + + Volume.prototype.setVolumeLogarithmic = function setVolumeLogarithmic(value) { + this.volume = Math.pow(value, 1.660964); + }; + + // Set the volume to a value specified as decibels. + + Volume.prototype.setVolumeDecibels = function setVolumeDecibels(db) { + this.volume = Math.pow(10, db / 20); + }; + + Volume.prototype.get = function get() { + return this.volume; + }; + + Volume.prototype.set = function set(volume) { + this.volume = volume === undefined ? 1 : volume; + }; + + Volume.prototype._transform = function _transform(buffer, encoding, callback) { + var out = new Buffer(buffer.length); + + for (var i = 0; i < buffer.length; i += 2) { + // Check whether the index is actually in range - sometimes it's possible + // that it skips ahead too far before the end condition of the for can + // kick in. + if (i >= buffer.length - 1) { + break; + } + + // Read Int16, multiple with multiplier and round down + //console.log(this.volume, this.multiplier, buffer.readInt16LE(i)); + var uint = Math.floor(this.multiplier * buffer.readInt16LE(i)); + + // Ensure value stays within 16bit + uint = Math.min(32767, uint); + uint = Math.max(-32767, uint); + + // Write 2 new bytes into other buffer; + out.writeInt16LE(uint, i); + } + + this.push(out); + callback(); + }; + + _createClass(Volume, [{ + key: 'volume', + get: function get() { + return this._volume === undefined ? 1 : this._volume; + }, + set: function set(value) { + this._volume = value; + } + }, { + key: 'multiplier', + get: function get() { + return this.volume; + } + }]); + + return Volume; +})(Transform); + +module.exports = Volume; diff --git a/lib/index.js b/lib/index.js index 24320a9f2..f66bbebfc 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,23 +1,114 @@ -"use strict"; /** +"use strict"; + +/** * Object containing user agent data required for API requests. * @typedef {(object)} UserAgent * @property {string} [url=https://github.com/hydrabolt/discord.js] URL to the repository/homepage of the creator. * @property {string} [version=6.0.0] version of your bot. * @property {string} full stringified user-agent that is generate automatically upon changes. Read-only. -*/ /** +*/ + +/** * Object containing properties that can be used to alter the client's functionality. * @typedef {(object)} ClientOptions * @property {boolean} [compress=true] whether or not large packets that are sent over WebSockets should be compressed. * @property {boolean} [autoReconnect=false] whether the Client should attempt to automatically reconnect if it is disconnected. * @property {boolean} [rateLimitAsError=false] whether rejections to API requests due to rate-limiting should be treated as errors. * @property {Number} [largeThreshold=250] an integer between 0 and 250. When a server has more users than `options.largeThreshold`, only the online/active users are cached. -*/ /** +*/ + +/** * Object containing properties that will be applied when deleting messages * @typedef {(object)} MessageDeletionOptions * @property {Number} [wait] If set, the message will be deleted after `options.wait` milliseconds. - */ /** + */ + +/** * Object containing properties that will be used when fetching channel logs. You cannot specify _both_ `options.before` and `options.after` * @typedef {(object)} ChannelLogsOptions * @property {MessageResolvable} [before] When fetching logs, it will fetch from messages before `options.before` but not including it. * @property {MessageResolvable} [after] When fetching logs, it will fetch from messages after `options.after` but not including it. - */exports.__esModule = true;function _interopRequireDefault(obj){return obj && obj.__esModule?obj:{"default":obj};}var _ClientClient=require("./Client/Client");var _ClientClient2=_interopRequireDefault(_ClientClient);var _StructuresChannel=require("./Structures/Channel");var _StructuresChannel2=_interopRequireDefault(_StructuresChannel);var _StructuresChannelPermissions=require("./Structures/ChannelPermissions");var _StructuresChannelPermissions2=_interopRequireDefault(_StructuresChannelPermissions);var _StructuresInvite=require("./Structures/Invite");var _StructuresInvite2=_interopRequireDefault(_StructuresInvite);var _StructuresMessage=require("./Structures/Message");var _StructuresMessage2=_interopRequireDefault(_StructuresMessage);var _StructuresPermissionOverwrite=require("./Structures/PermissionOverwrite");var _StructuresPermissionOverwrite2=_interopRequireDefault(_StructuresPermissionOverwrite);var _StructuresPMChannel=require("./Structures/PMChannel");var _StructuresPMChannel2=_interopRequireDefault(_StructuresPMChannel);var _StructuresRole=require("./Structures/Role");var _StructuresRole2=_interopRequireDefault(_StructuresRole);var _StructuresServer=require("./Structures/Server");var _StructuresServer2=_interopRequireDefault(_StructuresServer);var _StructuresServerChannel=require("./Structures/ServerChannel");var _StructuresServerChannel2=_interopRequireDefault(_StructuresServerChannel);var _StructuresTextChannel=require("./Structures/TextChannel");var _StructuresTextChannel2=_interopRequireDefault(_StructuresTextChannel);var _StructuresUser=require("./Structures/User");var _StructuresUser2=_interopRequireDefault(_StructuresUser);var _StructuresVoiceChannel=require("./Structures/VoiceChannel");var _StructuresVoiceChannel2=_interopRequireDefault(_StructuresVoiceChannel);var _Constants=require("./Constants");var _Constants2=_interopRequireDefault(_Constants);var _UtilCacheJs=require("./Util/Cache.js");var _UtilCacheJs2=_interopRequireDefault(_UtilCacheJs);exports["default"] = {Client:_ClientClient2["default"],Channel:_StructuresChannel2["default"],ChannelPermissions:_StructuresChannelPermissions2["default"],Invite:_StructuresInvite2["default"],Message:_StructuresMessage2["default"],PermissionOverwrite:_StructuresPermissionOverwrite2["default"],PMChannel:_StructuresPMChannel2["default"],Role:_StructuresRole2["default"],Server:_StructuresServer2["default"],ServerChannel:_StructuresServerChannel2["default"],TextChannel:_StructuresTextChannel2["default"],User:_StructuresUser2["default"],VoiceChannel:_StructuresVoiceChannel2["default"],Constants:_Constants2["default"],Cache:_UtilCacheJs2["default"]};module.exports = exports["default"]; + */ + +exports.__esModule = true; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +var _ClientClient = require("./Client/Client"); + +var _ClientClient2 = _interopRequireDefault(_ClientClient); + +var _StructuresChannel = require("./Structures/Channel"); + +var _StructuresChannel2 = _interopRequireDefault(_StructuresChannel); + +var _StructuresChannelPermissions = require("./Structures/ChannelPermissions"); + +var _StructuresChannelPermissions2 = _interopRequireDefault(_StructuresChannelPermissions); + +var _StructuresInvite = require("./Structures/Invite"); + +var _StructuresInvite2 = _interopRequireDefault(_StructuresInvite); + +var _StructuresMessage = require("./Structures/Message"); + +var _StructuresMessage2 = _interopRequireDefault(_StructuresMessage); + +var _StructuresPermissionOverwrite = require("./Structures/PermissionOverwrite"); + +var _StructuresPermissionOverwrite2 = _interopRequireDefault(_StructuresPermissionOverwrite); + +var _StructuresPMChannel = require("./Structures/PMChannel"); + +var _StructuresPMChannel2 = _interopRequireDefault(_StructuresPMChannel); + +var _StructuresRole = require("./Structures/Role"); + +var _StructuresRole2 = _interopRequireDefault(_StructuresRole); + +var _StructuresServer = require("./Structures/Server"); + +var _StructuresServer2 = _interopRequireDefault(_StructuresServer); + +var _StructuresServerChannel = require("./Structures/ServerChannel"); + +var _StructuresServerChannel2 = _interopRequireDefault(_StructuresServerChannel); + +var _StructuresTextChannel = require("./Structures/TextChannel"); + +var _StructuresTextChannel2 = _interopRequireDefault(_StructuresTextChannel); + +var _StructuresUser = require("./Structures/User"); + +var _StructuresUser2 = _interopRequireDefault(_StructuresUser); + +var _StructuresVoiceChannel = require("./Structures/VoiceChannel"); + +var _StructuresVoiceChannel2 = _interopRequireDefault(_StructuresVoiceChannel); + +var _Constants = require("./Constants"); + +var _Constants2 = _interopRequireDefault(_Constants); + +var _UtilCacheJs = require("./Util/Cache.js"); + +var _UtilCacheJs2 = _interopRequireDefault(_UtilCacheJs); + +exports["default"] = { + Client: _ClientClient2["default"], + Channel: _StructuresChannel2["default"], + ChannelPermissions: _StructuresChannelPermissions2["default"], + Invite: _StructuresInvite2["default"], + Message: _StructuresMessage2["default"], + PermissionOverwrite: _StructuresPermissionOverwrite2["default"], + PMChannel: _StructuresPMChannel2["default"], + Role: _StructuresRole2["default"], + Server: _StructuresServer2["default"], + ServerChannel: _StructuresServerChannel2["default"], + TextChannel: _StructuresTextChannel2["default"], + User: _StructuresUser2["default"], + VoiceChannel: _StructuresVoiceChannel2["default"], + Constants: _Constants2["default"], + Cache: _UtilCacheJs2["default"] +}; +module.exports = exports["default"];