Skip to content

Commit

Permalink
feat(Guild): add includeApplications option for fetchIntegrations (#4762
Browse files Browse the repository at this point in the history
)
  • Loading branch information
NotSugden committed Aug 31, 2020
1 parent 7ba9440 commit 3141f7c
Show file tree
Hide file tree
Showing 8 changed files with 211 additions and 137 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@
]
}
},
"prettier":{
"prettier": {
"singleQuote": true,
"printWidth": 120,
"trailingComma": "all",
Expand Down
1 change: 1 addition & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ module.exports = {
splitMessage: Util.splitMessage,

// Structures
Application: require('./structures/interfaces/Application'),
Base: require('./structures/Base'),
Activity: require('./structures/Presence').Activity,
APIMessage: require('./structures/APIMessage'),
Expand Down
118 changes: 4 additions & 114 deletions src/structures/ClientApplication.js
Original file line number Diff line number Diff line change
@@ -1,46 +1,15 @@
'use strict';

const Base = require('./Base');
const Team = require('./Team');
const { ClientApplicationAssetTypes, Endpoints } = require('../util/Constants');
const Snowflake = require('../util/Snowflake');

const AssetTypes = Object.keys(ClientApplicationAssetTypes);
const Application = require('./interfaces/Application');

/**
* Represents a Client OAuth2 Application.
* @extends {Base}
* @extends {Application}
*/
class ClientApplication extends Base {
constructor(client, data) {
super(client);
this._patch(data);
}

class ClientApplication extends Application {
_patch(data) {
/**
* The ID of the app
* @type {Snowflake}
*/
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;
super._patch(data);

/**
* The app's cover image
Expand Down Expand Up @@ -72,85 +41,6 @@ class ClientApplication extends Base {
*/
this.owner = data.team ? new Team(this.client, data.team) : data.owner ? this.client.users.add(data.owner) : null;
}

/**
* The timestamp the app was created at
* @type {number}
* @readonly
*/
get createdTimestamp() {
return Snowflake.deconstruct(this.id).timestamp;
}

/**
* The time the app was created at
* @type {Date}
* @readonly
*/
get createdAt() {
return new Date(this.createdTimestamp);
}

/**
* A link to the application's icon.
* @param {ImageURLOptions} [options={}] Options for the Image URL
* @returns {?string} URL to the icon
*/
iconURL({ format, size } = {}) {
if (!this.icon) return null;
return this.client.rest.cdn.AppIcon(this.id, this.icon, { format, size });
}

/**
* A link to this application's cover image.
* @param {ImageURLOptions} [options={}] Options for the Image URL
* @returns {?string} URL to the cover image
*/
coverImage({ format, size } = {}) {
if (!this.cover) return null;
return Endpoints.CDN(this.client.options.http.cdn).AppIcon(this.id, this.cover, { format, size });
}

/**
* Asset data.
* @typedef {Object} ClientAsset
* @property {Snowflake} id The asset ID
* @property {string} name The asset name
* @property {string} type The asset type
*/

/**
* Gets the clients rich presence assets.
* @returns {Promise<Array<ClientAsset>>}
*/
fetchAssets() {
return this.client.api.oauth2
.applications(this.id)
.assets.get()
.then(assets =>
assets.map(a => ({
id: a.id,
name: a.name,
type: AssetTypes[a.type - 1],
})),
);
}

/**
* When concatenated with a string, this automatically returns the application's name instead of the
* ClientApplication object.
* @returns {string}
* @example
* // Logs: Application name: My App
* console.log(`Application name: ${application}`);
*/
toString() {
return this.name;
}

toJSON() {
return super.toJSON({ createdTimestamp: true });
}
}

module.exports = ClientApplication;
10 changes: 8 additions & 2 deletions src/structures/Guild.js
Original file line number Diff line number Diff line change
Expand Up @@ -698,17 +698,23 @@ class Guild extends Base {
/**
* Fetches a collection of integrations to this guild.
* Resolves with a collection mapping integrations by their ids.
* @param {Object} [options] Options for fetching integrations
* @param {boolean} [options.includeApplications] Whether to include bot and Oauth2 webhook integrations
* @returns {Promise<Collection<string, Integration>>}
* @example
* // Fetch integrations
* guild.fetchIntegrations()
* .then(integrations => console.log(`Fetched ${integrations.size} integrations`))
* .catch(console.error);
*/
fetchIntegrations() {
fetchIntegrations({ includeApplications = false } = {}) {
return this.client.api
.guilds(this.id)
.integrations.get()
.integrations.get({
query: {
include_applications: includeApplications,
},
})
.then(data =>
data.reduce(
(collection, integration) => collection.set(integration.id, new Integration(this.client, integration, this)),
Expand Down
15 changes: 15 additions & 0 deletions src/structures/Integration.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
'use strict';

const Base = require('./Base');
const IntegrationApplication = require('./IntegrationApplication');

/**
* The information account for an integration
Expand Down Expand Up @@ -92,6 +93,20 @@ class Integration extends Base {
* @type {number}
*/
this.expireGracePeriod = data.expire_grace_period;

if ('application' in data) {
if (this.application) {
this.application._patch(data.application);
} else {
/**
* The application for this integration
* @type {?IntegrationApplication}
*/
this.application = new IntegrationApplication(this.client, data.application);
}
} else if (!this.application) {
this.application = null;
}
}

/**
Expand Down
25 changes: 25 additions & 0 deletions src/structures/IntegrationApplication.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
'use strict';

const Application = require('./interfaces/Application');

/**
* Represents an Integration's OAuth2 Application.
* @extends {Application}
*/
class IntegrationApplication extends Application {
_patch(data) {
super._patch(data);

if (typeof data.bot !== 'undefined') {
/**
* The bot {@link User user} for this application
* @type {?User}
*/
this.bot = this.client.users.add(data.bot);
} else if (!this.bot) {
this.bot = null;
}
}
}

module.exports = IntegrationApplication;
125 changes: 125 additions & 0 deletions src/structures/interfaces/Application.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
'use strict';

const { ClientApplicationAssetTypes, Endpoints } = require('../../util/Constants');
const Snowflake = require('../../util/Snowflake');
const Base = require('../Base');

const AssetTypes = Object.keys(ClientApplicationAssetTypes);

/**
* Represents an OAuth2 Application.
* @abstract
*/
class Application extends Base {
constructor(client, data) {
super(client);
this._patch(data);
}

_patch(data) {
/**
* The ID of the app
* @type {Snowflake}
*/
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 timestamp the app was created at
* @type {number}
* @readonly
*/
get createdTimestamp() {
return Snowflake.deconstruct(this.id).timestamp;
}

/**
* The time the app was created at
* @type {Date}
* @readonly
*/
get createdAt() {
return new Date(this.createdTimestamp);
}

/**
* A link to the application's icon.
* @param {ImageURLOptions} [options={}] Options for the Image URL
* @returns {?string} URL to the icon
*/
iconURL({ format, size } = {}) {
if (!this.icon) return null;
return this.client.rest.cdn.AppIcon(this.id, this.icon, { format, size });
}

/**
* A link to this application's cover image.
* @param {ImageURLOptions} [options={}] Options for the Image URL
* @returns {?string} URL to the cover image
*/
coverImage({ format, size } = {}) {
if (!this.cover) return null;
return Endpoints.CDN(this.client.options.http.cdn).AppIcon(this.id, this.cover, { format, size });
}

/**
* Asset data.
* @typedef {Object} ApplicationAsset
* @property {Snowflake} id The asset ID
* @property {string} name The asset name
* @property {string} type The asset type
*/

/**
* Gets the clients rich presence assets.
* @returns {Promise<Array<ApplicationAsset>>}
*/
fetchAssets() {
return this.client.api.oauth2
.applications(this.id)
.assets.get()
.then(assets =>
assets.map(a => ({
id: a.id,
name: a.name,
type: AssetTypes[a.type - 1],
})),
);
}

/**
* When concatenated with a string, this automatically returns the application's name instead of the
* Oauth2Application object.
* @returns {string}
* @example
* // Logs: Application name: My App
* console.log(`Application name: ${application}`);
*/
toString() {
return this.name;
}

toJSON() {
return super.toJSON({ createdTimestamp: true });
}
}

module.exports = Application;
Loading

0 comments on commit 3141f7c

Please sign in to comment.