action.json und pad.json
Jeder Schlüssel der beiden Dateien, die Vovó aus einem Ordner oder einem Zip liest, erzeugt aus Vovós eigenem Code, damit alles immer zu dieser Version passt. Vovó prüft jede Datei, wenn sie hereinkommt, und lehnt sie mit einem Satz ab, der sagt, was falsch ist; einen Schlüssel, den sie nicht kennt, übergeht sie wortlos, und ein Editor, der das Schema liest, unterstreicht ihn.
Ein Schlüssel besteht aus Kleinbuchstaben, Ziffern und _, ein Name darf auch - enthalten, jeweils höchstens 32 Zeichen.
Damit ein Editor die Schlüssel ergänzt und Fehler unterstreicht, nenne das Schema am Anfang der Datei, wie es die Beispiele tun. vovo dev schreibt action.schema.json neben die Teile einer Aktion; Vovós Quellcode hat beide im Ordner api.
action.json
Das Manifest einer Aktion: wie sie heißt, was sie hört, worum sie bittet und was sie der Person bietet, die den Stream führt. Es liegt neben index.html, style.css, script.js und files/, in einem Paket oder einem Ordner.
{
"$schema": "./action.schema.json",
"name": "Raffle",
"id": "example.raffle",
"version": "1.2.0",
"api": 1,
"author": "A maker",
"site": "https://example.com/raffle",
"description": "!join in chat joins the wheel; the panel draws the winner.",
"license": "MIT",
"triggers": ["chat", "timer"],
"bindings": [
{ "event": "chat", "filter": [{ "field": "text", "op": "starts", "value": "!join" }] },
{ "event": "timer", "filter": [{ "field": "every", "op": "is", "value": 300 }] }
],
"permissions": ["chat.send"],
"controls": [
{ "key": "open", "label": "Entries open", "kind": "toggle" },
{ "key": "prize", "label": "Prize", "kind": "text" }
],
"settings": [
{ "key": "color", "label": "Wheel colour", "kind": "color", "default": "#840926" },
{ "key": "size", "label": "Size", "kind": "number", "min": 200, "max": 800, "step": 10, "unit": "px", "default": 420 },
{ "key": "side", "label": "Side", "kind": "choice", "options": ["Left", "Right"], "default": "Right" }
],
"panel": [
{ "kind": "control", "key": "open" },
{ "kind": "control", "key": "prize" },
{ "kind": "form", "name": "add", "label": "Put someone in", "button": "Put", "fields": [{ "key": "who", "label": "Name" }] },
{ "kind": "button", "name": "draw", "label": "Draw", "confirm": true },
{ "kind": "list", "key": "names", "label": "In the wheel", "empty": "Nobody yet", "buttons": [{ "name": "out", "label": "Take out", "confirm": true }] }
]
}
$schema(Text): Wo ein Editor das Schema dieser Datei findet:./action.schema.json, dasvovo devdaneben schreibt. Vovó liest hier nichts.name(Text; Pflicht): Ihr Name, eindeutig im Profil: Eine Aktion, die mit dem Namen einer vorhandenen hereinkommt, bietet an, deren Platz einzunehmen, oder kommt als „Raffle 2“ herein.id(Text, eine Zeile, höchstens 64 Zeichen): Ein Name, den ihr Autor ihr einmal gibt und nie ändert: der Name des Autors und der der Aktion mit einem Punkt dazwischen, wieexample.raffle, in Kleinbuchstaben, Ziffern und-. Eine neuere Version, die hereinkommt, findet damit die Aktion, die sie aktualisiert, wie auch immer diese dann heißt; ohne ihn über ihren Namen. Eine in Vovó erstellte Kopie behält ihn nicht.version(Text, eine Zeile, höchstens 32 Zeichen): Ihre eigene Version, in der Liste der Aktionen angezeigt und, wenn ein Paket den Platz einer Aktion einnimmt, neben der, die diese Aktion hatte, mit dem Hinweis, wenn das Paket dieselbe oder eine ältere Version ist. Zahlen mit Punkten dazwischen werden als Zahlen gelesen (1.10.0ist neuer als1.9.2, und1.0.0-beta.1kommt vor1.0.0); anders geschrieben sind zwei Versionen nur gleich oder nicht. Ohne sie1.0.0.api(ganze Zahl, 1 oder mehr; Pflicht): Die Version der API, für die sie geschrieben wurde:1. Eine neuere als die dieser Vovó wird abgelehnt, mit dem, was zu tun ist.triggers(Liste von Ereignissen): Die Ereignisse, die sie hört: die der API oder eigene Namen, dievovo.emitundvovo emitauslösen. Ein Name, der einem der API ähnelt, wird abgelehnt, mit dem gemeinten.control,settingsundpanelerreichen eine Aktion, die Steuerelemente, Einstellungen oder ein Panel deklariert, ohne aufgeführt zu sein.bindings(Liste): Die Bedingungen der Auslöser.permissions(Liste von Berechtigungen): Was sie von Vovó verlangen darf, angezeigt für die Person, die sie hereinholt. Eine, die Vovó nicht kennt, wird abgelehnt, mit der gemeinten.persistent(wahr oder falsch): Ob sie auf dem Bildschirm bleibt (ein Chat, ein Zielbalken), statt zu erscheinen, wenn ihre Ereignisse kommen; so nennen sie der Editor und die Liste der Aktionen. Es ändert nichts daran, wie sie läuft.operator(wahr oder falsch): Nur für die Person, die den Stream führt: Sie hört das Pad, Tastenkürzel, Timer, ihre Steuerelemente und was OBS und der Computer sagen, nie Zuschauer, Chat, Belohnungen, Webhooks oder das Ereignis einer anderen Aktion. Ein Auslöser, den jemand anderes auslösen könnte, wird abgelehnt.controls(Liste, höchstens 32): Was das Pad ändert, während sie läuft.settings(Liste, höchstens 32): Was die Person, die sie nutzt, ohne ihren Code ändern darf.panel(Liste): Was sie der Person zeigt, die den Stream führt, unter Panels.author(Text, eine Zeile, höchstens 80 Zeichen): Wer sie gemacht hat.site(Webadresse, höchstens 200 Zeichen): Wo man mehr über sie oder über die Person, die sie gemacht hat, lesen kann.description(Text, eine Zeile, höchstens 300 Zeichen): Was sie tut, in einer Zeile, angezeigt, wenn sie hereingeholt wird.license(Text, eine Zeile, höchstens 100 Zeichen): Zu welchen Bedingungen sie weitergegeben wird, wie ihr Autor es sagt: der Name einer Lizenz (MIT,CC-BY-4.0) oder eine eigene Zeile, angezeigt beim Importieren und in der Liste der Aktionen. Der ganze Text der Lizenz liegt neben dieser Datei alsLICENSE(oderLICENSE.md,LICENSE.txt), höchstens 64 KB Text, und wird im Importdialog gelesen, bevor die Aktion hereinkommt. Vovó sagt, was dort steht, und verpflichtet niemanden dazu: Sie prüft keinen Schlüssel, kein Konto und keinen Kauf.
Bedingungen
Jeder Auslöser noch einmal, mit den Bedingungen, die alle erfüllt sein müssen, damit er die Aktion auslöst, so wie der Editor sie speichert. Einer für jeden Namen in triggers, in beliebiger Reihenfolge: Passen sie nicht eins zu eins, fallen alle Bedingungen wortlos weg und jeder Auslöser feuert bei allem.
event(Ereignis; Pflicht): Einer der Namen intriggers.filter(Liste): Seine Bedingungen; ohne welche löst jedes solche Ereignis sie aus.
Eine Bedingung
Eines der Felder des Ereignisses, mit einem Wert verglichen. Texte werden ohne Rücksicht auf Groß- und Kleinschreibung verglichen; eine als Text geschriebene Zahl wird als Zahl gelesen.
field(Text; Pflicht): Das Feld des Ereignisses, wie die API-Referenz es nennt:viewers,reward,text. Das Intervall einestimerist das Feldevery(Sekunden, 5 oder mehr), die Kombination eineshotkeydas Feldkeys, jeweils mitis.op(eines vonis,not,above,atleast,below,atmost,contains,starts; Pflicht): Wie verglichen wird:isundnotso, wie es ist,above,atleast,belowundatmostals Zahlen,containsundstartsals Texte.value(Text, Zahl oder wahr oder falsch; Pflicht): Womit das Feld verglichen wird.
Steuerelemente
Was das Pad ändert, während die Aktion läuft: jedes unter seinem Schlüssel in vovo.state gespeichert und der Aktion als Ereignis control mitgeteilt, das sie hört, ohne es aufzuführen.
key(Schlüssel; Pflicht): Wovovo.statees speichert; zwei Steuerelemente teilen sich keinen.label(Text; Pflicht): Wie das Pad es nennt.kind(eines vontoggle,choice,counter,text; Pflicht): An oder aus; eine seiner Optionen; eine ganze Zahl, jeweils eins höher oder niedriger; oder eine Textzeile mit höchstens 300 Zeichen.options(Liste von Texten): Die Optionen einer Wahl, zwei oder mehr.max(Zahl): Das Ziel eines Zählers, neben seinem Stand angezeigt.
Einstellungen
Was die Person, die die Aktion nutzt, ohne ihren Code ändern darf, unter Anpassen: gelesen als vovo.settings.<key>, als --vovo-<key> in ihrem CSS und, bei an oder aus und einer Wahl, als data-vovo-<key> an ihrem Dokument. Was gewählt wird, bleibt bei der Aktion, und ein Paket trägt nur die Standards. Höchstens acht davon sind Texte.
kind(eines voncolor,number,toggle,choice,text,file,font,camera; Pflicht): Was es ist, wie die Teile unten sagen.key(Schlüssel; Pflicht): Wie die Aktion sie liest; zwei Einstellungen teilen sich keinen, und keiner istaccent.label(Text, höchstens 60 Zeichen; Pflicht): Wie Anpassen sie nennt.
Einstellungen: color
Eine Farbe; Vovós Weinrot, #840926, wenn die Aktion nichts anderes sagt.
default(Farbe,#RRGGBB): Wie die Aktion kommt; ohne ihn der der Art.
Einstellungen: number
Eine Zahl von einem Minimum bis zu einem Maximum, in Schritten; das Minimum, wenn die Aktion nichts anderes sagt.
min(Zahl; Pflicht): Das Minimum.max(Zahl; Pflicht): Das Maximum, über dem Minimum.step(Zahl): Wie weit jeder Schritt geht, über 0; ohne ihn 1.unit(eines vonpx,%,s,ms,em,deg): Die Einheit, die ihre CSS-Variable trägt; ohne sie eine einfache Zahl.default(Zahl): Wie die Aktion kommt; ohne ihn der der Art.
Einstellungen: toggle
An oder aus; aus, wenn die Aktion nichts anderes sagt.
default(wahr oder falsch): Wie die Aktion kommt; ohne ihn der der Art.
Einstellungen: choice
Eine ihrer Optionen; die erste, wenn die Aktion nichts anderes sagt.
options(Liste von Texten, von 2 bis 12; Pflicht): Die Optionen, jede einmal.default(Text): Wie die Aktion kommt; ohne ihn der der Art.
Einstellungen: text
Eine Textzeile; leer, wenn die Aktion nichts anderes sagt.
default(Text, eine Zeile, höchstens 200 Zeichen): Wie die Aktion kommt; ohne ihn der der Art.
Einstellungen: file
Ein Bild, ein Ton oder ein Video, das die Person, die sie nutzt, wählt, höchstens 50 MB; wie die Aktion kommt, eine ihrer eigenen Dateien, über ihren Pfad, oder keine.
accept(eines vonimage,sound,video): Was es sein darf: ein Bild, wenn die Aktion nichts anderes sagt.default(Pfad einer Datei odernull): Wie die Aktion kommt; ohne ihn der der Art.
Einstellungen: font
Eine der Schriften des Computers, über ihre Familie; Segoe UI, wenn die Aktion nichts anderes sagt.
default(Text, eine Zeile, höchstens 64 Zeichen): Wie die Aktion kommt; ohne ihn der der Art.
Einstellungen: camera
Eine der Kameras des Computers, die wählt, wer die Aktion nutzt, unter Anpassen, gezeigt dort, wo die Aktion sie platziert (vovo.camera.place, mit der Berechtigung camera.show); höchstens vier. Sie kommt ohne, hat also keinen Standard.
Panel
Was die Aktion der Person, die den Stream führt, unter Panels in der Seitenleiste zeigt: Teile in Reihenfolge, jedes durch sein kind bestimmt, von Vovó gezeichnet. Was dort getan wird, erreicht die Aktion als Ereignis panel, das sie hört, ohne es aufzuführen. Ein Teil panel beginnt ein weiteres Panel mit den Teilen danach bis zum nächsten, und die Teile vor dem ersten erscheinen in jedem; ein tab teilt ein Panel ebenso in Abschnitte. Die Namen von Buttons, Formularen und den Buttons einer Liste sind in der Aktion eindeutig. Eine Aktion deklariert höchstens 24 Panels, jedes mit höchstens 40 Teilen und 12 Tabs.
kind(eines vonpanel,tab,heading,note,control,button,form,list; Pflicht): Was es ist, wie die Teile unten sagen.
Panel: panel
Hier beginnt ein weiteres Panel, mit einem eigenen Eintrag unter Panels.
label(Text, höchstens 30 Zeichen; Pflicht): Sein Name unter Panels.icon(Text, höchstens 32 Zeichen): Eines von Vovós Symbolen über seinen Namen oder ein Emoji; ohne es das Symbol des ersten Buttons der Aktion auf dem Pad.
Panel: tab
Ein Abschnitt des Panels: die Teile danach bis zum nächsten Tab.
label(Text, höchstens 30 Zeichen; Pflicht): Ihr Name.
Panel: heading
Eine Überschrift über den folgenden Teilen, die sich eine Karte teilen.
label(Text, höchstens 60 Zeichen; Pflicht): Sein Text.
Panel: note
Eine Zeile, die etwas sagt.
label(Text, höchstens 60 Zeichen; Pflicht): Sein Text.
Panel: control
Eines der Steuerelemente der Aktion, hier bedient wie auf dem Pad.
key(Schlüssel; Pflicht): Der Schlüssel des Steuerelements.
Panel: button
Ein Button.
name(Name; Pflicht): Was laut dem Ereignispanelgedrückt wurde.label(Text, höchstens 60 Zeichen; Pflicht): Sein Text.confirm(wahr oder falsch): Der erste Druck fragt, der zweite führt aus.
Panel: form
Ein paar Felder und ein Button: Was eingetippt wird, geht mit dem Druck mit, in den values des Ereignisses. Ein Formular mit einem Feld wird direkt im Panel ausgefüllt.
name(Name; Pflicht): Was laut dem Ereignispanelgesendet wurde.label(Text, höchstens 60 Zeichen; Pflicht): Sein Text.button(Text): Der Text des Buttons.fields(Liste, von 1 bis 4; Pflicht): Seine Felder.
Felder eines Formulars
Jedes eine im Panel eingetippte Zeile, mit dem Formular unter seinem Schlüssel gesendet.
key(Name; Pflicht): Sein Schlüssel in denvaluesdes Ereignisses, einmal im Formular.label(Text, höchstens 60 Zeichen; Pflicht): Wie das Feld heißt.
Panel: list
Eine Liste aus dem Zustand der Aktion, eine Zeile je Eintrag, auch Tausende; eine mit mehr als acht Zeilen hat eine eigene Suche.
key(Text; Pflicht): Der Schlüssel vonvovo.state, der sie hält.path(Text): Darin die Schlüssel bis zur Liste, durch Punkte verbunden:round.names.label(Text, höchstens 60 Zeichen; Pflicht): Ihr Name.show(Text): Für Einträge, die Objekte sind: das Feld, das eine Zeile zeigt, oder eine Zeile mit{field}s, die aus jedem Eintrag gefüllt werden.empty(Text): Was sie sagt, solange sie leer ist.buttons(Liste, höchstens 3): Buttons in jeder Zeile: Ein Druck teilt der Aktionitemundindexder Zeile mit.
Buttons einer Liste
Buttons in jeder Zeile der Liste.
name(Name; Pflicht): Was laut dem Ereignispanelgedrückt wurde.label(Text, höchstens 60 Zeichen; Pflicht): Sein Text.confirm(wahr oder falsch): Der erste Druck fragt, der zweite führt aus.
pad.json
Ein Paket von Buttons für das Pad: ein Zip oder ein Ordner mit Tönen und Videos, mit pad.json im Stammverzeichnis, das die Gruppen und ihre Buttons angibt; ohne sie ist jeder Ordner eine Gruppe und jeder Ton oder jedes Video ein Button mit dem Namen seiner Datei. Erneut hereingeholt, aktualisiert es, was es nennt, und lässt den Rest, wie er ist.
{
"$schema": "./pad.schema.json",
"groups": [
{
"name": "Sounds",
"color": "#2F6FDB",
"buttons": [
{ "label": "Applause", "icon": "👏", "sound": "sounds/applause.mp3", "favorite": true, "hotkey": "F13" },
{ "label": "Drum roll", "sound": "sounds/drums.ogg", "volume": 130 },
{ "label": "Rain", "video": "videos/rain.mp4", "key": "luma", "loop": true }
]
},
{
"name": "Live",
"buttons": [
{ "label": "Raffle", "action": "Raffle" },
{ "label": "Entries", "action": "Raffle", "control": "open" },
{ "label": "Starting", "scene": "Starting soon" },
{ "label": "Camera", "scene": "Game", "source": "Camera" },
{ "label": "Blur", "source": "Camera", "filter": "Blur" },
{ "label": "One minute", "team": "One minute, then I'm back." }
]
}
]
}
$schema(Text): Wo ein Editor das Schema dieser Datei findet, etwa eine./pad.schema.jsondaneben. Vovó liest hier nichts.groups(Liste; Pflicht): Die Gruppen, in Reihenfolge.
Gruppen
Eine Gruppe des Pads und ihre Buttons, in Reihenfolge.
name(Text, höchstens 60 Zeichen; Pflicht): Ihr Name: Eine Gruppe des Profils mit diesem Namen, gleich in welcher Schreibweise, wird aktualisiert.color(Farbe,#RRGGBB): Ihre Farbe; ohne sie behält eine vorhandene Gruppe ihre eigene, und eine neue bekommt die nächste.buttons(Liste): Ihre Buttons.
Buttons
Ein Button und was er tut: Vovó liest das Erste davon, das sie findet, in dieser Reihenfolge: sound; video; action mit control; action; source mit filter oder scene mit source; scene. Ein Paket bringt höchstens 2.000 Buttons.
label(Text, höchstens 60 Zeichen; Pflicht): Sein Name auf dem Pad: Ein Button seiner Gruppe mit diesem Namen, gleich in welcher Schreibweise, wird aktualisiert.icon(Text): Eines von Vovós Symbolen über seinen Namen oder ein Emoji.sound(Pfad einer Datei): Ein Ton aus dem Paket, über seinen Pfad darin: MP3, OGG, WAV, M4A, WEBM oder FLAC, höchstens 20 MB.video(Pfad einer Datei): Ein Video aus dem Paket, über seinen Pfad darin: MP4 oder M4V, höchstens 200 MB; es läuft über der ganzen Bühne.key(Text): Was vom Video entfernt wird, wie es die Filter von OBS tun:none,luma(Schwarz),chroma(Grün) oderchroma:#RRGGBB.loop(wahr oder falsch): Das Video läuft immer wieder, bis sein Button erneut gedrückt wird.action(Text): Eine der Aktionen des Profils, über ihren Namen, ausgelöst als ihr Ereignisbutton.control(Schlüssel): Mitaction: eines ihrer Steuerelemente, über seinen Schlüssel, bedient wie mit seinem Button auf dem Pad.value(Text): Mitcontrol, bei einer Wahl: die Option, die er wählt; ohne sie geht er sie der Reihe nach durch.scene(Text): Eine OBS-Szene, über ihren Namen, auf Sendung gebracht.source(Text): Mitscene: eine Quelle darin, ein- oder ausgeblendet. Mitfilter: die Quelle, auf der der Filter liegt.filter(Text): Mitsource: einer ihrer Filter, ein- oder ausgeschaltet.team(Text, höchstens 300 Zeichen): Eine Zeile, die er als Streamer in die Unterhaltung des Teams schreibt, nie in den Stream oder Chat; das Pad eines Geräts hat den Button nie.favorite(wahr oder falsch): In Favoriten oder nicht; ohne das behält ein vorhandener Button, was er hat.hotkey(Text): Die Kombination, die ihn aus jedem Programm drückt, wie man sie schreibt:F13,Ctrl+Shift+1. Zwei Buttons des Profils teilen sich keine.volume(ganze Zahl, von 0 bis 150): Wie laut ein Ton oder ein Video spielt, in Prozent seiner Datei; ohne sie behält ein vorhandener Button seine eigene.