diff --git a/backend/src/utils.ts b/backend/src/utils.ts index a6c949ed..0f99a3b1 100644 --- a/backend/src/utils.ts +++ b/backend/src/utils.ts @@ -1,5 +1,7 @@ import { + ActionRowBuilder, APIEmbed, + ButtonBuilder, ChannelType, ChatInputCommandInteraction, Client, @@ -18,6 +20,7 @@ import { InviteType, LimitedCollection, Message, + MessageActionRowComponentBuilder, MessageCreateOptions, MessageMentionOptions, PartialChannelData, @@ -1321,6 +1324,20 @@ export async function confirm( return waitForButtonConfirm(context, content, { restrictToId: userId }); } +export function createDisabledButtonRow( + row: ActionRowBuilder +): ActionRowBuilder { + const newRow = new ActionRowBuilder(); + for (const component of row.components) { + if (component instanceof ButtonBuilder) { + newRow.addComponents( + ButtonBuilder.from(component).setDisabled(true) + ); + } + } + return newRow; +} + export function messageSummary(msg: SavedMessage) { // Regular text content let result = "```\n" + (msg.data.content ? escapeCodeBlock(msg.data.content) : "") + "```"; diff --git a/backend/src/utils/waitForInteraction.ts b/backend/src/utils/waitForInteraction.ts index d0eec4d2..f1b198d2 100644 --- a/backend/src/utils/waitForInteraction.ts +++ b/backend/src/utils/waitForInteraction.ts @@ -9,7 +9,7 @@ import { import moment from "moment"; import { v4 as uuidv4 } from "uuid"; import { GenericCommandSource, isContextInteraction, sendContextResponse } from "../pluginUtils.js"; -import { noop } from "../utils.js"; +import { noop, createDisabledButtonRow } from "../utils.js"; export async function waitForButtonConfirm( context: GenericCommandSource, @@ -24,34 +24,42 @@ export async function waitForButtonConfirm( .setStyle(ButtonStyle.Success) .setLabel(options?.confirmText || "Confirm") .setCustomId(`confirmButton:${idMod}:${uuidv4()}`), - new ButtonBuilder() .setStyle(ButtonStyle.Danger) .setLabel(options?.cancelText || "Cancel") .setCustomId(`cancelButton:${idMod}:${uuidv4()}`), ]); const message = await sendContextResponse(context, { ...toPost, components: [row] }, true); - const collector = message.createMessageComponentCollector({ time: 10000 }); collector.on("collect", (interaction: MessageComponentInteraction) => { if (options?.restrictToId && options.restrictToId !== interaction.user.id) { interaction .reply({ content: `You are not permitted to use these buttons.`, ephemeral: true }) - // tslint:disable-next-line no-console - .catch((err) => console.trace(err.message)); - } else { - if (interaction.customId.startsWith(`confirmButton:${idMod}:`)) { - if (!contextIsInteraction) message.delete(); - resolve(true); - } else if (interaction.customId.startsWith(`cancelButton:${idMod}:`)) { - if (!contextIsInteraction) message.delete(); - resolve(false); + .catch(noop); + } else if (interaction.customId.startsWith(`confirmButton:${idMod}:`)) { + if (!contextIsInteraction) { + message.delete().catch(noop); + } else { + interaction.update({ components: [createDisabledButtonRow(row)] }).catch(noop); } + resolve(true); + } else if (interaction.customId.startsWith(`cancelButton:${idMod}:`)) { + if (!contextIsInteraction) { + message.delete().catch(noop); + } else { + interaction.update({ components: [createDisabledButtonRow(row)] }).catch(noop); + } + resolve(false); } }); + collector.on("end", () => { - if (!contextIsInteraction && message.deletable) message.delete().catch(noop); + if (!contextIsInteraction) { + if (message.deletable) message.delete().catch(noop); + } else { + message.edit({ components: [createDisabledButtonRow(row)] }).catch(noop); + } resolve(false); }); });