Systém Event Flow

Průvodce editorem Event Flow

Vytvářejte spolehlivé automatizace pro Social Stream Ninja. Tento návod vysvětluje základy, logické uzly, tok signálů a praktické postupy, na které se tvůrci nejčastěji ptají (například jak zabránit ozvěnám v chatu a kdy skládat bloky AND/NOT).

Čeština

0. Rychlá orientace

Event Flow je editor založený na uzlech. Každé propojení přenáší data zprávy a logický stav (true = pokračovat, false = zastavit). Použijte zdroje pro vkládání událostí, logické uzly pro filtrování rozhodnutí a akce pro provedení akcí (odeslání do chatu, ovládání překryvů, přeposílání zpráv atd.).
Potřebujete si zapamatovat účastníky, později ověřovat způsobilost, losovat mezi jedinečnými uživateli nebo vymazat jeden pojmenovaný seznam? Otevřete Průvodce pamětí uživatelů pro model sdíleného stavu, snímky obrazovky a importovatelný příklad.

Co je tento editor?

Editor Event Flow představuje pokročilou automatizaci Social Stream Ninja. Doplňuje jednoduché přepínače nabídky a umožňuje sestavit vlastní logiku směrování. Použijte jej, když potřebujete:

  • Předávejte chat mezi službami s filtry (např. zrcadlete Twitch do Discordu, ale blokujte příkazy).
  • Vytvářejte věrnostní příkazy, hry s klíčovými slovy nebo podmínky účasti v losování pomocí logiky AND/OR/NOT.
  • Spouštějte vlastní překryvy, zvuk, scény OBS nebo webhooky podle dat, která v toku obohatíte.
  • Kombinujte více platforem v jedné automatizaci (Kick + Twitch + YouTube směrované jedním scénářem).

Nabídku chápejte jako rychlé předvolby a Event Flow jako sadu nástrojů pro vlastní postupy.

Spuštění a základy

  • Otevřete editor Event Flow z nabídky hlavního ovládacího panelu (desktopová aplikace nebo rozšíření).
  • Každý projekt se ukládá místně, dokud ho neexportujete. Použijte Export pro zálohování nebo sdílení.
  • Pracujte na plátnech nazývaných toky. Každý scénář může přijímat události z více platforem současně.

Přehled uzlů

  • Vstupy (levé porty) očekávají kontext zprávy.
  • Výstupy (pravé porty) vydávají stejný kontext včetně případných úprav.
  • Logické uzly mohou posílat signály jak do kanálu true tak i do volitelného kanálu false .

Struktura datové zprávy

Každá zpráva nese objekt JSON. Povinné klíče se řídí docs/event-reference.html (platform, type, chatname, chatmessage atd.). Vlastní data připojujte pod meta.

Každý scénář začíná spouštěčem

Uzly akcí (zelené) se nikdy nespouštějí samy — provedou se pouze tehdy, když se nadřazený spouštěč (modrý) vyhodnotí jako true. Scénář složený pouze z navazujících akcí vypadá platně, ale zůstává trvale nečinný, protože řetězec nemá co spustit. Názvy uzlů popisují, co uzel dělá, nikoli kdy se to děje: Vybrat zprávu k zobrazení (Feature Message) zvýrazní zprávu, když k ní tok dorazí – nespouští se při zvýraznění zprávy jinde.

Dva akční uzly propojené za sebou bez uzlu spouštěče
❌ Nikdy se nespustí. Zvýraznit zprávu i Přečíst text jsou akce; bez spouštěče na začátku řetězec nic nespustí.
Spouštěč Any Message propojený s akcemi Feature Message a Speak Text
✅ Funguje. Spouštěč Libovolná zpráva (Any Message) (nebo Zpráva obsahuje, regulární výraz, událost příspěvku atd.) zahájí řetězec; obě akce pak běží pro každou odpovídající zprávu.

Překryv Flow Actions (výstup akcí)

Začněte šablonou upozornění:

Vyberte Dar: oslava + hlas pro hotovou animaci a syntetický děkovný klip nebo pokročilou Dar: animace + zvuk + filtr OBS šablonu. Nové šablony upozornění začínají vypnuté, abyste je mohli nejprve nastavit a otestovat. U šablony OBS vyberte zdroj a stejný běžně vypnutý filtr v obou akcích filtrů.

Přehrát zvukový klip (Play Audio Clip) a Multi-Alerts nyní sdílejí knihovnu 17 zvuků: potlesk, víření bubnu, svištění, pokladna a další efekty, čtyři označené syntetické anglické fráze a jednoduché zvuky. Poslouchat / Zastavit přehrává místní náhled s viditelným stavem přehrávání. Stále můžete nahrát záznam nebo vybrat místní soubor aplikace. Pro proměnlivá jména či zprávy použijte stávající Přečíst text (Speak Text) akci.

Event Flow přehrává přes zdroj Prohlížeč Flow Actions ; Multi-Alerts přehrává ve svém vlastním zdroji Prohlížeč. Pro stejnou událost ponechte zvuk zapnutý pouze v jednom, aby se nepřehrával dvakrát. Klávesou Tab přejděte na uzel toku a klávesou Enter nebo mezerníkem upravte jeho vlastnosti.

