API de Vovó 1
Générée à partir du code même de Vovó, elle correspond donc toujours à cette version. Le texte des spectateurs arrive toujours en texte brut, jamais en HTML.
Événements simples
Les mêmes sur toutes les plateformes ; {platform} indique laquelle. Pour ce qu'une seule plateforme a, utilisez son propre événement, plus bas.
follow
Quelqu'un a suivi la chaîne. Vient de twitch.follow.
user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.platform(plateforme): Où cela s'est passé.
sub
Quelqu'un s'est abonné, réabonné ou a reçu un abonnement offert. Vient de twitch.sub.
user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.tier(nombre): 1, 2 ou 3.months(nombre): Mois d'abonnement au total.gift(oui ou non): S'il s'agit d'un cadeau.platform(plateforme): Où cela s'est passé.
raid
Une autre chaîne a fait un raid sur celle-ci. Vient de twitch.raid.
user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.viewers(nombre): Combien sont venus.platform(plateforme): Où cela s'est passé.
chat
Un message dans le chat. Vient de twitch.chat.
user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.text(texte): Son message, en texte brut.parts(texte et emotes): Le message en parties, dans l'ordre : letextde chacune et, pour une emote, aussi son image, enimage, servie par Vovó.vovo.chat.parts(e)en fait des nœuds à afficher.platform(plateforme): Où cela s'est passé.
tip
Quelqu'un a envoyé de l'argent ou des Bits. Vient de twitch.cheer.
user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.amount(nombre): Combien, encurrency.currency(texte):bits, ou un code de devise commeBRL.text(texte): Son message, en texte brut.platform(plateforme): Où cela s'est passé.
Twitch
twitch.follow
Un follow sur Twitch.
user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.
twitch.sub
Un abonnement, un réabonnement ou un abonnement offert sur Twitch.
user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.tier(nombre): 1, 2 ou 3.months(nombre): Mois d'abonnement au total.gift(oui ou non): S'il s'agit d'un cadeau.gifter(texte): Qui l'a offert, si c'est un cadeau.text(texte): Son message, en texte brut.
twitch.raid
Un raid sur Twitch.
user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.viewers(nombre): Combien sont venus.
twitch.chat
Un message du chat sur Twitch.
user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.text(texte): Son message, en texte brut.parts(texte et emotes): Le message en parties, dans l'ordre : letextde chacune et, pour une emote, aussi son image, enimage, servie par Vovó.vovo.chat.parts(e)en fait des nœuds à afficher.color(texte): La couleur de son nom,#RRGGBB.badges(texte): Ses badges, séparés par des virgules :moderator,subscriber.persona(oui ou non): True quand la ligne est celle de la persona, écrite dans le chat par son compte.
twitch.viewers
Combien de personnes regardent le live. Twitch est interrogé environ une fois par minute pendant le live ; ceci arrive quand le nombre change, et avec live à false quand le live se termine.
viewers(nombre): Combien regardent maintenant.live(oui ou non): True tant que le live est en cours.
twitch.cheer
Des Bits envoyés sur Twitch.
user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.bits(nombre): Combien de Bits.text(texte): Son message, en texte brut.
twitch.redemption
Une récompense de points de chaîne a été échangée.
user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.reward(texte): Le titre de la récompense.reward_id(texte): L'id Twitch de la récompense, qui reste le même quand elle est renommée.input(texte): Ce qui a été tapé, pour les récompenses qui le demandent.redemption(texte): L'id Twitch de cet échange : le même dans sontwitch.redemption.resolved.
twitch.redemption.resolved
Un échange en attente dans la file de la récompense a été approuvé ou refusé (refuser rend les points).
user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.reward(texte): Le titre de la récompense.reward_id(texte): L'id Twitch de la récompense, qui reste le même quand elle est renommée.input(texte): Ce qui a été tapé, pour les récompenses qui le demandent.status(texte):approved(approuvé) ourejected(refusé).redemption(texte): L'id Twitch de cet échange, comme dans sontwitch.redemption.
twitch.hypetrain
Un Hype Train a démarré, avancé ou pris fin.
level(nombre): Le niveau actuel.progress(nombre): Points dans ce niveau.goal(nombre): Points nécessaires pour ce niveau.ended(oui ou non): S'il vient de se terminer.
De Vovó et OBS
button
Son bouton sur le pad a été pressé.
label(texte): Le libellé du bouton.
hotkey
Un raccourci global a été pressé, jeu au premier plan ou non. Le déclencheur indique sa combinaison par une condition, keys vaut Ctrl+Alt+1, et l'appli l'écoute tant que le profil est actif.
keys(texte): La combinaison, par exempleCtrl+Alt+1.
timer
Un minuteur s'est déclenché. Le déclencheur fixe la fréquence par une condition, every est un nombre de secondes (5 ou plus) ; sans elle, il part chaque minute. Il compte à partir de l'apparition du déclencheur, et s'arrête pendant la panique.
every(nombre): Son intervalle, en secondes.
control
L'un des contrôles de l'action a été modifié sur le pad. Sa nouvelle valeur est aussi dans vovo.state, sous la clé du contrôle, afin qu'une page ouverte plus tard l'affiche. Une action qui propose des contrôles reçoit ceci sans l'ajouter comme déclencheur.
key(texte): La clé du contrôle, telle que l'action la déclare.value(valeur d'un contrôle): Sa nouvelle valeur : true ou false, une option, un nombre entier ou une ligne de texte.
settings
Ce qui a été choisi dans les paramètres de l'action a changé, dans Personnaliser : vovo.settings, ses variables --vovo-<key> et ses attributs data-vovo-<key> contiennent déjà les nouvelles valeurs. Une action qui déclare des paramètres reçoit ceci sans l'ajouter comme déclencheur.
key(texte): La clé du paramètre, ou vide quand tous sont revenus à l'état d'origine de l'action.
panel
Quelque chose a été fait dans le panneau de l'action (panel dans son manifeste, affiché dans Panneaux, dans la barre latérale) : un bouton pressé, un formulaire envoyé, ou un bouton sur une ligne de liste. Comme control, une action avec un panneau reçoit ceci sans l'ajouter comme déclencheur ; seule la personne qui mène le live le déclenche.
name(texte): Le nom du bouton, du formulaire ou du bouton de ligne, tel que le panneau le déclare.values(valeur d'un contrôle): Les champs d'un formulaire, par leurs clés, chacun une ligne de texte ; vide pour un bouton.item(valeur d'un contrôle): Pour une ligne de liste, l'élément qu'elle affiche, tel que l'état le conserve.index(nombre): Pour une ligne de liste, sa place dans la liste, à partir de 0 ; -1 sinon.
webhook
Un webhook entrant a été appelé.
hook(texte): Le nom du webhook.data(données): Ce qui a été envoyé, non fiable : ne l'affichez qu'en texte.
obs.scene
OBS a changé de scène.
scene(texte): La scène maintenant à l'antenne.previous(texte): La scène précédente.
media.track
Ce qui est joué sur cet ordinateur a changé : un autre morceau, ou lecture et pause. Cela vient de toute appli qui indique à Windows ce qu'elle joue (Spotify, un navigateur, un lecteur).
title(texte): Le titre du morceau.artist(texte): Qui l'interprète.album(texte): Son album, s'il est connu.playing(oui ou non): True pendant la lecture ; false en pause ou à l'arrêt.art(texte): L'adresse de la pochette, pour un<img src>; vide s'il n'y en a pas.source(texte): L'appli dans laquelle il est joué.
audio.level
Le niveau du micro, environ 20 fois par seconde quand il change : pour une bouche qui bouge, un vumètre, une lueur. Vovó n'écoute que lorsqu'un overlay ouvert affiche une action qui attend ceci ; le son lui-même ne quitte jamais l'ordinateur, seulement son niveau.
level(nombre): Niveau de 0 (silence) à 1 (le plus fort possible), sur une échelle qui suit l'oreille.peak(nombre): Le moment le plus fort depuis le précédent, de 0 à 1.speaking(oui ou non): True tant qu'il y a de la voix, maintenu un instant pendant les courtes pauses.
screen.color
La couleur de l'écran principal, quelques fois par seconde quand elle change : pour une lueur ou un cadre qui suit le jeu. Lue seulement lorsqu'un overlay ouvert affiche une action qui attend ceci ; l'overlay d'écran de Vovó n'y figure jamais.
color(texte): La couleur moyenne,#RRGGBB.vivid(texte): La couleur la plus marquante à l'écran,#RRGGBB: la moyenne tire vers le gris, celle-ci non.brightness(nombre): La luminosité de l'écran, de 0 (noir) à 1 (blanc).
input.move
Comment le streamer se déplace dans un jeu, jusqu'à 60 fois par seconde quand cela change : de combien la caméra a tourné, où il marche et s'il saute. Pour une scène qui se balance avec la caméra, penche en déplacement latéral et plonge au saut. Cela vient de la souris, des touches de déplacement (W, A, S et D selon leur place sur le clavier, quelle que soit sa disposition, ou les flèches, et la barre d'espace) et de la première manette connectée (ses sticks et son bouton A), toujours comme une direction, jamais comme quelle touche. Lu seulement lorsqu'un overlay ouvert affiche une action qui attend ceci, rien du reste du clavier, et pas les touches quand la fenêtre de Vovó est au premier plan (la souris et une manette si, sauf si l'ordinateur les met aussi en pause). Un jeu lancé en administrateur peut cacher ses entrées à Vovó, qui tourne sans ces droits.
dx(nombre): De combien la caméra a tourné sur le côté depuis la dernière fois, vers la droite positif : le mouvement propre de la souris, en ses unités (pas la position du pointeur, que le jeu maintient immobile), le stick droit d'une manette s'y ajoutant.dy(nombre): De combien elle a tourné vers le haut ou le bas, vers le bas positif.walk(nombre): De -1 (arrière) à 1 (avant) : W ou S, ou les flèches, donnent 1 ou -1, le stick gauche d'une manette autant qu'il est poussé ; 0 à l'arrêt.strafe(nombre): De -1 (gauche, A) à 1 (droite, D), de la même façon.jump(oui ou non): True tant que la barre d'espace, ou le A d'une manette, est maintenu.
speech.text
Ce que le streamer a dit au micro, transcrit phrase par phrase, pour des sous-titres : par Whisper sur cet ordinateur, ou par OpenAI si le streamer l'a choisi (Paramètres > Voix, Parole en texte). Le micro n'est lu que lorsqu'un overlay ouvert affiche une action qui l'écoute ; chaque phrase arrive à la fin de sa pause, une ou deux secondes après avoir été dite, et rien n'est conservé.
text(texte): La phrase, en texte.
screen.shared
Un écran partagé est passé à l'antenne ou l'a quittée : un écran, une fenêtre ou un onglet de navigateur, celui du streamer (capturé par Vovó elle-même, ou depuis sa page de partage dans le navigateur), ou celui d'un invité que le streamer a mis à l'antenne. Une action qui le place (vovo.screen.place) l'affiche. Il arrive de nouveau, on toujours vrai, quand autre chose prend la place de ce qui était partagé.
on(oui ou non): True tant que quelque chose est partagé.kind(texte): Ce qui est partagé :screen,windowoutab(un onglet, uniquement depuis la page de partage) ; vide quand rien ne l'est.audio(oui ou non): True quand son audio vient aussi.guest(texte): L'invité à qui appartient l'écran, sous le nom que le streamer lui a donné ; vide pour celui du streamer.
camera
Une caméra que l'action a placée (vovo.camera.place) a commencé à s'afficher dans sa page, ou a cessé : le streamer a allumé ou éteint la caméra, la panique l'a éteinte, elle a été débranchée, ou un autre programme l'utilise. Comme settings, une action qui place une caméra reçoit ceci sans l'ajouter comme déclencheur.
camera(texte): La clé du paramètre de caméra qu'elle montre, telle que l'action la déclare.on(oui ou non): true tant que son image s'affiche.
persona.answer
La persona a répondu à quelqu'un, approuvée quand l'approbation est activée. L'appli l'envoie déjà dans le chat et le dit quand c'est réglé ainsi ; une action l'affiche.
persona(texte): Le nom de la persona.user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.question(texte): Ce qui a été demandé.answer(texte): Sa réponse.mood(texte): Ce que la réponse demande à la persona de faire, d'après un mot entre crochets au début ou à la fin ([dancing] on a gagné !), en minuscules ; vide sans cela. Le mot est retiré de la réponse, qui arrive au chat et à la voix sans lui, afin que la personnalité puisse dire à la persona comment agir en parlant.
tts.spoken
L'appli a lu quelque chose à voix haute à l'antenne : un message du chat que la personne qui mène le live a choisi de lire, ou le texte d'une récompense une fois approuvé. Elle le dit elle-même, avec la voix de lecture (Paramètres > Voix) ; une action l'affiche, ou donne à la bouche d'un personnage de quoi faire. Une ligne que la persona a elle-même écrite dans le chat arrive avec persona à true, et l'appli ne la dit avec la voix de la persona que si la persona est réglée pour parler ; une action qui prête sa voix à la persona la dit donc à sa place.
user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.text(texte): Ce qui a été lu.source(texte): D'où cela vient :chatoureward.persona(oui ou non): True quand la ligne est celle de la persona, écrite dans le chat par son compte.
music.request
Un spectateur a demandé un titre au lecteur de musique de Vovó, par sa récompense ou sa commande dans le chat (Paramètres > Musique), et voici ce qu'il est devenu : il attend d'être approuvé, est entré dans la file, a commencé à jouer, a été écarté, ou a été refusé et pourquoi. Vovó n'écrit rien dans le chat ; une action y répond, ou montre qui a demandé ce qui joue.
user(texte): Qui l'a fait, tel qu'affiché sur la plateforme.text(texte): Ce qui a été écrit pour le demander.song(texte): Le titre trouvé, avec son nom et son artiste ; vide s'il n'en a trouvé aucun.state(texte): Ce qu'il est devenu :waiting,queued,playing,discardedourefused.why(texte): Pourquoi elle a été refusée :none(aucun titre ne correspond),many(plusieurs correspondent autant),busy(une attend déjà ou est en file),full(trop attendent),queued(le titre est déjà en file) ouagain(il est passé récemment) ; vide sinon.source(texte): Comment ils l'ont demandé :rewardouchat.
sound.played
Un bouton de son du pad a joué son son, ou celui qu'il a tiré parmi ses sons.
label(texte): Le nom du bouton.button(nombre): L'id du bouton.file(texte): Le nom du fichier joué, lequel parmi plusieurs quand le bouton en tire un.seconds(nombre): La durée du fichier, en secondes au dixième près ; 0 quand Vovó n'a pas pu le savoir.
video.played
Un bouton vidéo du pad a joué sa vidéo par-dessus la scène, ou celle qu'il a tirée parmi ses vidéos.
label(texte): Le nom du bouton.button(nombre): L'id du bouton.file(texte): Le nom du fichier joué, lequel parmi plusieurs quand le bouton en tire un.seconds(nombre): La durée du fichier, en secondes au dixième près ; 0 quand Vovó n'a pas pu le savoir.
remote.talk
Quelqu'un a parlé à l'antenne depuis son téléphone, en maintenant le bouton pour parler comme avec un talkie-walkie : sa voix est jouée maintenant sur tous les overlays du live, depuis la page de la scène. Une action montre qui parle, tant qu'il parle.
name(texte): Le téléphone, sous le nom que le streamer lui a donné lors de l'association.seconds(nombre): La durée de la voix, en secondes, au dixième près.
call.started
L'appel vocal demandé par l'action (vovo.call.start) est ouvert : le modèle est là, il entend du silence, et ce qu'il dit n'est pas encore joué, jusqu'à vovo.call.answer. Chaque page qui affiche l'action entend ceci, pour que chacune fasse sonner son téléphone et décroche en même temps.
seconds(nombre): Le plafond de l'appel, en secondes, compté depuis sa demande.
call.answered
L'appel a été décroché (vovo.call.answer, depuis n'importe quelle page) : le micro atteint le modèle et sa voix est jouée dans le live.
call.text
Ce qui vient d'être dit dans l'appel, transcrit, quelques mots à la fois et au fil de la parole : les deux côtés peuvent se chevaucher. Pour un sous-titre ou une transcription ; la voix elle-même est jouée par la page de la scène.
who(texte):caller, la personne qui mène le live au micro, oumodel.text(texte): Les mots, à joindre aux précédents tels qu'ils sont venus.start(nombre): Quand ils ont commencé dans l'appel, en millisecondes.end(nombre): Quand ils se sont terminés, en millisecondes.
call.ended
L'appel est terminé, ou ne s'est jamais ouvert : la voix s'est arrêtée sur toutes les pages.
reason(texte):hangup(l'action, ou l'appli),panic,limit(son plafond),content(la modération du modèle), ou toute autre chose pour un appel coupé ou jamais ouvert.seconds(nombre): Sa durée, depuis sa demande.
overlay.connected
Une page d'overlay du profil actif s'est connectée : OBS a chargé ou rechargé une scène. Les actions de la page l'entendent aussi, une fois chargées.
scene(texte): Le nom de la scène.pages(nombre): Combien de pages affichent cette scène maintenant.
JavaScript
vovo.on: Appellelistenerà chaque fois que l'événement se produit. L'action doit lister l'événement dans ses déclencheurs.vovo.show: Affiche le modèle marquédata-name="name", avec les{fields}remplis depuiseen texte brut.vovo.emit: Signale à l'appli que quelque chose s'est passé, comme la fin d'une animation : les actions qui listentnamedans leurs déclencheurs le reçoivent. Deux pages qui affichent l'action l'émettent une seule fois en traitant un même événement ; un appel fait plus tard (quand l'animation se termine) indique l'événement auquel il répond avecevent, comme pourvovo.chat.send, et sans événement derrière lui, le même nom avec les mêmes données en 5 secondes ne font qu'un événement.vovo.say: Dittextà voix haute dans le live, avec la voix du profil ou celle nommée dansvoice(une partie de son nom, une langue commept-BR, ou une voix du dossier de Piper commepiper:pt_BR-faber-medium). Une voix que cet ordinateur ne peut pas produire (Piper ou sa voix absents, pas de clé OpenAI) parle avec la voix du profil à la place, et la console de l'appli le dit.pitch(0,5 à 2) la rend plus aiguë ou plus grave à durée égale,ring(0 à 1) lui donne un tranchant métallique etsmalllui retire le coffre : la voix d'un personnage à partir de n'importe quelle voix. L'appli produit la voix une seule fois pour les pages qui la demandent en traitant un même événement, et chacune joue le même fichier ;eventcomme pourvovo.chat.send, et sans événement derrière lui, le même texte dit avec la même voix en 5 secondes n'est produit qu'une fois. Se résout quand la parole se termine.vovo.draw: Tire l'une desentries, chacune aussi probable que les autres. C'est l'appli qui tire, le tirage est donc équitable, et le journal enregistre le gagnant. Deux pages qui affichent l'action (OBS et la fenêtre d'aperçu) et tirent en traitant le même événement reçoivent la même réponse : un gagnant, un tirage dans le journal.eventcomme dansvovo.chat.send.vovo.chat.send: Écrittextdans le chat du live via l'appli : une ligne, jusqu'à 500 caractères, au nom du streamer, ou avecas: "persona"via le compte Twitch propre de la persona (Intégrations, sous Twitch). Tant que ce compte n'est pas connecté, une telle ligne est refusée et rien n'est écrit au nom du streamer à sa place. Il faut l'autorisationchat.send, et l'appli tient le rythme (20 lignes en 30 secondes, une par seconde et par action, quel que soit le compte qui les écrit) ; une ligne au-delà, ou pendant la panique, est écartée et la promesse est rejetée. Deux pages qui affichent l'action écrivent une seule fois ce qu'elles demandent en traitant un même événement ; un appel fait après le retour de son listener (après unawait, dans un minuteur) indique aveceventl'événement auquel il répond, l'objet même reçu par le listener, sinon l'appli ne peut pas le distinguer d'un second. Dans l'aperçu de l'éditeur rien n'est écrit : l'éditeur affiche la ligne.vovo.pad.play: Appuie sur l'un des boutons de son ou de vidéo du pad, par son libellé (sans tenir compte de la casse), comme le ferait un appui : une récompense ou une commande de chat peut jouer un son que le streamer a mis sur le pad, et les actions qui écoutentsound.playedl'entendent. Uniquement les boutons de son et de vidéo. Il faut l'autorisationpad.play; la panique le refuse, le journal indique que l'action a appuyé, et deux pages qui traitent un même événement appuient une fois. La promesse est rejetée quand aucun bouton de ce nom n'existe.eventcomme dansvovo.chat.send. Dans l'aperçu de l'éditeur rien n'est joué : l'éditeur dit ce qui le serait.vovo.pad.busy: Affiche l'un des boutons de cette action (bouton d'action ou de contrôle, par son libellé, sans tenir compte de la casse) comme en cours sur le pad pendantseconds: son pied se vide à mesure que le temps passe, sur l'ordinateur et sur les téléphones, pour que la personne qui mène le live sache que c'est toujours en cours, comme le fait le bouton d'un son pendant sa lecture. Aveclock: true, appuyer dessus ne fait rien jusque-là, et la console dit pourquoi.0y met fin aussitôt. Cela ne s'affiche que tant qu'une page affiche l'action, prend fin avec la panique et dure 15 minutes au maximum ; aucune autorisation n'est nécessaire, car cela n'atteint aucun bouton autre que ceux de l'action. Dans l'aperçu de l'éditeur le pad ne change pas : l'éditeur dit ce qui changerait.vovo.pad.lock: Retient l'un des boutons de cette action (par son libellé, commevovo.pad.busyle prend) : estompé sur le pad et sur les téléphones, et appuyer dessus ne fait rien d'autre que le signaler dans la console, jusqu'à ce que l'action le libère avecfalse. Pour un état de l'action plutôt que pour quelque chose en cours (un bouton qui ne veut rien dire tant que sa partie de la scène est masquée), donc rien ne se vide : pour ce qui dure un moment,vovo.pad.busy. Cela ne retient que tant qu'une page affiche l'action, et la panique libère ; une action qui redémarre le redit. Dans l'aperçu de l'éditeur le pad ne change pas : l'éditeur dit ce qui changerait.vovo.obs.source: Affiche (true) ou masque (false) une source dans une scène OBS, par les noms qu'OBS leur donne, sans tenir compte de la casse ni des accents ; sanson, cela bascule son état. Il faut l'autorisationobs.toggle; la panique le refuse, le journal l'enregistre, et deux pages qui traitent un même événement demandent une fois. La promesse se résout dès qu'OBS a été sollicité ; un nom qu'OBS n'a pas est signalé dans la console, avec celui qui était visé.eventcomme dansvovo.chat.send, à la place deonquand celui-ci est omis. Dans l'aperçu de l'éditeur rien ne change : l'éditeur dit ce qui changerait.vovo.obs.filter: Active (true) ou désactive (false) un filtre d'une source OBS, par leurs noms dans OBS ; sanson, cela bascule son état. La même autorisation et les mêmes règles quevovo.obs.source.vovo.chat.parts: Le message d'un événement de chat sous forme de nœuds à mettre dans la page : ses mots en texte, jamais en balisage, et ses emotes en<img class="vovo-emote">avec le nom de l'emote enalt. Un message sans parties est son texte.vovo.webhook.send: Demande à l'appli d'envoyerdata, en JSON (16 Ko au maximum), au webhook du profil nomméname, configuré dans Paramètres > Webhooks. L'action ne voit jamais l'adresse et n'atteint jamais le réseau. Il faut l'autorisationwebhook; l'appli tient le rythme (30 par minute, un par seconde et par action), envoie une fois ce que deux pages demandent ensemble, et n'appelle rien pendant la panique. La promesse se résout quand le webhook répond 2xx et est rejetée sinon.eventcomme dansvovo.chat.send. Dans l'aperçu de l'éditeur rien n'est envoyé : l'éditeur montre ce qui le serait.vovo.screen.place: Affiche l'écran partagé là où se trouveelement, sous le dessin de l'action elle-même (l'élément et ce qui est derrière doivent donc y être transparents), et le suit quand il bouge ;nullle retire.fitvautcontain(en entier, par défaut) oucover(en remplissant la place) ;radiusarrondit ses coins, en pixels ;backgroundest une couleur (#000000) pour l'espace quecontainlaisse autour d'une image d'une autre forme, qui sans elle reste transparent et montre ce qui est derrière la scène. Il faut l'autorisationscreen.show.vovo.camera.place: Affiche la caméra que le streamer a choisie dans l'un des paramètres de caméra de l'action (camera, sa clé ; le premier si elle n'est pas donnée) là où se trouveelement, sous le dessin de l'action elle-même (cette partie doit donc être transparente), et la suit quand il bouge ;nullla retire.fitvautcover(en remplissant la place, par défaut) oucontain(en entier) ;radiusetbackgroundcomme dansvovo.screen.place;mirrorla montre comme un miroir. La caméra n'est ouverte que tant qu'une page la montre, que la caméra du streamer est allumée et que la panique est désactivée ; l'événementcameraindique quand elle s'affiche. L'action ne voit jamais ses images et ne sait jamais de quelle caméra il s'agit. Il faut l'autorisationcamera.show.vovo.media.play: Lit un clip Twitch, une vidéo Twitch ou une vidéo YouTube, depuis son lien, dans le lecteur officiel, là oùvovo.media.placel'a mis (sinon sur toute la scène), avec son audio ; un plus récent prend sa place. Une action que seule la personne qui mène le live déclenche le lit tout de suite ; toute autre attend que quelqu'un l'approuve, ici ou depuis un téléphone autorisé, car un spectateur a pu le demander. La promesse se résout quand il passe à l'antenne et est rejetée quand il est refusé, écarté ou demandé pendant la panique.secondsle retire après cette durée : un lecteur ne sait pas quand un clip se termine ;eventcomme dansvovo.chat.send. Dans l'aperçu de l'éditeur il y est lu, sans son. Il faut l'autorisationmedia.play.vovo.media.place: Où le clip ou la vidéo est lu : là où se trouveelement, sous le dessin de l'action elle-même (l'élément et ce qui est derrière doivent donc y être transparents), en le suivant quand il bouge ;nullredonne toute la scène. Le lecteur garde la forme de la vidéo dans cette place ;radiusarrondit ses coins, en pixels.vovo.media.stop: Retire de la scène le clip ou la vidéo de l'action, sur toutes les pages qui l'affichent.vovo.call.start: Lance un appel vocal avec un modèle d'IA, à l'antenne : la personne qui mène le live parle au micro, le modèle répond à voix haute, et le live entend les deux. L'appli l'ouvre avec la clé OpenAI du streamer et le maintient ; les pages ne font que jouer la voix.instructionsdit qui est le modèle et comment il parle ;voiceest l'une des voix du modèle ;secondsle plafond de l'appel (300 au maximum, aussi la valeur par défaut) ;backofficece qui répond à une question que le modèle transmet « au système » ;phonejoue la voix comme sur une ligne téléphonique. La promesse se résout quand l'appel est ouvert, le modèle entendant du silence et pas encore joué (call.started) ; décrochez avecvovo.call.answer. Elle est rejetée en cas de refus. Il faut l'autorisationcall, et l'appel ne démarre qu'à partir d'un geste de la personne qui mène le live (un bouton du pad, un raccourci, un contrôle, le panneau de l'action) ou dans une action qui n'est qu'à elle : l'appel est facturé à la seconde, porte le micro au modèle et met à l'antenne ce que dit le modèle sans que personne le lise. Un appel à la fois ; la panique raccroche et refuse ; l'aperçu de l'éditeur n'en passe aucun.eventcomme dansvovo.chat.send.vovo.call.answer: Décroche l'appel : dès lors le micro atteint le modèle et sa voix est jouée dans le live. Un modèle attend que l'appelant parle ; pour qu'il parle en premier,instructionlui dit comment répondre,openingpar quoi commencer, etcontextce qu'il doit savoir sans le dire, envoyés dans cet ordre. Décroché depuis une page, il est décroché : décrocher une seconde fois ne fait rien.vovo.call.tell: Dit quelque chose au modèle pendant l'appel, en une ligne :context(par défaut) est à savoir sans le dire,instructionà suivre,aloudà dire. Deux pages qui traitent un même événement le disent une fois ;eventcomme dansvovo.chat.send.vovo.call.end: Raccroche l'appel : la voix s'arrête aussitôt sur toutes les pages, etcall.endedsuit.vovo.state: Un objet qui survit aux rechargements de l'overlay et aux redémarrages de l'appli. Ses clés de premier niveau sont enregistrées dès que vous les modifiez.vovo.settings: Ce qui a été choisi des paramètres que l'action déclare (settingsdansaction.json), par clé, ou chacun tel que l'action est livrée : une couleur en#RRGGBB, un nombre, true ou false, une option, une ligne, l'adresse d'un fichier (null pour aucun), une famille de police, et pour une caméra true ou false, selon qu'une caméra est choisie, jamais laquelle. Choisis dans Personnaliser, sur l'ordinateur, jamais par l'action ; l'événementsettingsindique quand cela change.
Modèles
{field} dans un modèle est rempli avec ce champ de l'événement, en texte brut.
data-on: Sur un<template>: l'événement qui l'affiche, rempli avec les champs de cet événement.data-name: Sur un<template>: le nom quevovo.showutilise pour l'afficher depuis JavaScript.data-seconds: Sur un<template>: combien de temps il reste avant d'être retiré. Sans cela, il reste.data-vovo-<key>: À la racine du document, pour chaque paramètre activé/désactivé, à choix ou de caméra :onouoff(une caméra choisie ou non), ou l'option choisie, pour des sélecteurs commehtml[data-vovo-side="Droite"] .chat.
CSS
--vovo-accent: La couleur d'accent choisie dans Vovó.--vovo-<key>: Chaque paramètre de l'action, en CSS : une couleur, un nombre avec son unité (34px), 1 ou 0 pour activé ou désactivé ou pour une caméra choisie ou non, une option, une ligne ou une famille de police entre guillemets, un fichier enurl(...)ounone.font-family: var(--vovo-font), sans-serif;
Autorisations
Une action les demande dans son manifeste, et la personne qui l'installe les approuve.
chat.send: Écrire dans le chat de la chaîne, via l'appli : au nom du streamer, ou via le compte propre de la persona.media.play: Clips et vidéos dans le live, dans leurs lecteurs officiels ; ce que la personne qui mène le live n'a pas demandé attend une approbation.call: Appels vocaux avec un modèle d'IA, à l'antenne : lancés seulement par la personne qui mène le live, payés à la seconde avec la clé OpenAI du streamer ; le micro part vers le modèle, et ce qu'il dit est entendu sans relecture.screen.show: Montrer dans le live ce que le streamer partage depuis la page de partage de Vovó.camera.show: Montrer dans le live la caméra de cet ordinateur que le streamer a choisie pour l'action dans Personnaliser, jamais ses images à l'action.pad.play: Jouer les boutons de son et de vidéo du pad, par leur libellé.obs.toggle: Afficher ou masquer des sources et activer ou désactiver des filtres dans OBS.webhook: Demander à l'appli d'appeler l'un des webhooks sortants du profil.