diff --git a/TypeScript/buttonConfirmation.ts b/TypeScript/buttonConfirmation.ts new file mode 100644 index 0000000..7ebeab2 --- /dev/null +++ b/TypeScript/buttonConfirmation.ts @@ -0,0 +1,112 @@ +// @ts-nocheck +/** + * This is buttonConfirmation plugin, it runs confirmation prompt in the form of buttons. + * Note that you need to use edit/editReply in the command itself because we are already replying in the plugin! + * Credits to original plugin of confirmation using reactions and its author! + * + * @author @EvolutionX-10 [<@697795666373640213>] + * @version 1.0.0 + * @example + * ```ts + * import { buttonConfirmation } from "../plugins/buttonConfirmation"; + * import { commandModule } from "@sern/handler"; + * export default commandModule({ + * plugins: [ buttonConfirmation() ], + * execute: (ctx) => { + * //your code here + * } + * }) + * ``` + */ + +import { CommandType, EventPlugin, PluginType } from "@sern/handler"; +import { + ActionRowBuilder, + ButtonBuilder, + ButtonStyle, + ComponentType, +} from "discord.js"; + +export function confirmation( + options?: Partial +): EventPlugin { + return { + type: PluginType.Event, + description: "Confirms", + async execute([ctx], controller) { + options = { + content: "Do you want to proceed?", + denialMessage: "Cancelled", + labels: ["No", "Yes"], + time: 60_000, + wrongUserResponse: "Not for you!", + ...options, + }; + + const buttons = options.labels!.map((l, i) => { + return new ButtonBuilder() + .setCustomId(l) + .setLabel(l) + .setStyle( + i === 0 ? ButtonStyle.Danger : ButtonStyle.Success + ); + }); + const sent = await ctx.reply({ + content: options.content, + components: [ + new ActionRowBuilder().setComponents( + buttons + ), + ], + }); + + const collector = sent.createMessageComponentCollector({ + componentType: ComponentType.Button, + filter: (i) => i.user.id === ctx.user.id, + time: options.time, + }); + + return new Promise((resolve) => { + collector.on("collect", async (i) => { + await i.update({ components: [] }); + collector.stop(); + if (i.customId === options!.labels![1]) { + resolve(controller.next()); + return; + } + await i.editReply({ + content: options?.denialMessage, + }); + resolve(controller.stop()); + }); + + collector.on("end", async (c) => { + if (c.size) return; + buttons.forEach((b) => b.setDisabled()); + await sent.edit({ + components: [ + new ActionRowBuilder().setComponents( + buttons + ), + ], + }); + }); + + collector.on("ignore", async (i) => { + await i.reply({ + content: options?.wrongUserResponse, + ephemeral: true, + }); + }); + }); + }, + }; +} + +interface ConfirmationOptions { + content: string; + denialMessage: string; + time: number; + labels: [string, string]; + wrongUserResponse: string; +}