summaryrefslogtreecommitdiff
path: root/node_modules/discord.js/src/structures/Integration.js
diff options
context:
space:
mode:
authorsowgro <tpoke.ferrari@gmail.com>2023-09-02 19:12:47 -0400
committersowgro <tpoke.ferrari@gmail.com>2023-09-02 19:12:47 -0400
commite4450c8417624b71d779cb4f41692538f9165e10 (patch)
treeb70826542223ecdf8a7a259f61b0a1abb8a217d8 /node_modules/discord.js/src/structures/Integration.js
downloadsowbot3-e4450c8417624b71d779cb4f41692538f9165e10.tar.gz
sowbot3-e4450c8417624b71d779cb4f41692538f9165e10.tar.bz2
sowbot3-e4450c8417624b71d779cb4f41692538f9165e10.zip
first commit
Diffstat (limited to 'node_modules/discord.js/src/structures/Integration.js')
-rw-r--r--node_modules/discord.js/src/structures/Integration.js220
1 files changed, 220 insertions, 0 deletions
diff --git a/node_modules/discord.js/src/structures/Integration.js b/node_modules/discord.js/src/structures/Integration.js
new file mode 100644
index 0000000..fa9777b
--- /dev/null
+++ b/node_modules/discord.js/src/structures/Integration.js
@@ -0,0 +1,220 @@
+'use strict';
+
+const { Routes } = require('discord-api-types/v10');
+const Base = require('./Base');
+const IntegrationApplication = require('./IntegrationApplication');
+
+/**
+ * The information account for an integration
+ * @typedef {Object} IntegrationAccount
+ * @property {Snowflake|string} id The id of the account
+ * @property {string} name The name of the account
+ */
+
+/**
+ * The type of an {@link Integration}. This can be:
+ * * `twitch`
+ * * `youtube`
+ * * `discord`
+ * * `guild_subscription`
+ * @typedef {string} IntegrationType
+ */
+
+/**
+ * Represents a guild integration.
+ * @extends {Base}
+ */
+class Integration extends Base {
+ constructor(client, data, guild) {
+ super(client);
+
+ /**
+ * The guild this integration belongs to
+ * @type {Guild}
+ */
+ this.guild = guild;
+
+ /**
+ * The integration id
+ * @type {Snowflake|string}
+ */
+ this.id = data.id;
+
+ /**
+ * The integration name
+ * @type {string}
+ */
+ this.name = data.name;
+
+ /**
+ * The integration type
+ * @type {IntegrationType}
+ */
+ this.type = data.type;
+
+ /**
+ * Whether this integration is enabled
+ * @type {?boolean}
+ */
+ this.enabled = data.enabled ?? null;
+
+ if ('syncing' in data) {
+ /**
+ * Whether this integration is syncing
+ * @type {?boolean}
+ */
+ this.syncing = data.syncing;
+ } else {
+ this.syncing ??= null;
+ }
+
+ /**
+ * The role that this integration uses for subscribers
+ * @type {?Role}
+ */
+ this.role = this.guild.roles.resolve(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
+ * @type {?User}
+ */
+ this.user = this.client.users._add(data.user);
+ } else {
+ this.user ??= null;
+ }
+
+ /**
+ * The account integration information
+ * @type {IntegrationAccount}
+ */
+ this.account = data.account;
+
+ if ('synced_at' in data) {
+ /**
+ * The timestamp at which this integration was last synced at
+ * @type {?number}
+ */
+ this.syncedTimestamp = Date.parse(data.synced_at);
+ } else {
+ this.syncedTimestamp ??= null;
+ }
+
+ 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);
+ }
+
+ /**
+ * The date at which this integration was last synced at
+ * @type {?Date}
+ * @readonly
+ */
+ get syncedAt() {
+ return this.syncedTimestamp && new Date(this.syncedTimestamp);
+ }
+
+ /**
+ * All roles that are managed by this integration
+ * @type {Collection<Snowflake, Role>}
+ * @readonly
+ */
+ get roles() {
+ const roles = this.guild.roles.cache;
+ return roles.filter(role => role.tags?.integrationId === this.id);
+ }
+
+ _patch(data) {
+ if ('expire_behavior' in data) {
+ /**
+ * The behavior of expiring subscribers
+ * @type {?IntegrationExpireBehavior}
+ */
+ this.expireBehavior = data.expire_behavior;
+ } else {
+ this.expireBehavior ??= null;
+ }
+
+ if ('expire_grace_period' in data) {
+ /**
+ * The grace period (in days) before expiring subscribers
+ * @type {?number}
+ */
+ this.expireGracePeriod = data.expire_grace_period;
+ } else {
+ this.expireGracePeriod ??= null;
+ }
+
+ 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 {
+ this.application ??= null;
+ }
+
+ if ('scopes' in data) {
+ /**
+ * The scopes this application has been authorized for
+ * @type {OAuth2Scopes[]}
+ */
+ this.scopes = data.scopes;
+ } else {
+ this.scopes ??= [];
+ }
+ }
+
+ /**
+ * Deletes this integration.
+ * @returns {Promise<Integration>}
+ * @param {string} [reason] Reason for deleting this integration
+ */
+ async delete(reason) {
+ await this.client.rest.delete(Routes.guildIntegration(this.guild.id, this.id), { reason });
+ return this;
+ }
+
+ toJSON() {
+ return super.toJSON({
+ role: 'roleId',
+ guild: 'guildId',
+ user: 'userId',
+ });
+ }
+}
+
+module.exports = Integration;