@@ -1,2 +1,160 @@
|
||||
# sftrading
|
||||
# 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:<id>`
|
||||
|
||||
Zeigt den Auftrag. Team/Admin sieht die interne Ansicht inklusive Lagerprüfung, normale Nutzer nur eigene Aufträge ohne Lagerdaten.
|
||||
|
||||
### `/auftrag_liste status:<optional> limit:<optional>`
|
||||
|
||||
Listet Aufträge. Team/Admin sieht zusätzlich interne Zuordnungen.
|
||||
|
||||
### `/auftrag_abschliessen id:<id>`
|
||||
|
||||
Einreicher, Annehmer oder Team/Admin können abschließen.
|
||||
|
||||
### `/auftrag_abbrechen id:<id> grund:<optional>`
|
||||
|
||||
Einreicher oder Team/Admin können abbrechen.
|
||||
|
||||
### `/auftrag_nachricht id:<id> text:<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.
|
||||
|
||||
Reference in New Issue
Block a user