Modul-System: alle 35 Funktionen im Panel ein- und ausschaltbar
Deploy / check (push) Has been cancelled
Deploy / deploy (push) Has been cancelled

Bisher waren die Schalter über die Oberfläche verstreut: fünf Funktionen
hatten einen Haken, 22 weitere gingen nur über den Umweg „Kanal leeren".
Für jeden außer dem Owner war das nicht auffindbar.

Jetzt steht in src/modules.js ein zentrales Register aller Funktionen mit
Beschreibung, Standard-Zustand und den Einstellungen, die sie brauchen.
Daraus entsteht ein neuer Setup-Tab mit Karten: Schiebeschalter, kurze
Erklärung, Hinweis was noch fehlt ("Fehlt noch: Release-Kanal") und ein
Sprung zu den Einstellungen.

Damit die Schalter keine Attrappen sind, prüfen die Bot-Module jetzt an
18 Stellen zentral, ob sie laufen dürfen — Starboard, Galerie, Modmail,
Willkommen, Protokoll, Auto-Antworten, Sprachkanäle, Erinnerungen,
Events, Twitch/YouTube, Monitor, Wächter, Releases, Rückblick,
Geburtstage, Verlosungen und geplante Beiträge.

Funktionen mit vorhandenem Schalter (Level-System, Backups, Member-Gate …)
nutzen weiterhin dieselbe Einstellung, damit keine zweite Wahrheit
entsteht und bestehende Konfigurationen unverändert weiterlaufen.

Nebenbei gefunden und behoben: Beim Anlegen eines Modmail-Threads wurde
`member.client` benutzt, obwohl es an der Stelle kein `member` gibt — der
erste Modmail-Thread wäre mit einem Fehler abgebrochen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-31 15:53:44 +02:00
co-authored by Claude Fable 5
parent bdbd35883c
commit 59aad27534
16 changed files with 451 additions and 1 deletions
+47
View File
@@ -1603,3 +1603,50 @@ button.with-icon, a.with-icon { justify-content: center; }
@media (max-width: 640px) {
.cmd-name { min-width: 0; }
}
/* ── MODUL-KARTEN ──────────────────────────────────── */
.mod-grid {
display: grid; gap: .9rem;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
}
.mod-card {
display: flex; flex-direction: column; gap: .5rem;
padding: 1.1rem 1.2rem; opacity: .6;
transition: opacity .2s, border-color .2s;
}
.mod-card.on { opacity: 1; }
.mod-head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; }
.mod-name {
font-family: var(--display); font-size: 1.2rem;
letter-spacing: .04em; color: var(--text);
}
.mod-desc { color: var(--muted); font-weight: 300; font-size: .95rem; line-height: 1.45; flex: 1; }
.mod-missing, .mod-ready {
font-family: var(--mono); font-size: .62rem;
letter-spacing: .1em; text-transform: uppercase;
}
.mod-missing { color: var(--neon2); }
.mod-ready { color: var(--success); }
.mod-link {
align-self: flex-start; background: none; border: 0; padding: 0;
font-family: var(--mono); font-size: .62rem; letter-spacing: .15em;
text-transform: uppercase; color: var(--muted2); cursor: pointer;
transition: color .15s;
}
.mod-link:hover { color: var(--neon); }
/* Schiebeschalter */
.mod-switch {
flex: none; width: 42px; height: 24px; border-radius: 999px;
background: var(--bg3); border: 1px solid var(--border);
position: relative; cursor: pointer; padding: 0;
transition: background .2s, border-color .2s;
}
.mod-switch.on { background: var(--neon); border-color: var(--neon); }
.mod-knob {
position: absolute; top: 2px; left: 2px;
width: 18px; height: 18px; border-radius: 50%;
background: var(--muted2); transition: transform .2s, background .2s;
}
.mod-switch.on .mod-knob { transform: translateX(18px); background: #0a0a0a; }
.mod-switch:hover { border-color: var(--neon); }