Akcje
Akcja to kawałek HTML, CSS i JavaScriptu, który pokazuje się w nakładce. Każda działa osobno, bez sieci i bez dostępu do haseł: o to, czego potrzebuje z zewnątrz, prosi Vovó.
Na początek
„Nowa akcja” tworzy pustą albo z przykładu: alerty i czat, co gra, odliczanie, cel, losowanie, licznik zgonów i inne. Przykład staje się twoją kopią, do dowolnej zmiany.
W trzech krokach
Sam HTML: <template>, który pokazuje się, gdy zachodzi zdarzenie, z polami zdarzenia w nawiasach klamrowych.
<template data-on="follow" data-seconds="5">
<div class="alert">{user} obserwuje!</div>
</template>
Trochę JavaScriptu: vovo.on("raid", (e) => { ... }) i vovo.show("nazwa", e). I całe API do reszty.
Wyzwalacze
Akcja dostaje tylko zdarzenia ze swojej listy wyzwalaczy, w edytorze. Przycisk padu to wyzwalacz button.
Warunki
Ikona suwaków obok wyzwalacza otwiera jego warunki: wyzwalacz zadziała tylko wtedy, gdy wszystkie są spełnione. Rajd z 50 lub więcej osobami, wiadomość zaczynająca się od !dołącz, właściwa nagroda.
Minutnik i skrót
Wyzwalacz Minutnik uruchamia się co jakiś czas: jego warunek every mówi, ile sekund dzieli kolejne razy (bez niego co minutę). Wyzwalacz Skrót działa na kombinację klawiszy, swój warunek keys, także z grą na pierwszym planie.
Kontrolki
W karcie Kontrolki edytora akcja deklaruje, co pad może zmieniać, gdy ona działa: włączone lub wyłączone, wybór między opcjami, licznik (z celem, jeśli chcesz) albo tekst. Każda jest trzymana w vovo.state, pod kluczem, który pokazuje okno, a każda zmiana przychodzi jako zdarzenie control, bez potrzeby wyzwalacza. Przykłady Alerty i czat, Cel obserwujących i Licznik zgonów pokazują, jak to zrobić.
vovo.on("control", () =>
{
document.getElementById("chat").hidden = !vovo.state.chat;
});
Dostosuj
Akcja może pozwolić osobie, która jej używa, zmienić ją bez otwierania kodu: jej kolor, rozmiar tekstu, czcionkę, stronę ekranu, własny obraz albo dźwięk. Paleta obok nazwy jej panelu albo w jej wierszu na liście akcji otwiera Dostosuj: wiersz na każde ustawienie, z tym, co zawiera, jego wartością domyślną, gdy jest inna, i drogą powrotu do niej. Zmiana widać od razu w scenach, które pokazują akcję, bez jej restartu, a każda jest wersją, którą dziennik cofa. Wybiera się to tylko na tym komputerze: telefon ani inna Vovó tego nie widzi. Paczka akcji niesie wartości domyślne, nigdy twoje wybory; paczka, która zajmuje miejsce akcji, zachowuje wybory, na które ma jeszcze miejsce.
Osoba pisząca akcję deklaruje je w karcie Dostosuj edytora albo w settings w jej action.json: każde z rodzajem (kolor, liczba od minimum do maksimum, włączone lub wyłączone, wybór, tekst, obraz, dźwięk lub film, czcionka), nazwą, kluczem i wartością domyślną. Akcja czyta je w vovo.settings i słyszy zdarzenie settings, gdy któreś się zmieni; jej CSS czyta je jako var(--vovo-klucz) (liczba z jednostką, np. 32px), a włączone lub wyłączone albo wybór jako atrybut strony, dla selektorów:
.chat
{
color: var(--vovo-color);
font-size: var(--vovo-size);
font-family: var(--vovo-font), sans-serif;
}
html[data-vovo-side="Right"] .chat
{
right: 40px;
}
Ustawieniem może być też kamera: kto używa akcji, wybiera w Dostosuj jedną z kamer swojego komputera, a akcja pokazuje ją tam, gdzie ją umieści (vovo.camera.place, z uprawnieniem camera.show). Akcja przychodzi bez kamery i nigdy nie wie, którą wybrano, ani nie widzi jej obrazów: vovo.settings mówi tylko, czy jakaś jest wybrana, jako true lub false. Przykład „Kamera” to kamera w ramce.
Panele
To, czego przycisk nie pomieści (imiona w losowaniu, cele z liczbami, naciśnięcie, które powinno zapytać dwa razy), trafia do panelu akcji: panel w jej manifeście, pokazywany w Panelach na pasku bocznym (jego ikona przy prawej krawędzi okna, obecna, dopóki jakaś akcja ma panel). Panel to lista elementów rysowanych przez Vovó: heading i note, control po kluczu, button (z confirm najpierw pyta „Na pewno?”), form do czterech pól i list czytana z vovo.state (jej key i path w środku), każdy wiersz z maksymalnie trzema przyciskami.
Akcja, która ma dużo do zaoferowania, dzieli to na dwa sposoby. { "kind": "panel", "label": "Losowanie", "icon": "gift" } zaczyna kolejny panel: własną pozycję w Panelach, z nazwą i ikoną (jedna z ikon Vovó po nazwie albo emoji; bez niej ikona pierwszego przycisku padu akcji). Elementy po nim, aż do następnego, należą do niego, a te przed pierwszym pokazują się na górze każdego. Wewnątrz panelu tab zaczyna sekcję (do dwunastu): elementy po niej, aż do następnej karty, widać, gdy jest wybrana, a te przed pierwszą kartą widać na każdej. Tak losowanie to jeden panel z sekcją do losowania, drugą na to, kto bierze udział, i trzecią na to, kto wygrał, zamiast jednej długiej strony. Akcja, która nie deklaruje żadnego { "kind": "panel" }, ma jeden, nazwany od niej.
Nagłówek Paneli nazywa ten z przodu; naciśnięcie go wypisuje wszystkie, każdy z informacją, czy pokazuje go otwarta scena i czyj jest, z wyszukiwarką, gdy jest ich więcej niż osiem. Sekcje pokazują się jako karty pod nagłówkiem: te, które się mieszczą, a reszta pod „Więcej”. Nagłówek otwiera grupę: elementy po nim dzielą jedną kartę, kolejne przyciski dzielą wiersz, lista jest osobną kartą z licznikiem, a notatka stoi między kartami. Formularz z jednym polem wypełnia się w samym panelu, Enter go wysyła, tak samo kontrolkę tekstu; formularz z większą liczbą pól otwiera małe okno. Licznik z celem (max) pokazuje, jak daleko jest.
Lista może mieć tysiące wierszy. Lista dłuższa niż osiem ma własną wyszukiwarkę, która zostaje widoczna, gdy lista się przewija. Gdy jest ostatnim elementem sekcji, pokazuje się cała; z elementami za nią pokazuje pierwsze osiem wierszy i drogę do wszystkich, więc długą listę daj na koniec albo do osobnej sekcji.
To, co się tam robi, przychodzi jako zdarzenie panel, bez potrzeby wyzwalacza: jego name, values formularza oraz item i index wiersza. Nazwy należą do akcji, niezależnie od tego, który panel je pokazuje. Akcja słyszy swój panel tylko wtedy, gdy pokazuje ją otwarta scena, w OBS albo w oknie podglądu: bez żadnej panel to mówi, jego przyciski czekają przygaszone, a „Otwórz podgląd” otwiera podgląd sceny; jego kontrolki i listy dalej widać, bo Vovó je przechowuje. Używa go tylko osoba prowadząca transmisję, tu albo na urządzeniu, któremu pozwolisz na panele, a podczas paniki nic nie dociera do akcji.
Pisanie na czacie
Z uprawnieniem chat.send vovo.chat.send("...") pisze na czacie transmisji jako ty. Vovó pilnuje tempa (20 wierszy na 30 sekund) i pisze raz to, o co proszą dwie strony pokazujące akcję; dwa naciśnięcia przycisku to dwa wiersze. Przykład Przypomnienie na czacie pokazuje, jak to zrobić. Z { as: "persona" } linia idzie zamiast tego przez własne konto persony na Twitchu (Integracje, pod Twitchem): to, co persona mówi, a co nie jest jej odpowiedzią, na przykład linia, którą ktoś dla niej wpisze. Dopóki to konto nie jest połączone, nic nie jest pisane, także nic jako ty w jej miejsce.
Vovó odróżnia wywołanie jednej strony od drugiej po zdarzeniu, które akcja obsługiwała, gdy wywołała. Wywołanie zrobione później, po await albo w minutniku, mówi, na które zdarzenie odpowiada, przez { event: e }, gdzie e to to, co dostała twoja funkcja: vovo.chat.send("Witajcie!", { event: e }). To samo dotyczy vovo.emit, vovo.pad.play, vovo.webhook.send, vovo.draw, vovo.media.play i wywołań OBS. Bez tego dwie strony napisałyby wiersz dwa razy, a link moderatora czekałby w dzwonku.
Mikrofon, ekran i to, jak się ruszasz
Akcja może śledzić, jak głośny jest twój mikrofon (audio.level), kolor ekranu (screen.color) i to, jak ruszasz się w grze (input.move): o ile obróciła się kamera, dokąd idziesz i czy skaczesz, z myszy, W, A, S i D albo strzałek oraz kontrolera, żeby scena kołysała się z kamerą. Przykłady „Poświata ekranu” i „Kołysanie kamery” pokazują, jak to zrobić. Vovó czyta każde tylko wtedy, gdy otwarta nakładka pokazuje akcję, która na to czeka, a pasek stanu pokazuje jego ikonę pośrodku, dopóki to robi, z nazwami akcji w podpowiedzi. Z klawiatury czyta tylko klawisze ruchu, jako kierunek, nigdy który klawisz, i nie wtedy, gdy okno Vovó jest na pierwszym planie, gdzie to, co piszesz, kołysałoby sceną; mysz i kontroler wtedy dalej ją ruszają, chyba że włączone jest „Wstrzymuj ruch, gdy Vovó jest na pierwszym planie” (Ustawienia, Ogólne). Dźwięk nigdy nie opuszcza komputera, tylko to, jak jest głośny.
Klipy i filmy
Z uprawnieniem media.play vovo.media.play(link) pokazuje klip z Twitcha, film z Twitcha albo film z YouTube w jego oficjalnym odtwarzaczu, tam, gdzie umieściło go vovo.media.place(element), z dźwiękiem. Akcja, którą uruchamia tylko operator, odtwarza go od razu; każda inna, którą mógł uruchomić ktoś z czatu, czeka w dzwonku, aż ty (albo urządzenie z prawem zatwierdzania) ją przepuścisz. Odtwarzacz nie wie, kiedy klip się kończy: podaj { seconds: 60 } albo wywołaj vovo.media.stop(). Przykład Klipy w telewizorze przyjmuje !clip i link od moderatorów.
Twoi moderatorzy to osoby, którym powierzasz czat: w Integracjach, przy Twitchu, „Linki moderatorów odtwarzają się od razu” pozwala, by link wklejony przez któregoś z nich (albo przez ciebie) trafił na antenę bez czekania, gdy akcja pokazuje go z powodu jego wiadomości. Wyłączone, dopóki tego nie włączysz; link każdej innej osoby dalej czeka.
Rozmowy głosowe
Z uprawnieniem call akcja może połączyć cię telefonicznie z modelem AI, na antenie: mówisz do mikrofonu, on odpowiada na głos, a transmisja słyszy oboje. vovo.call.start({ instructions, voice }) otwiera rozmowę z twoim kluczem OpenAI (Integracje, AI); instructions to to, kim jest model i jak mówi. Rozmowa otwiera się w ciszy, żeby akcja mogła najpierw zadzwonić telefonem; vovo.call.answer() otwiera mikrofon i każe modelowi mówić pierwszemu, vovo.call.tell() mówi mu coś w trakcie rozmowy, a vovo.call.end() się rozłącza. call.started, call.answered, call.text (to, co powiedziano, zapisane) i call.ended mówią, co się dzieje.
To, co mówi model, słychać w chwili, gdy to mówi, i nikt tego wcześniej nie czyta, więc rozmowa zaczyna się tylko od czegoś, co zrobisz ręcznie: przycisku padu, skrótu, kontrolki albo panelu akcji. Czat, nagrody i webhooki żadnej nie zaczynają. OpenAI rozlicza ją co do sekundy od otwarcia, więc każda rozmowa ma limit (najwyżej pięć minut). Dopóki trwa, na pasku stanu widać czerwony telefon: naciśnij go albo panikę, żeby od razu się rozłączyć. Używaj słuchawek, inaczej model usłyszy sam siebie z twoich głośników.
Webhooki
Z uprawnieniem webhook vovo.webhook.send("nazwa", { ... }) prosi Vovó o wysłanie JSON do webhooka ustawionego w Ustawieniach, Webhooki: kanału na Discordzie, automatyzacji, narzędzia w twojej sieci. Adres zostaje w sejfie tego komputera, poza kopiami zapasowymi i paczkami, a akcja zna tylko nazwę. Przykład Ogłoszenie na Discordzie pokazuje, jak to zrobić.
Webhooki przychodzące
W drugą stronę usługa w internecie daje znać Vovó: w Ustawieniach, Webhooki, utwórz webhook przychodzący, skopiuj jego adres i wklej go w usłudze (strona darowizn, sklep, skrypt). Każde wywołanie dociera do akcji jako zdarzenie webhook, z hook (nazwą) i data (tym, co wysłano). Użyj wyzwalacza webhook z warunkiem, że hook to ta nazwa. Każdy webhook ma własny adres: daj go tylko usłudze, która go wywołuje. Przekaźnik trzyma wywołanie zapieczętowane dla tego komputera najwyżej dzień, więc wywołanie zrobione przy zamkniętej Vovó dotrze, gdy ją otworzysz. To, co przychodzi, to cudzy tekst: akcje pokazują go tylko jako tekst.
Z programu na tym komputerze
Program na tym komputerze może powiedzieć akcji, co wie: skrypt czytający log gry, narzędzie liczące wynik turnieju, makro. Akcja nasłuchuje zdarzenia o własnej nazwie, wśród wyzwalaczy w jej action.json (jak w folderze, który śledzi vovo dev):
"triggers": ["score"]
i słyszy je jak każde inne:
vovo.on("score", (e) =>
{
document.getElementById("home").textContent = e.home;
document.getElementById("away").textContent = e.away;
});
Program mówi je przez vovo emit, nazwę i pola:
vovo emit score home=2 away=1
Liczba, true i false przychodzą takie, jakie są, wszystko inne jako tekst. Listy i obiekty idą w całości jako JSON, i tak wywołuje to program:
import json, subprocess
subprocess.run(["vovo", "emit", "score", "--fields", json.dumps({"home": 2, "away": 1})])
Mówi, które akcje je usłyszały, i kończy się błędem (kod wyjścia 1, z powodem), gdy żadna by nie usłyszała: żadna akcja nie ma tej nazwy wśród wyzwalaczy, ich warunki nie są spełnione albo żadna otwarta strona ich nie pokazuje. Idzie tam, dokąd poszłoby własne vovo.emit akcji, nigdy podczas paniki, najwyżej 30 na 10 sekund, a dziennik mówi, że uruchomił to wiersz poleceń. Akcja tylko dla operatora tego nie słyszy. To, co wysyła program, to tekst tego programu: akcja pokazuje go tylko jako tekst. Żeby udać, że zaszło zdarzenie API, na przykład obserwacja, użyj vovo simulate.
Podgląd i Symuluj
Edytor pokazuje akcję na żywo, gdy piszesz, a przyciski Symuluj uruchamiają wyzwalacze bez czekania na prawdziwe zdarzenie i ruszają kontrolkami tak, jak zrobiłby to przycisk padu. Nic z podglądu nie trafia do transmisji. Ikona w rogu kodu albo podglądu daje mu całe okno; ta sama ikona albo Esc oddaje je z powrotem obok drugiego.
Czytniki ekranu
Czytniki ekranu nie potrafią czytać edytora kodu. Przycisk Zwykły tekst, nad kodem, wstawia w jego miejsce pole tekstowe, które Narrator, NVDA i JAWS czytają w całości, po wierszu, słowie i znaku. Startuje włączony, gdy Windows mówi, że działa czytnik ekranu; Tab przechodzi dalej, więc rób wcięcia spacjami.
Pliki
W karcie Pliki edytora dodaj obrazy, dźwięki, filmy i czcionki. Akcja używa ich po nazwie: <img src="logo.png">. Żeby przepuścić jeden ze swoich dźwięków albo filmów przez Web Audio (kompresor, miernik), poproś o niego z crossOrigin = "anonymous", zanim podasz nazwę: akcja działa oddzielnie od wszystkiego i dla niej nawet jej własne pliki przychodzą z zewnątrz, co Web Audio inaczej słyszy jako ciszę.
Uprawnienia
To, o co akcja może prosić Vovó, jest w Zachowaniu: pisanie na czacie, wywołanie webhooka, pokazanie udostępnionego ekranu, pokazanie kamery, pokazywanie źródeł i włączanie filtrów w OBS. Wyłączone, akcja tego nie może.
OBS z akcji
Z uprawnieniem obs.toggle vovo.obs.source("Scena", "Źródło", true) pokazuje źródło w scenie OBS (false je ukrywa; bez tego przełącza), a vovo.obs.filter("Źródło", "Filtr", true) robi to samo z filtrem. Nazwy są takie jak w OBS, bez względu na wielkość liter i akcenty; nazwę, której OBS nie ma, Konsola podaje razem z tą, o którą chodziło. To wszystko, do czego akcja sięga w OBS: nie może zatrzymać transmisji ani odczytać jej klucza.
Tylko dla operatora
W Zachowaniu „Tylko dla osoby prowadzącej transmisję” sprawia, że akcję uruchamia tylko pad, skróty, minutniki i jej kontrolki: nigdy widzowie, czat, nagrody, webhooki ani zdarzenie innej akcji. Używaj tego do rzeczy, których nikt oglądający nie powinien móc zrobić, jak czyszczenie czatu albo zmiana sceny.
Wersje
Każde zapisanie zachowuje wersję. „Historia” przywraca dowolną z nich.
Paczki
Ikona eksportu, na liście akcji, zapisuje akcję do pliku .zip z jej kodem i plikami, żeby komuś ją dać. W Zachowaniu jej autor, strona i jedno zdanie o tym, co robi, idą razem z nią, żeby osoba, która ją importuje, wiedziała, czym jest i skąd pochodzi. „Importuj akcję” pokazuje, co paczka przynosi i o co prosi, zanim ją zachowa, i otwiera akcję w edytorze: przeczytaj ją przed użyciem. Paczka z nazwą akcji, którą masz, to najpewniej ta akcja w nowszej wersji, więc proponuje zająć jej miejsce: akcja zachowuje swoje sceny, przyciski i stan, a wersja, którą miała, zostaje w jej historii. W terminalu vovo export i vovo import robią to samo, a vovo import --replace zajmuje miejsce akcji o tej nazwie. Paczka zrobiona dla innych może podać id w Zachowaniu: nazwę twórcy i nazwę akcji z kropką pomiędzy (example.raffle). Jej następna wersja znajduje wtedy akcję, którą aktualizuje, nawet gdy zmienisz jej nazwę, a dwie akcje o tej samej nazwie, od różnych twórców, nigdy nie zajmują miejsca jedna drugiej; vovo import --replace też się nim kieruje. Tak czy inaczej import mówi, która wersja zajmuje miejsce której, i zaznacza, gdy plik jest tą samą wersją lub starszą, a to, co wybrano w Dostosuj, zostaje wszędzie tam, gdzie nowa wersja wciąż ma to ustawienie. Paczka może powiedzieć, na jakiej licencji jest przekazywana: nazwa licencji albo własne zdanie w Zachowaniu oraz pełny tekst licencji, wybrany tam z pliku albo trzymany jako LICENSE obok action.json w folderze. Osoba, która importuje akcję, widzi to zdanie i czyta tekst w oknie importu, zanim akcja wejdzie. Vovó mówi to, co napisano, i nikogo do niczego nie zobowiązuje: nie sprawdza klucza, konta ani zakupu, a sprzedaż akcji odbywa się poza Vovó. Ikona kopiowania obok duplikuje akcję i otwiera kopię w edytorze, żeby zacząć wariant od takiej, która działa: jej kod, pliki i wyzwalacze idą razem z nią; stan, sceny i przyciski nie, a wyzwalacz skrótu przychodzi bez kombinacji, żeby jeden klawisz nie uruchamiał obu.
We własnym edytorze
Akcję można pisać w ulubionym edytorze albo własnym buildem: trzymaj jej części w folderze tak, jak trzyma je paczka (action.json, index.html, style.css, script.js i files/), i w terminalu uruchom vovo dev z tym folderem. Vovó otwiera swój edytor na akcji o tej nazwie, tworząc ją z folderu, gdy profil jej nie ma, i od razu pokazuje w podglądzie każdą zmianę zapisaną w folderze; Symuluj działa jak zawsze. Tak jak zmiana wpisana tutaj, trafia do transmisji dopiero po Zapisaniu. vovo dev stop albo Przestań śledzić na górze edytora puszcza folder.
vovo new <folder> zakłada ten folder za ciebie, pusty albo z jednego z przykładów (vovo new --list je wymienia, a --from goal bierze jeden), a vovo check <folder> mówi naraz wszystko, co jest nie tak w folderze albo paczce, niczego nie tworząc ani nie otwierając: każdy problem z jego plikiem oraz to, co Vovó przyjęłaby i pominęła, na przykład klucz, którego nie używa. Oba odpowiadają także przy zamkniętej Vovó. vovo export <akcja> <folder> zapisuje jako taki folder akcję, którą już masz.
vovo dev zapisuje też w folderze vovo.d.ts, API takie, jakie ma ta Vovó, oraz jsconfig.json, gdy go nie ma, żeby edytor taki jak VS Code podpowiadał vovo., nazwy zdarzeń w vovo.on(" i pola każdego zdarzenia. Żaden z nich nie jest częścią akcji i paczka nigdy ich nie niesie; w kontroli wersji zachowaj je albo ignoruj, jak wolisz. Żeby błędne pole było podkreślone, dodaj "checkJs": true do compilerOptions w jsconfig.
Zapisuje tam też action.schema.json, który również nie jest częścią akcji: z "$schema": "./action.schema.json" na początku action.json edytor podpowiada jego klucze, proponuje zdarzenia i uprawnienia po nazwie i podkreśla to, co Vovó by odrzuciła.
Podgląd otwiera się też w twojej przeglądarce, pod adresem, który wypisuje vovo dev, albo strzałką w rogu podglądu: ten sam szkic, uruchamiany przez to samo vovo co na antenie, przeładowywany przy każdej zmianie, osiągalny dla Symuluj, z narzędziami deweloperskimi przeglądarki (jej konsolą, punktami przerwania, elementami).
Żeby pokazać ją w transmisji
Akcja musi być w scenie, a scena w OBS.