Uzly jako Přehrát zvukový klip (Play Audio Clip), Zobrazit mediální překryv (Display Media Overlay), a ovládání OBS potřebují plochu pro vykreslování. Tou je stránka překryvu Flow Actions dostupná na actions.html. Nechte ji běžet ve vysílacím softwaru (doky prohlížeče OBS/Streamer.bot atd.), aby se akce Event Flow měly kde zobrazit.

Spouštěč Any Message propojený s akcí Play Audio Clip
Tento tok je úplný a spouští se pro každou zprávu – zvuk se ale přehrává na stránce překryvu Flow Actions, nikoli v editoru. Tlačítko Náhled v editoru přehrává místně; živé přehrávání potřebuje otevřený překryv. Pokud prohlížeč blokuje automatické přehrávání, klikněte na Zapnout zvuk na stránce Flow Actions pro nový pokus o přehrání posledního blokovaného klipu. Přehrávání povolí i kliknutí jinam na stránce. Zdroj Prohlížeč v OBS běžně automatické přehrávání umožňuje.
Jak ho otevřít (z nabídky / ovládacího panelu):
  1. Otevřete hlavní nabídku Social Stream Ninja (okno načtené z popup.html nebo ikony rozšíření).
  2. Přejděte na kartu „Flow Actions“. Použijte tlačítko [kopírovat odkaz] nebo klikněte na URL uvnitř karty.
  3. Odkaz vypadá jako https://socialstream.ninja/actions.html?session=YOURSESSION. Vložte ji do zdroje prohlížeče v OBS (doporučeno 1920×1080) nebo otevřete v libovolném prohlížeči překryvů.
Použití místních médií v samostatné aplikaci:
  1. V akci Play Audio Clip nebo Display Media Overlay klikněte na Vybrat místní soubor (Choose Local File).
  2. Klikněte na Kopírovat místní URL Flow Actions pro OBS (Copy Local Flow Actions URL for OBS) a použijte vygenerovanou localhost URL namísto hostované URL Flow Actions.
  3. Nechte SSApp spuštěný. Pokud se vybraný soubor přesune, vraťte se k akci a klikněte na Znovu propojit (Relink).

Rozšíření Chrome samo nedokáže poskytovat soubory z disku. Pokud není dostupná desktopová doprovodná aplikace, použijte nahrání nebo hostovanou URL. Viz Návod k mediálním souborům pro Event Flow pro úplné nastavení.

Po načtení může tento překryv:

  • Zobrazovat GIPHY nebo přímé URL médií, text a konfety spouštěné vašimi scénáři.
  • Přehrávat zvuky (TTS, zvukové klipy) místně, aby je diváci slyšeli.
  • Komunikujte s OBS přes nastavení WebSocketu v sekci Flow Actions nabídky (přepínání scén, přepínání zdrojů, aktualizace textu GDI+/FreeType, záznam opakování atd.).
Režimy ovládání OBS:
  • Browser Source API: dostupné pouze když actions.html běží ve zdroji Prohlížeč v OBS se zapnutou volbou Pokročilá úroveň přístupu (Advanced Access Level). Přepínání scén zde funguje a akce nahrávání / vysílání / vyrovnávací paměti záznamu ho mohou použít jako náhradní možnost.
  • OBS WebSocket: doporučeno pro jednotné ovládání. Flow Actions v Social Stream Ninja používají API OBS WebSocket v5 z OBS 28+ a očekávají moderní sadu požadavků na portu 4455.
  • Heslo: volitelné. Připojte pouze &obspw=... k URL Flow Actions, pokud váš server OBS vyžaduje ověřování.
  • Diagnostika překryvu: připojte &obsdebug=1 k URL stránky actions.html pokud chcete při řešení problémů malý živý odznak připojení OBS v překryvu.
  • Nastavit textový zdroj: přímo aktualizuje vstupy OBS Text (GDI+) a Text (FreeType 2) a podporuje proměnné šablon Event Flow, například {counterValue} a {counterTarget}.
  • Starší instalace 4.x: pokud stále používáte obs-websocket 4.x / port 4444, akce zdroje / filtru / ztlumení / textu nebudou fungovat, dokud neaktualizujete OBS / obs-websocket.

Viz samostatný Návod k ovládání OBS pro všechny spouštěče, akce, kroky nastavení a ověřené postupy.

Doporučený postup diagnostiky:
  1. Otevřít obs-websocket-test.html.
  2. Ověřte, že GetVersion, GetCurrentProgramScene, a GetSceneList uspějí.
  3. Než otestujete celou automatizaci Event Flow, spusťte tam kontrolu odpovídající akce.
Nechte překryv otevřený. Zavření stránky Flow Actions pozastaví všechny akce překryvů/zvuku/OBS v Event Flow. Místo zavření ji skryjte nebo přesuňte na jiný monitor.

1. Co prochází uzlem?

Event Flow předává každým propojením dvě věci:

  1. Datová zpráva – datový objekt události nebo zprávy.
  2. Signál brány – jeden true/false příznak sdělující dalšímu uzlu, zda má běžet.
