Zum Inhalt springen
  • Dunkel
  • Hell
  • System

Discord Stream-Online-Announce

Event: Stream Online → Discord

Fortgeschritten

Stream-Online-Event triggert Discord-Webhook-Post mit Game + Titel + Twitch-Link + Role-Ping. Globals-Guard verhindert Doppelposts bei Twitch-Reconnects.

Steps
6
Cooldown
0s/User
Cooldown
0sglobal
Zugriff
Broadcaster

Klassiker den jeder Streamer mit Discord-Server will. Pattern hat einen versteckten Stolperer: Twitch-Stream-Online feuert manchmal mehrfach kurz hintereinander (Stream-Reconnect, OBS-Crash + Recovery). Ohne Guard postest du dreimal in Discord innerhalb von 5 Minuten. Lösung: Persisted Global mit dem letzten Announce-Timestamp + 30-Min-Sperre.

Trigger setzt Argument %game% Aktuell gesetztes Game in Twitch. Variablen-Doku , Argument %title% Stream-Titel. Variablen-Doku , Argument %broadcastUser% Eigener Twitch-Login-Name. Variablen-Doku .

Action: [Event] Stream Online → Discord Announce

Abschnitt betitelt „Action: [Event] Stream Online → Discord Announce“

Trigger: Twitch > Stream > Stream Online

Global Get. Letzter Announce

Core Globals Global (Get)

Liest den Persisted Timestamp des letzten Discord-Announces.

Global Name lastDiscordAnnounce
Persisted aktiv
Variable Name lastAnnounce
Default Value 0

Set Argument: Diff in Sekunden

Core Arguments Set Argument

Differenz aktueller Zeit minus letzter Announce.

Name announceDiff
Value $sub(%timestampUnix%,%lastAnnounce%)$

If/Else: 30-Min-Sperre

Core Logic If/Else

Wenn der letzte Announce vor weniger als 1800 s war: Action sofort beenden.

Input %announceDiff%
Operation Less Than
Value 1800
Then

Break

Core Logic Break

Verhindert Doppelpost bei Twitch-Reconnect innerhalb von 30 Min.

Global Set. Announce-Timestamp aktualisieren

Core Globals Global (Set)
Global Name lastDiscordAnnounce
Value %timestampUnix%
Persisted aktiv

Discord Basic Webhook. Announce

Integrations Discord Basic Webhook

Postet Mehrzeiler mit Role-Ping, Game, Titel, Twitch-Link. Discord baut die Twitch-URL automatisch zur Live-Preview-Card aus.

Webhook Name Stream Live
Webhook URL https://discord.com/api/webhooks/...
Username AzaCraft Live
Content <@&123456789012345678> 🔴 **%broadcastUser% ist live!** **Game:** %game% **Titel:** %title% https://twitch.tv/%broadcastUser%
AzaCraft Live: @Stream-Notify 🔴 AzaCraft ist live! · Game: Minecraft · Titel: Building the Best Castle: https://twitch.tv/azacraft
So sieht's im Chat aus
  1. 1 Global Get: lastDiscordAnnounce → lastAnnounce (Persisted, default 0)
  2. 2 Set Argument: announceDiff = $sub(%timestampUnix%,%lastAnnounce%)$
  3. 3 If/Else: %announceDiff% Less Than 1800
    1. Then 3a Break (Anti-Doppelpost-Guard)
  4. 4 Global Set: lastDiscordAnnounce = %timestampUnix% (Persisted)
  5. 5 Discord Basic Webhook: Multi-Line mit Role-Ping + Game + Titel + Twitch-Link

Discord-Role-ID kriegst du via Rechtsklick auf die Rolle → ID kopieren (Developer Mode in Discord-Settings aktiv). Format: <@&123456789012345678>.

Wichtig:

  • Channel-Permission: Everyone darf Rollen erwähnen ODER pro Webhook im Discord-Server-Setting freigeben
  • Die Rolle muss in Discord auf „Mentionable“ = an stehen
  • Webhook darf @everyone nur wenn Webhook Username nicht protected ist
Stream-StartDiff zum letzten AnnounceResultat
Neuer Stream nach 12 h43200 s✅ Posted
OBS crashed + neu connected nach 8 min480 s❌ Geblockt (30-Min-Sperre)
Test-Stream + sofort wieder offline + nochmal an nach 5 min300 s❌ Geblockt
Erster Stream überhaupt (lastAnnounce = 0)1748534400+ s✅ Posted

Webhook kann auch JSON-Embeds rendern: größere Card mit Custom Color, Thumbnail, Footer. Geht via C#-Execute-Code mit HttpClient.PostAsync an die Webhook-URL. JSON-Body:

{
"username": "AzaCraft Live",
"content": "<@&123456789012345678>",
"embeds": [{
"title": "AzaCraft ist live!",
"url": "https://twitch.tv/azacraft",
"color": 9520895,
"fields": [
{ "name": "Game", "value": "Minecraft", "inline": true },
{ "name": "Titel", "value": "Building the Best Castle", "inline": true }
],
"thumbnail": { "url": "https://static-cdn.jtvnw.net/jtv_user_pictures/azacraft-profile_image-300x300.png" }
}]
}

Pragmatisch: für die meisten Streamer ist Plain-Text mit URL völlig ausreichend, weil Discord die Card eh baut.

Pro Server ein eigener Webhook → eine Sub-Action 5 pro Webhook duplizieren. Content identisch lassen oder pro Server anpassen (z. B. Community-Server vs Personal-Server mit anderer Tonalität).

Eigene Action [Event] Stream Offline → Discord mit Trigger Stream Offline. Postet z. B. „Stream beendet. VOD verfügbar in 2 h“. Setzt keinen Guard zurück (Guard ist nur für Online-Doppelpost relevant).

  • Doppelpost trotz Guard: passiert wenn lastDiscordAnnounce nicht persistent ist. Toggle prüfen.
  • Discord-Embed-Card lädt nicht: Twitch-API ist manchmal langsam, Card kommt 30 s später. Reload-Bug von Discord, nicht von SB.
  • Role-Ping rendert als Text: entweder Mentionable = aus an der Rolle oder Channel-Permission „Erwähnen“. Beide prüfen.
  • Webhook 429 (Rate-Limit): bei sehr vielen Streams am Tag (sollte nicht passieren). Discord blockt für ein paar Sekunden, SB schickt nicht nach. Nochmal triggern.
  • Game leer: bei Twitch-API-Hänger kann %game% leer sein. Pre-Check mit If/Else auf empty + Fallback "Just Chatting" setzen.
  • Twitch-Login vs Display-Name: %broadcastUser% ist meist der Login (klein, ohne Sonderzeichen). Wenn dein Display-Name AzaCräft ist, manuell hardcoden statt Variable.
  • Game-Tag als Pin: bei %game% == "Minecraft": zusätzlich <@&MINECRAFT_ROLE> pingen
  • Mehrsprachiger Post: DE + EN parallel in unterschiedlichen Channels
  • Stats vom letzten Stream mit anhängen: Watchtime + Sub-Count + Top-Clip aus dem Stream-Offline-Stats Pattern
  • Twitter / Bluesky parallel: eigene Action mit Trigger Stream Online + zweiter Sub-Action für Twitter-API (via C#)