114 lines
2.8 KiB
JavaScript
114 lines
2.8 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
const { setTimeout } = require('node:timers');
|
||
|
const Base = require('./Base');
|
||
|
const { Events } = require('../util/Constants');
|
||
|
const SnowflakeUtil = require('../util/SnowflakeUtil');
|
||
|
|
||
|
/**
|
||
|
* Represents a interaction on Discord.
|
||
|
* @extends {Base}
|
||
|
*/
|
||
|
class InteractionResponse extends Base {
|
||
|
constructor(client, data) {
|
||
|
super(client);
|
||
|
/**
|
||
|
* The id of the channel the interaction was sent in
|
||
|
* @type {Snowflake}
|
||
|
*/
|
||
|
this.channelId = data.channelId;
|
||
|
|
||
|
/**
|
||
|
* The id of the guild the interaction was sent in, if any
|
||
|
* @type {?Snowflake}
|
||
|
*/
|
||
|
this.guildId = data.guildId ?? this.channel?.guild?.id ?? null;
|
||
|
|
||
|
/**
|
||
|
* The interaction data was sent in
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
this.sendData = data.metadata;
|
||
|
this._patch(data);
|
||
|
}
|
||
|
|
||
|
_patch(data) {
|
||
|
if ('id' in data) {
|
||
|
/**
|
||
|
* The interaction response's ID
|
||
|
* @type {Snowflake}
|
||
|
*/
|
||
|
this.id = data.id;
|
||
|
}
|
||
|
if ('nonce' in data) {
|
||
|
/**
|
||
|
* The interaction response's nonce
|
||
|
* @type {Snowflake}
|
||
|
*/
|
||
|
this.nonce = data.nonce;
|
||
|
}
|
||
|
}
|
||
|
/**
|
||
|
* The timestamp the interaction response was created at
|
||
|
* @type {number}
|
||
|
* @readonly
|
||
|
*/
|
||
|
get createdTimestamp() {
|
||
|
return SnowflakeUtil.timestampFrom(this.id);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* The time the interaction response was created at
|
||
|
* @type {Date}
|
||
|
* @readonly
|
||
|
*/
|
||
|
get createdAt() {
|
||
|
return new Date(this.createdTimestamp);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* The channel that the interaction was sent in
|
||
|
* @type {TextBasedChannels}
|
||
|
* @readonly
|
||
|
*/
|
||
|
get channel() {
|
||
|
return this.client.channels.resolve(this.channelId);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* The guild the inteaaction was sent in (if in a guild channel)
|
||
|
* @type {?Guild}
|
||
|
* @readonly
|
||
|
*/
|
||
|
get guild() {
|
||
|
return this.client.guilds.resolve(this.guildId) ?? this.channel?.guild ?? null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get Modal send from interaction
|
||
|
* @param {?number} time Time to wait for modal (Default: 120000)
|
||
|
* @returns {Modal}
|
||
|
*/
|
||
|
awaitModal(time = 120_000) {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
const handler = modal => {
|
||
|
timeout.refresh();
|
||
|
if (modal.nonce != this.nonce || modal.id != this.id) return;
|
||
|
clearTimeout(timeout);
|
||
|
this.client.removeListener(Events.INTERACTION_MODAL_CREATE, handler);
|
||
|
this.client.decrementMaxListeners();
|
||
|
resolve(modal);
|
||
|
};
|
||
|
const timeout = setTimeout(() => {
|
||
|
this.client.removeListener(Events.INTERACTION_MODAL_CREATE, handler);
|
||
|
this.client.decrementMaxListeners();
|
||
|
reject(new Error('MODAL_TIMEOUT'));
|
||
|
}, time || 120_000).unref();
|
||
|
this.client.incrementMaxListeners();
|
||
|
this.client.on(Events.INTERACTION_MODAL_CREATE, handler);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = InteractionResponse;
|