Skip to content

Commit 48a9c66

Browse files
authored
refactor(InteractionResponses)!: Remove ephemeral response option (#10564)
BREAKING CHANGE: MessagePayload#isInteraction no longer serves a purpose and has been removed. BREAKING CHANGE: InteractionDeferReplyOptions no longer accepts ephemeral. Use flags instead. BREAKING CHANGE: InteractionReplyOptions no longer accepts ephemeral. Use flags instead.
1 parent 6cbe248 commit 48a9c66

File tree

4 files changed

+28
-36
lines changed

4 files changed

+28
-36
lines changed

packages/discord.js/src/structures/MessagePayload.js

+1-20
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
'use strict';
22

33
const { Buffer } = require('node:buffer');
4-
const { lazy, isJSONEncodable } = require('@discordjs/util');
4+
const { isJSONEncodable } = require('@discordjs/util');
55
const { DiscordSnowflake } = require('@sapphire/snowflake');
6-
const { MessageFlags } = require('discord-api-types/v10');
76
const ActionRowBuilder = require('./ActionRowBuilder');
87
const { DiscordjsError, DiscordjsRangeError, ErrorCodes } = require('../errors');
98
const { resolveFile } = require('../util/DataResolver');
109
const MessageFlagsBitField = require('../util/MessageFlagsBitField');
1110
const { basename, verifyString, resolvePartialEmoji } = require('../util/Util');
1211

13-
const getBaseInteraction = lazy(() => require('./BaseInteraction'));
14-
1512
/**
1613
* Represents a message to be sent to the API.
1714
*/
@@ -88,17 +85,6 @@ class MessagePayload {
8885
return this.target instanceof MessageManager;
8986
}
9087

91-
/**
92-
* Whether or not the target is an {@link BaseInteraction} or an {@link InteractionWebhook}
93-
* @type {boolean}
94-
* @readonly
95-
*/
96-
get isInteraction() {
97-
const BaseInteraction = getBaseInteraction();
98-
const InteractionWebhook = require('./InteractionWebhook');
99-
return this.target instanceof BaseInteraction || this.target instanceof InteractionWebhook;
100-
}
101-
10288
/**
10389
* Makes the content of this message.
10490
* @returns {?string}
@@ -120,7 +106,6 @@ class MessagePayload {
120106
*/
121107
resolveBody() {
122108
if (this.body) return this;
123-
const isInteraction = this.isInteraction;
124109
const isWebhook = this.isWebhook;
125110

126111
const content = this.makeContent();
@@ -175,10 +160,6 @@ class MessagePayload {
175160
: this.target.flags?.bitfield;
176161
}
177162

178-
if (isInteraction && this.options.ephemeral) {
179-
flags |= MessageFlags.Ephemeral;
180-
}
181-
182163
let allowedMentions =
183164
this.options.allowedMentions === undefined
184165
? this.target.client.options.allowedMentions

packages/discord.js/src/structures/interfaces/InteractionResponses.js

+11-12
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
const { isJSONEncodable } = require('@discordjs/util');
44
const { InteractionResponseType, MessageFlags, Routes, InteractionType } = require('discord-api-types/v10');
55
const { DiscordjsError, ErrorCodes } = require('../../errors');
6-
const MessageFlagsBitField = require('../../util/MessageFlagsBitField');
76
const InteractionCollector = require('../InteractionCollector');
87
const InteractionResponse = require('../InteractionResponse');
98
const MessagePayload = require('../MessagePayload');
@@ -23,7 +22,8 @@ class InteractionResponses {
2322
/**
2423
* Options for deferring the reply to an {@link BaseInteraction}.
2524
* @typedef {Object} InteractionDeferReplyOptions
26-
* @property {boolean} [ephemeral] Whether the reply should be ephemeral
25+
* @property {MessageFlagsResolvable} [flags] Flags for the reply.
26+
* <info>Only `MessageFlags.Ephemeral` can be set.</info>
2727
* @property {boolean} [fetchReply] Whether to fetch the reply
2828
*/
2929

@@ -37,9 +37,8 @@ class InteractionResponses {
3737
* Options for a reply to a {@link BaseInteraction}.
3838
* @typedef {BaseMessageOptionsWithPoll} InteractionReplyOptions
3939
* @property {boolean} [tts=false] Whether the message should be spoken aloud
40-
* @property {boolean} [ephemeral] Whether the reply should be ephemeral
4140
* @property {boolean} [fetchReply] Whether to fetch the reply
42-
* @property {MessageFlags} [flags] Which flags to set for the message.
41+
* @property {MessageFlagsResolvable} [flags] Which flags to set for the message.
4342
* <info>Only `MessageFlags.Ephemeral`, `MessageFlags.SuppressEmbeds`, and `MessageFlags.SuppressNotifications`
4443
* can be set.</info>
4544
*/
@@ -61,24 +60,25 @@ class InteractionResponses {
6160
* .catch(console.error)
6261
* @example
6362
* // Defer to send an ephemeral reply later
64-
* interaction.deferReply({ ephemeral: true })
63+
* interaction.deferReply({ flags: MessageFlags.Ephemeral })
6564
* .then(console.log)
6665
* .catch(console.error);
6766
*/
6867
async deferReply(options = {}) {
6968
if (this.deferred || this.replied) throw new DiscordjsError(ErrorCodes.InteractionAlreadyReplied);
70-
this.ephemeral = options.ephemeral ?? false;
69+
7170
await this.client.rest.post(Routes.interactionCallback(this.id, this.token), {
7271
body: {
7372
type: InteractionResponseType.DeferredChannelMessageWithSource,
7473
data: {
75-
flags: options.ephemeral ? MessageFlags.Ephemeral : undefined,
74+
flags: options.flags,
7675
},
7776
},
7877
auth: false,
7978
});
80-
this.deferred = true;
8179

80+
this.deferred = true;
81+
this.ephemeral = Boolean(options.flags & MessageFlags.Ephemeral);
8282
return options.fetchReply ? this.fetchReply() : new InteractionResponse(this);
8383
}
8484

@@ -96,7 +96,7 @@ class InteractionResponses {
9696
* // Create an ephemeral reply with an embed
9797
* const embed = new EmbedBuilder().setDescription('Pong!');
9898
*
99-
* interaction.reply({ embeds: [embed], ephemeral: true })
99+
* interaction.reply({ embeds: [embed], flags: MessageFlags.Ephemeral })
100100
* .then(() => console.log('Reply sent.'))
101101
* .catch(console.error);
102102
*/
@@ -109,8 +109,6 @@ class InteractionResponses {
109109

110110
const { body: data, files } = await messagePayload.resolveBody().resolveFiles();
111111

112-
this.ephemeral = new MessageFlagsBitField(data.flags).has(MessageFlags.Ephemeral);
113-
114112
await this.client.rest.post(Routes.interactionCallback(this.id, this.token), {
115113
body: {
116114
type: InteractionResponseType.ChannelMessageWithSource,
@@ -119,8 +117,9 @@ class InteractionResponses {
119117
files,
120118
auth: false,
121119
});
122-
this.replied = true;
123120

121+
this.ephemeral = Boolean(options.flags & MessageFlags.Ephemeral);
122+
this.replied = true;
124123
return options.fetchReply ? this.fetchReply() : new InteractionResponse(this);
125124
}
126125

packages/discord.js/src/util/MessageFlagsBitField.js

+9
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@ class MessageFlagsBitField extends BitField {
2323
* @param {BitFieldResolvable} [bits=0] Bit(s) to read from
2424
*/
2525

26+
/**
27+
* Data that can be resolved to give a message flags bit field. This can be:
28+
* * A string (see {@link MessageFlagsBitField.Flags})
29+
* * A message flag
30+
* * An instance of {@link MessageFlagsBitField}
31+
* * An array of `MessageFlagsResolvable`
32+
* @typedef {string|number|MessageFlagsBitField|MessageFlagsResolvable[]} MessageFlagsResolvable
33+
*/
34+
2635
/**
2736
* Bitfield of the packed bits
2837
* @type {number}

packages/discord.js/typings/index.d.ts

+7-4
Original file line numberDiff line numberDiff line change
@@ -2398,7 +2398,6 @@ export class MessagePayload {
23982398
public get isWebhook(): boolean;
23992399
public get isMessage(): boolean;
24002400
public get isMessageManager(): boolean;
2401-
public get isInteraction(): boolean;
24022401
public files: RawFile[] | null;
24032402
public options: MessagePayloadOption;
24042403
public target: MessageTarget;
@@ -6066,15 +6065,19 @@ export interface InteractionCollectorOptions<
60666065
}
60676066

60686067
export interface InteractionDeferReplyOptions {
6069-
ephemeral?: boolean;
6068+
flags?: BitFieldResolvable<
6069+
Extract<MessageFlagsString, 'Ephemeral' | 'SuppressEmbeds' | 'SuppressNotifications'>,
6070+
MessageFlags.Ephemeral | MessageFlags.SuppressEmbeds | MessageFlags.SuppressNotifications
6071+
>;
60706072
fetchReply?: boolean;
60716073
}
60726074

6073-
export interface InteractionDeferUpdateOptions extends Omit<InteractionDeferReplyOptions, 'ephemeral'> {}
6075+
export interface InteractionDeferUpdateOptions {
6076+
fetchReply?: boolean;
6077+
}
60746078

60756079
export interface InteractionReplyOptions extends BaseMessageOptionsWithPoll {
60766080
tts?: boolean;
6077-
ephemeral?: boolean;
60786081
fetchReply?: boolean;
60796082
flags?: BitFieldResolvable<
60806083
Extract<MessageFlagsString, 'Ephemeral' | 'SuppressEmbeds' | 'SuppressNotifications'>,

0 commit comments

Comments
 (0)