Pokud uzel vydá false: následující uzly přestanou běžet, pokud nepřijmou vstup ze samostatné větve (například false konektor na podmínkovém uzlu). Snadno tak vytvoříte náhradní logiku bez duplikování celých toků.

Očekávané vstupy

  • Zdroje událostí (Twitch Message, Timers, Manual Trigger atd.) ignorují vstup z předchozích uzlů — vytvářejí vlastní datovou zprávu a vždy vydávají true pokud samotný uzel neskončí chybou.
  • Transformační a logické uzly čtou data a mohou přepsat pole, nastavit stav nebo změnit signál brány na false.
  • Uzly akcí se spouštějí pouze tehdy, když brána zůstává true. Mohou také vydat aktualizovanou datovou zprávu, pokud chcete pokračovat v řetězení akcí.

Způsoby výstupu

Jediný výstup

Většina uzlů poskytuje jeden výstup. Co vstoupí (datová zpráva + brána), vystoupí beze změny, pokud to uzel neupraví.

Výstupy pravda/nepravda

Uzly Condition, Compare, Regex a Logic mají dva výstupní porty. Pravda pokračuje zeleným portem; false se zpřístupní na šedém/červeném portu.

Předání beze změny a přepsání

Některé uzly (Set Variable, Math, Text Replace) upravují datovou zprávu, ale dál předávají true/false stav ze svého vstupu. Jiné (NOT, AND, OR) si logickou hodnotu přepočítávají samy.

2. Přehled logických uzlů

Tyto bloky odpovídají na nejčastější otázky „Co znamená true/false?“.

NOT

  • Vstupy: 1 logická hodnota (true/false) odvozená z předchozího uzlu.
  • Výstupy: obrácená logická hodnota a nezměněná datová zpráva.
  • Výchozí chování: Pokud ke vstupu NOT není nic připojeno, vyhodnotí se jako false, takže výstup je true.
Příklad: Umístěte NOT za „Contains Keyword“, aby se upozornění spustilo, když divák nepoužije klíčové slovo.

AND

  • Vstupy: dva nebo více logických signálů (A, B, ...). Další porty můžete nechat prázdné.
  • Výstupy: true pouze pokud se všechny připojené vstupy rovnají true.
  • Použijte AND, pokud musí být současně splněno více podmínek („je předplatitel“ a „zpráva chatu obsahuje !raffle“).

OR

  • Vysílá true pokud libovolný připojený vstup je pravdivý.
  • Vhodné pro spouštěče z více platforem: přiveďte uzly zpráv Twitch a YouTube do jedné brány OR a pak použijte společnou navazující akci.
Potřebuji vždy uzel AND?
Ne. Mnoho uzlů už poskytuje kombinované filtry (například „Filter User Level“ + „Contains Text“). AND použijte pouze tehdy, když vestavěné volby vaši kombinaci nepokrývají, nebo když chcete opakovaně použitelný logický spoj sdílený dalšími větvemi.
NOT a prázdné vstupy: Nepřipojený uzel NOT stále vydává true. Nechte ho připojený k něčemu smysluplnému, nebo uzel vypněte, aby nechtěně neodblokoval scénář.

3. Příklady malých scénářů

A. Automatická odpověď, pokud zpráva není příkaz

Twitch Message ──▶ Regex Match "^!" ─┐ │ ├─false──▶ Auto Reply ("Thanks for chatting!") │ └─true──▶ Do nothing

Zde uzel Regex vydává true když je zpráva příkazem. Vedeme false konektor do naší odpovědi, takže běžní účastníci chatu dostanou potvrzení, zatímco příkazy pouze projdou.

B. Vyžadování více kontrol pomocí AND

YouTube Message ──▶ Contains "!queue" ─▶ AND ─▶ Relay to Discord Gifted Membership ─▶ User Role = Member ──▲

Uzel AND zajistí, že se na Discord přeposílají pouze členové používající správné klíčové slovo. Obě větve posílají svůj logický výsledek do uzlu AND; data z první větve pokračují dál.

C. Uzel NOT pro blokování opakovaných upozornění

Datová zpráva události ─▶ Kontrola stavu (isAlertMuted) └─false─▶ NOT ─▶ Spustit oslavu

State Check vrací hodnotu true když je upozornění ztlumené. Obrácením tohoto výsledku uzel NOT zajistí, že oslavu přehrajeme pouze tehdy, když je příznak false.

D. Náhodné přehrání jednoho ze dvou zvuků

Scénář používající brány RANDOM, NOT a AND k náhodnému přehrání jednoho ze dvou zvukových klipů
Náhodná volba mezi dvěma zvukovými klipy s pravděpodobností 50/50. Brána RANDOM losuje jednou pro každou odpovídající zprávu: pokud propustí, přehraje se zvuk A; pokud ne, brána NOT obrátí výsledek a brána AND umožní přehrát zvuk B.
Trigger ──▶ RANDOM (50%) ──▶ Play Sound A │ └──▶ NOT ──▶ AND ──▶ Play Sound B Trigger ──────────────────▲

