8b98630169
v13.8.1
120 lines
3.3 KiB
JavaScript
120 lines
3.3 KiB
JavaScript
'use strict';
|
|
|
|
const Interaction = require('./Interaction');
|
|
const InteractionWebhook = require('./InteractionWebhook');
|
|
const ModalSubmitFieldsResolver = require('./ModalSubmitFieldsResolver');
|
|
const InteractionResponses = require('./interfaces/InteractionResponses');
|
|
const { MessageComponentTypes } = require('../util/Constants');
|
|
|
|
/**
|
|
* Represents a modal submit interaction.
|
|
* @extends {Interaction}
|
|
* @implements {InteractionResponses}
|
|
*/
|
|
class ModalSubmitInteraction extends Interaction {
|
|
constructor(client, data) {
|
|
super(client, data);
|
|
|
|
/**
|
|
* The custom id of the modal.
|
|
* @type {string}
|
|
*/
|
|
this.customId = data.data.custom_id;
|
|
|
|
/**
|
|
* @typedef {Object} PartialTextInputData
|
|
* @property {string} [customId] A unique string to be sent in the interaction when submitted
|
|
* @property {MessageComponentType} [type] The type of this component
|
|
* @property {string} [value] Value of this text input component
|
|
*/
|
|
|
|
/**
|
|
* @typedef {Object} PartialModalActionRow
|
|
* @property {MessageComponentType} [type] The type of this component
|
|
* @property {PartialTextInputData[]} [components] Partial text input components
|
|
*/
|
|
|
|
/**
|
|
* The inputs within the modal
|
|
* @type {PartialModalActionRow[]}
|
|
*/
|
|
this.components =
|
|
data.data.components?.map(c => ({
|
|
type: MessageComponentTypes[c.type],
|
|
components: ModalSubmitInteraction.transformComponent(c),
|
|
})) ?? [];
|
|
|
|
/**
|
|
* The message associated with this interaction
|
|
* @type {Message|APIMessage|null}
|
|
*/
|
|
this.message = data.message ? this.channel?.messages._add(data.message) ?? data.message : null;
|
|
|
|
/**
|
|
* The fields within the modal
|
|
* @type {ModalSubmitFieldsResolver}
|
|
*/
|
|
this.fields = new ModalSubmitFieldsResolver(this.components);
|
|
|
|
/**
|
|
* Whether the reply to this interaction has been deferred
|
|
* @type {boolean}
|
|
*/
|
|
this.deferred = false;
|
|
|
|
/**
|
|
* Whether the reply to this interaction is ephemeral
|
|
* @type {?boolean}
|
|
*/
|
|
this.ephemeral = null;
|
|
|
|
/**
|
|
* Whether this interaction has already been replied to
|
|
* @type {boolean}
|
|
*/
|
|
this.replied = false;
|
|
|
|
/**
|
|
* An associated interaction webhook, can be used to further interact with this interaction
|
|
* @type {InteractionWebhook}
|
|
*/
|
|
this.webhook = new InteractionWebhook(this.client, this.applicationId, this.token);
|
|
}
|
|
|
|
/**
|
|
* Transforms component data to discord.js-compatible data
|
|
* @param {*} rawComponent The data to transform
|
|
* @returns {PartialTextInputData[]}
|
|
*/
|
|
static transformComponent(rawComponent) {
|
|
return rawComponent.components.map(c => ({
|
|
value: c.value,
|
|
type: MessageComponentTypes[c.type],
|
|
customId: c.custom_id,
|
|
}));
|
|
}
|
|
|
|
/**
|
|
* Whether this is from a {@link MessageComponentInteraction}.
|
|
* @returns {boolean}
|
|
*/
|
|
isFromMessage() {
|
|
return Boolean(this.message);
|
|
}
|
|
|
|
// These are here only for documentation purposes - they are implemented by InteractionResponses
|
|
/* eslint-disable no-empty-function */
|
|
deferReply() {}
|
|
reply() {}
|
|
fetchReply() {}
|
|
editReply() {}
|
|
deleteReply() {}
|
|
followUp() {}
|
|
update() {}
|
|
deferUpdate() {}
|
|
}
|
|
|
|
InteractionResponses.applyToClass(ModalSubmitInteraction, ['showModal', 'awaitModalSubmit']);
|
|
|
|
module.exports = ModalSubmitInteraction;
|