Run Action — Direkte Subroutinen¶
Action ruft eine andere Action direkt auf. Wie eine Function. Variablen werden geteilt.
Sub-Action: Core → Actions → Run Action
Doku: https://docs.streamer.bot/api/sub-actions/core/actions/run-action
Felder¶
| Feld | Bedeutung |
|---|---|
| Action | Welche Action ausgeführt werden soll |
| Run Action Immediately | Toggle. ✅ = inline, wartet bis Action fertig. ❌ = async in eigener Queue |
Run Immediately vs Async¶
Immediately (Synchron)¶
[Cmd] !x
├── 1. Send Message: "Start"
├── 2. Run Action: SubRoutine (Immediately ✅) ← wartet bis fertig
└── 3. Send Message: "End"
Reihenfolge: Start → SubRoutine läuft komplett → End.
Async¶
[Cmd] !x
├── 1. Send Message: "Start"
├── 2. Run Action: SubRoutine (Immediately ❌) ← läuft im Hintergrund
└── 3. Send Message: "End"
Reihenfolge: Start → End. SubRoutine läuft parallel im Hintergrund.
Variable-Sharing¶
Wenn Run Immediately = true:
- Variablen die der Sub-Action setzt sind nach Run Action im Caller verfügbar
- Caller's Variablen sind in der Sub-Action verfügbar
Beispiel:
[Sys] CalculateScore
└── Set Argument: finalScore = $mul(%input%, 2)$
[Cmd] !score
├── 1. Set Argument: input = 42
├── 2. Run Action: CalculateScore (Immediately ✅)
└── 3. Send Message: "Score: %finalScore%" ← gesetzt von CalculateScore
Output: "Score: 84".
Use-Case A: Wiederverwendbare Helper-Action¶
Mehrere Commands brauchen gleiche Validierungs-Logik (Target-User aus Input ziehen + fallback).
Helper: [Sys] Resolve Target¶
[Sys] Resolve Target
├── 1. Set Argument: targetLogin = $replace(%input0%, @, )$
├── 2. If/Else: %targetLogin% Is Null or Empty
│ └── Set Argument: targetLogin = %userName%
└── 3. Get User Info for Target (User Login = %targetLogin%)
Caller: jeder Command der Target braucht¶
[Cmd] !iq
├── 1. Run Action: Resolve Target (Immediately ✅)
│ Setzt %targetLogin%, %targetUser%, %addTargetResult%, ...
├── 2. (Rest der !iq Logic)
DRY: Don't Repeat Yourself. Bei Logik-Änderung nur EINE Stelle anpassen.
Use-Case B: Conditional Action-Dispatch¶
[Cmd] !mode
├── 1. If/Else: %input0% Equals "stream"
│ ├── Run Action: SetupStreamMode (Immediately ✅)
│ └── Break
├── 2. If/Else: %input0% Equals "brb"
│ ├── Run Action: SetupBrbMode (Immediately ✅)
│ └── Break
└── 3. Run Action: SetupChillMode (Immediately ✅)
Routing-Pattern: ein Command, viele Sub-Actions je nach Input.
Use-Case C: Async Background-Task¶
Aufwendige Operation soll nicht den Caller blockieren.
[Cmd] !generate-stats
├── 1. Send Message: "📊 Stats werden generiert, dauert kurz..."
├── 2. Run Action: HeavyStatsGen (Immediately ❌) ← async
└── 3. (Caller endet sofort, HeavyStatsGen läuft im Hintergrund)
HeavyStatsGen macht 30 Sekunden lang Berechnungen und postet am Ende selbst die Stats.
Custom Event vs Run Action¶
| Wann | Custom Event | Run Action |
|---|---|---|
| Mehrere Listener | ✅ Pattern dafür | nein |
| 1:1 Routing | umständlich | ✅ |
| Variable-Sharing | mit Use Args |
direkt |
| Sequential | parallel | sync möglich |
| Loose Coupling | ✅ | nein (Listener kennt Caller) |
Faustregel: Run Action für 1:1-Calls, Custom Event für Pub/Sub.
Variante: Recursive Run Action¶
Eine Action kann sich SELBST aufrufen. Nutzbar für Polling/Retry-Patterns aber gefährlich.
[Sys] Wait For Condition
├── 1. Fetch URL: API-Status → %status%
├── 2. If/Else: %status% Equals "ready"
│ ├── Custom Event Trigger: "apiReady"
│ └── Break
├── 3. Delay 5000 ms
└── 4. Run Action: Wait For Condition (Immediately ❌) ← rekursiv
Vorsicht: ohne Break-Condition Endlos-Loop. Plus: Streamer.bot kann bei tief geschachtelten Recursions abkacken.
Variante: Run Action Group¶
Core → Actions → Set Action Group State aktiviert/deaktiviert eine ganze Action-Gruppe. Nicht "Run all" — aber wenn du Stream-Modus-Wechsel hast, kannst du Gruppen disablen/enablen:
[Cmd] !stream-mode
├── Set Action Group State: "Stream Actions" = Enabled
└── Set Action Group State: "BRB Actions" = Disabled
So switchst du zwischen "Stream-aktive Actions" und "BRB-Modus-Actions".
Häufige Fallen¶
- Action nicht selektiert — Sub-Action zeigt leeres Ziel → silently fails
- Run Immediately = false misverstanden — wenn du Variablen vom Sub-Action brauchst MUSS Immediately ✅ sein
- Recursive Endlos-Loop — immer Exit-Bedingung
- Caller pausiert ewig — wenn Sub-Action 60s+ braucht, blockiert Caller. Async oder Queue nutzen
- Sub-Action Caller braucht Trigger — eine Action ohne Trigger kann trotzdem via Run Action aufgerufen werden. Ist OK
Quellen¶
- Run Action: https://docs.streamer.bot/api/sub-actions/core/actions/run-action
- Set Action State: https://docs.streamer.bot/api/sub-actions/core/actions/set-action-state
- Set Action Group State: https://docs.streamer.bot/api/sub-actions/core/actions/set-action-group-state