!findquote · !sq
Sucht alle Quotes nach einem Stichwort und postet die erste passende. Nutzt C# Execute Code, weil Streamer.bot keine native Quote-Search hat.
Streamer.bot hat Get Quote (Random/Specific) aber keinen Search-by-Text. Wir lösen das mit einem C# Execute Code Sub-Action, das CPH.GetQuotes() loop’t.
Input %rawInput% Operation Is Null or Empty
1a Then Send Message to Channel Twitch › Chat › Send Message to Channel Message @%user% nutze !searchquote <stichwort>
Stoppt die laufende Action. Alle folgenden Sub-Actions in derselben Action werden übersprungen.
2 Execute Code. Quote Search Core › C# Code › Execute C# Code Loop't alle Quotes via CPH.GetQuotes() und findet die erste mit Match. Setzt %foundQuote%, %foundQuoteId%, %foundQuoteUser%, %foundQuoteGame%.
Code (siehe unten) siehe nächster Abschnitt
string query = args [ " rawInput " ] . ToString () . ToLower ();
var quotes = CPH . GetQuotes ();
foreach ( var q in quotes)
if ( q . Quote . ToLower () . Contains (query))
CPH . SetArgument ( " foundQuote " , q . Quote );
CPH . SetArgument ( " foundQuoteId " , q . Id );
CPH . SetArgument ( " foundQuoteUser " , q . UserName );
CPH . SetArgument ( " foundQuoteGame " , q . Game );
CPH . SetArgument ( " foundQuoteTime " , q . CreatedAt . ToString ( " dd.MM.yyyy " ));
CPH . SetArgument ( " foundQuoteMatch " , " true " );
CPH . SetArgument ( " foundQuoteMatch " , " false " );
Input %foundQuoteMatch% Operation Equals Value false
3a Then Send Message to Channel: Keine Quote Twitch › Chat › Send Message to Channel Message @%user% Keine Quote zu „%rawInput%“ gefunden.
Stoppt die laufende Action. Alle folgenden Sub-Actions in derselben Action werden übersprungen.
4 Send Message: Match Twitch › Chat › Send Message to Channel Message 📝 Quote #%foundQuoteId%: „%foundQuote%“: %foundQuoteUser%, %foundQuoteGame% (%foundQuoteTime%)
A AzaBot : 📝 Quote #19: „Boss-Fight gewonnen mit 1 HP.“. Streamer, Elden Ring (10.04.2025)
↑ So sieht's im Chat aus
1 If/Else: %rawInput% Is Null or Empty
Then 1a Send Message: Hilfe 2 Execute Code (C#): Quote-Search Loop 3 If/Else: %foundQuoteMatch% Equals false
Then 3a Send Message: Keine Quote
Feld Wert Name !searchquoteCommands !searchquote!findquote!sqUser Cooldown 30 Global Cooldown 10
Performance: Bei sehr vielen Quotes (10k+) wird der Loop spürbar. Bei normalen Quote-DBs ( < 500) instant.
Case-Insensitive: .ToLower() macht Search case-insensitive: !sq BOSS findet auch „boss“.
Mehrere Matches: Aktuelle Version returnt nur die erste. Für Random-Match quotes.Where(...).ToList() + Random.Next(list.Count).
Special Chars: " in Query muss nicht escaped werden: %rawInput% wird als String übergeben, C# nimmt es als ist.
Multi-Match Random: Bei mehreren Treffern → random pick. Code:
var matches = quotes . Where (q => q . Quote . ToLower () . Contains (query)) . ToList ();
if ( matches . Any ()) { var pick = matches [ new Random() . Next ( matches . Count )]; .. . }
Match-Count anzeigen: Anzahl Treffer in Message: „Quote #19 (5 weitere Treffer)“.
Search-by-User: !quoteby ist genau das: siehe quoteby .
Import-String folgt
Die Action ist 1:1 nach Anleitung oben nachbaubar.