From 2d4295c83f08c7c075c0281cf14fa8e5a1e9237a Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Fri, 30 Oct 2015 13:56:07 +0000 Subject: [PATCH] Updated cache referencing On server deletes some parts of the cache are now removed to free up memory --- lib/ChannelPermissions.js | 260 +++- lib/Client.js | 2388 +++++++++++++++++++++++++++++++++-- lib/Endpoints.js | 14 +- lib/EvaluatedPermissions.js | 206 ++- lib/Member.js | 217 +++- lib/PMChannel.js | 62 +- lib/ServerPermissions.js | 243 +++- lib/VoiceChannel.js | 20 +- lib/channel.js | 133 +- lib/index.js | 54 +- lib/internal.js | 206 ++- lib/invite.js | 36 +- lib/message.js | 98 +- lib/server.js | 294 ++++- lib/user.js | 61 +- src/Client.js | 6 + 16 files changed, 4182 insertions(+), 116 deletions(-) diff --git a/lib/ChannelPermissions.js b/lib/ChannelPermissions.js index f06c6e152..e2d480f1a 100644 --- a/lib/ChannelPermissions.js +++ b/lib/ChannelPermissions.js @@ -1,4 +1,256 @@ -"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");}}var ChannelPermissions=(function(){function ChannelPermissions(data,channel){_classCallCheck(this,ChannelPermissions);var self=this;function getBit(x){return (self.packed >>> x & 1) === 1;}this.type = data.type; //either member or role -this.id = data.id;if(this.type === "member"){this.packed = channel.server.getMember("id",data.id).evalPerms.packed;}else {this.packed = channel.server.getRole("id",data.id).packed;}this.packed = this.packed & ~data.deny;this.packed = this.packed | data.allow;this.deny = data.deny;this.allow = data.allow;}ChannelPermissions.prototype.serialise = function serialise(){return {createInstantInvite:this.createInstantInvite,manageRoles:this.manageRoles,manageChannels:this.manageChannels,readMessages:this.readMessages,sendMessages:this.sendMessage,sendTTSMessages:this.sendTTSMessages,manageMessages:this.manageMessages,embedLinks:this.embedLinks,attachFiles:this.attachFiles,readMessageHistory:this.readMessageHistory,mentionEveryone:this.mentionEveryone,voiceConnect:this.voiceConnect,voiceSpeak:this.voiceSpeak,voiceMuteMembers:this.voiceMuteMembers,voiceDeafenMembers:this.voiceDeafenMembers,voiceMoveMember:this.voiceMoveMembers,voiceUseVoiceActivation:this.voiceUseVoiceActivation};};ChannelPermissions.prototype.serialize = function serialize(){return this.serialise();};ChannelPermissions.prototype.getBit = function getBit(x){if((this.packed >>> 3 & 1) === 1){return true;}return (this.packed >>> x & 1) === 1;};ChannelPermissions.prototype.setBit = function setBit(location,value){if(value){ // allow that permission -this.packed |= 1 << location;}else { // not allowed -this.packed &= 1 << location;}};_createClass(ChannelPermissions,[{key:"asAllowDisallow",get:function get(){var allow=0,disallow=0;function ad(value,position){if(value){allow |= 1 << position;}else {disallow |= 1 << position;}}ad(this.canCreateInstantInvite,0);ad(this.manageRoles,3);ad(this.manageChannels,4);ad(this.readMessages,10);ad(this.sendMessages,11);ad(this.sendTTSMessages,12);ad(this.manageMessages,13);ad(this.embedLinks,14);ad(this.attachFiles,15);ad(this.readMessageHistory,16);ad(this.mentionEveryone,17);ad(this.voiceConnect,20);ad(this.voiceSpeak,21);ad(this.voiceMuteMembers,22);ad(this.voiceDeafenMembers,23);ad(this.voiceMoveMembers,24);ad(this.voiceUseVoiceActivation,25);return {allow:allow,deny:disallow};}},{key:"createInstantInvite",get:function get(){return this.getBit(0);},set:function set(val){this.setBit(0,val);}},{key:"manageRoles",get:function get(){return this.getBit(3);},set:function set(val){this.setBit(3,val);}},{key:"manageChannels",get:function get(){return this.getBit(4);},set:function set(val){this.setBit(4,val);}},{key:"readMessages",get:function get(){return this.getBit(10);},set:function set(val){this.setBit(10,val);}},{key:"sendMessages",get:function get(){return this.getBit(11);},set:function set(val){this.setBit(11,val);}},{key:"sendTTSMessages",get:function get(){return this.getBit(12);},set:function set(val){this.setBit(12,val);}},{key:"manageMessages",get:function get(){return this.getBit(13);},set:function set(val){this.setBit(13,val);}},{key:"embedLinks",get:function get(){return this.getBit(14);},set:function set(val){this.setBit(14,val);}},{key:"attachFiles",get:function get(){return this.getBit(15);},set:function set(val){this.setBit(15,val);}},{key:"readMessageHistory",get:function get(){return this.getBit(16);},set:function set(val){this.setBit(16,val);}},{key:"mentionEveryone",get:function get(){return this.getBit(17);},set:function set(val){this.setBit(17,val);}},{key:"voiceConnect",get:function get(){return this.getBit(20);},set:function set(val){this.setBit(20,val);}},{key:"voiceSpeak",get:function get(){return this.getBit(21);},set:function set(val){this.setBit(21,val);}},{key:"voiceMuteMembers",get:function get(){return this.getBit(22);},set:function set(val){this.setBit(22,val);}},{key:"voiceDeafenMembers",get:function get(){return this.getBit(23);},set:function set(val){this.setBit(23,val);}},{key:"voiceMoveMembers",get:function get(){return this.getBit(24);},set:function set(val){this.setBit(24,val);}},{key:"voiceUseVoiceActivation",get:function get(){return this.getBit(25);},set:function set(val){this.setBit(25,val);}}]);return ChannelPermissions;})();module.exports = ChannelPermissions; +"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"); } } + +var ChannelPermissions = (function () { + function ChannelPermissions(data, channel) { + _classCallCheck(this, ChannelPermissions); + + var self = this; + + function getBit(x) { + return (self.packed >>> x & 1) === 1; + } + + this.type = data.type; //either member or role + this.id = data.id; + + if (this.type === "member") { + this.packed = channel.server.getMember("id", data.id).evalPerms.packed; + } else { + this.packed = channel.server.getRole("id", data.id).packed; + } + + this.packed = this.packed & ~data.deny; + this.packed = this.packed | data.allow; + + this.deny = data.deny; + this.allow = data.allow; + } + + ChannelPermissions.prototype.serialise = function serialise() { + return { + createInstantInvite: this.createInstantInvite, + manageRoles: this.manageRoles, + manageChannels: this.manageChannels, + readMessages: this.readMessages, + sendMessages: this.sendMessage, + sendTTSMessages: this.sendTTSMessages, + manageMessages: this.manageMessages, + embedLinks: this.embedLinks, + attachFiles: this.attachFiles, + readMessageHistory: this.readMessageHistory, + mentionEveryone: this.mentionEveryone, + voiceConnect: this.voiceConnect, + voiceSpeak: this.voiceSpeak, + voiceMuteMembers: this.voiceMuteMembers, + voiceDeafenMembers: this.voiceDeafenMembers, + voiceMoveMember: this.voiceMoveMembers, + voiceUseVoiceActivation: this.voiceUseVoiceActivation + }; + }; + + ChannelPermissions.prototype.serialize = function serialize() { + return this.serialise(); + }; + + ChannelPermissions.prototype.getBit = function getBit(x) { + if ((this.packed >>> 3 & 1) === 1) { + return true; + } + return (this.packed >>> x & 1) === 1; + }; + + ChannelPermissions.prototype.setBit = function setBit(location, value) { + + if (value) { + // allow that permission + this.packed |= 1 << location; + } else { + // not allowed + this.packed &= 1 << location; + } + }; + + _createClass(ChannelPermissions, [{ + key: "asAllowDisallow", + get: function get() { + + var allow = 0, + disallow = 0; + + function ad(value, position) { + if (value) { + allow |= 1 << position; + } else { + disallow |= 1 << position; + } + } + + ad(this.createInstantInvite, 0); + ad(this.manageRoles, 3); + ad(this.manageChannels, 4); + ad(this.readMessages, 10); + ad(this.sendMessages, 11); + ad(this.sendTTSMessages, 12); + ad(this.manageMessages, 13); + ad(this.embedLinks, 14); + ad(this.attachFiles, 15); + ad(this.readMessageHistory, 16); + ad(this.mentionEveryone, 17); + ad(this.voiceConnect, 20); + ad(this.voiceSpeak, 21); + ad(this.voiceMuteMembers, 22); + ad(this.voiceDeafenMembers, 23); + ad(this.voiceMoveMembers, 24); + ad(this.voiceUseVoiceActivation, 25); + + return { + allow: allow, + deny: disallow + }; + } + }, { + key: "createInstantInvite", + get: function get() { + return this.getBit(0); + }, + set: function set(val) { + this.setBit(0, val); + } + }, { + key: "manageRoles", + get: function get() { + return this.getBit(3); + }, + set: function set(val) { + this.setBit(3, val); + } + }, { + key: "manageChannels", + get: function get() { + return this.getBit(4); + }, + set: function set(val) { + this.setBit(4, val); + } + }, { + key: "readMessages", + get: function get() { + return this.getBit(10); + }, + set: function set(val) { + this.setBit(10, val); + } + }, { + key: "sendMessages", + get: function get() { + return this.getBit(11); + }, + set: function set(val) { + this.setBit(11, val); + } + }, { + key: "sendTTSMessages", + get: function get() { + return this.getBit(12); + }, + set: function set(val) { + this.setBit(12, val); + } + }, { + key: "manageMessages", + get: function get() { + return this.getBit(13); + }, + set: function set(val) { + this.setBit(13, val); + } + }, { + key: "embedLinks", + get: function get() { + return this.getBit(14); + }, + set: function set(val) { + this.setBit(14, val); + } + }, { + key: "attachFiles", + get: function get() { + return this.getBit(15); + }, + set: function set(val) { + this.setBit(15, val); + } + }, { + key: "readMessageHistory", + get: function get() { + return this.getBit(16); + }, + set: function set(val) { + this.setBit(16, val); + } + }, { + key: "mentionEveryone", + get: function get() { + return this.getBit(17); + }, + set: function set(val) { + this.setBit(17, val); + } + }, { + key: "voiceConnect", + get: function get() { + return this.getBit(20); + }, + set: function set(val) { + this.setBit(20, val); + } + }, { + key: "voiceSpeak", + get: function get() { + return this.getBit(21); + }, + set: function set(val) { + this.setBit(21, val); + } + }, { + key: "voiceMuteMembers", + get: function get() { + return this.getBit(22); + }, + set: function set(val) { + this.setBit(22, val); + } + }, { + key: "voiceDeafenMembers", + get: function get() { + return this.getBit(23); + }, + set: function set(val) { + this.setBit(23, val); + } + }, { + key: "voiceMoveMembers", + get: function get() { + return this.getBit(24); + }, + set: function set(val) { + this.setBit(24, val); + } + }, { + key: "voiceUseVoiceActivation", + get: function get() { + return this.getBit(25); + }, + set: function set(val) { + this.setBit(25, val); + } + }]); + + return ChannelPermissions; +})(); + +module.exports = ChannelPermissions; \ No newline at end of file diff --git a/lib/Client.js b/lib/Client.js index 83de8beb7..b9fb72f1e 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -1,79 +1,2313 @@ //discord.js modules -"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 Endpoints=require("./Endpoints.js");var User=require("./user.js");var Server=require("./server.js");var Channel=require("./channel.js");var Message=require("./message.js");var Invite=require("./invite.js");var PMChannel=require("./PMChannel.js");var ServerPermissions=require("./ServerPermissions.js");var gameMap=require("../ref/gameMap.json");var Color=require("../ref/colours.js");var Embeddable=require("./Embeds/IEmbed.js");var zlib;var EventEmitter=require('events'); //node modules -var request=require("superagent");var WebSocket=require("ws");var fs=require("fs");var defaultOptions={queue:false};var Client=(function(_EventEmitter){_inherits(Client,_EventEmitter);function Client(){var options=arguments.length <= 0 || arguments[0] === undefined?defaultOptions:arguments[0];var token=arguments.length <= 1 || arguments[1] === undefined?undefined:arguments[1];_classCallCheck(this,Client); /* - When created, if a token is specified the Client will - try connecting with it. If the token is incorrect, no - further efforts will be made to connect. - */_EventEmitter.call(this);this.options = options;this.options.catchup = options.catchup;this.options.compress = options.compress;if(this.options.compress){ // only require zlib if necessary -zlib = require("zlib");}this.token = token;this.state = 0;this.websocket = null;this.user = null;this.alreadySentData = false;this.serverCreateListener = {};this.typingIntervals = {};this.email = "abc";this.password = "abc"; /* - State values: - 0 - idle - 1 - logging in - 2 - logged in - 3 - ready - 4 - disconnected - */this.userCache = [];this.channelCache = [];this.serverCache = [];this.pmChannelCache = [];this.readyTime = null;this.checkingQueue = {};this.userTypingListener = {};this.queue = {};this.guildRoleCreateIgnoreList = {};this.__idleTime = null;this.__gameId = null;this.timeoffset = 0;}Client.prototype.sendPacket = function sendPacket(JSONObject){if(this.websocket.readyState === 1){this.websocket.send(JSON.stringify(JSONObject));}}; //def debug -Client.prototype.debug = function debug(message){this.emit("debug",message);};Client.prototype.keepAlive = function keepAlive(){this.debug("keep alive emitted");this.sendPacket({op:1,d:Date.now()});}; //def login -Client.prototype.login = function login(){var email=arguments.length <= 0 || arguments[0] === undefined?"foo@bar.com":arguments[0];var password=arguments.length <= 1 || arguments[1] === undefined?"pass1234":arguments[1];var callback=arguments.length <= 2 || arguments[2] === undefined?function(err,token){}:arguments[2];var self=this;return new Promise(function(resolve,reject){if(self.state === 0 || self.state === 4){self.state = 1; //set the state to logging in -self.email = email;self.password = password;request.post(Endpoints.LOGIN).send({email:email,password:password}).end(function(err,res){if(err){self.state = 4; //set state to disconnected -self.emit("disconnected");if(self.websocket){self.websocket.close();}self.debug("error logging in - " + err);callback(err);reject(err);}else {self.state = 2; //set state to logged in (not yet ready) -self.token = res.body.token; //set our token -self.debug("client logged in w/ token " + self.token);self.getGateway().then(function(url){self.debug("gateway response successful");self.createws(url);callback(null,self.token);resolve(self.token);})["catch"](function(err){self.debug("unable to connect to gateways - " + err);callback(err);reject(err);});}});}else {reject(new Error("Client already logging in or ready"));}});};Client.prototype.banMember = function banMember(user,server){var daysToDeleteMessage=arguments.length <= 2 || arguments[2] === undefined?1:arguments[2];var cb=arguments.length <= 3 || arguments[3] === undefined?function(err){}:arguments[3];var self=this;return new Promise(function(resolve,reject){var serverID=self.resolveServerID(server);var memberID=self.resolveUserID(user);request.put(Endpoints.SERVERS + "/" + serverID + "/bans/" + memberID + "?delete-message-days=" + daysToDeleteMessage).set("authorization",self.token).end(function(err,res){cb(err);if(err){reject(err);}else {resolve();}});});};Client.prototype.logout = function logout(){var callback=arguments.length <= 0 || arguments[0] === undefined?function(err){}:arguments[0];var self=this;return new Promise(function(resolve,reject){request.post(Endpoints.LOGOUT).set("authorization",self.token).end(function(err,res){if(err){callback(err);reject(err);}else {self.websocket.close();self.state = 4;callback();resolve();}});});};Client.prototype.createServer = function createServer(name,region){var callback=arguments.length <= 2 || arguments[2] === undefined?function(err,server){}:arguments[2];var self=this;return new Promise(function(resolve,reject){request.post(Endpoints.SERVERS).set("authorization",self.token).send({name:name,region:region}).end(function(err,res){if(err){callback(err);reject(err);}else { // potentially redundant in future -// creating here does NOT give us the channels of the server -// so we must wait for the guild_create event. -self.serverCreateListener[res.body.id] = [resolve,callback]; /*var srv = self.addServer(res.body); - callback(null, srv); - resolve(srv);*/}});});};Client.prototype.createChannel = function createChannel(server,channelName,channelType){var callback=arguments.length <= 3 || arguments[3] === undefined?function(err,chann){}:arguments[3];var self=this;return new Promise(function(resolve,reject){request.post(Endpoints.SERVERS + "/" + self.resolveServerID(server) + "/channels").set("authorization",self.token).send({name:channelName,type:channelType}).end(function(err,res){if(err){callback(err);reject(err);}else {var server=self.getServer("id",res.body.guild_id);var chann=self.addChannel(res.body,res.body.guild_id);server.addChannel(chann);callback(null,chann);resolve(chann);}});});};Client.prototype.leaveServer = function leaveServer(server){var callback=arguments.length <= 1 || arguments[1] === undefined?function(err,server){}:arguments[1];var self=this;return new Promise(function(resolve,reject){request.del(Endpoints.SERVERS + "/" + self.resolveServerID(server)).set("authorization",self.token).end(function(err,res){if(err){callback(err);reject(err);}else {self.serverCache.splice(self.serverCache.indexOf(server),1);callback(null);resolve();}});});};Client.prototype.createInvite = function createInvite(serverOrChannel,options){var callback=arguments.length <= 2 || arguments[2] === undefined?function(err,invite){}:arguments[2];var self=this;return new Promise(function(resolve,reject){var destination;if(serverOrChannel instanceof Server){destination = serverOrChannel.id;}else if(serverOrChannel instanceof Channel){destination = serverOrChannel.id;}else {destination = serverOrChannel;}options = options || {};options.max_age = options.maxAge || 0;options.max_uses = options.maxUses || 0;options.temporary = options.temporary || false;options.xkcdpass = options.xkcd || false;request.post(Endpoints.CHANNELS + "/" + destination + "/invites").set("authorization",self.token).send(options).end(function(err,res){if(err){callback(err);reject(err);}else {var inv=new Invite(res.body,self);callback(null,inv);resolve(inv);}});});};Client.prototype.startPM = function startPM(user){var self=this;return new Promise(function(resolve,reject){var userId=user;if(user instanceof User){userId = user.id;}request.post(Endpoints.USERS + "/" + self.user.id + "/channels").set("authorization",self.token).send({recipient_id:userId}).end(function(err,res){if(err){reject(err);}else {resolve(self.addPMChannel(res.body));}});});};Client.prototype.reply = function reply(destination,message,options){var callback=arguments.length <= 3 || arguments[3] === undefined?function(err,msg){}:arguments[3];var self=this;return new Promise(function(response,reject){if(typeof options === "function"){ // options is a function, which means the developer wants this to be the callback -callback = options;options = false;}var user=destination.sender;self.sendMessage(destination,message,options,callback,user + ", ").then(response)["catch"](reject);});};Client.prototype.deleteMessage = function deleteMessage(message,timeout){var callback=arguments.length <= 2 || arguments[2] === undefined?function(err,msg){}:arguments[2];var self=this;return new Promise(function(resolve,reject){if(timeout){setTimeout(remove,timeout);}else {remove();}function remove(){request.del(Endpoints.CHANNELS + "/" + message.channel.id + "/messages/" + message.id).set("authorization",self.token).end(function(err,res){if(err){bad();}else {good();}});}function good(){callback();resolve();}function bad(err){callback(err);reject(err);}});};Client.prototype.updateMessage = function updateMessage(message,content){var callback=arguments.length <= 2 || arguments[2] === undefined?function(err,msg){}:arguments[2];var self=this;var prom=new Promise(function(resolve,reject){content = content instanceof Array?content.join("\n"):content;if(self.options.queue){if(!self.queue[message.channel.id]){self.queue[message.channel.id] = [];}self.queue[message.channel.id].push({action:"updateMessage",message:message,content:content,then:good,error:bad});self.checkQueue(message.channel.id);}else {self._updateMessage(message,content).then(good)["catch"](bad);}function good(msg){prom.message = msg;callback(null,msg);resolve(msg);}function bad(error){prom.error = error;callback(error);reject(error);}});return prom;};Client.prototype.setUsername = function setUsername(newName){var callback=arguments.length <= 1 || arguments[1] === undefined?function(err){}:arguments[1];var self=this;return new Promise(function(resolve,reject){request.patch(Endpoints.API + "/users/@me").set("authorization",self.token).send({avatar:self.user.avatar,email:self.email,new_password:null,password:self.password,username:newName}).end(function(err){callback(err);if(err)reject(err);else resolve();});});};Client.prototype.getChannelLogs = function getChannelLogs(channel){var amount=arguments.length <= 1 || arguments[1] === undefined?500: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];var self=this;return new Promise(function(resolve,reject){var channelID=channel;if(channel instanceof Channel){channelID = channel.id;}var params=[];if(options.before){params.push("before=" + (options.before instanceof Message?options.before.id:options.before));}if(options.after){params.push("after=" + (options.after instanceof Message?options.after.id:options.after));}var joinedParams=params.join();if(joinedParams !== "")joinedParams = "&" + params.join();request.get(Endpoints.CHANNELS + "/" + channelID + "/messages?limit=" + amount + joinedParams).set("authorization",self.token).end(function(err,res){if(err){callback(err);reject(err);}else {var logs=[];var channel=self.getChannel("id",channelID);for(var _iterator=res.body,_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 message=_ref;var mentions=[];for(var _iterator2=message.mentions,_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;var user=self.addUser(mention);if(channel.server)mentions.push(channel.server.getMember("id",user.id) || user);else mentions.push(user);}var authorRaw=self.addUser(message.author),author;if(channel.server)author = channel.server.getMember("id",authorRaw.id) || authorRaw;else author = authorRaw;logs.push(new Message(message,channel,mentions,author));}callback(null,logs);resolve(logs);}});});};Client.prototype.deleteChannel = function deleteChannel(channel){var callback=arguments.length <= 1 || arguments[1] === undefined?function(err){}:arguments[1];var self=this;return new Promise(function(resolve,reject){var channelID=channel;if(channel instanceof Channel){channelID = channel.id;}request.del(Endpoints.CHANNELS + "/" + channelID).set("authorization",self.token).end(function(err){if(err){callback(err);reject(err);}else {callback(null);resolve();}});});};Client.prototype.joinServer = function joinServer(invite){var callback=arguments.length <= 1 || arguments[1] === undefined?function(err,server){}:arguments[1];var self=this;return new Promise(function(resolve,reject){var id=self.resolveInvite(invite);request.post(Endpoints.API + "/invite/" + id).set("authorization",self.token).end(function(err,res){if(err){callback(err);reject(err);}else {if(self.getServer("id",res.body.guild.id)){resolve(self.getServer("id",res.body.guild.id));}else {self.serverCreateListener[res.body.guild.id] = [resolve,callback];}}});});};Client.prototype.setAvatar = function setAvatar(resource){var callback=arguments.length <= 1 || arguments[1] === undefined?function(err){}:arguments[1];var self=this;return new Promise(function(resolve,reject){if(resource instanceof Buffer){resource = resource.toString("base64");resource = "data:image/jpg;base64," + resource;}request.patch(Endpoints.API + "/users/@me").set("authorization",self.token).send({avatar:resource,email:self.email,new_password:null,password:self.password,username:self.user.username}).end(function(err){callback(err);if(err)reject(err);else resolve();});});};Client.prototype.sendFile = function sendFile(destination,file){var fileName=arguments.length <= 2 || arguments[2] === undefined?"image.png":arguments[2];var callback=arguments.length <= 3 || arguments[3] === undefined?function(err,msg){}:arguments[3];var self=this;var prom=new Promise(function(resolve,reject){var fstream;if(typeof file === "string" || file instanceof String){fstream = fs.createReadStream(file);fileName = file;}else {fstream = file;}self.resolveDestination(destination).then(send)["catch"](bad);function send(destination){if(self.options.queue){ //queue send file too -if(!self.queue[destination]){self.queue[destination] = [];}self.queue[destination].push({action:"sendFile",attachment:fstream,attachmentName:fileName,then:good,error:bad});self.checkQueue(destination);}else { //not queue -self._sendFile(destination,fstream,fileName).then(good)["catch"](bad);}}function good(msg){prom.message = msg;callback(null,msg);resolve(msg);}function bad(err){prom.error = err;callback(err);reject(err);}});return prom;};Client.prototype.sendMessage = function sendMessage(destination,message,options){var callback=arguments.length <= 3 || arguments[3] === undefined?function(err,msg){}:arguments[3];var premessage=arguments.length <= 4 || arguments[4] === undefined?"":arguments[4];var self=this;var prom=new Promise(function(resolve,reject){if(typeof options === "function"){ // options is a function, which means the developer wants this to be the callback -callback = options;options = {tts:false};}if(!options){options = {tts:false};}message = premessage + resolveMessage(message);var mentions=resolveMentions();self.resolveDestination(destination).then(send)["catch"](error);function error(err){callback(err);reject(err);}function send(destination){if(self.options.queue){ //we're QUEUEING messages, so sending them sequentially based on servers. -if(!self.queue[destination]){self.queue[destination] = [];}self.queue[destination].push({action:"sendMessage",content:message,mentions:mentions,tts:options.tts, //incase it's not a boolean -then:mgood,error:mbad});self.checkQueue(destination);}else {self._sendMessage(destination,message,options,mentions).then(mgood)["catch"](mbad);}}function mgood(msg){prom.message = msg;callback(null,msg);resolve(msg);}function mbad(error){prom.error = error;callback(error);reject(error);}function resolveMessage(){var msg=message;if(message instanceof Array){msg = message.join("\n");}return msg;}function resolveMentions(){var _mentions=[];for(var _iterator3=message.match(/<@[^>]*>/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;_mentions.push(mention.substring(2,mention.length - 1));}return _mentions;}});return prom;};Client.prototype.createRoleIfNotExists = function createRoleIfNotExists(dest,data){var cb=arguments.length <= 2 || arguments[2] === undefined?function(err,role){}:arguments[2];var self=this;return new Promise(function(resolve,reject){var serverID=self.resolveServerID(dest);var server=self.getServer("id",serverID);var baseRole=new ServerPermissions({},server);for(var key in data) {baseRole[key] = data[key];}for(var _iterator4=server.roles,_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 role=_ref4;if(baseRole.name == role.name && baseRole.packed == role.packed && baseRole.color == role.color){resolve(role);cb(null,role);return false;}}self.createRole(dest,data).then(function(role){cb(null,role);resolve(role);})["catch"](function(e){cb(e);reject(e);});});};Client.prototype.createRole = function createRole(dest,data){var cb=arguments.length <= 2 || arguments[2] === undefined?function(err,role){}:arguments[2];var self=this;return new Promise(function(resolve,reject){var ddest=self.resolveServerID(dest);var server=self.getServer("id",ddest);request.post(Endpoints.SERVERS + "/" + ddest + "/roles").set("authorization",self.token).end(function(err,res){if(err){cb(err);reject(err);}else {var perm=server.addRole(res.body);if(data.color)data.color = Color.toDec(data.color);self.guildRoleCreateIgnoreList[res.body.id] = true;server.addRole(res.body);self.updateRole(perm,data).then(function(perm){cb(null,perm);resolve(perm);})["catch"](function(err){cb(err);reject(err);});}});});};Client.prototype.updateRole = function updateRole(role,data){var cb=arguments.length <= 2 || arguments[2] === undefined?function(err,perm){}:arguments[2];var self=this;return new Promise(function(resolve,reject){var server=role.server.id;var tempRole=role;for(var key in data) {tempRole[key] = data[key];}if(isNaN(Color.toDec(data.color))){var err=new Error("Invalid Color");reject(err);cb(err);return;}request.patch(Endpoints.SERVERS + "/" + server + "/roles/" + role.id).set("authorization",self.token).send({color:tempRole.color,hoist:tempRole.hoist,name:tempRole.name,permissions:tempRole.packed}).end(function(err,res){if(err){cb(err);reject(err);}else {var data=self.getServer("id",server).updateRole(res.body);resolve(data);cb(null,data);}});});};Client.prototype.deleteRole = function deleteRole(role){var callback=arguments.length <= 1 || arguments[1] === undefined?function(err){}:arguments[1]; // role is a ServerPermissions -var self=this;return new Promise(function(resolve,reject){request.del(Endpoints.SERVERS + "/" + role.server.id + "/roles/" + role.id).set("authorization",self.token).end(function(err){if(err){reject(err);callback(err);}else {resolve();callback();}});});};Client.prototype.addMemberToRole = function addMemberToRole(member,role){var callback=arguments.length <= 2 || arguments[2] === undefined?function(err){}:arguments[2];var self=this;return new Promise(function(resolve,reject){try{var serverId=self.resolveServerID(member.server);var memberId=self.resolveUserID(member);var acServer=self.getServer("id",serverId);var acMember=acServer.getMember("id",memberId);if(acMember.rawRoles.indexOf(role.id) !== -1){ // user already has role -return;}request.patch("https://discordapp.com/api/guilds/" + serverId + "/members/" + memberId).set("authorization",self.token).send({roles:acMember.rawRoles.concat(role.id)}).end(function(err){if(err){reject(err);callback(err);}else {acMember.addRole(role);resolve();callback();}});}catch(e) {reject(e);}});};Client.prototype.removeMemberFromRole = function removeMemberFromRole(member,role){var callback=arguments.length <= 2 || arguments[2] === undefined?function(err){}:arguments[2];var self=this;return new Promise(function(resolve,reject){try{var serverId=self.resolveServerID(member.server);var memberId=self.resolveUserID(member);var acServer=self.getServer("id",serverId);var acMember=acServer.getMember("id",memberId);if(~acMember.rawRoles.indexOf(role.id)){acMember.removeRole(role);}request.patch("https://discordapp.com/api/guilds/" + serverId + "/members/" + memberId).set("authorization",self.token).send({roles:acMember.rawRoles}).end(function(err){if(err){reject(err);callback(err);}else {acMember.addRole(role);resolve();callback();}});}catch(e) {reject(e);}});};Client.prototype.overwritePermissions = function overwritePermissions(channel,role,updatedStuff){var callback=arguments.length <= 3 || arguments[3] === undefined?function(err){}:arguments[3];var self=this;return new Promise(function(resolve,reject){function dieerror(e){reject(e);callback(e);}self.resolveDestination(channel).then(next)["catch"](dieerror);function next(channelID){var data;if(role instanceof ServerPermissions || role.type === "role"){data = ad(updatedStuff);data.id = role.id;data.type = "role";}else {data = ad(updatedStuff);data.id = role.id;data.type = "member";}request.put(Endpoints.CHANNELS + "/" + channelID + "/permissions/" + role.id).set("authorization",self.token).send(data).end(function(err){if(err){reject(err);callback(err);}else {resolve();callback();}});}});function ad(data){var allow=0,disallow=0;function bitit(value,position){if(value){allow |= 1 << position;}else {disallow |= 1 << position;}}for(var perm in data) {switch(perm){case "canCreateInstantInvite":bitit(data[perm],0);break;case "manageRoles":bitit(data[perm],3);break;case "manageChannels":bitit(data[perm],4);break;case "readMessages":bitit(data[perm],10);break;case "sendMessages":bitit(data[perm],11);break;case "sendTTSMessages":bitit(data[perm],12);break;case "manageMessages":bitit(data[perm],13);break;case "embedLinks":bitit(data[perm],14);break;case "attachFiles":bitit(data[perm],15);break;case "readMessageHistory":bitit(data[perm],16);break;case "mentionEveryone":bitit(data[perm],17);break;case "voiceConnect":bitit(data[perm],20);break;case "voiceSpeak":bitit(data[perm],21);break;case "voiceMuteMembers":bitit(data[perm],22);break;case "voiceDeafenMembers":bitit(data[perm],23);break;case "voiceMoveMembers":bitit(data[perm],24);break;case "voiceUseVoiceActivation":bitit(data[perm],25);break;default:break;}}return {allow:allow,deny:disallow};}};Client.prototype.getBans = function getBans(serverResource){var callback=arguments.length <= 1 || arguments[1] === undefined?function(err,arrayOfBans){}:arguments[1];var self=this;return new Promise(function(resolve,reject){var serverID=self.resolveServerID(serverResource);request.get(Endpoints.SERVERS + "/" + serverID + "/bans").set("authorization",self.token).end(function(err,res){if(err){callback(err);reject(err);}else {var banList=[];for(var _iterator5=res.body,_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 user=_ref5;banList.push(self.addUser(user.user));}callback(null,banList);resolve(banList);}});});}; //def createws -Client.prototype.createws = function createws(url){if(this.websocket)return false;var self=this; //good to go -this.websocket = new WebSocket(url); //open -this.websocket.onopen = function(){self.trySendConnData(); //try connecting -}; //close -this.websocket.onclose = function(){self.emit("disconnected");}; //message -this.websocket.onmessage = function(e){if(e.type === "Binary"){if(!zlib)zlib = require("zlib");e.data = zlib.inflateSync(e.data).toString();}var dat=false,data={};try{dat = JSON.parse(e.data);data = dat.d;}catch(err) {self.emit("error",err,e);return;}self.emit("raw",dat); //valid message -switch(dat.t){case "READY":self.debug("received ready packet");self.user = self.addUser(data.user);for(var _iterator6=data.guilds,_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 _server=_ref6;var server=self.addServer(_server);}for(var _iterator7=data.private_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 _pmc=_ref7;var pmc=self.addPMChannel(_pmc);}self.emit("ready");self.readyTime = Date.now();self.debug("cached " + self.serverCache.length + " servers, " + self.channelCache.length + " channels, " + self.pmChannelCache.length + " PMs and " + self.userCache.length + " users.");self.state = 3;setInterval(function(){self.keepAlive.apply(self);},data.heartbeat_interval);self.checkCatchUp(data.read_state);break;case "MESSAGE_CREATE":self.debug("received message");var mentions=[];data.mentions = data.mentions || []; //for some reason this was not defined at some point? -var channel=self.getChannel("id",data.channel_id);for(var _iterator8=data.mentions,_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 mention=_ref8;var user=self.addUser(mention);if(channel.server)mentions.push(channel.server.getMember("id",user.id) || user);else mentions.push(user);}if(channel){var msg=channel.addMessage(new Message(data,channel,mentions,data.author));self.emit("message",msg);}self.ack(msg);break;case "MESSAGE_DELETE":self.debug("message deleted");var channel=self.getChannel("id",data.channel_id);var message=channel.getMessage("id",data.id);if(message){self.emit("messageDelete",channel,message);channel.messages.splice(channel.messages.indexOf(message),1);}else { //don't have the cache of that message ;( -self.emit("messageDelete",channel);}break;case "MESSAGE_UPDATE":self.debug("message updated");var channel=self.getChannel("id",data.channel_id);var formerMessage=channel.getMessage("id",data.id);if(formerMessage){ //new message might be partial, so we need to fill it with whatever the old message was. -var info={};for(var key in formerMessage) {info[key] = formerMessage[key];}for(var key in data) {info[key] = data[key];}data.mentions = data.mentions || [];var mentions=[];for(var _iterator9=data.mentions,_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 mention=_ref9;var user=self.addUser(mention);if(channel.server)mentions.push(channel.server.getMember("id",user.id) || user);else mentions.push(user);}var newMessage=new Message(info,channel,mentions,formerMessage.author);self.emit("messageUpdate",newMessage,formerMessage);channel.messages[channel.messages.indexOf(formerMessage)] = newMessage;} // message isn't in cache, and if it's a partial it could cause -// all hell to break loose... best to just act as if nothing happened -break;case "GUILD_DELETE":var server=self.getServer("id",data.id);if(server){self.serverCache.splice(self.serverCache.indexOf(server),1);self.emit("serverDelete",server);}break;case "GUILD_BAN_ADD":var bannedUser=self.addUser(data.user);var server=self.getServer("id",data.guild_id);self.emit("userBanned",bannedUser,server);break;case "GUILD_BAN_REMOVE":var bannedUser=self.addUser(data.user);var server=self.getServer("id",data.guild_id);self.emit("userUnbanned",bannedUser,server);break;case "CHANNEL_DELETE":var channel=self.getChannel("id",data.id);if(channel){self.channelCache.splice(self.channelCache.indexOf(channel),1);server.channels.splice(server.channels.indexOf(channel),1);self.emit("channelDelete",channel);}break;case "GUILD_UPDATE":var server=self.getServer("id",data.id);var newserver=self.addServer(data,true);self.serverCache.splice(self.serverCache.indexOf(server),1);self.emit("serverUpdate",server,newserver);break;case "GUILD_CREATE":var server=self.getServer("id",data.id);if(!server){ //if server doesn't already exist because duh -server = self.addServer(data);} /*else if(server.channels.length === 0){ - - var srv = new Server(data, self); - for(channel of data.channels){ - srv.channels.push(new Channel(channel, data.id)); +"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 Endpoints = require("./Endpoints.js"); +var User = require("./user.js"); +var Server = require("./server.js"); +var Channel = require("./channel.js"); +var Message = require("./message.js"); +var Invite = require("./invite.js"); +var PMChannel = require("./PMChannel.js"); +var ServerPermissions = require("./ServerPermissions.js"); +var gameMap = require("../ref/gameMap.json"); +var Color = require("../ref/colours.js"); +var Embeddable = require("./Embeds/IEmbed.js"); +var zlib; + +var EventEmitter = require('events'); + +//node modules +var request = require("superagent"); +var WebSocket = require("ws"); +var fs = require("fs"); + +var defaultOptions = { + queue: false +}; + +var Client = (function (_EventEmitter) { + _inherits(Client, _EventEmitter); + + function Client() { + var options = arguments.length <= 0 || arguments[0] === undefined ? defaultOptions : arguments[0]; + var token = arguments.length <= 1 || arguments[1] === undefined ? undefined : arguments[1]; + + _classCallCheck(this, Client); + + /* + When created, if a token is specified the Client will + try connecting with it. If the token is incorrect, no + further efforts will be made to connect. + */ + _EventEmitter.call(this); + + this.options = options; + this.options.catchup = options.catchup; + this.options.compress = options.compress; + + if (this.options.compress) { + // only require zlib if necessary + zlib = require("zlib"); + } + + this.token = token; + this.state = 0; + this.websocket = null; + this.user = null; + this.alreadySentData = false; + this.serverCreateListener = {}; + this.typingIntervals = {}; + this.email = "abc"; + this.password = "abc"; + + /* + State values: + 0 - idle + 1 - logging in + 2 - logged in + 3 - ready + 4 - disconnected + */ + + this.userCache = []; + this.channelCache = []; + this.serverCache = []; + this.pmChannelCache = []; + this.readyTime = null; + this.checkingQueue = {}; + this.userTypingListener = {}; + this.queue = {}; + this.guildRoleCreateIgnoreList = {}; + this.__idleTime = null; + this.__gameId = null; + this.timeoffset = 0; + } + + Client.prototype.sendPacket = function sendPacket(JSONObject) { + if (this.websocket.readyState === 1) { + this.websocket.send(JSON.stringify(JSONObject)); + } + }; + + //def debug + + Client.prototype.debug = function debug(message) { + this.emit("debug", message); + }; + + Client.prototype.keepAlive = function keepAlive() { + this.debug("keep alive emitted"); + this.sendPacket({ + op: 1, + d: Date.now() + }); + }; + + //def login + + Client.prototype.login = function login() { + var email = arguments.length <= 0 || arguments[0] === undefined ? "foo@bar.com" : arguments[0]; + var password = arguments.length <= 1 || arguments[1] === undefined ? "pass1234" : arguments[1]; + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err, token) {} : arguments[2]; + + var self = this; + + return new Promise(function (resolve, reject) { + if (self.state === 0 || self.state === 4) { + + self.state = 1; //set the state to logging in + + self.email = email; + self.password = password; + + request.post(Endpoints.LOGIN).send({ + email: email, + password: password + }).end(function (err, res) { + + if (err) { + self.state = 4; //set state to disconnected + self.emit("disconnected"); + if (self.websocket) { + self.websocket.close(); } - self.serverCache[self.serverCache.indexOf(server)] = srv; - - }*/var keepCheck=setInterval(function(){if(self.serverCreateListener[data.id]){var cbs=self.serverCreateListener[data.id];cbs[0](server); //promise then callback -cbs[1](null,server); //legacy callback -self.serverCreateListener[data.id] = null;self.emit("serverCreate",server);clearInterval(keepCheck);}},50);break;case "CHANNEL_CREATE":var channel=self.getChannel("id",data.id);if(!channel){var chann;if(data.is_private){chann = self.addPMChannel(data);}else {chann = self.addChannel(data,data.guild_id);}var srv=self.getServer("id",data.guild_id);if(srv){srv.addChannel(chann);}self.emit("channelCreate",chann);}break;case "GUILD_MEMBER_ADD":var server=self.getServer("id",data.guild_id);if(server){var user=self.addUser(data.user); //if for whatever reason it doesn't exist.. -self.emit("serverNewMember",server.addMember(user,data.roles),server);}break;case "GUILD_MEMBER_REMOVE":var server=self.getServer("id",data.guild_id);if(server){var user=self.addUser(data.user); //if for whatever reason it doesn't exist.. -server.removeMember("id",user.id);self.emit("serverRemoveMember",user,server);}break;case "GUILD_MEMBER_UPDATE":var user=self.addUser(data.user);var server=self.getServer("id",data.guild_id);var member=server.getMember("id",user.id);self.emit("serverMemberUpdate",member,data.roles);server.getMember("id",user.id).rawRoles = data.roles;break;case "USER_UPDATE":if(self.user && data.id === self.user.id){var newUser=new User(data); //not actually adding to the cache -self.emit("userUpdate",newUser,self.user);if(~self.userCache.indexOf(self.user)){self.userCache[self.userCache.indexOf(self.user)] = newUser;}self.user = newUser;}break;case "PRESENCE_UPDATE":var userInCache=self.getUser("id",data.user.id);if(userInCache){ //user exists -data.user.username = data.user.username || userInCache.username;data.user.id = data.user.id || userInCache.id;data.user.discriminator = data.user.discriminator || userInCache.discriminator;data.user.avatar = data.user.avatar || userInCache.avatar;var presenceUser=new User(data.user);if(presenceUser.equalsStrict(userInCache)){ //they're exactly the same, an actual presence update -self.emit("presence",{user:userInCache,oldStatus:userInCache.status,status:data.status,server:self.getServer("id",data.guild_id),gameId:data.game_id});userInCache.status = data.status;userInCache.gameId = data.game_id;}else { //one of their details changed. -self.userCache[self.userCache.indexOf(userInCache)] = presenceUser;self.emit("userUpdate",userInCache,presenceUser);}}break;case "CHANNEL_UPDATE":var channelInCache=self.getChannel("id",data.id),serverInCache=self.getServer("id",data.guild_id);if(channelInCache && serverInCache){var newChann=new Channel(data,serverInCache);newChann.messages = channelInCache.messages;self.emit("channelUpdate",channelInCache,newChann);self.channelCache[self.channelCache.indexOf(channelInCache)] = newChann;}break;case "TYPING_START":var userInCache=self.getUser("id",data.user_id);var channelInCache=self.getChannel("id",data.channel_id);if(!self.userTypingListener[data.user_id] || self.userTypingListener[data.user_id] === -1){self.emit("startTyping",userInCache,channelInCache);}self.userTypingListener[data.user_id] = Date.now();setTimeout(function(){if(self.userTypingListener[data.user_id] === -1){return;}if(Date.now() - self.userTypingListener[data.user_id] > 6000){ // stopped typing -self.emit("stopTyping",userInCache,channelInCache);self.userTypingListener[data.user_id] = -1;}},6000);break;case "GUILD_ROLE_CREATE":var server=self.getServer("id",data.guild_id);var role=data.role;if(self.guildRoleCreateIgnoreList[data.role.id]){self.guildRoleCreateIgnoreList[data.role.id] = null;break;}self.emit("serverRoleCreate",server,server.addRole(role));break;case "GUILD_ROLE_DELETE":var server=self.getServer("id",data.guild_id);var role=server.getRole("id",data.role_id);self.emit("serverRoleDelete",server,role);server.removeRole(role.id);break;case "GUILD_ROLE_UPDATE":var server=self.getServer("id",data.guild_id);var role=server.getRole("id",data.role.id);var newRole=server.updateRole(data.role);self.emit("serverRoleUpdate",server,role,newRole);break;default:self.debug("received unknown packet");self.emit("unknown",dat);break;}};}; //def addUser -Client.prototype.addUser = function addUser(data){if(!this.getUser("id",data.id)){this.userCache.push(new User(data));}return this.getUser("id",data.id);}; //def addChannel -Client.prototype.addChannel = function addChannel(data,serverId){if(!this.getChannel("id",data.id)){this.channelCache.push(new Channel(data,this.getServer("id",serverId)));}return this.getChannel("id",data.id);};Client.prototype.addPMChannel = function addPMChannel(data){if(!this.getPMChannel("id",data.id)){this.pmChannelCache.push(new PMChannel(data,this));}return this.getPMChannel("id",data.id);};Client.prototype.setTopic = function setTopic(channel,topic){var callback=arguments.length <= 2 || arguments[2] === undefined?function(err){}:arguments[2];var self=this;return new Promise(function(resolve,reject){self.resolveDestination(channel).then(next)["catch"](error);function error(e){callback(e);reject(e);}function next(destination){var asChan=self.getChannel("id",destination);request.patch(Endpoints.CHANNELS + "/" + destination).set("authorization",self.token).send({name:asChan.name,position:0,topic:topic}).end(function(err,res){if(err){error(err);}else {asChan.topic = res.body.topic;resolve();callback();}});}});}; //def addServer -Client.prototype.addServer = function addServer(data){var force=arguments.length <= 1 || arguments[1] === undefined?false:arguments[1];var self=this;var server=this.getServer("id",data.id);if(data.unavailable){self.emit("unavailable",data);self.debug("Server ID " + data.id + " has been marked unavailable by Discord. It was not cached.");return;}if(!server || force){server = new Server(data,this);this.serverCache.push(server);if(data.channels){for(var _iterator10=data.channels,_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 channel=_ref10;server.channels.push(this.addChannel(channel,server.id));}}if(data.presences){for(var _iterator11=data.presences,_isArray11=Array.isArray(_iterator11),_i11=0,_iterator11=_isArray11?_iterator11:_iterator11[Symbol.iterator]();;) {var _ref11;if(_isArray11){if(_i11 >= _iterator11.length)break;_ref11 = _iterator11[_i11++];}else {_i11 = _iterator11.next();if(_i11.done)break;_ref11 = _i11.value;}var presence=_ref11;var user=self.getUser("id",presence.user.id);user.status = presence.status;user.gameId = presence.game_id;}}}return server;}; //def getUser -Client.prototype.getUser = function getUser(key,value){for(var _iterator12=this.userCache,_isArray12=Array.isArray(_iterator12),_i12=0,_iterator12=_isArray12?_iterator12:_iterator12[Symbol.iterator]();;) {var _ref12;if(_isArray12){if(_i12 >= _iterator12.length)break;_ref12 = _iterator12[_i12++];}else {_i12 = _iterator12.next();if(_i12.done)break;_ref12 = _i12.value;}var user=_ref12;if(user[key] === value){return user;}}return null;}; //def getChannel -Client.prototype.getChannel = function getChannel(key,value){for(var _iterator13=this.channelCache,_isArray13=Array.isArray(_iterator13),_i13=0,_iterator13=_isArray13?_iterator13:_iterator13[Symbol.iterator]();;) {var _ref13;if(_isArray13){if(_i13 >= _iterator13.length)break;_ref13 = _iterator13[_i13++];}else {_i13 = _iterator13.next();if(_i13.done)break;_ref13 = _i13.value;}var channel=_ref13;if(channel[key] === value){return channel;}}return this.getPMChannel(key,value); //might be a PM -};Client.prototype.getPMChannel = function getPMChannel(key,value){for(var _iterator14=this.pmChannelCache,_isArray14=Array.isArray(_iterator14),_i14=0,_iterator14=_isArray14?_iterator14:_iterator14[Symbol.iterator]();;) {var _ref14;if(_isArray14){if(_i14 >= _iterator14.length)break;_ref14 = _iterator14[_i14++];}else {_i14 = _iterator14.next();if(_i14.done)break;_ref14 = _i14.value;}var channel=_ref14;if(channel[key] === value){return channel;}}return null;}; //def getServer -Client.prototype.getServer = function getServer(key,value){for(var _iterator15=this.serverCache,_isArray15=Array.isArray(_iterator15),_i15=0,_iterator15=_isArray15?_iterator15:_iterator15[Symbol.iterator]();;) {var _ref15;if(_isArray15){if(_i15 >= _iterator15.length)break;_ref15 = _iterator15[_i15++];}else {_i15 = _iterator15.next();if(_i15.done)break;_ref15 = _i15.value;}var server=_ref15;if(server[key] === value){return server;}}return null;}; //def trySendConnData -Client.prototype.trySendConnData = function trySendConnData(){var self=this;if(this.token && !this.alreadySentData){this.alreadySentData = true;var data={op:2,d:{token:this.token,v:3,properties:{"$os":"discord.js","$browser":"discord.js","$device":"discord.js","$referrer":"","$referring_domain":""},compress:self.options.compress}};this.websocket.send(JSON.stringify(data));}};Client.prototype.resolveServerID = function resolveServerID(resource){if(resource instanceof Server){return resource.id;}else if(resource instanceof Channel){return resource.server.id;}else if(resource instanceof Message){return resource.channel.server.id;}else {return resource;}};Client.prototype.resolveUserID = function resolveUserID(resource){if(resource instanceof User){ // also accounts for Member -return resource.id;}else {return resource;}};Client.prototype.resolveDestination = function resolveDestination(destination){var channId=false;var self=this;return new Promise(function(resolve,reject){if(destination instanceof Server){channId = destination.id; //general is the same as server id -}else if(destination instanceof Channel){channId = destination.id;}else if(destination instanceof Message){channId = destination.channel.id;}else if(destination instanceof PMChannel){channId = destination.id;}else if(destination instanceof User){ //check if we have a PM -for(var _iterator16=self.pmChannelCache,_isArray16=Array.isArray(_iterator16),_i16=0,_iterator16=_isArray16?_iterator16:_iterator16[Symbol.iterator]();;) {var _ref16;if(_isArray16){if(_i16 >= _iterator16.length)break;_ref16 = _iterator16[_i16++];}else {_i16 = _iterator16.next();if(_i16.done)break;_ref16 = _i16.value;}var pmc=_ref16;if(pmc.user && pmc.user.equals(destination)){resolve(pmc.id);return;}} //we don't, at this point we're late -self.startPM(destination).then(function(pmc){resolve(pmc.id);})["catch"](reject);}else {channId = destination;}if(channId)resolve(channId);else reject();});};Client.prototype.ack = function ack(msg){request.post(Endpoints.CHANNELS + "/" + msg.channel.id + "/messages/" + msg.id + "/ack").set("authorization",this.token).end(function(err,res){if(err){console.log(err);process.exit();}});};Client.prototype._sendMessage = function _sendMessage(destination,content,options,mentions){var self=this;return new Promise(function(resolve,reject){var lag=Date.now();request.post(Endpoints.CHANNELS + "/" + destination + "/messages").set("authorization",self.token).send({content:content,mentions:mentions,tts:options.tts}).end(function(err,res){if(err){reject(err);}else {lag -= Date.parse(res.body.timestamp);self.timeoffset = lag;var data=res.body;var mentions=[];data.mentions = data.mentions || []; //for some reason this was not defined at some point? -var channel=self.getChannel("id",data.channel_id);for(var _iterator17=data.mentions,_isArray17=Array.isArray(_iterator17),_i17=0,_iterator17=_isArray17?_iterator17:_iterator17[Symbol.iterator]();;) {var _ref17;if(_isArray17){if(_i17 >= _iterator17.length)break;_ref17 = _iterator17[_i17++];}else {_i17 = _iterator17.next();if(_i17.done)break;_ref17 = _i17.value;}var mention=_ref17;var user=self.addUser(mention);if(channel.server)mentions.push(channel.server.getMember("id",user.id) || user);else mentions.push(user);}if(channel){var msg=channel.addMessage(new Message(data,channel,mentions,{id:data.author.id}));resolve(msg);}}});});};Client.prototype._sendFile = function _sendFile(destination,attachment){var attachmentName=arguments.length <= 2 || arguments[2] === undefined?"DEFAULT BECAUSE YOU DIDN'T SPECIFY WHY.png":arguments[2];var self=this;return new Promise(function(resolve,reject){request.post(Endpoints.CHANNELS + "/" + destination + "/messages").set("authorization",self.token).attach("file",attachment,attachmentName).end(function(err,res){if(err){reject(err);}else {var chann=self.getChannel("id",destination);if(chann){var msg=chann.addMessage(new Message(res.body,chann,[],self.user));resolve(msg);}}});});};Client.prototype._updateMessage = function _updateMessage(message,content){var self=this;return new Promise(function(resolve,reject){request.patch(Endpoints.CHANNELS + "/" + message.channel.id + "/messages/" + message.id).set("authorization",self.token).send({content:content,mentions:[]}).end(function(err,res){if(err){reject(err);}else {var msg=new Message(res.body,message.channel,message.mentions,message.sender);resolve(msg);message.channel.messages[message.channel.messages.indexOf(message)] = msg;}});});};Client.prototype.getGateway = function getGateway(){var self=this;return new Promise(function(resolve,reject){request.get(Endpoints.API + "/gateway").set("authorization",self.token).end(function(err,res){if(err){reject(err);}else {resolve(res.body.url);}});});};Client.prototype.setStatusIdle = function setStatusIdle(){this.setStatus("idle");};Client.prototype.setStatusOnline = function setStatusOnline(){this.setStatus("online");};Client.prototype.setStatusActive = function setStatusActive(){this.setStatusOnline();};Client.prototype.setStatusHere = function setStatusHere(){this.setStatusOnline();};Client.prototype.setStatusAway = function setStatusAway(){this.setStatusIdle();};Client.prototype.startTyping = function startTyping(chann,stopTypeTime){var self=this;this.resolveDestination(chann).then(next);function next(channel){if(self.typingIntervals[channel]){return;}var fn=function fn(){request.post(Endpoints.CHANNELS + "/" + channel + "/typing").set("authorization",self.token).end();};fn();var interval=setInterval(fn,3000);self.typingIntervals[channel] = interval;if(stopTypeTime){setTimeout(function(){self.stopTyping(channel);},stopTypeTime);}}};Client.prototype.stopTyping = function stopTyping(chann){var self=this;this.resolveDestination(chann).then(next);function next(channel){if(!self.typingIntervals[channel]){return;}clearInterval(self.typingIntervals[channel]);delete self.typingIntervals[channel];}};Client.prototype.setStatus = function setStatus(stat){var idleTime=stat === "online"?null:Date.now();this.__idleTime = idleTime;this.websocket.send(JSON.stringify({op:3,d:{idle_since:this.__idleTime,game_id:this.__gameId}}));};Client.prototype.setPlayingGame = function setPlayingGame(id){if(id instanceof String || typeof id === "string"){ // working on names -var gid=id.trim().toUpperCase();id = null;for(var _iterator18=gameMap,_isArray18=Array.isArray(_iterator18),_i18=0,_iterator18=_isArray18?_iterator18:_iterator18[Symbol.iterator]();;) {var _ref18;if(_isArray18){if(_i18 >= _iterator18.length)break;_ref18 = _iterator18[_i18++];}else {_i18 = _iterator18.next();if(_i18.done)break;_ref18 = _i18.value;}var game=_ref18;if(game.name.trim().toUpperCase() === gid){id = game.id;break;}}}this.__gameId = id;this.websocket.send(JSON.stringify({op:3,d:{idle_since:this.__idleTime,game_id:this.__gameId}}));};Client.prototype.playGame = function playGame(id){this.setPlayingGame(id);};Client.prototype.playingGame = function playingGame(id){this.setPlayingGame(id);};Client.prototype.resolveInvite = function resolveInvite(resource){if(resource instanceof Invite){return resource.code;}else if(typeof resource == "string" || resource instanceof String){if(resource.indexOf("http") === 0){var split=resource.split("/");return split.pop();}else {return resource;}}};Client.prototype.checkCatchUp = function checkCatchUp(rstate){var self=this;if(self.options.catchup){ // mention_count, last_message_id, id -rstate.forEach(function(catchup,index){if(self.options.catchup === "all"){self.getChannelLogs(catchup.id,100000,{after:catchup.last_message_id}).then(function(results){for(var _iterator19=results,_isArray19=Array.isArray(_iterator19),_i19=0,_iterator19=_isArray19?_iterator19:_iterator19[Symbol.iterator]();;) {var _ref19;if(_isArray19){if(_i19 >= _iterator19.length)break;_ref19 = _iterator19[_i19++];}else {_i19 = _iterator19.next();if(_i19.done)break;_ref19 = _i19.value;}var m=_ref19;self.emit("message",m,true);}self.ack(results[0]);});}else if(self.options.catchup){self.getChannelLogs(catchup.id,2500).then(function(results){for(var _iterator20=results,_isArray20=Array.isArray(_iterator20),_i20=0,_iterator20=_isArray20?_iterator20:_iterator20[Symbol.iterator]();;) {var _ref20;if(_isArray20){if(_i20 >= _iterator20.length)break;_ref20 = _iterator20[_i20++];}else {_i20 = _iterator20.next();if(_i20.done)break;_ref20 = _i20.value;}var m=_ref20;if(m.id == catchup.last_message_id)break;self.emit("message",m,true);}self.ack(results[0]);});}});}};_createClass(Client,[{key:"uptime",get:function get(){return this.readyTime?Date.now() - this.readyTime:null;}},{key:"ready",get:function get(){return this.state === 3;}},{key:"servers",get:function get(){return this.serverCache;}},{key:"channels",get:function get(){return this.channelCache;}},{key:"users",get:function get(){return this.userCache;}},{key:"PMChannels",get:function get(){return this.pmChannelCache;}},{key:"messages",get:function get(){var msgs=[];for(var _iterator21=this.channelCache,_isArray21=Array.isArray(_iterator21),_i21=0,_iterator21=_isArray21?_iterator21:_iterator21[Symbol.iterator]();;) {var _ref21;if(_isArray21){if(_i21 >= _iterator21.length)break;_ref21 = _iterator21[_i21++];}else {_i21 = _iterator21.next();if(_i21.done)break;_ref21 = _i21.value;}var channel=_ref21;msgs = msgs.concat(channel.messages);}return msgs;}}]);return Client;})(EventEmitter);module.exports = Client; + self.debug("error logging in - " + err); + callback(err); + reject(err); + } else { + self.state = 2; //set state to logged in (not yet ready) + self.token = res.body.token; //set our token + self.debug("client logged in w/ token " + self.token); + self.getGateway().then(function (url) { + self.debug("gateway response successful"); + self.createws(url); + callback(null, self.token); + resolve(self.token); + })["catch"](function (err) { + self.debug("unable to connect to gateways - " + err); + callback(err); + reject(err); + }); + } + }); + } else { + reject(new Error("Client already logging in or ready")); + } + }); + }; + + Client.prototype.banMember = function banMember(user, server) { + var daysToDeleteMessage = arguments.length <= 2 || arguments[2] === undefined ? 1 : arguments[2]; + var cb = arguments.length <= 3 || arguments[3] === undefined ? function (err) {} : arguments[3]; + + var self = this; + + return new Promise(function (resolve, reject) { + + var serverID = self.resolveServerID(server); + var memberID = self.resolveUserID(user); + + request.put(Endpoints.SERVERS + "/" + serverID + "/bans/" + memberID + "?delete-message-days=" + daysToDeleteMessage).set("authorization", self.token).end(function (err, res) { + cb(err); + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + }; + + Client.prototype.logout = function logout() { + var callback = arguments.length <= 0 || arguments[0] === undefined ? function (err) {} : arguments[0]; + + var self = this; + + return new Promise(function (resolve, reject) { + + request.post(Endpoints.LOGOUT).set("authorization", self.token).end(function (err, res) { + + if (err) { + callback(err); + reject(err); + } else { + self.websocket.close(); + self.state = 4; + callback(); + resolve(); + } + }); + }); + }; + + Client.prototype.createServer = function createServer(name, region) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err, server) {} : arguments[2]; + + var self = this; + return new Promise(function (resolve, reject) { + + request.post(Endpoints.SERVERS).set("authorization", self.token).send({ + name: name, + region: region + }).end(function (err, res) { + if (err) { + callback(err); + reject(err); + } else { + // potentially redundant in future + // creating here does NOT give us the channels of the server + // so we must wait for the guild_create event. + self.serverCreateListener[res.body.id] = [resolve, callback]; + /*var srv = self.addServer(res.body); + callback(null, srv); + resolve(srv);*/ + } + }); + }); + }; + + Client.prototype.createChannel = function createChannel(server, channelName, channelType) { + var callback = arguments.length <= 3 || arguments[3] === undefined ? function (err, chann) {} : arguments[3]; + + var self = this; + + return new Promise(function (resolve, reject) { + + request.post(Endpoints.SERVERS + "/" + self.resolveServerID(server) + "/channels").set("authorization", self.token).send({ + name: channelName, + type: channelType + }).end(function (err, res) { + + if (err) { + callback(err); + reject(err); + } else { + var server = self.getServer("id", res.body.guild_id); + var chann = self.addChannel(res.body, res.body.guild_id); + server.addChannel(chann); + callback(null, chann); + resolve(chann); + } + }); + }); + }; + + Client.prototype.leaveServer = function leaveServer(server) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function (err, server) {} : arguments[1]; + + var self = this; + + return new Promise(function (resolve, reject) { + + request.del(Endpoints.SERVERS + "/" + self.resolveServerID(server)).set("authorization", self.token).end(function (err, res) { + + if (err) { + callback(err); + reject(err); + } else { + for (var _iterator = server.channels, _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 channel = _ref; + + self.channelCache.splice(self.channelCache.indexOf(channel), 1); + } + self.serverCache.splice(self.serverCache.indexOf(server), 1); + callback(null); + resolve(); + } + }); + }); + }; + + Client.prototype.createInvite = function createInvite(serverOrChannel, options) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err, invite) {} : arguments[2]; + + var self = this; + + return new Promise(function (resolve, reject) { + + var destination; + + if (serverOrChannel instanceof Server) { + destination = serverOrChannel.id; + } else if (serverOrChannel instanceof Channel) { + destination = serverOrChannel.id; + } else { + destination = serverOrChannel; + } + + options = options || {}; + options.max_age = options.maxAge || 0; + options.max_uses = options.maxUses || 0; + options.temporary = options.temporary || false; + options.xkcdpass = options.xkcd || false; + + request.post(Endpoints.CHANNELS + "/" + destination + "/invites").set("authorization", self.token).send(options).end(function (err, res) { + if (err) { + callback(err); + reject(err); + } else { + var inv = new Invite(res.body, self); + callback(null, inv); + resolve(inv); + } + }); + }); + }; + + Client.prototype.startPM = function startPM(user) { + + var self = this; + + return new Promise(function (resolve, reject) { + var userId = user; + if (user instanceof User) { + userId = user.id; + } + request.post(Endpoints.USERS + "/" + self.user.id + "/channels").set("authorization", self.token).send({ + recipient_id: userId + }).end(function (err, res) { + if (err) { + reject(err); + } else { + resolve(self.addPMChannel(res.body)); + } + }); + }); + }; + + Client.prototype.reply = function reply(destination, message, options) { + var callback = arguments.length <= 3 || arguments[3] === undefined ? function (err, msg) {} : arguments[3]; + + var self = this; + + return new Promise(function (response, reject) { + + if (typeof options === "function") { + // options is a function, which means the developer wants this to be the callback + callback = options; + options = false; + } + + var user = destination.sender; + self.sendMessage(destination, message, options, callback, user + ", ").then(response)["catch"](reject); + }); + }; + + Client.prototype.deleteMessage = function deleteMessage(message, timeout) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err, msg) {} : arguments[2]; + + var self = this; + + return new Promise(function (resolve, reject) { + if (timeout) { + setTimeout(remove, timeout); + } else { + remove(); + } + + function remove() { + request.del(Endpoints.CHANNELS + "/" + message.channel.id + "/messages/" + message.id).set("authorization", self.token).end(function (err, res) { + if (err) { + bad(); + } else { + good(); + } + }); + } + + function good() { + callback(); + resolve(); + } + + function bad(err) { + callback(err); + reject(err); + } + }); + }; + + Client.prototype.updateMessage = function updateMessage(message, content) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err, msg) {} : arguments[2]; + + var self = this; + + var prom = new Promise(function (resolve, reject) { + + content = content instanceof Array ? content.join("\n") : content; + + if (self.options.queue) { + if (!self.queue[message.channel.id]) { + self.queue[message.channel.id] = []; + } + self.queue[message.channel.id].push({ + action: "updateMessage", + message: message, + content: content, + then: good, + error: bad + }); + + self.checkQueue(message.channel.id); + } else { + self._updateMessage(message, content).then(good)["catch"](bad); + } + + function good(msg) { + prom.message = msg; + callback(null, msg); + resolve(msg); + } + + function bad(error) { + prom.error = error; + callback(error); + reject(error); + } + }); + + return prom; + }; + + Client.prototype.setUsername = function setUsername(newName) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function (err) {} : arguments[1]; + + var self = this; + + return new Promise(function (resolve, reject) { + request.patch(Endpoints.API + "/users/@me").set("authorization", self.token).send({ + avatar: self.user.avatar, + email: self.email, + new_password: null, + password: self.password, + username: newName + }).end(function (err) { + callback(err); + if (err) reject(err);else resolve(); + }); + }); + }; + + Client.prototype.getChannelLogs = function getChannelLogs(channel) { + var amount = arguments.length <= 1 || arguments[1] === undefined ? 500 : 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]; + + var self = this; + + return new Promise(function (resolve, reject) { + + var channelID = channel; + if (channel instanceof Channel) { + channelID = channel.id; + } + + var params = []; + if (options.before) { + params.push("before=" + (options.before instanceof Message ? options.before.id : options.before)); + } + if (options.after) { + params.push("after=" + (options.after instanceof Message ? options.after.id : options.after)); + } + + var joinedParams = params.join(); + if (joinedParams !== "") joinedParams = "&" + params.join(); + + request.get(Endpoints.CHANNELS + "/" + channelID + "/messages?limit=" + amount + joinedParams).set("authorization", self.token).end(function (err, res) { + + if (err) { + callback(err); + reject(err); + } else { + var logs = []; + + var channel = self.getChannel("id", channelID); + + for (var _iterator2 = res.body, _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 message = _ref2; + + var mentions = []; + for (var _iterator3 = message.mentions, _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; + + var user = self.addUser(mention); + if (channel.server) mentions.push(channel.server.getMember("id", user.id) || user);else mentions.push(user); + } + + var authorRaw = self.addUser(message.author), + author; + if (channel.server) author = channel.server.getMember("id", authorRaw.id) || authorRaw;else author = authorRaw; + + logs.push(new Message(message, channel, mentions, author)); + } + callback(null, logs); + resolve(logs); + } + }); + }); + }; + + Client.prototype.deleteChannel = function deleteChannel(channel) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function (err) {} : arguments[1]; + + var self = this; + + return new Promise(function (resolve, reject) { + + var channelID = channel; + if (channel instanceof Channel) { + channelID = channel.id; + } + + request.del(Endpoints.CHANNELS + "/" + channelID).set("authorization", self.token).end(function (err) { + if (err) { + callback(err); + reject(err); + } else { + callback(null); + resolve(); + } + }); + }); + }; + + Client.prototype.joinServer = function joinServer(invite) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function (err, server) {} : arguments[1]; + + var self = this; + + return new Promise(function (resolve, reject) { + + var id = self.resolveInvite(invite); + + request.post(Endpoints.API + "/invite/" + id).set("authorization", self.token).end(function (err, res) { + if (err) { + callback(err); + reject(err); + } else { + if (self.getServer("id", res.body.guild.id)) { + resolve(self.getServer("id", res.body.guild.id)); + } else { + self.serverCreateListener[res.body.guild.id] = [resolve, callback]; + } + } + }); + }); + }; + + Client.prototype.setAvatar = function setAvatar(resource) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function (err) {} : arguments[1]; + + var self = this; + + return new Promise(function (resolve, reject) { + if (resource instanceof Buffer) { + resource = resource.toString("base64"); + resource = "data:image/jpg;base64," + resource; + } + + request.patch(Endpoints.API + "/users/@me").set("authorization", self.token).send({ + avatar: resource, + email: self.email, + new_password: null, + password: self.password, + username: self.user.username + }).end(function (err) { + callback(err); + if (err) reject(err);else resolve(); + }); + }); + }; + + Client.prototype.sendFile = function sendFile(destination, file) { + var fileName = arguments.length <= 2 || arguments[2] === undefined ? "image.png" : arguments[2]; + var callback = arguments.length <= 3 || arguments[3] === undefined ? function (err, msg) {} : arguments[3]; + + var self = this; + + var prom = new Promise(function (resolve, reject) { + + var fstream; + + if (typeof file === "string" || file instanceof String) { + fstream = fs.createReadStream(file); + fileName = file; + } else { + fstream = file; + } + + self.resolveDestination(destination).then(send)["catch"](bad); + + function send(destination) { + if (self.options.queue) { + //queue send file too + if (!self.queue[destination]) { + self.queue[destination] = []; + } + + self.queue[destination].push({ + action: "sendFile", + attachment: fstream, + attachmentName: fileName, + then: good, + error: bad + }); + + self.checkQueue(destination); + } else { + //not queue + self._sendFile(destination, fstream, fileName).then(good)["catch"](bad); + } + } + + function good(msg) { + prom.message = msg; + callback(null, msg); + resolve(msg); + } + + function bad(err) { + prom.error = err; + callback(err); + reject(err); + } + }); + + return prom; + }; + + Client.prototype.sendMessage = function sendMessage(destination, message, options) { + var callback = arguments.length <= 3 || arguments[3] === undefined ? function (err, msg) {} : arguments[3]; + var premessage = arguments.length <= 4 || arguments[4] === undefined ? "" : arguments[4]; + + var self = this; + + var prom = new Promise(function (resolve, reject) { + + if (typeof options === "function") { + // options is a function, which means the developer wants this to be the callback + callback = options; + options = { tts: false }; + } + + if (!options) { + options = { tts: false }; + } + + message = premessage + resolveMessage(message); + var mentions = resolveMentions(); + self.resolveDestination(destination).then(send)["catch"](error); + + function error(err) { + callback(err); + reject(err); + } + + function send(destination) { + if (self.options.queue) { + //we're QUEUEING messages, so sending them sequentially based on servers. + if (!self.queue[destination]) { + self.queue[destination] = []; + } + + self.queue[destination].push({ + action: "sendMessage", + content: message, + mentions: mentions, + tts: options.tts, //incase it's not a boolean + then: mgood, + error: mbad + }); + + self.checkQueue(destination); + } else { + self._sendMessage(destination, message, options, mentions).then(mgood)["catch"](mbad); + } + } + + function mgood(msg) { + prom.message = msg; + callback(null, msg); + resolve(msg); + } + + function mbad(error) { + prom.error = error; + callback(error); + reject(error); + } + + function resolveMessage() { + var msg = message; + if (message instanceof Array) { + msg = message.join("\n"); + } + return msg; + } + + function resolveMentions() { + var _mentions = []; + for (var _iterator4 = message.match(/<@[^>]*>/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; + + _mentions.push(mention.substring(2, mention.length - 1)); + } + return _mentions; + } + }); + + return prom; + }; + + Client.prototype.createRoleIfNotExists = function createRoleIfNotExists(dest, data) { + var cb = arguments.length <= 2 || arguments[2] === undefined ? function (err, role) {} : arguments[2]; + + var self = this; + + return new Promise(function (resolve, reject) { + + var serverID = self.resolveServerID(dest); + var server = self.getServer("id", serverID); + + var baseRole = new ServerPermissions({}, server); + for (var key in data) { + baseRole[key] = data[key]; + } + + for (var _iterator5 = server.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 (baseRole.name == role.name && baseRole.packed == role.packed && baseRole.color == role.color) { + resolve(role); + cb(null, role); + return false; + } + } + + self.createRole(dest, data).then(function (role) { + cb(null, role); + resolve(role); + })["catch"](function (e) { + cb(e); + reject(e); + }); + }); + }; + + Client.prototype.createRole = function createRole(dest, data) { + var cb = arguments.length <= 2 || arguments[2] === undefined ? function (err, role) {} : arguments[2]; + + var self = this; + + return new Promise(function (resolve, reject) { + + var ddest = self.resolveServerID(dest); + var server = self.getServer("id", ddest); + + request.post(Endpoints.SERVERS + "/" + ddest + "/roles").set("authorization", self.token).end(function (err, res) { + + if (err) { + cb(err); + reject(err); + } else { + + var perm = server.addRole(res.body); + + if (data.color) data.color = Color.toDec(data.color); + + self.guildRoleCreateIgnoreList[res.body.id] = true; + + server.addRole(res.body); + + self.updateRole(perm, data).then(function (perm) { + cb(null, perm); + resolve(perm); + })["catch"](function (err) { + cb(err); + reject(err); + }); + } + }); + }); + }; + + Client.prototype.updateRole = function updateRole(role, data) { + var cb = arguments.length <= 2 || arguments[2] === undefined ? function (err, perm) {} : arguments[2]; + + var self = this; + + return new Promise(function (resolve, reject) { + + var server = role.server.id; + + var tempRole = role; + for (var key in data) { + tempRole[key] = data[key]; + } + + if (isNaN(Color.toDec(data.color))) { + var err = new Error("Invalid Color"); + reject(err); + cb(err); + return; + } + + request.patch(Endpoints.SERVERS + "/" + server + "/roles/" + role.id).set("authorization", self.token).send({ + color: tempRole.color, + hoist: tempRole.hoist, + name: tempRole.name, + permissions: tempRole.packed + }).end(function (err, res) { + if (err) { + cb(err); + reject(err); + } else { + + var data = self.getServer("id", server).updateRole(res.body); + resolve(data); + cb(null, data); + } + }); + }); + }; + + Client.prototype.deleteRole = function deleteRole(role) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function (err) {} : arguments[1]; + + // role is a ServerPermissions + var self = this; + + return new Promise(function (resolve, reject) { + + request.del(Endpoints.SERVERS + "/" + role.server.id + "/roles/" + role.id).set("authorization", self.token).end(function (err) { + if (err) { + reject(err); + callback(err); + } else { + resolve(); + callback(); + } + }); + }); + }; + + Client.prototype.addMemberToRole = function addMemberToRole(member, role) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err) {} : arguments[2]; + + var self = this; + + return new Promise(function (resolve, reject) { + try { + var serverId = self.resolveServerID(member.server); + var memberId = self.resolveUserID(member); + + var acServer = self.getServer("id", serverId); + var acMember = acServer.getMember("id", memberId); + + if (acMember.rawRoles.indexOf(role.id) !== -1) { + // user already has role + return; + } + + request.patch("https://discordapp.com/api/guilds/" + serverId + "/members/" + memberId).set("authorization", self.token).send({ + roles: acMember.rawRoles.concat(role.id) + }).end(function (err) { + if (err) { + reject(err); + callback(err); + } else { + acMember.addRole(role); + resolve(); + callback(); + } + }); + } catch (e) { + reject(e); + } + }); + }; + + Client.prototype.removeMemberFromRole = function removeMemberFromRole(member, role) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err) {} : arguments[2]; + + var self = this; + + return new Promise(function (resolve, reject) { + try { + var serverId = self.resolveServerID(member.server); + var memberId = self.resolveUserID(member); + + var acServer = self.getServer("id", serverId); + var acMember = acServer.getMember("id", memberId); + + if (~acMember.rawRoles.indexOf(role.id)) { + acMember.removeRole(role); + } + + request.patch("https://discordapp.com/api/guilds/" + serverId + "/members/" + memberId).set("authorization", self.token).send({ + roles: acMember.rawRoles + }).end(function (err) { + if (err) { + reject(err); + callback(err); + } else { + acMember.addRole(role); + resolve(); + callback(); + } + }); + } catch (e) { + reject(e); + } + }); + }; + + Client.prototype.overwritePermissions = function overwritePermissions(channel, role, updatedStuff) { + var callback = arguments.length <= 3 || arguments[3] === undefined ? function (err) {} : arguments[3]; + + var self = this; + + return new Promise(function (resolve, reject) { + + function dieerror(e) { + reject(e); + callback(e); + } + + self.resolveDestination(channel).then(next)["catch"](dieerror); + + function next(channelID) { + + var data; + + if (role instanceof ServerPermissions || role.type === "role") { + data = ad(updatedStuff); + data.id = role.id; + data.type = "role"; + } else { + + data = ad(updatedStuff); + data.id = role.id; + data.type = "member"; + } + request.put(Endpoints.CHANNELS + "/" + channelID + "/permissions/" + role.id).set("authorization", self.token).send(data).end(function (err) { + if (err) { + reject(err); + callback(err); + } else { + resolve(); + callback(); + } + }); + } + }); + + function ad(data) { + var allow = 0, + disallow = 0; + function bitit(value, position) { + if (value) { + allow |= 1 << position; + } else { + disallow |= 1 << position; + } + } + + for (var perm in data) { + switch (perm) { + case "canCreateInstantInvite": + bitit(data[perm], 0); + break; + case "manageRoles": + bitit(data[perm], 3); + break; + case "manageChannels": + bitit(data[perm], 4); + break; + case "readMessages": + bitit(data[perm], 10); + break; + case "sendMessages": + bitit(data[perm], 11); + break; + case "sendTTSMessages": + bitit(data[perm], 12); + break; + case "manageMessages": + bitit(data[perm], 13); + break; + case "embedLinks": + bitit(data[perm], 14); + break; + case "attachFiles": + bitit(data[perm], 15); + break; + case "readMessageHistory": + bitit(data[perm], 16); + break; + case "mentionEveryone": + bitit(data[perm], 17); + break; + case "voiceConnect": + bitit(data[perm], 20); + break; + case "voiceSpeak": + bitit(data[perm], 21); + break; + case "voiceMuteMembers": + bitit(data[perm], 22); + break; + case "voiceDeafenMembers": + bitit(data[perm], 23); + break; + case "voiceMoveMembers": + bitit(data[perm], 24); + break; + case "voiceUseVoiceActivation": + bitit(data[perm], 25); + break; + default: + break; + } + } + + return { + allow: allow, + deny: disallow + }; + } + }; + + Client.prototype.getBans = function getBans(serverResource) { + var callback = arguments.length <= 1 || arguments[1] === undefined ? function (err, arrayOfBans) {} : arguments[1]; + + var self = this; + return new Promise(function (resolve, reject) { + + var serverID = self.resolveServerID(serverResource); + + request.get(Endpoints.SERVERS + "/" + serverID + "/bans").set("authorization", self.token).end(function (err, res) { + + if (err) { + callback(err); + reject(err); + } else { + + var banList = []; + + for (var _iterator6 = res.body, _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 user = _ref6; + + banList.push(self.addUser(user.user)); + } + + callback(null, banList); + resolve(banList); + } + }); + }); + }; + + //def createws + + Client.prototype.createws = function createws(url) { + if (this.websocket) return false; + + var self = this; + + //good to go + this.websocket = new WebSocket(url); + + //open + this.websocket.onopen = function () { + self.trySendConnData(); //try connecting + }; + + //close + this.websocket.onclose = function () { + self.emit("disconnected"); + }; + + //message + this.websocket.onmessage = function (e) { + + if (e.type === "Binary") { + if (!zlib) zlib = require("zlib"); + + e.data = zlib.inflateSync(e.data).toString(); + } + + var dat = false, + data = {}; + + try { + dat = JSON.parse(e.data); + data = dat.d; + } catch (err) { + self.emit("error", err, e); + return; + } + + self.emit("raw", dat); + + //valid message + switch (dat.t) { + + case "READY": + + self.debug("received ready packet"); + + self.user = self.addUser(data.user); + + for (var _iterator7 = data.guilds, _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 _server = _ref7; + + var server = self.addServer(_server); + } + + for (var _iterator8 = data.private_channels, _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 _pmc = _ref8; + + var pmc = self.addPMChannel(_pmc); + } + + self.emit("ready"); + self.readyTime = Date.now(); + self.debug("cached " + self.serverCache.length + " servers, " + self.channelCache.length + " channels, " + self.pmChannelCache.length + " PMs and " + self.userCache.length + " users."); + self.state = 3; + setInterval(function () { + self.keepAlive.apply(self); + }, data.heartbeat_interval); + self.checkCatchUp(data.read_state); + break; + case "MESSAGE_CREATE": + self.debug("received message"); + + var mentions = []; + data.mentions = data.mentions || []; //for some reason this was not defined at some point? + + var channel = self.getChannel("id", data.channel_id); + for (var _iterator9 = data.mentions, _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 mention = _ref9; + + var user = self.addUser(mention); + if (channel.server) mentions.push(channel.server.getMember("id", user.id) || user);else mentions.push(user); + } + + if (channel) { + var msg = channel.addMessage(new Message(data, channel, mentions, data.author)); + self.emit("message", msg); + } + + self.ack(msg); + + break; + case "MESSAGE_DELETE": + self.debug("message deleted"); + + var channel = self.getChannel("id", data.channel_id); + var message = channel.getMessage("id", data.id); + if (message) { + self.emit("messageDelete", channel, message); + channel.messages.splice(channel.messages.indexOf(message), 1); + } else { + //don't have the cache of that message ;( + self.emit("messageDelete", channel); + } + break; + case "MESSAGE_UPDATE": + self.debug("message updated"); + + var channel = self.getChannel("id", data.channel_id); + var formerMessage = channel.getMessage("id", data.id); + + if (formerMessage) { + + //new message might be partial, so we need to fill it with whatever the old message was. + var info = {}; + + for (var key in formerMessage) { + info[key] = formerMessage[key]; + } + + for (var key in data) { + info[key] = data[key]; + } + + data.mentions = data.mentions || []; + var mentions = []; + + for (var _iterator10 = data.mentions, _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 mention = _ref10; + + var user = self.addUser(mention); + if (channel.server) mentions.push(channel.server.getMember("id", user.id) || user);else mentions.push(user); + } + + var newMessage = new Message(info, channel, mentions, formerMessage.author); + + self.emit("messageUpdate", newMessage, formerMessage); + + channel.messages[channel.messages.indexOf(formerMessage)] = newMessage; + } + + // message isn't in cache, and if it's a partial it could cause + // all hell to break loose... best to just act as if nothing happened + + break; + + case "GUILD_DELETE": + + var server = self.getServer("id", data.id); + + if (server) { + for (var _iterator11 = server.channels, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) { + var _ref11; + + if (_isArray11) { + if (_i11 >= _iterator11.length) break; + _ref11 = _iterator11[_i11++]; + } else { + _i11 = _iterator11.next(); + if (_i11.done) break; + _ref11 = _i11.value; + } + + var channel = _ref11; + + self.channelCache.splice(self.channelCache.indexOf(channel), 1); + } + self.serverCache.splice(self.serverCache.indexOf(server), 1); + self.emit("serverDelete", server); + } + + break; + + case "GUILD_BAN_ADD": + + var bannedUser = self.addUser(data.user); + var server = self.getServer("id", data.guild_id); + + self.emit("userBanned", bannedUser, server); + break; + + case "GUILD_BAN_REMOVE": + + var bannedUser = self.addUser(data.user); + var server = self.getServer("id", data.guild_id); + + self.emit("userUnbanned", bannedUser, server); + + break; + + case "CHANNEL_DELETE": + + var channel = self.getChannel("id", data.id); + + if (channel) { + + self.channelCache.splice(self.channelCache.indexOf(channel), 1); + server.channels.splice(server.channels.indexOf(channel), 1); + + self.emit("channelDelete", channel); + } + + break; + + case "GUILD_UPDATE": + + var server = self.getServer("id", data.id); + var newserver = self.addServer(data, true); + + self.serverCache.splice(self.serverCache.indexOf(server), 1); + self.emit("serverUpdate", server, newserver); + + break; + case "GUILD_CREATE": + + var server = self.getServer("id", data.id); + + if (!server) { + //if server doesn't already exist because duh + server = self.addServer(data); + } /*else if(server.channels.length === 0){ + + var srv = new Server(data, self); + for(channel of data.channels){ + srv.channels.push(new Channel(channel, data.id)); + } + self.serverCache[self.serverCache.indexOf(server)] = srv; + + }*/ + + var keepCheck = setInterval(function () { + if (self.serverCreateListener[data.id]) { + var cbs = self.serverCreateListener[data.id]; + cbs[0](server); //promise then callback + cbs[1](null, server); //legacy callback + self.serverCreateListener[data.id] = null; + self.emit("serverCreate", server); + clearInterval(keepCheck); + } + }, 50); + + break; + + case "CHANNEL_CREATE": + + var channel = self.getChannel("id", data.id); + + if (!channel) { + + var chann; + if (data.is_private) { + chann = self.addPMChannel(data); + } else { + chann = self.addChannel(data, data.guild_id); + } + var srv = self.getServer("id", data.guild_id); + if (srv) { + srv.addChannel(chann); + } + self.emit("channelCreate", chann); + } + + break; + + case "GUILD_MEMBER_ADD": + + var server = self.getServer("id", data.guild_id); + + if (server) { + + var user = self.addUser(data.user); //if for whatever reason it doesn't exist.. + + self.emit("serverNewMember", server.addMember(user, data.roles), server); + } + + break; + + case "GUILD_MEMBER_REMOVE": + + var server = self.getServer("id", data.guild_id); + + if (server) { + + var user = self.addUser(data.user); //if for whatever reason it doesn't exist.. + + server.removeMember("id", user.id); + + self.emit("serverRemoveMember", user, server); + } + + break; + + case "GUILD_MEMBER_UPDATE": + + var user = self.addUser(data.user); + var server = self.getServer("id", data.guild_id); + var member = server.getMember("id", user.id); + self.emit("serverMemberUpdate", member, data.roles); + server.getMember("id", user.id).rawRoles = data.roles; + + break; + + case "USER_UPDATE": + + if (self.user && data.id === self.user.id) { + + var newUser = new User(data); //not actually adding to the cache + + self.emit("userUpdate", newUser, self.user); + + if (~self.userCache.indexOf(self.user)) { + self.userCache[self.userCache.indexOf(self.user)] = newUser; + } + + self.user = newUser; + } + + break; + + case "PRESENCE_UPDATE": + + var userInCache = self.getUser("id", data.user.id); + + if (userInCache) { + //user exists + + data.user.username = data.user.username || userInCache.username; + data.user.id = data.user.id || userInCache.id; + data.user.discriminator = data.user.discriminator || userInCache.discriminator; + data.user.avatar = data.user.avatar || userInCache.avatar; + + var presenceUser = new User(data.user); + if (presenceUser.equalsStrict(userInCache)) { + //they're exactly the same, an actual presence update + self.emit("presence", { + user: userInCache, + oldStatus: userInCache.status, + status: data.status, + server: self.getServer("id", data.guild_id), + gameId: data.game_id + }); + userInCache.status = data.status; + userInCache.gameId = data.game_id; + } else { + //one of their details changed. + self.userCache[self.userCache.indexOf(userInCache)] = presenceUser; + self.emit("userUpdate", userInCache, presenceUser); + } + } + + break; + + case "CHANNEL_UPDATE": + + var channelInCache = self.getChannel("id", data.id), + serverInCache = self.getServer("id", data.guild_id); + + if (channelInCache && serverInCache) { + + var newChann = new Channel(data, serverInCache); + newChann.messages = channelInCache.messages; + + self.emit("channelUpdate", channelInCache, newChann); + + self.channelCache[self.channelCache.indexOf(channelInCache)] = newChann; + } + + break; + + case "TYPING_START": + + var userInCache = self.getUser("id", data.user_id); + var channelInCache = self.getChannel("id", data.channel_id); + + if (!self.userTypingListener[data.user_id] || self.userTypingListener[data.user_id] === -1) { + self.emit("startTyping", userInCache, channelInCache); + } + + self.userTypingListener[data.user_id] = Date.now(); + + setTimeout(function () { + if (self.userTypingListener[data.user_id] === -1) { + return; + } + if (Date.now() - self.userTypingListener[data.user_id] > 6000) { + // stopped typing + self.emit("stopTyping", userInCache, channelInCache); + self.userTypingListener[data.user_id] = -1; + } + }, 6000); + + break; + + case "GUILD_ROLE_CREATE": + + var server = self.getServer("id", data.guild_id); + var role = data.role; + + if (self.guildRoleCreateIgnoreList[data.role.id]) { + self.guildRoleCreateIgnoreList[data.role.id] = null; + break; + } + + self.emit("serverRoleCreate", server, server.addRole(role)); + + break; + + case "GUILD_ROLE_DELETE": + + var server = self.getServer("id", data.guild_id); + var role = server.getRole("id", data.role_id); + + self.emit("serverRoleDelete", server, role); + + server.removeRole(role.id); + + break; + + case "GUILD_ROLE_UPDATE": + + var server = self.getServer("id", data.guild_id); + var role = server.getRole("id", data.role.id); + var newRole = server.updateRole(data.role); + + self.emit("serverRoleUpdate", server, role, newRole); + + break; + + default: + self.debug("received unknown packet"); + self.emit("unknown", dat); + break; + + } + }; + }; + + //def addUser + + Client.prototype.addUser = function addUser(data) { + if (!this.getUser("id", data.id)) { + this.userCache.push(new User(data)); + } + return this.getUser("id", data.id); + }; + + //def addChannel + + Client.prototype.addChannel = function addChannel(data, serverId) { + if (!this.getChannel("id", data.id)) { + this.channelCache.push(new Channel(data, this.getServer("id", serverId))); + } + return this.getChannel("id", data.id); + }; + + Client.prototype.addPMChannel = function addPMChannel(data) { + if (!this.getPMChannel("id", data.id)) { + this.pmChannelCache.push(new PMChannel(data, this)); + } + return this.getPMChannel("id", data.id); + }; + + Client.prototype.setTopic = function setTopic(channel, topic) { + var callback = arguments.length <= 2 || arguments[2] === undefined ? function (err) {} : arguments[2]; + + var self = this; + + return new Promise(function (resolve, reject) { + + self.resolveDestination(channel).then(next)["catch"](error); + + function error(e) { + callback(e); + reject(e); + } + + function next(destination) { + + var asChan = self.getChannel("id", destination); + + request.patch(Endpoints.CHANNELS + "/" + destination).set("authorization", self.token).send({ + name: asChan.name, + position: 0, + topic: topic + }).end(function (err, res) { + if (err) { + error(err); + } else { + asChan.topic = res.body.topic; + resolve(); + callback(); + } + }); + } + }); + }; + + //def addServer + + Client.prototype.addServer = function addServer(data) { + var force = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1]; + + var self = this; + var server = this.getServer("id", data.id); + + if (data.unavailable) { + self.emit("unavailable", data); + self.debug("Server ID " + data.id + " has been marked unavailable by Discord. It was not cached."); + return; + } + + if (!server || force) { + server = new Server(data, this); + this.serverCache.push(server); + if (data.channels) { + for (var _iterator12 = data.channels, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) { + var _ref12; + + if (_isArray12) { + if (_i12 >= _iterator12.length) break; + _ref12 = _iterator12[_i12++]; + } else { + _i12 = _iterator12.next(); + if (_i12.done) break; + _ref12 = _i12.value; + } + + var channel = _ref12; + + server.channels.push(this.addChannel(channel, server.id)); + } + } + if (data.presences) { + for (var _iterator13 = data.presences, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) { + var _ref13; + + if (_isArray13) { + if (_i13 >= _iterator13.length) break; + _ref13 = _iterator13[_i13++]; + } else { + _i13 = _iterator13.next(); + if (_i13.done) break; + _ref13 = _i13.value; + } + + var presence = _ref13; + + var user = self.getUser("id", presence.user.id); + user.status = presence.status; + user.gameId = presence.game_id; + } + } + } + + return server; + }; + + //def getUser + + Client.prototype.getUser = function getUser(key, value) { + for (var _iterator14 = this.userCache, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) { + var _ref14; + + if (_isArray14) { + if (_i14 >= _iterator14.length) break; + _ref14 = _iterator14[_i14++]; + } else { + _i14 = _iterator14.next(); + if (_i14.done) break; + _ref14 = _i14.value; + } + + var user = _ref14; + + if (user[key] === value) { + return user; + } + } + return null; + }; + + //def getChannel + + Client.prototype.getChannel = function getChannel(key, value) { + for (var _iterator15 = this.channelCache, _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) { + var _ref15; + + if (_isArray15) { + if (_i15 >= _iterator15.length) break; + _ref15 = _iterator15[_i15++]; + } else { + _i15 = _iterator15.next(); + if (_i15.done) break; + _ref15 = _i15.value; + } + + var channel = _ref15; + + if (channel[key] === value) { + return channel; + } + } + return this.getPMChannel(key, value); //might be a PM + }; + + Client.prototype.getPMChannel = function getPMChannel(key, value) { + for (var _iterator16 = this.pmChannelCache, _isArray16 = Array.isArray(_iterator16), _i16 = 0, _iterator16 = _isArray16 ? _iterator16 : _iterator16[Symbol.iterator]();;) { + var _ref16; + + if (_isArray16) { + if (_i16 >= _iterator16.length) break; + _ref16 = _iterator16[_i16++]; + } else { + _i16 = _iterator16.next(); + if (_i16.done) break; + _ref16 = _i16.value; + } + + var channel = _ref16; + + if (channel[key] === value) { + return channel; + } + } + return null; + }; + + //def getServer + + Client.prototype.getServer = function getServer(key, value) { + for (var _iterator17 = this.serverCache, _isArray17 = Array.isArray(_iterator17), _i17 = 0, _iterator17 = _isArray17 ? _iterator17 : _iterator17[Symbol.iterator]();;) { + var _ref17; + + if (_isArray17) { + if (_i17 >= _iterator17.length) break; + _ref17 = _iterator17[_i17++]; + } else { + _i17 = _iterator17.next(); + if (_i17.done) break; + _ref17 = _i17.value; + } + + var server = _ref17; + + if (server[key] === value) { + return server; + } + } + return null; + }; + + //def trySendConnData + + Client.prototype.trySendConnData = function trySendConnData() { + var self = this; + if (this.token && !this.alreadySentData) { + + this.alreadySentData = true; + + var data = { + op: 2, + d: { + token: this.token, + v: 3, + properties: { + "$os": "discord.js", + "$browser": "discord.js", + "$device": "discord.js", + "$referrer": "", + "$referring_domain": "" + }, + compress: self.options.compress + } + }; + this.websocket.send(JSON.stringify(data)); + } + }; + + Client.prototype.resolveServerID = function resolveServerID(resource) { + + if (resource instanceof Server) { + return resource.id; + } else if (resource instanceof Channel) { + return resource.server.id; + } else if (resource instanceof Message) { + return resource.channel.server.id; + } else { + return resource; + } + }; + + Client.prototype.resolveUserID = function resolveUserID(resource) { + if (resource instanceof User) { + // also accounts for Member + return resource.id; + } else { + return resource; + } + }; + + Client.prototype.resolveDestination = function resolveDestination(destination) { + var channId = false; + var self = this; + + return new Promise(function (resolve, reject) { + if (destination instanceof Server) { + channId = destination.id; //general is the same as server id + } else if (destination instanceof Channel) { + channId = destination.id; + } else if (destination instanceof Message) { + channId = destination.channel.id; + } else if (destination instanceof PMChannel) { + channId = destination.id; + } else if (destination instanceof User) { + + //check if we have a PM + for (var _iterator18 = self.pmChannelCache, _isArray18 = Array.isArray(_iterator18), _i18 = 0, _iterator18 = _isArray18 ? _iterator18 : _iterator18[Symbol.iterator]();;) { + var _ref18; + + if (_isArray18) { + if (_i18 >= _iterator18.length) break; + _ref18 = _iterator18[_i18++]; + } else { + _i18 = _iterator18.next(); + if (_i18.done) break; + _ref18 = _i18.value; + } + + var pmc = _ref18; + + if (pmc.user && pmc.user.equals(destination)) { + resolve(pmc.id); + return; + } + } + + //we don't, at this point we're late + self.startPM(destination).then(function (pmc) { + resolve(pmc.id); + })["catch"](reject); + } else { + channId = destination; + } + if (channId) resolve(channId);else reject(); + }); + }; + + Client.prototype.ack = function ack(msg) { + request.post(Endpoints.CHANNELS + "/" + msg.channel.id + "/messages/" + msg.id + "/ack").set("authorization", this.token).end(function (err, res) { + if (err) { + console.log(err); + process.exit(); + } + }); + }; + + Client.prototype._sendMessage = function _sendMessage(destination, content, options, mentions) { + + var self = this; + + return new Promise(function (resolve, reject) { + var lag = Date.now(); + request.post(Endpoints.CHANNELS + "/" + destination + "/messages").set("authorization", self.token).send({ + content: content, + mentions: mentions, + tts: options.tts + }).end(function (err, res) { + + if (err) { + reject(err); + } else { + + lag -= Date.parse(res.body.timestamp); + self.timeoffset = lag; + + var data = res.body; + + var mentions = []; + + data.mentions = data.mentions || []; //for some reason this was not defined at some point? + + var channel = self.getChannel("id", data.channel_id); + + for (var _iterator19 = data.mentions, _isArray19 = Array.isArray(_iterator19), _i19 = 0, _iterator19 = _isArray19 ? _iterator19 : _iterator19[Symbol.iterator]();;) { + var _ref19; + + if (_isArray19) { + if (_i19 >= _iterator19.length) break; + _ref19 = _iterator19[_i19++]; + } else { + _i19 = _iterator19.next(); + if (_i19.done) break; + _ref19 = _i19.value; + } + + var mention = _ref19; + + var user = self.addUser(mention); + if (channel.server) mentions.push(channel.server.getMember("id", user.id) || user);else mentions.push(user); + } + + if (channel) { + var msg = channel.addMessage(new Message(data, channel, mentions, { id: data.author.id })); + resolve(msg); + } + } + }); + }); + }; + + Client.prototype._sendFile = function _sendFile(destination, attachment) { + var attachmentName = arguments.length <= 2 || arguments[2] === undefined ? "DEFAULT BECAUSE YOU DIDN'T SPECIFY WHY.png" : arguments[2]; + + var self = this; + + return new Promise(function (resolve, reject) { + request.post(Endpoints.CHANNELS + "/" + destination + "/messages").set("authorization", self.token).attach("file", attachment, attachmentName).end(function (err, res) { + + if (err) { + reject(err); + } else { + + var chann = self.getChannel("id", destination); + if (chann) { + var msg = chann.addMessage(new Message(res.body, chann, [], self.user)); + resolve(msg); + } + } + }); + }); + }; + + Client.prototype._updateMessage = function _updateMessage(message, content) { + var self = this; + return new Promise(function (resolve, reject) { + request.patch(Endpoints.CHANNELS + "/" + message.channel.id + "/messages/" + message.id).set("authorization", self.token).send({ + content: content, + mentions: [] + }).end(function (err, res) { + if (err) { + reject(err); + } else { + var msg = new Message(res.body, message.channel, message.mentions, message.sender); + resolve(msg); + message.channel.messages[message.channel.messages.indexOf(message)] = msg; + } + }); + }); + }; + + Client.prototype.getGateway = function getGateway() { + var self = this; + return new Promise(function (resolve, reject) { + request.get(Endpoints.API + "/gateway").set("authorization", self.token).end(function (err, res) { + if (err) { + reject(err); + } else { + resolve(res.body.url); + } + }); + }); + }; + + Client.prototype.setStatusIdle = function setStatusIdle() { + this.setStatus("idle"); + }; + + Client.prototype.setStatusOnline = function setStatusOnline() { + this.setStatus("online"); + }; + + Client.prototype.setStatusActive = function setStatusActive() { + this.setStatusOnline(); + }; + + Client.prototype.setStatusHere = function setStatusHere() { + this.setStatusOnline(); + }; + + Client.prototype.setStatusAway = function setStatusAway() { + this.setStatusIdle(); + }; + + Client.prototype.startTyping = function startTyping(chann, stopTypeTime) { + var self = this; + + this.resolveDestination(chann).then(next); + + function next(channel) { + if (self.typingIntervals[channel]) { + return; + } + + var fn = function fn() { + request.post(Endpoints.CHANNELS + "/" + channel + "/typing").set("authorization", self.token).end(); + }; + + fn(); + + var interval = setInterval(fn, 3000); + + self.typingIntervals[channel] = interval; + + if (stopTypeTime) { + setTimeout(function () { + self.stopTyping(channel); + }, stopTypeTime); + } + } + }; + + Client.prototype.stopTyping = function stopTyping(chann) { + var self = this; + + this.resolveDestination(chann).then(next); + + function next(channel) { + if (!self.typingIntervals[channel]) { + return; + } + + clearInterval(self.typingIntervals[channel]); + + delete self.typingIntervals[channel]; + } + }; + + Client.prototype.setStatus = function setStatus(stat) { + + var idleTime = stat === "online" ? null : Date.now(); + + this.__idleTime = idleTime; + + this.websocket.send(JSON.stringify({ + op: 3, + d: { + idle_since: this.__idleTime, + game_id: this.__gameId + } + })); + }; + + Client.prototype.setPlayingGame = function setPlayingGame(id) { + + if (id instanceof String || typeof id === "string") { + + // working on names + var gid = id.trim().toUpperCase(); + + id = null; + + for (var _iterator20 = gameMap, _isArray20 = Array.isArray(_iterator20), _i20 = 0, _iterator20 = _isArray20 ? _iterator20 : _iterator20[Symbol.iterator]();;) { + var _ref20; + + if (_isArray20) { + if (_i20 >= _iterator20.length) break; + _ref20 = _iterator20[_i20++]; + } else { + _i20 = _iterator20.next(); + if (_i20.done) break; + _ref20 = _i20.value; + } + + var game = _ref20; + + if (game.name.trim().toUpperCase() === gid) { + + id = game.id; + break; + } + } + } + + this.__gameId = id; + + this.websocket.send(JSON.stringify({ + op: 3, + d: { + idle_since: this.__idleTime, + game_id: this.__gameId + } + })); + }; + + Client.prototype.playGame = function playGame(id) { + this.setPlayingGame(id); + }; + + Client.prototype.playingGame = function playingGame(id) { + + this.setPlayingGame(id); + }; + + Client.prototype.resolveInvite = function resolveInvite(resource) { + + if (resource instanceof Invite) { + return resource.code; + } else if (typeof resource == "string" || resource instanceof String) { + + if (resource.indexOf("http") === 0) { + var split = resource.split("/"); + return split.pop(); + } else { + return resource; + } + } + }; + + Client.prototype.checkCatchUp = function checkCatchUp(rstate) { + var self = this; + if (self.options.catchup) { + // mention_count, last_message_id, id + rstate.forEach(function (catchup, index) { + if (self.options.catchup === "all") { + self.getChannelLogs(catchup.id, 100000, { + after: catchup.last_message_id + }).then(function (results) { + + for (var _iterator21 = results, _isArray21 = Array.isArray(_iterator21), _i21 = 0, _iterator21 = _isArray21 ? _iterator21 : _iterator21[Symbol.iterator]();;) { + var _ref21; + + if (_isArray21) { + if (_i21 >= _iterator21.length) break; + _ref21 = _iterator21[_i21++]; + } else { + _i21 = _iterator21.next(); + if (_i21.done) break; + _ref21 = _i21.value; + } + + var m = _ref21; + + self.emit("message", m, true); + } + + self.ack(results[0]); + }); + } else if (self.options.catchup) { + self.getChannelLogs(catchup.id, 2500).then(function (results) { + + for (var _iterator22 = results, _isArray22 = Array.isArray(_iterator22), _i22 = 0, _iterator22 = _isArray22 ? _iterator22 : _iterator22[Symbol.iterator]();;) { + var _ref22; + + if (_isArray22) { + if (_i22 >= _iterator22.length) break; + _ref22 = _iterator22[_i22++]; + } else { + _i22 = _iterator22.next(); + if (_i22.done) break; + _ref22 = _i22.value; + } + + var m = _ref22; + + if (m.id == catchup.last_message_id) break; + self.emit("message", m, true); + } + + self.ack(results[0]); + }); + } + }); + } + }; + + _createClass(Client, [{ + key: "uptime", + get: function get() { + + return this.readyTime ? Date.now() - this.readyTime : null; + } + }, { + key: "ready", + get: function get() { + return this.state === 3; + } + }, { + key: "servers", + get: function get() { + return this.serverCache; + } + }, { + key: "channels", + get: function get() { + return this.channelCache; + } + }, { + key: "users", + get: function get() { + return this.userCache; + } + }, { + key: "PMChannels", + get: function get() { + return this.pmChannelCache; + } + }, { + key: "messages", + get: function get() { + + var msgs = []; + for (var _iterator23 = this.channelCache, _isArray23 = Array.isArray(_iterator23), _i23 = 0, _iterator23 = _isArray23 ? _iterator23 : _iterator23[Symbol.iterator]();;) { + var _ref23; + + if (_isArray23) { + if (_i23 >= _iterator23.length) break; + _ref23 = _iterator23[_i23++]; + } else { + _i23 = _iterator23.next(); + if (_i23.done) break; + _ref23 = _i23.value; + } + + var channel = _ref23; + + msgs = msgs.concat(channel.messages); + } + return msgs; + } + }]); + + return Client; +})(EventEmitter); + +module.exports = Client; \ No newline at end of file diff --git a/lib/Endpoints.js b/lib/Endpoints.js index 60cd7925c..271b465eb 100644 --- a/lib/Endpoints.js +++ b/lib/Endpoints.js @@ -1 +1,13 @@ -"use strict";exports.BASE_DOMAIN = "discordapp.com";exports.BASE = "https://" + exports.BASE_DOMAIN;exports.WEBSOCKET_HUB = "wss://" + exports.BASE_DOMAIN + "/hub";exports.API = exports.BASE + "/api";exports.AUTH = exports.API + "/auth";exports.LOGIN = exports.AUTH + "/login";exports.LOGOUT = exports.AUTH + "/logout";exports.USERS = exports.API + "/users";exports.SERVERS = exports.API + "/guilds";exports.CHANNELS = exports.API + "/channels"; +"use strict"; + +exports.BASE_DOMAIN = "discordapp.com"; +exports.BASE = "https://" + exports.BASE_DOMAIN; +exports.WEBSOCKET_HUB = "wss://" + exports.BASE_DOMAIN + "/hub"; + +exports.API = exports.BASE + "/api"; +exports.AUTH = exports.API + "/auth"; +exports.LOGIN = exports.AUTH + "/login"; +exports.LOGOUT = exports.AUTH + "/logout"; +exports.USERS = exports.API + "/users"; +exports.SERVERS = exports.API + "/guilds"; +exports.CHANNELS = exports.API + "/channels"; \ No newline at end of file diff --git a/lib/EvaluatedPermissions.js b/lib/EvaluatedPermissions.js index 403cdc0c0..a1ea0861d 100644 --- a/lib/EvaluatedPermissions.js +++ b/lib/EvaluatedPermissions.js @@ -1,3 +1,203 @@ -"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");}}var EvaluatedPermissions=(function(){function EvaluatedPermissions(data){_classCallCheck(this,EvaluatedPermissions);var self=this;this.packed = data;if(this.getBit(3))this.packed = 4294967295;}EvaluatedPermissions.prototype.serialise = function serialise(){return {createInstantInvite:this.createInstantInvite,manageRoles:this.manageRoles,manageChannels:this.manageChannels,readMessages:this.readMessages,sendMessages:this.sendMessage,sendTTSMessages:this.sendTTSMessages,manageMessages:this.manageMessages,embedLinks:this.embedLinks,attachFiles:this.attachFiles,readMessageHistory:this.readMessageHistory,mentionEveryone:this.mentionEveryone,voiceConnect:this.voiceConnect,voiceSpeak:this.voiceSpeak,voiceMuteMembers:this.voiceMuteMembers,voiceDeafenMembers:this.voiceDeafenMembers,voiceMoveMember:this.voiceMoveMembers,voiceUseVoiceActivation:this.voiceUseVoiceActivation};};EvaluatedPermissions.prototype.serialize = function serialize(){return this.serialise();};EvaluatedPermissions.prototype.getBit = function getBit(x){if((this.packed >>> 3 & 1) === 1){return true;}return (this.packed >>> x & 1) === 1;};EvaluatedPermissions.prototype.setBit = function setBit(location,value){if(value){ // allow that permission -this.packed |= 1 << location;}else { // not allowed -this.packed &= 1 << location;}};_createClass(EvaluatedPermissions,[{key:"createInstantInvite",get:function get(){return this.getBit(0);},set:function set(val){this.setBit(0,val);}},{key:"manageRoles",get:function get(){return this.getBit(3);},set:function set(val){this.setBit(3,val);}},{key:"manageChannels",get:function get(){return this.getBit(4);},set:function set(val){this.setBit(4,val);}},{key:"readMessages",get:function get(){return this.getBit(10);},set:function set(val){this.setBit(10,val);}},{key:"sendMessages",get:function get(){return this.getBit(11);},set:function set(val){this.setBit(11,val);}},{key:"sendTTSMessages",get:function get(){return this.getBit(12);},set:function set(val){this.setBit(12,val);}},{key:"manageMessages",get:function get(){return this.getBit(13);},set:function set(val){this.setBit(13,val);}},{key:"embedLinks",get:function get(){return this.getBit(14);},set:function set(val){this.setBit(14,val);}},{key:"attachFiles",get:function get(){return this.getBit(15);},set:function set(val){this.setBit(15,val);}},{key:"readMessageHistory",get:function get(){return this.getBit(16);},set:function set(val){this.setBit(16,val);}},{key:"mentionEveryone",get:function get(){return this.getBit(17);},set:function set(val){this.setBit(17,val);}},{key:"voiceConnect",get:function get(){return this.getBit(20);},set:function set(val){this.setBit(20,val);}},{key:"voiceSpeak",get:function get(){return this.getBit(21);},set:function set(val){this.setBit(21,val);}},{key:"voiceMuteMembers",get:function get(){return this.getBit(22);},set:function set(val){this.setBit(22,val);}},{key:"voiceDeafenMembers",get:function get(){return this.getBit(23);},set:function set(val){this.setBit(23,val);}},{key:"voiceMoveMembers",get:function get(){return this.getBit(24);},set:function set(val){this.setBit(24,val);}},{key:"voiceUseVoiceActivation",get:function get(){return this.getBit(25);},set:function set(val){this.setBit(25,val);}}]);return EvaluatedPermissions;})();module.exports = EvaluatedPermissions; +"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"); } } + +var EvaluatedPermissions = (function () { + function EvaluatedPermissions(data) { + _classCallCheck(this, EvaluatedPermissions); + + var self = this; + + this.packed = data; + + if (this.getBit(3)) this.packed = 4294967295; + } + + EvaluatedPermissions.prototype.serialise = function serialise() { + return { + createInstantInvite: this.createInstantInvite, + manageRoles: this.manageRoles, + manageChannels: this.manageChannels, + readMessages: this.readMessages, + sendMessages: this.sendMessage, + sendTTSMessages: this.sendTTSMessages, + manageMessages: this.manageMessages, + embedLinks: this.embedLinks, + attachFiles: this.attachFiles, + readMessageHistory: this.readMessageHistory, + mentionEveryone: this.mentionEveryone, + voiceConnect: this.voiceConnect, + voiceSpeak: this.voiceSpeak, + voiceMuteMembers: this.voiceMuteMembers, + voiceDeafenMembers: this.voiceDeafenMembers, + voiceMoveMember: this.voiceMoveMembers, + voiceUseVoiceActivation: this.voiceUseVoiceActivation + }; + }; + + EvaluatedPermissions.prototype.serialize = function serialize() { + return this.serialise(); + }; + + EvaluatedPermissions.prototype.getBit = function getBit(x) { + if ((this.packed >>> 3 & 1) === 1) { + return true; + } + return (this.packed >>> x & 1) === 1; + }; + + EvaluatedPermissions.prototype.setBit = function setBit(location, value) { + + if (value) { + // allow that permission + this.packed |= 1 << location; + } else { + // not allowed + this.packed &= 1 << location; + } + }; + + _createClass(EvaluatedPermissions, [{ + key: "createInstantInvite", + get: function get() { + return this.getBit(0); + }, + set: function set(val) { + this.setBit(0, val); + } + }, { + key: "manageRoles", + get: function get() { + return this.getBit(3); + }, + set: function set(val) { + this.setBit(3, val); + } + }, { + key: "manageChannels", + get: function get() { + return this.getBit(4); + }, + set: function set(val) { + this.setBit(4, val); + } + }, { + key: "readMessages", + get: function get() { + return this.getBit(10); + }, + set: function set(val) { + this.setBit(10, val); + } + }, { + key: "sendMessages", + get: function get() { + return this.getBit(11); + }, + set: function set(val) { + this.setBit(11, val); + } + }, { + key: "sendTTSMessages", + get: function get() { + return this.getBit(12); + }, + set: function set(val) { + this.setBit(12, val); + } + }, { + key: "manageMessages", + get: function get() { + return this.getBit(13); + }, + set: function set(val) { + this.setBit(13, val); + } + }, { + key: "embedLinks", + get: function get() { + return this.getBit(14); + }, + set: function set(val) { + this.setBit(14, val); + } + }, { + key: "attachFiles", + get: function get() { + return this.getBit(15); + }, + set: function set(val) { + this.setBit(15, val); + } + }, { + key: "readMessageHistory", + get: function get() { + return this.getBit(16); + }, + set: function set(val) { + this.setBit(16, val); + } + }, { + key: "mentionEveryone", + get: function get() { + return this.getBit(17); + }, + set: function set(val) { + this.setBit(17, val); + } + }, { + key: "voiceConnect", + get: function get() { + return this.getBit(20); + }, + set: function set(val) { + this.setBit(20, val); + } + }, { + key: "voiceSpeak", + get: function get() { + return this.getBit(21); + }, + set: function set(val) { + this.setBit(21, val); + } + }, { + key: "voiceMuteMembers", + get: function get() { + return this.getBit(22); + }, + set: function set(val) { + this.setBit(22, val); + } + }, { + key: "voiceDeafenMembers", + get: function get() { + return this.getBit(23); + }, + set: function set(val) { + this.setBit(23, val); + } + }, { + key: "voiceMoveMembers", + get: function get() { + return this.getBit(24); + }, + set: function set(val) { + this.setBit(24, val); + } + }, { + key: "voiceUseVoiceActivation", + get: function get() { + return this.getBit(25); + }, + set: function set(val) { + this.setBit(25, val); + } + }]); + + return EvaluatedPermissions; +})(); + +module.exports = EvaluatedPermissions; \ No newline at end of file diff --git a/lib/Member.js b/lib/Member.js index e781b7713..26c4f3cb2 100644 --- a/lib/Member.js +++ b/lib/Member.js @@ -1,4 +1,213 @@ -"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 User=require("./user.js");var ServerPermissions=require("./ServerPermissions.js");var EvaluatedPermissions=require("./EvaluatedPermissions.js");var Member=(function(_User){_inherits(Member,_User);function Member(user,server,roles){_classCallCheck(this,Member);_User.call(this,user); // should work, we are basically creating a Member that has the same properties as user and a few more -this.serverID = server.id;this.client = server.client;this.rawRoles = roles;}Member.prototype.removeRole = function removeRole(role){this.rawRoles.splice(this.rawRoles.indexOf(role.id),1);};Member.prototype.addRole = function addRole(role){if(this.rawRoles.indexOf(role.id) == -1){this.rawRoles.push(role.id);}};Member.prototype.hasRole = function hasRole(role){for(var _iterator=this.roles,_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 _role=_ref;if(role.id === _role.id)return true;}return false;};Member.prototype.permissionsIn = function permissionsIn(channel){if(channel.server.ownerID === this.id){return new EvaluatedPermissions(4294967295); //all perms -}var affectingOverwrites=[];var affectingMemberOverwrites=[];for(var _iterator2=channel.roles,_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.id === this.id && overwrite.type === "member"){affectingMemberOverwrites.push(overwrite);}else if(this.rawRoles.indexOf(overwrite.id) !== -1){affectingOverwrites.push(overwrite);}}if(affectingOverwrites.length === 0 && affectingMemberOverwrites.length === 0){return this.evalPerms;}var finalPacked=affectingOverwrites.length !== 0?affectingOverwrites[0].packed:affectingMemberOverwrites[0].packed;for(var _iterator3=affectingOverwrites,_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 overwrite=_ref3;finalPacked = finalPacked & ~overwrite.deny;finalPacked = finalPacked | overwrite.allow;}for(var _iterator4=affectingMemberOverwrites,_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 overwrite=_ref4;finalPacked = finalPacked & ~overwrite.deny;finalPacked = finalPacked | overwrite.allow;}return new EvaluatedPermissions(finalPacked);};_createClass(Member,[{key:"server",get:function get(){return this.client.getServer("id",this.serverID);}},{key:"roles",get:function get(){var ufRoles=[this.server.getRole("id",this.server.id)];for(var _iterator5=this.rawRoles,_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 rawRole=_ref5;ufRoles.push(this.server.getRole("id",rawRole));}return ufRoles;}},{key:"evalPerms",get:function get(){var basePerms=this.roles, //cache roles as it can be slightly expensive -basePerm=basePerms[0].packed;basePerms = basePerms || [];for(var _iterator6=basePerms,_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 perm=_ref6;basePerm = basePerm | perm.packed;}return new EvaluatedPermissions(basePerm);}}]);return Member;})(User);module.exports = Member; +"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 User = require("./user.js"); +var ServerPermissions = require("./ServerPermissions.js"); +var EvaluatedPermissions = require("./EvaluatedPermissions.js"); + +var Member = (function (_User) { + _inherits(Member, _User); + + function Member(user, server, roles) { + _classCallCheck(this, Member); + + _User.call(this, user); // should work, we are basically creating a Member that has the same properties as user and a few more + this.serverID = server.id; + this.client = server.client; + this.rawRoles = roles; + } + + Member.prototype.removeRole = function removeRole(role) { + this.rawRoles.splice(this.rawRoles.indexOf(role.id), 1); + }; + + Member.prototype.addRole = function addRole(role) { + if (this.rawRoles.indexOf(role.id) == -1) { + this.rawRoles.push(role.id); + } + }; + + Member.prototype.hasRole = function hasRole(role) { + for (var _iterator = this.roles, _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 _role = _ref; + + if (role.id === _role.id) return true; + } + return false; + }; + + Member.prototype.permissionsIn = function permissionsIn(channel) { + + if (channel.server.ownerID === this.id) { + return new EvaluatedPermissions(4294967295); //all perms + } + + var affectingOverwrites = []; + var affectingMemberOverwrites = []; + + for (var _iterator2 = channel.roles, _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.id == this.serverID) { + // @everyone for channel + affectingOverwrites.push(overwrite); + break; + } + } + + for (var _iterator3 = channel.roles, _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 overwrite = _ref3; + + if (overwrite.id === this.id && overwrite.type === "member") { + affectingMemberOverwrites.push(overwrite); + } else if (this.rawRoles.indexOf(overwrite.id) !== -1) { + affectingOverwrites.push(overwrite); + } + } + + if (affectingOverwrites.length === 0 && affectingMemberOverwrites.length === 0) { + return this.evalPerms; + } + + var finalPacked = affectingOverwrites.length !== 0 ? affectingOverwrites[0].packed : affectingMemberOverwrites[0].packed; + + for (var _iterator4 = affectingOverwrites, _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 overwrite = _ref4; + + finalPacked = finalPacked & ~overwrite.deny; + finalPacked = finalPacked | overwrite.allow; + } + + for (var _iterator5 = affectingMemberOverwrites, _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 overwrite = _ref5; + + finalPacked = finalPacked & ~overwrite.deny; + finalPacked = finalPacked | overwrite.allow; + } + + return new EvaluatedPermissions(finalPacked); + }; + + _createClass(Member, [{ + key: "server", + get: function get() { + return this.client.getServer("id", this.serverID); + } + }, { + key: "roles", + get: function get() { + + var ufRoles = [this.server.getRole("id", this.server.id)]; + + for (var _iterator6 = this.rawRoles, _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 rawRole = _ref6; + + ufRoles.push(this.server.getRole("id", rawRole)); + } + + return ufRoles; + } + }, { + key: "evalPerms", + get: function get() { + var basePerms = this.roles, + //cache roles as it can be slightly expensive + basePerm = basePerms[0].packed; + + basePerms = basePerms || []; + for (var _iterator7 = basePerms, _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 perm = _ref7; + + basePerm = basePerm | perm.packed; + } + + return new EvaluatedPermissions(basePerm); + } + }]); + + return Member; +})(User); + +module.exports = Member; \ No newline at end of file diff --git a/lib/PMChannel.js b/lib/PMChannel.js index 8d90dade1..06d1c120b 100644 --- a/lib/PMChannel.js +++ b/lib/PMChannel.js @@ -1 +1,61 @@ -"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");}}var PMChannel=(function(){function PMChannel(data,client){_classCallCheck(this,PMChannel);this.user = client.getUser("id",data.recipient.id);this.id = data.id;this.messages = [];this.client = client;}PMChannel.prototype.addMessage = function addMessage(data){if(!this.getMessage("id",data.id)){this.messages.push(data);}return this.getMessage("id",data.id);};PMChannel.prototype.getMessage = function getMessage(key,value){if(this.messages.length > 1000){this.messages.splice(0,1);}for(var _iterator=this.messages,_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 message=_ref;if(message[key] === value){return message;}}return null;};_createClass(PMChannel,[{key:"isPrivate",get:function get(){return true;}}]);return PMChannel;})();module.exports = PMChannel; +"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"); } } + +var PMChannel = (function () { + function PMChannel(data, client) { + _classCallCheck(this, PMChannel); + + this.user = client.getUser("id", data.recipient.id); + this.id = data.id; + this.messages = []; + this.client = client; + } + + PMChannel.prototype.addMessage = function addMessage(data) { + if (!this.getMessage("id", data.id)) { + this.messages.push(data); + } + return this.getMessage("id", data.id); + }; + + PMChannel.prototype.getMessage = function getMessage(key, value) { + + if (this.messages.length > 1000) { + this.messages.splice(0, 1); + } + + for (var _iterator = this.messages, _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 message = _ref; + + if (message[key] === value) { + return message; + } + } + return null; + }; + + _createClass(PMChannel, [{ + key: "isPrivate", + get: function get() { + return true; + } + }]); + + return PMChannel; +})(); + +module.exports = PMChannel; \ No newline at end of file diff --git a/lib/ServerPermissions.js b/lib/ServerPermissions.js index 0c6ffb729..67cded22c 100644 --- a/lib/ServerPermissions.js +++ b/lib/ServerPermissions.js @@ -1,3 +1,240 @@ -"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");}}var ServerPermissions=(function(){function ServerPermissions(data,server){_classCallCheck(this,ServerPermissions);var self=this;function getBit(x){return (self.packed >>> x & 1) === 1;}this.managed = data.managed || false;this.position = data.position || 1;this.hoist = data.hoist || false;this.color = data.color || 0;this.packed = data.permissions || (data.name === "@everyone"?36953089:0);this.name = data.name || "new role";this.id = data.id || null;this.server = server;}ServerPermissions.prototype.serialise = function serialise(){return {createInstantInvite:this.createInstantInvite,manageRoles:this.manageRoles,manageChannels:this.manageChannels,readMessages:this.readMessages,sendMessages:this.sendMessages,sendTTSMessages:this.sendTTSMessages,manageMessages:this.manageMessages,embedLinks:this.embedLinks,attachFiles:this.attachFiles,readMessageHistory:this.readMessageHistory,mentionEveryone:this.mentionEveryone,voiceConnect:this.voiceConnect,voiceSpeak:this.voiceSpeak,voiceMuteMembers:this.voiceMuteMembers,voiceDeafenMembers:this.voiceDeafenMembers,voiceMoveMembers:this.voiceMoveMembers,voiceUseVoiceActivation:this.voiceUseVoiceActivation};};ServerPermissions.prototype.serialize = function serialize(){return this.serialise();};ServerPermissions.prototype.getBit = function getBit(x){if((this.packed >>> 3 & 1) === 1){return true;}return (this.packed >>> x & 1) === 1;};ServerPermissions.prototype.setBit = function setBit(location,value){if(value){ // allow that permission -this.packed |= 1 << location;}else { // not allowed -this.packed &= ~(1 << location);}};ServerPermissions.prototype.toString = function toString(){return this.name;};_createClass(ServerPermissions,[{key:"createInstantInvite",get:function get(){return this.getBit(0);},set:function set(val){this.setBit(0,val);}},{key:"banMembers",get:function get(){return this.getBit(1);},set:function set(val){this.setBit(1,val);}},{key:"kickMembers",get:function get(){return this.getBit(2);},set:function set(val){this.setBit(2,val);}},{key:"manageRoles",get:function get(){return this.getBit(3);},set:function set(val){this.setBit(3,val);}},{key:"manageChannels",get:function get(){return this.getBit(4);},set:function set(val){this.setBit(4,val);}},{key:"manageServer",get:function get(){return this.getBit(5);},set:function set(val){this.setBit(5,val);}},{key:"readMessages",get:function get(){return this.getBit(10);},set:function set(val){this.setBit(10,val);}},{key:"sendMessages",get:function get(){return this.getBit(11);},set:function set(val){this.setBit(11,val);}},{key:"sendTTSMessages",get:function get(){return this.getBit(12);},set:function set(val){this.setBit(12,val);}},{key:"manageMessages",get:function get(){return this.getBit(13);},set:function set(val){this.setBit(13,val);}},{key:"embedLinks",get:function get(){return this.getBit(14);},set:function set(val){this.setBit(14,val);}},{key:"attachFiles",get:function get(){return this.getBit(15);},set:function set(val){this.setBit(15,val);}},{key:"readMessageHistory",get:function get(){return this.getBit(16);},set:function set(val){this.setBit(16,val);}},{key:"mentionEveryone",get:function get(){return this.getBit(17);},set:function set(val){this.setBit(17,val);}},{key:"voiceConnect",get:function get(){return this.getBit(20);},set:function set(val){this.setBit(20,val);}},{key:"voiceSpeak",get:function get(){return this.getBit(21);},set:function set(val){this.setBit(21,val);}},{key:"voiceMuteMembers",get:function get(){return this.getBit(22);},set:function set(val){this.setBit(22,val);}},{key:"voiceDeafenMembers",get:function get(){return this.getBit(23);},set:function set(val){this.setBit(23,val);}},{key:"voiceMoveMembers",get:function get(){return this.getBit(24);},set:function set(val){this.setBit(24,val);}},{key:"voiceUseVoiceActivation",get:function get(){return this.getBit(25);},set:function set(val){this.setBit(25,val);}}]);return ServerPermissions;})();module.exports = ServerPermissions; +"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"); } } + +var ServerPermissions = (function () { + function ServerPermissions(data, server) { + _classCallCheck(this, ServerPermissions); + + var self = this; + + function getBit(x) { + return (self.packed >>> x & 1) === 1; + } + + this.managed = data.managed || false; + this.position = data.position || 1; + this.hoist = data.hoist || false; + this.color = data.color || 0; + this.packed = data.permissions || (data.name === "@everyone" ? 36953089 : 0); + this.name = data.name || "new role"; + this.id = data.id || null; + this.server = server; + } + + ServerPermissions.prototype.serialise = function serialise() { + return { + createInstantInvite: this.createInstantInvite, + manageRoles: this.manageRoles, + manageChannels: this.manageChannels, + readMessages: this.readMessages, + sendMessages: this.sendMessages, + sendTTSMessages: this.sendTTSMessages, + manageMessages: this.manageMessages, + embedLinks: this.embedLinks, + attachFiles: this.attachFiles, + readMessageHistory: this.readMessageHistory, + mentionEveryone: this.mentionEveryone, + voiceConnect: this.voiceConnect, + voiceSpeak: this.voiceSpeak, + voiceMuteMembers: this.voiceMuteMembers, + voiceDeafenMembers: this.voiceDeafenMembers, + voiceMoveMembers: this.voiceMoveMembers, + voiceUseVoiceActivation: this.voiceUseVoiceActivation + }; + }; + + ServerPermissions.prototype.serialize = function serialize() { + return this.serialise(); + }; + + ServerPermissions.prototype.getBit = function getBit(x) { + if ((this.packed >>> 3 & 1) === 1) { + return true; + } + return (this.packed >>> x & 1) === 1; + }; + + ServerPermissions.prototype.setBit = function setBit(location, value) { + + if (value) { + // allow that permission + this.packed |= 1 << location; + } else { + // not allowed + this.packed &= ~(1 << location); + } + }; + + ServerPermissions.prototype.toString = function toString() { + return this.name; + }; + + _createClass(ServerPermissions, [{ + key: "createInstantInvite", + get: function get() { + return this.getBit(0); + }, + set: function set(val) { + this.setBit(0, val); + } + }, { + key: "banMembers", + get: function get() { + return this.getBit(1); + }, + set: function set(val) { + this.setBit(1, val); + } + }, { + key: "kickMembers", + get: function get() { + return this.getBit(2); + }, + set: function set(val) { + this.setBit(2, val); + } + }, { + key: "manageRoles", + get: function get() { + return this.getBit(3); + }, + set: function set(val) { + this.setBit(3, val); + } + }, { + key: "manageChannels", + get: function get() { + return this.getBit(4); + }, + set: function set(val) { + this.setBit(4, val); + } + }, { + key: "manageServer", + get: function get() { + return this.getBit(5); + }, + set: function set(val) { + this.setBit(5, val); + } + }, { + key: "readMessages", + get: function get() { + return this.getBit(10); + }, + set: function set(val) { + this.setBit(10, val); + } + }, { + key: "sendMessages", + get: function get() { + return this.getBit(11); + }, + set: function set(val) { + this.setBit(11, val); + } + }, { + key: "sendTTSMessages", + get: function get() { + return this.getBit(12); + }, + set: function set(val) { + this.setBit(12, val); + } + }, { + key: "manageMessages", + get: function get() { + return this.getBit(13); + }, + set: function set(val) { + this.setBit(13, val); + } + }, { + key: "embedLinks", + get: function get() { + return this.getBit(14); + }, + set: function set(val) { + this.setBit(14, val); + } + }, { + key: "attachFiles", + get: function get() { + return this.getBit(15); + }, + set: function set(val) { + this.setBit(15, val); + } + }, { + key: "readMessageHistory", + get: function get() { + return this.getBit(16); + }, + set: function set(val) { + this.setBit(16, val); + } + }, { + key: "mentionEveryone", + get: function get() { + return this.getBit(17); + }, + set: function set(val) { + this.setBit(17, val); + } + }, { + key: "voiceConnect", + get: function get() { + return this.getBit(20); + }, + set: function set(val) { + this.setBit(20, val); + } + }, { + key: "voiceSpeak", + get: function get() { + return this.getBit(21); + }, + set: function set(val) { + this.setBit(21, val); + } + }, { + key: "voiceMuteMembers", + get: function get() { + return this.getBit(22); + }, + set: function set(val) { + this.setBit(22, val); + } + }, { + key: "voiceDeafenMembers", + get: function get() { + return this.getBit(23); + }, + set: function set(val) { + this.setBit(23, val); + } + }, { + key: "voiceMoveMembers", + get: function get() { + return this.getBit(24); + }, + set: function set(val) { + this.setBit(24, val); + } + }, { + key: "voiceUseVoiceActivation", + get: function get() { + return this.getBit(25); + }, + set: function set(val) { + this.setBit(25, val); + } + }]); + + return ServerPermissions; +})(); + +module.exports = ServerPermissions; \ No newline at end of file diff --git a/lib/VoiceChannel.js b/lib/VoiceChannel.js index 4ace7d567..8d22d410a 100644 --- a/lib/VoiceChannel.js +++ b/lib/VoiceChannel.js @@ -1 +1,19 @@ -"use strict";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 Channel=require("./channel.js");var VoiceChannel=(function(_Channel){_inherits(VoiceChannel,_Channel);function VoiceChannel(data,server){_classCallCheck(this,VoiceChannel);_Channel.call(this,data,server);}return VoiceChannel;})(Channel); +"use strict"; + +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 Channel = require("./channel.js"); + +var VoiceChannel = (function (_Channel) { + _inherits(VoiceChannel, _Channel); + + function VoiceChannel(data, server) { + _classCallCheck(this, VoiceChannel); + + _Channel.call(this, data, server); + } + + return VoiceChannel; +})(Channel); \ No newline at end of file diff --git a/lib/channel.js b/lib/channel.js index 81cd4189f..aa168d512 100644 --- a/lib/channel.js +++ b/lib/channel.js @@ -1,2 +1,131 @@ -"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");}}var ChannelPermissions=require("./ChannelPermissions.js");var Channel=(function(){function Channel(data,server){_classCallCheck(this,Channel);this.serverID = server.id;this.client = server.client;this.name = data.name;this.type = data.type;this.topic = data.topic;this.id = data.id;this.messages = [];this.roles = [];if(data.permission_overwrites)for(var _iterator=data.permission_overwrites,_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 role=_ref;this.roles.push(new ChannelPermissions(role,this));} //this.isPrivate = isPrivate; //not sure about the implementation of this... -}Channel.prototype.permissionsOf = function permissionsOf(member){var mem=this.server.getMember("id",member.id);if(mem){return mem.permissionsIn(this);}else {return null;}};Channel.prototype.equals = function equals(object){return object && object.id === this.id;};Channel.prototype.addMessage = function addMessage(data){if(this.messages.length > 1000){this.messages.splice(0,1);}if(!this.getMessage("id",data.id)){this.messages.push(data);}return this.getMessage("id",data.id);};Channel.prototype.getMessage = function getMessage(key,value){for(var _iterator2=this.messages,_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 message=_ref2;if(message[key] === value){return message;}}return null;};Channel.prototype.toString = function toString(){return "<#" + this.id + ">";};_createClass(Channel,[{key:"server",get:function get(){return this.client.getServer("id",this.serverID);}},{key:"permissionOverwrites",get:function get(){return this.roles;}},{key:"permissions",get:function get(){return this.roles;}},{key:"isPrivate",get:function get(){return false;}},{key:"users",get:function get(){return this.server.members;}},{key:"members",get:function get(){return this.server.members;}}]);return Channel;})();module.exports = Channel; +"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"); } } + +var ChannelPermissions = require("./ChannelPermissions.js"); + +var Channel = (function () { + function Channel(data, server) { + _classCallCheck(this, Channel); + + this.serverID = server.id; + this.client = server.client; + this.name = data.name; + this.type = data.type; + this.topic = data.topic; + this.id = data.id; + this.messages = []; + this.roles = []; + + if (data.permission_overwrites) for (var _iterator = data.permission_overwrites, _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 role = _ref; + + this.roles.push(new ChannelPermissions(role, this)); + } + + //this.isPrivate = isPrivate; //not sure about the implementation of this... + } + + Channel.prototype.permissionsOf = function permissionsOf(member) { + + var mem = this.server.getMember("id", member.id); + + if (mem) { + return mem.permissionsIn(this); + } else { + return null; + } + }; + + Channel.prototype.equals = function equals(object) { + return object && object.id === this.id; + }; + + Channel.prototype.addMessage = function addMessage(data) { + + if (this.messages.length > 1000) { + this.messages.splice(0, 1); + } + + if (!this.getMessage("id", data.id)) { + this.messages.push(data); + } + + return this.getMessage("id", data.id); + }; + + Channel.prototype.getMessage = function getMessage(key, value) { + for (var _iterator2 = this.messages, _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 message = _ref2; + + if (message[key] === value) { + return message; + } + } + return null; + }; + + Channel.prototype.toString = function toString() { + return "<#" + this.id + ">"; + }; + + _createClass(Channel, [{ + key: "server", + get: function get() { + return this.client.getServer("id", this.serverID); + } + }, { + key: "permissionOverwrites", + get: function get() { + return this.roles; + } + }, { + key: "permissions", + get: function get() { + return this.roles; + } + }, { + key: "isPrivate", + get: function get() { + return false; + } + }, { + key: "users", + get: function get() { + return this.server.members; + } + }, { + key: "members", + get: function get() { + return this.server.members; + } + }]); + + return Channel; +})(); + +module.exports = Channel; \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 793b2546f..156dcec9c 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1 +1,53 @@ -"use strict";var request=require("superagent");var Endpoints=require("./Endpoints.js");var Client=require("./Client.js");var Color=require("../ref/colours.js");var Discord={Endpoints:Endpoints,Client:Client,Color:Color,User:require("./user.js"),Server:require("./server.js"),Channel:require("./channel.js"),Message:require("./message.js"),Invite:require("./invite.js"),PMChannel:require("./PMChannel.js"),ServerPermissions:require("./ServerPermissions.js"),ChannelPermissions:require("./ChannelPermissions.js"),EvaluatedPermissiosn:require("./EvaluatedPermissions.js"),VoiceChannel:require("./VoiceChannel.js"),gameMap:require("../ref/gameMap.json"),Embed:require("./Embeds/Embed.js"),LinkEmbed:require("./Embeds/LinkEmbed.js"),VideoEmbed:require("./Embeds/VideoEmbed.js"),ImageEmbed:require("./Embeds/ImageEmbed.js")};Discord.patchStrings = function(){defineProperty("bold","**");defineProperty("underline","__");defineProperty("strike","~~");defineProperty("code","`");defineProperty("codeblock","```");defineProperty("newline","\n");Object.defineProperty(String.prototype,"italic",{get:function get(){return "*" + this + "*";}});function defineProperty(name,joiner){Object.defineProperty(String.prototype,name,{get:function get(){return joiner + this + joiner;}});}};module.exports = Discord; +"use strict"; + +var request = require("superagent"); +var Endpoints = require("./Endpoints.js"); +var Client = require("./Client.js"); +var Color = require("../ref/colours.js"); + +var Discord = { + Endpoints: Endpoints, + Client: Client, + Color: Color, + User: require("./user.js"), + Server: require("./server.js"), + Channel: require("./channel.js"), + Message: require("./message.js"), + Invite: require("./invite.js"), + PMChannel: require("./PMChannel.js"), + ServerPermissions: require("./ServerPermissions.js"), + ChannelPermissions: require("./ChannelPermissions.js"), + EvaluatedPermissiosn: require("./EvaluatedPermissions.js"), + VoiceChannel: require("./VoiceChannel.js"), + gameMap: require("../ref/gameMap.json"), + Embed: require("./Embeds/Embed.js"), + LinkEmbed: require("./Embeds/LinkEmbed.js"), + VideoEmbed: require("./Embeds/VideoEmbed.js"), + ImageEmbed: require("./Embeds/ImageEmbed.js") +}; + +Discord.patchStrings = function () { + + defineProperty("bold", "**"); + defineProperty("underline", "__"); + defineProperty("strike", "~~"); + defineProperty("code", "`"); + defineProperty("codeblock", "```"); + defineProperty("newline", "\n"); + + Object.defineProperty(String.prototype, "italic", { + get: function get() { + return "*" + this + "*"; + } + }); + + function defineProperty(name, joiner) { + Object.defineProperty(String.prototype, name, { + get: function get() { + return joiner + this + joiner; + } + }); + } +}; + +module.exports = Discord; \ No newline at end of file diff --git a/lib/internal.js b/lib/internal.js index 9b165ac44..c151fbf0c 100644 --- a/lib/internal.js +++ b/lib/internal.js @@ -1,4 +1,208 @@ /* this file is deprecated and should only be used as reference. -*/"use strict";var request=require("superagent");var Endpoints=require("./endpoints.js");var Internal={};Internal.XHR = {};Internal.WebSocket = {};Internal.WebSocket.properties = {"$os":"discord.js","$browser":"discord.js","$device":"discord.js","$referrer":"","$referring_domain":""};Internal.XHR.login = function(email,password,callback){request.post(Endpoints.LOGIN).send({email:email,password:password}).end(function(err,res){if(err){callback(err);}else {callback(null,res.body.token);}});};Internal.XHR.logout = function(token,callback){request.post(Endpoints.LOGOUT).end(function(err,res){err?callback(err):callback(null);});};Internal.XHR.createServer = function(token,name,region,callback){request.post(Endpoints.SERVERS).set("authorization",token).send({name:name,region:region}).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.leaveServer = function(token,serverId,callback){request.del(Endpoints.SERVERS + "/" + serverId).set("authorization",token).end(function(err,res){err?callback(err):callback(null);});};Internal.XHR.createInvite = function(token,channelId,options,callback){request.post(Endpoints.CHANNELS + "/" + channelId + "/invites").set("authorization",token).send(options).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.startPM = function(token,selfID,userID,callback){request.post(Endpoints.USERS + "/" + selfID + "/channels").set("authorization",token).send({recipient_id:userID}).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.sendMessage = function(token,channelID,messageParameters,callback){request.post(Endpoints.CHANNELS + "/" + channelID + "/messages").set("authorization",token).send(messageParameters).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.sendFile = function(token,channelID,file,fileName,callback){request.post(Endpoints.CHANNELS + "/" + channelID + "/messages").set("authorization",token).attach("file",file,fileName).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.deleteMessage = function(token,channelID,messageID,callback){request.del(Endpoints.CHANNELS + "/" + channelID + "/messages/" + messageID).set("authorization",token).end(function(err){err?callback(err):callback(null);});};Internal.XHR.updateMessage = function(token,channelID,messageID,messageParameters,callback){request.patch(Endpoints.CHANNELS + "/" + channelID + "/messages/" + messageID).set("authorization",token).send(messageParameters).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.getChannelLogs = function(token,channelID,amount,callback){request.get(Endpoints.CHANNELS + "/" + channelID + "/messages?limit=" + amount).set("authorization",token).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.createChannel = function(token,serverID,name,type,callback){request.post(Endpoints.SERVERS + "/" + serverID + "/channels").set("authorization",token).send({name:name,type:type}).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.deleteChannel = function(token,channelID,callback){request.del(Endpoints.CHANNELS + "/" + channelID).set("authorization",token).end(function(err){err?callback(err):callback(null);});};Internal.XHR.deleteServer = function(token,serverID,callback){request.del(Endpoints.SERVERS + "/" + serverID).set("authorization",token).end(function(err){err?callback(err):callback(null);});};Internal.XHR.getChannels = function(token,serverID,callback){request.get(Endpoints.SERVERS + "/" + serverID + "/channels").set("authorization",token).end(function(err){err?callback(err):callback(null);});};Internal.XHR.getServer = function(token,serverID,callback){request.get(Endpoints.SERVERS + "/" + serverID).set("authorization",token).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.acceptInvite = function(token,inviteID,callback){request.post(Endpoints.API + "/invite/" + inviteID).set("authorization",token).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.setUsername = function(token,avatar,email,newPassword,password,username,callback){request.patch(Endpoints.API + "/users/@me").set("authorization",token).send({avatar:avatar,email:email,new_password:newPassword,password:password,username:username}).end(function(err){callback(err);});};exports.Internal = Internal; +*/ + +"use strict"; + +var request = require("superagent"); +var Endpoints = require("./endpoints.js"); + +var Internal = {}; + +Internal.XHR = {}; +Internal.WebSocket = {}; + +Internal.WebSocket.properties = { + "$os": "discord.js", + "$browser": "discord.js", + "$device": "discord.js", + "$referrer": "", + "$referring_domain": "" +}; + +Internal.XHR.login = function (email, password, callback) { + + request.post(Endpoints.LOGIN).send({ + email: email, + password: password + }).end(function (err, res) { + if (err) { + callback(err); + } else { + callback(null, res.body.token); + } + }); +}; + +Internal.XHR.logout = function (token, callback) { + + request.post(Endpoints.LOGOUT).end(function (err, res) { + + err ? callback(err) : callback(null); + }); +}; + +Internal.XHR.createServer = function (token, name, region, callback) { + + request.post(Endpoints.SERVERS).set("authorization", token).send({ + name: name, + region: region + }).end(function (err, res) { + if (err) { + callback(err); + } else { + callback(null, res.body); + } + }); +}; + +Internal.XHR.leaveServer = function (token, serverId, callback) { + + request.del(Endpoints.SERVERS + "/" + serverId).set("authorization", token).end(function (err, res) { + + err ? callback(err) : callback(null); + }); +}; + +Internal.XHR.createInvite = function (token, channelId, options, callback) { + request.post(Endpoints.CHANNELS + "/" + channelId + "/invites").set("authorization", token).send(options).end(function (err, res) { + if (err) { + callback(err); + } else { + callback(null, res.body); + } + }); +}; + +Internal.XHR.startPM = function (token, selfID, userID, callback) { + + request.post(Endpoints.USERS + "/" + selfID + "/channels").set("authorization", token).send({ + recipient_id: userID + }).end(function (err, res) { + if (err) { + callback(err); + } else { + callback(null, res.body); + } + }); +}; + +Internal.XHR.sendMessage = function (token, channelID, messageParameters, callback) { + request.post(Endpoints.CHANNELS + "/" + channelID + "/messages").set("authorization", token).send(messageParameters).end(function (err, res) { + + if (err) { + callback(err); + } else { + callback(null, res.body); + } + }); +}; + +Internal.XHR.sendFile = function (token, channelID, file, fileName, callback) { + request.post(Endpoints.CHANNELS + "/" + channelID + "/messages").set("authorization", token).attach("file", file, fileName).end(function (err, res) { + + if (err) { + callback(err); + } else { + callback(null, res.body); + } + }); +}; + +Internal.XHR.deleteMessage = function (token, channelID, messageID, callback) { + request.del(Endpoints.CHANNELS + "/" + channelID + "/messages/" + messageID).set("authorization", token).end(function (err) { + err ? callback(err) : callback(null); + }); +}; + +Internal.XHR.updateMessage = function (token, channelID, messageID, messageParameters, callback) { + + request.patch(Endpoints.CHANNELS + "/" + channelID + "/messages/" + messageID).set("authorization", token).send(messageParameters).end(function (err, res) { + if (err) { + callback(err); + } else { + callback(null, res.body); + } + }); +}; + +Internal.XHR.getChannelLogs = function (token, channelID, amount, callback) { + request.get(Endpoints.CHANNELS + "/" + channelID + "/messages?limit=" + amount).set("authorization", token).end(function (err, res) { + + if (err) { + callback(err); + } else { + callback(null, res.body); + } + }); +}; + +Internal.XHR.createChannel = function (token, serverID, name, type, callback) { + request.post(Endpoints.SERVERS + "/" + serverID + "/channels").set("authorization", token).send({ + name: name, + type: type + }).end(function (err, res) { + if (err) { + callback(err); + } else { + callback(null, res.body); + } + }); +}; + +Internal.XHR.deleteChannel = function (token, channelID, callback) { + + request.del(Endpoints.CHANNELS + "/" + channelID).set("authorization", token).end(function (err) { + err ? callback(err) : callback(null); + }); +}; +Internal.XHR.deleteServer = function (token, serverID, callback) { + request.del(Endpoints.SERVERS + "/" + serverID).set("authorization", token).end(function (err) { + err ? callback(err) : callback(null); + }); +}; + +Internal.XHR.getChannels = function (token, serverID, callback) { + request.get(Endpoints.SERVERS + "/" + serverID + "/channels").set("authorization", token).end(function (err) { + err ? callback(err) : callback(null); + }); +}; + +Internal.XHR.getServer = function (token, serverID, callback) { + + request.get(Endpoints.SERVERS + "/" + serverID).set("authorization", token).end(function (err, res) { + + if (err) { + callback(err); + } else { + callback(null, res.body); + } + }); +}; + +Internal.XHR.acceptInvite = function (token, inviteID, callback) { + + request.post(Endpoints.API + "/invite/" + inviteID).set("authorization", token).end(function (err, res) { + if (err) { + callback(err); + } else { + callback(null, res.body); + } + }); +}; + +Internal.XHR.setUsername = function (token, avatar, email, newPassword, password, username, callback) { + + request.patch(Endpoints.API + "/users/@me").set("authorization", token).send({ + avatar: avatar, + email: email, + new_password: newPassword, + password: password, + username: username + }).end(function (err) { + callback(err); + }); +}; + +exports.Internal = Internal; \ No newline at end of file diff --git a/lib/invite.js b/lib/invite.js index 5ff2ddf15..5f51dc1a9 100644 --- a/lib/invite.js +++ b/lib/invite.js @@ -1 +1,35 @@ -"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");}}var Invite=(function(){function Invite(data,client){_classCallCheck(this,Invite);this.max_age = data.max_age;this.code = data.code;this.server = client.getServer("id",data.guild.id);this.revoked = data.revoked;this.created_at = Date.parse(data.created_at);this.temporary = data.temporary;this.uses = data.uses;this.max_uses = data.uses;this.inviter = client.addUser(data.inviter);this.xkcd = data.xkcdpass;this.channel = client.getChannel("id",data.channel.id);}_createClass(Invite,[{key:"URL",get:function get(){var code=this.xkcd?this.xkcdpass:this.code;return "https://discord.gg/" + code;}}]);return Invite;})();module.exports = Invite; +"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"); } } + +var Invite = (function () { + function Invite(data, client) { + _classCallCheck(this, Invite); + + this.max_age = data.max_age; + this.code = data.code; + this.server = client.getServer("id", data.guild.id); + this.revoked = data.revoked; + this.created_at = Date.parse(data.created_at); + this.temporary = data.temporary; + this.uses = data.uses; + this.max_uses = data.uses; + this.inviter = client.addUser(data.inviter); + this.xkcd = data.xkcdpass; + this.channel = client.getChannel("id", data.channel.id); + } + + _createClass(Invite, [{ + key: "URL", + get: function get() { + var code = this.xkcd ? this.xkcdpass : this.code; + return "https://discord.gg/" + code; + } + }]); + + return Invite; +})(); + +module.exports = Invite; \ No newline at end of file diff --git a/lib/message.js b/lib/message.js index 96b56412d..9e325b3b9 100644 --- a/lib/message.js +++ b/lib/message.js @@ -1,3 +1,95 @@ -"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");}}var PMChannel=require("./PMChannel.js");var Embeddable=require("./Embeds/IEmbed.js");var Message=(function(){function Message(data,channel,mentions,author){_classCallCheck(this,Message);this.tts = data.tts;this.timestamp = Date.parse(data.timestamp);this.nonce = data.nonce;this.mentions = mentions;this.everyoneMentioned = data.mention_everyone;this.id = data.id;this.embeds = [];if(data.embeds){for(var _iterator=data.embeds,_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 embed=_ref;this.embeds.push(Embeddable.createEmbed(embed));}}this.editedTimestamp = data.edited_timestamp;this.content = data.content.trim();this.channel = channel;if(this.isPrivate){this.author = this.channel.client.getUser("id",author.id);}else {this.author = this.channel.server.getMember("id",author.id) || this.channel.client.getUser("id",author.id);}this.attachments = data.attachments;} /*exports.Message.prototype.isPM = function() { - return ( this.channel instanceof PMChannel ); -}*/Message.prototype.isMentioned = function isMentioned(user){var id=user.id?user.id:user;for(var _iterator2=this.mentions,_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;if(mention.id === id){return true;}}return false;};_createClass(Message,[{key:"sender",get:function get(){return this.author;}},{key:"isPrivate",get:function get(){return this.channel.isPrivate;}}]);return Message;})();module.exports = Message; +"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"); } } + +var PMChannel = require("./PMChannel.js"); +var Embeddable = require("./Embeds/IEmbed.js"); + +var Message = (function () { + function Message(data, channel, mentions, author) { + _classCallCheck(this, Message); + + this.tts = data.tts; + this.timestamp = Date.parse(data.timestamp); + this.nonce = data.nonce; + this.mentions = mentions; + this.everyoneMentioned = data.mention_everyone; + this.id = data.id; + this.embeds = []; + if (data.embeds) { + for (var _iterator = data.embeds, _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 embed = _ref; + + this.embeds.push(Embeddable.createEmbed(embed)); + } + } + + this.editedTimestamp = data.edited_timestamp; + this.content = data.content.trim(); + this.channel = channel; + + if (this.isPrivate) { + this.author = this.channel.client.getUser("id", author.id); + } else { + this.author = this.channel.server ? this.channel.server.getMember("id", author.id) : this.channel.client.getUser("id", author.id); + } + + this.attachments = data.attachments; + } + + /*exports.Message.prototype.isPM = function() { + return ( this.channel instanceof PMChannel ); + }*/ + + Message.prototype.isMentioned = function isMentioned(user) { + var id = user.id ? user.id : user; + for (var _iterator2 = this.mentions, _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; + + if (mention.id === id) { + return true; + } + } + return false; + }; + + _createClass(Message, [{ + key: "sender", + get: function get() { + return this.author; + } + }, { + key: "isPrivate", + get: function get() { + return this.channel.isPrivate; + } + }]); + + return Message; +})(); + +module.exports = Message; \ No newline at end of file diff --git a/lib/server.js b/lib/server.js index 8f27a32d5..261ce66ca 100644 --- a/lib/server.js +++ b/lib/server.js @@ -1,7 +1,287 @@ -"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");}}var ServerPermissions=require("./ServerPermissions.js");var Member=require("./Member.js");var Server=(function(){function Server(data,client){_classCallCheck(this,Server);this.client = client;this.region = data.region;this.ownerID = data.owner_id;this.name = data.name;this.id = data.id;this.members = [];this.channels = [];this.icon = data.icon;this.afkTimeout = data.afk_timeout;this.afkChannelId = data.afk_channel_id;this.roles = [];for(var _iterator=data.roles,_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 permissionGroup=_ref;this.roles.push(new ServerPermissions(permissionGroup,this));}if(!data.members){data.members = [client.user];return;}for(var _iterator2=data.members,_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 member=_ref2; // first we cache the user in our Discord Client, -// then we add it to our list. This way when we -// get a user from this server's member list, -// it will be identical (unless an async change occurred) -// to the client's cache. -if(member.user)this.addMember(client.addUser(member.user),member.roles);}} // get/set -Server.prototype.getRole = function getRole(key,value){for(var _iterator3=this.roles,_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 role=_ref3;if(role[key] === value){return role;}}return null;};Server.prototype.addRole = function addRole(data){if(this.getRole("id",data.id)){return this.getRole("id",data.id);}var perms=new ServerPermissions(data,this);this.roles.push(perms);return perms;};Server.prototype.updateRole = function updateRole(data){var oldRole=this.getRole("id",data.id);if(oldRole){var index=this.roles.indexOf(oldRole);this.roles[index] = new ServerPermissions(data,this);return this.roles[index];}else {return false;}};Server.prototype.removeRole = function removeRole(id){for(var roleId in this.roles) {if(this.roles[roleId].id === id){this.roles.splice(roleId,1);}}for(var _iterator4=this.members,_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 member=_ref4;for(var roleId in member.rawRoles) {if(member.rawRoles[roleId] === id){member.rawRoles.splice(roleId,1);}}}};Server.prototype.getChannel = function getChannel(key,value){for(var _iterator5=this.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 channel=_ref5;if(channel[key] === value){return channel;}}return null;};Server.prototype.getMember = function getMember(key,value){for(var _iterator6=this.members,_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 member=_ref6;if(member[key] === value){return member;}}return null;};Server.prototype.removeMember = function removeMember(key,value){for(var _iterator7=this.members,_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 member=_ref7;if(member[key] === value){this.members.splice(key,1);return member;}}return false;};Server.prototype.addChannel = function addChannel(chann){if(!this.getChannel("id",chann.id)){this.channels.push(chann);}return chann;};Server.prototype.addMember = function addMember(user,roles){if(!this.getMember("id",user.id)){var mem=new Member(user,this,roles);this.members.push(mem);}return mem;};Server.prototype.toString = function toString(){return this.name;};Server.prototype.equals = function equals(object){return object.id === this.id;};_createClass(Server,[{key:"permissionGroups",get:function get(){return this.roles;}},{key:"permissions",get:function get(){return this.roles;}},{key:"iconURL",get:function get(){if(!this.icon)return null;return "https://discordapp.com/api/guilds/" + this.id + "/icons/" + this.icon + ".jpg";}},{key:"afkChannel",get:function get(){if(!this.afkChannelId)return false;return this.getChannel("id",this.afkChannelId);}},{key:"defaultChannel",get:function get(){return this.getChannel("name","general");}},{key:"owner",get:function get(){return this.client.getUser("id",this.ownerID);}},{key:"users",get:function get(){return this.members;}}]);return Server;})();module.exports = Server; +"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"); } } + +var ServerPermissions = require("./ServerPermissions.js"); +var Member = require("./Member.js"); + +var Server = (function () { + function Server(data, client) { + _classCallCheck(this, Server); + + this.client = client; + this.region = data.region; + this.ownerID = data.owner_id; + this.name = data.name; + this.id = data.id; + this.members = []; + this.channels = []; + this.icon = data.icon; + this.afkTimeout = data.afk_timeout; + this.afkChannelId = data.afk_channel_id; + + this.roles = []; + + for (var _iterator = data.roles, _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 permissionGroup = _ref; + + this.roles.push(new ServerPermissions(permissionGroup, this)); + } + + if (!data.members) { + data.members = [client.user]; + return; + } + + for (var _iterator2 = data.members, _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 member = _ref2; + + // first we cache the user in our Discord Client, + // then we add it to our list. This way when we + // get a user from this server's member list, + // it will be identical (unless an async change occurred) + // to the client's cache. + if (member.user) this.addMember(client.addUser(member.user), member.roles); + } + } + + // get/set + + Server.prototype.getRole = function getRole(key, value) { + for (var _iterator3 = this.roles, _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 role = _ref3; + + if (role[key] === value) { + return role; + } + } + + return null; + }; + + Server.prototype.addRole = function addRole(data) { + + if (this.getRole("id", data.id)) { + return this.getRole("id", data.id); + } + + var perms = new ServerPermissions(data, this); + this.roles.push(perms); + return perms; + }; + + Server.prototype.updateRole = function updateRole(data) { + + var oldRole = this.getRole("id", data.id); + + if (oldRole) { + var index = this.roles.indexOf(oldRole); + this.roles[index] = new ServerPermissions(data, this); + + return this.roles[index]; + } else { + return false; + } + }; + + Server.prototype.removeRole = function removeRole(id) { + for (var roleId in this.roles) { + if (this.roles[roleId].id === id) { + this.roles.splice(roleId, 1); + } + } + + for (var _iterator4 = this.members, _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 member = _ref4; + + for (var roleId in member.rawRoles) { + if (member.rawRoles[roleId] === id) { + member.rawRoles.splice(roleId, 1); + } + } + } + }; + + Server.prototype.getChannel = function getChannel(key, value) { + for (var _iterator5 = this.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 channel = _ref5; + + if (channel[key] === value) { + return channel; + } + } + + return null; + }; + + Server.prototype.getMember = function getMember(key, value) { + for (var _iterator6 = this.members, _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 member = _ref6; + + if (member[key] === value) { + return member; + } + } + + return null; + }; + + Server.prototype.removeMember = function removeMember(key, value) { + for (var _iterator7 = this.members, _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 member = _ref7; + + if (member[key] === value) { + this.members.splice(key, 1); + return member; + } + } + + return false; + }; + + Server.prototype.addChannel = function addChannel(chann) { + if (!this.getChannel("id", chann.id)) { + this.channels.push(chann); + } + return chann; + }; + + Server.prototype.addMember = function addMember(user, roles) { + if (!this.getMember("id", user.id)) { + var mem = new Member(user, this, roles); + this.members.push(mem); + } + return mem; + }; + + Server.prototype.toString = function toString() { + return this.name; + }; + + Server.prototype.equals = function equals(object) { + return object.id === this.id; + }; + + _createClass(Server, [{ + key: "permissionGroups", + get: function get() { + return this.roles; + } + }, { + key: "permissions", + get: function get() { + return this.roles; + } + }, { + key: "iconURL", + get: function get() { + if (!this.icon) return null; + return "https://discordapp.com/api/guilds/" + this.id + "/icons/" + this.icon + ".jpg"; + } + }, { + key: "afkChannel", + get: function get() { + if (!this.afkChannelId) return false; + + return this.getChannel("id", this.afkChannelId); + } + }, { + key: "defaultChannel", + get: function get() { + return this.getChannel("name", "general"); + } + }, { + key: "owner", + get: function get() { + return this.client.getUser("id", this.ownerID); + } + }, { + key: "users", + get: function get() { + return this.members; + } + }]); + + return Server; +})(); + +module.exports = Server; \ No newline at end of file diff --git a/lib/user.js b/lib/user.js index 6e3b12edc..4f2670b8f 100644 --- a/lib/user.js +++ b/lib/user.js @@ -1,7 +1,54 @@ -"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");}}var User=(function(){function User(data){_classCallCheck(this,User);this.username = data.username;this.discriminator = data.discriminator;this.id = data.id;this.avatar = data.avatar;this.status = data.status || "offline";this.gameId = data.game_id || null;} // access using user.avatarURL; -User.prototype.mention = function mention(){return "<@" + this.id + ">";};User.prototype.toString = function toString(){ /* - if we embed a user in a String - like so: - "Yo " + user + " what's up?" - It would generate something along the lines of: - "Yo @hydrabolt what's up?" - */return this.mention();};User.prototype.equals = function equals(object){return object.id === this.id;};User.prototype.equalsStrict = function equalsStrict(object){return object.id === this.id && object.avatar === this.avatar && object.username === this.username && object.discriminator === this.discriminator;};_createClass(User,[{key:"avatarURL",get:function get(){if(!this.avatar)return null;return "https://discordapp.com/api/users/" + this.id + "/avatars/" + this.avatar + ".jpg";}}]);return User;})();module.exports = User; +"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"); } } + +var User = (function () { + function User(data) { + _classCallCheck(this, User); + + this.username = data.username; + this.discriminator = data.discriminator; + this.id = data.id; + this.avatar = data.avatar; + this.status = data.status || "offline"; + this.gameId = data.game_id || null; + } + + // access using user.avatarURL; + + User.prototype.mention = function mention() { + return "<@" + this.id + ">"; + }; + + User.prototype.toString = function toString() { + /* + if we embed a user in a String - like so: + "Yo " + user + " what's up?" + It would generate something along the lines of: + "Yo @hydrabolt what's up?" + */ + return this.mention(); + }; + + User.prototype.equals = function equals(object) { + return object.id === this.id; + }; + + User.prototype.equalsStrict = function equalsStrict(object) { + return object.id === this.id && object.avatar === this.avatar && object.username === this.username && object.discriminator === this.discriminator; + }; + + _createClass(User, [{ + key: "avatarURL", + get: function get() { + if (!this.avatar) return null; + return "https://discordapp.com/api/users/" + this.id + "/avatars/" + this.avatar + ".jpg"; + } + }]); + + return User; +})(); + +module.exports = User; \ No newline at end of file diff --git a/src/Client.js b/src/Client.js index b37ddb10a..f76c16223 100644 --- a/src/Client.js +++ b/src/Client.js @@ -313,6 +313,9 @@ class Client extends EventEmitter { callback(err); reject(err); } else { + for(var channel of server.channels){ + self.channelCache.splice(self.channelCache.indexOf(channel), 1); + } self.serverCache.splice(self.serverCache.indexOf(server), 1); callback(null); resolve(); @@ -1339,6 +1342,9 @@ class Client extends EventEmitter { var server = self.getServer("id", data.id); if (server) { + for(var channel of server.channels){ + self.channelCache.splice(self.channelCache.indexOf(channel), 1); + } self.serverCache.splice(self.serverCache.indexOf(server), 1); self.emit("serverDelete", server); }