From caa3b60c30a8ab13d195e084331889aed820a389 Mon Sep 17 00:00:00 2001 From: Rodry <38259440+ImRodry@users.noreply.github.com> Date: Thu, 23 Sep 2021 12:47:01 +0100 Subject: [PATCH] feat(Integration): add missing props and fix docs/types (#6623) Co-authored-by: Noel --- src/structures/Guild.js | 2 +- src/structures/GuildAuditLogs.js | 2 +- src/structures/Integration.js | 47 ++++++++++++++++++++++++++------ src/structures/Role.js | 2 +- src/util/Constants.js | 10 +++++++ typings/index.d.ts | 22 +++++++++------ 6 files changed, 66 insertions(+), 19 deletions(-) diff --git a/src/structures/Guild.js b/src/structures/Guild.js index 565d9fd95..0988a5f32 100644 --- a/src/structures/Guild.js +++ b/src/structures/Guild.js @@ -559,7 +559,7 @@ class Guild extends AnonymousGuild { /** * Fetches a collection of integrations to this guild. * Resolves with a collection mapping integrations by their ids. - * @returns {Promise>} + * @returns {Promise>} * @example * // Fetch integrations * guild.fetchIntegrations() diff --git a/src/structures/GuildAuditLogs.js b/src/structures/GuildAuditLogs.js index c3876ea26..b323de987 100644 --- a/src/structures/GuildAuditLogs.js +++ b/src/structures/GuildAuditLogs.js @@ -174,7 +174,7 @@ class GuildAuditLogs { /** * Cached integrations - * @type {Collection} + * @type {Collection} * @private */ this.integrations = new Collection(); diff --git a/src/structures/Integration.js b/src/structures/Integration.js index 846e047dd..674b7b8fb 100644 --- a/src/structures/Integration.js +++ b/src/structures/Integration.js @@ -6,7 +6,7 @@ const IntegrationApplication = require('./IntegrationApplication'); /** * The information account for an integration * @typedef {Object} IntegrationAccount - * @property {string} id The id of the account + * @property {Snowflake|string} id The id of the account * @property {string} name The name of the account */ @@ -25,7 +25,7 @@ class Integration extends Base { /** * The integration id - * @type {Snowflake} + * @type {Snowflake|string} */ this.id = data.id; @@ -36,7 +36,7 @@ class Integration extends Base { this.name = data.name; /** - * The integration type (twitch, youtube, etc) + * The integration type (twitch, youtube or discord) * @type {string} */ this.type = data.type; @@ -49,16 +49,26 @@ class Integration extends Base { /** * Whether this integration is syncing - * @type {boolean} + * @type {?boolean} */ this.syncing = data.syncing; /** * The role that this integration uses for subscribers - * @type {Role} + * @type {?Role} */ this.role = this.guild.roles.cache.get(data.role_id); + if ('enable_emoticons' in data) { + /** + * Whether emoticons should be synced for this integration (twitch only currently) + * @type {?boolean} + */ + this.enableEmoticons = data.enable_emoticons; + } else { + this.enableEmoticons ??= null; + } + if (data.user) { /** * The user for this integration @@ -77,9 +87,30 @@ class Integration extends Base { /** * The last time this integration was last synced - * @type {number} + * @type {?number} */ this.syncedAt = data.synced_at; + + if ('subscriber_count' in data) { + /** + * How many subscribers this integration has + * @type {?number} + */ + this.subscriberCount = data.subscriber_count; + } else { + this.subscriberCount ??= null; + } + + if ('revoked' in data) { + /** + * Whether this integration has been revoked + * @type {?boolean} + */ + this.revoked = data.revoked; + } else { + this.revoked ??= null; + } + this._patch(data); } @@ -96,13 +127,13 @@ class Integration extends Base { _patch(data) { /** * The behavior of expiring subscribers - * @type {number} + * @type {?number} */ this.expireBehavior = data.expire_behavior; /** * The grace period before expiring subscribers - * @type {number} + * @type {?number} */ this.expireGracePeriod = data.expire_grace_period; diff --git a/src/structures/Role.js b/src/structures/Role.js index b75437de1..d5faa92b9 100644 --- a/src/structures/Role.js +++ b/src/structures/Role.js @@ -87,7 +87,7 @@ class Role extends Base { * The tags this role has * @type {?Object} * @property {Snowflake} [botId] The id of the bot this role belongs to - * @property {Snowflake} [integrationId] The id of the integration this role belongs to + * @property {Snowflake|string} [integrationId] The id of the integration this role belongs to * @property {true} [premiumSubscriberRole] Whether this is the guild's premium subscription role */ this.tags = data.tags ? {} : null; diff --git a/src/util/Constants.js b/src/util/Constants.js index a1ef04230..ad6377dc1 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -348,6 +348,16 @@ exports.InviteScopes = [ 'webhook.incoming', ]; +// TODO: change Integration#expireBehavior to this and clean up Integration +/** + * The behavior of expiring subscribers for Integrations. This can be: + * * REMOVE_ROLE + * * KICK + * @typedef {string} IntegrationExpireBehavior + * @see {@link https://discord.com/developers/docs/resources/guild#integration-object-integration-expire-behaviors} + */ +exports.IntegrationExpireBehaviors = createEnum(['REMOVE_ROLE', 'KICK']); + /** * The type of a message, e.g. `DEFAULT`. Here are the available types: * * DEFAULT diff --git a/typings/index.d.ts b/typings/index.d.ts index 12aad2f51..318800ac5 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -725,7 +725,7 @@ export class Guild extends AnonymousGuild { public editWelcomeScreen(data: WelcomeScreenEditData): Promise; public equals(guild: Guild): boolean; public fetchAuditLogs(options?: GuildAuditLogsFetchOptions): Promise; - public fetchIntegrations(): Promise>; + public fetchIntegrations(): Promise>; public fetchOwner(options?: FetchOwnerOptions): Promise; public fetchPreview(): Promise; public fetchTemplates(): Promise>; @@ -769,7 +769,7 @@ export class Guild extends AnonymousGuild { export class GuildAuditLogs { public constructor(guild: Guild, data: RawGuildAuditLogData); private webhooks: Collection; - private integrations: Collection; + private integrations: Collection; public entries: Collection; @@ -979,17 +979,20 @@ export class Integration extends Base { public account: IntegrationAccount; public application: IntegrationApplication | null; public enabled: boolean; - public expireBehavior: number; - public expireGracePeriod: number; + public expireBehavior: number | undefined; + public expireGracePeriod: number | undefined; public guild: Guild; - public id: Snowflake; + public id: Snowflake | string; public name: string; - public role: Role; + public role: Role | undefined; + public enableEmoticons: boolean | null; public readonly roles: Collection; - public syncedAt: number; - public syncing: boolean; + public syncedAt: number | undefined; + public syncing: boolean | undefined; public type: string; public user: User | null; + public subscriberCount: number | null; + public revoked: boolean | null; public delete(reason?: string): Promise; } @@ -2344,6 +2347,7 @@ export const Constants: { TextBasedChannelTypes: TextBasedChannelTypes[]; VoiceBasedChannelTypes: VoiceBasedChannelTypes[]; ClientApplicationAssetTypes: ConstantsClientApplicationAssetTypes; + IntegrationExpireBehaviors: IntegrationExpireBehaviors[]; InviteScopes: InviteScope[]; MessageTypes: MessageType[]; SystemMessageTypes: SystemMessageType[]; @@ -4115,6 +4119,8 @@ export interface CreateInviteOptions { targetType?: InviteTargetType; } +export type IntegrationExpireBehaviors = 'REMOVE_ROLE' | 'KICK'; + export type InviteResolvable = string; export type InviteScope =