From 71e2d1c0887936a4cde88378c9d52cf896a1001b Mon Sep 17 00:00:00 2001 From: Nix Krystik Date: Wed, 14 Oct 2026 12:18:35 +0800 Subject: [PATCH] (buttons): Hook up buttons. Pre-testing. --- .../{claim-ticket.ts => claimTicket.ts} | 2 +- ...{close-mod-ticket.ts => closeModTicket.ts} | 2 +- .../{close-ticket.ts => closeTicket.ts} | 2 +- src/buttons/{dev-watch.ts => devWatch.ts} | 2 +- src/buttons/index.ts | 27 +++++++++++++++++++ src/buttons/{note-next.ts => noteNext.ts} | 0 .../{note-previous.ts => notePrevious.ts} | 0 ...age.ts => openTicketForReportedMessage.ts} | 2 +- .../{private-help.ts => privateHelp.ts} | 2 +- .../{records-next.ts => recordsNext.ts} | 0 ...records-previous.ts => recordsPrevious.ts} | 0 src/buttons/{role-button.ts => roleButton.ts} | 2 +- .../{unclaim-ticket.ts => unclaimTicket.ts} | 2 +- src/index.ts | 13 +++++---- src/types/button.d.ts | 2 +- 15 files changed, 42 insertions(+), 16 deletions(-) rename src/buttons/{claim-ticket.ts => claimTicket.ts} (98%) rename src/buttons/{close-mod-ticket.ts => closeModTicket.ts} (97%) rename src/buttons/{close-ticket.ts => closeTicket.ts} (97%) rename src/buttons/{dev-watch.ts => devWatch.ts} (97%) create mode 100644 src/buttons/index.ts rename src/buttons/{note-next.ts => noteNext.ts} (100%) rename src/buttons/{note-previous.ts => notePrevious.ts} (100%) rename src/buttons/{open-ticket-for-reported-message.ts => openTicketForReportedMessage.ts} (98%) rename src/buttons/{private-help.ts => privateHelp.ts} (96%) rename src/buttons/{records-next.ts => recordsNext.ts} (100%) rename src/buttons/{records-previous.ts => recordsPrevious.ts} (100%) rename src/buttons/{role-button.ts => roleButton.ts} (97%) rename src/buttons/{unclaim-ticket.ts => unclaimTicket.ts} (98%) diff --git a/src/buttons/claim-ticket.ts b/src/buttons/claimTicket.ts similarity index 98% rename from src/buttons/claim-ticket.ts rename to src/buttons/claimTicket.ts index 7348e99..a6d881a 100644 --- a/src/buttons/claim-ticket.ts +++ b/src/buttons/claimTicket.ts @@ -5,7 +5,7 @@ import { Button } from '../types'; class ClaimTicketButton implements Button { id = 'claim-ticket'; - async execute(context: Client, interaction: ButtonInteraction, ...args: any[]): Promise { + async execute(context: Client, interaction: ButtonInteraction): Promise { if (!interaction.inGuild()) return; await interaction.deferReply({ flags: [MessageFlags.Ephemeral] }); diff --git a/src/buttons/close-mod-ticket.ts b/src/buttons/closeModTicket.ts similarity index 97% rename from src/buttons/close-mod-ticket.ts rename to src/buttons/closeModTicket.ts index 78b598c..e1acaeb 100644 --- a/src/buttons/close-mod-ticket.ts +++ b/src/buttons/closeModTicket.ts @@ -4,7 +4,7 @@ import { Button } from '../types'; class CloseModTicketButton implements Button { id = 'close-mod-ticket'; - async execute(context: Client, interaction: ButtonInteraction, ...args: any[]): Promise { + async execute(context: Client, interaction: ButtonInteraction): Promise { if (!interaction.inGuild()) return; await interaction.deferReply({ flags: MessageFlags.Ephemeral }); diff --git a/src/buttons/close-ticket.ts b/src/buttons/closeTicket.ts similarity index 97% rename from src/buttons/close-ticket.ts rename to src/buttons/closeTicket.ts index b23b7d5..9801647 100644 --- a/src/buttons/close-ticket.ts +++ b/src/buttons/closeTicket.ts @@ -5,7 +5,7 @@ import { Button } from '../types'; class CloseTicketButton implements Button { id = 'close-ticket'; - async execute(context: Client, interaction: ButtonInteraction, ...args: any[]): Promise { + async execute(context: Client, interaction: ButtonInteraction): Promise { if (!interaction.inGuild()) return; await interaction.deferReply({ flags: MessageFlags.Ephemeral }); diff --git a/src/buttons/dev-watch.ts b/src/buttons/devWatch.ts similarity index 97% rename from src/buttons/dev-watch.ts rename to src/buttons/devWatch.ts index c6fff09..0f6342b 100644 --- a/src/buttons/dev-watch.ts +++ b/src/buttons/devWatch.ts @@ -5,7 +5,7 @@ import { Button } from '../types'; class DevWatchButton implements Button { id = 'dev-watch'; - async execute(context: Client, interaction: ButtonInteraction, ...args: any[]): Promise { + async execute(context: Client, interaction: ButtonInteraction): Promise { if (!interaction.inGuild()) return; await interaction.deferReply({ flags: MessageFlags.Ephemeral }); diff --git a/src/buttons/index.ts b/src/buttons/index.ts new file mode 100644 index 0000000..10f0b34 --- /dev/null +++ b/src/buttons/index.ts @@ -0,0 +1,27 @@ +import claimTicket from "./claimTicket"; +import closeModTicket from "./closeModTicket"; +import closeTicket from "./closeTicket"; +import devWatch from "./devWatch"; +import noteNext from "./noteNext"; +import notePrevious from "./notePrevious"; +import openTicketForReportedMessage from "./openTicketForReportedMessage"; +import privateHelp from "./privateHelp"; +import recordsNext from "./recordsNext"; +import recordsPrevious from "./recordsPrevious"; +import roleButton from "./roleButton"; +import unclaimTicket from "./unclaimTicket"; + +export default [ + claimTicket, + closeModTicket, + closeTicket, + devWatch, + noteNext, + notePrevious, + openTicketForReportedMessage, + privateHelp, + recordsNext, + recordsPrevious, + roleButton, + unclaimTicket +]; \ No newline at end of file diff --git a/src/buttons/note-next.ts b/src/buttons/noteNext.ts similarity index 100% rename from src/buttons/note-next.ts rename to src/buttons/noteNext.ts diff --git a/src/buttons/note-previous.ts b/src/buttons/notePrevious.ts similarity index 100% rename from src/buttons/note-previous.ts rename to src/buttons/notePrevious.ts diff --git a/src/buttons/open-ticket-for-reported-message.ts b/src/buttons/openTicketForReportedMessage.ts similarity index 98% rename from src/buttons/open-ticket-for-reported-message.ts rename to src/buttons/openTicketForReportedMessage.ts index 1a7437e..b2ea268 100644 --- a/src/buttons/open-ticket-for-reported-message.ts +++ b/src/buttons/openTicketForReportedMessage.ts @@ -5,7 +5,7 @@ import { createPrivateHelpTicketThread } from '../utils'; class OpenTicketForReportedMessageButton implements Button { id = 'open-ticket-for-reported-message'; - async execute(context: Client, interaction: ButtonInteraction, ...args: any[]): Promise { + async execute(context: Client, interaction: ButtonInteraction): Promise { if (!interaction.inGuild()) return; await interaction.deferReply({ flags: MessageFlags.Ephemeral }); diff --git a/src/buttons/private-help.ts b/src/buttons/privateHelp.ts similarity index 96% rename from src/buttons/private-help.ts rename to src/buttons/privateHelp.ts index d1595e0..e35d793 100644 --- a/src/buttons/private-help.ts +++ b/src/buttons/privateHelp.ts @@ -5,7 +5,7 @@ import { canOpenPrivateHelpTicket, createTextInput } from '../utils'; class PrivateHelpButton implements Button { id = 'private-help'; - async execute(context: Client, interaction: ButtonInteraction, ...args: any[]): Promise { + async execute(context: Client, interaction: ButtonInteraction): Promise { try { if (!await canOpenPrivateHelpTicket(interaction.user.id)) throw new Error('You can only have one open ticket at a time that is less than a day old.'); diff --git a/src/buttons/records-next.ts b/src/buttons/recordsNext.ts similarity index 100% rename from src/buttons/records-next.ts rename to src/buttons/recordsNext.ts diff --git a/src/buttons/records-previous.ts b/src/buttons/recordsPrevious.ts similarity index 100% rename from src/buttons/records-previous.ts rename to src/buttons/recordsPrevious.ts diff --git a/src/buttons/role-button.ts b/src/buttons/roleButton.ts similarity index 97% rename from src/buttons/role-button.ts rename to src/buttons/roleButton.ts index c411dd4..49f93a6 100644 --- a/src/buttons/role-button.ts +++ b/src/buttons/roleButton.ts @@ -5,7 +5,7 @@ import { Button } from '../types'; class RoleButtonButton implements Button { id = 'role-button'; - async execute(context: Client, interaction: ButtonInteraction, ...args: any[]): Promise { + async execute(context: Client, interaction: ButtonInteraction): Promise { if (!interaction.inGuild()) return; await interaction.deferReply({ flags: MessageFlags.Ephemeral }); diff --git a/src/buttons/unclaim-ticket.ts b/src/buttons/unclaimTicket.ts similarity index 98% rename from src/buttons/unclaim-ticket.ts rename to src/buttons/unclaimTicket.ts index ccebe5e..651ab31 100644 --- a/src/buttons/unclaim-ticket.ts +++ b/src/buttons/unclaimTicket.ts @@ -5,7 +5,7 @@ import { Button } from '../types'; class UnclaimTicketButton implements Button { id = 'unclaim-ticket'; - async execute(context: Client, interaction: ButtonInteraction, ...args: any[]): Promise { + async execute(context: Client, interaction: ButtonInteraction): Promise { if (!interaction.inGuild()) return; await interaction.deferReply(); diff --git a/src/index.ts b/src/index.ts index ddb79b0..5d83a57 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ import { Client, GatewayIntentBits, MessageFlags, Partials } from 'discord.js'; +import buttons from './buttons'; import { config } from './config'; import events from './events'; import { Database } from './shared/Database'; @@ -37,7 +38,6 @@ const client = new Client({ const commands: Handler[] = []; const contextMenus: Handler[] = []; -const buttons: Handler[] = []; const modals: Handler[] = []; const menus: Handler[] = []; @@ -93,10 +93,11 @@ client.on('interactionCreate', async (interaction) => { const id = interaction.customId.split('_')[0]; for (const button of buttons) { - if (id == button.name) { - button.handler(client, interaction, ...interaction.customId.split('_').slice(1)); - return; - } + if (button.id != id) continue; + + Promise.resolve((button.execute as (context: Client, ...args: unknown[]) => Promise)(client, ...interaction.customId.split('_').slice(1)) + .catch(e => console.error('An error occurred while handling a button interaction: ', e))); + return; } } else if (interaction.isModalSubmit()) { // Handle modal submissions. @@ -126,14 +127,12 @@ client.on('clientReady', async () => { await loadHandlersFrom('commands', commands); await loadHandlersFrom('context-menus', contextMenus); - await loadHandlersFrom('buttons', buttons); await loadHandlersFrom('modals', modals); await loadHandlersFrom('menus', menus); await refreshCommands(client); await initIfNecessary(client, commands); - await initIfNecessary(client, buttons); await initIfNecessary(client, modals); await initIfNecessary(client, menus); diff --git a/src/types/button.d.ts b/src/types/button.d.ts index 8ddfd86..eff6569 100644 --- a/src/types/button.d.ts +++ b/src/types/button.d.ts @@ -2,5 +2,5 @@ import { ButtonInteraction } from "discord.js"; export interface Button { id: string; - execute(context: Context, interaction: ButtonInteraction, ...args: any[]): Promise; + execute(context: Context, interaction: ButtonInteraction, ...args: any): Promise; } \ No newline at end of file