115 lines
2.8 KiB
JavaScript
115 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
|
|
* @returns {Modal}
|
|
*/
|
|
awaitModal(time) {
|
|
if (!time || typeof time !== 'number' || time < 0) throw new Error('INVALID_TIME');
|
|
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).unref();
|
|
this.client.incrementMaxListeners();
|
|
this.client.on(Events.INTERACTION_MODAL_CREATE, handler);
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = InteractionResponse;
|