From cd4a70cfb2c754b52e9c211347c1a21327e8039d Mon Sep 17 00:00:00 2001 From: abalabahaha Date: Fri, 11 Dec 2015 21:22:29 -0800 Subject: [PATCH] Fixed the fix and built --- lib/Client/Client.js | 8 + lib/Client/InternalClient.js | 491 ++++++++++++++++---------------- lib/Client/Resolver/Resolver.js | 2 +- lib/Structures/Server.js | 4 - lib/Util/Cache.js | 47 ++- lib/Voice/AudioEncoder.js | 2 +- src/Voice/AudioEncoder.js | 2 +- 7 files changed, 270 insertions(+), 286 deletions(-) diff --git a/lib/Client/Client.js b/lib/Client/Client.js index 5a035a1d0..1f03c6b4e 100644 --- a/lib/Client/Client.js +++ b/lib/Client/Client.js @@ -686,6 +686,14 @@ var Client = (function (_EventEmitter) { get: function get() { return this.internal.user; } + }, { + key: "userAgent", + get: function get() { + return this.internal.userAgent; + }, + set: function set(userAgent) { + this.internal.userAgent = userAgent; + } }]); return Client; diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js index 91b2acd6f..4951789a0 100644 --- a/lib/Client/InternalClient.js +++ b/lib/Client/InternalClient.js @@ -75,25 +75,7 @@ var _VoiceVoiceConnection = require("../Voice/VoiceConnection"); var _VoiceVoiceConnection2 = _interopRequireDefault(_VoiceVoiceConnection); var zlib; - -//todo: move this somewhere else -var originalEnd = _superagent2["default"].Request.prototype.end; -_superagent2["default"].Request.prototype.end = function (callback) { - var _this = this; - - return new Promise(function (resolve, reject) { - originalEnd.call(_this, function (err, response) { - if (callback) { - callback(err, response); - } - - if (err) { - return reject(err); - } - resolve(response); - }); - }); -}; +var libVersion = require('../../package.json').version; function waitFor(condition) { var value = arguments.length <= 1 || arguments[1] === undefined ? condition : arguments[1]; @@ -128,11 +110,37 @@ var InternalClient = (function () { this.setup(discordClient); } + InternalClient.prototype.apiRequest = function apiRequest(method, url, useAuth, data, file) { + var ret = _superagent2["default"][method](url); + if (useAuth) { + ret.set("authorization", this.token); + } + if (data) { + ret.send(data); + } + if (file) { + ret.attach("file", file.file, file.name); + } + ret.set('User-Agent', this.userAgentInfo.full); + return new Promise(function (resolve, reject) { + ret.end(function (error, data) { + if (error) { + return reject(error); + } + resolve(data.body); + }); + }); + }; + 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"); @@ -205,11 +213,11 @@ var InternalClient = (function () { //def awaitResponse InternalClient.prototype.awaitResponse = function awaitResponse(msg) { - var _this2 = this; + var _this = this; return new Promise(function (resolve, reject) { - msg = _this2.resolver.resolveMessage(msg); + msg = _this.resolver.resolveMessage(msg); if (!msg) { reject(new Error("message undefined")); @@ -218,18 +226,18 @@ var InternalClient = (function () { var awaitID = msg.channel.id + msg.author.id; - if (!_this2.messageAwaits[awaitID]) { - _this2.messageAwaits[awaitID] = []; + if (!_this.messageAwaits[awaitID]) { + _this.messageAwaits[awaitID] = []; } - _this2.messageAwaits[awaitID].push(resolve); + _this.messageAwaits[awaitID].push(resolve); }); }; //def joinVoiceChannel InternalClient.prototype.joinVoiceChannel = function joinVoiceChannel(chann) { - var _this3 = this; + var _this2 = this; var channel = this.resolver.resolveVoiceChannel(chann); @@ -250,20 +258,20 @@ var InternalClient = (function () { } else if (data.t === "VOICE_SERVER_UPDATE") { token = data.d.token; endpoint = data.d.endpoint; - var chan = _this3.voiceConnection = new _VoiceVoiceConnection2["default"](channel, _this3.client, session, token, server, endpoint); + var chan = _this2.voiceConnection = new _VoiceVoiceConnection2["default"](channel, _this2.client, session, token, server, endpoint); chan.on("ready", function () { return resolve(chan); }); chan.on("error", reject); - _this3.client.emit("debug", "removed temporary voice websocket listeners"); - _this3.websocket.removeListener("message", check); + _this2.client.emit("debug", "removed temporary voice websocket listeners"); + _this2.websocket.removeListener("message", check); } }; - _this3.websocket.on("message", check); - _this3.sendWS({ + _this2.websocket.on("message", check); + _this2.sendWS({ op: 4, d: { "guild_id": server.id, @@ -279,16 +287,16 @@ var InternalClient = (function () { // def createServer InternalClient.prototype.createServer = function createServer(name) { - var _this4 = this; + var _this3 = this; var region = arguments.length <= 1 || arguments[1] === undefined ? "london" : arguments[1]; name = this.resolver.resolveString(name); - return _superagent2["default"].post(_Constants.Endpoints.SERVERS).set("authorization", this.token).send({ name: name, region: region }).end().then(function (res) { + 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 _this4.servers.get("id", res.body.id); + return _this3.servers.get("id", res.id); }); }); }; @@ -296,16 +304,16 @@ var InternalClient = (function () { //def joinServer InternalClient.prototype.joinServer = function joinServer(invite) { - var _this5 = this; + var _this4 = this; invite = this.resolver.resolveInviteID(invite); if (!invite) { return Promise.reject(new Error("Not a valid invite")); } - return _superagent2["default"].post(_Constants.Endpoints.INVITE(invite)).set("authorization", this.token).end().then(function (res) { + 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 _this5.servers.get("id", res.body.guild.id); + return _this4.servers.get("id", res.guild.id); }); }); }; @@ -313,14 +321,14 @@ var InternalClient = (function () { //def leaveServer InternalClient.prototype.leaveServer = function leaveServer(srv) { - var _this6 = this; + var _this5 = this; var server = this.resolver.resolveServer(srv); if (!server) { return Promise.reject(new Error("server did not resolve")); } - return _superagent2["default"].del(_Constants.Endpoints.SERVER(server.id)).set("authorization", this.token).end().then(function () { + return this.apiRequest("del", _Constants.Endpoints.SERVER(server.id), true).then(function () { // remove channels of server then the server for (var _iterator2 = server.channels, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; @@ -336,17 +344,17 @@ var InternalClient = (function () { var chan = _ref2; - _this6.channels.remove(chan); + _this5.channels.remove(chan); } // remove server - _this6.servers.remove(server); + _this5.servers.remove(server); }); }; // def login InternalClient.prototype.login = function login(email, password) { - var _this7 = this; + var _this6 = this; var client = this.client; if (this.state !== _ConnectionState2["default"].DISCONNECTED && this.state !== _ConnectionState2["default"].IDLE) { @@ -355,25 +363,25 @@ var InternalClient = (function () { this.state = _ConnectionState2["default"].LOGGING_IN; - return _superagent2["default"].post(_Constants.Endpoints.LOGIN).send({ + return this.apiRequest("post", _Constants.Endpoints.LOGIN, false, { email: email, password: password - }).end().then(function (res) { - var token = res.body.token; - _this7.state = _ConnectionState2["default"].LOGGED_IN; - _this7.token = token; - _this7.email = email; - _this7.password = password; + }).then(function (res) { + var token = res.token; + _this6.state = _ConnectionState2["default"].LOGGED_IN; + _this6.token = token; + _this6.email = email; + _this6.password = password; - return _this7.getGateway().then(function (url) { - _this7.createWS(url); + return _this6.getGateway().then(function (url) { + _this6.createWS(url); return token; }); }, function (error) { - _this7.websocket = null; + _this6.websocket = null; throw error; })["catch"](function (error) { - _this7.state = _ConnectionState2["default"].DISCONNECTED; + _this6.state = _ConnectionState2["default"].DISCONNECTED; client.emit("disconnected"); throw error; }); @@ -382,67 +390,67 @@ var InternalClient = (function () { // def logout InternalClient.prototype.logout = function logout() { - var _this8 = this; + var _this7 = this; if (this.state === _ConnectionState2["default"].DISCONNECTED || this.state === _ConnectionState2["default"].IDLE) { return Promise.reject(new Error("Client is not logged in!")); } - return _superagent2["default"].post(_Constants.Endpoints.LOGOUT).set("authorization", this.token).end().then(function () { - if (_this8.websocket) { - _this8.websocket.close(); - _this8.websocket = null; + return this.apiRequest("post", _Constants.Endpoints.LOGOUT, true).then(function () { + if (_this7.websocket) { + _this7.websocket.close(); + _this7.websocket = null; } - _this8.token = null; - _this8.email = null; - _this8.password = null; - _this8.state = _ConnectionState2["default"].DISCONNECTED; + _this7.token = null; + _this7.email = null; + _this7.password = null; + _this7.state = _ConnectionState2["default"].DISCONNECTED; }); }; // def startPM InternalClient.prototype.startPM = function startPM(resUser) { - var _this9 = this; + var _this8 = 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 _superagent2["default"].post("" + _Constants.Endpoints.USER_CHANNELS(user.id)).set("authorization", this.token).send({ + return this.apiRequest("post", _Constants.Endpoints.USER_CHANNELS(user.id), true, { recipient_id: user.id - }).end().then(function (res) { - return _this9.private_channels.add(new _StructuresPMChannel2["default"](res.body, _this9.client)); + }).then(function (res) { + return _this8.private_channels.add(new _StructuresPMChannel2["default"](res, _this8.client)); }); }; // def getGateway InternalClient.prototype.getGateway = function getGateway() { - return _superagent2["default"].get(_Constants.Endpoints.GATEWAY).set("authorization", this.token).end().then(function (res) { - return res.body.url; + return this.apiRequest("get", _Constants.Endpoints.GATEWAY, true).then(function (res) { + return res.url; }); }; // def sendMessage InternalClient.prototype.sendMessage = function sendMessage(where, _content) { - var _this10 = this; + var _this9 = this; var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; return this.resolver.resolveChannel(where).then(function (destination) { //var destination; - var content = _this10.resolver.resolveString(_content); - var mentions = _this10.resolver.resolveMentions(content); + var content = _this9.resolver.resolveString(_content); + var mentions = _this9.resolver.resolveMentions(content); - return _superagent2["default"].post(_Constants.Endpoints.CHANNEL_MESSAGES(destination.id)).set("authorization", _this10.token).send({ + return _this9.apiRequest("post", _Constants.Endpoints.CHANNEL_MESSAGES(destination.id), true, { content: content, mentions: mentions, tts: options.tts - }).end().then(function (res) { - return destination.messages.add(new _StructuresMessage2["default"](res.body, destination, _this10.client)); + }).then(function (res) { + return destination.messages.add(new _StructuresMessage2["default"](res, destination, _this9.client)); }); }); }; @@ -450,7 +458,7 @@ var InternalClient = (function () { // def deleteMessage InternalClient.prototype.deleteMessage = function deleteMessage(_message) { - var _this11 = this; + var _this10 = this; var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; @@ -461,7 +469,7 @@ var InternalClient = (function () { var chain = options.wait ? delay(options.wait) : Promise.resolve(); return chain.then(function () { - return _superagent2["default"].del(_Constants.Endpoints.CHANNEL_MESSAGE(message.channel.id, message.id)).set("authorization", _this11.token).end(); + return _this10.apiRequest("del", _Constants.Endpoints.CHANNEL_MESSAGE(message.channel.id, message.id), true); }).then(function () { return message.channel.messages.remove(message); }); @@ -470,7 +478,7 @@ var InternalClient = (function () { // def updateMessage InternalClient.prototype.updateMessage = function updateMessage(msg, _content) { - var _this12 = this; + var _this11 = this; var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; @@ -483,25 +491,28 @@ var InternalClient = (function () { var content = this.resolver.resolveString(_content); var mentions = this.resolver.resolveMentions(content); - return _superagent2["default"].patch(_Constants.Endpoints.CHANNEL_MESSAGE(message.channel.id, message.id)).set("authorization", this.token).send({ + return this.apiRequest("patch", _Constants.Endpoints.CHANNEL_MESSAGE(message.channel.id, message.id), true, { content: content, tts: options.tts, mentions: mentions - }).end().then(function (res) { - return message.channel.messages.update(message, new _StructuresMessage2["default"](res.body, message.channel, _this12.client)); + }).then(function (res) { + return message.channel.messages.update(message, new _StructuresMessage2["default"](res, message.channel, _this11.client)); }); }; // def sendFile InternalClient.prototype.sendFile = function sendFile(where, _file) { - var _this13 = this; + var _this12 = this; var name = arguments.length <= 2 || arguments[2] === undefined ? "image.png" : arguments[2]; return this.resolver.resolveChannel(where).then(function (channel) { - return _superagent2["default"].post(_Constants.Endpoints.CHANNEL_MESSAGES(channel.id)).set("authorization", _this13.token).attach("file", _this13.resolver.resolveFile(_file), name).end().then(function (res) { - return channel.messages.add(new _StructuresMessage2["default"](res.body, channel, _this13.client)); + return _this12.apiRequest("post", _Constants.Endpoints.CHANNEL_MESSAGES(channel.id), true, null, { + name: name, + file: _this12.resolver.resolveFile(_file) + }).then(function (res) { + return channel.messages.add(new _StructuresMessage2["default"](res, channel, _this12.client)); }); }); }; @@ -509,7 +520,7 @@ var InternalClient = (function () { // def getChannelLogs InternalClient.prototype.getChannelLogs = function getChannelLogs(_channel) { - var _this14 = this; + var _this13 = this; var limit = arguments.length <= 1 || arguments[1] === undefined ? 500 : arguments[1]; var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; @@ -517,21 +528,21 @@ var InternalClient = (function () { return this.resolver.resolveChannel(_channel).then(function (channel) { var qsObject = { limit: limit }; if (options.before) { - var res = _this14.resolver.resolveMessage(options.before); + var res = _this13.resolver.resolveMessage(options.before); if (res) { qsObject.before = res; } } if (options.after) { - var res = _this14.resolver.resolveMessage(options.after); + var res = _this13.resolver.resolveMessage(options.after); if (res) { qsObject.after = res; } } - return _superagent2["default"].get(_Constants.Endpoints.CHANNEL_MESSAGES(channel.id) + "?" + _querystring2["default"].stringify(qsObject)).set("authorization", _this14.token).end().then(function (res) { - return res.body.map(function (msg) { - return channel.messages.add(new _StructuresMessage2["default"](msg, channel, _this14.client)); + return _this13.apiRequest("get", "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, _this13.client)); }); }); }); @@ -540,13 +551,13 @@ var InternalClient = (function () { // def getBans InternalClient.prototype.getBans = function getBans(server) { - var _this15 = this; + var _this14 = this; server = this.resolver.resolveServer(server); - return _superagent2["default"].get("" + _Constants.Endpoints.SERVER_BANS(server.id)).set("authorization", this.token).end().then(function (res) { - res.body.map(function (ban) { - return _this15.users.add(new _StructuresUser2["default"](ban.user, _this15.client)); + return this.apiRequest("get", _Constants.Endpoints.SERVER_BANS(server.id), true).then(function (res) { + res.map(function (ban) { + return _this14.users.add(new _StructuresUser2["default"](ban.user, _this14.client)); }); }); }; @@ -554,39 +565,36 @@ var InternalClient = (function () { // def createChannel InternalClient.prototype.createChannel = function createChannel(server, name) { - var _this16 = this; + var _this15 = this; var type = arguments.length <= 2 || arguments[2] === undefined ? "text" : arguments[2]; server = this.resolver.resolveServer(server); - return _superagent2["default"].post(_Constants.Endpoints.SERVER_CHANNELS(server.id)).set("authorization", this.token).send({ + return this.apiRequest("post", _Constants.Endpoints.SERVER_CHANNELS(server.id), true, { name: name, type: type - }).end().then(function (res) { + }).then(function (res) { var channel; - if (res.body.type === "text") { - channel = new _StructuresTextChannel2["default"](res.body, _this16.client, server); + if (res.type === "text") { + channel = new _StructuresTextChannel2["default"](res, _this15.client, server); } else { - channel = new _StructuresVoiceChannel2["default"](res.body, _this16.client, server); + channel = new _StructuresVoiceChannel2["default"](res, _this15.client, server); } - return server.channels.add(_this16.channels.add(channel)); + return server.channels.add(_this15.channels.add(channel)); }); }; // def deleteChannel InternalClient.prototype.deleteChannel = function deleteChannel(_channel) { - var _this17 = this; + var _this16 = this; return this.resolver.resolveChannel(_channel).then(function (channel) { - return _superagent2["default"].del(_Constants.Endpoints.CHANNEL(channel.id)).set("authorization", _this17.token).end().then(function () { + return _this16.apiRequest("del", _Constants.Endpoints.CHANNEL(channel.id), true).then(function () { channel.server.channels.remove(channel); - _this17.channels.remove(channel); + _this16.channels.remove(channel); }); - }, function (error) { - error.message = "Couldn't resolve to channel - " + error.toString(); - throw error; }); }; @@ -598,7 +606,7 @@ var InternalClient = (function () { user = this.resolver.resolveUser(user); server = this.resolver.resolveServer(server); - return _superagent2["default"].put(_Constants.Endpoints.SERVER_BANS(server.id) + "/" + user.id + "?delete-message-days=" + length).set("authorization", this.token).end(); //will expose api result, probably not bad tho + return this.apiRequest("put", _Constants.Endpoints.SERVER_BANS(server.id) + "/" + user.id + "?delete-message-days=" + length, true); }; // def unbanMember @@ -608,7 +616,7 @@ var InternalClient = (function () { server = this.resolver.resolveServer(server); user = this.resolver.resolveUser(user); - return _superagent2["default"].del(_Constants.Endpoints.SERVER_BANS(server.id) + "/" + user.id).set("authorization", this.token).end(); //will expose api result, probably not bad tho + return this.apiRequest("del", _Constants.Endpoints.SERVER_BANS(server.id) + "/" + user.id, true); }; // def kickMember @@ -617,21 +625,21 @@ var InternalClient = (function () { user = this.resolver.resolveUser(user); server = this.resolver.resolveServer(server); - return _superagent2["default"].del(_Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id).set("authorization", this.token).end(); + return this.apiRequest("del", _Constants.Endpoints.SERVER_MEMBERS(server.id) + "/" + user.id, true); }; // def createRole InternalClient.prototype.createRole = function createRole(server, data) { - var _this18 = this; + var _this17 = this; server = this.resolver.resolveServer(server); - return _superagent2["default"].post(_Constants.Endpoints.SERVER_ROLES(server.id)).set("authorization", this.token).end().then(function (res) { - var role = server.roles.add(new _StructuresRole2["default"](res.body, server, _this18.client)); + return this.apiRequest("post", _Constants.Endpoints.SERVER_ROLES(server.id), true).then(function (res) { + var role = server.roles.add(new _StructuresRole2["default"](res, server, _this17.client)); if (data) { - return _this18.updateRole(role, data); + return _this17.updateRole(role, data); } return role; }); @@ -640,7 +648,7 @@ var InternalClient = (function () { // def updateRole InternalClient.prototype.updateRole = function updateRole(role, data) { - var _this19 = this; + var _this18 = this; var server = this.resolver.resolveServer(role.server); @@ -675,15 +683,15 @@ var InternalClient = (function () { } } - return _superagent2["default"].patch(_Constants.Endpoints.SERVER_ROLES(server.id) + "/" + role.id).set("authorization", this.token).send(newData).end().then(function (res) { - return server.roles.update(role, new _StructuresRole2["default"](res.body, server, _this19.client)); + 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, _this18.client)); }); }; // def deleteRole InternalClient.prototype.deleteRole = function deleteRole(role) { - return _superagent2["default"].del(_Constants.Endpoints.SERVER_ROLES(role.server.id) + "/" + role.id).set("authorization", this.token).end(); + return this.apiRequest("del", _Constants.Endpoints.SERVER_ROLES(role.server.id) + "/" + role.id, true); }; //def addMemberToRole @@ -703,9 +711,9 @@ var InternalClient = (function () { return r.id; }).concat(role.id); - return _superagent2["default"].patch(_Constants.Endpoints.SERVER_MEMBERS(role.server.id) + "/" + member.id).set("authorization", this.token).send({ + return this.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(role.server.id) + "/" + member.id, true, { roles: roleIDS - }).end(); + }); }; //def addMemberToRole @@ -725,6 +733,63 @@ var InternalClient = (function () { return r.id; }); + if (roles.any(function (role) { + return !role.server.memberMap[member.id]; + })) { + return Promise.reject(new Error("Role does not exist on same server as member")); + } + + return this.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(role.server.id) + "/" + member.id, true, { + roles: roleIDS + }); + }; + + //def removeMemberFromRole + + InternalClient.prototype.removeMemberFromRole = function removeMemberFromRole(member, role) { + member = this.resolver.resolveUser(member); + + if (!member || !role) { + return Promise.reject(new Error("member/role not in server")); + } + + if (!role.server.memberMap[member.id]) { + return Promise.reject(new Error("member not in server")); + } + + var roleIDS = role.server.memberMap[member.id].roles.map(function (r) { + return r.id; + }); + + for (var item in roleIDS) { + if (roleIDS[item] === role.id) { + roleIDS.splice(item, 1); + break; + } + } + + return this.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(role.server.id) + "/" + member.id, true, { + roles: roleIDS + }); + }; + + //def removeMemberFromRoles + + InternalClient.prototype.removeMemberFromRoles = function removeMemberFromRoles(member, roles) { + member = this.resolver.resolveUser(member); + + if (!member) { + return Promise.reject(new Error("member not in server")); + } + + if (!Array.isArray(roles) || roles.length === 0) { + return Promise.reject(new Error("invalid array of roles")); + } + + var roleIDS = roles[0].server.memberMap[member.id].roles.map(function (r) { + return r.id; + }); + for (var _iterator4 = roles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref4; @@ -739,77 +804,6 @@ var InternalClient = (function () { var role = _ref4; - if (!role.server.memberMap[member.id]) { - return Promise.reject(new Error("member not in server")); - } - roleIDS.concat(role.id); - } - - return _superagent2["default"].patch(_Constants.Endpoints.SERVER_MEMBERS(role.server.id) + "/" + member.id).set("authorization", this.token).send({ - roles: roleIDS - }).end(); - }; - - //def removeMemberFromRole - - InternalClient.prototype.removeMemberFromRole = function removeMemberFromRole(member, role) { - member = this.resolver.resolveUser(member); - - if (!member || !role) { - return Promise.reject(new Error("member/role not in server")); - } - - if (!role.server.memberMap[member.id]) { - return Promise.reject(new Error("member not in server")); - } - - var roleIDS = role.server.memberMap[member.id].roles.map(function (r) { - return r.id; - }); - - for (var item in roleIDS) { - if (roleIDS[item] === role.id) { - roleIDS.splice(item, 1); - break; - } - } - - return _superagent2["default"].patch(_Constants.Endpoints.SERVER_MEMBERS(role.server.id) + "/" + member.id).set("authorization", this.token).send({ - roles: roleIDS - }).end(); - }; - - //def removeMemberFromRoles - - InternalClient.prototype.removeMemberFromRoles = function removeMemberFromRoles(member, roles) { - member = this.resolver.resolveUser(member); - - if (!member) { - return Promise.reject(new Error("member not in server")); - } - - if (!Array.isArray(roles) || roles.length === 0) { - return Promise.reject(new Error("invalid array of roles")); - } - - var roleIDS = roles[0].server.memberMap[member.id].roles.map(function (r) { - return r.id; - }); - - for (var _iterator5 = roles, _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 role = _ref5; - if (!role.server.memberMap[member.id]) { return Promise.reject(new Error("member not in server")); } @@ -821,15 +815,15 @@ var InternalClient = (function () { } } - return _superagent2["default"].patch(_Constants.Endpoints.SERVER_MEMBERS(role.server.id) + "/" + member.id).set("authorization", this.token).send({ + return this.apiRequest("patch", _Constants.Endpoints.SERVER_MEMBERS(role.server.id) + "/" + member.id, true, { roles: roleIDS - }).end(); + }); }; // def createInvite InternalClient.prototype.createInvite = function createInvite(chanServ, options) { - var _this20 = this; + var _this19 = this; if (chanServ instanceof _StructuresChannel2["default"]) { // do something @@ -861,8 +855,8 @@ var InternalClient = (function () { epoint = _Constants.Endpoints.SERVER_INVITES(chanServ.id); } - return _superagent2["default"].post(epoint).set("authorization", this.token).send(options).end().then(function (res) { - return new _StructuresInvite2["default"](res.body, _this20.channels.get("id", res.body.channel.id), _this20.client); + return this.apiRequest("post", epoint, true, options).then(function (res) { + return new _StructuresInvite2["default"](res, _this19.channels.get("id", res.channel.id), _this19.client); }); }; @@ -874,13 +868,13 @@ var InternalClient = (function () { if (!invite) { throw new Error("Not a valid invite"); } - return _superagent2["default"].del(_Constants.Endpoints.INVITE(invite)).set("authorization", this.token).end(); + return this.apiRequest("del", _Constants.Endpoints.INVITE(invite), true); }; //def overwritePermissions InternalClient.prototype.overwritePermissions = function overwritePermissions(channel, role, updated) { - var _this21 = this; + var _this20 = this; return this.resolver.resolveChannel(channel).then(function (channel) { var user; @@ -921,7 +915,7 @@ var InternalClient = (function () { } } - return _superagent2["default"].put(_Constants.Endpoints.CHANNEL_PERMISSIONS(channel.id) + "/" + data.id).set("authorization", _this21.token).send(data).end(); + return _this20.apiRequest("put", _Constants.Endpoints.CHANNEL_PERMISSIONS(channel.id) + "/" + data.id, true, data); }); }; @@ -957,62 +951,62 @@ var InternalClient = (function () { //def sendTyping InternalClient.prototype.sendTyping = function sendTyping(channel) { - var _this22 = this; + var _this21 = this; return this.resolver.resolveChannel(channel).then(function (channel) { - return _superagent2["default"].post(_Constants.Endpoints.CHANNEL(channel.id) + "/typing").set("authorization", _this22.token).end(); + return _this21.apiRequest("post", _Constants.Endpoints.CHANNEL(channel.id) + "/typing", true); }); }; //def startTyping InternalClient.prototype.startTyping = function startTyping(channel) { - var _this23 = this; + var _this22 = this; return this.resolver.resolveChannel(channel).then(function (channel) { - if (_this23.intervals.typing[channel.id]) { + if (_this22.intervals.typing[channel.id]) { // typing interval already exists, leave it alone throw new Error("Already typing in that channel"); } - _this23.intervals.typing[channel.id] = setInterval(function () { - return _this23.sendTyping(channel)["catch"](function (error) { - return _this23.emit("error", error); + _this22.intervals.typing[channel.id] = setInterval(function () { + return _this22.sendTyping(channel)["catch"](function (error) { + return _this22.emit("error", error); }); }, 4000); - return _this23.sendTyping(channel); + return _this22.sendTyping(channel); }); }; //def stopTyping InternalClient.prototype.stopTyping = function stopTyping(channel) { - var _this24 = this; + var _this23 = this; return this.resolver.resolveChannel(channel).then(function (channel) { - if (!_this24.intervals.typing[channel.id]) { - // typing interval doesn't exist + if (!_this23.intervals.typing[channel.id]) { + // typing interval doesn"t exist throw new Error("Not typing in that channel"); } - clearInterval(_this24.intervals.typing[channel.id]); - _this24.intervals.typing[channel.id] = false; + clearInterval(_this23.intervals.typing[channel.id]); + _this23.intervals.typing[channel.id] = false; }); }; //def updateDetails InternalClient.prototype.updateDetails = function updateDetails(data) { - return _superagent2["default"].patch(_Constants.Endpoints.ME).set("authorization", this.token).send({ + return this.apiRequest("patch", _Constants.Endpoints.ME, true, { avatar: this.resolver.resolveToBase64(data.avatar) || this.user.avatar, email: data.email || this.email, new_password: data.newPassword || null, password: data.password || this.password, username: data.username || this.user.username - }).end(); + }); }; //def setAvatar @@ -1030,17 +1024,17 @@ var InternalClient = (function () { //def setTopic InternalClient.prototype.setChannelTopic = function setChannelTopic(chann) { - var _this25 = this; + var _this24 = this; var topic = arguments.length <= 1 || arguments[1] === undefined ? "" : arguments[1]; return this.resolver.resolveChannel(chann).then(function (channel) { - return _superagent2["default"].patch(_Constants.Endpoints.CHANNEL(channel.id)).set("authorization", _this25.token).send({ + return _this24.apiRequest("patch", _Constants.Endpoints.CHANNEL(channel.id), true, { name: channel.name, position: channel.position, topic: topic - }).end().then(function (res) { - return channel.topic = res.body.topic; + }).then(function (res) { + return channel.topic = res.topic; }); }); }; @@ -1048,17 +1042,17 @@ var InternalClient = (function () { //def setChannelName InternalClient.prototype.setChannelName = function setChannelName(chann) { - var _this26 = this; + var _this25 = this; var name = arguments.length <= 1 || arguments[1] === undefined ? "discordjs_is_the_best" : arguments[1]; return this.resolver.resolveChannel(chann).then(function (channel) { - return _superagent2["default"].patch(_Constants.Endpoints.CHANNEL(channel.id)).set("authorization", _this26.token).send({ + return _this25.apiRequest("patch", _Constants.Endpoints.CHANNEL(channel.id), true, { name: name, position: channel.position, topic: channel.topic - }).end().then(function (res) { - return channel.name = res.body.name; + }).then(function (res) { + return channel.name = res.name; }); }); }; @@ -1066,19 +1060,19 @@ var InternalClient = (function () { //def setChannelNameAndTopic InternalClient.prototype.setChannelNameAndTopic = function setChannelNameAndTopic(chann) { - var _this27 = this; + var _this26 = this; var name = arguments.length <= 1 || arguments[1] === undefined ? "discordjs_is_the_best" : arguments[1]; var topic = arguments.length <= 2 || arguments[2] === undefined ? "" : arguments[2]; return this.resolver.resolveChannel(chann).then(function (channel) { - return _superagent2["default"].patch(_Constants.Endpoints.CHANNEL(channel.id)).set("authorization", _this27.token).send({ + return _this26.apiRequest("patch", _Constants.Endpoints.CHANNEL(channel.id), true, { name: name, position: channel.position, topic: topic - }).end().then(function (res) { - channel.name = res.body.name; - channel.topic = res.body.topic; + }).then(function (res) { + channel.name = res.name; + channel.topic = res.topic; }); }); }; @@ -1086,17 +1080,17 @@ var InternalClient = (function () { //def setTopic InternalClient.prototype.setChannelPosition = function setChannelPosition(chann) { - var _this28 = this; + var _this27 = this; var position = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; return this.resolver.resolveChannel(chann).then(function (channel) { - return _superagent2["default"].patch(_Constants.Endpoints.CHANNEL(channel.id)).set("authorization", _this28.token).send({ + return _this27.apiRequest("patch", _Constants.Endpoints.CHANNEL(channel.id), true, { name: channel.name, position: position, topic: channel.topic - }).end().then(function (res) { - return channel.position = res.body.position; + }).then(function (res) { + return channel.position = res.position; }); }); }; @@ -1116,7 +1110,7 @@ var InternalClient = (function () { Promise.reject(new Error("Message does not exist")); } - return _superagent2["default"].post(_Constants.Endpoints.CHANNEL_MESSAGE(msg.channel.id, msg.id) + "/ack").set("authorization", this.token).end(); + return this.apiRequest("post", _Constants.Endpoints.CHANNEL_MESSAGE(msg.channel.id, msg.id) + "/ack", true); }; InternalClient.prototype.sendWS = function sendWS(object) { @@ -1188,11 +1182,6 @@ var InternalClient = (function () { return self.sendWS({ op: 1, d: Date.now() }); }, data.heartbeat_interval); - self.users.setHighPerformance(); - self.servers.setHighPerformance(); - self.channels.setHighPerformance(); - self.private_channels.setHighPerformance(); - self.user = self.users.add(new _StructuresUser2["default"](data.user, client)); data.guilds.forEach(function (server) { self.servers.add(new _StructuresServer2["default"](server, client)); @@ -1202,11 +1191,6 @@ var InternalClient = (function () { }); self.state = _ConnectionState2["default"].READY; - self.users.setNormalPerformance(); - self.servers.setNormalPerformance(); - self.channels.setNormalPerformance(); - self.private_channels.setNormalPerformance(); - client.emit("ready"); client.emit("debug", "ready packet took " + (Date.now() - startTime) + "ms to process"); client.emit("debug", "ready with " + self.servers.length + " servers, " + self.channels.length + " channels and " + self.users.length + " users cached."); @@ -1285,19 +1269,19 @@ var InternalClient = (function () { var server = self.servers.get("id", data.id); if (server) { - for (var _iterator6 = server.channels, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { - var _ref6; + for (var _iterator5 = server.channels, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref5; - if (_isArray6) { - if (_i6 >= _iterator6.length) break; - _ref6 = _iterator6[_i6++]; + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref5 = _iterator5[_i5++]; } else { - _i6 = _iterator6.next(); - if (_i6.done) break; - _ref6 = _i6.value; + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref5 = _i5.value; } - var channel = _ref6; + var channel = _ref5; self.channels.remove(channel); } @@ -1573,6 +1557,15 @@ var InternalClient = (function () { 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; + } }]); return InternalClient; diff --git a/lib/Client/Resolver/Resolver.js b/lib/Client/Resolver/Resolver.js index b05ac0363..a94e6d4c3 100644 --- a/lib/Client/Resolver/Resolver.js +++ b/lib/Client/Resolver/Resolver.js @@ -180,7 +180,7 @@ var Resolver = (function () { return resource.recipient; } if (resource instanceof String || typeof resource === "string") { - return this.client.internal.users.get("id", resource); + return this.internal.users.get("id", resource); } return null; diff --git a/lib/Structures/Server.js b/lib/Structures/Server.js index 6899882ad..1332da1ba 100644 --- a/lib/Structures/Server.js +++ b/lib/Structures/Server.js @@ -65,8 +65,6 @@ var Server = (function (_Equality) { this.afkChannelID = data.afk_channel_id; this.memberMap = {}; - this.members.setHighPerformance(); - var self = this; data.roles.forEach(function (dataRole) { @@ -118,8 +116,6 @@ var Server = (function (_Equality) { } } } - - this.members.setNormalPerformance(); } Server.prototype.detailsOf = function detailsOf(user) { diff --git a/lib/Util/Cache.js b/lib/Util/Cache.js index ce8830eaa..06da20616 100644 --- a/lib/Util/Cache.js +++ b/lib/Util/Cache.js @@ -14,28 +14,15 @@ var Cache = (function (_Array) { _Array.call(this); this.discrim = discrim || "id"; - this.discrimCache = []; - this.highPerformance = false; + this.discrimCache = {}; } - Cache.prototype.setHighPerformance = function setHighPerformance() { - this.highPerformance = true; - }; - - Cache.prototype.setNormalPerformance = function setNormalPerformance() { - this.discrimCache = []; - this.highPerformance = false; - }; - Cache.prototype.get = function get(key, value) { - var found = null; - this.forEach(function (val, index, array) { - if (val[key] == value) { - found = val; - return; - } - }); - return found; + if (key === this.discrim) return this.discrimCache[value] || null; + + var l = this.length; + for (var i = 0; i < l; i++) if (this[i][key] == value) return this[i]; + return null; }; Cache.prototype.has = function has(object) { @@ -54,18 +41,16 @@ var Cache = (function (_Array) { }; Cache.prototype.add = function add(data) { - var exit = false; - exit = ~this.discrimCache.indexOf(data[this.discrim]); - if (exit) { - return data; - } else { - if (this.limit && this.length >= this.limit) { - this.splice(0, 1); - } - this.push(data); - this.discrimCache.push(data[this.discrim]); - return data; + var cacheKey = this.discrim === "id" ? data.id : data[this.discrim]; + if (this.discrimCache[cacheKey]) { + return this.discrimCache[cacheKey]; } + if (this.limit && this.length >= this.limit) { + this.splice(0, 1); + } + this.push(data); + this.discrimCache[cacheKey] = data; + return data; }; Cache.prototype.update = function update(old, data) { @@ -73,6 +58,7 @@ var Cache = (function (_Array) { if (item) { var index = this.indexOf(item); this[index] = data; + this.discrimCache[data[this.discrim]] = data; return this[index]; } else { return false; @@ -84,6 +70,7 @@ var Cache = (function (_Array) { }; Cache.prototype.remove = function remove(data) { + delete this.discrimCache[data[this.discrim]]; var index = this.indexOf(data); if (~index) { this.splice(index, 1); diff --git a/lib/Voice/AudioEncoder.js b/lib/Voice/AudioEncoder.js index 6564aaf34..a734c98e4 100644 --- a/lib/Voice/AudioEncoder.js +++ b/lib/Voice/AudioEncoder.js @@ -103,7 +103,7 @@ var AudioEncoder = (function () { var self = this; return new Promise(function (resolve, reject) { - var enc = _child_process2["default"].spawn(self.getCommand(), ['-i', file, '-f', 's16le', '-ar', '48000', '-ac', 2, 'pipe:1']); + var enc = _child_process2["default"].spawn(self.getCommand(), ['-loglevel', '0', '-i', file, '-f', 's16le', '-ar', '48000', '-ac', 2, 'pipe:1'], { stdio: ['pipe', 'pipe', 'ignore'] }); enc.stdout.once("readable", function () { callback(null, { diff --git a/src/Voice/AudioEncoder.js b/src/Voice/AudioEncoder.js index 2a918614c..1379f0ff8 100644 --- a/src/Voice/AudioEncoder.js +++ b/src/Voice/AudioEncoder.js @@ -87,7 +87,7 @@ export default class AudioEncoder { return new Promise((resolve, reject) => { var enc = cpoc.spawn(self.getCommand(), [ '-loglevel', '0', - '-i', '-', + '-i', file, '-f', 's16le', '-ar', '48000', '-ac', 2,