Brána AND není volitelná. Samotný NOT by vydal true kdykoli je brána RANDOM nečinná, takže zvuk B by se přehrál u každé zprávy chatu, která neodpovídá vašemu spouštěči. Přivedení spouštěče do AND jako druhého vstupu omezí zvuk B pouze na odpovídající zprávy. Stejný vzor funguje pro jakoukoli dvojici alternativních akcí, nejen zvuk.

4. Prevence ozvěn, smyček a zpětného předávání

Předávání chatu mezi rozhraními je užitečné, ale pokud zachytáváte vlastní výstup, může vytvářet nekonečnou ozvěnu. Dodržujte tato opatření:

Poznámka k cíli YouTube Shorts:
Příchozí spouštěče i cíle odchozího předávání Relay Chat rozlišují youtube a youtubeshorts. Pokud má zpráva dorazit do obou variant, použijte dvě akce předávání. Viz YouTube Shorts a Event Flow.
Relay Chat automaticky přeskakuje rozpoznané odrazy.
Odraz je odchozí zpráva znovu zachycená z cílového chatu. Současné akce Relay Chat tyto rozpoznané odrazy přeskakují; samostatné zaškrtávací políčko No Reflections neexistuje. Chcete-li skrýt nebo omezit jejich zobrazení v doku a překryvech, použijte Filtr zpětně zachycených zpráv (Reflection Filter) akci s Blokovat všechny (Block All), Povolit první (Allow First), nebo Povolit všechny (Allow All). Řídí zobrazení při opětovném příjmu, nikoli odesílání. Postupujte podle postupu přeposílání Twitche a YouTube pro úplné nastavení.
  • Vyhněte se duplicitním systémům předávání. Při používání odpovídajících tras Event Flow vypněte globální Relay all a zkontrolujte další služby propojující stejné chaty. Zachování vlastních metadat při průchodu chatem platformy není zaručeno.
  • Používejte uzly Debounce nebo Cooldown pro upozornění, která se mají spustit nejvýše jednou za X sekund.
  • Cykly přerušujte záměrně. Pokud se dvě větve vzájemně napájejí, přidejte logický uzel kontrolující stavovou proměnnou („currentlyRelaying“), aby scénář při nastaveném příznaku skončil dříve.

5. Vstupy, výstupy a praktické otázky

Co vstupuje do uzlu?

  • Úplná data zprávy.
  • Logický příznak brány (true/false).
  • Volitelný kontext (stavové proměnné, časovače), který si uzel výslovně vyžádá.

Co opouští uzel?

  • Stejná data, pokud je uzel neupraví.
  • Přepočítaný logický příznak brány (logické uzly) nebo průchozí příznak (akce).
  • Většina vedlejších účinků (například odeslání zprávy do chatu) datovou zprávu nemění, ale bodové akce mohou připojit stavová pole, například pointsTotal nebo pointsSpendError pro navazující logiku.

Kdy větvit?

Kdykoli chcete reagovat odlišně na true oproti false. Přetáhněte spoj z požadovaného barevného výstupu (zelený = true, šedý/červený = false) k dalšímu uzlu.

Pamatujte: Pokud nic neuděláte s výstupem false , scénář tam jednoduše skončí. To je ideální pro filtry („zablokovat vše, co neprojde kontrolou“), ale nezapomeňte připojit false cestu, pokud potřebujete náhradní chování.

Časté otázky a odpovědi

  • Musím použít AND pro každou dvojici filtrů? Ne. Mnoho uzlů obsahuje více kontrol (například základní Message Filter podporuje klíčové slovo + roli). AND použijte pouze pro pokročilé kombinace nebo při slučování signálů z různých uzlů.
  • Jak se hodnoty true/false dostanou do uzlu NOT? Každý uzel se zeleným výstupem vydává true ve výchozím stavu. Když podmínka selže, odešle false. Připojte tento spoj do NOT a obraťte výsledek.
  • Může uzel vydat datovou zprávu, i když vrátí false? Ano. Data stále procházejí výstupem false; je na vás, kam tuto větev povedete.
  • Jak rozpoznám členy týmu TikTok? Vyberte Člen týmu TikTok v uzlu Role uživatele. Rozpoznává úrovně a odznaky TikTok Fan Club/týmu v příchozí zprávě a nezávisí na nastavení hlavního překryvu chatu.
  • Může každý uzel Speak Text používat jiný hlas? Ano. Zadejte název nebo ID hlasu podporované poskytovatelem do Přepsání hlasu, nebo pole nechte prázdné a použijte výchozí hlas TTS z Flow Actions.

6. Přehled proměnných šablon

Některé uzly akcí (Show Text, Set Text Source, Send Message, Relay Chat, TTS Speak, Call Webhook, Print Thermal Label) podporují proměnné šablon které se za běhu nahrazují daty události. Názvy proměnných uzavřete do složených závorek, například {username}.

Základní proměnné (zpětně kompatibilní)

