Carl-Bot-Paket: Moderation, Auto-/Sticky-Roles, Level-System, Tags, geplante Posts

- Moderation: /warn (DM + Mod-Log), /warns (Historie + löschen), /timeout (max 28d),
  /purge (bulk, 14-Tage-Limit sauber gemeldet); Mod-Log erweitert um Join/Leave
  und Nick-/Rollen-Änderungen
- Auto-Rolle bei Join + Sticky-Roles (Rollen bei Leave gesichert, bei Rejoin
  wiederhergestellt; managed/@everyone ausgenommen) — Rollen-Tab
- Level-System (opt-in): 15-25 XP/Nachricht mit 60s-Cooldown, MEE6-Formel,
  Level-Up-Announce, Rollen-Belohnungen (Level=RolleID), /rank mit Fortschritt,
  öffentliche Bestenliste /level; Community-Tab
- Tags: /tag mit Autocomplete, Verwaltung im Composer-Tab (/api/tags)
- Geplante Posts: einmalig/täglich/wöchentlich, Minuten-Scheduler, DST-sicher
  über Neuberechnung aus Zeitfeldern; Composer-Tab (/api/scheduled)
- Autocomplete-Dispatch im InteractionCreate; alles smoke-getestet

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-30 00:30:23 +02:00
co-authored by Claude Fable 5
parent a27a594a07
commit db9c7d07c9
19 changed files with 1066 additions and 5 deletions
+39
View File
@@ -881,3 +881,42 @@ a.sha:hover { border-color: var(--neon); background: rgba(245, 197, 24, .07); }
}
.toggle input { border-radius: 99px; }
.toggle input::after { border-radius: 50%; }
/* ── LEVEL-BESTENLISTE ─────────────────────────────── */
.lvl-list { border: 1px solid rgba(255, 255, 255, .06); background: var(--bg2); border-radius: 12px; }
.lvl-row {
display: flex; align-items: center; gap: 1rem;
padding: .65rem 1.1rem;
border-bottom: 1px solid rgba(255, 255, 255, .05);
}
.lvl-row:last-child { border-bottom: none; }
.lvl-row:first-child { border-radius: 12px 12px 0 0; }
.lvl-rank { font-family: var(--mono); font-size: .85rem; color: var(--muted); min-width: 2.6rem; }
.lvl-name { font-weight: 600; min-width: 10rem; }
.lvl-progress { flex: 1; }
.lvl-level {
font-family: var(--mono); font-size: .72rem; letter-spacing: .1em;
color: var(--neon); white-space: nowrap;
}
.lvl-xp { font-family: var(--mono); font-size: .68rem; color: var(--muted2); white-space: nowrap; min-width: 6rem; text-align: right; }
@media (max-width: 640px) {
.lvl-name { min-width: 0; flex: 1; }
.lvl-progress { display: none; }
}
/* Datums-/Zeit-Inputs wie Text-Inputs stylen */
.field input[type="date"], .field input[type="time"] {
background: rgba(0, 0, 0, .35);
border: 1px solid rgba(255, 255, 255, .09);
border-radius: 8px;
color: var(--text);
font-family: var(--body);
font-size: .95rem;
padding: .5rem .7rem;
outline: none;
color-scheme: dark;
}
.field input[type="date"]:focus, .field input[type="time"]:focus {
border-color: var(--neon);
box-shadow: 0 0 0 3px rgba(245, 197, 24, .12);
}