import { settingsStore } from '../config/state'; export type ModuleKey = | 'ticketsEnabled' | 'automodEnabled' | 'levelingEnabled' | 'musicEnabled' | 'welcomeEnabled' | 'dynamicVoiceEnabled' | 'statuspageEnabled' | 'birthdayEnabled' | 'reactionRolesEnabled' | 'eventsEnabled'; export interface GuildModuleState { key: ModuleKey; name: string; description: string; enabled: boolean; } const MODULES: Record = { ticketsEnabled: { name: 'Ticketsystem', description: 'Ticket-Panel, Buttons, Transcript-Export.' }, automodEnabled: { name: 'Automod', description: 'Linkfilter und Anti-Spam Timeout.' }, levelingEnabled: { name: 'Leveling', description: 'XP/Level-Tracking und /rank.' }, musicEnabled: { name: 'Musik', description: 'Wiedergabe, Queue, Loop, Pause/Resume.' }, welcomeEnabled: { name: 'Willkommensnachrichten', description: 'Begruessungs-Embed beim Join.' }, dynamicVoiceEnabled: { name: 'Dynamische Voice Channels', description: 'Erzeugt private Voice-Channels aus einer Lobby.' }, statuspageEnabled: { name: 'Statuspage', description: 'Service Checks, Uptime und Status-Embed.' }, birthdayEnabled: { name: 'Birthday', description: 'Geburtstage speichern und Glueckwuensche senden.' }, reactionRolesEnabled: { name: 'Reaction Roles', description: 'Reaktionen vergeben und entfernen Rollen.' }, eventsEnabled: { name: 'Termine', description: 'Events planen, erinnern und Anmeldungen sammeln.' } }; export class BotModuleService { private hooks: Partial Promise | void; onDisable?: (guildId: string) => Promise | void }>> = {}; public setHooks(hooks: Partial Promise | void; onDisable?: (guildId: string) => Promise | void }>>) { this.hooks = hooks; } public async getModulesForGuild(guildId: string): Promise { const cfg = settingsStore.get(guildId) ?? {}; return Object.entries(MODULES).map(([key, meta]) => { let enabled = cfg[key as ModuleKey] === true; if (key === 'automodEnabled') enabled = cfg.automodEnabled === true; if (key === 'welcomeEnabled') enabled = cfg.welcomeConfig?.enabled === true || cfg.automodConfig?.welcomeConfig?.enabled === true; if (key === 'dynamicVoiceEnabled') enabled = cfg.dynamicVoiceEnabled === true || (cfg.dynamicVoiceConfig as any)?.enabled === true; if (key === 'statuspageEnabled') enabled = cfg.statuspageEnabled === true || cfg.automodConfig?.statuspageEnabled === true; if (key === 'birthdayEnabled') enabled = cfg.birthdayEnabled === true || cfg.birthdayConfig?.enabled === true; if (key === 'reactionRolesEnabled') enabled = cfg.reactionRolesEnabled === true || cfg.reactionRolesConfig?.enabled === true; if (key === 'eventsEnabled') enabled = (cfg as any).eventsEnabled !== false; return { key: key as ModuleKey, name: meta.name, description: meta.description, enabled }; }); } public async enableModule(guildId: string, key: ModuleKey) { if (key === 'welcomeEnabled') { await settingsStore.set(guildId, { welcomeConfig: { enabled: true } } as any); } else { await settingsStore.set(guildId, { [key]: true } as any); } await this.hooks[key]?.onEnable?.(guildId); } public async disableModule(guildId: string, key: ModuleKey) { if (key === 'welcomeEnabled') { await settingsStore.set(guildId, { welcomeConfig: { enabled: false } } as any); } else { await settingsStore.set(guildId, { [key]: false } as any); } await this.hooks[key]?.onDisable?.(guildId); } }