ProměnnáAliasPopisPříklad
{username}{chatname}Zobrazované jméno uživateleCoolViewer123
{message}{chatmessage}Text zprávy chatuAhoj všichni!
{source}-Název platformy (s velkým počátečním písmenem)Twitch, YouTube
{type}-Název platformy (původní hodnota)twitch, youtube
{donation}{hasDonation}Zobrazované označení daru/příspěvku$5.00, 500 bitů

Rozšířené proměnné

ProměnnáPopisPříklad
{displayname}Zobrazované jméno (alternativní pole)CoolViewer123
{donoValue}Ekvivalent příspěvku v USD, dodaný nebo odhadnutý; Event Flow odvozuje prahové hodnoty z normalizovaných popisků hasDonation ve tvaru hodnota, $hodnota, hodnota + jednotka nebo zkrácená jednotka/hodnota. Neznámé pojmenované virtuální jednotky používají 100 jednotek = $0.01 USD; neoceněné dárky TikToku používají jednu minci na dárek (po $0.01). {donationAmount} je starší alternativní název5.00
{event}Identifikátor typu událosticheer, raid, new_follower
{membership}Stav členstvíMEMBERSHIP, new_sponsor
{subtitle}Další kontextČlenem 3 měsíce
{userid}ID uživatele na platformě12345678
{chatimg}URL avataru uživatelehttps://...
{contentimg}URL připojeného obrázkuhttps://...
{rewardTitle}Název odměny, pokud zdroj poskytuje pole názvu odměny na nejvyšší úrovniZvýraznit mou zprávu
{meta}Strukturovaná data události (JSON){"viewers":100}
{counterValue}Aktuální hodnota počítadla po kroku Counter nebo Check Counter12
{counterTarget}Cílová hodnota počítadla30
{counterRemaining}Cílová hodnota počítadla minus aktuální hodnota, nejméně 018
Porovnávání proměnných nerozlišuje velikost písmen. {USERNAME}, {Username}, a {username} fungují stejně.
Fungují také pole přidaná scénářem. Pokud předchozí akce přidá do zprávy hodnotu na nejvyšší úrovni, pozdější šablony ji mohou přímo přečíst. Takto Check Counter zpřístupňuje {counterValue}, {counterTarget}, a {counterRemaining}.
JSON pro Call Webhook: Proměnné šablon fungují v řetězcových hodnotách JSON v libovolné hloubce vnořených objektů či polí. Klíče objektů se podle šablon nenahrazují a vlastní tělo bez zástupných hodnot se odesílá beze změn.

Ukázkové šablony

  • Zobrazit text: {username} just cheered {hasDonation}!
  • Nastavit textový zdroj OBS: {username}: now {counterValue}, need {counterTarget}
  • Relay Chat: [{source}] {username}: {message}
  • TTS: {username} says {message}
  • Upozornění na dar: {username} donated {donation} - {subtitle}
  • Termoštítek: {username}, nový řádek a pak {donation}. Viz Návod k termotiskárně pro nastavení tiskárny, štítky s pevnými rozměry a úplný tok.
  • Call Webhook pro Discord: {"content":"{message}","username":"{username}","avatar_url":"{chatimg}"}
Chybějící proměnné se změní na prázdné řetězce. Pokud událost nemá určité pole (např. {donation} u běžné zprávy chatu), zástupná hodnota se nahradí prázdným řetězcem namísto zobrazení doslovného {donation} textu.

7. Kontrolní seznam doporučených postupů

  • Pojmenujte a obarvěte své uzly, abyste později věděli, která větev je která.
  • Testování vestavěným simulátorem (Send Test Event), než scénář nasadíte do živého provozu.
  • Seskupujte logiku poblíž zdroje. Filtrujte co nejdříve, abyste se vyhnuli zbytečnému zpracování v dalších krocích.
  • Opakování ukládejte do stavových uzlů. Pomocí počítadel, přepínačů a časových razítek předcházejte dvojím upozorněním.
  • Dokumentujte pole meta. Když přidáváte vlastní meta klíče, zaznamenejte je, aby překryvy a vzdálení klienti zůstali sjednocení.
Ukládejte verze. Exportujte scénář při každém dosažení důležitého bodu. Import je nejjednodušší způsob návratu, pokud se experiment nepovede.

8. Další možnosti

Spouštění vlastních pracovních postupů ze Stream Decku nebo API: pojmenované spouštěče, úvodní šablona, vyhledávání pracovních postupů, doplňková data, příklady HTTP/WebSocket/P2P a gesta otočných ovladačů.

Chcete jít více do hloubky?

  • Použijte Stavové uzly (počítadla, přepínače, časovače) ke sledování kontextu mezi událostmi.
  • Kombinujte Proměnné a logika pro tvorbu systémů front, losování nebo bodování.
  • Napojte se na systém Body a odměny , aby diváci mohli záměrně spouštět toky.
  • Používáte desktopovou aplikaci SSApp? Odemknout Vlastní uzly JavaScriptu pro libovolnou logiku, kterou žádný vestavěný uzel nepokrývá.
  • Zkontrolujte Referenční příručka událostí pro podrobnou dokumentaci dat zpráv napříč všemi platformami.

Tento návod je záměrně samostatný – zkopírujte jej místně, přizpůsobte týmu a dál experimentujte v editoru.

