🤖

discord.js セレクトメニューの選択を解除する方法(new)

に公開

皆さん、セレクトメニューを使っていますか?👂

セレクトメニューって選択すると解除されなくてゴミですよね。
クライアントを再起動すれば解除されるらしいですけど、そんなことを一々ユーザーに求めてはいけません。

かといって、メッセージを編集してセレクトメニューの選択を解除させてませんか?

それって実は...時代遅れです。

メッセージに(編集済)付けちゃってませんか?
今回は、(編集済)タグを付けずにセレクトメニューの選択を解除する方法をお教えします!

仕組み

Discordのメッセージは、メッセージを編集したときに「編集済」とタグが付きますよね。(編集済)
これは、メッセージのフラグ値を変えるだけでは付かないのでインタラクション反応時や反応後にフラグ値を変えてあげればいいです。

注意点

メッセージのフラグ値を編集するときには、基本的には、SuppressEmbedsIsComponentsV2しかdiscord.jsでは受け付けていません。

普通のメッセージとして送信されたメッセージを、一時的なメッセージ(ephemeral)に変更することは仕様的に不可能ですよね。

なので、普通に「お前誰や?って言われます。」

コード

まだ、インタラクションに応答していない場合:

interaction.update({
    flags: MessageFlags.Ephemeral,
});

既に、インタラクションに応答している場合:

interaction.editReply({
    flags: MessageFlags.Ephemeral,
});

サンプルコード

特定のセレクトメニューが選択されたら、モーダル表示し、セレクトメニューの選択を解除するコードです。

export default {
	customId: 'ticket_select',
	run: async (interaction: StringSelectMenuInteraction): Promise<void> => {
		const value = interaction.values[0];

		const modal = new ModalBuilder()
			.setTitle('ticket')
			.setCustomId(`id{ticket_create}`)
			.setComponents(
				new ActionRowBuilder<TextInputBuilder>().setComponents(
					new TextInputBuilder()
						.setCustomId('name')
						.setLabel(`${value} name`)
						.setStyle(TextInputStyle.Short)
				)
			);

		await interaction.showModal(modal);
		await Bun.sleep(2000);
		await interaction.editReply({ flags: MessageFlags.Ephemeral });
	},
};

Discussion