diff --git a/lib/Client.js b/lib/Client.js index 447867671..9a390c31f 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -1,79 +1 @@ -//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 {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 {var server=self.getServer("id",res.body.guild.id);if(server){callback(null,server);resolve(server);}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 && 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(data && 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);var server=self.getServer("id",data.guild_id);if(server){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; +"use strict"; \ No newline at end of file diff --git a/src/ChannelPermissions.js b/src/ChannelPermissions.js deleted file mode 100644 index 88ab94d4b..000000000 --- a/src/ChannelPermissions.js +++ /dev/null @@ -1,162 +0,0 @@ -class ChannelPermissions { - constructor(data, channel) { - - 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; - - } - - 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, - voiceMoveMember: this.voiceMoveMembers, - voiceUseVoiceActivation: this.voiceUseVoiceActivation - } - } - - serialize(){ - return this.serialise(); - } - - get asAllowDisallow() { - - 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 - }; - } - - get createInstantInvite() { return this.getBit(0); } - set createInstantInvite(val) { this.setBit(0, val); } - - get manageRoles() { return this.getBit(3); } - set manageRoles(val) { this.setBit(3, val); } - - get manageChannels() { return this.getBit(4); } - set manageChannels(val) { this.setBit(4, val); } - - get readMessages() { return this.getBit(10); } - set readMessages(val) { this.setBit(10, val); } - - get sendMessages() { return this.getBit(11); } - set sendMessages(val) { this.setBit(11, val); } - - get sendTTSMessages() { return this.getBit(12); } - set sendTTSMessages(val) { this.setBit(12, val); } - - get manageMessages() { return this.getBit(13); } - set manageMessages(val) { this.setBit(13, val); } - - get embedLinks() { return this.getBit(14); } - set embedLinks(val) { this.setBit(14, val); } - - get attachFiles() { return this.getBit(15); } - set attachFiles(val) { this.setBit(15, val); } - - get readMessageHistory() { return this.getBit(16); } - set readMessageHistory(val) { this.setBit(16, val); } - - get mentionEveryone() { return this.getBit(17); } - set mentionEveryone(val) { this.setBit(17, val); } - - get voiceConnect() { return this.getBit(20); } - set voiceConnect(val) { this.setBit(20, val); } - - get voiceSpeak() { return this.getBit(21); } - set voiceSpeak(val) { this.setBit(21, val); } - - get voiceMuteMembers() { return this.getBit(22); } - set voiceMuteMembers(val) { this.setBit(22, val); } - - get voiceDeafenMembers() { return this.getBit(23); } - set voiceDeafenMembers(val) { this.setBit(23, val); } - - get voiceMoveMembers() { return this.getBit(24); } - set voiceMoveMembers(val) { this.setBit(24, val); } - - get voiceUseVoiceActivation() { return this.getBit(25); } - set voiceUseVoiceActivation(val) { this.setBit(25, val); } - - getBit(x) { - if (((this.packed >>> 3) & 1) === 1) { - return true; - } - return ((this.packed >>> x) & 1) === 1; - } - - setBit(location, value) { - - if (value) { - // allow that permission - this.packed |= (1 << location); - - } else { - // not allowed - this.packed &= (1 << location); - } - - } -} - -module.exports = ChannelPermissions; \ No newline at end of file diff --git a/src/Client.js b/src/Client.js index 5466c3c61..e69de29bb 100644 --- a/src/Client.js +++ b/src/Client.js @@ -1,2158 +0,0 @@ -//discord.js modules -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 -} - -class Client extends EventEmitter { - - constructor(options = defaultOptions, token = undefined) { - - /* - 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. - */ - super(); - - 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; - } - - get uptime() { - - return (this.readyTime ? Date.now() - this.readyTime : null); - - } - - get ready() { - return this.state === 3; - } - - get servers() { - return this.serverCache; - } - - get channels() { - return this.channelCache; - } - - get users() { - return this.userCache; - } - - get PMChannels() { - return this.pmChannelCache; - } - - get messages() { - - var msgs = []; - for (var channel of this.channelCache) { - msgs = msgs.concat(channel.messages); - } - return msgs; - - } - - sendPacket(JSONObject) { - if (this.websocket.readyState === 1) { - this.websocket.send(JSON.stringify(JSONObject)); - } - } - - //def debug - debug(message) { - this.emit("debug", message); - } - - keepAlive() { - this.debug("keep alive emitted"); - this.sendPacket({ - op: 1, - d: Date.now() - }); - } - - //def login - login(email = "foo@bar.com", password = "pass1234", callback = function (err, token) { }) { - - 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")); - } - }); - - } - - banMember(user, server, daysToDeleteMessage = 1, cb = function (err) { }) { - - 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(); - } - }); - - }); - - } - - logout(callback = function (err) { }) { - - 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(); - } - }); - - }); - - } - - createServer(name, region, callback = function (err, server) { }) { - 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);*/ - } - }); - - }); - } - - createChannel(server, channelName, channelType, callback = function (err, chann) { }) { - - 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); - } - - }) - - }); - - } - - leaveServer(server, callback = function (err, server) { }) { - - 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 channel of server.channels){ - self.channelCache.splice(self.channelCache.indexOf(channel), 1); - } - self.serverCache.splice(self.serverCache.indexOf(server), 1); - callback(null); - resolve(); - } - - }); - - }); - - } - - createInvite(serverOrChannel, options, callback = function (err, invite) { }) { - - 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); - } - }); - }); - - } - - 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)); - } - }); - }); - - } - - reply(destination, message, options, callback = function (err, msg) { }) { - - 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); - - }); - - } - - deleteMessage(message, timeout, callback = function (err, msg) { }) { - - 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); - } - }); - - } - - updateMessage(message, content, callback = function (err, msg) { }) { - - 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; - } - - setUsername(newName, callback = function (err) { }) { - - 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(); - }); - }); - } - - getChannelLogs(channel, amount = 500, options = {}, callback = function (err, logs) { }) { - - 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 message of res.body) { - - var mentions = []; - for (var mention of message.mentions) { - 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); - } - - }); - }); - - } - - deleteChannel(channel, callback = function (err) { }) { - - 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(); - } - }); - - }); - - } - - joinServer(invite, callback = function (err, server) { }) { - - 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 { - var server = self.getServer("id", res.body.guild.id); - if (server) { - callback(null, server); - resolve(server); - } else { - self.serverCreateListener[res.body.guild.id] = [resolve, callback]; - } - } - }); - - }); - - } - - setAvatar(resource, callback = function (err) { }) { - - 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(); - }); - - }); - - } - - sendFile(destination, file, fileName = "image.png", callback = function (err, msg) { }) { - - 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; - - } - - sendMessage(destination, message, options, callback = function (err, msg) { }, premessage = "") { - - 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 mention of (message.match(/<@[^>]*>/g) || [])) { - _mentions.push(mention.substring(2, mention.length - 1)); - } - return _mentions; - } - - }); - - return prom; - } - - createRoleIfNotExists(dest, data, cb = function (err, role) { }) { - - 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 role of server.roles) { - 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((role) => { - cb(null, role); - resolve(role); - }).catch((e) => { - cb(e); - reject(e); - }); - - }); - - } - - createRole(dest, data, cb = function (err, role) { }) { - - 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 && data.color) - data.color = Color.toDec(data.color); - - self.guildRoleCreateIgnoreList[res.body.id] = true; - - server.addRole(res.body); - - self.updateRole(perm, data) - .then((perm) => { - cb(null, perm); - resolve(perm); - }) - .catch((err) => { - cb(err); - reject(err); - }); - - - } - - }); - - }); - - } - - updateRole(role, data, cb = function (err, perm) { }) { - - 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 (data && 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); - - } - }); - - }); - - } - - deleteRole(role, callback = function (err) { }) { - - // 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(); - } - }) - - }); - - } - - addMemberToRole(member, role, callback = function (err) { }) { - 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); - } - }); - } - - removeMemberFromRole(member, role, callback = function (err) { }) { - 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); - } - }); - } - - overwritePermissions(channel, role, updatedStuff, callback = function (err) { }) { - - 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 - }; - } - - } - - getBans(serverResource, callback = function (err, arrayOfBans) { }) { - - 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 user of res.body) { - banList.push(self.addUser(user.user)); - } - - callback(null, banList); - resolve(banList); - - } - - }); - - }); - - } - - //def createws - 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 _server of data.guilds) { - - var server = self.addServer(_server); - - } - - for (var _pmc of data.private_channels) { - 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 mention of data.mentions) { - 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 mention of data.mentions) { - 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 channel of server.channels){ - 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); - var server = self.getServer("id", data.guild_id); - if (server) { - 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(() => { - 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 - addUser(data) { - if (!this.getUser("id", data.id)) { - this.userCache.push(new User(data)); - } - return this.getUser("id", data.id); - } - - //def addChannel - 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); - } - - addPMChannel(data) { - if (!this.getPMChannel("id", data.id)) { - this.pmChannelCache.push(new PMChannel(data, this)); - } - return this.getPMChannel("id", data.id); - } - - setTopic(channel, topic, callback = function (err) { }) { - - 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 - addServer(data, force = false) { - - 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 channel of data.channels) { - server.channels.push(this.addChannel(channel, server.id)); - } - } - if (data.presences) { - for (var presence of data.presences) { - var user = self.getUser("id", presence.user.id); - user.status = presence.status; - user.gameId = presence.game_id; - } - } - } - - return server; - } - - //def getUser - getUser(key, value) { - for (var user of this.userCache) { - if (user[key] === value) { - return user; - } - } - return null; - } - - //def getChannel - getChannel(key, value) { - for (var channel of this.channelCache) { - if (channel[key] === value) { - return channel; - } - } - return this.getPMChannel(key, value); //might be a PM - } - - getPMChannel(key, value) { - for (var channel of this.pmChannelCache) { - if (channel[key] === value) { - return channel; - } - } - return null; - } - - //def getServer - getServer(key, value) { - for (var server of this.serverCache) { - if (server[key] === value) { - return server; - } - } - return null; - } - - //def trySendConnData - 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)); - } - } - - 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; - } - - } - - resolveUserID(resource) { - if (resource instanceof User) { // also accounts for Member - return resource.id; - } else { - return resource; - } - } - - 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 pmc of self.pmChannelCache) { - 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(); - }); - } - - 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(); - } - }); - } - - _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 mention of data.mentions) { - 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); - } - } - - }); - }); - - } - - _sendFile(destination, attachment, attachmentName = "DEFAULT BECAUSE YOU DIDN'T SPECIFY WHY.png") { - - 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); - } - - - } - - }); - }); - - } - - _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; - } - }); - }); - } - - 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); - } - }); - }); - } - - setStatusIdle() { - this.setStatus("idle"); - } - - setStatusOnline() { - this.setStatus("online"); - } - - setStatusActive() { - this.setStatusOnline(); - } - - setStatusHere() { - this.setStatusOnline(); - } - - setStatusAway() { - this.setStatusIdle(); - } - - startTyping(chann, stopTypeTime) { - var self = this; - - this.resolveDestination(chann).then(next); - - function next(channel) { - if (self.typingIntervals[channel]) { - return; - } - - var fn = function () { - 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); - } - } - } - - 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]; - - } - } - - 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 - } - })); - } - - setPlayingGame(id) { - - if (id instanceof String || typeof id === `string`) { - - // working on names - var gid = id.trim().toUpperCase(); - - id = null; - - for (var game of gameMap) { - - 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 - } - })); - - } - - playGame(id) { - this.setPlayingGame(id); - } - - playingGame(id) { - - this.setPlayingGame(id); - - } - - 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; - } - - } - - } - - 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((results) => { - - for (var m of results) { - self.emit("message", m, true); - } - - self.ack(results[0]); - - }); - }else if(self.options.catchup){ - self.getChannelLogs(catchup.id, 2500).then((results) => { - - for (var m of results) { - if(m.id == catchup.last_message_id) - break; - self.emit("message", m, true); - } - - self.ack(results[0]); - - }); - } - }); - } - } -} - -module.exports = Client; \ No newline at end of file diff --git a/src/Embeds/Embed.js b/src/Embeds/Embed.js deleted file mode 100644 index fc29ac605..000000000 --- a/src/Embeds/Embed.js +++ /dev/null @@ -1,21 +0,0 @@ -class Embed{ - constructor(data){ - this.url = data.url; - this.type = data.type; - this.title = data.title; - this.thumbnail = data.thumbnail; - //width - //height - //url - //proxy_url - this.provider = data.provider; - //url - //name - this.description = data.description; - this.author = data.author; - //url - //name - } -} - -module.exports = Embed; \ No newline at end of file diff --git a/src/Embeds/IEmbed.js b/src/Embeds/IEmbed.js deleted file mode 100644 index 54ef486cb..000000000 --- a/src/Embeds/IEmbed.js +++ /dev/null @@ -1,17 +0,0 @@ -var ImageEmbed = require("./ImageEmbed.js"), - VideoEmbed = require("./VideoEmbed.js"), - LinkEmbed = require("./LinkEmbed.js"); - -exports.createEmbed = function(data){ - switch(data.type){ - case "image": - return new ImageEmbed(data); - break; - case "video": - return new VideoEmbed(data); - break; - case "link": - return new LinkEmbed(data); - break; - } -} \ No newline at end of file diff --git a/src/Embeds/ImageEmbed.js b/src/Embeds/ImageEmbed.js deleted file mode 100644 index de2fc0e4b..000000000 --- a/src/Embeds/ImageEmbed.js +++ /dev/null @@ -1,9 +0,0 @@ -var Embed = require("./Embed.js"); - -class ImageEmbed extends Embed{ - constructor(data){ - super(data); - } -} - -module.exports = ImageEmbed; \ No newline at end of file diff --git a/src/Embeds/LinkEmbed.js b/src/Embeds/LinkEmbed.js deleted file mode 100644 index 16902db1a..000000000 --- a/src/Embeds/LinkEmbed.js +++ /dev/null @@ -1,9 +0,0 @@ -var Embed = require("./Embed.js"); - -class LinkEmbed extends Embed{ - constructor(data){ - super(data); - } -} - -module.exports = LinkEmbed; \ No newline at end of file diff --git a/src/Embeds/VideoEmbed.js b/src/Embeds/VideoEmbed.js deleted file mode 100644 index e3f1ce42c..000000000 --- a/src/Embeds/VideoEmbed.js +++ /dev/null @@ -1,13 +0,0 @@ -var Embed = require("./Embed.js"); - -class VideoEmbed extends Embed{ - constructor(data){ - super(data); - this.video = data.video; - //width - //height - //url - } -} - -module.exports = VideoEmbed; \ No newline at end of file diff --git a/src/Endpoints.js b/src/Endpoints.js deleted file mode 100644 index 450bf0426..000000000 --- a/src/Endpoints.js +++ /dev/null @@ -1,11 +0,0 @@ -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/src/EvaluatedPermissions.js b/src/EvaluatedPermissions.js deleted file mode 100644 index 2f3bfed65..000000000 --- a/src/EvaluatedPermissions.js +++ /dev/null @@ -1,110 +0,0 @@ -class EvaluatedPermissions { - constructor(data) { - - var self = this; - - this.packed = data; - - if(this.getBit(3)) - this.packed = 4294967295; - } - - 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 - } - } - - serialize(){ - return this.serialise(); - } - - get createInstantInvite() { return this.getBit(0); } - set createInstantInvite(val) { this.setBit(0, val); } - - get manageRoles() { return this.getBit(3); } - set manageRoles(val) { this.setBit(3, val); } - - get manageChannels() { return this.getBit(4); } - set manageChannels(val) { this.setBit(4, val); } - - get readMessages() { return this.getBit(10); } - set readMessages(val) { this.setBit(10, val); } - - get sendMessages() { return this.getBit(11); } - set sendMessages(val) { this.setBit(11, val); } - - get sendTTSMessages() { return this.getBit(12); } - set sendTTSMessages(val) { this.setBit(12, val); } - - get manageMessages() { return this.getBit(13); } - set manageMessages(val) { this.setBit(13, val); } - - get embedLinks() { return this.getBit(14); } - set embedLinks(val) { this.setBit(14, val); } - - get attachFiles() { return this.getBit(15); } - set attachFiles(val) { this.setBit(15, val); } - - get readMessageHistory() { return this.getBit(16); } - set readMessageHistory(val) { this.setBit(16, val); } - - get mentionEveryone() { return this.getBit(17); } - set mentionEveryone(val) { this.setBit(17, val); } - - get voiceConnect() { return this.getBit(20); } - set voiceConnect(val) { this.setBit(20, val); } - - get voiceSpeak() { return this.getBit(21); } - set voiceSpeak(val) { this.setBit(21, val); } - - get voiceMuteMembers() { return this.getBit(22); } - set voiceMuteMembers(val) { this.setBit(22, val); } - - get voiceDeafenMembers() { return this.getBit(23); } - set voiceDeafenMembers(val) { this.setBit(23, val); } - - get voiceMoveMembers() { return this.getBit(24); } - set voiceMoveMembers(val) { this.setBit(24, val); } - - get voiceUseVoiceActivation() { return this.getBit(25); } - set voiceUseVoiceActivation(val) { this.setBit(25, val); } - - getBit(x) { - if( ((this.packed >>> 3) & 1) === 1 ){ - return true; - } - return ((this.packed >>> x) & 1) === 1; - } - - setBit(location, value){ - - if(value){ - // allow that permission - this.packed |= (1 << location); - - }else{ - // not allowed - this.packed &= (1 << location); - } - - } -} - -module.exports = EvaluatedPermissions; \ No newline at end of file diff --git a/src/Member.js b/src/Member.js deleted file mode 100644 index 4ec7e0743..000000000 --- a/src/Member.js +++ /dev/null @@ -1,107 +0,0 @@ -var User = require("./user.js"); -var ServerPermissions = require("./ServerPermissions.js"); -var EvaluatedPermissions = require("./EvaluatedPermissions.js"); - -class Member extends User{ - - constructor(user, server, roles){ - super(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; - } - - get server(){ - return this.client.getServer("id", this.serverID); - } - - get roles(){ - - var ufRoles = [ this.server.getRole("id", this.server.id) ]; - - for(var rawRole of this.rawRoles){ - ufRoles.push( this.server.getRole("id", rawRole) ); - } - - return ufRoles; - - } - - get evalPerms(){ - var basePerms = this.roles, //cache roles as it can be slightly expensive - basePerm = basePerms[0].packed; - - - basePerms = basePerms || []; - for(var perm of basePerms){ - basePerm = basePerm | perm.packed; - } - - return new EvaluatedPermissions(basePerm); - } - - removeRole(role){ - this.rawRoles.splice(this.rawRoles.indexOf(role.id), 1); - } - - addRole(role){ - if(this.rawRoles.indexOf(role.id) == -1){ - this.rawRoles.push(role.id); - } - } - - hasRole(role){ - for(var _role of this.roles){ - if(role.id === _role.id) - return true; - } - return false; - } - - permissionsIn(channel){ - - if(channel.server.ownerID === this.id){ - return new EvaluatedPermissions(4294967295); //all perms - } - - var affectingOverwrites = []; - var affectingMemberOverwrites = []; - - for(var overwrite of channel.roles) { - if(overwrite.id == this.serverID) { // @everyone for channel - affectingOverwrites.push(overwrite); - break; - } - } - - for(var overwrite of channel.roles){ - 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 overwrite of affectingOverwrites){ - finalPacked = finalPacked & ~overwrite.deny; - finalPacked = finalPacked | overwrite.allow; - } - - for(var overwrite of affectingMemberOverwrites){ - finalPacked = finalPacked & ~overwrite.deny; - finalPacked = finalPacked | overwrite.allow; - } - - return new EvaluatedPermissions(finalPacked); - - } - -} - -module.exports = Member; \ No newline at end of file diff --git a/src/PMChannel.js b/src/PMChannel.js deleted file mode 100644 index d2814afe5..000000000 --- a/src/PMChannel.js +++ /dev/null @@ -1,35 +0,0 @@ -class PMChannel { - constructor(data, client) { - this.user = client.getUser("id", data.recipient.id); - this.id = data.id; - this.messages = []; - this.client = client; - } - - addMessage(data){ - if(!this.getMessage("id", data.id)){ - this.messages.push(data); - } - return this.getMessage("id", data.id); - } - - getMessage(key, value){ - - if(this.messages.length > 1000){ - this.messages.splice(0,1); - } - - for(var message of this.messages){ - if(message[key] === value){ - return message; - } - } - return null; - } - - get isPrivate(){ - return true; - } -} - -module.exports = PMChannel; \ No newline at end of file diff --git a/src/ServerPermissions.js b/src/ServerPermissions.js deleted file mode 100644 index f281debb1..000000000 --- a/src/ServerPermissions.js +++ /dev/null @@ -1,132 +0,0 @@ -class ServerPermissions { - - constructor(data, server) { - - 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; - } - - 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 - } - } - - serialize(){ - return this.serialise(); - } - - get createInstantInvite() { return this.getBit(0); } - set createInstantInvite(val) { this.setBit(0, val); } - - get banMembers() { return this.getBit(1); } - set banMembers(val) { this.setBit(1, val); } - - get kickMembers() { return this.getBit(2); } - set kickMembers(val) { this.setBit(2, val); } - - get manageRoles() { return this.getBit(3); } - set manageRoles(val) { this.setBit(3, val); } - - get manageChannels() { return this.getBit(4); } - set manageChannels(val) { this.setBit(4, val); } - - get manageServer() { return this.getBit(5); } - set manageServer(val) { this.setBit(5, val); } - - get readMessages() { return this.getBit(10); } - set readMessages(val) { this.setBit(10, val); } - - get sendMessages() { return this.getBit(11); } - set sendMessages(val) { this.setBit(11, val); } - - get sendTTSMessages() { return this.getBit(12); } - set sendTTSMessages(val) { this.setBit(12, val); } - - get manageMessages() { return this.getBit(13); } - set manageMessages(val) { this.setBit(13, val); } - - get embedLinks() { return this.getBit(14); } - set embedLinks(val) { this.setBit(14, val); } - - get attachFiles() { return this.getBit(15); } - set attachFiles(val) { this.setBit(15, val); } - - get readMessageHistory() { return this.getBit(16); } - set readMessageHistory(val) { this.setBit(16, val); } - - get mentionEveryone() { return this.getBit(17); } - set mentionEveryone(val) { this.setBit(17, val); } - - get voiceConnect() { return this.getBit(20); } - set voiceConnect(val) { this.setBit(20, val); } - - get voiceSpeak() { return this.getBit(21); } - set voiceSpeak(val) { this.setBit(21, val); } - - get voiceMuteMembers() { return this.getBit(22); } - set voiceMuteMembers(val) { this.setBit(22, val); } - - get voiceDeafenMembers() { return this.getBit(23); } - set voiceDeafenMembers(val) { this.setBit(23, val); } - - get voiceMoveMembers() { return this.getBit(24); } - set voiceMoveMembers(val) { this.setBit(24, val); } - - get voiceUseVoiceActivation() { return this.getBit(25); } - set voiceUseVoiceActivation(val) { this.setBit(25, val); } - - getBit(x) { - if (((this.packed >>> 3) & 1) === 1) { - return true; - } - return ((this.packed >>> x) & 1) === 1; - } - - setBit(location, value) { - - if (value) { - // allow that permission - this.packed |= (1 << location); - - } else { - // not allowed - this.packed &= ~(1 << location); - } - - } - - toString() { - return this.name; - } -} - -module.exports = ServerPermissions; \ No newline at end of file diff --git a/src/VoiceChannel.js b/src/VoiceChannel.js deleted file mode 100644 index ae5d45d1d..000000000 --- a/src/VoiceChannel.js +++ /dev/null @@ -1,11 +0,0 @@ -var Channel = require("./channel.js"); - -class VoiceChannel extends Channel{ - - constructor(data, server){ - - super(data, server); - - } - -} \ No newline at end of file diff --git a/src/channel.js b/src/channel.js deleted file mode 100644 index b203f2df0..000000000 --- a/src/channel.js +++ /dev/null @@ -1,90 +0,0 @@ -var ChannelPermissions = require("./ChannelPermissions.js"); - -class Channel { - - constructor(data, server) { - 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 role of data.permission_overwrites) { - this.roles.push( new ChannelPermissions(role, this) ); - } - - //this.isPrivate = isPrivate; //not sure about the implementation of this... - } - - get server(){ - return this.client.getServer("id", this.serverID); - } - - get permissionOverwrites() { - return this.roles; - } - - get permissions() { - return this.roles; - } - - permissionsOf(member){ - - var mem = this.server.getMember("id", member.id); - - if(mem){ - return mem.permissionsIn(this); - }else{ - return null; - } - - } - - equals(object) { - return (object && object.id === this.id); - } - - 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); - } - - getMessage(key, value) { - for (var message of this.messages) { - if (message[key] === value) { - return message; - } - } - return null; - } - - toString() { - return "<#" + this.id + ">"; - } - - get isPrivate() { - return false; - } - - get users() { - return this.server.members; - } - - get members() { - return this.server.members; - } -} - -module.exports = Channel; \ No newline at end of file diff --git a/src/index.js b/src/index.js deleted file mode 100644 index faeb7b660..000000000 --- a/src/index.js +++ /dev/null @@ -1,51 +0,0 @@ -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 () { - return "*" + this + "*"; - } - }); - - function defineProperty(name, joiner) { - Object.defineProperty(String.prototype, name, { - get: function () { - return joiner + this + joiner; - } - }); - } -} - -module.exports = Discord; \ No newline at end of file diff --git a/src/internal.js b/src/internal.js deleted file mode 100644 index 02744cd66..000000000 --- a/src/internal.js +++ /dev/null @@ -1,282 +0,0 @@ -/* - this file is deprecated and should only be used as - reference. -*/ - -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; diff --git a/src/invite.js b/src/invite.js deleted file mode 100644 index 91c43bbd1..000000000 --- a/src/invite.js +++ /dev/null @@ -1,22 +0,0 @@ -class Invite { - constructor(data, client) { - 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); - } - - get URL() { - var code = (this.xkcd ? this.xkcdpass : this.code); - return "https://discord.gg/" + code; - } -} - -module.exports = Invite; \ No newline at end of file diff --git a/src/message.js b/src/message.js deleted file mode 100644 index b3b7e6680..000000000 --- a/src/message.js +++ /dev/null @@ -1,55 +0,0 @@ -var PMChannel = require("./PMChannel.js"); -var Embeddable = require("./Embeds/IEmbed.js"); - -class Message { - constructor(data, channel, mentions, author) { - 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 embed of data.embeds) { - 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; - } - - isMentioned(user) { - var id = (user.id ? user.id : user); - for (var mention of this.mentions) { - if (mention.id === id) { - return true; - } - } - return false; - } - - get sender() { - return this.author; - } - - get isPrivate() { - return this.channel.isPrivate; - } -} - -/*exports.Message.prototype.isPM = function() { - return ( this.channel instanceof PMChannel ); -}*/ - -module.exports = Message; \ No newline at end of file diff --git a/src/server.js b/src/server.js deleted file mode 100644 index ddc67d90b..000000000 --- a/src/server.js +++ /dev/null @@ -1,185 +0,0 @@ -var ServerPermissions = require("./ServerPermissions.js"); -var Member = require("./Member.js"); - -class Server { - constructor(data, client) { - 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 permissionGroup of data.roles){ - this.roles.push( new ServerPermissions(permissionGroup, this) ); - } - - if(!data.members){ - data.members = [ client.user ]; - return; - } - - for (var member of data.members) { - - // 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 permissionGroups(){ - return this.roles; - } - - get permissions(){ - return this.roles; - } - - get iconURL() { - if (!this.icon) - return null; - return `https://discordapp.com/api/guilds/${this.id}/icons/${this.icon}.jpg`; - } - - get afkChannel() { - if (!this.afkChannelId) - return false; - - return this.getChannel("id", this.afkChannelId); - } - - get defaultChannel() { - return this.getChannel("name", "general"); - } - - get owner() { - return this.client.getUser("id", this.ownerID); - } - - get users() { - return this.members; - } - - // get/set - - getRole(key, value){ - for (var role of this.roles) { - if (role[key] === value) { - return role; - } - } - - return null; - } - - 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; - - } - - 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; - } - - } - - removeRole(id){ - for (var roleId in this.roles) { - if (this.roles[roleId].id === id) { - this.roles.splice(roleId, 1); - } - } - - for(var member of this.members){ - for(var roleId in member.rawRoles){ - if(member.rawRoles[roleId] === id){ - member.rawRoles.splice(roleId, 1); - } - } - } - } - - getChannel(key, value) { - for (var channel of this.channels) { - if (channel[key] === value) { - return channel; - } - } - - return null; - } - - getMember(key, value){ - for (var member of this.members) { - if (member[key] === value) { - return member; - } - } - - return null; - } - - removeMember(key, value){ - for (var member of this.members) { - if (member[key] === value) { - this.members.splice(key, 1); - return member; - } - } - - return false; - } - - addChannel(chann) { - if (!this.getChannel("id", chann.id)) { - this.channels.push(chann); - } - return chann; - } - - addMember(user, roles){ - if (!this.getMember("id", user.id)){ - var mem = new Member(user, this, roles); - this.members.push(mem); - } - return mem; - } - - toString(){ - return this.name; - } - - equals(object){ - return object.id === this.id; - } -} - -module.exports = Server; \ No newline at end of file diff --git a/src/user.js b/src/user.js deleted file mode 100644 index 30af4f3e6..000000000 --- a/src/user.js +++ /dev/null @@ -1,41 +0,0 @@ -class User{ - constructor( data ){ - 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; - get avatarURL(){ - if( !this.avatar ) - return null; - return `https://discordapp.com/api/users/${this.id}/avatars/${this.avatar}.jpg`; - } - - mention(){ - return `<@${this.id}>`; - } - - 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(); - } - - equals(object){ - return object.id === this.id; - } - - equalsStrict(object){ - return object.id === this.id && object.avatar === this.avatar && object.username === this.username && object.discriminator === this.discriminator; - } -} - -module.exports = User; \ No newline at end of file