9. Vlastní JavaScript Pouze SSApp / desktopová aplikace

Dva uzly editoru Event Flow umožňují psát libovolný JavaScript, který se spouští v toku zpracování: Vlastní kód (Custom Code) (spouštěč) a Spustit vlastní kód (Execute Custom Code) (akce). Umožňují vyřešit vše, co vestavěné uzly nedokážou vyjádřit.

Vyžaduje desktopovou aplikaci. Vlastní uzly JavaScriptu jsou v rozšíření prohlížeče vypnuté, protože zásady Content Security Policy pro Chrome Manifest V3 blokují new Function() / eval(). Otevřete editor přes Desktopová aplikace SSApp pro jejich zapnutí. V režimu rozšíření jsou uzly zašedlé s označením „Pouze desktopová aplikace“.
Úprava kódu: vyberte uzel Vlastní kód a klikněte na Otevřít editor kódu (Open Code Editor) pro velké editační okno. Uložit a zavřít (Save & Close) zkontroluje syntaxi JavaScriptu a uloží celý tok; Ctrl+S nebo Cmd+S dělá totéž. Zrušit ponechá uzel beze změny.
Editor Event Flow — prázdný stav
Editor Event Flow. Levý panel uvádí všechny dostupné uzly; na tečkovaném plátně vytváříte toky; pravý panel zobrazuje vlastnosti vybraného uzlu.

Vlastní kód — uzel spouštěče

Přetáhněte Vlastní kód (Custom Code) ze skupiny Pokročilé v panelu Spouštěče na plátno. Funguje jako brána: tok pokračuje pouze tehdy, když kód vrátí true.

Panel spouštěčů s uzlem Vlastní kód ve skupině Pokročilé
Custom Code se nachází ve skupině Pokročilé v panelu Spouštěče.
Panel vlastností spouštěče Custom Code s editorem JavaScriptu
Panel vlastností po umístění spouštěče. Napište libovolný výraz, který vrací true nebo false.
Signatura: váš kód běží jako function(message) { ... }
Musí vrátit: logickou hodnotu — true pro umožnění pokračování toku, false pro jeho zastavení.
Dostupné: objekt message (viz API zprávy níže) a convertCurrency(value, targetCurrency, source) a convertToUSD(value, source).

Spustit vlastní kód — uzel akce

Přetáhněte Spustit vlastní kód (Execute Custom Code) ze skupiny Integrace (Integrations) v panelu Akce . Může upravit zprávu, zablokovat ji nebo připojit metadata, která mohou číst další uzly.

Panel akcí se položkou Execute Custom Code ve skupině Integrations
Execute Custom Code ve skupině Integrace (Integrations) v panelu Akce.
Panel vlastností akce Execute Custom Code s editorem kódu
Vlastnosti akce. Vraťte objekt, aby se změny sloučily zpět do výsledku scénáře.
Signatura: váš kód běží jako function(message, result) { ... }
Měl by vrátit: objekt nebo Promise sloučený do result— viz API výsledku.
Dostupné: message (datová zpráva události), result (aktuální stav výsledku scénáře), printThermal(html, options), a také convertCurrency(value, targetCurrency, source) a convertToUSD(value, source).
Termotisk v SSApp: vyberte tiskárnu a nastavte šířku papíru a bezpečné okraje v Ovládání tiskárny (Printer Control), pak vraťte printThermal('<strong>' + message.chatname + '</strong>'). SSApp zařadí úlohu tiše do fronty přes nativní tiskové API Windows a použije tato uložená nastavení. Scénář je může přepsat volbami, například { width: '58mm', marginLeft: '3mm', marginRight: '3mm', marginTop: '2mm', marginBottom: '2mm', feed: '3mm', marginType: 'printableArea' }. Vrácení objektu Promise umožní Event Flow počkat na odeslání a nahlásit chyby.
Plátno se spouštěčem Custom Code a akcí Execute Custom Code vedle sebe
Spouštěč Custom Code (modrý) a akce Execute Custom Code (zelená) umístěné na plátně. Propojte výstupní port spouštěče se vstupním portem akce.

Objekt message

Oba uzly přijímají úplnou datovou zprávu události jako message. Níže uvedená pole jsou dostupná vždy; události konkrétních platforem mohou obsahovat další.

