Zum Inhalt springen
  • Dunkel
  • Hell
  • System

!counter

Statt für jeden Zähl-Bedarf einen eigenen Command zu bauen, gibt es hier genau einen. !counter liest das erste Wort als Sub-Command, routet per Switch und arbeitet immer auf einem aktiven Zähler. So zählst du im FPS-Grind Revives, Clutches, Fails oder Team-Wipes mit demselben Command, einfach durch Umschalten des aktiven Labels.

Zwei Arten von Persisted Globals halten den Zustand zusammen:

  • activeCounter hält den Namen des gerade aktiven Zählers, zum Beispiel revives. Genau ein Global, das per !counter new <name> umgeschaltet wird.
  • cnt_<label> hält den Wert je Zähler. Schaltest du mit !counter new clutches um, schreibt jedes Plus ab dann in cnt_clutches. Der alte cnt_revives bleibt unangetastet erhalten.

Beide sind Persisted, überleben also einen Streamer.bot-Restart. Der Trick ist der dynamische Schlüssel: Der Variablen-Name des Wert-Globals wird zur Laufzeit aus cnt_ plus dem aktiven Label zusammengesetzt. Dadurch verwaltet eine einzige Action beliebig viele Zähler, ohne dass du je wieder etwas am Command anfasst.

Wichtig fürs Verständnis: Global (Set) im Increment- oder Decrement-Modus erhöht oder senkt den gespeicherten Wert, gibt ihn aber nicht zurück. Wer den neuen Stand posten will, holt ihn danach mit einem eigenen Global (Get) in ein lokales Argument. Genau diese Reihenfolge Set, dann Get steckt unten in den Plus- und Minus-Cases.

Eine Action liest das Sub-Command, fängt den Leerfall ab und routet per Switch in den passenden Zweig.

Set Argument: Sub-Command

Core Arguments Set Argument

Erstes Wort der Nachricht als Sub-Command isolieren.

Variable Name sub
Value %input0%

If/Else: Sub-Command Fallback

Core Logic If/Else

Ist nichts angegeben, soll der Switch in den Default-Zweig fallen. Im Then-Branch sub auf Leerstring setzen, damit kein null-Vergleich scheitert.

Input %sub%
Operation Is Null or Empty

Switch: Routing auf %sub%

Core Logic Switch

Vergleicht %sub% gegen die Cases new, use, +, -, set. Jeder Case führt eine eigene Sequenz aus und endet mit Break. Trifft kein Case zu, läuft der Default-Zweig (Anzeige).

Value to compare %sub%
Comparison Equals (Ignore Case)

Case new / use: Aktiven Zähler umschalten

Core Globals Global (Set)

Nimmt input1 als neues Label und schreibt es nach activeCounter. Mod-only. Setzt nur den Namen, nicht den Wert: ein vorhandener cnt_<label> bleibt erhalten.

Destination Global
Persisted true
Variable Name activeCounter
Value %input1%

Case new / use: Send Message

Twitch Chat Send Message to Channel
Message Aktiver Zähler: %input1%

Case +: Aktives Label holen

Core Globals Global (Get)

Mod-only. Welcher Zähler aktuell aktiv ist. Fehlt activeCounter noch, greift der Default counter.

Source Global
Variable Name activeCounter
Persisted true
Default Value counter
Variable Name (Destination) label

Case +: Hochzählen

Core Globals Global (Set)

Mode Increment erhöht cnt_%label% um 1. Der neue Wert wird hier noch nicht zurückgegeben, dafür folgt direkt ein Global (Get).

Destination Global
Persisted true
Variable Name cnt_%label%
Mode Increment
Increment Amount 1

Case +: Neuen Wert lesen

Core Globals Global (Get)

Holt den frisch erhöhten Stand aus cnt_%label% in ein lokales Argument, weil Global (Set) den Wert nicht selbst liefert. Fehlt der Zähler noch, greift Default 0.

Source Global
Variable Name cnt_%label%
Persisted true
Default Value 0
Variable Name (Destination) val

Case +: Send Message

Twitch Chat Send Message to Channel
Message %label%: %val%

Case -: Aktives Label holen

Core Globals Global (Get)

Mod-only. Gleicher Get wie bei Plus, damit cnt_%label% den richtigen Zähler trifft.

Source Global
Variable Name activeCounter
Persisted true
Default Value counter
Variable Name (Destination) label

Case -: Herunterzählen

Core Globals Global (Set)

Wie Plus, nur Mode Decrement. Mod-only.

Destination Global
Persisted true
Variable Name cnt_%label%
Mode Decrement
Decrement Amount 1

Case -: Neuen Wert lesen

Core Globals Global (Get)

Holt den gesenkten Stand nach val. Optionaler If/Else davor klemmt negative Werte auf 0, siehe Häufige Fallen.

Source Global
Variable Name cnt_%label%
Persisted true
Default Value 0
Variable Name (Destination) val

Case -: Send Message

Twitch Chat Send Message to Channel
Message %label%: %val%

Case set: Aktives Label holen

Core Globals Global (Get)

Mod-only. Auf welchen Zähler set wirken soll.

Source Global
Variable Name activeCounter
Persisted true
Default Value counter
Variable Name (Destination) label

Case set: Wert direkt setzen

Core Globals Global (Set)

Nimmt input1 als Zahl und schreibt sie direkt nach cnt_%label%. Mod-only. Damit setzt du etwa auf 0 zum Neustart einer Session.

