Files
D4rkst3randClaude Opus 5 b1ec1a2a29 feat(bot): der Bot fragt das Panel, nicht den Spielserver
Betreiber am 04.09.2026: "koennen wir das nicht mit in die webseite einbauen,
das er sich das ueber das acp holt?" - das ist der bessere Entwurf, und der
Grund ist das geringste Recht.

WAS DER ERSTE ANLAUF FALSCH GEMACHT HAETTE

Er haette dem Bot das Geheimnis von d4rk_web gegeben. Dann haetten ZWEI
Dienste den Schluessel zu allem gehabt: Rechtematrix, Spielerliste, Protokoll,
Schreibweg. Ein Bot, der nur wissen soll, ob jemand die Whitelist verwalten
darf, braucht davon nichts.

Jetzt bleibt das Panel der einzige, der mit dem Spielserver redet, und der Bot
bekommt einen eigenen Schluessel (BOT_TOKEN), der genau eine Tuer oeffnet:
/bot/person.

EIGENER PFAD, EIGENER WAECHTER

/bot/ statt /api/bot/, weil der Sitzungswaechter dort Discord-Anmeldung und
Rolle prueft - beides hat eine Maschine nicht. Der Botwaechter vergleicht den
Schluessel zeichenweise (dieselbe Ueberlegung wie in d4rk_web) und antwortet
bei fehlendem oder falschem Schluessel mit 404, nicht 401: wer von aussen
probiert, soll nicht erfahren, dass es hier einen Maschinenzugang gibt.

Unter 32 Zeichen gibt es den Weg gar nicht - eine halbe Konfiguration darf
keine Tuer aufmachen.

DURCHGEREICHT, NICHT AUSGEWERTET. Das Panel entscheidet an dieser Stelle
nichts; sonst waere es die zweite Rechteverwaltung, die ADR-0012 ausschliesst.

NEBENBEI ZWEI FALLEN VERMIEDEN

Dem Bot fehlt extra_hosts - host.docker.internal haette gar nicht aufgeloest,
und der Fehler haette wie "Spielserver antwortet nicht" ausgesehen. Ueber das
oeffentliche Panel braucht er es nicht.

Und das Panel nennt seine zwei Werte D4RK_WEB_URL/D4RK_WEB_TOKEN; mein
Botmodul hiess erst SPIELSERVER_*. Zwei Vokabeln fuer eine Sache bedeuten,
dass man beim Umzug an zwei Stellen sucht und eine vergisst. Die Datei heisst
jetzt panel.js - ein Modul namens spielserver.js, das mit dem Panel redet,
waere ein Name, der luegt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 10:43:34 +02:00

102 lines
4.0 KiB
Bash

