gg
- About the Project
- Features
- Tech Stack
- Project Structure
- Configuration
- Permissions
- Run with Docker Compose
- Run Locally (without Docker)
- Slash Commands
- How the Live Check Works
- Database & Persistence
- Roadmap
- License
- Contact
DISCORD-STREAM-BOT überwacht eingetragene Streamer auf Twitch und YouTube.
Sobald ein Streamer live geht, postet der Bot automatisch einen Embed in einen definierten Discord-Channel – inklusive:
- Plattform (Twitch / YouTube)
- Streamtitel
- Direktlink zum Stream
- Vorschaubild (Thumbnail)
- Optional: Discord-Mention des Streamers
Streamer werden über Slash-Commands verwaltet und in einer SQLite-Datenbank gespeichert.
- Überwachung von Twitch-Streams über die Helix API
- Überwachung von YouTube-Livestreams über die YouTube Data API v3
- Unterstützt YouTube-Channel-IDs und
@Handles(z.B.@HandOfBlood)
- Unterstützt YouTube-Channel-IDs und
- Automatische Live-Embeds mit:
- Titel
- Streamlink
- Thumbnail (mit Check, ob das Bild wirklich erreichbar ist)
- Discord-Mention (falls Streamer mit Member verknüpft)
- Live-Status wird persistiert, damit nicht bei jedem Restart gespammt wird
- Verwaltung komplett in Discord:
- Hinzufügen per Modal (
/streamer_add) - Verwalten / Bearbeiten / Löschen über
/streamer_manage - Listing via
/streamer_list - Reset des Live-Status über
/streamer_reset_live
- Hinzufügen per Modal (
- SQLite-Datenbank (
streamers.db) - Docker-Setup mit
Dockerfile+docker-compose.yml - Zugriff steuerbar über Discord-Berechtigung und Rollen-IDs aus der
.env
- Language: Python 3.12
- Libraries:
- Deployment:
- Docker
- Docker Compose
Beispielhafte Struktur:
dc-streamer-bot/
├─ bot.py
├─ Dockerfile
├─ requirements.txt
├─ docker-compose.yml
├─ .env.example
├─ .env # deine Konfiguration (nicht committen)
└─ streamers.db # SQLite-Datenbank (wird automatisch erstellt)
Alle relevanten Einstellungen laufen über eine .env-Datei.
cp .env.example .env# Discord Bot Token
DISCORD_TOKEN=dein_discord_bot_token_hier
# Optional: Guild ID für gilden-spezifische Slash-Commands
# 0 oder leer = globale Commands
GUILD_ID=0
# Channel-ID, in dem die Live-Embeds gepostet werden
ANNOUNCE_CHANNEL_ID=123456789012345678
# Twitch API
TWITCH_CLIENT_ID=dein_twitch_client_id
TWITCH_CLIENT_SECRET=dein_twitch_client_secret
# YouTube API
YOUTUBE_API_KEY=dein_youtube_api_key
# Rollen, die zusätzlich zu "Server verwalten" die Commands nutzen dürfen
# Kommagetrennte Liste von Discord-Rollen-IDs, z.B. Admins, Streamer etc.
ALLOWED_ROLE_IDS=111111111111111111,222222222222222222-
DISCORD_TOKEN
Bot-Token aus dem Discord Developer Portal. -
GUILD_ID0oder leer → globale Slash-Commands (für mehrere Server geeignet, Updates dauern etwas länger)- konkrete Guild-ID → Commands werden nur dort registriert, Updates sind schneller.
-
ANNOUNCE_CHANNEL_ID
Discord-Channel-ID, in dem die Live-Meldungen gepostet werden. -
TWITCH_CLIENT_ID&TWITCH_CLIENT_SECRET
Daten aus deiner Twitch Developer Application. -
YOUTUBE_API_KEY
API-Key aus der Google Cloud Console mit aktivierter YouTube Data API v3. -
ALLOWED_ROLE_IDSKommagetrennte Liste von Rollen-IDs. Jeder Benutzer mit mindestens einer dieser Rollen darf die Streamer-Commands benutzen – auch ohne „Server verwalten“.
Die Prüfung der Berechtigung läuft über eine zentrale Funktion im Bot:
-
User mit Server verwalten
Haben immer Zugriff auf alle Slash-Commands des Bots.
-
User ohne Server verwalten, aber mit Rolle in ALLOWED_ROLE_IDS
Dürfen ebenfalls alle relevanten Commands nutzen (/streamer_add, /streamer_manage, /streamer_list, /streamer_reset_live).
-
Alle anderen
Erhalten eine Fehlermeldung und können keine Streamer verwalten.
Damit kannst du z.B. Rollen wie Admins und Streamer freischalten, ohne global Adminrechte vergeben zu müssen.
Im Projektordner:
docker compose builddocker compose up -ddocker compose logs -f streambotErwartete Meldungen u.a.:
Datenbank initialisiertTwitch Token erhaltenggf. einzelne Logs zu Twitch/YouTube-Anfragen
# Container stoppen
docker compose stop streambot
# Container entfernen (DB bleibt als Datei auf dem Host)
docker compose downWenn du lieber ohne Container starten willst:
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txtSiehe Abschnitt Configuration.
python bot.pyFügt einen Streamer zur Live-Überwachung hinzu.
Parameter:
-
discord_user– optional; Zuordnung zu einem Discord-User (für Mention & Default-Anzeigename) Nach dem Ausführen öffnet sich ein Modal mit folgenden Feldern: -
Anzeigename– frei wählbar, Default = Name des Discord-Users (falls angegeben) -
twitch_login– optional; Twitch-Name ohne URL, z.B.pietsmiet -
youtube_channel_id– optional; YouTube Channel-ID oder@Handle
Beispiele:@HandOfBloodUCxxxxxxxxxxxxxxxxxxxxxx
Der Bot speichert u.a.:
display_namediscord_id(falls angegeben)twitch_name(kleingeschrieben)twitch_urlyoutube_channel_id
Öffnet eine Verwaltungssicht (ephemeral):
- Dropdown mit allen Streamern
- Nach Auswahl:
- Embed mit Infos:
- Anzeigename
- Discord-User (<@id>, falls verknüpft)
- Twitch-URL
- YouTube-Channel-ID / Handle
- Buttons:
- Twitch öffnen (falls Twitch gesetzt)
- YouTube öffnen (Link aus
youtube_channel_id/@Handlegebaut) - Streamer bearbeiten (Modal mit Textfeldern)
- Streamer löschen
- Embed mit Infos:
Bearbeiten-Modal:
- Anzeigename
- Twitch-Login
- YouTube Channel-ID /
@Handle
Zeigt alle eingetragenen Streamer (nur für User mit Server verwalten):
- ID
- Anzeigename
- Optional Discord-User (
<@id>) - Twitch-Name
- YouTube-Channel-ID /
@Handle
Beispielausgabe:
**1** – BeispielStreamer (<@123456789012345678>) – Twitch: `pietsmiet`, YouTube: `@HandOfBlood`
**2** – AndererStreamer – Twitch: `irgendwer`
Setzt was_live_twitch und was_live_youtube für alle Streamer auf 0.
Nutzen:
- für Tests und Debugging
- um einen „frischen“ Live-Trigger zu erzwingen, wenn jemand schon live war und bereits ein Embed gepostet wurde.
- Alle 2 Minuten läuft
check_streams. - Der Bot liest alle Streamer aus
streamers.db. - Twitch:
- Abfrage der Streams über
helix/streamsmituser_login. - Filter
type == "live". - Titel + Thumbnail-Template werden ausgewertet.
- Abfrage der Streams über
- YouTube:
- Wenn
youtube_channel_idmit@beginnt:- Auflösung zu echter Channel-ID via
channels.list?forHandle=....
- Auflösung zu echter Channel-ID via
- Mit Channel-ID wird die Live-Suche über
searchausgeführt:eventType=livetype=video
- Wenn
- Erkennung „neu live“:
- Wenn
jetzt_live == Trueundwas_live == 0→ neuer Live-Eintrag → Embed. - Danach werden
was_live_twitch/was_live_youtubein der DB auf1gesetzt.
- Wenn
Ein Streamer, der gleichzeitig auf Twitch und YouTube live ist, erzeugt zwei Embeds: eines für „Twitch“, eines für „YouTube“.
-
SQLite-Datenbank:
streamers.db -
Tabelle
streamersenthält u.a.:id(PK)display_namediscord_idtwitch_loginyoutube_channel_idtwitch_urlyoutube_url (aktuell praktisch ungenutzt, bleibt für Kompatibilität im Schema)was_live_twitchwas_live_youtube
In docker-compose.yml ist z.B. definiert:
services:
streambot:
build: .
image: fwschultz/dc-streamer-bot:1.0.0
container_name: dc-streamer-bot
restart: unless-stopped
env_file:
- .env
environment:
- TZ=Europe/Berlin
volumes:
- ./streamers.db:/app/streamers.dbDamit:
- liegt die echte Datenbankdatei im Projektordner auf dem Host,
- der Container nutzt sie unter
/app/streamers.db, - Backups sind trivial:
cp streamers.db streamers.db.bak, - Migration auf einen anderen Server: Code +
.env+streamers.dbrüberkopieren.
- Per-Streamer-Optionen (nur Twitch / nur YouTube)
- Ping einer konfigurierbaren Rolle (z.B.
@Stream-Notify) - Konfigurierbare Check-Intervalle
- Mehrsprachige Antworttexte (
de,en) - Bearbeiten von Streamern via Modal (
/streamer_manage) - Docker Compose Support
- YouTube-Handle-Unterstützung (
@Handle)
Dieses Projekt ist unter der MIT License lizenziert.
Details findest du in der Datei LICENSE.
Created by Fw.Schultz.
Bei Fragen, Bugs oder Feature-Wünschen:
- GitHub Issues: https://github.com/FwSchultz/dc-streamer-bot/issues
- Discord: Fw.Schultz
