102 lines
4.2 KiB
JavaScript
102 lines
4.2 KiB
JavaScript
import { api } from '../../services/api.js';
|
|
import { showToast } from '../../ui/toast.js';
|
|
import { setSwitch, getSwitch } from '../../ui/switch.js';
|
|
import { renderWelcomeModule } from './welcome.js';
|
|
import { renderLoggingModule } from './logging.js';
|
|
import { renderReactionRolesModule } from './reactionRoles.js';
|
|
import { renderDynamicVoiceModule } from './dynamicVoice.js';
|
|
import { renderStatuspageModule } from './statuspage.js';
|
|
import { renderServerStatsModule } from './serverstats.js';
|
|
export async function initModulesSection(guildId) {
|
|
const section = document.getElementById('section-modules');
|
|
if (!section)
|
|
return;
|
|
section.innerHTML = `
|
|
<h2 class="section-title">Module</h2>
|
|
<div class="card">
|
|
<div class="module-list" id="module-toggles"></div>
|
|
</div>
|
|
<div class="grid" style="margin-top:16px;">
|
|
<div class="card" id="module-welcome"></div>
|
|
<div class="card" id="module-logging"></div>
|
|
<div class="card" id="module-reactionroles"></div>
|
|
<div class="card" id="module-dynamicvoice"></div>
|
|
<div class="card" id="module-statuspage"></div>
|
|
<div class="card" id="module-serverstats"></div>
|
|
</div>
|
|
`;
|
|
await Promise.all([
|
|
renderModuleToggles(guildId),
|
|
renderWelcomeModule(guildId),
|
|
renderLoggingModule(guildId),
|
|
renderReactionRolesModule(guildId),
|
|
renderDynamicVoiceModule(guildId),
|
|
renderStatuspageModule(guildId),
|
|
renderServerStatsModule(guildId)
|
|
]);
|
|
}
|
|
async function renderModuleToggles(guildId) {
|
|
const container = document.getElementById('module-toggles');
|
|
if (!container)
|
|
return;
|
|
container.innerHTML = '<p class="muted">Lade Module...</p>';
|
|
try {
|
|
const data = await api.modules(guildId);
|
|
const modules = data?.modules || data || {};
|
|
container.innerHTML = '';
|
|
const entries = [
|
|
{ key: 'ticketsEnabled', label: 'Tickets', desc: 'Ticket-System aktivieren' },
|
|
{ key: 'automodEnabled', label: 'Automod', desc: 'Moderations-Filter' },
|
|
{ key: 'welcomeEnabled', label: 'Welcome', desc: 'Begrueßungsnachrichten' },
|
|
{ key: 'musicEnabled', label: 'Musik', desc: 'Musiksteuerung' },
|
|
{ key: 'levelingEnabled', label: 'Leveling', desc: 'XP/Level System' },
|
|
{ key: 'statuspageEnabled', label: 'Statuspage', desc: 'Statusberichte' },
|
|
{ key: 'serverStatsEnabled', label: 'Server Stats', desc: 'Stat-Channel' },
|
|
{ key: 'birthdayEnabled', label: 'Birthday', desc: 'Geburtstagsmodul' },
|
|
{ key: 'reactionRolesEnabled', label: 'Reaction Roles', desc: 'Selbstzuweisbare Rollen' },
|
|
{ key: 'eventsEnabled', label: 'Events', desc: 'Event-Planung' },
|
|
{ key: 'dynamicVoiceEnabled', label: 'Dynamic Voice', desc: 'Dynamische Voice Channels' }
|
|
];
|
|
entries.forEach((entry) => {
|
|
const row = document.createElement('div');
|
|
row.className = 'module-item';
|
|
row.innerHTML = `
|
|
<div class="module-meta">
|
|
<div class="module-title">${entry.label}</div>
|
|
<div class="module-desc">${entry.desc}</div>
|
|
</div>
|
|
<div class="switch ${modules[entry.key] ? 'on' : ''}" data-key="${entry.key}"></div>
|
|
`;
|
|
const toggle = row.querySelector('.switch');
|
|
toggle.addEventListener('click', async () => {
|
|
setSwitch(toggle, !getSwitch(toggle));
|
|
await saveModules(guildId);
|
|
});
|
|
container.appendChild(row);
|
|
});
|
|
}
|
|
catch (err) {
|
|
console.error(err);
|
|
container.innerHTML = '<div class="empty-state">Module konnten nicht geladen werden.</div>';
|
|
showToast('Fehler beim Laden der Module', true);
|
|
}
|
|
}
|
|
async function saveModules(guildId) {
|
|
const toggles = Array.from(document.querySelectorAll('#module-toggles .switch'));
|
|
const payload = { guildId };
|
|
toggles.forEach((t) => {
|
|
const key = t.dataset.key;
|
|
if (!key)
|
|
return;
|
|
payload[key] = t.classList.contains('on');
|
|
});
|
|
try {
|
|
await api.saveSettings(payload);
|
|
showToast('Module gespeichert');
|
|
}
|
|
catch (err) {
|
|
console.error(err);
|
|
showToast('Module speichern fehlgeschlagen', true);
|
|
}
|
|
}
|