Destination Global
Persisted true
Variable Name cnt_%label%
Value %input1%

Case set: Send Message

Twitch Chat Send Message to Channel
Message %label% gesetzt auf %input1%

Default-Case: Aktives Label holen

Core Globals Global (Get)

Greift wenn kein Sub-Command passt oder die Nachricht leer war. Holt activeCounter mit Default counter.

Source Global
Variable Name activeCounter
Persisted true
Default Value counter
Variable Name (Destination) label

Default-Case: Wert holen

Core Globals Global (Get)

Dynamischer Schlüssel cnt_%label%. Fehlt der Zähler noch, greift Default 0.

Source Global
Variable Name cnt_%label%
Persisted true
Default Value 0
Variable Name (Destination) val

Default-Case: Send Message

Twitch Chat Send Message to Channel
Message 📊 %label%: %val%
AzaBot: 📊 revives: 7
Anzeige des aktiven Zählers nach mehreren !counter +

Der Switch ist der zentrale Verteiler. Jeder Case ist eine eigene Sequenz, die mit Break endet, damit nicht versehentlich weitere Cases durchlaufen. Trifft kein Case, greift der Default-Zweig mit der reinen Anzeige. Bei Plus und Minus folgt nach dem Set immer ein Get, weil Global (Set) den neuen Wert nicht selbst zurückgibt.

  1. 1 Set Argument: sub = %input0%
  2. 2 If/Else: %sub% Is Null or Empty
    1. Then 2a Set Argument: sub = (Leerstring)
  3. 3 Switch auf %sub%
    1. Then 3a Case "new" / "use" (Mod): Global (Set) activeCounter = %input1%
    2. Then 3b Send Message: "Aktiver Zähler: %input1%" + Break
    3. Then 3c Case "+" (Mod): Global (Get) activeCounter -> label
    4. Then 3d Global (Set) cnt_%label% Increment 1
    5. Then 3e Global (Get) cnt_%label% -> val
    6. Then 3f Send Message: "%label%: %val%" + Break
    7. Then 3g Case "-" (Mod): wie "+", aber Set im Decrement-Modus, dann Get + Break
    8. Then 3h Case "set" (Mod): Global (Get) activeCounter -> label
    9. Then 3i Global (Set) cnt_%label% = %input1% + Send Message + Break
    10. Else 3j Default: Global (Get) activeCounter -> label (Default counter)
    11. Else 3k Global (Get) cnt_%label% -> val (Default 0)
    12. Else 3l Send Message: "📊 %label%: %val%"
FeldWert
Name!counter
GroupAzaCraft Standard
Commands!counter
SourcesTwitch Message
Global Cooldown0
User Cooldown3
PermissionEveryone (Anzeige)

Der Command selbst steht auf Everyone, damit jeder den Stand abfragen kann. Die mutierenden Sub-Commands brauchen Mod-Rechte. Setze dafür in den Branches new, use, +, - und set die Sub-Action-Permission auf Moderator. Eine einfachere Variante: ein vorgeschaltetes If/Else, das bei nicht-Mod und gesetztem Mutations-Sub-Command per Break abbricht.

ChatResultat
!counter new revives„Aktiver Zähler: revives“ (nur Mod)
!counter +„revives: 1“, „revives: 2“ … (nur Mod)
!counter„📊 revives: 2“ (jeder)
!counter set 0„revives gesetzt auf 0“ (nur Mod)
!counter use clutchesWechselt aktiv auf den Zähler clutches

Da jeder Zähler unter cnt_<label> liegt, gehen die Werte beim Umschalten nicht verloren. Du kannst also während einer Session zwischen revives, clutches und wipes hin und her wechseln und jeder behält seinen Stand. Für eine Übersicht aller Zähler legst du dir einen Begleiter-Command !counters an, der die bekannten Labels einzeln per Global (Get) holt und in einer Zeile postet.

  • Switch ist case-sensitive: Stelle die Comparison auf Equals (Ignore Case), sonst trifft New den Case new nicht. Ohne Ignore Case landen Tippvarianten still im Default-Zweig.
  • Increment liefert keinen Wert zurück: Global (Set) im Increment- oder Decrement-Modus ändert nur den gespeicherten Stand. Den neuen Wert holst du danach mit einem eigenen Global (Get) nach val, sonst postet die Send Message den alten oder einen leeren Stand.
  • Label mit Leerzeichen: !counter new team wipes setzt activeCounter nur auf team, weil wipes in input2 landet. Entweder ein Wort verwenden oder das Label vorab mit $replace(%input1%, " ", _)$ zusammenziehen.
  • activeCounter nie gesetzt: Ohne vorheriges !counter new ... greift der Default counter, der Stand landet also in cnt_counter. Das ist gewollt, kann aber verwirren wenn man revives erwartet. Einmal !counter new revives setzen.
  • Persisted vergessen: Steht der Haken Persisted nicht, sind nach jedem Streamer.bot-Restart alle Zähler und der aktive Name weg. Sowohl activeCounter als auch jeder cnt_<label> müssen Persisted sein.
  • Wert ist negativ möglich: Decrement läuft auch unter 0. Wenn das stören würde, im Minus-Case nach dem Get ein If/Else %val% Less Than 0 (in Backticks: weniger als 0) vorschalten und per Global (Set) auf 0 klemmen.