-
-
Notifications
You must be signed in to change notification settings - Fork 4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(Integration): add guild integrations (#3756)
- Loading branch information
Showing
6 changed files
with
275 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,151 @@ | ||
/** | ||
* The information account for an integration | ||
* @typedef {Object} IntegrationAccount | ||
* @property {string} id The id of the account | ||
* @property {string} name The name of the account | ||
*/ | ||
|
||
/** | ||
* Represents a guild integration. | ||
*/ | ||
class Integration { | ||
constructor(client, data, guild) { | ||
/** | ||
* The client that created this integration | ||
* @name Integration#client | ||
* @type {Client} | ||
* @readonly | ||
*/ | ||
Object.defineProperty(this, 'client', { value: client }); | ||
|
||
/** | ||
* The guild this integration belongs to | ||
* @type {Guild} | ||
*/ | ||
this.guild = guild; | ||
|
||
/** | ||
* The integration id | ||
* @type {Snowflake} | ||
*/ | ||
this.id = data.id; | ||
|
||
/** | ||
* The integration name | ||
* @type {string} | ||
*/ | ||
this.name = data.name; | ||
/** | ||
* The integration type (twitch, youtube, etc) | ||
* @type {string} | ||
*/ | ||
this.type = data.type; | ||
|
||
/** | ||
* Whether this integration is enabled | ||
* @type {boolean} | ||
*/ | ||
this.enabled = data.enabled; | ||
|
||
/** | ||
* Whether this integration is syncing | ||
* @type {boolean} | ||
*/ | ||
this.syncing = data.syncing; | ||
|
||
/** | ||
* The role that this integration uses for subscribers | ||
* @type {Role} | ||
*/ | ||
this.role = this.guild.roles.get(data.role_id); | ||
|
||
/** | ||
* The user for this integration | ||
* @type {User} | ||
*/ | ||
this.user = this.client.dataManager.newUser(data.user); | ||
|
||
/** | ||
* The account integration information | ||
* @type {IntegrationAccount} | ||
*/ | ||
this.account = data.account; | ||
|
||
/** | ||
* The last time this integration was last synced | ||
* @type {number} | ||
*/ | ||
this.syncedAt = data.synced_at; | ||
this._patch(data); | ||
} | ||
|
||
_patch(data) { | ||
/** | ||
* The behavior of expiring subscribers | ||
* @type {number} | ||
*/ | ||
this.expireBehavior = data.expire_behavior; | ||
|
||
/** | ||
* The grace period before expiring subscribers | ||
* @type {number} | ||
*/ | ||
this.expireGracePeriod = data.expire_grace_period; | ||
} | ||
|
||
/** | ||
* Syncs this integration | ||
* @returns {Promise<Integration>} | ||
*/ | ||
sync() { | ||
this.syncing = true; | ||
return this.client.rest.methods.syncIntegration(this) | ||
.then(() => { | ||
this.syncing = false; | ||
this.syncedAt = Date.now(); | ||
return this; | ||
}); | ||
} | ||
|
||
/** | ||
* The data for editing an integration. | ||
* @typedef {Object} IntegrationEditData | ||
* @property {number} [expireBehavior] The new behaviour of expiring subscribers | ||
* @property {number} [expireGracePeriod] The new grace period before expiring subscribers | ||
*/ | ||
|
||
/** | ||
* Edits this integration. | ||
* @param {IntegrationEditData} data The data to edit this integration with | ||
* @param {string} reason Reason for editing this integration | ||
* @returns {Promise<Integration>} | ||
*/ | ||
edit(data, reason) { | ||
if ('expireBehavior' in data) { | ||
data.expire_behavior = data.expireBehavior; | ||
data.expireBehavior = undefined; | ||
} | ||
if ('expireGracePeriod' in data) { | ||
data.expire_grace_period = data.expireGracePeriod; | ||
data.expireGracePeriod = undefined; | ||
} | ||
// The option enable_emoticons is only available for Twitch at this moment | ||
return this.client.rest.methods.editIntegration(this, data, reason) | ||
.then(() => { | ||
this._patch(data); | ||
return this; | ||
}); | ||
} | ||
|
||
/** | ||
* Deletes this integration. | ||
* @returns {Promise<Integration>} | ||
* @param {string} [reason] Reason for deleting this integration | ||
*/ | ||
delete(reason) { | ||
return this.client.rest.methods.deleteIntegration(this, reason) | ||
.then(() => this); | ||
} | ||
} | ||
|
||
module.exports = Integration; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters