Dynamic-Commands: Setup
Dynamic-Commands sind Commands, die nicht in Streamer.bot angelegt sind, sondern als Persisted Global gespeichert werden. Mods können sie per Chat anlegen, ändern und löschen: du musst nie wieder das Streamer.bot-Fenster öffnen, nur um einen neuen Spruch-Command zu bauen.
Pattern auf einen Blick
Abschnitt betitelt „Pattern auf einen Blick“| Was | Wo gespeichert | Wer darf |
|---|---|---|
Statische Commands (!discord, !socials) | In Streamer.bot als Action | Du, im Editor |
Dynamische Commands (!regeln, !setup, !tipp) | Als Persisted Global mit Prefix dyn_ | Mods per Chat |
Der Grund für die Trennung: Komplexe Commands mit Sub-Actions (!so, !followage, !quote) gehören in Streamer.bot. Simple Text-Commands („was ist deine Settings?“) können Mods selbst pflegen.
Storage-Convention
Abschnitt betitelt „Storage-Convention“| Global-Name | Inhalt | Source |
|---|---|---|
dyn_regeln | „Sei nett. Kein Spoiler. Viel Spaß.“ | Global, Persisted |
dyn_setup | „Siehe !pc, !mouse, !keyboard, !chair.“ | Global, Persisted |
dyn_dynCommandsIndex | regeln,setup,tipp,wasser | Global, Persisted |
Der Prefix dyn_ ist Pflicht: sonst kannst du eigene und SB-Built-in-Globals nicht unterscheiden. Der Index dyn_dynCommandsIndex ist eine kommagetrennte Liste aller Command-Namen ohne ! und ohne dyn_-Prefix. Wird beim Add/Edit/Del mitgepflegt und für !commands gelesen.
Drei Bausteine
Abschnitt betitelt „Drei Bausteine“[Cmd] !addcommand → Persisted Global setzen + Index updaten[Cmd] !editcommand → Persisted Global überschreiben (mit Existenz-Check)[Cmd] !delcommand → Persisted Global löschen + Index updaten[Cmd] !commands → Index ausgeben[Listener] dyn-router → Auf jede Chat-Message reagieren, wenn !word → dyn_word ausgebenDie ersten vier sind Mod-Commands und werden in den folgenden Seiten erklärt. Der Listener ist der Kern: ohne ihn machen die Globals nichts. Er kommt jetzt.
Universal-Listener ([Listener] dyn-router)
Abschnitt betitelt „Universal-Listener ([Listener] dyn-router)“Trigger: Twitch → Chat Message (jede Nachricht, nicht Command-spezifisch).
If/Else: Startet mit !
Frühe Abkürzung: 99% aller Chat-Messages sind keine Commands.
| Input | %messageStripped% |
|---|---|
| Operation | Starts With |
| Comparison | ! |
Break
Wenn kein !-Prefix, ist es keine Command-Anfrage.
Set Argument: Erste Wort als Command-Name extrahieren
messageStripped ohne ! und ohne alles ab dem ersten Leerzeichen.
| Variable Name | dynName |
|---|---|
| Value | $lower($substring($replace(%messageStripped%, !, ), 0, $indexOf($concat($replace(%messageStripped%, !, ), " "), " "))$)$ |
Get Global: dyn_<name>
Lädt den Response-Text. Wenn Global nicht existiert, ist dynResponse leer.
| Global Name | $concat("dyn_", %dynName%)$ |
|---|---|
| Variable Name | dynResponse |
| Persisted | aktiv |
If/Else: Kein dynamischer Command
| Input | %dynResponse% |
|---|---|
| Operation | Is Null or Empty |
Break
Send Message to Channel
Der dynamische Response: kann %user%, %targetUser%, %channel% enthalten.
| Message | %dynResponse% |
|---|
Listener-Einstellungen
Abschnitt betitelt „Listener-Einstellungen“| Feld | Wert |
|---|---|
| Action-Name | [Listener] dyn-router |
| Trigger | Twitch → Chat Message (nicht „Command Triggered“!) |
| Group | Eigene Group Listeners oder direkt in Misc |
| Enabled | aktiv |
Variablen im Response-Text
Abschnitt betitelt „Variablen im Response-Text“Da Send Message Argument-Parsing macht, kannst du SB-Variablen direkt in den gespeicherten Text einbauen:
| Im Persisted Global gespeichert | Ausgabe im Chat |
|---|---|
Hi @%user%, willkommen! | Hi @AzaCraft, willkommen! |
Stream läuft seit %streamUptime% | Stream läuft seit 02:14:33 |
@%targetUser% du bist toll! | wenn jemand !nice @bob schreibt → @bob du bist toll! |
Mods müssen also nicht extra Templating lernen: die normalen SB-Variablen funktionieren überall.
Edge-Cases
Abschnitt betitelt „Edge-Cases“- Collision mit statischen Commands: wenn du
!regelnals statischen Command angelegt hast und Mods!addcommand !regeln ...ausführen, feuern beide. Der statische Command via „Command Triggered“, der dynamische via Listener. Mod-Process-Reihenfolge ist undefiniert. Lösung: in[Listener] dyn-routereinen If/Else einbauen, der bekannte statische Command-Namen abfängt und Break setzt. - Performance: der Listener läuft auf jeder Chat-Message. Das ist okay (SB packt locker tausende Messages pro Sekunde), aber halte die Sub-Actions schlank: kein C# Execute mit Heavy Logic.
- Casing: Schritt 2 macht
$lower(...)$damit!REGELNund!Regelndenselben Global treffen. Das musst du beim Anlegen (!addcommand) auch tun: sonst landet der Global alsdyn_REGELNund der Listener findet ihn nicht. - Sonderzeichen im Command-Namen:
!discord-linkwürde alsdyn_discord-linkgespeichert. Globals erlauben Bindestriche, aber Mods werden eher Underscore tippen wollen. Du kannst in Schritt 2 noch ein$replace(..., -, _)$einbauen, wenn du das vereinheitlichen willst. - Index pflegen: der
dyn_dynCommandsIndexist optional, aber!commandsbraucht ihn. Wenn du ihn nicht pflegst, fällt nur die Listing-Funktion weg.
Mod-Permission als Default
Abschnitt betitelt „Mod-Permission als Default“Add/Edit/Del haben standardmäßig Allow + Moderators als Permission. User können nur lesen (per Chat triggern), nicht schreiben. Wenn du VIPs oder Subs auch schreiben lassen willst, ergänze die Groups im Command-Trigger: siehe Permissions-Setup.
Was als Nächstes
Abschnitt betitelt „Was als Nächstes“| Page | Wofür |
|---|---|
!addcommand | Neuen dynamischen Command anlegen |
!editcommand | Bestehenden überschreiben |
!delcommand | Löschen |
!commands | Liste aller dynamischen Commands |