From beab032811816e3b5216bdeedbc1c7653516ad9d Mon Sep 17 00:00:00 2001 From: hydrabolt Date: Sat, 31 Oct 2015 15:25:59 +0000 Subject: [PATCH] Started rewrite --- lib/ChannelPermissions.js | 4 - lib/Client.js | 1 - lib/Client/Client.js | 41 ++++++++++ lib/Client/ConnectionState.js | 7 ++ lib/Client/InternalClient.js | 132 +++++++++++++++++++++++++++++++ lib/Constants.js | 69 ++++++++++++++++ lib/Embed.js | 9 --- lib/Embeds/Embed.js | 25 ------ lib/Embeds/IEmbed.js | 19 ----- lib/Embeds/ImageEmbed.js | 21 ----- lib/Embeds/LinkEmbed.js | 21 ----- lib/Embeds/VideoEmbed.js | 25 ------ lib/Endpoints.js | 1 - lib/EvaluatedPermissions.js | 3 - lib/Member.js | 5 -- lib/PMChannel.js | 1 - lib/ServerPermissions.js | 3 - lib/VoiceChannel.js | 1 - lib/channel.js | 2 - lib/index.js | 11 ++- lib/internal.js | 4 - lib/invite.js | 1 - lib/message.js | 3 - lib/server.js | 7 -- lib/user.js | 7 -- src/Client.js | 0 src/Client/Client.js | 34 ++++++++ src/Client/ConnectionState.js | 5 ++ src/Client/InternalClient.js | 144 ++++++++++++++++++++++++++++++++++ src/Constants.js | 35 +++++++++ src/index.js | 6 ++ 31 files changed, 483 insertions(+), 164 deletions(-) delete mode 100644 lib/ChannelPermissions.js delete mode 100644 lib/Client.js create mode 100644 lib/Client/Client.js create mode 100644 lib/Client/ConnectionState.js create mode 100644 lib/Client/InternalClient.js create mode 100644 lib/Constants.js delete mode 100644 lib/Embed.js delete mode 100644 lib/Embeds/Embed.js delete mode 100644 lib/Embeds/IEmbed.js delete mode 100644 lib/Embeds/ImageEmbed.js delete mode 100644 lib/Embeds/LinkEmbed.js delete mode 100644 lib/Embeds/VideoEmbed.js delete mode 100644 lib/Endpoints.js delete mode 100644 lib/EvaluatedPermissions.js delete mode 100644 lib/Member.js delete mode 100644 lib/PMChannel.js delete mode 100644 lib/ServerPermissions.js delete mode 100644 lib/VoiceChannel.js delete mode 100644 lib/channel.js delete mode 100644 lib/internal.js delete mode 100644 lib/invite.js delete mode 100644 lib/message.js delete mode 100644 lib/server.js delete mode 100644 lib/user.js delete mode 100644 src/Client.js create mode 100644 src/Client/Client.js create mode 100644 src/Client/ConnectionState.js create mode 100644 src/Client/InternalClient.js create mode 100644 src/Constants.js create mode 100644 src/index.js diff --git a/lib/ChannelPermissions.js b/lib/ChannelPermissions.js deleted file mode 100644 index 7eeb27e12..000000000 --- a/lib/ChannelPermissions.js +++ /dev/null @@ -1,4 +0,0 @@ -"use strict";var _createClass=(function(){function defineProperties(target,props){for(var i=0;i < props.length;i++) {var descriptor=props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if("value" in descriptor)descriptor.writable = true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};})();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var ChannelPermissions=(function(){function ChannelPermissions(data,channel){_classCallCheck(this,ChannelPermissions);var self=this;function getBit(x){return (self.packed >>> x & 1) === 1;}this.type = data.type; //either member or role -this.id = data.id;if(this.type === "member"){this.packed = channel.server.getMember("id",data.id).evalPerms.packed;}else {this.packed = channel.server.getRole("id",data.id).packed;}this.packed = this.packed & ~data.deny;this.packed = this.packed | data.allow;this.deny = data.deny;this.allow = data.allow;}ChannelPermissions.prototype.serialise = function serialise(){return {createInstantInvite:this.createInstantInvite,manageRoles:this.manageRoles,manageChannels:this.manageChannels,readMessages:this.readMessages,sendMessages:this.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};};ChannelPermissions.prototype.serialize = function serialize(){return this.serialise();};ChannelPermissions.prototype.getBit = function getBit(x){if((this.packed >>> 3 & 1) === 1){return true;}return (this.packed >>> x & 1) === 1;};ChannelPermissions.prototype.setBit = function setBit(location,value){if(value){ // allow that permission -this.packed |= 1 << location;}else { // not allowed -this.packed &= 1 << location;}};_createClass(ChannelPermissions,[{key:"asAllowDisallow",get:function get(){var allow=0,disallow=0;function ad(value,position){if(value){allow |= 1 << position;}else {disallow |= 1 << position;}}ad(this.createInstantInvite,0);ad(this.manageRoles,3);ad(this.manageChannels,4);ad(this.readMessages,10);ad(this.sendMessages,11);ad(this.sendTTSMessages,12);ad(this.manageMessages,13);ad(this.embedLinks,14);ad(this.attachFiles,15);ad(this.readMessageHistory,16);ad(this.mentionEveryone,17);ad(this.voiceConnect,20);ad(this.voiceSpeak,21);ad(this.voiceMuteMembers,22);ad(this.voiceDeafenMembers,23);ad(this.voiceMoveMembers,24);ad(this.voiceUseVoiceActivation,25);return {allow:allow,deny:disallow};}},{key:"createInstantInvite",get:function get(){return this.getBit(0);},set:function set(val){this.setBit(0,val);}},{key:"manageRoles",get:function get(){return this.getBit(3);},set:function set(val){this.setBit(3,val);}},{key:"manageChannels",get:function get(){return this.getBit(4);},set:function set(val){this.setBit(4,val);}},{key:"readMessages",get:function get(){return this.getBit(10);},set:function set(val){this.setBit(10,val);}},{key:"sendMessages",get:function get(){return this.getBit(11);},set:function set(val){this.setBit(11,val);}},{key:"sendTTSMessages",get:function get(){return this.getBit(12);},set:function set(val){this.setBit(12,val);}},{key:"manageMessages",get:function get(){return this.getBit(13);},set:function set(val){this.setBit(13,val);}},{key:"embedLinks",get:function get(){return this.getBit(14);},set:function set(val){this.setBit(14,val);}},{key:"attachFiles",get:function get(){return this.getBit(15);},set:function set(val){this.setBit(15,val);}},{key:"readMessageHistory",get:function get(){return this.getBit(16);},set:function set(val){this.setBit(16,val);}},{key:"mentionEveryone",get:function get(){return this.getBit(17);},set:function set(val){this.setBit(17,val);}},{key:"voiceConnect",get:function get(){return this.getBit(20);},set:function set(val){this.setBit(20,val);}},{key:"voiceSpeak",get:function get(){return this.getBit(21);},set:function set(val){this.setBit(21,val);}},{key:"voiceMuteMembers",get:function get(){return this.getBit(22);},set:function set(val){this.setBit(22,val);}},{key:"voiceDeafenMembers",get:function get(){return this.getBit(23);},set:function set(val){this.setBit(23,val);}},{key:"voiceMoveMembers",get:function get(){return this.getBit(24);},set:function set(val){this.setBit(24,val);}},{key:"voiceUseVoiceActivation",get:function get(){return this.getBit(25);},set:function set(val){this.setBit(25,val);}}]);return ChannelPermissions;})();module.exports = ChannelPermissions; diff --git a/lib/Client.js b/lib/Client.js deleted file mode 100644 index 9a390c31f..000000000 --- a/lib/Client.js +++ /dev/null @@ -1 +0,0 @@ -"use strict"; \ No newline at end of file diff --git a/lib/Client/Client.js b/lib/Client/Client.js new file mode 100644 index 000000000..c052e203a --- /dev/null +++ b/lib/Client/Client.js @@ -0,0 +1,41 @@ +"use strict"; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var InternalClient = require("./InternalClient.js"); +var EventEmitter = require("events"); + +var Client = (function (_EventEmitter) { + _inherits(Client, _EventEmitter); + + /* + this class is an interface for the internal + client. + */ + + function Client(options) { + _classCallCheck(this, Client); + + _EventEmitter.call(this, options); + this.internal = new InternalClient(this); + } + + Client.prototype.login = function login(email, password) { + var cb = arguments.length <= 2 || arguments[2] === undefined ? function (err, token) {} : arguments[2]; + + var self = this; + return new Promise(function (resolve, reject) { + + self.internal.login(email, password).then(function (token) {})["catch"](function (e) { + cb(e); + reject(e); + }); + }); + }; + + return Client; +})(EventEmitter); + +module.exports = Client; \ No newline at end of file diff --git a/lib/Client/ConnectionState.js b/lib/Client/ConnectionState.js new file mode 100644 index 000000000..86fb95261 --- /dev/null +++ b/lib/Client/ConnectionState.js @@ -0,0 +1,7 @@ +"use strict"; + +exports.IDLE = 0; +exports.LOGGING_IN = 1; +exports.LOGGED_IN = 2; +exports.READY = 3; +exports.DISCONNECTED = 4; \ No newline at end of file diff --git a/lib/Client/InternalClient.js b/lib/Client/InternalClient.js new file mode 100644 index 000000000..0d7795d6a --- /dev/null +++ b/lib/Client/InternalClient.js @@ -0,0 +1,132 @@ +"use strict"; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var EventEmitter = require("events"); +var request = require("superagent"); +var ConnectionState = require("./ConnectionState.js"); +var Constants = require("../Constants.js"), + Endpoints = Constants.Endpoints; + +var zlib; + +var InternalClient = (function () { + function InternalClient(discordClient) { + _classCallCheck(this, InternalClient); + + this.client = discordClient; + this.state = ConnectionState.IDLE; + this.websocket = null; + + if (this.client.options.compress) { + zlib = require("zlib"); + } + } + + InternalClient.prototype.login = function login(email, password) { + var self = this; + var client = self.client; + return new Promise(function (resolve, reject) { + if (self.state === ConnectionState.DISCONNECTED || self.state === ConnectionState.IDLE) { + + self.state = ConnectionState.LOGGING_IN; + + request.post(Endpoints.LOGIN).send({ email: email, password: password }).end(function (err, res) { + + if (err) { + self.state = ConnectionState.DISCONNECTED; + self.websocket = null; + client.emit("disconnected"); + reject(new Error(err.response.text)); + } else { + var token = res.body.token; + self.state = ConnectionState.LOGGED_IN; + self.token = token; + + self.getGateway().then(function (url) { + + self.createWS(url); + resolve(token); + })["catch"](function (e) { + self.state = ConnectionState.DISCONNECTED; + client.emit("disconnected"); + reject(new Error(err.response.text)); + }); + } + }); + } else { + reject(new Error("already logging in/logged in/ready!")); + } + }); + }; + + InternalClient.prototype.getGateway = function getGateway() { + var self = this; + return new Promise(function (resolve, reject) { + + request.get(Endpoints.GATEWAY).set("authorization", self.token).end(function (err, res) { + if (err) reject(err);else resolve(res.body.url); + }); + }); + }; + + InternalClient.prototype.sendWS = function sendWS(object) { + this.websocket.send(JSON.stringify(object)); + }; + + InternalClient.prototype.createWS = function createWS(url) { + var self = this; + + if (this.websocket) return false; + + this.websocket = new WebSocket(url); + + this.websocket.onopen = function () { + + self.sendWS({ + op: 2, + d: { + token: self.token, + v: 3, + compress: self.client.options.compress, + properties: { + "$os": "discord.js", + "$browser": "discord.js", + "$device": "discord.js", + "$referrer": "discord.js", + "$referring_domain": "discord.js" + } + } + }); + }; + + this.websocket.onclose = function () { + self.websocket = null; + self.state = ConnectionState.DISCONNECTED; + self.client.emit("disconnected"); + }; + + this.websocket.onmessage = function (e) { + + if (e.type === "Binary") { + e.data = zlib.inflateSync(e.data).toString(); + } + + var packet, data; + try { + packet = JSON.parse(e.data); + data = packet.d; + } catch (e) { + self.client.emit("error", e); + } + + self.emit("raw", packet); + + switch (packet.t) {} + }; + }; + + return InternalClient; +})(); + +module.exports = InternalClient; \ No newline at end of file diff --git a/lib/Constants.js b/lib/Constants.js new file mode 100644 index 000000000..6f990e7a7 --- /dev/null +++ b/lib/Constants.js @@ -0,0 +1,69 @@ +"use strict"; + +var API = "https://discordapp.com/api"; +var Endpoints = { + + // general endpoints + LOGIN: API + "/auth/login", + LOGOUT: API + "/auth/logout", + ME: API + "/users/@me", + GATEWAY: API + "/gateway", + USER_CHANNELS: function USER_CHANNELS(userID) { + return API + "/users/" + userID + "/channels"; + }, + + // servers + SERVERS: API + "/guilds", + SERVER: function SERVER(serverID) { + return Endpoints.SERVERS + "/" + serverID; + }, + SERVER_ICON: function SERVER_ICON(serverID, hash) { + return Endpoints.SERVER(serverID) + "/icons/" + hash + ".jpg"; + }, + SERVER_PRUNE: function SERVER_PRUNE(serverID) { + return Endpoints.SERVER(serverID) + "/prune"; + }, + SERVER_EMBED: function SERVER_EMBED(serverID) { + return Endpoints.SERVER(serverID) + "/embed"; + }, + SERVER_INVITES: function SERVER_INVITES(serverID) { + return Endpoints.SERVER(serverID) + "/invites"; + }, + SERVER_ROLES: function SERVER_ROLES(serverID) { + return Endpoints.SERVER(serverID) + "/roles"; + }, + SERVER_BANS: function SERVER_BANS(serverID) { + return Endpoints.SERVER(serverID) + "/bans"; + }, + SERVER_INTEGRATIONS: function SERVER_INTEGRATIONS(serverID) { + return Endpoints.SERVER(serverID) + "/integrations"; + }, + SERVER_MEMBERS: function SERVER_MEMBERS(serverID) { + return Endpoints.SERVER(serverID) + "/members"; + }, + SERVER_CHANNELS: function SERVER_CHANNELS(serverID) { + return Endpoints.SERVER(serverID) + "/channels"; + }, + + // channels + CHANNELS: API + "/channels", + CHANNEL: function CHANNEL(channelID) { + return Endpoints.CHANNELS + "/" + channelID; + }, + CHANNEL_MESSAGES: function CHANNEL_MESSAGES(channelID) { + return Endpoints.CHANNEL(channelID) + "/messages"; + }, + CHANNEL_INVITES: function CHANNEL_INVITES(channelID) { + return Endpoints.CHANNEL(channelID) + "/invites"; + }, + CHANNEL_TYPING: function CHANNEL_TYPING(channelID) { + return Endpoints.CHANNEL(channelID) + "/typing"; + }, + CHANNEL_PERMISSIONS: function CHANNEL_PERMISSIONS(channelID) { + return Endpoints.CHANNEL(channelID) + "/permissions"; + } + +}; + +exports.API_ENDPOINT = API; +exports.Endpoints = Endpoints; \ No newline at end of file diff --git a/lib/Embed.js b/lib/Embed.js deleted file mode 100644 index a661b5eae..000000000 --- a/lib/Embed.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Embed = function Embed(data) { - _classCallCheck(this, Embed); -}; - -module.exports = Embed; \ No newline at end of file diff --git a/lib/Embeds/Embed.js b/lib/Embeds/Embed.js deleted file mode 100644 index 35909860b..000000000 --- a/lib/Embeds/Embed.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Embed = function Embed(data) { - _classCallCheck(this, Embed); - - 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/lib/Embeds/IEmbed.js b/lib/Embeds/IEmbed.js deleted file mode 100644 index a4ceae5a4..000000000 --- a/lib/Embeds/IEmbed.js +++ /dev/null @@ -1,19 +0,0 @@ -"use strict"; - -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/lib/Embeds/ImageEmbed.js b/lib/Embeds/ImageEmbed.js deleted file mode 100644 index 118caad9b..000000000 --- a/lib/Embeds/ImageEmbed.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Embed = require("./Embed.js"); - -var ImageEmbed = (function (_Embed) { - _inherits(ImageEmbed, _Embed); - - function ImageEmbed(data) { - _classCallCheck(this, ImageEmbed); - - _Embed.call(this, data); - } - - return ImageEmbed; -})(Embed); - -module.exports = ImageEmbed; \ No newline at end of file diff --git a/lib/Embeds/LinkEmbed.js b/lib/Embeds/LinkEmbed.js deleted file mode 100644 index 566ac721b..000000000 --- a/lib/Embeds/LinkEmbed.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Embed = require("./Embed.js"); - -var LinkEmbed = (function (_Embed) { - _inherits(LinkEmbed, _Embed); - - function LinkEmbed(data) { - _classCallCheck(this, LinkEmbed); - - _Embed.call(this, data); - } - - return LinkEmbed; -})(Embed); - -module.exports = LinkEmbed; \ No newline at end of file diff --git a/lib/Embeds/VideoEmbed.js b/lib/Embeds/VideoEmbed.js deleted file mode 100644 index 23e366e5a..000000000 --- a/lib/Embeds/VideoEmbed.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Embed = require("./Embed.js"); - -var VideoEmbed = (function (_Embed) { - _inherits(VideoEmbed, _Embed); - - function VideoEmbed(data) { - _classCallCheck(this, VideoEmbed); - - _Embed.call(this, data); - this.video = data.video; - //width - //height - //url - } - - return VideoEmbed; -})(Embed); - -module.exports = VideoEmbed; \ No newline at end of file diff --git a/lib/Endpoints.js b/lib/Endpoints.js deleted file mode 100644 index 60cd7925c..000000000 --- a/lib/Endpoints.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";exports.BASE_DOMAIN = "discordapp.com";exports.BASE = "https://" + exports.BASE_DOMAIN;exports.WEBSOCKET_HUB = "wss://" + exports.BASE_DOMAIN + "/hub";exports.API = exports.BASE + "/api";exports.AUTH = exports.API + "/auth";exports.LOGIN = exports.AUTH + "/login";exports.LOGOUT = exports.AUTH + "/logout";exports.USERS = exports.API + "/users";exports.SERVERS = exports.API + "/guilds";exports.CHANNELS = exports.API + "/channels"; diff --git a/lib/EvaluatedPermissions.js b/lib/EvaluatedPermissions.js deleted file mode 100644 index 403cdc0c0..000000000 --- a/lib/EvaluatedPermissions.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict";var _createClass=(function(){function defineProperties(target,props){for(var i=0;i < props.length;i++) {var descriptor=props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if("value" in descriptor)descriptor.writable = true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};})();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var EvaluatedPermissions=(function(){function EvaluatedPermissions(data){_classCallCheck(this,EvaluatedPermissions);var self=this;this.packed = data;if(this.getBit(3))this.packed = 4294967295;}EvaluatedPermissions.prototype.serialise = function serialise(){return {createInstantInvite:this.createInstantInvite,manageRoles:this.manageRoles,manageChannels:this.manageChannels,readMessages:this.readMessages,sendMessages:this.sendMessage,sendTTSMessages:this.sendTTSMessages,manageMessages:this.manageMessages,embedLinks:this.embedLinks,attachFiles:this.attachFiles,readMessageHistory:this.readMessageHistory,mentionEveryone:this.mentionEveryone,voiceConnect:this.voiceConnect,voiceSpeak:this.voiceSpeak,voiceMuteMembers:this.voiceMuteMembers,voiceDeafenMembers:this.voiceDeafenMembers,voiceMoveMember:this.voiceMoveMembers,voiceUseVoiceActivation:this.voiceUseVoiceActivation};};EvaluatedPermissions.prototype.serialize = function serialize(){return this.serialise();};EvaluatedPermissions.prototype.getBit = function getBit(x){if((this.packed >>> 3 & 1) === 1){return true;}return (this.packed >>> x & 1) === 1;};EvaluatedPermissions.prototype.setBit = function setBit(location,value){if(value){ // allow that permission -this.packed |= 1 << location;}else { // not allowed -this.packed &= 1 << location;}};_createClass(EvaluatedPermissions,[{key:"createInstantInvite",get:function get(){return this.getBit(0);},set:function set(val){this.setBit(0,val);}},{key:"manageRoles",get:function get(){return this.getBit(3);},set:function set(val){this.setBit(3,val);}},{key:"manageChannels",get:function get(){return this.getBit(4);},set:function set(val){this.setBit(4,val);}},{key:"readMessages",get:function get(){return this.getBit(10);},set:function set(val){this.setBit(10,val);}},{key:"sendMessages",get:function get(){return this.getBit(11);},set:function set(val){this.setBit(11,val);}},{key:"sendTTSMessages",get:function get(){return this.getBit(12);},set:function set(val){this.setBit(12,val);}},{key:"manageMessages",get:function get(){return this.getBit(13);},set:function set(val){this.setBit(13,val);}},{key:"embedLinks",get:function get(){return this.getBit(14);},set:function set(val){this.setBit(14,val);}},{key:"attachFiles",get:function get(){return this.getBit(15);},set:function set(val){this.setBit(15,val);}},{key:"readMessageHistory",get:function get(){return this.getBit(16);},set:function set(val){this.setBit(16,val);}},{key:"mentionEveryone",get:function get(){return this.getBit(17);},set:function set(val){this.setBit(17,val);}},{key:"voiceConnect",get:function get(){return this.getBit(20);},set:function set(val){this.setBit(20,val);}},{key:"voiceSpeak",get:function get(){return this.getBit(21);},set:function set(val){this.setBit(21,val);}},{key:"voiceMuteMembers",get:function get(){return this.getBit(22);},set:function set(val){this.setBit(22,val);}},{key:"voiceDeafenMembers",get:function get(){return this.getBit(23);},set:function set(val){this.setBit(23,val);}},{key:"voiceMoveMembers",get:function get(){return this.getBit(24);},set:function set(val){this.setBit(24,val);}},{key:"voiceUseVoiceActivation",get:function get(){return this.getBit(25);},set:function set(val){this.setBit(25,val);}}]);return EvaluatedPermissions;})();module.exports = EvaluatedPermissions; diff --git a/lib/Member.js b/lib/Member.js deleted file mode 100644 index 2358dcf75..000000000 --- a/lib/Member.js +++ /dev/null @@ -1,5 +0,0 @@ -"use strict";var _createClass=(function(){function defineProperties(target,props){for(var i=0;i < props.length;i++) {var descriptor=props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if("value" in descriptor)descriptor.writable = true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};})();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var User=require("./user.js");var ServerPermissions=require("./ServerPermissions.js");var EvaluatedPermissions=require("./EvaluatedPermissions.js");var Member=(function(_User){_inherits(Member,_User);function Member(user,server,roles){_classCallCheck(this,Member);_User.call(this,user); // should work, we are basically creating a Member that has the same properties as user and a few more -this.serverID = server.id;this.client = server.client;this.rawRoles = roles;}Member.prototype.removeRole = function removeRole(role){this.rawRoles.splice(this.rawRoles.indexOf(role.id),1);};Member.prototype.addRole = function addRole(role){if(this.rawRoles.indexOf(role.id) == -1){this.rawRoles.push(role.id);}};Member.prototype.hasRole = function hasRole(role){for(var _iterator=this.roles,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[Symbol.iterator]();;) {var _ref;if(_isArray){if(_i >= _iterator.length)break;_ref = _iterator[_i++];}else {_i = _iterator.next();if(_i.done)break;_ref = _i.value;}var _role=_ref;if(role.id === _role.id)return true;}return false;};Member.prototype.permissionsIn = function permissionsIn(channel){if(channel.server.ownerID === this.id){return new EvaluatedPermissions(4294967295); //all perms -}var affectingOverwrites=[];var affectingMemberOverwrites=[];for(var _iterator2=channel.roles,_isArray2=Array.isArray(_iterator2),_i2=0,_iterator2=_isArray2?_iterator2:_iterator2[Symbol.iterator]();;) {var _ref2;if(_isArray2){if(_i2 >= _iterator2.length)break;_ref2 = _iterator2[_i2++];}else {_i2 = _iterator2.next();if(_i2.done)break;_ref2 = _i2.value;}var overwrite=_ref2;if(overwrite.id == this.serverID){ // @everyone for channel -affectingOverwrites.push(overwrite);break;}}for(var _iterator3=channel.roles,_isArray3=Array.isArray(_iterator3),_i3=0,_iterator3=_isArray3?_iterator3:_iterator3[Symbol.iterator]();;) {var _ref3;if(_isArray3){if(_i3 >= _iterator3.length)break;_ref3 = _iterator3[_i3++];}else {_i3 = _iterator3.next();if(_i3.done)break;_ref3 = _i3.value;}var overwrite=_ref3;if(overwrite.id === this.id && overwrite.type === "member"){affectingMemberOverwrites.push(overwrite);}else if(this.rawRoles.indexOf(overwrite.id) !== -1){affectingOverwrites.push(overwrite);}}if(affectingOverwrites.length === 0 && affectingMemberOverwrites.length === 0){return this.evalPerms;}var finalPacked=affectingOverwrites.length !== 0?affectingOverwrites[0].packed:affectingMemberOverwrites[0].packed;for(var _iterator4=affectingOverwrites,_isArray4=Array.isArray(_iterator4),_i4=0,_iterator4=_isArray4?_iterator4:_iterator4[Symbol.iterator]();;) {var _ref4;if(_isArray4){if(_i4 >= _iterator4.length)break;_ref4 = _iterator4[_i4++];}else {_i4 = _iterator4.next();if(_i4.done)break;_ref4 = _i4.value;}var overwrite=_ref4;finalPacked = finalPacked & ~overwrite.deny;finalPacked = finalPacked | overwrite.allow;}for(var _iterator5=affectingMemberOverwrites,_isArray5=Array.isArray(_iterator5),_i5=0,_iterator5=_isArray5?_iterator5:_iterator5[Symbol.iterator]();;) {var _ref5;if(_isArray5){if(_i5 >= _iterator5.length)break;_ref5 = _iterator5[_i5++];}else {_i5 = _iterator5.next();if(_i5.done)break;_ref5 = _i5.value;}var overwrite=_ref5;finalPacked = finalPacked & ~overwrite.deny;finalPacked = finalPacked | overwrite.allow;}return new EvaluatedPermissions(finalPacked);};_createClass(Member,[{key:"server",get:function get(){return this.client.getServer("id",this.serverID);}},{key:"roles",get:function get(){var ufRoles=[this.server.getRole("id",this.server.id)];for(var _iterator6=this.rawRoles,_isArray6=Array.isArray(_iterator6),_i6=0,_iterator6=_isArray6?_iterator6:_iterator6[Symbol.iterator]();;) {var _ref6;if(_isArray6){if(_i6 >= _iterator6.length)break;_ref6 = _iterator6[_i6++];}else {_i6 = _iterator6.next();if(_i6.done)break;_ref6 = _i6.value;}var rawRole=_ref6;ufRoles.push(this.server.getRole("id",rawRole));}return ufRoles;}},{key:"evalPerms",get:function get(){var basePerms=this.roles, //cache roles as it can be slightly expensive -basePerm=basePerms[0].packed;basePerms = basePerms || [];for(var _iterator7=basePerms,_isArray7=Array.isArray(_iterator7),_i7=0,_iterator7=_isArray7?_iterator7:_iterator7[Symbol.iterator]();;) {var _ref7;if(_isArray7){if(_i7 >= _iterator7.length)break;_ref7 = _iterator7[_i7++];}else {_i7 = _iterator7.next();if(_i7.done)break;_ref7 = _i7.value;}var perm=_ref7;basePerm = basePerm | perm.packed;}return new EvaluatedPermissions(basePerm);}}]);return Member;})(User);module.exports = Member; diff --git a/lib/PMChannel.js b/lib/PMChannel.js deleted file mode 100644 index 8d90dade1..000000000 --- a/lib/PMChannel.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";var _createClass=(function(){function defineProperties(target,props){for(var i=0;i < props.length;i++) {var descriptor=props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if("value" in descriptor)descriptor.writable = true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};})();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var PMChannel=(function(){function PMChannel(data,client){_classCallCheck(this,PMChannel);this.user = client.getUser("id",data.recipient.id);this.id = data.id;this.messages = [];this.client = client;}PMChannel.prototype.addMessage = function addMessage(data){if(!this.getMessage("id",data.id)){this.messages.push(data);}return this.getMessage("id",data.id);};PMChannel.prototype.getMessage = function getMessage(key,value){if(this.messages.length > 1000){this.messages.splice(0,1);}for(var _iterator=this.messages,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[Symbol.iterator]();;) {var _ref;if(_isArray){if(_i >= _iterator.length)break;_ref = _iterator[_i++];}else {_i = _iterator.next();if(_i.done)break;_ref = _i.value;}var message=_ref;if(message[key] === value){return message;}}return null;};_createClass(PMChannel,[{key:"isPrivate",get:function get(){return true;}}]);return PMChannel;})();module.exports = PMChannel; diff --git a/lib/ServerPermissions.js b/lib/ServerPermissions.js deleted file mode 100644 index 0c6ffb729..000000000 --- a/lib/ServerPermissions.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict";var _createClass=(function(){function defineProperties(target,props){for(var i=0;i < props.length;i++) {var descriptor=props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if("value" in descriptor)descriptor.writable = true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};})();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var ServerPermissions=(function(){function ServerPermissions(data,server){_classCallCheck(this,ServerPermissions);var self=this;function getBit(x){return (self.packed >>> x & 1) === 1;}this.managed = data.managed || false;this.position = data.position || 1;this.hoist = data.hoist || false;this.color = data.color || 0;this.packed = data.permissions || (data.name === "@everyone"?36953089:0);this.name = data.name || "new role";this.id = data.id || null;this.server = server;}ServerPermissions.prototype.serialise = function serialise(){return {createInstantInvite:this.createInstantInvite,manageRoles:this.manageRoles,manageChannels:this.manageChannels,readMessages:this.readMessages,sendMessages:this.sendMessages,sendTTSMessages:this.sendTTSMessages,manageMessages:this.manageMessages,embedLinks:this.embedLinks,attachFiles:this.attachFiles,readMessageHistory:this.readMessageHistory,mentionEveryone:this.mentionEveryone,voiceConnect:this.voiceConnect,voiceSpeak:this.voiceSpeak,voiceMuteMembers:this.voiceMuteMembers,voiceDeafenMembers:this.voiceDeafenMembers,voiceMoveMembers:this.voiceMoveMembers,voiceUseVoiceActivation:this.voiceUseVoiceActivation};};ServerPermissions.prototype.serialize = function serialize(){return this.serialise();};ServerPermissions.prototype.getBit = function getBit(x){if((this.packed >>> 3 & 1) === 1){return true;}return (this.packed >>> x & 1) === 1;};ServerPermissions.prototype.setBit = function setBit(location,value){if(value){ // allow that permission -this.packed |= 1 << location;}else { // not allowed -this.packed &= ~(1 << location);}};ServerPermissions.prototype.toString = function toString(){return this.name;};_createClass(ServerPermissions,[{key:"createInstantInvite",get:function get(){return this.getBit(0);},set:function set(val){this.setBit(0,val);}},{key:"banMembers",get:function get(){return this.getBit(1);},set:function set(val){this.setBit(1,val);}},{key:"kickMembers",get:function get(){return this.getBit(2);},set:function set(val){this.setBit(2,val);}},{key:"manageRoles",get:function get(){return this.getBit(3);},set:function set(val){this.setBit(3,val);}},{key:"manageChannels",get:function get(){return this.getBit(4);},set:function set(val){this.setBit(4,val);}},{key:"manageServer",get:function get(){return this.getBit(5);},set:function set(val){this.setBit(5,val);}},{key:"readMessages",get:function get(){return this.getBit(10);},set:function set(val){this.setBit(10,val);}},{key:"sendMessages",get:function get(){return this.getBit(11);},set:function set(val){this.setBit(11,val);}},{key:"sendTTSMessages",get:function get(){return this.getBit(12);},set:function set(val){this.setBit(12,val);}},{key:"manageMessages",get:function get(){return this.getBit(13);},set:function set(val){this.setBit(13,val);}},{key:"embedLinks",get:function get(){return this.getBit(14);},set:function set(val){this.setBit(14,val);}},{key:"attachFiles",get:function get(){return this.getBit(15);},set:function set(val){this.setBit(15,val);}},{key:"readMessageHistory",get:function get(){return this.getBit(16);},set:function set(val){this.setBit(16,val);}},{key:"mentionEveryone",get:function get(){return this.getBit(17);},set:function set(val){this.setBit(17,val);}},{key:"voiceConnect",get:function get(){return this.getBit(20);},set:function set(val){this.setBit(20,val);}},{key:"voiceSpeak",get:function get(){return this.getBit(21);},set:function set(val){this.setBit(21,val);}},{key:"voiceMuteMembers",get:function get(){return this.getBit(22);},set:function set(val){this.setBit(22,val);}},{key:"voiceDeafenMembers",get:function get(){return this.getBit(23);},set:function set(val){this.setBit(23,val);}},{key:"voiceMoveMembers",get:function get(){return this.getBit(24);},set:function set(val){this.setBit(24,val);}},{key:"voiceUseVoiceActivation",get:function get(){return this.getBit(25);},set:function set(val){this.setBit(25,val);}}]);return ServerPermissions;})();module.exports = ServerPermissions; diff --git a/lib/VoiceChannel.js b/lib/VoiceChannel.js deleted file mode 100644 index 4ace7d567..000000000 --- a/lib/VoiceChannel.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _inherits(subClass,superClass){if(typeof superClass !== "function" && superClass !== null){throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);}subClass.prototype = Object.create(superClass && superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__ = superClass;}var Channel=require("./channel.js");var VoiceChannel=(function(_Channel){_inherits(VoiceChannel,_Channel);function VoiceChannel(data,server){_classCallCheck(this,VoiceChannel);_Channel.call(this,data,server);}return VoiceChannel;})(Channel); diff --git a/lib/channel.js b/lib/channel.js deleted file mode 100644 index 81cd4189f..000000000 --- a/lib/channel.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";var _createClass=(function(){function defineProperties(target,props){for(var i=0;i < props.length;i++) {var descriptor=props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if("value" in descriptor)descriptor.writable = true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};})();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var ChannelPermissions=require("./ChannelPermissions.js");var Channel=(function(){function Channel(data,server){_classCallCheck(this,Channel);this.serverID = server.id;this.client = server.client;this.name = data.name;this.type = data.type;this.topic = data.topic;this.id = data.id;this.messages = [];this.roles = [];if(data.permission_overwrites)for(var _iterator=data.permission_overwrites,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[Symbol.iterator]();;) {var _ref;if(_isArray){if(_i >= _iterator.length)break;_ref = _iterator[_i++];}else {_i = _iterator.next();if(_i.done)break;_ref = _i.value;}var role=_ref;this.roles.push(new ChannelPermissions(role,this));} //this.isPrivate = isPrivate; //not sure about the implementation of this... -}Channel.prototype.permissionsOf = function permissionsOf(member){var mem=this.server.getMember("id",member.id);if(mem){return mem.permissionsIn(this);}else {return null;}};Channel.prototype.equals = function equals(object){return object && object.id === this.id;};Channel.prototype.addMessage = function addMessage(data){if(this.messages.length > 1000){this.messages.splice(0,1);}if(!this.getMessage("id",data.id)){this.messages.push(data);}return this.getMessage("id",data.id);};Channel.prototype.getMessage = function getMessage(key,value){for(var _iterator2=this.messages,_isArray2=Array.isArray(_iterator2),_i2=0,_iterator2=_isArray2?_iterator2:_iterator2[Symbol.iterator]();;) {var _ref2;if(_isArray2){if(_i2 >= _iterator2.length)break;_ref2 = _iterator2[_i2++];}else {_i2 = _iterator2.next();if(_i2.done)break;_ref2 = _i2.value;}var message=_ref2;if(message[key] === value){return message;}}return null;};Channel.prototype.toString = function toString(){return "<#" + this.id + ">";};_createClass(Channel,[{key:"server",get:function get(){return this.client.getServer("id",this.serverID);}},{key:"permissionOverwrites",get:function get(){return this.roles;}},{key:"permissions",get:function get(){return this.roles;}},{key:"isPrivate",get:function get(){return false;}},{key:"users",get:function get(){return this.server.members;}},{key:"members",get:function get(){return this.server.members;}}]);return Channel;})();module.exports = Channel; diff --git a/lib/index.js b/lib/index.js index 793b2546f..1f9a98cc4 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1 +1,10 @@ -"use strict";var request=require("superagent");var Endpoints=require("./Endpoints.js");var Client=require("./Client.js");var Color=require("../ref/colours.js");var Discord={Endpoints:Endpoints,Client:Client,Color:Color,User:require("./user.js"),Server:require("./server.js"),Channel:require("./channel.js"),Message:require("./message.js"),Invite:require("./invite.js"),PMChannel:require("./PMChannel.js"),ServerPermissions:require("./ServerPermissions.js"),ChannelPermissions:require("./ChannelPermissions.js"),EvaluatedPermissiosn:require("./EvaluatedPermissions.js"),VoiceChannel:require("./VoiceChannel.js"),gameMap:require("../ref/gameMap.json"),Embed:require("./Embeds/Embed.js"),LinkEmbed:require("./Embeds/LinkEmbed.js"),VideoEmbed:require("./Embeds/VideoEmbed.js"),ImageEmbed:require("./Embeds/ImageEmbed.js")};Discord.patchStrings = function(){defineProperty("bold","**");defineProperty("underline","__");defineProperty("strike","~~");defineProperty("code","`");defineProperty("codeblock","```");defineProperty("newline","\n");Object.defineProperty(String.prototype,"italic",{get:function get(){return "*" + this + "*";}});function defineProperty(name,joiner){Object.defineProperty(String.prototype,name,{get:function get(){return joiner + this + joiner;}});}};module.exports = Discord; +"use strict"; + +module.exports = { + Client: require("./Client/Client.js") +}; + +var a = new module.exports.Client(); +a.login("email", "password")["catch"](function (e) { + return console.log(e); +}); \ No newline at end of file diff --git a/lib/internal.js b/lib/internal.js deleted file mode 100644 index 9b165ac44..000000000 --- a/lib/internal.js +++ /dev/null @@ -1,4 +0,0 @@ -/* - this file is deprecated and should only be used as - reference. -*/"use strict";var request=require("superagent");var Endpoints=require("./endpoints.js");var Internal={};Internal.XHR = {};Internal.WebSocket = {};Internal.WebSocket.properties = {"$os":"discord.js","$browser":"discord.js","$device":"discord.js","$referrer":"","$referring_domain":""};Internal.XHR.login = function(email,password,callback){request.post(Endpoints.LOGIN).send({email:email,password:password}).end(function(err,res){if(err){callback(err);}else {callback(null,res.body.token);}});};Internal.XHR.logout = function(token,callback){request.post(Endpoints.LOGOUT).end(function(err,res){err?callback(err):callback(null);});};Internal.XHR.createServer = function(token,name,region,callback){request.post(Endpoints.SERVERS).set("authorization",token).send({name:name,region:region}).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.leaveServer = function(token,serverId,callback){request.del(Endpoints.SERVERS + "/" + serverId).set("authorization",token).end(function(err,res){err?callback(err):callback(null);});};Internal.XHR.createInvite = function(token,channelId,options,callback){request.post(Endpoints.CHANNELS + "/" + channelId + "/invites").set("authorization",token).send(options).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.startPM = function(token,selfID,userID,callback){request.post(Endpoints.USERS + "/" + selfID + "/channels").set("authorization",token).send({recipient_id:userID}).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.sendMessage = function(token,channelID,messageParameters,callback){request.post(Endpoints.CHANNELS + "/" + channelID + "/messages").set("authorization",token).send(messageParameters).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.sendFile = function(token,channelID,file,fileName,callback){request.post(Endpoints.CHANNELS + "/" + channelID + "/messages").set("authorization",token).attach("file",file,fileName).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.deleteMessage = function(token,channelID,messageID,callback){request.del(Endpoints.CHANNELS + "/" + channelID + "/messages/" + messageID).set("authorization",token).end(function(err){err?callback(err):callback(null);});};Internal.XHR.updateMessage = function(token,channelID,messageID,messageParameters,callback){request.patch(Endpoints.CHANNELS + "/" + channelID + "/messages/" + messageID).set("authorization",token).send(messageParameters).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.getChannelLogs = function(token,channelID,amount,callback){request.get(Endpoints.CHANNELS + "/" + channelID + "/messages?limit=" + amount).set("authorization",token).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.createChannel = function(token,serverID,name,type,callback){request.post(Endpoints.SERVERS + "/" + serverID + "/channels").set("authorization",token).send({name:name,type:type}).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.deleteChannel = function(token,channelID,callback){request.del(Endpoints.CHANNELS + "/" + channelID).set("authorization",token).end(function(err){err?callback(err):callback(null);});};Internal.XHR.deleteServer = function(token,serverID,callback){request.del(Endpoints.SERVERS + "/" + serverID).set("authorization",token).end(function(err){err?callback(err):callback(null);});};Internal.XHR.getChannels = function(token,serverID,callback){request.get(Endpoints.SERVERS + "/" + serverID + "/channels").set("authorization",token).end(function(err){err?callback(err):callback(null);});};Internal.XHR.getServer = function(token,serverID,callback){request.get(Endpoints.SERVERS + "/" + serverID).set("authorization",token).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.acceptInvite = function(token,inviteID,callback){request.post(Endpoints.API + "/invite/" + inviteID).set("authorization",token).end(function(err,res){if(err){callback(err);}else {callback(null,res.body);}});};Internal.XHR.setUsername = function(token,avatar,email,newPassword,password,username,callback){request.patch(Endpoints.API + "/users/@me").set("authorization",token).send({avatar:avatar,email:email,new_password:newPassword,password:password,username:username}).end(function(err){callback(err);});};exports.Internal = Internal; diff --git a/lib/invite.js b/lib/invite.js deleted file mode 100644 index 5ff2ddf15..000000000 --- a/lib/invite.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";var _createClass=(function(){function defineProperties(target,props){for(var i=0;i < props.length;i++) {var descriptor=props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if("value" in descriptor)descriptor.writable = true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};})();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var Invite=(function(){function Invite(data,client){_classCallCheck(this,Invite);this.max_age = data.max_age;this.code = data.code;this.server = client.getServer("id",data.guild.id);this.revoked = data.revoked;this.created_at = Date.parse(data.created_at);this.temporary = data.temporary;this.uses = data.uses;this.max_uses = data.uses;this.inviter = client.addUser(data.inviter);this.xkcd = data.xkcdpass;this.channel = client.getChannel("id",data.channel.id);}_createClass(Invite,[{key:"URL",get:function get(){var code=this.xkcd?this.xkcdpass:this.code;return "https://discord.gg/" + code;}}]);return Invite;})();module.exports = Invite; diff --git a/lib/message.js b/lib/message.js deleted file mode 100644 index be1a137fb..000000000 --- a/lib/message.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict";var _createClass=(function(){function defineProperties(target,props){for(var i=0;i < props.length;i++) {var descriptor=props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if("value" in descriptor)descriptor.writable = true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};})();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var PMChannel=require("./PMChannel.js");var Embeddable=require("./Embeds/IEmbed.js");var Message=(function(){function Message(data,channel,mentions,author){_classCallCheck(this,Message);this.tts = data.tts;this.timestamp = Date.parse(data.timestamp);this.nonce = data.nonce;this.mentions = mentions;this.everyoneMentioned = data.mention_everyone;this.id = data.id;this.embeds = [];if(data.embeds){for(var _iterator=data.embeds,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[Symbol.iterator]();;) {var _ref;if(_isArray){if(_i >= _iterator.length)break;_ref = _iterator[_i++];}else {_i = _iterator.next();if(_i.done)break;_ref = _i.value;}var embed=_ref;this.embeds.push(Embeddable.createEmbed(embed));}}this.editedTimestamp = data.edited_timestamp;this.content = data.content.trim();this.channel = channel;if(this.isPrivate){this.author = this.channel.client.getUser("id",author.id);}else {this.author = this.channel.server?this.channel.server.getMember("id",author.id):this.channel.client.getUser("id",author.id);}this.attachments = data.attachments;} /*exports.Message.prototype.isPM = function() { - return ( this.channel instanceof PMChannel ); -}*/Message.prototype.isMentioned = function isMentioned(user){var id=user.id?user.id:user;for(var _iterator2=this.mentions,_isArray2=Array.isArray(_iterator2),_i2=0,_iterator2=_isArray2?_iterator2:_iterator2[Symbol.iterator]();;) {var _ref2;if(_isArray2){if(_i2 >= _iterator2.length)break;_ref2 = _iterator2[_i2++];}else {_i2 = _iterator2.next();if(_i2.done)break;_ref2 = _i2.value;}var mention=_ref2;if(mention.id === id){return true;}}return false;};_createClass(Message,[{key:"sender",get:function get(){return this.author;}},{key:"isPrivate",get:function get(){return this.channel.isPrivate;}}]);return Message;})();module.exports = Message; diff --git a/lib/server.js b/lib/server.js deleted file mode 100644 index 8f27a32d5..000000000 --- a/lib/server.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var _createClass=(function(){function defineProperties(target,props){for(var i=0;i < props.length;i++) {var descriptor=props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if("value" in descriptor)descriptor.writable = true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};})();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var ServerPermissions=require("./ServerPermissions.js");var Member=require("./Member.js");var Server=(function(){function Server(data,client){_classCallCheck(this,Server);this.client = client;this.region = data.region;this.ownerID = data.owner_id;this.name = data.name;this.id = data.id;this.members = [];this.channels = [];this.icon = data.icon;this.afkTimeout = data.afk_timeout;this.afkChannelId = data.afk_channel_id;this.roles = [];for(var _iterator=data.roles,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[Symbol.iterator]();;) {var _ref;if(_isArray){if(_i >= _iterator.length)break;_ref = _iterator[_i++];}else {_i = _iterator.next();if(_i.done)break;_ref = _i.value;}var permissionGroup=_ref;this.roles.push(new ServerPermissions(permissionGroup,this));}if(!data.members){data.members = [client.user];return;}for(var _iterator2=data.members,_isArray2=Array.isArray(_iterator2),_i2=0,_iterator2=_isArray2?_iterator2:_iterator2[Symbol.iterator]();;) {var _ref2;if(_isArray2){if(_i2 >= _iterator2.length)break;_ref2 = _iterator2[_i2++];}else {_i2 = _iterator2.next();if(_i2.done)break;_ref2 = _i2.value;}var member=_ref2; // first we cache the user in our Discord Client, -// then we add it to our list. This way when we -// get a user from this server's member list, -// it will be identical (unless an async change occurred) -// to the client's cache. -if(member.user)this.addMember(client.addUser(member.user),member.roles);}} // get/set -Server.prototype.getRole = function getRole(key,value){for(var _iterator3=this.roles,_isArray3=Array.isArray(_iterator3),_i3=0,_iterator3=_isArray3?_iterator3:_iterator3[Symbol.iterator]();;) {var _ref3;if(_isArray3){if(_i3 >= _iterator3.length)break;_ref3 = _iterator3[_i3++];}else {_i3 = _iterator3.next();if(_i3.done)break;_ref3 = _i3.value;}var role=_ref3;if(role[key] === value){return role;}}return null;};Server.prototype.addRole = function addRole(data){if(this.getRole("id",data.id)){return this.getRole("id",data.id);}var perms=new ServerPermissions(data,this);this.roles.push(perms);return perms;};Server.prototype.updateRole = function updateRole(data){var oldRole=this.getRole("id",data.id);if(oldRole){var index=this.roles.indexOf(oldRole);this.roles[index] = new ServerPermissions(data,this);return this.roles[index];}else {return false;}};Server.prototype.removeRole = function removeRole(id){for(var roleId in this.roles) {if(this.roles[roleId].id === id){this.roles.splice(roleId,1);}}for(var _iterator4=this.members,_isArray4=Array.isArray(_iterator4),_i4=0,_iterator4=_isArray4?_iterator4:_iterator4[Symbol.iterator]();;) {var _ref4;if(_isArray4){if(_i4 >= _iterator4.length)break;_ref4 = _iterator4[_i4++];}else {_i4 = _iterator4.next();if(_i4.done)break;_ref4 = _i4.value;}var member=_ref4;for(var roleId in member.rawRoles) {if(member.rawRoles[roleId] === id){member.rawRoles.splice(roleId,1);}}}};Server.prototype.getChannel = function getChannel(key,value){for(var _iterator5=this.channels,_isArray5=Array.isArray(_iterator5),_i5=0,_iterator5=_isArray5?_iterator5:_iterator5[Symbol.iterator]();;) {var _ref5;if(_isArray5){if(_i5 >= _iterator5.length)break;_ref5 = _iterator5[_i5++];}else {_i5 = _iterator5.next();if(_i5.done)break;_ref5 = _i5.value;}var channel=_ref5;if(channel[key] === value){return channel;}}return null;};Server.prototype.getMember = function getMember(key,value){for(var _iterator6=this.members,_isArray6=Array.isArray(_iterator6),_i6=0,_iterator6=_isArray6?_iterator6:_iterator6[Symbol.iterator]();;) {var _ref6;if(_isArray6){if(_i6 >= _iterator6.length)break;_ref6 = _iterator6[_i6++];}else {_i6 = _iterator6.next();if(_i6.done)break;_ref6 = _i6.value;}var member=_ref6;if(member[key] === value){return member;}}return null;};Server.prototype.removeMember = function removeMember(key,value){for(var _iterator7=this.members,_isArray7=Array.isArray(_iterator7),_i7=0,_iterator7=_isArray7?_iterator7:_iterator7[Symbol.iterator]();;) {var _ref7;if(_isArray7){if(_i7 >= _iterator7.length)break;_ref7 = _iterator7[_i7++];}else {_i7 = _iterator7.next();if(_i7.done)break;_ref7 = _i7.value;}var member=_ref7;if(member[key] === value){this.members.splice(key,1);return member;}}return false;};Server.prototype.addChannel = function addChannel(chann){if(!this.getChannel("id",chann.id)){this.channels.push(chann);}return chann;};Server.prototype.addMember = function addMember(user,roles){if(!this.getMember("id",user.id)){var mem=new Member(user,this,roles);this.members.push(mem);}return mem;};Server.prototype.toString = function toString(){return this.name;};Server.prototype.equals = function equals(object){return object.id === this.id;};_createClass(Server,[{key:"permissionGroups",get:function get(){return this.roles;}},{key:"permissions",get:function get(){return this.roles;}},{key:"iconURL",get:function get(){if(!this.icon)return null;return "https://discordapp.com/api/guilds/" + this.id + "/icons/" + this.icon + ".jpg";}},{key:"afkChannel",get:function get(){if(!this.afkChannelId)return false;return this.getChannel("id",this.afkChannelId);}},{key:"defaultChannel",get:function get(){return this.getChannel("name","general");}},{key:"owner",get:function get(){return this.client.getUser("id",this.ownerID);}},{key:"users",get:function get(){return this.members;}}]);return Server;})();module.exports = Server; diff --git a/lib/user.js b/lib/user.js deleted file mode 100644 index 6e3b12edc..000000000 --- a/lib/user.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var _createClass=(function(){function defineProperties(target,props){for(var i=0;i < props.length;i++) {var descriptor=props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if("value" in descriptor)descriptor.writable = true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};})();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var User=(function(){function User(data){_classCallCheck(this,User);this.username = data.username;this.discriminator = data.discriminator;this.id = data.id;this.avatar = data.avatar;this.status = data.status || "offline";this.gameId = data.game_id || null;} // access using user.avatarURL; -User.prototype.mention = function mention(){return "<@" + this.id + ">";};User.prototype.toString = function toString(){ /* - if we embed a user in a String - like so: - "Yo " + user + " what's up?" - It would generate something along the lines of: - "Yo @hydrabolt what's up?" - */return this.mention();};User.prototype.equals = function equals(object){return object.id === this.id;};User.prototype.equalsStrict = function equalsStrict(object){return object.id === this.id && object.avatar === this.avatar && object.username === this.username && object.discriminator === this.discriminator;};_createClass(User,[{key:"avatarURL",get:function get(){if(!this.avatar)return null;return "https://discordapp.com/api/users/" + this.id + "/avatars/" + this.avatar + ".jpg";}}]);return User;})();module.exports = User; diff --git a/src/Client.js b/src/Client.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/Client/Client.js b/src/Client/Client.js new file mode 100644 index 000000000..ae3580d7a --- /dev/null +++ b/src/Client/Client.js @@ -0,0 +1,34 @@ +"use strict"; + +var InternalClient = require("./InternalClient.js"); +var EventEmitter = require("events"); + +class Client extends EventEmitter{ + /* + this class is an interface for the internal + client. + */ + constructor(options){ + super(options); + this.internal = new InternalClient(this); + } + + login(email, password, cb=function(err, token){}){ + var self = this; + return new Promise(function(resolve, reject){ + + self.internal.login(email, password) + .then((token)=>{ + + }) + .catch((e)=>{ + cb(e); + reject(e); + }); + + }); + } + +} + +module.exports = Client; \ No newline at end of file diff --git a/src/Client/ConnectionState.js b/src/Client/ConnectionState.js new file mode 100644 index 000000000..c27246c09 --- /dev/null +++ b/src/Client/ConnectionState.js @@ -0,0 +1,5 @@ +exports.IDLE = 0; +exports.LOGGING_IN = 1; +exports.LOGGED_IN = 2; +exports.READY = 3; +exports.DISCONNECTED = 4; \ No newline at end of file diff --git a/src/Client/InternalClient.js b/src/Client/InternalClient.js new file mode 100644 index 000000000..ab24211e0 --- /dev/null +++ b/src/Client/InternalClient.js @@ -0,0 +1,144 @@ +"use strict"; + +var EventEmitter = require("events"); +var request = require("superagent"); +var ConnectionState = require("./ConnectionState.js"); +var Constants = require("../Constants.js"), + Endpoints = Constants.Endpoints; + +var zlib; + +class InternalClient { + constructor(discordClient) { + this.client = discordClient; + this.state = ConnectionState.IDLE; + this.websocket = null; + + if (this.client.options.compress) { + zlib = require("zlib"); + } + } + + login(email, password) { + var self = this; + var client = self.client; + return new Promise((resolve, reject) => { + if (self.state === ConnectionState.DISCONNECTED || self.state === ConnectionState.IDLE) { + + self.state = ConnectionState.LOGGING_IN; + + request + .post(Endpoints.LOGIN) + .send({ email, password }) + .end(function (err, res) { + + if (err) { + self.state = ConnectionState.DISCONNECTED; + self.websocket = null; + client.emit("disconnected"); + reject(new Error(err.response.text)); + } else { + var token = res.body.token; + self.state = ConnectionState.LOGGED_IN; + self.token = token; + + self.getGateway().then((url) => { + + self.createWS(url); + resolve(token); + + }).catch((e) => { + self.state = ConnectionState.DISCONNECTED; + client.emit("disconnected"); + reject(new Error(err.response.text)); + }); + } + + }); + + } else { + reject(new Error("already logging in/logged in/ready!")); + } + }); + } + + getGateway() { + var self = this; + return new Promise((resolve, reject) => { + + request + .get(Endpoints.GATEWAY) + .set("authorization", self.token) + .end(function (err, res) { + if (err) + reject(err); + else + resolve(res.body.url); + }); + + }); + } + + sendWS(object) { + this.websocket.send(JSON.stringify(object)); + } + + createWS(url) { + var self = this; + + if (this.websocket) + return false; + + this.websocket = new WebSocket(url); + + this.websocket.onopen = () => { + + self.sendWS({ + op: 2, + d: { + token: self.token, + v: 3, + compress: self.client.options.compress, + properties: { + "$os": "discord.js", + "$browser": "discord.js", + "$device": "discord.js", + "$referrer": "discord.js", + "$referring_domain": "discord.js" + } + } + }); + } + + this.websocket.onclose = () => { + self.websocket = null; + self.state = ConnectionState.DISCONNECTED; + self.client.emit("disconnected"); + } + + this.websocket.onmessage = (e) => { + + if (e.type === "Binary") { + e.data = zlib.inflateSync(e.data).toString(); + } + + var packet, data; + try { + packet = JSON.parse(e.data); + data = packet.d; + } catch (e) { + self.client.emit("error", e); + } + + self.emit("raw", packet); + + switch(packet.t){ + + } + + } + + } +} + +module.exports = InternalClient; \ No newline at end of file diff --git a/src/Constants.js b/src/Constants.js new file mode 100644 index 000000000..676c3ea25 --- /dev/null +++ b/src/Constants.js @@ -0,0 +1,35 @@ +var API = "https://discordapp.com/api"; +var Endpoints = { + + // general endpoints + LOGIN: `${API}/auth/login`, + LOGOUT: `${API}/auth/logout`, + ME: `${API}/users/@me`, + GATEWAY: `${API}/gateway`, + USER_CHANNELS: (userID) => `${API}/users/${userID}/channels`, + + // servers + SERVERS: `${API}/guilds`, + SERVER: (serverID) => `${Endpoints.SERVERS}/${serverID}`, + SERVER_ICON: (serverID, hash) => `${Endpoints.SERVER(serverID) }/icons/${hash}.jpg`, + SERVER_PRUNE: (serverID) => `${Endpoints.SERVER(serverID) }/prune`, + SERVER_EMBED: (serverID) => `${Endpoints.SERVER(serverID) }/embed`, + SERVER_INVITES: (serverID) => `${Endpoints.SERVER(serverID) }/invites`, + SERVER_ROLES: (serverID) => `${Endpoints.SERVER(serverID) }/roles`, + SERVER_BANS: (serverID) => `${Endpoints.SERVER(serverID) }/bans`, + SERVER_INTEGRATIONS: (serverID) => `${Endpoints.SERVER(serverID) }/integrations`, + SERVER_MEMBERS: (serverID) => `${Endpoints.SERVER(serverID) }/members`, + SERVER_CHANNELS: (serverID) => `${Endpoints.SERVER(serverID) }/channels`, + + // channels + CHANNELS: `${API}/channels`, + CHANNEL: (channelID) => `${Endpoints.CHANNELS}/${channelID}`, + CHANNEL_MESSAGES: (channelID) => `${Endpoints.CHANNEL(channelID) }/messages`, + CHANNEL_INVITES: (channelID) => `${Endpoints.CHANNEL(channelID) }/invites`, + CHANNEL_TYPING: (channelID) => `${Endpoints.CHANNEL(channelID) }/typing`, + CHANNEL_PERMISSIONS: (channelID) => `${Endpoints.CHANNEL(channelID) }/permissions`, + +} + +exports.API_ENDPOINT = API; +exports.Endpoints = Endpoints; \ No newline at end of file diff --git a/src/index.js b/src/index.js new file mode 100644 index 000000000..fc8d34170 --- /dev/null +++ b/src/index.js @@ -0,0 +1,6 @@ +module.exports = { + Client : require("./Client/Client.js") +} + +var a = new module.exports.Client(); +a.login("email", "password").catch((e)=>console.log(e)); \ No newline at end of file