# Vorlage — nach .env kopieren und Werte eintragen (NIEMALS .env committen!)
# Discord Developer Portal → deine App → Bot → "Reset Token"
DISCORD_TOKEN=
# Discord Developer Portal → deine App → General Information → "Application ID"
DISCORD_CLIENT_ID=
# Rechtsklick auf deinen Discord-Server → "Server-ID kopieren" (Entwicklermodus nötig)
# Optional: wenn gesetzt, sind Slash-Commands sofort verfügbar statt nach bis zu 1h
DISCORD_GUILD_ID=
# --- Devlog-Archiv (Feature 3) ---
# Rechtsklick auf den Devlog-Kanal (dort postet der Bot die Devlogs) → "Kanal-ID kopieren"
DEVLOG_CHANNEL_ID=
# Secret für den Devlog-Endpoint — generieren mit:
# node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
# Im EcoGame-Repo in tools/.devlog_webhook eintragen:
# https://bot.d4rkst3r.de/webhooks/devlog/<dieser Wert>
DEVLOG_POST_SECRET=
# --- Commit-Feed (Feature 2) ---
# Rechtsklick auf den Commit-Kanal → "Kanal-ID kopieren"
COMMIT_CHANNEL_ID=
# Shared Secret für die Webhook-Signatur — generieren mit:
# node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
# Denselben Wert im Gitea-Webhook als "Secret" eintragen!
GITEA_WEBHOOK_SECRET=
# --- Webinterface (Feature 4) ---
# Discord Developer Portal → deine App → OAuth2 → "Client Secret" (ggf. Reset Secret)
DISCORD_CLIENT_SECRET=
# Zufälliger String zum Signieren der Session-Cookies — generieren mit:
# node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
SESSION_SECRET=
# Deine Discord-User-ID (Rechtsklick auf deinen Namen → "Benutzer-ID kopieren")
# Nur dieser Account sieht die Commit-Seite
ADMIN_DISCORD_ID=
# Öffentliche Basis-URL für den OAuth2-Redirect
# Lokal zum Testen: http://localhost:3080 (auch im Developer Portal eintragen!)
PUBLIC_URL=https://bot.d4rkst3r.de
# --- Bug-Reports (/bug → Gitea-Issue) ---
# Gitea → Einstellungen → Anwendungen → Token erzeugen (Scope: write:issue)
# Ohne Token ist /bug deaktiviert (Bot läuft trotzdem)
GITEA_API_TOKEN=
# Optional: Gitea-Basis-URL (Default: https://git.d4rkst3r.de)
# GITEA_URL=https://git.d4rkst3r.de
# Optional: HTTP-Port des Webservers (Default: 3080)
# HTTP_PORT=3080
# Optional: Pfad zur SQLite-Datei (Default: ./data/ecobot.db)
# DB_PATH=./data/ecobot.db
# Optional: Pfade zu ffmpeg und yt-dlp fuers Radio (Default: im PATH suchen).
# Beide stecken im Docker-Abbild und muessen dort nicht gesetzt werden. Lokal
# ohne Docker ist das der Ort, an dem man sie bekannt macht.
#
# Zum Pruefen der Fehlerwege taugt ein Pfad, der nicht abspielt:
# YTDLP_PATH=/bin/false laesst die Radiosender weiterlaufen und muss im Panel
# als "yt-dlp fehlt" erscheinen -- nicht als Stille im Sprachkanal.
# FFMPEG_PATH=ffmpeg
# YTDLP_PATH=yt-dlp
# ---------------------------------------------------------------------------
# ZUGANG ZUM ADMINPANEL (fuer /whitelist)
# ---------------------------------------------------------------------------
#
# WOZU: der Bot fragt, WER die Whitelist verwalten darf. Die Antwort steht in
# der Rechtematrix - derselben, die Adminmenue und Panel benutzen. Wuerde der
# Bot stattdessen Discord-Berechtigungen pruefen, waere das eine zweite
# Rechteverwaltung, die von einer Aenderung in der Matrix nie erfaehrt.
#
# WARUM UEBER DAS PANEL UND NICHT DIREKT ZUM SPIELSERVER: sonst haetten ZWEI
# Dienste den Schluessel zu allem - Rechtematrix, Spielerliste, Protokoll,
# Schreibweg. Der Bot bekommt stattdessen einen eigenen, der genau eine Tuer
# oeffnet.
#
# OHNE DIESE ZWEI WERTE TUT /whitelist NICHTS und sagt es. Ein Bot, der bei
# fehlender Konfiguration durchwinkt, waere schlimmer als einer, der schweigt.
# ACP_URL=https://acp.d4rkst3r.de
#
# Derselbe Wert wie BOT_TOKEN im Adminpanel. NICHT dessen D4RK_WEB_TOKEN -
# das ist der Schluessel zum Spielserver und geht den Bot nichts an.
# ACP_BOT_TOKEN=
#
# Die Rolle, die den Zutritt oeffnet. Sie MUSS dieselbe sein, die der
# Spielserver prueft (Convar d4rk_discord:role) - stimmen sie nicht ueberein,
# zeigt /whitelist "hat die Rolle" fuer eine Rolle, die gar nichts oeffnet.
# WHITELIST_ROLE_ID=