Files
d4rkbot/.env.example
T
D4rkst3randClaude Opus 5 958b3b64f2 feat(bot): /whitelist status - der Bot fragt den Spielserver, wer was darf
Betreiber am 04.09.2026: "wenn wir das in den d4rkbot mit einbauen koennen
warum nicht".

DIE WHITELIST *IST* EINE DISCORD-ROLLE

d4rk_lib prueft bei jeder Verbindung live, ob die Person eine bestimmte Rolle
auf diesem Discord hat. "Jemanden auf die Whitelist setzen" heisst also: ihm
die Rolle geben. Das kann nur der Bot - der Spielserver hat keinen Zugriff auf
Discord.

Umgekehrt weiss nur der Spielserver, WER das darf. Deshalb fragt der Bot ihn,
statt Discord-Berechtigungen zu pruefen: sonst gaebe es zwei
Rechteverwaltungen, und die zweite erfuehre nie von einer Aenderung in der
Matrix. Dieselbe Regel wie ADR-0012 fuer das Panel setzt.

DIESER SCHRITT LIEST NUR

`/whitelist status @person` beantwortet drei Fragen an einem Ort: hat sie die
Rolle (fragt der Bot bei Discord), kennt der Spielserver ihr Konto, welche
Teamrolle hat sie bei uns.

Vergeben und Entziehen kommt als eigener Schritt - erst wenn dieser Weg
nachweislich durchlaeuft. Ein Schreibbefehl auf einem Kanal, den niemand
gemessen hat, ist ein Schreibbefehl ins Ungewisse.

DREI AUSGAENGE BEI DER RECHTEFRAGE, NICHT ZWEI

erlaubt, verboten, und "ich weiss es nicht". Der dritte ist der wichtige: ein
Bot, der bei einer Stoerung "verboten" sagt, sperrt das Team aus; einer, der
"erlaubt" sagt, oeffnet es fuer alle. Beides waere geraten.

WAS DER SPIELSERVER NICHT WEISS, BEHAUPTET ER AUCH NICHT: ob die Discord-Rolle
gesetzt ist, sieht er nur im Moment einer Verbindung. Der Bot fragt sie selbst
- er hat den Zugang.

DER ZWEITE HALTER DES GEHEIMNISSES

Bisher kannte nur das Adminpanel den Token fuer d4rk_web. Der Bot ist jetzt der
zweite. Beide sind eigene Container auf demselben Host und reden ueber das
interne Netz - aber es bleibt eine Verdopplung, und sie steht deshalb im Kopf
der Datei und in der .env.example, nicht in einer Fussnote.

Ohne SPIELSERVER_URL und SPIELSERVER_TOKEN tut /whitelist NICHTS und sagt es.
Ein Bot, der bei fehlender Konfiguration durchwinkt, waere schlimmer als einer,
der schweigt.

NOCH NICHT GEMESSEN: der Weg vom Bot zum Spielserver. Dafuer muessen die drei
Umgebungsvariablen im Container gesetzt sein, und das ist eine Handlung des
Betreibers. Die Serverseite (/person) ist dagegen gemessen: eine erfundene
Kennung liefert rolle=keine, kontoGelesen=true, konto=nil.

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

102 lines
4.1 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
# ---------------------------------------------------------------------------
# VERBINDUNG ZUM SPIELSERVER (fuer /whitelist)
# ---------------------------------------------------------------------------
#
# WOZU: der Bot fragt den Spielserver, 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.
#
# OHNE DIESE ZWEI WERTE TUT /whitelist NICHTS und sagt es. Ein Bot, der bei
# fehlender Konfiguration durchwinkt, waere schlimmer als einer, der schweigt.
#
# Die Adresse ist die INTERNE: der Endpunkt liegt auf dem Spielport, und dieser
# Weg soll nicht ueber das oeffentliche Netz laufen.
# SPIELSERVER_URL=http://host.docker.internal:30130/d4rk_web
#
# DASSELBE GEHEIMNIS wie im Adminpanel (d4rk_web:geheimnis in web.cfg). Der Bot
# ist damit der ZWEITE Halter - beide sind eigene Container auf demselben Host,
# aber es bleibt eine Verdopplung und ist hier ausdruecklich benannt.
# SPIELSERVER_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=