Vovó-API 1
Aus Vovós eigenem Code erzeugt, passt also immer zu dieser Version. Text von Zuschauern kommt immer als reiner Text an, nie als HTML.
Einfache Ereignisse
Auf jeder Plattform gleich; {platform} sagt, welche. Für das, was nur eine Plattform hat, nutze ihr eigenes Ereignis weiter unten.
follow
Jemand folgt jetzt dem Kanal. Stammt aus twitch.follow.
user(Text): Wer es getan hat, wie auf der Plattform angezeigt.platform(Plattform): Wo es passiert ist.
sub
Jemand hat abonniert, verlängert oder ein Abo geschenkt bekommen. Stammt aus twitch.sub.
user(Text): Wer es getan hat, wie auf der Plattform angezeigt.tier(Zahl): 1, 2 oder 3.months(Zahl): Abo-Monate insgesamt.gift(ja oder nein): Ob es ein Geschenk war.platform(Plattform): Wo es passiert ist.
raid
Ein anderer Kanal hat diesen geraidet. Stammt aus twitch.raid.
user(Text): Wer es getan hat, wie auf der Plattform angezeigt.viewers(Zahl): Wie viele mitgekommen sind.platform(Plattform): Wo es passiert ist.
chat
Eine Nachricht im Chat. Stammt aus twitch.chat.
user(Text): Wer es getan hat, wie auf der Plattform angezeigt.text(Text): Die Nachricht, als reiner Text.parts(Text und Emotes): Die Nachricht in Teilen, der Reihe nach: dertextjedes Teils und bei einem Emote auch sein Bild, alsimage, von Vovó bereitgestellt.vovo.chat.parts(e)macht daraus Knoten zum Anzeigen.platform(Plattform): Wo es passiert ist.
tip
Jemand hat Geld oder Bits geschickt. Stammt aus twitch.cheer.
user(Text): Wer es getan hat, wie auf der Plattform angezeigt.amount(Zahl): Wie viel, incurrency.currency(Text):bitsoder ein Währungscode wieBRL.text(Text): Die Nachricht, als reiner Text.platform(Plattform): Wo es passiert ist.
Twitch
twitch.follow
Ein Follow auf Twitch.
user(Text): Wer es getan hat, wie auf der Plattform angezeigt.
twitch.sub
Ein Abo, eine Verlängerung oder ein geschenktes Abo auf Twitch.
user(Text): Wer es getan hat, wie auf der Plattform angezeigt.tier(Zahl): 1, 2 oder 3.months(Zahl): Abo-Monate insgesamt.gift(ja oder nein): Ob es ein Geschenk war.gifter(Text): Wer es geschenkt hat, wenn es ein Geschenk war.text(Text): Die Nachricht, als reiner Text.
twitch.raid
Ein Raid auf Twitch.
user(Text): Wer es getan hat, wie auf der Plattform angezeigt.viewers(Zahl): Wie viele mitgekommen sind.
twitch.chat
Eine Chatnachricht auf Twitch.
user(Text): Wer es getan hat, wie auf der Plattform angezeigt.text(Text): Die Nachricht, als reiner Text.parts(Text und Emotes): Die Nachricht in Teilen, der Reihe nach: dertextjedes Teils und bei einem Emote auch sein Bild, alsimage, von Vovó bereitgestellt.vovo.chat.parts(e)macht daraus Knoten zum Anzeigen.color(Text): Die Farbe des Namens,#RRGGBB.badges(Text): Die Abzeichen, durch Kommas getrennt:moderator,subscriber.persona(ja oder nein): True, wenn die Zeile von der Persona selbst ist, von ihrem Konto in den Chat geschrieben.
twitch.viewers
Wie viele Leute den Stream sehen. Twitch wird etwa einmal pro Minute abgefragt, solange der Stream läuft; das kommt, wenn sich die Zahl ändert, und mit live auf false, wenn der Stream endet.
viewers(Zahl): Wie viele jetzt zuschauen.live(ja oder nein): True, solange der Stream läuft.
twitch.cheer
Auf Twitch gecheerte Bits.
user(Text): Wer es getan hat, wie auf der Plattform angezeigt.bits(Zahl): Wie viele Bits.text(Text): Die Nachricht, als reiner Text.
twitch.redemption
Eine Kanalpunkte-Belohnung wurde eingelöst.
user(Text): Wer es getan hat, wie auf der Plattform angezeigt.reward(Text): Der Titel der Belohnung.reward_id(Text): Die ID der Belohnung bei Twitch, die beim Umbenennen gleich bleibt.input(Text): Was eingegeben wurde, bei Belohnungen, die danach fragen.redemption(Text): Die ID dieser Einlösung bei Twitch: dieselbe in ihremtwitch.redemption.resolved.
twitch.redemption.resolved
Eine Einlösung in der Warteschlange der Belohnung wurde angenommen oder abgelehnt (Ablehnen gibt die Punkte zurück).
user(Text): Wer es getan hat, wie auf der Plattform angezeigt.reward(Text): Der Titel der Belohnung.reward_id(Text): Die ID der Belohnung bei Twitch, die beim Umbenennen gleich bleibt.input(Text): Was eingegeben wurde, bei Belohnungen, die danach fragen.status(Text):approved(angenommen) oderrejected(abgelehnt).redemption(Text): Die ID dieser Einlösung bei Twitch, wie in ihremtwitch.redemption.
twitch.hypetrain
Ein Hype Train hat begonnen, ist vorangekommen oder hat geendet.
level(Zahl): Das aktuelle Level.progress(Zahl): Punkte in diesem Level.goal(Zahl): Punkte, die dieses Level braucht.ended(ja oder nein): Ob er gerade geendet hat.
Von Vovó und OBS
button
Ihr Button auf dem Pad wurde gedrückt.
label(Text): Die Beschriftung des Buttons.
hotkey
Ein globales Tastenkürzel wurde gedrückt, mit dem Spiel im Vordergrund oder nicht. Der Auslöser nennt seine Kombination mit einer Bedingung, keys ist Ctrl+Alt+1, und die App lauscht darauf, solange das Profil aktiv ist.
keys(Text): Die Kombination, etwaCtrl+Alt+1.
timer
Ein Timer hat ausgelöst. Der Auslöser legt mit einer Bedingung fest, wie oft, every ist eine Zahl von Sekunden (5 oder mehr); ohne sie löst er jede Minute aus. Er zählt ab dem Erscheinen des Auslösers und pausiert bei Panik.
every(Zahl): Sein Intervall, in Sekunden.
control
Eines der Steuerelemente der Aktion wurde im Pad geändert. Sein neuer Wert steht auch in vovo.state unter dem Schlüssel des Steuerelements, sodass eine später geöffnete Seite ihn zeigt. Eine Aktion, die Steuerelemente anbietet, bekommt das, ohne es als Auslöser hinzuzufügen.
key(Text): Der Schlüssel des Steuerelements, wie die Aktion ihn deklariert.value(Wert eines Steuerelements): Sein neuer Wert: true oder false, eine Option, eine ganze Zahl oder eine Textzeile.
settings
Was von den Einstellungen der Aktion gewählt ist, hat sich unter Anpassen geändert: vovo.settings, ihre Variablen --vovo-<key> und ihre Attribute data-vovo-<key> enthalten schon die neuen Werte. Eine Aktion, die Einstellungen deklariert, bekommt das, ohne es als Auslöser hinzuzufügen.
key(Text): Der Schlüssel der Einstellung, oder leer, wenn alle auf den Lieferzustand der Aktion zurückgesetzt wurden.
panel
Im Panel der Aktion wurde etwas getan (panel in ihrem Manifest, angezeigt unter Panels in der Seitenleiste): ein Button gedrückt, ein Formular gesendet oder ein Button in einer Listenzeile. Wie control bekommt eine Aktion mit Panel das, ohne es als Auslöser hinzuzufügen; nur die Person, die den Stream führt, löst es aus.
name(Text): Der Name des Buttons, Formulars oder Zeilen-Buttons, wie das Panel ihn deklariert.values(Wert eines Steuerelements): Die Felder eines Formulars, nach ihren Schlüsseln, jedes eine Textzeile; leer bei einem Button.item(Wert eines Steuerelements): Bei einer Listenzeile das Element, das sie zeigt, wie der Zustand es hält.index(Zahl): Bei einer Listenzeile ihre Position in der Liste, ab 0; sonst -1.
webhook
Ein eingehender Webhook wurde aufgerufen.
hook(Text): Der Name des Webhooks.data(Daten): Was gesendet wurde, nicht vertrauenswürdig: nur als Text anzeigen.
obs.scene
OBS hat die Szene gewechselt.
scene(Text): Die Szene, die jetzt auf Sendung ist.previous(Text): Die Szene davor.
media.track
Was auf diesem Computer läuft, hat sich geändert: ein anderer Titel, oder Wiedergabe und Pause. Es kommt von jeder App, die Windows mitteilt, was sie spielt (Spotify, ein Browser, ein Mediaplayer).
title(Text): Der Titel des Stücks.artist(Text): Wer es spielt.album(Text): Sein Album, falls bekannt.playing(ja oder nein): True, solange es läuft; false bei Pause oder Stopp.art(Text): Die Adresse des Covers, für ein<img src>; leer, wenn es keins gibt.source(Text): Die App, in der es läuft.
audio.level
Wie laut das Mikrofon ist, etwa 20-mal pro Sekunde, solange es sich ändert: für einen Mund, der sich bewegt, eine Anzeige, ein Leuchten. Vovó hört nur zu, solange ein offenes Overlay eine Aktion zeigt, die darauf wartet; der Ton selbst verlässt den Computer nie, nur seine Lautstärke.
level(Zahl): Lautstärke von 0 (Stille) bis 1 (so laut es geht), auf einer Skala, die dem Gehör folgt.peak(Zahl): Der lauteste Moment seit dem letzten, 0 bis 1.speaking(ja oder nein): True, solange eine Stimme da ist, kurz gehalten über kurze Pausen.
screen.color
Die Farbe des Hauptbildschirms, einige Male pro Sekunde, solange sie sich ändert: für ein Leuchten oder einen Rahmen, der dem Spiel folgt. Wird nur gelesen, solange ein offenes Overlay eine Aktion zeigt, die darauf wartet; Vovós eigenes Bildschirm-Overlay ist nie darin.
color(Text): Die Durchschnittsfarbe,#RRGGBB.vivid(Text): Die auffälligste Farbe auf dem Bildschirm,#RRGGBB: Der Durchschnitt tendiert zu Grau, diese nicht.brightness(Zahl): Wie hell der Bildschirm ist, 0 (schwarz) bis 1 (weiß).
input.move
Wie sich der Streamer in einem Spiel bewegt, bis zu 60-mal pro Sekunde, solange es sich ändert: wie weit sich die Kamera gedreht hat, wohin gelaufen und ob gesprungen wird. Für eine Szene, die mit der Kamera schwankt, sich beim Seitwärtslaufen neigt und bei einem Sprung absinkt. Es kommt von der Maus, den Bewegungstasten (W, A, S und D nach ihrer Position auf der Tastatur, egal welches Layout, oder den Pfeilen, und der Leertaste) und dem ersten angeschlossenen Controller (seinen Sticks und seiner A-Taste), immer als Richtung, nie als welche Taste. Wird nur gelesen, solange ein offenes Overlay eine Aktion zeigt, die darauf wartet, nichts vom Rest der Tastatur, und die Tasten nicht, solange Vovós eigenes Fenster vorne ist (Maus und Controller schon, außer der Computer pausiert sie auch). Ein als Administrator laufendes Spiel kann seine Eingaben vor Vovó verbergen, das ohne Administratorrechte läuft.
dx(Zahl): Wie weit sich die Kamera seit dem letzten Mal seitlich gedreht hat, nach rechts positiv: die eigene Bewegung der Maus, in ihren Counts (nicht die Zeigerposition, die das Spiel festhält), mit dem rechten Stick eines Controllers als Zugabe.dy(Zahl): Wie weit sie sich nach oben oder unten gedreht hat, nach unten positiv.walk(Zahl): Von -1 (zurück) bis 1 (vorwärts): W oder S, oder die Pfeile, geben 1 oder -1, der linke Stick eines Controllers so weit, wie er gedrückt ist; 0 im Stand.strafe(Zahl): Von -1 (links, A) bis 1 (rechts, D), auf dieselbe Weise.jump(ja oder nein): True, solange die Leertaste oder das A eines Controllers gehalten wird.
speech.text
Was der Streamer ins Mikrofon gesagt hat, Satz für Satz mitgeschrieben, für Untertitel: von Whisper auf diesem Computer oder von OpenAI, wenn der Streamer das gewählt hat (Einstellungen > Stimme, Sprache zu Text). Das Mikrofon wird nur gelesen, solange ein offenes Overlay eine Aktion zeigt, die darauf hört; jeder Satz kommt, sobald seine Pause endet, ein, zwei Sekunden nach dem Sprechen, und nichts wird gespeichert.
text(Text): Der Satz, als Text.
screen.shared
Ein geteilter Bildschirm ging auf oder von Sendung: ein Bildschirm, ein Fenster oder ein Browser-Tab, der eigene des Streamers (von Vovó selbst aufgenommen oder von ihrer Seite zum Teilen im Browser) oder der eines Gastes, den der Streamer auf Sendung gebracht hat. Eine Aktion, die ihn platziert (vovo.screen.place), zeigt ihn. Es kommt erneut, weiterhin mit on gleich wahr, wenn etwas anderes an die Stelle des Geteilten tritt.
on(ja oder nein): True, solange etwas geteilt wird.kind(Text): Was geteilt wird:screen,windowodertab(ein Tab nur von der Seite zum Teilen); leer, wenn nichts.audio(ja oder nein): True, wenn auch der Ton mitkommt.guest(Text): Der Gast, dem der Bildschirm gehört, unter dem Namen, den der Streamer vergeben hat; leer beim eigenen des Streamers.
camera
Eine Kamera, die die Aktion platziert hat (vovo.camera.place), ist in ihrer Seite zu sehen oder nicht mehr: Der Streamer hat die Kamera ein- oder ausgeschaltet, Panik hat sie ausgeschaltet, sie wurde abgesteckt, oder ein anderes Programm benutzt sie. Wie settings bekommt eine Aktion, die eine Kamera platziert, das, ohne es als Auslöser hinzuzufügen.
camera(Text): Der Schlüssel der Kamera-Einstellung, die sie zeigt, wie die Aktion ihn deklariert.on(ja oder nein): true, solange ihr Bild zu sehen ist.
persona.answer
Die Persona hat jemandem geantwortet, freigegeben, wenn die Freigabe an ist. Die App schickt es schon in den Chat und spricht es, wenn so eingestellt; eine Aktion zeigt es.
persona(Text): Der Name der Persona.user(Text): Wer es getan hat, wie auf der Plattform angezeigt.question(Text): Was gefragt wurde.answer(Text): Ihre Antwort.mood(Text): Was die Antwort die Persona tun lässt, aus einem Wort in eckigen Klammern am Anfang oder Ende ([dancing] wir haben gewonnen!), kleingeschrieben; leer ohne. Das Wort wird aus der Antwort entfernt, die Chat und Sprachausgabe ohne es erreicht, sodass die Persönlichkeit der Persona sagen kann, wie sie beim Sprechen agieren soll.
tts.spoken
Die App hat etwas auf Sendung vorgelesen: eine Chatnachricht, die die Person am Stream zum Vorlesen gewählt hat, oder den Text einer Belohnung nach der Freigabe. Sie spricht es selbst, mit der Vorlesestimme (Einstellungen > Stimme); eine Aktion zeigt es oder gibt dem Mund einer Figur etwas zu tun. Eine Zeile, die die Persona selbst in den Chat geschrieben hat, kommt mit persona true, und die App spricht sie mit der Stimme der Persona nur, wenn die Persona sprechen soll; eine Aktion, die der Persona eine Stimme gibt, sagt sie also stattdessen.
user(Text): Wer es getan hat, wie auf der Plattform angezeigt.text(Text): Was vorgelesen wurde.source(Text): Woher es kam:chatoderreward.persona(ja oder nein): True, wenn die Zeile von der Persona selbst ist, von ihrem Konto in den Chat geschrieben.
music.request
Ein Zuschauer hat sich einen Song aus Vovós Musikplayer gewünscht, per Belohnung oder Chat-Befehl (Einstellungen > Musik), und das ist daraus geworden: er wartet auf Freigabe, kam in die Warteschlange, läuft gerade, wurde verworfen, oder wurde abgelehnt und warum. Vovó selbst schreibt nichts in den Chat; eine Aktion antwortet dort oder zeigt, wer sich wünschte, was läuft.
user(Text): Wer es getan hat, wie auf der Plattform angezeigt.text(Text): Was geschrieben wurde, um ihn zu wünschen.song(Text): Der gefundene Song, als Titel und Interpret; leer, wenn keiner gefunden wurde.state(Text): Was daraus wurde:waiting,queued,playing,discardedoderrefused.why(Text): Warum er abgelehnt wurde:none(kein Song passte),many(mehrere passten gleich),busy(es wartet schon einer oder ist in der Warteschlange),full(zu viele warten),queued(der Song ist schon dran) oderagain(er lief gerade erst); sonst leer.source(Text): Wie gewünscht wurde:rewardoderchat.
sound.played
Ein Ton-Button des Pads hat seinen Ton abgespielt, oder den, den er aus seinen Tönen gezogen hat.
label(Text): Der Name des Buttons.button(Zahl): Die ID des Buttons.file(Text): Der Name der abgespielten Datei, welche von mehreren, wenn der Button eine zieht.seconds(Zahl): Wie lange die Datei spielt, in Sekunden auf eine Zehntelstelle; 0, wenn Vovó es nicht ermitteln konnte.
video.played
Ein Video-Button des Pads hat sein Video über der Bühne abgespielt, oder das, das er aus seinen Videos gezogen hat.
label(Text): Der Name des Buttons.button(Zahl): Die ID des Buttons.file(Text): Der Name der abgespielten Datei, welche von mehreren, wenn der Button eine zieht.seconds(Zahl): Wie lange die Datei spielt, in Sekunden auf eine Zehntelstelle; 0, wenn Vovó es nicht ermitteln konnte.
remote.talk
Jemand hat vom Handy aus auf Sendung gesprochen und dabei die Sprechtaste gehalten wie bei einem Walkie-Talkie: Die Stimme läuft jetzt auf jedem Overlay des Streams, von der Seite der Szene. Eine Aktion zeigt, wer spricht, solange gesprochen wird.
name(Text): Das Handy, unter dem Namen, den der Streamer beim Koppeln vergeben hat.seconds(Zahl): Wie lange die Stimme dauert, in Sekunden, auf eine Zehntelstelle.
call.started
Der Sprachanruf, den die Aktion angefragt hat (vovo.call.start), ist offen: Das Modell ist da, hört Stille, und was es sagt, wird noch nicht abgespielt, bis vovo.call.answer. Jede Seite, die die Aktion zeigt, hört das, sodass jede ihr Telefon klingeln lassen und im Gleichschritt abnehmen kann.
seconds(Zahl): Die Obergrenze des Anrufs, in Sekunden, gezählt ab der Anfrage.
call.answered
Der Anruf wurde angenommen (vovo.call.answer, von irgendeiner Seite): Das Mikrofon erreicht das Modell, und seine Stimme läuft im Stream.
call.text
Was gerade im Anruf gesagt wurde, mitgeschrieben, ein paar Wörter auf einmal und während es gesagt wird: Beide Seiten können sich überlappen. Für einen Untertitel oder ein Transkript; die Stimme selbst spielt die Seite der Szene.
who(Text):caller, die Person am Mikrofon, die den Stream führt, odermodel.text(Text): Die Wörter, an die vorigen anzuhängen, wie sie kamen.start(Zahl): Wann sie im Anruf begannen, in Millisekunden.end(Zahl): Wann sie endeten, in Millisekunden.
call.ended
Der Anruf ist vorbei oder wurde nie geöffnet: Die Stimme ist auf jeder Seite verstummt.
reason(Text):hangup(die Aktion oder die App),panic,limit(die Obergrenze),content(die Moderation des Modells) oder etwas anderes für einen Anruf, der abbrach oder nie geöffnet wurde.seconds(Zahl): Wie lange er dauerte, ab der Anfrage.
overlay.connected
Eine Overlay-Seite des aktiven Profils hat sich verbunden: OBS hat eine Szene geladen oder neu geladen. Die Aktionen der Seite hören es auch, sobald sie geladen sind.
scene(Text): Der Name der Szene.pages(Zahl): Wie viele Seiten diese Szene jetzt zeigen.
JavaScript
vovo.on: Ruftlistenerjedes Mal auf, wenn das Ereignis eintritt. Die Aktion muss das Ereignis unter ihren Auslösern haben.vovo.show: Zeigt das mitdata-name="name"markierte Template, die{fields}auseals reiner Text gefüllt.vovo.emit: Teilt der App mit, dass etwas passiert ist, etwa das Ende einer Animation: Aktionen, dienameunter ihren Auslösern haben, bekommen es. Zwei Seiten, die die Aktion zeigen, senden es einmal, während sie ein Ereignis behandeln; ein späterer Aufruf (wenn die Animation endet) nennt miteventdas Ereignis, auf das er antwortet, wie beivovo.chat.send, und ohne ein Ereignis dahinter gelten derselbe Name und dieselben Daten innerhalb von 5 Sekunden als ein Ereignis.vovo.say: Sprichttextim Stream laut aus, mit der Stimme des Profils oder der invoicegenannten (ein Teil ihres Namens, eine Sprache wiept-BRoder eine Stimme aus Pipers Ordner wiepiper:pt_BR-faber-medium). Eine Stimme, die dieser Computer nicht erzeugen kann (Piper oder seine Stimme fehlt, kein OpenAI-Schlüssel), spricht stattdessen mit der Stimme des Profils, und die Konsole der App sagt es.pitch(0,5 bis 2) macht sie höher oder tiefer bei gleicher Länge,ring(0 bis 1) gibt ihr eine metallische Kante undsmallnimmt ihr die Brust: die Stimme einer Figur aus jeder Stimme. Die App erzeugt die Sprachausgabe einmal für die Seiten, die beim Behandeln desselben Ereignisses darum bitten, und jede spielt dieselbe Datei ab;eventwie beivovo.chat.send, und ohne ein Ereignis dahinter wird derselbe Text mit derselben Stimme innerhalb von 5 Sekunden einmal erzeugt. Erfüllt sich, wenn das Sprechen endet.vovo.draw: Zieht einen derentries, jeden mit gleicher Wahrscheinlichkeit. Die App zieht, die Verlosung ist also fair, und das Protokoll hält den Gewinner fest. Zwei Seiten, die die Aktion zeigen (OBS und das Vorschaufenster) und beim selben Ereignis ziehen, bekommen dieselbe Antwort: ein Gewinner, eine Ziehung im Protokoll.eventwie beivovo.chat.send.vovo.chat.send: Schreibttextüber die App in den Chat des Streams: eine Zeile, bis zu 500 Zeichen, als Streamer oder mitas: "persona"über das eigene Twitch-Konto der Persona (Integrationen, unter Twitch). Solange dieses Konto nicht verbunden ist, wird eine solche Zeile abgelehnt, und an ihrer Stelle wird nichts als Streamer geschrieben. Braucht die Berechtigungchat.send, und die App hält das Tempo (20 Zeilen in 30 Sekunden, eine pro Sekunde und Aktion, egal welches Konto sie schreibt); eine Zeile darüber hinaus oder während Panik wird ausgelassen, und das Promise wird abgelehnt. Zwei Seiten, die die Aktion zeigen, schreiben einmal, was sie beim selben Ereignis anfragen; ein Aufruf, nachdem der Listener zurückgekehrt ist (nach einemawait, in einem Timer), nennt miteventdas Ereignis, auf das er antwortet, genau das Objekt, das der Listener bekam, sonst kann die App ihn nicht von einem zweiten unterscheiden. In der Vorschau des Editors wird nichts geschrieben: Der Editor zeigt die Zeile.vovo.pad.play: Drückt einen der Ton- oder Video-Buttons des Pads, nach seiner Beschriftung (ohne Groß- und Kleinschreibung), wie ein Druck darauf es täte: Eine Belohnung oder ein Chatbefehl kann einen Ton abspielen, den der Streamer aufs Pad gelegt hat, und Aktionen, die aufsound.playedhören, bekommen es mit. Nur Ton- und Video-Buttons. Braucht die Berechtigungpad.play; Panik verweigert es, das Protokoll sagt, dass die Aktion gedrückt hat, und zwei Seiten, die ein Ereignis behandeln, drücken einmal. Das Promise wird abgelehnt, wenn es keinen solchen Button gibt.eventwie beivovo.chat.send. In der Vorschau des Editors spielt nichts: Der Editor sagt, was spielen würde.vovo.pad.busy: Zeigt einen der eigenen Buttons dieser Aktion (Aktions- oder Steuerelement-Button, nach Beschriftung, ohne Groß- und Kleinschreibung) fürsecondsals laufend auf dem Pad: Sein Fuß leert sich mit der Zeit, auf dem Computer und auf Handys, damit die Person am Stream weiß, dass es noch läuft, wie es der Button eines Tons beim Abspielen tut. Mitlock: truebewirkt ein Druck bis dahin nichts, und die Konsole sagt, warum.0beendet es sofort. Es zeigt sich nur, solange eine Seite die Aktion zeigt, endet mit Panik und dauert höchstens 15 Minuten; es braucht keine Berechtigung, da es keinen Button außer den eigenen erreicht. In der Vorschau des Editors ändert sich das Pad nicht: Der Editor sagt, was sich ändern würde.vovo.pad.lock: Sperrt einen der eigenen Buttons dieser Aktion (nach Beschriftung, wievovo.pad.busysie nimmt): verblasst auf dem Pad und auf Handys, und ein Druck bewirkt nichts außer einer Meldung in der Konsole, bis die Aktion ihn mitfalsefreigibt. Für einen Zustand der Aktion statt für etwas, das läuft (ein Button, der nichts bedeutet, solange sein Teil der Szene verborgen ist), daher leert sich nichts: Für etwas, das eine Weile dauert,vovo.pad.busy. Es sperrt nur, solange eine Seite die Aktion zeigt, und Panik gibt frei; eine Aktion, die neu startet, sagt es erneut. In der Vorschau des Editors ändert sich das Pad nicht: Der Editor sagt, was sich ändern würde.vovo.obs.source: Blendet eine Quelle in einer OBS-Szene ein (true) oder aus (false), nach den Namen, die OBS ihnen gibt, ohne Groß- und Kleinschreibung oder Akzente; ohneonschaltet es um. Braucht die Berechtigungobs.toggle; Panik verweigert es, das Protokoll hält es fest, und zwei Seiten, die ein Ereignis behandeln, fragen einmal. Das Promise erfüllt sich, sobald OBS gefragt wurde; ein Name, den OBS nicht kennt, wird in der Konsole gemeldet, mit dem gemeinten.eventwie beivovo.chat.send, anstelle vonon, wenn das fehlt. In der Vorschau des Editors ändert sich nichts: Der Editor sagt, was sich ändern würde.vovo.obs.filter: Schaltet einen Filter einer OBS-Quelle ein (true) oder aus (false), nach ihren Namen in OBS; ohneonschaltet es um. Dieselbe Berechtigung und dieselben Regeln wievovo.obs.source.vovo.chat.parts: Die Nachricht eines Chat-Ereignisses als Knoten für die Seite: ihre Wörter als Text, nie als Markup, und ihre Emotes als<img class="vovo-emote">mit dem Namen des Emotes alsalt. Eine Nachricht ohne Teile ist ihr Text.vovo.webhook.send: Bittet die App,dataals JSON (höchstens 16 KB) an den Webhook des Profils namensnamezu senden, eingerichtet unter Einstellungen > Webhooks. Die Aktion sieht die Adresse nie und erreicht nie das Netzwerk. Braucht die Berechtigungwebhook; die App hält das Tempo (30 pro Minute, einer pro Sekunde und Aktion), sendet einmal, was zwei Seiten gleichzeitig anfragen, und ruft während Panik nichts auf. Das Promise erfüllt sich, wenn der Webhook 2xx antwortet, und wird sonst abgelehnt.eventwie beivovo.chat.send. In der Vorschau des Editors wird nichts gesendet: Der Editor zeigt, was gesendet würde.vovo.screen.place: Zeigt den geteilten Bildschirm dort, woelementist, unter der eigenen Zeichnung der Aktion (das Element und was dahinter ist müssen dort also durchsichtig sein), und folgt ihm, wenn es sich bewegt;nullnimmt ihn weg.fitistcontain(ganz, der Standard) odercover(füllt den Platz);radiusrundet die Ecken, in Pixeln;backgroundist eine Farbe (#000000) für den Raum, dencontainum ein Bild anderer Form lässt und der ohne sie durchsichtig bleibt und zeigt, was hinter der Szene liegt. Braucht die Berechtigungscreen.show.vovo.camera.place: Zeigt die Kamera, die der Streamer in einer der Kamera-Einstellungen der Aktion gewählt hat (camera, ihr Schlüssel; ohne ihn die erste), dort, woelementist, unter der eigenen Zeichnung der Aktion (dieser Teil muss also durchsichtig sein), und folgt ihm, wenn es sich bewegt;nullnimmt sie weg.fitistcover(füllt den Platz, der Standard) odercontain(ganz);radiusundbackgroundwie beivovo.screen.place;mirrorzeigt sie wie ein Spiegel. Die Kamera wird nur geöffnet, solange eine Seite sie zeigt, die Kamera des Streamers eingeschaltet ist und Panik aus ist; das Ereigniscamerasagt, wann sie zu sehen ist. Die Aktion sieht nie ihre Bilder und erfährt nie, welche Kamera es ist. Braucht die Berechtigungcamera.show.vovo.media.play: Spielt einen Twitch-Clip, ein Twitch-Video oder ein YouTube-Video über seinen Link im offiziellen Player ab, dort, wovovo.media.placeihn platziert hat (sonst auf der ganzen Bühne), mit Ton; ein neueres nimmt seinen Platz ein. Eine Aktion, die nur die Person am Stream auslöst, spielt es sofort ab; jede andere wartet, bis jemand es freigibt, hier oder von einem Handy, das das darf, da ein Zuschauer es angefragt haben könnte. Das Promise erfüllt sich, wenn es auf Sendung geht, und wird abgelehnt, wenn es abgewiesen, verworfen oder während Panik angefragt wird.secondsnimmt es nach dieser Zeit weg: Ein Player weiß nicht, wann ein Clip endet;eventwie beivovo.chat.send. In der Vorschau des Editors spielt es dort, stumm. Braucht die Berechtigungmedia.play.vovo.media.place: Wo der Clip oder das Video läuft: dort, woelementist, unter der eigenen Zeichnung der Aktion (das Element und was dahinter ist müssen dort also durchsichtig sein), und folgt ihm, wenn es sich bewegt;nullist wieder die ganze Bühne. Der Player behält die Form des Videos im Platz bei;radiusrundet die Ecken, in Pixeln.vovo.media.stop: Nimmt den Clip oder das Video der Aktion von der Bühne, auf jeder Seite, die sie zeigt.vovo.call.start: Startet einen Sprachanruf mit einem KI-Modell, auf Sendung: Die Person am Stream spricht ins Mikrofon, das Modell antwortet laut, und der Stream hört beide. Die App öffnet ihn mit dem OpenAI-Schlüssel des Streamers und hält ihn; Seiten spielen nur die Stimme.instructionsist, wer das Modell ist und wie es spricht;voiceeine der Stimmen des Modells;secondsdie Obergrenze des Anrufs (höchstens 300, auch der Standard);backoffice, womit eine Frage beantwortet wird, die das Modell „an das System“ weitergibt;phonespielt die Stimme wie über eine Telefonleitung. Das Promise erfüllt sich, wenn der Anruf offen ist, das Modell Stille hört und noch nicht abgespielt wird (call.started); nimm ihn mitvovo.call.answeran. Es wird abgelehnt, wenn er verweigert wird. Braucht die Berechtigungcallund startet nur durch etwas, das die Person am Stream von Hand tat (ein Pad-Button, ein Tastenkürzel, ein Steuerelement, das Panel der Aktion), oder in einer Aktion, die nur ihr gehört: Der Anruf wird pro Sekunde abgerechnet, bringt das Mikrofon zum Modell und bringt ungelesen auf Sendung, was das Modell sagt. Ein Anruf zur Zeit; Panik legt auf und verweigert; die Vorschau des Editors macht keinen.eventwie beivovo.chat.send.vovo.call.answer: Nimmt den Anruf an: Ab jetzt erreicht das Mikrofon das Modell, und seine Stimme läuft im Stream. Ein Modell wartet, bis der Anrufer spricht; damit es zuerst spricht, sagtinstructionihm, wie es antworten soll,opening, womit es beginnen soll, undcontext, was es wissen, aber nicht sagen soll, in dieser Reihenfolge gesendet. Von einer Seite angenommen, ist er angenommen: Eine zweite Annahme bewirkt nichts.vovo.call.tell: Sagt dem Modell während des Anrufs etwas, in einer Zeile:context(der Standard) ist etwas zu wissen, aber nicht zu sagen,instructionetwas zu befolgen,aloudetwas zu sagen. Zwei Seiten, die ein Ereignis behandeln, sagen es einmal;eventwie beivovo.chat.send.vovo.call.end: Legt den Anruf auf: Die Stimme verstummt sofort auf jeder Seite, undcall.endedfolgt.vovo.state: Ein Objekt, das Neuladen des Overlays und Neustarts der App übersteht. Seine Schlüssel der obersten Ebene werden gespeichert, sobald du sie setzt.vovo.settings: Was von den Einstellungen gewählt ist, die die Aktion deklariert (settingsinaction.json), nach Schlüssel, oder jede im Lieferzustand der Aktion: eine Farbe als#RRGGBB, eine Zahl, true oder false, eine Option, eine Zeile, die Adresse einer Datei (null für keine), eine Schriftfamilie, und für eine Kamera true oder false, ob eine gewählt ist, nie welche. Gewählt unter Anpassen, am Computer, nie von der Aktion; das Ereignissettingssagt, wann es sich ändert.
Templates
{field} in einem Template wird mit diesem Feld des Ereignisses gefüllt, als reiner Text.
data-on: An einem<template>: das Ereignis, das es anzeigt, gefüllt mit den Feldern dieses Ereignisses.data-name: An einem<template>: der Name, denvovo.shownutzt, um es aus JavaScript anzuzeigen.data-seconds: An einem<template>: wie lange es bleibt, bevor es entfernt wird. Ohne das bleibt es.data-vovo-<key>: An der Wurzel des Dokuments, für jede An/Aus-, Auswahl- oder Kamera-Einstellung:onoderoff(eine Kamera gewählt oder nicht) oder die gewählte Option, für Selektoren wiehtml[data-vovo-side="Rechts"] .chat.
CSS
--vovo-accent: Die in Vovó gewählte Akzentfarbe.--vovo-<key>: Jede Einstellung der Aktion, als CSS: eine Farbe, eine Zahl mit Einheit (34px), 1 oder 0 für an oder aus oder für eine gewählte oder keine Kamera, eine Option, Zeile oder Schriftfamilie in Anführungszeichen, eine Datei alsurl(...)odernone.font-family: var(--vovo-font), sans-serif;
Berechtigungen
Eine Aktion verlangt sie in ihrem Manifest, und wer sie installiert, gibt sie frei.
chat.send: In den Chat des Kanals schreiben, über die App: als Streamer oder über das eigene Konto der Persona.media.play: Clips und Videos im Stream, in ihren offiziellen Playern; was nicht die Person am Stream angefragt hat, wartet auf Freigabe.call: Sprachanrufe mit einem KI-Modell, auf Sendung: nur von der Person gestartet, die den Stream führt, sekundengenau bezahlt mit dem OpenAI-Schlüssel des Streamers; das Mikrofon geht an das Modell, und was es sagt, ist ungelesen zu hören.screen.show: Im Stream zeigen, was der Streamer über Vovós Seite zum Teilen teilt.camera.show: Im Stream die Kamera dieses Computers zeigen, die der Streamer unter Anpassen für die Aktion gewählt hat, nie ihre Bilder an die Aktion.pad.play: Die Ton- und Video-Buttons des Pads abspielen, nach ihrer Beschriftung.obs.toggle: Quellen in OBS ein- oder ausblenden und Filter ein- oder ausschalten.webhook: Die App bitten, einen der ausgehenden Webhooks des Profils aufzurufen.