From c9dbf1f7f032baa354c27f3268d731aa3589f267 Mon Sep 17 00:00:00 2001 From: Hackzzila Date: Thu, 27 Oct 2016 15:50:04 -0500 Subject: [PATCH] OAuth info stuff (#849) * OAuth info stuff * fix docs * oops --- src/client/Client.js | 9 ++++ src/client/rest/RESTMethods.js | 9 ++++ src/index.js | 2 + src/structures/ClientOAuth2App.js | 25 ++++++++++ src/structures/OAuth2App.js | 81 +++++++++++++++++++++++++++++++ src/util/Constants.js | 4 ++ 6 files changed, 130 insertions(+) create mode 100644 src/structures/ClientOAuth2App.js create mode 100644 src/structures/OAuth2App.js diff --git a/src/client/Client.js b/src/client/Client.js index 39a222154..98a9fa9f6 100644 --- a/src/client/Client.js +++ b/src/client/Client.js @@ -324,6 +324,15 @@ class Client extends EventEmitter { return messages; } + /** + * Get's the bot's OAuth2 app. Only usable by bot accounts + * @returns {Promise} + */ + getMyApp() { + if (!this.user.bot) throw new Error(Constants.Errors.NO_BOT_ACCOUNT); + return this.rest.methods.getMyApp(); + } + setTimeout(fn, ...params) { const timeout = setTimeout(() => { fn(); diff --git a/src/client/rest/RESTMethods.js b/src/client/rest/RESTMethods.js index 6395ec1a0..c4903fd53 100644 --- a/src/client/rest/RESTMethods.js +++ b/src/client/rest/RESTMethods.js @@ -10,6 +10,7 @@ const Role = requireStructure('Role'); const Invite = requireStructure('Invite'); const Webhook = requireStructure('Webhook'); const UserProfile = requireStructure('UserProfile'); +const ClientOAuth2App = requireStructure('ClientOAuth2App'); class RESTMethods { constructor(restManager) { @@ -762,6 +763,14 @@ class RESTMethods { .then(resolve, reject); }); } + + getMyApp() { + return new Promise((resolve, reject) => { + this.rest.makeRequest('get', Constants.Endpoints.myApp, true) + .then(app => resolve(new ClientOAuth2App(this.rest.client, app))) + .catch(reject); + }); + } } module.exports = RESTMethods; diff --git a/src/index.js b/src/index.js index 2b8a19e6f..0c845cd4b 100644 --- a/src/index.js +++ b/src/index.js @@ -11,6 +11,7 @@ module.exports = { fetchRecommendedShards: require('./util/FetchRecommendedShards'), Channel: require('./structures/Channel'), + ClientOAuth2App: require('./structures/ClientOAuth2App'), ClientUser: require('./structures/ClientUser'), DMChannel: require('./structures/DMChannel'), Emoji: require('./structures/Emoji'), @@ -25,6 +26,7 @@ module.exports = { MessageAttachment: require('./structures/MessageAttachment'), MessageCollector: require('./structures/MessageCollector'), MessageEmbed: require('./structures/MessageEmbed'), + OAuth2App: require('./structures/OAuth2App'), PartialGuild: require('./structures/PartialGuild'), PartialGuildChannel: require('./structures/PartialGuildChannel'), PermissionOverwrites: require('./structures/PermissionOverwrites'), diff --git a/src/structures/ClientOAuth2App.js b/src/structures/ClientOAuth2App.js new file mode 100644 index 000000000..74521c40d --- /dev/null +++ b/src/structures/ClientOAuth2App.js @@ -0,0 +1,25 @@ +const User = require('./User'); +const OAuth2App = require('./OAuth2App'); + +/** + * Represents the client's OAuth2 Application + */ +class ClientOAuth2App extends OAuth2App { + setup(data) { + super.setup(data); + + /** + * The app's flags + * @type {int} + */ + this.flags = data.flags; + + /** + * The app's owner + * @type {User} + */ + this.owner = new User(this.client, data.owner); + } +} + +module.exports = ClientOAuth2App; diff --git a/src/structures/OAuth2App.js b/src/structures/OAuth2App.js new file mode 100644 index 000000000..89bcae805 --- /dev/null +++ b/src/structures/OAuth2App.js @@ -0,0 +1,81 @@ +/** + * Represents a OAuth2 Application + */ +class OAuth2App { + constructor(client, data) { + /** + * The client that instantiated the role + * @type {Client} + */ + this.client = client; + Object.defineProperty(this, 'client', { enumerable: false, configurable: false }); + + this.setup(data); + } + + setup(data) { + /** + * The ID of the app + * @type {string} + */ + this.id = data.id; + + /** + * The name of the app + * @type {string} + */ + this.name = data.name; + + /** + * The app's description + * @type {string} + */ + this.description = data.description; + + /** + * The app's icon hash + * @type {string} + */ + this.icon = data.icon; + + /** + * The app's icon URL + * @type {string} + */ + this.iconURL = `https://cdn.discordapp.com/app-icons/${this.id}/${this.icon}.jpg`; + + /** + * The app's RPC origins + * @type {Array} + */ + this.rpcOrigins = data.rpc_origins; + } + + /** + * The timestamp the app was created at + * @type {number} + * @readonly + */ + get createdTimestamp() { + return (this.id / 4194304) + 1420070400000; + } + + /** + * The time the app was created + * @type {Date} + * @readonly + */ + get createdAt() { + return new Date(this.createdTimestamp); + } + + /** + * When concatenated with a string, this automatically concatenates the app name rather than the app object. + * @returns {string} + */ + toString() { + return this.name; + } +} + +module.exports = OAuth2App; diff --git a/src/util/Constants.js b/src/util/Constants.js index aa9dfd38c..8ce939b21 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -128,6 +128,10 @@ const Endpoints = exports.Endpoints = { // webhooks webhook: (webhookID, token) => `${API}/webhooks/${webhookID}${token ? `/${token}` : ''}`, + + // oauth + myApp: `${API}/oauth2/applications/@me`, + getApp: (id) => `${API}/oauth2/authorize?client_id=${id}`, }; exports.Status = {