diff --git a/packages/discord.js/src/index.js b/packages/discord.js/src/index.js index c04225c34882..d2f0ff799947 100644 --- a/packages/discord.js/src/index.js +++ b/packages/discord.js/src/index.js @@ -143,6 +143,9 @@ exports.GuildScheduledEvent = require('./structures/GuildScheduledEvent').GuildS exports.GuildTemplate = require('./structures/GuildTemplate'); exports.Integration = require('./structures/Integration'); exports.IntegrationApplication = require('./structures/IntegrationApplication'); +exports.InteractionCallback = require('./structures/InteractionCallback'); +exports.InteractionCallbackResource = require('./structures/InteractionCallbackResource'); +exports.InteractionCallbackResponse = require('./structures/InteractionCallbackResponse'); exports.BaseInteraction = require('./structures/BaseInteraction'); exports.InteractionCollector = require('./structures/InteractionCollector'); exports.InteractionResponse = require('./structures/InteractionResponse'); diff --git a/packages/discord.js/src/structures/InteractionCallback.js b/packages/discord.js/src/structures/InteractionCallback.js new file mode 100644 index 000000000000..4abc831470e9 --- /dev/null +++ b/packages/discord.js/src/structures/InteractionCallback.js @@ -0,0 +1,74 @@ +'use strict'; + +const { DiscordSnowflake } = require('@sapphire/snowflake'); + +/** + * Represents an interaction callback response from Discord + */ +class InteractionCallback { + constructor(client, data) { + /** + * The client that instantiated this. + * @name InteractionCallback#client + * @type {Client} + * @readonly + */ + Object.defineProperty(this, 'client', { value: client }); + + /** + * The id of the original interaction response + * @type {Snowflake} + */ + this.id = data.id; + + /** + * The type of the original interaction + * @type {InteractionType} + */ + this.type = data.type; + + /** + * The instance id of the Activity if one was launched or joined + * @type {?string} + */ + this.activityInstanceId = data.activity_instance_id ?? null; + + /** + * The id of the message that was created by the interaction + * @type {?Snowflake} + */ + this.responseMessageId = data.response_message_id ?? null; + + /** + * Whether the message is in a loading state + * @type {?boolean} + */ + this.responseMessageLoading = data.response_message_loading ?? null; + + /** + * Whether the response message was ephemeral + * @type {?boolean} + */ + this.responseMessageEphemeral = data.response_message_ephemeral ?? null; + } + + /** + * The timestamp the original interaction was created at + * @type {number} + * @readonly + */ + get createdTimestamp() { + return DiscordSnowflake.timestampFrom(this.id); + } + + /** + * The time the original interaction was created at + * @type {Date} + * @readonly + */ + get createdAt() { + return new Date(this.createdTimestamp); + } +} + +module.exports = InteractionCallback; diff --git a/packages/discord.js/src/structures/InteractionCallbackResource.js b/packages/discord.js/src/structures/InteractionCallbackResource.js new file mode 100644 index 000000000000..ffb088d8100e --- /dev/null +++ b/packages/discord.js/src/structures/InteractionCallbackResource.js @@ -0,0 +1,52 @@ +'use strict'; + +const { lazy } = require('@discordjs/util'); + +const getMessage = lazy(() => require('./Message').Message); + +/** + * Represents the resource that was created by the interaction response. + */ +class InteractionCallbackResource { + constructor(client, data) { + /** + * The client that instantiated this + * @name InteractionCallbackResource#client + * @type {Client} + * @readonly + */ + Object.defineProperty(this, 'client', { value: client }); + + /** + * The interaction callback type + * @type {InteractionResponseType} + */ + this.type = data.type; + + /** + * The Activity launched by an interaction + * @typedef {Object} ActivityInstance + * @property {string} id The instance id of the Activity + */ + + /** + * Represents the Activity launched by this interaction + * @type {?ActivityInstance} + */ + this.activityInstance = data.activity_instance ?? null; + + if ('message' in data) { + /** + * The message created by the interaction + * @type {?Message} + */ + this.message = + this.client.channels.cache.get(data.message.channel_id)?.messages._add(data.message) ?? + new (getMessage())(client, data.message); + } else { + this.message = null; + } + } +} + +module.exports = InteractionCallbackResource; diff --git a/packages/discord.js/src/structures/InteractionCallbackResponse.js b/packages/discord.js/src/structures/InteractionCallbackResponse.js new file mode 100644 index 000000000000..c114648398ae --- /dev/null +++ b/packages/discord.js/src/structures/InteractionCallbackResponse.js @@ -0,0 +1,33 @@ +'use strict'; + +const InteractionCallback = require('./InteractionCallback'); +const InteractionCallbackResource = require('./InteractionCallbackResource'); + +/** + * Represents an interaction's response + */ +class InteractionCallbackResponse { + constructor(client, data) { + /** + * The client that instantiated this + * @name InteractionCallbackResponse#client + * @type {Client} + * @readonly + */ + Object.defineProperty(this, 'client', { value: client }); + + /** + * The interaction object associated with the interaction callback response + * @type {InteractionCallback} + */ + this.interaction = new InteractionCallback(client, data.interaction); + + /** + * The resource that was created by the interaction response + * @type {?InteractionCallbackResource} + */ + this.resource = data.resource ? new InteractionCallbackResource(client, data.resource) : null; + } +} + +module.exports = InteractionCallbackResponse; diff --git a/packages/discord.js/src/structures/interfaces/InteractionResponses.js b/packages/discord.js/src/structures/interfaces/InteractionResponses.js index e448e19fd17e..3610b2e47bdd 100644 --- a/packages/discord.js/src/structures/interfaces/InteractionResponses.js +++ b/packages/discord.js/src/structures/interfaces/InteractionResponses.js @@ -1,8 +1,10 @@ 'use strict'; +const { makeURLSearchParams } = require('@discordjs/rest'); const { isJSONEncodable } = require('@discordjs/util'); const { InteractionResponseType, MessageFlags, Routes, InteractionType } = require('discord-api-types/v10'); const { DiscordjsError, ErrorCodes } = require('../../errors'); +const InteractionCallbackResponse = require('../InteractionCallbackResponse'); const InteractionCollector = require('../InteractionCollector'); const InteractionResponse = require('../InteractionResponse'); const MessagePayload = require('../MessagePayload'); @@ -23,21 +25,21 @@ class InteractionResponses { * Options for deferring the reply to an {@link BaseInteraction}. * @typedef {Object} InteractionDeferReplyOptions * @property {MessageFlagsResolvable} [flags] Flags for the reply. + * @property {boolean} [withResponse] Whether to return an {@link InteractionCallbackResponse} as the response * Only `MessageFlags.Ephemeral` can be set. - * @property {boolean} [fetchReply] Whether to fetch the reply */ /** * Options for deferring and updating the reply to a {@link MessageComponentInteraction}. * @typedef {Object} InteractionDeferUpdateOptions - * @property {boolean} [fetchReply] Whether to fetch the reply + * @property {boolean} [withResponse] Whether to return an {@link InteractionCallbackResponse} as the response */ /** * Options for a reply to a {@link BaseInteraction}. * @typedef {BaseMessageOptionsWithPoll} InteractionReplyOptions * @property {boolean} [tts=false] Whether the message should be spoken aloud - * @property {boolean} [fetchReply] Whether to fetch the reply + * @property {boolean} [withResponse] Whether to return an {@link InteractionCallbackResponse} as the response * @property {MessageFlagsResolvable} [flags] Which flags to set for the message. * Only `MessageFlags.Ephemeral`, `MessageFlags.SuppressEmbeds`, and `MessageFlags.SuppressNotifications` * can be set. @@ -46,13 +48,19 @@ class InteractionResponses { /** * Options for updating the message received from a {@link MessageComponentInteraction}. * @typedef {MessageEditOptions} InteractionUpdateOptions - * @property {boolean} [fetchReply] Whether to fetch the reply + * @property {boolean} [withResponse] Whether to return an {@link InteractionCallbackResponse} as the response + */ + + /** + * Options for showing a modal in response to a {@link BaseInteraction} + * @typedef {Object} ShowModalOptions + * @property {boolean} [withResponse] Whether to return an {@link InteractionCallbackResponse} as the response */ /** * Defers the reply to this interaction. * @param {InteractionDeferReplyOptions} [options] Options for deferring the reply to this interaction - * @returns {Promise} + * @returns {Promise} * @example * // Defer the reply to this interaction * interaction.deferReply() @@ -67,7 +75,7 @@ class InteractionResponses { async deferReply(options = {}) { if (this.deferred || this.replied) throw new DiscordjsError(ErrorCodes.InteractionAlreadyReplied); - await this.client.rest.post(Routes.interactionCallback(this.id, this.token), { + const response = await this.client.rest.post(Routes.interactionCallback(this.id, this.token), { body: { type: InteractionResponseType.DeferredChannelMessageWithSource, data: { @@ -75,22 +83,26 @@ class InteractionResponses { }, }, auth: false, + query: makeURLSearchParams({ with_response: options.withResponse ?? false }), }); this.deferred = true; this.ephemeral = Boolean(options.flags & MessageFlags.Ephemeral); - return options.fetchReply ? this.fetchReply() : new InteractionResponse(this); + + return options.withResponse + ? new InteractionCallbackResponse(this.client, response) + : new InteractionResponse(this); } /** * Creates a reply to this interaction. - * Use the `fetchReply` option to get the bot's reply message. + * Use the `withResponse` option to get the interaction callback response. * @param {string|MessagePayload|InteractionReplyOptions} options The options for the reply - * @returns {Promise} + * @returns {Promise} * @example * // Reply to the interaction and fetch the response - * interaction.reply({ content: 'Pong!', fetchReply: true }) - * .then((message) => console.log(`Reply sent with content ${message.content}`)) + * interaction.reply({ content: 'Pong!', withResponse: true }) + * .then((response) => console.log(`Reply sent with content ${response.resource.message.content}`)) * .catch(console.error); * @example * // Create an ephemeral reply with an embed @@ -109,18 +121,22 @@ class InteractionResponses { const { body: data, files } = await messagePayload.resolveBody().resolveFiles(); - await this.client.rest.post(Routes.interactionCallback(this.id, this.token), { + const response = await this.client.rest.post(Routes.interactionCallback(this.id, this.token), { body: { type: InteractionResponseType.ChannelMessageWithSource, data, }, files, auth: false, + query: makeURLSearchParams({ with_response: options.withResponse ?? false }), }); this.ephemeral = Boolean(options.flags & MessageFlags.Ephemeral); this.replied = true; - return options.fetchReply ? this.fetchReply() : new InteractionResponse(this); + + return options.withResponse + ? new InteractionCallbackResponse(this.client, response) + : new InteractionResponse(this); } /** @@ -192,7 +208,7 @@ class InteractionResponses { /** * Defers an update to the message to which the component was attached. * @param {InteractionDeferUpdateOptions} [options] Options for deferring the update to this interaction - * @returns {Promise} + * @returns {Promise} * @example * // Defer updating and reset the component's loading state * interaction.deferUpdate() @@ -201,21 +217,24 @@ class InteractionResponses { */ async deferUpdate(options = {}) { if (this.deferred || this.replied) throw new DiscordjsError(ErrorCodes.InteractionAlreadyReplied); - await this.client.rest.post(Routes.interactionCallback(this.id, this.token), { + const response = await this.client.rest.post(Routes.interactionCallback(this.id, this.token), { body: { type: InteractionResponseType.DeferredMessageUpdate, }, auth: false, + query: makeURLSearchParams({ with_response: options.withResponse ?? false }), }); this.deferred = true; - return options.fetchReply ? this.fetchReply() : new InteractionResponse(this, this.message?.interaction?.id); + return options.withResponse + ? new InteractionCallbackResponse(this.client, response) + : new InteractionResponse(this, this.message?.interaction?.id); } /** * Updates the original message of the component on which the interaction was received on. * @param {string|MessagePayload|InteractionUpdateOptions} options The options for the updated message - * @returns {Promise} + * @returns {Promise} * @example * // Remove the components from the message * interaction.update({ @@ -234,34 +253,41 @@ class InteractionResponses { const { body: data, files } = await messagePayload.resolveBody().resolveFiles(); - await this.client.rest.post(Routes.interactionCallback(this.id, this.token), { + const response = await this.client.rest.post(Routes.interactionCallback(this.id, this.token), { body: { type: InteractionResponseType.UpdateMessage, data, }, files, auth: false, + query: makeURLSearchParams({ with_response: options.withResponse ?? false }), }); this.replied = true; - return options.fetchReply ? this.fetchReply() : new InteractionResponse(this, this.message.interaction?.id); + return options.withResponse + ? new InteractionCallbackResponse(this.client, response) + : new InteractionResponse(this, this.message.interaction?.id); } /** * Shows a modal component * @param {ModalBuilder|ModalComponentData|APIModalInteractionResponseCallbackData} modal The modal to show - * @returns {Promise} + * @param {ShowModalOptions} [options={}] The options for sending this interaction response + * @returns {Promise} */ - async showModal(modal) { + async showModal(modal, options = {}) { if (this.deferred || this.replied) throw new DiscordjsError(ErrorCodes.InteractionAlreadyReplied); - await this.client.rest.post(Routes.interactionCallback(this.id, this.token), { + const response = await this.client.rest.post(Routes.interactionCallback(this.id, this.token), { body: { type: InteractionResponseType.Modal, data: isJSONEncodable(modal) ? modal.toJSON() : this.client.options.jsonTransformer(modal), }, auth: false, + query: makeURLSearchParams({ with_response: options.withResponse ?? false }), }); this.replied = true; + + return options.withResponse ? new InteractionCallbackResponse(this.client, response) : undefined; } /** diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index dce9f783d199..812431f7c290 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -168,6 +168,11 @@ import { SubscriptionStatus, GatewaySendPayload, GatewayDispatchPayload, + RESTPostAPIInteractionCallbackWithResponseResult, + RESTAPIInteractionCallbackObject, + RESTAPIInteractionCallbackResourceObject, + InteractionResponseType, + RESTAPIInteractionCallbackActivityInstanceResource, VoiceChannelEffectSendAnimationType, GatewayVoiceChannelEffectSendDispatchData, } from 'discord-api-types/v10'; @@ -563,8 +568,8 @@ export abstract class CommandInteraction e public inCachedGuild(): this is CommandInteraction<'cached'>; public inRawGuild(): this is CommandInteraction<'raw'>; public deferReply( - options: InteractionDeferReplyOptions & { fetchReply: true }, - ): Promise>>; + options: InteractionDeferReplyOptions & { withResponse: true }, + ): Promise; public deferReply(options?: InteractionDeferReplyOptions): Promise>>; public deleteReply(message?: MessageResolvable | '@original'): Promise; public editReply( @@ -572,7 +577,7 @@ export abstract class CommandInteraction e ): Promise>>; public fetchReply(message?: Snowflake | '@original'): Promise>>; public followUp(options: string | MessagePayload | InteractionReplyOptions): Promise>>; - public reply(options: InteractionReplyOptions & { fetchReply: true }): Promise>>; + public reply(options: InteractionReplyOptions & { withResponse: true }): Promise; public reply( options: string | MessagePayload | InteractionReplyOptions, ): Promise>>; @@ -581,7 +586,15 @@ export abstract class CommandInteraction e | JSONEncodable | ModalComponentData | APIModalInteractionResponseCallbackData, - ): Promise; + options: ShowModalOptions & { withResponse: true }, + ): Promise; + public showModal( + modal: + | JSONEncodable + | ModalComponentData + | APIModalInteractionResponseCallbackData, + options?: ShowModalOptions, + ): Promise; public awaitModalSubmit( options: AwaitModalSubmitOptions, ): Promise>; @@ -1982,6 +1995,33 @@ export class BaseInteraction extends Base public isRepliable(): this is RepliableInteraction; } +export class InteractionCallback { + private constructor(client: Client, data: RESTAPIInteractionCallbackObject); + public activityInstanceId: string | null; + public readonly client: Client; + public get createdAt(): Date; + public get createdTimestamp(): number; + public id: Snowflake; + public responseMessageEphemeral: boolean | null; + public responseMessageId: Snowflake | null; + public responseMessageLoading: boolean | null; + public type: InteractionType; +} + +export class InteractionCallbackResponse { + private constructor(client: Client, data: RESTPostAPIInteractionCallbackWithResponseResult); + public readonly client: Client; + public interaction: InteractionCallback; + public resource: InteractionCallbackResource | null; +} + +export class InteractionCallbackResource { + private constructor(client: Client, data: RESTAPIInteractionCallbackResourceObject); + public activityInstance: RESTAPIInteractionCallbackActivityInstanceResource | null; + public message: Message | null; + public type: InteractionResponseType; +} + export class InteractionCollector extends Collector< Snowflake, Interaction, @@ -2297,12 +2337,12 @@ export class MessageComponentInteraction e public inCachedGuild(): this is MessageComponentInteraction<'cached'>; public inRawGuild(): this is MessageComponentInteraction<'raw'>; public deferReply( - options: InteractionDeferReplyOptions & { fetchReply: true }, - ): Promise>>; + options: InteractionDeferReplyOptions & { withResponse: true }, + ): Promise; public deferReply(options?: InteractionDeferReplyOptions): Promise>>; public deferUpdate( - options: InteractionDeferUpdateOptions & { fetchReply: true }, - ): Promise>>; + options: InteractionDeferUpdateOptions & { withResponse: true }, + ): Promise; public deferUpdate(options?: InteractionDeferUpdateOptions): Promise>>; public deleteReply(message?: MessageResolvable | '@original'): Promise; public editReply( @@ -2310,11 +2350,11 @@ export class MessageComponentInteraction e ): Promise>>; public fetchReply(message?: Snowflake | '@original'): Promise>>; public followUp(options: string | MessagePayload | InteractionReplyOptions): Promise>>; - public reply(options: InteractionReplyOptions & { fetchReply: true }): Promise>>; + public reply(options: InteractionReplyOptions & { withResponse: true }): Promise; public reply( options: string | MessagePayload | InteractionReplyOptions, ): Promise>>; - public update(options: InteractionUpdateOptions & { fetchReply: true }): Promise>>; + public update(options: InteractionUpdateOptions & { withResponse: true }): Promise; public update( options: string | MessagePayload | InteractionUpdateOptions, ): Promise>>; @@ -2323,7 +2363,15 @@ export class MessageComponentInteraction e | JSONEncodable | ModalComponentData | APIModalInteractionResponseCallbackData, - ): Promise; + options: ShowModalOptions & { withResponse: true }, + ): Promise; + public showModal( + modal: + | JSONEncodable + | ModalComponentData + | APIModalInteractionResponseCallbackData, + options?: ShowModalOptions, + ): Promise; public awaitModalSubmit( options: AwaitModalSubmitOptions, ): Promise>; @@ -2491,7 +2539,7 @@ export interface ModalMessageModalSubmitInteraction { message: Message>; channelId: Snowflake; - update(options: InteractionUpdateOptions & { fetchReply: true }): Promise; + update(options: InteractionUpdateOptions & { withResponse: true }): Promise; update( options: string | MessagePayload | InteractionUpdateOptions, ): Promise>>; @@ -2511,7 +2559,7 @@ export class ModalSubmitInteraction extend public message: Message> | null; public replied: boolean; public readonly webhook: InteractionWebhook; - public reply(options: InteractionReplyOptions & { fetchReply: true }): Promise>>; + public reply(options: InteractionReplyOptions & { withResponse: true }): Promise; public reply( options: string | MessagePayload | InteractionReplyOptions, ): Promise>>; @@ -2520,14 +2568,14 @@ export class ModalSubmitInteraction extend options: string | MessagePayload | InteractionEditReplyOptions, ): Promise>>; public deferReply( - options: InteractionDeferReplyOptions & { fetchReply: true }, - ): Promise>>; + options: InteractionDeferReplyOptions & { withResponse: true }, + ): Promise; public deferReply(options?: InteractionDeferReplyOptions): Promise>>; public fetchReply(message?: Snowflake | '@original'): Promise>>; public followUp(options: string | MessagePayload | InteractionReplyOptions): Promise>>; public deferUpdate( - options: InteractionDeferUpdateOptions & { fetchReply: true }, - ): Promise>>; + options: InteractionDeferUpdateOptions & { withResponse: true }, + ): Promise; public deferUpdate(options?: InteractionDeferUpdateOptions): Promise>>; public inGuild(): this is ModalSubmitInteraction<'raw' | 'cached'>; public inCachedGuild(): this is ModalSubmitInteraction<'cached'>; @@ -6147,16 +6195,15 @@ export interface InteractionDeferReplyOptions { Extract, MessageFlags.Ephemeral | MessageFlags.SuppressEmbeds | MessageFlags.SuppressNotifications >; - fetchReply?: boolean; + withResponse?: boolean; } export interface InteractionDeferUpdateOptions { - fetchReply?: boolean; + withResponse?: boolean; } export interface InteractionReplyOptions extends BaseMessageOptionsWithPoll { tts?: boolean; - fetchReply?: boolean; flags?: BitFieldResolvable< Extract, MessageFlags.Ephemeral | MessageFlags.SuppressEmbeds | MessageFlags.SuppressNotifications @@ -6164,7 +6211,7 @@ export interface InteractionReplyOptions extends BaseMessageOptionsWithPoll { } export interface InteractionUpdateOptions extends MessageEditOptions { - fetchReply?: boolean; + withResponse?: boolean; } export interface InviteGenerationOptions { @@ -6675,6 +6722,10 @@ export interface ShardingManagerOptions { execArgv?: readonly string[]; } +export interface ShowModalOptions { + withResponse?: boolean; +} + export { Snowflake }; export type StageInstanceResolvable = StageInstance | Snowflake; diff --git a/packages/discord.js/typings/index.test-d.ts b/packages/discord.js/typings/index.test-d.ts index 0029168dae44..4c3da4abb002 100644 --- a/packages/discord.js/typings/index.test-d.ts +++ b/packages/discord.js/typings/index.test-d.ts @@ -208,6 +208,7 @@ import { GuildScheduledEventManager, SendableChannels, PollData, + InteractionCallbackResponse, } from '.'; import { expectAssignable, expectNotAssignable, expectNotType, expectType } from 'tsd'; import type { ContextMenuCommandBuilder, SlashCommandBuilder } from '@discordjs/builders'; @@ -432,7 +433,7 @@ client.on('messageCreate', async message => { expectAssignable>(message); const component = await message.awaitMessageComponent({ componentType: ComponentType.Button }); expectType>(component); - expectType>(await component.reply({ fetchReply: true })); + expectType(await component.reply({ withResponse: true })); const buttonCollector = message.createMessageComponentCollector({ componentType: ComponentType.Button }); expectType>>(buttonCollector); @@ -1785,36 +1786,36 @@ client.on('interactionCreate', async interaction => { expectType(interaction.component); expectType>(interaction.message); expectType(interaction.guild); - expectType>>(interaction.reply({ content: 'a', fetchReply: true })); - expectType>>(interaction.deferReply({ fetchReply: true })); + expectType>(interaction.reply({ content: 'a', withResponse: true })); + expectType>(interaction.deferReply({ withResponse: true })); expectType>>(interaction.editReply({ content: 'a' })); expectType>>(interaction.fetchReply()); - expectType>>(interaction.update({ content: 'a', fetchReply: true })); - expectType>>(interaction.deferUpdate({ fetchReply: true })); + expectType>(interaction.update({ content: 'a', withResponse: true })); + expectType>(interaction.deferUpdate({ withResponse: true })); expectType>>(interaction.followUp({ content: 'a' })); } else if (interaction.inRawGuild()) { expectAssignable(interaction); expectType(interaction.component); expectType>(interaction.message); expectType(interaction.guild); - expectType>>(interaction.reply({ content: 'a', fetchReply: true })); - expectType>>(interaction.deferReply({ fetchReply: true })); + expectType>(interaction.reply({ content: 'a', withResponse: true })); + expectType>(interaction.deferReply({ withResponse: true })); expectType>>(interaction.editReply({ content: 'a' })); expectType>>(interaction.fetchReply()); - expectType>>(interaction.update({ content: 'a', fetchReply: true })); - expectType>>(interaction.deferUpdate({ fetchReply: true })); + expectType>(interaction.update({ content: 'a', withResponse: true })); + expectType>(interaction.deferUpdate({ withResponse: true })); expectType>>(interaction.followUp({ content: 'a' })); } else if (interaction.inGuild()) { expectAssignable(interaction); expectType(interaction.component); expectType(interaction.message); expectType(interaction.guild); - expectType>(interaction.reply({ content: 'a', fetchReply: true })); - expectType>(interaction.deferReply({ fetchReply: true })); + expectType>(interaction.reply({ content: 'a', withResponse: true })); + expectType>(interaction.deferReply({ withResponse: true })); expectType>(interaction.editReply({ content: 'a' })); expectType>(interaction.fetchReply()); - expectType>(interaction.update({ content: 'a', fetchReply: true })); - expectType>(interaction.deferUpdate({ fetchReply: true })); + expectType>(interaction.update({ content: 'a', withResponse: true })); + expectType>(interaction.deferUpdate({ withResponse: true })); expectType>(interaction.followUp({ content: 'a' })); } } @@ -1848,24 +1849,24 @@ client.on('interactionCreate', async interaction => { expectAssignable(interaction); expectAssignable(interaction.guild); expectAssignable>(interaction); - expectType>>(interaction.reply({ content: 'a', fetchReply: true })); - expectType>>(interaction.deferReply({ fetchReply: true })); + expectType>(interaction.reply({ content: 'a', withResponse: true })); + expectType>(interaction.deferReply({ withResponse: true })); expectType>>(interaction.editReply({ content: 'a' })); expectType>>(interaction.fetchReply()); expectType>>(interaction.followUp({ content: 'a' })); } else if (interaction.inRawGuild()) { expectAssignable(interaction); expectType(interaction.guild); - expectType>>(interaction.reply({ content: 'a', fetchReply: true })); - expectType>>(interaction.deferReply({ fetchReply: true })); + expectType>(interaction.reply({ content: 'a', withResponse: true })); + expectType>(interaction.deferReply({ withResponse: true })); expectType>>(interaction.editReply({ content: 'a' })); expectType>>(interaction.fetchReply()); expectType>>(interaction.followUp({ content: 'a' })); } else if (interaction.inGuild()) { expectAssignable(interaction); expectType(interaction.guild); - expectType>(interaction.reply({ content: 'a', fetchReply: true })); - expectType>(interaction.deferReply({ fetchReply: true })); + expectType>(interaction.reply({ content: 'a', withResponse: true })); + expectType>(interaction.deferReply({ withResponse: true })); expectType>(interaction.editReply({ content: 'a' })); expectType>(interaction.fetchReply()); expectType>(interaction.followUp({ content: 'a' })); @@ -1919,19 +1920,19 @@ client.on('interactionCreate', async interaction => { expectType(interaction.component); expectType>(interaction.message); expectType(interaction.guild); - expectType>>(interaction.reply({ fetchReply: true })); + expectType>(interaction.reply({ withResponse: true })); } else if (interaction.inRawGuild()) { expectAssignable(interaction); expectType(interaction.component); expectType>(interaction.message); expectType(interaction.guild); - expectType>>(interaction.reply({ fetchReply: true })); + expectType>(interaction.reply({ withResponse: true })); } else if (interaction.inGuild()) { expectAssignable(interaction); expectType(interaction.component); expectType(interaction.message); expectAssignable(interaction.guild); - expectType>(interaction.reply({ fetchReply: true })); + expectType>(interaction.reply({ withResponse: true })); } } @@ -1947,19 +1948,19 @@ client.on('interactionCreate', async interaction => { expectType(interaction.component); expectType>(interaction.message); expectType(interaction.guild); - expectType>>(interaction.reply({ fetchReply: true })); + expectType>(interaction.reply({ withResponse: true })); } else if (interaction.inRawGuild()) { expectAssignable(interaction); expectType(interaction.component); expectType>(interaction.message); expectType(interaction.guild); - expectType>>(interaction.reply({ fetchReply: true })); + expectType>(interaction.reply({ withResponse: true })); } else if (interaction.inGuild()) { expectAssignable(interaction); expectType(interaction.component); expectType(interaction.message); expectType(interaction.guild); - expectType>(interaction.reply({ fetchReply: true })); + expectType>(interaction.reply({ withResponse: true })); } } @@ -1970,21 +1971,15 @@ client.on('interactionCreate', async interaction => { if (interaction.inRawGuild()) { expectNotAssignable>(interaction); expectAssignable(interaction); - expectType>>(interaction.reply({ fetchReply: true })); + expectType>(interaction.reply({ withResponse: true })); expectType(interaction.options.getMember('test')); expectType(interaction.options.getChannel('test', true)); expectType(interaction.options.getRole('test', true)); } else if (interaction.inCachedGuild()) { - const msg = await interaction.reply({ fetchReply: true }); - const btn = await msg.awaitMessageComponent({ componentType: ComponentType.Button }); - - expectType>(msg); - expectType>(btn); - expectType(interaction.options.getMember('test')); expectAssignable(interaction); - expectType>>(interaction.reply({ fetchReply: true })); + expectType>(interaction.reply({ withResponse: true })); expectType(interaction.options.getChannel('test', true)); expectType(interaction.options.getRole('test', true)); @@ -2010,7 +2005,7 @@ client.on('interactionCreate', async interaction => { // @ts-expect-error consumeCachedCommand(interaction); expectType(interaction); - expectType>(interaction.reply({ fetchReply: true })); + expectType>(interaction.reply({ withResponse: true })); expectType(interaction.options.getMember('test')); expectType(interaction.options.getChannel('test', true)); @@ -2064,29 +2059,29 @@ client.on('interactionCreate', async interaction => { if (interaction.inCachedGuild()) { expectAssignable(interaction); expectType(interaction.guild); - expectType>>(interaction.reply({ content: 'a', fetchReply: true })); - expectType>>(interaction.deferReply({ fetchReply: true })); + expectType>(interaction.reply({ content: 'a', withResponse: true })); + expectType>(interaction.deferReply({ withResponse: true })); expectType>>(interaction.editReply({ content: 'a' })); expectType>>(interaction.fetchReply()); - expectType>>(interaction.deferUpdate({ fetchReply: true })); + expectType>(interaction.deferUpdate({ withResponse: true })); expectType>>(interaction.followUp({ content: 'a' })); } else if (interaction.inRawGuild()) { expectAssignable(interaction); expectType(interaction.guild); - expectType>>(interaction.reply({ content: 'a', fetchReply: true })); - expectType>>(interaction.deferReply({ fetchReply: true })); + expectType>(interaction.reply({ content: 'a', withResponse: true })); + expectType>(interaction.deferReply({ withResponse: true })); expectType>>(interaction.editReply({ content: 'a' })); expectType>>(interaction.fetchReply()); - expectType>>(interaction.deferUpdate({ fetchReply: true })); + expectType>(interaction.deferUpdate({ withResponse: true })); expectType>>(interaction.followUp({ content: 'a' })); } else if (interaction.inGuild()) { expectAssignable(interaction); expectType(interaction.guild); - expectType>(interaction.reply({ content: 'a', fetchReply: true })); - expectType>(interaction.deferReply({ fetchReply: true })); + expectType>(interaction.reply({ content: 'a', withResponse: true })); + expectType>(interaction.deferReply({ withResponse: true })); expectType>(interaction.editReply({ content: 'a' })); expectType>(interaction.fetchReply()); - expectType>(interaction.deferUpdate({ fetchReply: true })); + expectType>(interaction.deferUpdate({ withResponse: true })); expectType>(interaction.followUp({ content: 'a' })); } }