# Starauftrag Discord Bot (Go + SQLite) Produktionsnaher Discord-Bot für Lieferaufträge mit SQLite-Persistenz, Slash Commands, internen Team-Buttons, Audit-Log und privater Lagerverwaltung. ## Kernidee - Endnutzer erstellen mit `/auftrag` einen Lieferauftrag. - Der öffentliche Auftragspost enthält nur auftragsbezogene Basisdaten. - Das Team erhält in einem privaten internen Channel denselben Auftrag plus Lagerprüfung. - Annahme/Ablehnung erfolgt ausschließlich im internen Channel per Button. - Lagerdaten werden nie an den Einreicher oder in öffentliche Posts ausgegeben. - Alle relevanten Änderungen werden in `order_events` auditiert. Discord Buttons sind Message Components mit `custom_id`; beim Klick erhält der Bot eine Component Interaction und ordnet sie damit wieder dem Auftrag zu. ## Setup 1. Discord Developer Portal: Bot erstellen, Token kopieren, Bot in deinen Server einladen. 2. Bot-Berechtigungen: - `Send Messages` - `Use Slash Commands` - `Read Message History` - `Embed Links` - `Create Public Threads` oder `Create Private Threads` je nach Channel-Einstellung - `Send Messages in Threads` 3. `.env.example` nach `.env` kopieren oder Umgebungsvariablen setzen. 4. Starten: ```bash go mod tidy go run . ``` Für schnelle Command-Updates in Entwicklung `DISCORD_GUILD_ID` setzen. Ohne Guild-ID werden Slash Commands global registriert, was länger dauern kann. ## Wichtige Umgebungsvariablen ```env DISCORD_TOKEN=... DISCORD_APP_ID=... DISCORD_GUILD_ID=... DISCORD_PUBLIC_ORDER_CHANNEL_ID=... DISCORD_INTERNAL_ORDER_CHANNEL_ID=... DISCORD_AUDIT_CHANNEL_ID=... DISCORD_ADMIN_ROLE_IDS=roleId1,roleId2 DISCORD_TEAM_ROLE_IDS=roleId3,roleId4 DATABASE_PATH=orders.db ``` `DISCORD_INTERNAL_ORDER_CHANNEL_ID` sollte ein privater Team-Channel sein. Nur dort erscheinen Lagerprüfung und Annahme-/Ablehnen-Buttons. ## User Commands ### `/auftrag` Erstellt einen Auftrag mit: - `ware` - `qualitaet` 0-1000 - `menge` als Zahl - `einheit` `SCU` oder `Stück` - `frist` im Format `YYYY-MM-DD` - `lieferort` - `budget` in aUEC ### `/auftrag_status id:` Zeigt den Auftrag. Team/Admin sieht die interne Ansicht inklusive Lagerprüfung, normale Nutzer nur eigene Aufträge ohne Lagerdaten. ### `/auftrag_liste status: limit:` Listet Aufträge. Team/Admin sieht zusätzlich interne Zuordnungen. ### `/auftrag_abschliessen id:` Einreicher, Annehmer oder Team/Admin können abschließen. ### `/auftrag_abbrechen id: grund:` Einreicher oder Team/Admin können abbrechen. ### `/auftrag_nachricht id: text:` Leitet eine Nachricht per DM an Einreicher und Annehmer weiter und schreibt sie zusätzlich in den internen Auftragsthread. ## Team/Admin Commands ### `/auftrag_status_setzen` Team/Admin kann den Status manuell setzen: - `open` - `accepted` - `in_delivery` - `delivered` - `completed` - `declined` - `cancelled` ## Lager Commands Nur Admins können Lagerbestände verändern. Team/Admin kann Lager prüfen und anzeigen. ### `/lager_add` Fügt Bestand hinzu oder setzt ihn absolut. ```text /lager_add ware:Gold qualitaet:900 menge:64 einheit:SCU ort:Orison modus:addieren /lager_add ware:Gold qualitaet:900 menge:100 einheit:SCU ort:Orison modus:setzen ``` ### `/lager_remove` Reduziert Bestand. Der Bot verhindert negative Bestände. ```text /lager_remove ware:Gold qualitaet:900 menge:10 einheit:SCU ort:Orison ``` ### `/lager_liste` Zeigt interne Lagerbestände ephemeral an. ```text /lager_liste suche:Gold limit:20 ``` ### `/lager_check` Prüft intern, ob eine Menge verfügbar ist. ```text /lager_check ware:Gold qualitaet:900 menge:64 einheit:SCU ``` ## Statusmodell ```text open -> accepted -> in_delivery -> delivered -> completed \-> cancelled open -> declined ``` ## Datenbanktabellen - `orders`: Aufträge und Discord-Message-Referenzen - `inventory`: interne Lagerpositionen - `order_events`: Audit-Log für Aufträge und Lageränderungen SQLite wird mit WAL-Modus und `busy_timeout` betrieben, damit kleine produktive Deployments robuster laufen. ## Produktionshinweise - Setze `DISCORD_INTERNAL_ORDER_CHANNEL_ID` auf einen strikt privaten Channel. - Gib Lager-Commands nur einer kleinen Admin-Rolle. - Sichere `orders.db` regelmäßig. - Führe den Bot als systemd-Service oder Container aus. - Aktiviere Monitoring für Logs und Neustarts. - Teste DMs: Manche Nutzer blockieren DMs von Servermitgliedern; der Bot loggt solche Fehler, kann sie aber nicht erzwingen.