πŸ€– Discord Bot

Modul-Planung: Was bleibt, was Γ€ndert sich, was kommt neu. V3 Chaos β†’ V4 Clean Architecture.

πŸ”΄ Was in V3 schief lief

10 konkrete Probleme die wir in V4 lΓΆsen

Chaotisches Admin Panel

19 Discord-Tabellen, 7 ORPC Router, Seiten ohne klare Struktur. Man findet nichts. Commands, Levels, Giveaways, Polls β€” alles auf eigenen Seiten ohne Zusammenhang.

Redis Pub/Sub ohne Garantie

Commands gehen verloren wenn der Bot offline ist. Kein Retry, kein Acknowledgment. Fire-and-forget = Data Loss.

3 verschiedene Log-Tabellen

DiscordLog, DiscordActionLog, AuditLog β€” niemand weiß welche man checken soll. Duplikate ΓΌberall.

Kein Real-Time im Panel

Bot sendet Nachricht β†’ Panel zeigt es erst nach Reload. Kein WebSocket, kein SSE. Sync nur manuell.

Settings als Key-Value Store

DiscordBotSetting ist ein Anti-Pattern. Keine Typsicherheit, kein Schema, kein Default-Handling.

Keine Rate Limiting

Discord API Calls ohne Throttling. Bot kann gebannt werden wenn zu viele Requests kommen.

Sync-Logik ΓΌberall verstreut

roleSync, memberSync, channelSync β€” 3 separate Services mit duplizierten Patterns. FehleranfΓ€llig.

Keine Tests

0 Tests fΓΌr den gesamten Discord Bot. Jede Γ„nderung = manuelles Testen.

🟒 V4 Architektur

Clean, typed, testbar

BullMQ statt Pub/Sub

ZuverlΓ€ssige Job Queue mit Retry, Acknowledgment, Dead Letter Queue. Commands gehen nie verloren.

1 Log-System

Ein einheitliches activityLog mit Type-Enum. Alles an einem Ort, filterbar, durchsuchbar.

WebSocket Real-Time

Bot Events β†’ Redis β†’ WS Events Service β†’ Panel. Live-Updates fΓΌr Member Joins, Messages, Voice.

Typed Settings als JSON Column

Ein discordGuild Table mit typed JSON settings Column. Arktype validiert, Defaults eingebaut.

Communication Flow

Admin Panel
ORPC Call
β†’
Media API
Validates + Persists
β†’
BullMQ
Reliable Queue
β†’
Discord Bot
Executes + ACK
β†’
Redis Pub/Sub
Event Broadcast
β†’
WS Events
Push to Panel
πŸ“¦ Features

Priorisiert: Must Have β†’ Should Have β†’ Could Have

πŸ”— Guild Management

  • Guild Registration + Settings
  • Role Sync + Permission Mapping
  • Member Sync + Linking zu App Users
  • Channel Sync
Must Have

⚑ Custom Commands

  • Slash Commands CRUD
  • Response Builder (Text + Embed)
  • Permission Checks
  • Cooldowns
  • Usage Statistics
Must Have

πŸ“Š Level System

  • XP pro Nachricht (configurable)
  • Level-Up Rewards (Rollen)
  • Leaderboard
  • XP Multiplier pro Channel/Rolle
  • Anti-Spam Cooldown
Must Have

🎁 Giveaways

  • Erstellen + Verwalten
  • Requirements (Level, Rolle, etc)
  • Auto-Draw bei Ablauf
  • Reroll Funktion
Should Have

πŸ“‹ Polls

  • Multi-Option Voting
  • Anonym / Offen
  • Auto-Close bei Ablauf
  • Live Ergebnisse
Should Have

🏷 Reaction Roles

  • Emoji β†’ Rolle Mapping
  • Toggle / Add / Remove Modi
  • Multi-Message Support
Should Have

πŸ“… Scheduled Messages

  • Cron-basiert
  • Embed Templates
  • Timezone Support
  • Test-Senden
Should Have

πŸ“ Activity Logging

  • Message Tracking (Create/Edit/Delete)
  • Voice Session Tracking
  • Member Join/Leave Log
  • Moderation Log
Must Have

πŸ›‘ Auto-Moderation

  • Banned Words Filter
  • Link Filter
  • Spam Detection
  • Configurable Actions (Warn/Mute/Kick/Ban)
Could Have
πŸ–₯ Admin Panel β€” Mockup

So sollte die Discord-Verwaltung aussehen. Klare Gruppen, alles erreichbar.

codenull.de/admin/discord

Discord Dashboard

Überblick über den Server und Bot-Status

1,247
Members
89
Online
342
Messages Today
12
Voice Active

Custom Commands

