!addcommand Fortgeschritten !addcom · !cmdadd
Legt einen Persisted Global mit Prefix dyn_ an. Der Universal-Listener (siehe Setup) gibt den Response aus, sobald jemand !name schreibt.
Mindestens 2 Args nötig: !commandname + Text.
Input %rawInput% Operation Is Null or Empty
1a Then Send Message to Channel: Hilfe Twitch › Chat › Send Message to Channel Message @%user% nutze !addcommand !name <response-text>
Stoppt die laufende Action. Alle folgenden Sub-Actions in derselben Action werden übersprungen.
2 Set Argument: Command-Name extrahieren Core › Arguments › Set Argument Erstes Wort aus rawInput, ohne ! und lowercase.
Variable Name newCmdName Value $lower($replace(%input0%, !, ))$
Wenn der User nur `!addcommand` ohne ! geschrieben hat.
Input %newCmdName% Operation Is Null or Empty
3a Then Send Message to Channel Twitch › Chat › Send Message to Channel Message @%user% Command-Name fehlt. Beispiel: !addcommand !regeln Sei nett.
Stoppt die laufende Action. Alle folgenden Sub-Actions in derselben Action werden übersprungen.
4 Set Argument: Response-Text Core › Arguments › Set Argument Alles ab dem zweiten Wort. $args1$ ist der String ab Argument-Index 1.
Variable Name newCmdResponse Value $args1$
Input %newCmdResponse% Operation Is Null or Empty
5a Then Send Message to Channel Twitch › Chat › Send Message to Channel Message @%user% Response-Text fehlt. Beispiel: !addcommand !regeln Sei nett.
Stoppt die laufende Action. Alle folgenden Sub-Actions in derselben Action werden übersprungen.
6 Get Global. Existiert schon? Core › Globals › Global (Get) Wenn der Global bereits existiert, ist das ein Edit. User soll !editcommand nutzen.
Global Name $concat("dyn_", %newCmdName%)$ Variable Name existingCmd Persisted aktiv
Input %existingCmd% Operation Is Not Null or Empty
7a Then Send Message to Channel Twitch › Chat › Send Message to Channel Message @%user% !%newCmdName% existiert schon: nutze !editcommand zum Ändern.
Stoppt die laufende Action. Alle folgenden Sub-Actions in derselben Action werden übersprungen.
8 Set Global. Persisted Response speichern Core › Globals › Global (Set) Der Listener wird beim nächsten !newCmdName diesen Wert ausgeben.
Global Name $concat("dyn_", %newCmdName%)$ Value %newCmdResponse% Source Global Persisted aktiv
9 Get Global. Aktueller Index Core › Globals › Global (Get) Lädt die kommagetrennte Liste: kann leer sein beim ersten Add.
Global Name dyn_dynCommandsIndex Variable Name cmdIndex Persisted aktiv
10 Set Argument: Neuen Index bauen Core › Arguments › Set Argument Wenn Index leer: nur neuer Name. Sonst: alter Index + Komma + neuer Name.
Variable Name newIndex Value $if(%cmdIndex% == "", %newCmdName%, $concat(%cmdIndex%, ",", %newCmdName%)$)$
11 Set Global. Index speichern + Confirm Core › Globals › Global (Set) Global Name dyn_dynCommandsIndex Value %newIndex% Source Global Persisted aktiv
12 Send Message: Bestätigung Twitch › Chat › Send Message to Channel Message ✅ @%user% !%newCmdName% angelegt.
A AzaBot : ✅ @ModUser !regeln angelegt.
↑ So sieht's im Chat aus
1 If/Else: %rawInput% Is Null or Empty
Then 1a Send Message: Hilfe 2 Set Argument: newCmdName = $lower($replace(%input0%, !, ))$ 3 If/Else: %newCmdName% Is Null or Empty
Then 3a Send Message: Name fehlt 4 Set Argument: newCmdResponse = $args1$ 5 If/Else: %newCmdResponse% Is Null or Empty
Then 5a Send Message: Response fehlt 6 Get Global (Persisted): dyn_<name> → existingCmd 7 If/Else: %existingCmd% Is Not Null or Empty
Then 7a Send Message: Existiert schon 8 Set Global (Persisted): dyn_<name> = %newCmdResponse% 9 Get Global (Persisted): dyn_dynCommandsIndex → cmdIndex 10 Set Argument: newIndex = $if(...) 11 Set Global (Persisted): dyn_dynCommandsIndex = %newIndex% 12 Send Message: ✅ Bestätigung
Feld Wert Name !addcommandCommands !addcommand!addcom!cmdaddUser Cooldown 0 Grant Type AllowGroups Moderators
Chat Resultat !addcommand !regeln Sei nett. Kein Spoiler.Global dyn_regeln = Sei nett. Kein Spoiler.: ab sofort triggerbar mit !regeln !addcommand !wasser Trink @%user% ein Glas Wasser!Mit Variable im Response: !wasser gibt User-spezifisch aus !addcommand !setupFehler: Response-Text fehlt !addcommand regeln Sei nettWird trotzdem akzeptiert: $replace(%input0%, !, )$ ignoriert fehlendes ! !addcommand !regeln neuer text (existiert schon)Fehler-Hinweis auf !editcommand
Args-Parsing : $args1$ liefert alle Args ab Index 1 inkl. Leerzeichen. Wenn dein Response Anführungszeichen enthält (!addcommand !test "hi"), kommen die Quotes mit rein.
Race-Condition beim Index : wenn zwei Mods gleichzeitig !addcommand triggern, könnten Schritt 9 → 10 → 11 sich überschneiden und ein Eintrag fehlt im Index. Praktisch fast nie ein Problem; Worst-Case einmal !commands mit fehlendem Eintrag → kein Datenverlust, der Command selbst existiert.
Casing-Konsistenz : Schritt 2 macht $lower(...)$. !ADDCOMMAND !TEST hi legt dyn_test an, was zum Listener-Lookup (auch lowercase) passt.
Maximale Länge : Twitch erlaubt 500 Zeichen pro Chat-Message. Da !addcommand !name <response> deinen 500-Char-Slot teilt, sind in der Praxis ~470 Zeichen Response möglich.
Reserved Names : wenn ein Mod !addcommand !so neuer-text macht und du !so als statischen Command hast, feuern beide. Siehe Setup → Edge-Cases .
Backup-Export : eine Action die alle dyn_*-Globals via C# in ein JSON exportiert. Damit kannst du Mod-Commands sichern, wenn du Streamer.bot neu aufsetzt.
Cooldown pro dynamischem Command : ein weiterer Global dyn_cooldown_<name> mit Timestamp + Listener-Check vor dem Send Message.
Statistik : dyn_uses_<name> zählt mit, wie oft jeder Command getriggert wurde: dann kannst du via !commands die meistgenutzten zuerst ausgeben.
Import-String folgt
Die Action ist 1:1 nach Anleitung oben nachbaubar.