# Einen Bot einbinden — Schritt für Schritt

> Aktuell läuft **kein Bot** (bewusst). Diese Anleitung zeigt **exakt**, wie du einen Discord-Bot anschließt.
> Hintergrund/Architektur: [ARCHITECTURE.md](ARCHITECTURE.md) §4.

## Voraussetzung (einmalig, ganz wichtig)

Der **APP_KEY muss in beiden `.env` identisch sein** — sonst kann der Bot die in der DB verschlüsselten Tokens nicht entschlüsseln. Ist bereits erledigt:

```
laravel-app/.env : APP_KEY=base64:iLnMHMkaAPp7wwRpy3s4LpLxCnNUwyrFelNoabgUBqk=
bot-worker/.env  : APP_KEY=base64:iLnMHMkaAPp7wwRpy3s4LpLxCnNUwyrFelNoabgUBqk=
```

Wenn du den APP_KEY je neu generierst (`php artisan key:generate`), **musst du ihn in `bot-worker/.env` mitziehen**.

---

## Schritt 1 — Discord-Anwendung + Bot anlegen

1. https://discord.com/developers/applications → **New Application** → Name (z. B. „TacForce Operator").
2. Tab **Bot** → **Reset Token** → Token kopieren (nur einmal sichtbar!).
3. Tab **Bot** → **Privileged Gateway Intents** → aktiviere **Server Members Intent** und **Message Content Intent** (der Worker nutzt beide, siehe `bot-worker/src/manager.js`).
4. Tab **OAuth2** → **Client ID** und (für den Website-Login) **Client Secret** kopieren.
5. Tab **General Information** → **Public Key** kopieren (für Interaction-Verifizierung, optional).
6. Tab **OAuth2 → Redirects** → füge hinzu: `http://80.243.36.15:98/auth/discord/callback` (muss exakt zu `DISCORD_REDIRECT_URI` in `laravel-app/.env` passen).

---

## Schritt 2 — Website-Login/Admin aktivieren (damit du ins Admin-Panel kommst)

In `laravel-app/.env` eintragen und speichern:

```
DISCORD_CLIENT_ID=<deine Client-ID>
DISCORD_CLIENT_SECRET=<dein Client-Secret>
DISCORD_REDIRECT_URI=http://80.243.36.15:98/auth/discord/callback
ADMIN_DISCORD_IDS=<deine eigene Discord-User-ID>   # macht dich beim Login zum Admin
```

Danach Cache leeren:

```
cd laravel-app
php artisan config:clear
```

Jetzt auf http://80.243.36.15:98/login einloggen → du bist Admin → **/admin/bots** ist erreichbar.

---

## Schritt 3 — Bot registrieren (zwei Wege)

### Weg A — Schnellster Weg (ohne Admin-Panel, „env-Bot")

Ideal für den allerersten Bot. In `bot-worker/.env`:

```
DISCORD_TOKEN=<dein Bot-Token>
DISCORD_CLIENT_ID=<deine Client-ID>
```

Solange in der `bots`-Tabelle **kein** aktiver Bot steht, bootet der Worker diesen env-Bot automatisch.

```
cd bot-worker
npm run register        # Slash-Commands registrieren (global, kann ~1h dauern)
npm start               # oder Doppelklick auf START-BOT.bat
```

> Zum sofortigen Testen in EINEM Server: `npm run register -- --guild <Server-ID>` (Guild-Commands erscheinen sofort).

### Weg B — Über das Admin-Panel (empfohlen, mehrere/White-Label-Bots)

1. http://80.243.36.15:98/admin/bots → **Bot hinzufügen**.
2. Felder: **Name**, **Client-ID** (numerisch), **Token** (wird via Laravel `Crypt` **automatisch verschlüsselt** gespeichert), optional **Public Key**, **Akzentfarbe**, **Besitzer** (White-Label). **Aktiv** anhaken.
3. Speichern. Der Token erscheint danach nur maskiert (`••••1a2b`).
4. Slash-Commands für genau diesen Bot registrieren:
   ```
   cd bot-worker
   npm run register -- --bot <id>     # <id> = die Bot-ID aus dem Panel
   ```
5. Worker (neu) starten: `START-BOT.bat` bzw. `npm start`. Neue aktive Bots werden beim Start (oder per Reload) erkannt.

---

## Schritt 4 — Bot auf deinen Server einladen

OAuth2-URL bauen (Developer Portal → **OAuth2 → URL Generator**):
- Scopes: **`bot`** + **`applications.commands`**
- Bot-Permissions: mindestens *Manage Channels, Manage Roles, Send Messages, Embed Links, Read Message History, View Channels* (für Tickets/Bewerbungen).

Generierte URL öffnen → Server wählen → autorisieren.

---

## Schritt 5 — Prüfen, ob alles läuft

```
cd bot-worker
npm start
```
Erwartete Ausgabe:
```
[start] Datenbankverbindung OK.
[ready] Eingeloggt als <BotName>#0000
[start] Outbox-Poller läuft (alle 4000 ms).
```
Im Discord: `/setup`, `/help`, `/panel tickets`, `/panel apply` sollten verfügbar sein.

---

## Mehrere Bots / White-Label

Der Worker ist **multi-bot-fähig** (`bot-worker/src/manager.js`): jede aktive Zeile in `bots` wird als eigener discord.js-Client mit eigenem Token gestartet, Fehler bleiben isoliert. Für einen Kundenbot: neue Discord-App → im Panel als weiteren Bot anlegen (eigener `owner_user_id` = Kunde) → `npm run register -- --bot <id>` → Worker neu starten.

---

## Fehlerbehebung

| Symptom | Ursache / Fix |
|---------|---------------|
| `An invalid token was provided` | Token falsch/abgelaufen → im Portal **Reset Token**, neu eintragen. |
| Bot startet, aber Commands fehlen | `npm run register` vergessen, oder globale Commands brauchen bis zu 1 h → zum Test `--guild <id>`. |
| `Used disallowed intents` | Im Portal **Server Members** + **Message Content Intent** aktivieren (Schritt 1.3). |
| Token aus DB wird nicht erkannt | APP_KEY in beiden `.env` unterschiedlich → angleichen. |
| Login/Admin geht nicht | `DISCORD_REDIRECT_URI` ≠ im Portal hinterlegte Redirect-URL → exakt gleich machen. |