CommandResponseCooldownUsesStatus
/shopEmbed: Shop Link5s1,892Active
/rankLevel + XP Embed10s4,231Active
/clipLast Clip Link30s567Active
/donateDonation Page5s234Disabled
πŸ—„ Datenmodell β€” V3 β†’ V4

Von 19 Tabellen auf 10. Weniger Chaos, bessere Relationen.

V3 (19 Tabellen)V4 (10 Tabellen)Γ„nderung
DiscordBotSetting (key-value)β†’ discordGuild.settings (typed JSON)Eliminiert
DiscordLog + DiscordActionLog→ activityLog (unified)Zusammengeführt
DiscordMemberdiscordMember (+ linkedUserId)Behalten
DiscordRole + DiscordMemberRolediscordRole + discordMemberRoleBehalten
DiscordCommand + DiscordCommandStats→ discordCommand (stats eingebaut)Zusammengeführt
DiscordUserLevel + DiscordLevelSettingsdiscordUserLevel + discordGuild.levelSettingsSettings β†’ Guild
DiscordGiveawaydiscordGiveawayBehalten
DiscordPolldiscordPollBehalten
DiscordReactionRolediscordReactionRoleBehalten
DiscordScheduledMessage + DiscordEmbedTemplate→ discordScheduledMessage (templates inline)Zusammengeführt
DiscordMessagediscordMessageBehalten
DiscordVoiceSessiondiscordVoiceSessionBehalten
DiscordVoteβ€”Entfernt (Polls reichen)
DiscordRolePermissionMapping→ discordGuild.rolePermissions (JSON)Vereinfacht
πŸ“‹ Schema Preview (Drizzle)
// ─── Core ──────────────────────────────────────── discordGuild id text PK // Discord Guild ID name text icon text? settings jsonb // { features, logChannels, blacklistChannels, levelSettings, ... } rolePermissions jsonb // { discordRoleId: ["ADMIN", "SHOP_MANAGE", ...] } botJoinedAt timestamp updatedAt timestamp discordMember id text PK guildId text FK β†’ discordGuild userId text // Discord User ID linkedUserId text? FK β†’ user // Better-Auth User (nullable) username text nickname text? avatar text? joinedAt timestamp status enum // ACTIVE, LEFT, BANNED, KICKED messageCount integer // denormalized counter voiceMinutes integer // denormalized counter discordRole id text PK // Discord Role ID guildId text FK β†’ discordGuild name text color integer position integer permissions text // Discord permission bitfield // ─── Features ──────────────────────────────────── discordCommand id text PK guildId text FK β†’ discordGuild name text description text response jsonb // { type: "text"|"embed", content, embed } permissions text[] cooldown integer // seconds isEnabled boolean usageCount integer // stats built-in (was separate table) lastUsedAt timestamp? discordUserLevel id text PK guildId text FK β†’ discordGuild userId text xp integer level integer messages integer lastMessageAt timestamp discordGiveaway // same as v3, cleaned up discordPoll // same as v3, cleaned up discordReactionRole // same as v3 discordScheduledMessage // merged with EmbedTemplate // ─── Tracking ──────────────────────────────────── discordMessage // message create/edit/delete tracking discordVoiceSession // voice join/leave/mute tracking
βœ… Entscheidungen

GeklΓ€rt am 2026-03-18

1. Single-Guild

Kein Multi-Server Support. Ein Discord Server = eine Codenull Instanz. Vereinfacht Datenmodell erheblich β€” guildId wird trotzdem gespeichert (fΓΌr Future-Proofing), aber kein Multi-Tenant Logic nΓΆtig.

2. Discord Member = Codenull User

Jeder Discord Member wird automatisch als Codenull User angelegt. Discord OAuth ist primΓ€re Auth. Kein separater Registration-Flow. discordMember.linkedUserId wird beim Join automatisch gesetzt.

3. Visueller Embed Builder

WYSIWYG Editor im Admin Panel zum Bauen von Discord Embeds. Live-Preview neben dem Editor. Farbe, Felder, Footer, Thumbnail, Image β€” alles per Drag'n'Drop. Templates speicherbar.

4. Kein Custom AutoMod

Discord's eingebaute AutoMod Features reichen aus. Wir bauen KEINE eigene Spam-Detection, Link-Filter oder Banned-Words. Spart erheblich Entwicklungszeit.

5. Alle Messages loggen

VollstΓ€ndiges Message Tracking β€” Create, Edit, Delete. Keine Privacy-EinschrΓ€nkungen. Retention Policy kann spΓ€ter ergΓ€nzt werden wenn nΓΆtig.

6. Feste + Custom Commands

Eingebaute Commands: /rank, /shop, /clip, /donate, /leaderboard. Diese sind nicht lΓΆschbar aber konfigurierbar (Response, Cooldown, Permissions). Plus unbegrenzt Custom Commands.

Codenull Platform Β· Discord Bot Module Planning Β· 2026-03-18