From 0f98d596184046da42edd5f65a2f7ba62936d338 Mon Sep 17 00:00:00 2001 From: MapleLeaf <19603573+itsMapleLeaf@users.noreply.github.com> Date: Tue, 28 Dec 2021 13:59:53 -0600 Subject: [PATCH] support ephemeral command replies with missing pieces --- library/core/reacord-discord-js.ts | 45 ++++++++++++++++++++++++++++++ library/core/reacord-tester.ts | 4 +++ library/core/reacord.ts | 1 + playground/main.tsx | 15 ++++++++++ test/ephemeral-reply.test.ts | 2 ++ todo.md | 4 ++- 6 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 test/ephemeral-reply.test.ts diff --git a/library/core/reacord-discord-js.ts b/library/core/reacord-discord-js.ts index fec57e6..dd82e52 100644 --- a/library/core/reacord-discord-js.ts +++ b/library/core/reacord-discord-js.ts @@ -72,6 +72,34 @@ export class ReacordDiscordJs extends Reacord { initialContent, ) } + + override ephemeralReply( + interaction: Discord.CommandInteraction, + initialContent?: React.ReactNode, + ): ReacordInstance { + return this.createInstance( + new CommandReplyRenderer({ + type: "command", + id: interaction.id, + channelId: interaction.channelId, + reply: async (options) => { + await interaction.reply({ + ...getDiscordMessageOptions(options), + ephemeral: true, + }) + return createEphemeralReacordMessage() + }, + followUp: async (options) => { + await interaction.followUp({ + ...getDiscordMessageOptions(options), + ephemeral: true, + }) + return createEphemeralReacordMessage() + }, + }), + initialContent, + ) + } } function createReacordComponentInteraction( @@ -176,3 +204,20 @@ function createReacordMessage(message: Discord.Message): Message { }, } } + +function createEphemeralReacordMessage(): Message { + return { + edit: () => { + console.warn("Ephemeral messages can't be edited") + return Promise.resolve() + }, + disableComponents: () => { + console.warn("Ephemeral messages can't be edited") + return Promise.resolve() + }, + delete: () => { + console.warn("Ephemeral messages can't be deleted") + return Promise.resolve() + }, + } +} diff --git a/library/core/reacord-tester.ts b/library/core/reacord-tester.ts index dfe3908..1e3ea23 100644 --- a/library/core/reacord-tester.ts +++ b/library/core/reacord-tester.ts @@ -52,6 +52,10 @@ export class ReacordTester extends Reacord { ) } + override ephemeralReply(): ReacordInstance { + return this.reply() + } + async assertMessages(expected: ReturnType) { await nextTickPromise() expect(this.sampleMessages()).toEqual(expected) diff --git a/library/core/reacord.ts b/library/core/reacord.ts index 0c60c5b..1708869 100644 --- a/library/core/reacord.ts +++ b/library/core/reacord.ts @@ -28,6 +28,7 @@ export abstract class Reacord { abstract send(...args: unknown[]): ReacordInstance abstract reply(...args: unknown[]): ReacordInstance + abstract ephemeralReply(...args: unknown[]): ReacordInstance protected handleComponentInteraction(interaction: ComponentInteraction) { for (const renderer of this.renderers) { diff --git a/playground/main.tsx b/playground/main.tsx index 0fb47d0..3d47a1e 100644 --- a/playground/main.tsx +++ b/playground/main.tsx @@ -61,6 +61,21 @@ createCommandHandler(client, [ reacord.reply(interaction, ) }, }, + { + name: "ephemeral-button", + description: "button which shows ephemeral messages", + run: (interaction) => { + reacord.reply( + interaction, +