Files
Papo/src/services/moduleService.ts

81 lines
3.7 KiB
TypeScript

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<ModuleKey, { name: string; description: string }> = {
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<Record<ModuleKey, { onEnable?: (guildId: string) => Promise<void> | void; onDisable?: (guildId: string) => Promise<void> | void }>> =
{};
public setHooks(hooks: Partial<Record<ModuleKey, { onEnable?: (guildId: string) => Promise<void> | void; onDisable?: (guildId: string) => Promise<void> | void }>>) {
this.hooks = hooks;
}
public async getModulesForGuild(guildId: string): Promise<GuildModuleState[]> {
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);
}
}