Skip to content

FwSchultz/dc-streamer-bot

Repository files navigation

gg


Table of Contents


About the Project

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.


Features

  • Ü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)
  • 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
  • SQLite-Datenbank (streamers.db)
  • Docker-Setup mit Dockerfile + docker-compose.yml
  • Zugriff steuerbar über Discord-Berechtigung und Rollen-IDs aus der .env

Tech Stack


Project Structure

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)

Configuration

Alle relevanten Einstellungen laufen über eine .env-Datei.

1. .env aus Vorlage erstellen

cp .env.example .env

2. Inhalt von .env.example

# 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

3. Parameter erklärt

  • DISCORD_TOKEN
    Bot-Token aus dem Discord Developer Portal.

  • GUILD_ID

    • 0 oder 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_IDS Kommagetrennte Liste von Rollen-IDs. Jeder Benutzer mit mindestens einer dieser Rollen darf die Streamer-Commands benutzen – auch ohne „Server verwalten“.


Permissions

Die Prüfung der Berechtigung läuft über eine zentrale Funktion im Bot:

  1. User mit Server verwalten

    • Haben immer Zugriff auf alle Slash-Commands des Bots.
  2. 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).
  3. 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.


Run with Docker Compose

1. Build

Im Projektordner:

docker compose build

2. Starten

docker compose up -d

3. Logs ansehen

docker compose logs -f streambot

Erwartete Meldungen u.a.:

  • Datenbank initialisiert
  • Twitch Token erhalten
  • ggf. einzelne Logs zu Twitch/YouTube-Anfragen

4. Stoppen & Entfernen

# Container stoppen
docker compose stop streambot

# Container entfernen (DB bleibt als Datei auf dem Host)
docker compose down

Run Locally (without Docker)

Wenn du lieber ohne Container starten willst:

1. Virtualenv & Requirements

python3 -m venv venv
source venv/bin/activate        # Windows: venv\Scripts\activate
pip install -r requirements.txt

2. .env anlegen und füllen

Siehe Abschnitt Configuration.

3. Bot starten

python bot.py

Slash Commands

/streamer_add

Fü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:

    • @HandOfBlood
    • UCxxxxxxxxxxxxxxxxxxxxxx

Der Bot speichert u.a.:

  • display_name
  • discord_id (falls angegeben)
  • twitch_name (kleingeschrieben)
  • twitch_url
  • youtube_channel_id

/streamer_manage

Ö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/@Handle gebaut)
      • Streamer bearbeiten (Modal mit Textfeldern)
      • Streamer löschen

Bearbeiten-Modal:

  • Anzeigename
  • Twitch-Login
  • YouTube Channel-ID / @Handle

/streamer_list

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`

/streamer_reset_live

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.

How the Live Check Works

  • Alle 2 Minuten läuft check_streams.
  • Der Bot liest alle Streamer aus streamers.db.
  • Twitch:
    • Abfrage der Streams über helix/streams mit user_login.
    • Filter type == "live".
    • Titel + Thumbnail-Template werden ausgewertet.
  • YouTube:
    • Wenn youtube_channel_id mit @ beginnt:
      • Auflösung zu echter Channel-ID via channels.list?forHandle=....
    • Mit Channel-ID wird die Live-Suche über search ausgeführt:
      • eventType=live
      • type=video
  • Erkennung „neu live“:
    • Wenn jetzt_live == True und was_live == 0neuer Live-Eintrag → Embed.
    • Danach werden was_live_twitch / was_live_youtube in der DB auf 1 gesetzt.

Ein Streamer, der gleichzeitig auf Twitch und YouTube live ist, erzeugt zwei Embeds: eines für „Twitch“, eines für „YouTube“.


Database & Persistence

  • SQLite-Datenbank: streamers.db

  • Tabelle streamers enthält u.a.:

    • id (PK)
    • display_name
    • discord_id
    • twitch_login
    • youtube_channel_id
    • twitch_url
    • youtube_url (aktuell praktisch ungenutzt, bleibt für Kompatibilität im Schema)
    • was_live_twitch
    • was_live_youtube

Docker Volume

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.db

Damit:

  • 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.db rüberkopieren.

Roadmap

  • 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)

License

Dieses Projekt ist unter der MIT License lizenziert.
Details findest du in der Datei LICENSE.


Contact

Created by Fw.Schultz.

Bei Fragen, Bugs oder Feature-Wünschen:

About

Discord bot that posts Twitch/YouTube live notifications

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors