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:
@@ -47,6 +47,38 @@ export function starboardThreshold() {
|
||||
return Number.isInteger(n) && n >= 1 ? n : 3;
|
||||
}
|
||||
|
||||
/** Auto-Rolle für neue Member — leer = aus */
|
||||
export function autoroleId() {
|
||||
return getSetting('autorole_id') || null;
|
||||
}
|
||||
|
||||
/** Sticky-Roles: Rollen bei Rejoin wiederherstellen (Default: aus) */
|
||||
export function stickyRolesEnabled() {
|
||||
return getSetting('sticky_roles_enabled') === '1';
|
||||
}
|
||||
|
||||
/** Level-System an/aus (Default: aus — bewusst opt-in) */
|
||||
export function levelsEnabled() {
|
||||
return getSetting('levels_enabled') === '1';
|
||||
}
|
||||
|
||||
/** Level-Up-Nachricht im Kanal (Default: an, wenn Levels an) */
|
||||
export function levelsAnnounce() {
|
||||
return getSetting('levels_announce') !== '0';
|
||||
}
|
||||
|
||||
/** Rollen-Belohnungen: "5=roleId, 10=roleId" → [{level, roleId}] aufsteigend */
|
||||
export function levelRewards() {
|
||||
return (getSetting('level_rewards') ?? '')
|
||||
.split(',')
|
||||
.map((entry) => {
|
||||
const [lvl, roleId] = entry.split('=').map((s) => s.trim());
|
||||
return Number(lvl) > 0 && roleId ? { level: Number(lvl), roleId } : null;
|
||||
})
|
||||
.filter(Boolean)
|
||||
.sort((a, b) => a.level - b.level);
|
||||
}
|
||||
|
||||
/** Kanal für Feature-Wünsche (/wunsch) — leer = Feature aus */
|
||||
export function votingChannelId() {
|
||||
return getSetting('voting_channel_id') || null;
|
||||
|
||||
Reference in New Issue
Block a user