feat: Introduce modular inventory item effect handling and centralize Discord interaction routing.

This commit is contained in:
syntaxbullet
2025-12-24 12:20:42 +01:00
parent f75cc217e9
commit fcc82292f2
6 changed files with 145 additions and 71 deletions

View File

@@ -0,0 +1,37 @@
import { ButtonInteraction, ModalSubmitInteraction, StringSelectMenuInteraction } from "discord.js";
type InteractionHandler = (interaction: any) => Promise<void>;
interface InteractionRoute {
predicate: (interaction: ButtonInteraction | StringSelectMenuInteraction | ModalSubmitInteraction) => boolean;
handler: () => Promise<any>;
method: string;
}
export const interactionRoutes: InteractionRoute[] = [
{
predicate: (i) => i.customId.startsWith("trade_") || i.customId === "amount",
handler: () => import("@/modules/trade/trade.interaction"),
method: 'handleTradeInteraction'
},
{
predicate: (i) => i.isButton() && i.customId.startsWith("shop_buy_"),
handler: () => import("@/modules/economy/shop.interaction"),
method: 'handleShopInteraction'
},
{
predicate: (i) => i.isButton() && i.customId.startsWith("lootdrop_"),
handler: () => import("@/modules/economy/lootdrop.interaction"),
method: 'handleLootdropInteraction'
},
{
predicate: (i) => i.customId.startsWith("createitem_"),
handler: () => import("@/modules/admin/item_wizard"),
method: 'handleItemWizardInteraction'
},
{
predicate: (i) => i.isButton() && i.customId === "enrollment",
handler: () => import("@/modules/user/enrollment.interaction"),
method: 'handleEnrollmentInteraction'
}
];

View File

@@ -9,25 +9,19 @@ const event: Event<Events.InteractionCreate> = {
execute: async (interaction) => {
// Handle Trade Interactions
if (interaction.isButton() || interaction.isStringSelectMenu() || interaction.isModalSubmit()) {
if (interaction.customId.startsWith("trade_") || interaction.customId === "amount") {
await import("@/modules/trade/trade.interaction").then(m => m.handleTradeInteraction(interaction));
return;
}
if (interaction.customId.startsWith("shop_buy_") && interaction.isButton()) {
await import("@/modules/economy/shop.interaction").then(m => m.handleShopInteraction(interaction));
return;
}
if (interaction.customId.startsWith("lootdrop_") && interaction.isButton()) {
await import("@/modules/economy/lootdrop.interaction").then(m => m.handleLootdropInteraction(interaction));
return;
}
if (interaction.customId.startsWith("createitem_")) {
await import("@/modules/admin/item_wizard").then(m => m.handleItemWizardInteraction(interaction));
return;
}
if (interaction.customId === "enrollment" && interaction.isButton()) {
await import("@/modules/user/enrollment.interaction").then(m => m.handleEnrollmentInteraction(interaction));
return;
const { interactionRoutes } = await import("./interaction.routes");
for (const route of interactionRoutes) {
if (route.predicate(interaction)) {
const module = await route.handler();
const handlerMethod = module[route.method];
if (typeof handlerMethod === 'function') {
await handlerMethod(interaction);
return;
} else {
console.error(`Handler method ${route.method} not found in module`);
}
}
}
}