PoleDatový typPopisPříklad
message.chatmessageřetězecText zprávy chatu (může obsahovat HTML)"Hello stream!"
message.chatnameřetězecZobrazované jméno odesílatele"CoolViewer"
message.useridřetězecID uživatele platformy"12345678"
message.typeřetězecZdrojová platforma (malými písmeny)"twitch", "youtube", "kick"
message.hasDonationřetězecNaformátovaný řetězec daru, pokud je přítomen"$5.00", "500 bits"
message.donoValuečíslo / řetězecEkvivalent příspěvku v USD, pokud jej zdroj poskytuje; platné nulové hodnoty se respektují. Event Flow jinak použije currency.js k převodu normalizovaných hasDonation popisků pro porovnávání prahových hodnot, včetně 100 neznámých pojmenovaných jednotek = $0.01 USD. Nezískává částky příspěvků z běžného textu pole chatmessage .5
message.eventřetězecIdentifikátor typu události"new_follower", "cheer", "raid"
message.membershipřetězecStav členství, pokud je relevantní"MEMBERSHIP"
message.subtitleřetězecDoplňkový řádek kontextu"Member for 3 months"
message.modlogická hodnotaOdesílatel je moderátortrue
message.subscriberlogická hodnotaOdesílatel je předplatiteltrue
message.viplogická hodnotaOdesílatel má status VIPtrue
message.chatimgřetězecURL avataru uživatele"https://..."
message.metaobjektLibovolná strukturovaná data připojená k události{ viewers: 120 }
Převod měn: použijte convertCurrency(message.hasDonation, 'EUR', message.type) pro převod formátovaného popisku příspěvku na EUR. Vrací číslo nebo null pokud požadovaná cílová měna není podporována. Převodník používá přibližné interní kurzy Social Stream Ninja; nekontaktuje externí směnárenskou službu.

Co akce vrací

Z kódu akce vraťte prostý objekt. Všechna zahrnutá pole se sloučí do objektu result scénáře; pole, která vynecháte, si ponechají aktuální hodnoty.

Vrácené poleDatový typÚčinek
modifiedlogická hodnotaNastavte true pokud jste změnili message pole. Sděluje následným uzlům, že byla data upravena.
messageobjektPředejte (případně upravenou) zprávu zpět, aby následující uzly obdržely vaše změny.
blockedlogická hodnotaNastavte true pro zabránění zobrazení nebo přeposlání zprávy.
Minimální bezpečná návratová hodnota: return { modified: false, message };
I když jste nic nezměnili, vrácení message jej nechá pokračovat do dalšího uzlu.

Příklady úryvků kódu

Libovolnou z těchto ukázek zkopírujte do textového pole JavaScript Code u odpovídajícího typu uzlu.

Úryvky spouštěčů — vraťte true pro pokračování toku

Shoda klíčového slova (bez rozlišení velikosti písmen)
Pokračujte ve scénáři pouze tehdy, když zpráva obsahuje konkrétní slovo nebo frázi.
// Matches "!hello" anywhere in the message return (message.chatmessage || '').toLowerCase().includes('!hello');
Rozpoznávání příkazů regulárním výrazem
Vyhledejte zprávy začínající příkazem ze stanoveného seznamu (např. !queue, !raffle, !enter).
return /^!(queue|raffle|enter)\b/i.test(message.chatmessage || '');
Dar nad prahovou hodnotou
Spusťte pouze tehdy, když dar dosáhne minimální částky nebo ji překročí.
const amount = message.donoValue !== undefined && message.donoValue !== null && message.donoValue !== '' ? Number(message.donoValue) : (typeof convertToUSD === 'function' ? convertToUSD(message.hasDonation || '', message.type || '') : Number(String(message.hasDonation || '').replace(/[^0-9.]/g, '') || 0)); return amount >= 5;
YouTube Super Chat nebo Super Sticker v rozsahu EUR
Převeďte standardní označení daru YouTube na EUR, vylučte Jewels/Gifts a vyberte jeden zvukový nebo vizuální rozsah.
var eventName = String(message.event || '').toLowerCase(); if (eventName !== 'superchat' && eventName !== 'supersticker') return false; var eurValue = convertCurrency(message.hasDonation || '', 'EUR', message.type || ''); if (typeof eurValue !== 'number' || !isFinite(eurValue)) return false; message.eurValue = eurValue; return eurValue >= 10 && eurValue < 25;
Filtr platformy
Zpracovávejte pouze události z konkrétních platforem.
return ['twitch', 'youtube'].includes(message.type);
Brána pro předplatitele / VIP / moderátory
Nechte scénář pokračovat pouze pro oprávněné uživatele.
return !!(message.subscriber || message.vip || message.mod);
Více podmínek — VIP + klíčové slovo
Spojte kontrolu role a obsahu zprávy do jediného výrazu, který žádný vestavěný spouštěč nepokrývá.
const isPrivileged = !!(message.subscriber || message.vip || message.mod); const isCommand = /^!feature\b/i.test(message.chatmessage || ''); return isPrivileged && isCommand;
Brána podle délky zprávy
Zpracovávejte pouze zprávy s dostatečným obsahem (užitečné u TTS nebo předávání, aby se zamezilo spamu s jediným emoji).
return (message.chatmessage || '').replace(/<[^>]+>/g, '').trim().length >= 20;

Ukázky akcí — vracejí { modified, message }

Připojit ke zprávě odznak nebo štítek
Na konec každé zprávy procházející touto akcí přidejte vizuální označení.
message.chatmessage = (message.chatmessage || '').trimEnd() + ' ✅'; return { modified: true, message };
Podmíněné blokování zprávy
Prohlédněte obsah a tiše zahoďte zprávu, pokud odpovídá pravidlu — užitečné pro vzory spamu, které filtr klíčových slov nedokáže vyjádřit.
const text = (message.chatmessage || '').toLowerCase(); const spamPatterns = ['buy followers', 'free nitro', 'click here']; if (spamPatterns.some(p => text.includes(p))) { return { blocked: true, message }; } return { modified: false, message };
Odstranit @zmínky
Před předáním na jinou platformu odstraňte ze zprávy všechny zmínky @username.
message.chatmessage = (message.chatmessage || '').replace(/@\w+/g, '').trim(); return { modified: true, message };
Naformátovat oznámení o daru
Pokud je přítomen dar, přepište chatmessage na jednotný řetězec oznámení.
const amount = parseFloat(message.donoValue || 0); if (amount > 0) { const note = (message.chatmessage || '').trim(); message.chatmessage = `💰 ${message.chatname} donated $${amount.toFixed(2)}!` + (note ? ` "${note}"` : ''); return { modified: true, message }; } return { modified: false, message };
Připojit metadata směrování pro následující uzly
Označte zprávu vlastním polem, které může pozdější Přeposlat chat (Relay Chat) nebo Odeslat zprávu (Send Message) akce přečíst z proměnné šablony ({meta}).
message.meta = message.meta || {}; // Assign a donation tier so the next node can use {meta} to decide overlay colour const amount = parseFloat(message.donoValue || 0); message.meta.donationTier = amount >= 20 ? 'gold' : amount >= 5 ? 'silver' : 'bronze'; return { modified: true, message };
Předpona zprávy podle platformy
Při předávání mezi platformami přidejte na začátek označení platformy, aby diváci znali zdroj.
const labels = { twitch: '[Twitch]', youtube: '[YouTube]', kick: '[Kick]', tiktok: '[TikTok]', }; const label = labels[message.type] || `[${message.type || 'Chat'}]`; message.chatmessage = `${label} ${message.chatname}: ${message.chatmessage || ''}`; return { modified: true, message };

Úplný příklad — bot pro návrhy nových funkcí od VIP

Tento tok naslouchá příkazu !feature <text> od předplatitelů, VIP nebo moderátorů, přeformátuje jej na návrh nové funkce a přepošle do druhého cíle (např. Discordu).

┌──────────────────────┐ ┌──────────────────────────┐ ┌──────────────────┐ │ Custom Code Trigger │────▶│ Execute Custom Code Action│────▶│ Relay Chat │ │ │ │ │ │ (to Discord) │ │ Gate: VIP/sub/mod │ │ Reformat message text │ │ │ │ + starts with │ │ → "📋 Feature Request │ │ │ │ !feature │ │ from {name}: {text}" │ │ │ └──────────────────────┘ └──────────────────────────┘ └──────────────────┘

Krok 1 — spouštěč Vlastní kód (vložte do pole JavaScript Code spouštěče):

// Only let VIPs, subscribers, and mods through, and only for !feature commands const isPrivileged = !!(message.subscriber || message.vip || message.mod); const isCommand = /^!feature\b/i.test((message.chatmessage || '').trim()); return isPrivileged && isCommand;

Krok 2 — akce Spustit vlastní kód (vložte do pole JavaScript Code akce):

// Strip the "!feature" command word and format a clean announcement const featureText = (message.chatmessage || '') .replace(/^!feature\s*/i, '') .trim(); if (!featureText) { // No text after the command: block rather than relay an empty request return { blocked: true, message }; } message.chatmessage = `📋 Feature request from ${message.chatname}: ${featureText}`; return { modified: true, message };

Krok 3 — akce Přeposlat chat: za akci přidejte standardní uzel Relay Chat a nastavte ho na cíl Discord (nebo jiný). Zde není potřeba vlastní kód — přeformátované message.chatmessage prochází automaticky.

Testování toku. Klikněte na tlačítko: Test toku (Test Flow) (v pravém horním rohu editoru) pro odeslání umělé zprávy celým tokem bez živého vysílání. Nastavte chatname na předplatitele, přidejte zprávu, například !feature dark mode support, a ověřte, že cíl Relay Chat obdrží přeformátovaný řetězec.
Panel Test toku pro odesílání umělých testovacích událostí
Panel Test toku. Vyplňte pole odpovídající podmínkám spouštěče a klikněte na Spustit test (Run Test) pro ověření celé cesty zpracování.

Bezpečnostní aspekty

Vlastní kód běží s oprávněními vykreslovacího procesu. V SSApp má kód ve vlastních uzlech JS úplný přístup k objektu window a všem API zpřístupněným skriptem preload (např. window.ninjafy). S importovanými soubory scénářů zacházejte jako se spustitelným kódem — importujte pouze scénáře z důvěryhodných zdrojů.
  • Bez síťového sandboxu. Kód akce může volat fetch(). Pokud přijímáte sdílené scénáře od jiných lidí, před aktivací zkontrolujte jejich JS.
  • Chyby se zachytávají. Chyba při běhu vašeho kódu vrátí false (spouštěč), nebo neprovede nic (akce) a zapíše chybu do konzole DevTools — scénář nespadne.
  • Také syntaktické chyby. Chyba typu SyntaxError při kompilaci se zachytí stejným způsobem. Pokud uzel zdánlivě nic nedělá, zkontrolujte vývojářské nástroje (F12).