API de Vovó 1
Generada a partir del propio código de Vovó, así que siempre coincide con esta versión. El texto de los espectadores llega siempre como texto sin formato, nunca como HTML.
Eventos simples
Iguales en todas las plataformas; {platform} dice cuál. Para lo que solo tiene una plataforma, usa su propio evento, más abajo.
follow
Alguien empezó a seguir el canal. Viene de twitch.follow.
user(texto): Quién lo hizo, tal como aparece en la plataforma.platform(plataforma): Dónde pasó.
sub
Alguien se suscribió, renovó o recibió una suscripción de regalo. Viene de twitch.sub.
user(texto): Quién lo hizo, tal como aparece en la plataforma.tier(número): 1, 2 o 3.months(número): Meses de suscripción en total.gift(sí o no): Si fue un regalo.platform(plataforma): Dónde pasó.
raid
Otro canal hizo una incursión en este. Viene de twitch.raid.
user(texto): Quién lo hizo, tal como aparece en la plataforma.viewers(número): Cuántos vinieron.platform(plataforma): Dónde pasó.
chat
Un mensaje en el chat. Viene de twitch.chat.
user(texto): Quién lo hizo, tal como aparece en la plataforma.text(texto): Su mensaje, como texto sin formato.parts(texto y emotes): El mensaje en partes, en orden: eltextde cada una y, para un emote, también su imagen, enimage, servida por Vovó.vovo.chat.parts(e)las convierte en nodos para mostrar.platform(plataforma): Dónde pasó.
tip
Alguien envió dinero o bits. Viene de twitch.cheer.
user(texto): Quién lo hizo, tal como aparece en la plataforma.amount(número): Cuánto, encurrency.currency(texto):bits, o un código de moneda comoBRL.text(texto): Su mensaje, como texto sin formato.platform(plataforma): Dónde pasó.
Twitch
twitch.follow
Un seguimiento en Twitch.
user(texto): Quién lo hizo, tal como aparece en la plataforma.
twitch.sub
Una suscripción, renovación o suscripción de regalo en Twitch.
user(texto): Quién lo hizo, tal como aparece en la plataforma.tier(número): 1, 2 o 3.months(número): Meses de suscripción en total.gift(sí o no): Si fue un regalo.gifter(texto): Quién la regaló, si fue un regalo.text(texto): Su mensaje, como texto sin formato.
twitch.raid
Una incursión en Twitch.
user(texto): Quién lo hizo, tal como aparece en la plataforma.viewers(número): Cuántos vinieron.
twitch.chat
Un mensaje del chat en Twitch.
user(texto): Quién lo hizo, tal como aparece en la plataforma.text(texto): Su mensaje, como texto sin formato.parts(texto y emotes): El mensaje en partes, en orden: eltextde cada una y, para un emote, también su imagen, enimage, servida por Vovó.vovo.chat.parts(e)las convierte en nodos para mostrar.color(texto): El color de su nombre,#RRGGBB.badges(texto): Sus insignias, separadas por comas:moderator,subscriber.persona(sí o no): True cuando la línea es de la propia persona, escrita en el chat por su cuenta.
twitch.viewers
Cuántas personas ven el directo. Twitch se consulta más o menos una vez por minuto mientras está en directo; esto llega cuando el número cambia, y con live en false cuando termina el directo.
viewers(número): Cuántos ven ahora.live(sí o no): True mientras el directo está al aire.
twitch.cheer
Bits enviados en Twitch.
user(texto): Quién lo hizo, tal como aparece en la plataforma.bits(número): Cuántos bits.text(texto): Su mensaje, como texto sin formato.
twitch.redemption
Se canjeó una recompensa de puntos de canal.
user(texto): Quién lo hizo, tal como aparece en la plataforma.reward(texto): El título de la recompensa.reward_id(texto): El id de Twitch para la recompensa, que no cambia cuando se renombra.input(texto): Lo que escribió, en las recompensas que lo piden.redemption(texto): El id de Twitch para este canje: el mismo en sutwitch.redemption.resolved.
twitch.redemption.resolved
Un canje que esperaba en la cola de la recompensa se aprobó o se rechazó (rechazar devuelve los puntos).
user(texto): Quién lo hizo, tal como aparece en la plataforma.reward(texto): El título de la recompensa.reward_id(texto): El id de Twitch para la recompensa, que no cambia cuando se renombra.input(texto): Lo que escribió, en las recompensas que lo piden.status(texto):approved(aprobado) orejected(rechazado).redemption(texto): El id de Twitch para este canje, como en sutwitch.redemption.
twitch.hypetrain
Un Hype Train empezó, avanzó o terminó.
level(número): El nivel actual.progress(número): Puntos dentro de este nivel.goal(número): Puntos que necesita este nivel.ended(sí o no): Si acaba de terminar.
De Vovó y OBS
button
Se pulsó su botón en el pad.
label(texto): La etiqueta del botón.
hotkey
Se pulsó un atajo global, con el juego delante o no. El disparador indica su combinación con una condición, keys es Ctrl+Alt+1, y la app lo escucha mientras el perfil está activo.
keys(texto): La combinación, comoCtrl+Alt+1.
timer
Saltó un temporizador. El disparador indica cada cuánto con una condición, every es un número de segundos (5 o más); sin ella, salta cada minuto. Cuenta desde que aparece el disparador, y se detiene durante el pánico.
every(número): Su intervalo, en segundos.
control
Se cambió uno de los controles de la acción en el pad. Su nuevo valor también está en vovo.state, bajo la clave del control, así que una página que se abra después lo muestra. Una acción que ofrece controles recibe esto sin añadirlo como disparador.
key(texto): La clave del control, tal como la declara la acción.value(valor de un control): Su nuevo valor: true o false, una opción, un número entero o una línea de texto.
settings
Cambió lo elegido de los ajustes de la acción, en Personalizar: vovo.settings, sus variables --vovo-<key> y sus atributos data-vovo-<key> ya tienen los valores nuevos. Una acción que declara ajustes recibe esto sin añadirlo como disparador.
key(texto): La clave del ajuste, o vacío cuando todos volvieron a como viene la acción.
panel
Se hizo algo en el panel de la acción (panel en su manifiesto, mostrado en Paneles, en la barra lateral): un botón pulsado, un formulario enviado o un botón en una línea de una lista. Como control, una acción con panel recibe esto sin añadirlo como disparador; solo lo dispara quien lleva el directo.
name(texto): El nombre del botón, del formulario o del botón de la línea, tal como lo declara el panel.values(valor de un control): Los campos de un formulario, por sus claves, cada uno una línea de texto; vacío para un botón.item(valor de un control): Para una línea de lista, el elemento que muestra, tal como lo guarda el estado.index(número): Para una línea de lista, su posición en la lista, desde 0; -1 en otro caso.
webhook
Se llamó a un webhook entrante.
hook(texto): El nombre del webhook.data(datos): Lo que se envió, no fiable: muéstralo solo como texto.
obs.scene
OBS cambió de escena.
scene(texto): La escena que está al aire ahora.previous(texto): La escena anterior.
media.track
Cambió lo que suena en este equipo: otra pista, o reproducir y pausar. Viene de cualquier app que le dice a Windows qué está sonando (Spotify, un navegador, un reproductor).
title(texto): El título de la pista.artist(texto): Quién la interpreta.album(texto): Su álbum, si se sabe.playing(sí o no): True mientras suena; false cuando está en pausa o detenida.art(texto): La dirección de la portada, para un<img src>; vacío si no hay.source(texto): La app en la que suena.
audio.level
Qué tan fuerte suena el micrófono, unas 20 veces por segundo mientras cambia: para una boca que se mueve, un medidor, un brillo. Vovó escucha solo mientras un overlay abierto muestra una acción que espera esto; el sonido en sí nunca sale del equipo, solo su volumen.
level(número): Volumen de 0 (silencio) a 1 (lo más fuerte posible), en una escala que sigue al oído.peak(número): El momento más fuerte desde el anterior, de 0 a 1.speaking(sí o no): True mientras hay voz, mantenido un momento en las pausas cortas.
screen.color
El color de la pantalla principal, varias veces por segundo mientras cambia: para un brillo o un marco que sigue al juego. Solo se lee mientras un overlay abierto muestra una acción que espera esto; el overlay de pantalla de Vovó nunca entra.
color(texto): El color medio,#RRGGBB.vivid(texto): El color más llamativo de la pantalla,#RRGGBB: la media tiende al gris, este no.brightness(número): Qué tan clara está la pantalla, de 0 (negro) a 1 (blanco).
input.move
Cómo se mueve quien hace el directo en un juego, hasta 60 veces por segundo mientras cambia: cuánto giró la cámara, hacia dónde camina y si salta. Para una escena que se balancea con la cámara, se inclina al desplazarse de lado y baja con un salto. Viene del ratón, las teclas de movimiento (W, A, S y D por su lugar en el teclado, sea cual sea su distribución, o las flechas, y la barra espaciadora) y el primer mando conectado (sus palancas y su botón A), siempre como una dirección, nunca como qué tecla. Solo se lee mientras un overlay abierto muestra una acción que espera esto, nada del resto del teclado, y las teclas no mientras la ventana de Vovó está delante (el ratón y un mando sí, salvo que el equipo los pause también). Un juego ejecutado como administrador puede ocultar su entrada a Vovó, que se ejecuta sin serlo.
dx(número): Cuánto giró la cámara hacia los lados desde la última vez, a la derecha positivo: el movimiento propio del ratón, en sus cuentas (no la posición del puntero, que el juego mantiene quieta), con la palanca derecha de un mando sumándose.dy(número): Cuánto giró hacia arriba o hacia abajo, hacia abajo positivo.walk(número): De -1 (atrás) a 1 (adelante): W o S, o las flechas, dan 1 o -1, la palanca izquierda de un mando lo que se empuje; 0 quieto.strafe(número): De -1 (izquierda, A) a 1 (derecha, D), de la misma forma.jump(sí o no): True mientras se mantiene la barra espaciadora, o la A de un mando.
speech.text
Lo que quien hace el directo dijo al micrófono, escrito frase a frase, para subtítulos: con Whisper en este equipo, o con OpenAI si quien hace el directo lo eligió (Configuración > Voz, Voz a texto). El micrófono solo se lee mientras un overlay abierto muestra una acción que escucha esto; cada frase llega cuando termina su pausa, uno o dos segundos después de decirse, y no se guarda nada.
text(texto): La frase, como texto.
screen.shared
Una pantalla compartida salió al aire o dejó de estarlo: una pantalla, una ventana o una pestaña del navegador, la propia de quien hace el directo (capturada por la propia Vovó, o desde su página para compartir en el navegador), o la de un invitado que quien hace el directo puso al aire. Una acción que la coloca (vovo.screen.place) la muestra. Llega de nuevo, con on todavía verdadero, cuando otra cosa ocupa el lugar de lo que se compartía.
on(sí o no): True mientras se comparte algo.kind(texto): Qué se comparte:screen,windowotab(una pestaña, solo desde la página para compartir); vacío cuando no hay nada.audio(sí o no): True cuando también llega su sonido.guest(texto): El invitado de quien es la pantalla, con el nombre que le dio quien hace el directo; vacío para la de quien hace el directo.
camera
Una cámara que la acción colocó (vovo.camera.place) empezó a verse en su página, o dejó de verse: quien hace el directo la encendió o la apagó, el pánico la apagó, se desconectó u otro programa la está usando. Como settings, una acción que coloca una cámara recibe esto sin añadirlo como disparador.
camera(texto): La clave del ajuste de cámara que muestra, tal como lo declara la acción.on(sí o no): true mientras se ve su imagen.
persona.answer
La persona respondió a alguien, aprobada cuando la aprobación está activada. La app ya lo envía al chat y lo dice en voz alta cuando está configurada para ello; una acción lo muestra.
persona(texto): El nombre de la persona.user(texto): Quién lo hizo, tal como aparece en la plataforma.question(texto): Lo que se preguntó.answer(texto): Su respuesta.mood(texto): Lo que la respuesta pide que haga la persona, a partir de una palabra entre corchetes al principio o al final ([dancing] ¡ganamos!), en minúsculas; vacío si no hay. La palabra se quita de la respuesta, que llega al chat y a la voz sin ella, para que la personalidad pueda pedir a la persona que actúe mientras habla.
tts.spoken
La app leyó algo en voz alta al aire: un mensaje del chat que quien lleva el directo eligió leer, o el texto de una recompensa una vez aprobado. Lo dice ella misma, con la voz de lectura (Configuración > Voz); una acción lo muestra, o le da algo que hacer a la boca de un personaje. Una línea que la propia persona escribió en el chat llega con persona en true, y la app la dice con la voz de la persona solo cuando la persona está configurada para hablar, así que una acción que da voz a la persona la dice en su lugar.
user(texto): Quién lo hizo, tal como aparece en la plataforma.text(texto): Lo que se leyó.source(texto): De dónde vino:chatoreward.persona(sí o no): True cuando la línea es de la propia persona, escrita en el chat por su cuenta.
music.request
Un espectador pidió una canción del reproductor de Vovó, por su recompensa o su comando en el chat (Configuración > Música), y esto es lo que pasó con ella: espera aprobación, entró en la cola, empezó a sonar, se descartó, o se rechazó y por qué. Vovó no escribe nada en el chat; una acción responde allí, o muestra quién pidió lo que suena.
user(texto): Quién lo hizo, tal como aparece en la plataforma.text(texto): Lo que escribió para pedirla.song(texto): La canción que encontró, con título y artista; vacío si no encontró ninguna.state(texto): Qué pasó con ella:waiting,queued,playing,discardedorefused.why(texto): Por qué se rechazó:none(ninguna canción coincide),many(varias coinciden por igual),busy(ya tiene una esperando o en la cola),full(demasiadas esperan),queued(la canción ya está en la cola) oagain(sonó hace poco); vacío en otro caso.source(texto): Cómo la pidieron:rewardochat.
sound.played
Un botón de sonido del pad reprodujo su sonido, o el que sorteó entre sus sonidos.
label(texto): El nombre del botón.button(número): El id del botón.file(texto): El nombre del archivo que sonó, cuál de varios cuando el botón sortea uno.seconds(número): Cuánto dura el archivo, en segundos con una décima; 0 cuando Vovó no pudo saberlo.
video.played
Un botón de vídeo del pad reprodujo su vídeo sobre el escenario, o el que sorteó entre sus vídeos.
label(texto): El nombre del botón.button(número): El id del botón.file(texto): El nombre del archivo que sonó, cuál de varios cuando el botón sortea uno.seconds(número): Cuánto dura el archivo, en segundos con una décima; 0 cuando Vovó no pudo saberlo.
remote.talk
Alguien habló al aire desde su teléfono, manteniendo su botón para hablar como con un walkie-talkie: su voz suena ahora en todos los overlays del directo, desde la página de la escena. Una acción muestra quién habla, mientras habla.
name(texto): El teléfono, con el nombre que le dio quien hace el directo al emparejarlo.seconds(número): Cuánto dura la voz, en segundos, con una décima.
call.started
La llamada de voz que pidió la acción (vovo.call.start) está abierta: el modelo está ahí, oyendo silencio, y lo que dice aún no suena, hasta vovo.call.answer. Toda página que muestra la acción oye esto, así que cada una puede hacer sonar su teléfono y contestar al mismo ritmo.
seconds(número): El límite de la llamada, en segundos, contado desde que se pidió.
call.answered
Se contestó la llamada (vovo.call.answer, desde cualquier página): el micrófono llega al modelo y su voz suena en el directo.
call.text
Lo que se acaba de decir en la llamada, por escrito, unas pocas palabras cada vez y mientras se dice: los dos lados pueden solaparse. Para un subtítulo o una transcripción; la voz la reproduce la página de la escena.
who(texto):caller, quien lleva el directo al micrófono, omodel.text(texto): Las palabras, para unir a las anteriores tal como llegaron.start(número): Cuándo empezaron en la llamada, en milisegundos.end(número): Cuándo terminaron, en milisegundos.
call.ended
La llamada terminó, o nunca se abrió: la voz se detuvo en todas las páginas.
reason(texto):hangup(la acción, o la app),panic,limit(su límite),content(la moderación del modelo), o cualquier otra cosa para una llamada que se cortó o nunca se abrió.seconds(número): Cuánto duró, desde que se pidió.
overlay.connected
Se conectó una página de overlay del perfil activo: OBS cargó o recargó una escena. Las propias acciones de la página también lo oyen, una vez cargadas.
scene(texto): El nombre de la escena.pages(número): Cuántas páginas muestran esa escena ahora.
JavaScript
vovo.on: Llama alistenercada vez que ocurre el evento. La acción debe tener el evento entre sus disparadores.vovo.show: Muestra la plantilla marcada condata-name="name", con los{fields}rellenados desdeecomo texto sin formato.vovo.emit: Avisa a la app de que pasó algo, como el fin de una animación: lo reciben las acciones que tienennameentre sus disparadores. Dos páginas que muestran la acción lo emiten una sola vez al manejar un evento; una llamada hecha después (cuando termina la animación) indica el evento al que responde conevent, como envovo.chat.send, y sin ningún evento detrás el mismo nombre con los mismos datos en 5 segundos es un solo evento.vovo.say: Dicetexten voz alta en el directo, con la voz del perfil o la indicada envoice(parte de su nombre, un idioma comopt-BR, o una voz de la carpeta de Piper comopiper:pt_BR-faber-medium). Una voz que este equipo no puede generar (falta Piper o su voz, no hay clave de OpenAI) habla con la voz del perfil, y la consola de la app lo dice.pitch(0,5 a 2) la hace más aguda o más grave con la misma duración,ring(0 a 1) le da un filo metálico ysmallle quita el pecho: la voz de un personaje a partir de cualquier voz. La app genera la voz una sola vez para las páginas que la piden al manejar un mismo evento, y cada una reproduce el mismo archivo;eventcomo envovo.chat.send, y sin ningún evento detrás el mismo texto con la misma voz en 5 segundos se genera una sola vez. Se resuelve cuando termina de hablar.vovo.draw: Sortea una de lasentries, todas con la misma probabilidad. La que sortea es la app, así que el sorteo es justo, y la auditoría registra al ganador. Dos páginas que muestran la acción (OBS y la ventana de vista previa) que sortean al manejar el mismo evento reciben la misma respuesta: un ganador, un sorteo en la auditoría.eventcomo envovo.chat.send.vovo.chat.send: Escribetexten el chat del directo a través de la app: una línea, de hasta 500 caracteres, como quien hace el directo, o conas: "persona"a través de la cuenta propia de la persona en Twitch (Integraciones, bajo Twitch). Mientras esa cuenta no está conectada, una línea así se rechaza y no se escribe nada como quien hace el directo en su lugar. Necesita el permisochat.send, y la app marca el ritmo (20 líneas en 30 segundos, una por segundo por acción, sea cual sea la cuenta que las escribe); una línea que lo supere, o durante el pánico, se queda fuera y la promesa se rechaza. Dos páginas que muestran la acción escriben una sola vez lo que piden al manejar un evento; una llamada hecha después de que su listener terminara (tras unawait, en un temporizador) indica el evento al que responde conevent, el mismo objeto que recibió el listener, o la app no puede distinguirla de una segunda. En la vista previa del editor no se escribe nada: el editor muestra la línea.vovo.pad.play: Pulsa uno de los botones de sonido o vídeo del pad, por su etiqueta (sin distinguir mayúsculas), como lo haría una pulsación: una recompensa o un comando del chat puede reproducir un sonido que quien hace el directo puso en el pad, y las acciones que escuchansound.playedlo oyen. Solo botones de sonido y vídeo. Necesita el permisopad.play; el pánico lo rechaza, la auditoría dice que lo pulsó la acción, y dos páginas que manejan un evento lo pulsan una vez. La promesa se rechaza cuando no existe ese botón.eventcomo envovo.chat.send. En la vista previa del editor no suena nada: el editor dice qué sonaría.vovo.pad.busy: Muestra uno de los botones de esta acción (de acción o de control, por su etiqueta, sin distinguir mayúsculas) como en curso en el pad duranteseconds: su pie se vacía a medida que pasa el tiempo, en el equipo y en los teléfonos, para que quien lleva el directo sepa que sigue en marcha, como hace el botón de un sonido mientras suena. Conlock: true, pulsarlo no hace nada hasta entonces, y la consola dice por qué.0lo termina al instante. Solo se muestra mientras una página muestra la acción, termina con el pánico y dura 15 minutos como máximo; no necesita permiso, porque no llega a ningún botón salvo los de la acción. En la vista previa del editor el pad no cambia: el editor dice qué cambiaría.vovo.pad.lock: Retiene uno de los botones de esta acción (por su etiqueta, como lo tomavovo.pad.busy): atenuado en el pad y en los teléfonos, y pulsarlo no hace nada salvo decirlo en la consola, hasta que la acción lo suelta confalse. Para un estado de la acción más que para algo en curso (un botón que no significa nada mientras su parte de la escena está oculta), así que nada se vacía: para lo que dura un rato,vovo.pad.busy. Solo retiene mientras una página muestra la acción, y el pánico lo suelta; una acción que vuelve a empezar lo dice de nuevo. En la vista previa del editor el pad no cambia: el editor dice qué cambiaría.vovo.obs.source: Muestra (true) u oculta (false) una fuente en una escena de OBS, por los nombres que OBS les da, sin distinguir mayúsculas ni acentos; sinon, alterna su estado. Necesita el permisoobs.toggle; el pánico lo rechaza, la auditoría lo registra, y dos páginas que manejan un evento lo piden una vez. La promesa se resuelve en cuanto se pidió a OBS; un nombre que OBS no tiene se dice en la consola, con el que se quería decir.eventcomo envovo.chat.send, en lugar deoncuando este se omite. En la vista previa del editor no cambia nada: el editor dice qué cambiaría.vovo.obs.filter: Activa (true) o desactiva (false) un filtro de una fuente de OBS, por sus nombres en OBS; sinon, alterna su estado. El mismo permiso y las mismas reglas quevovo.obs.source.vovo.chat.parts: El mensaje de un evento de chat como nodos para poner en la página: sus palabras como texto, nunca como marcado, y sus emotes como<img class="vovo-emote">con el nombre del emote comoalt. Un mensaje sin partes es su texto.vovo.webhook.send: Pide a la app que envíedata, como JSON (16 KB como máximo), al webhook del perfil llamadoname, configurado en Configuración > Webhooks. La acción nunca ve la dirección y nunca llega a la red. Necesita el permisowebhook; la app marca el ritmo (30 por minuto, uno por segundo por acción), envía una vez lo que dos páginas piden a la vez, y no llama a nada durante el pánico. La promesa se resuelve cuando el webhook responde 2xx y se rechaza en otro caso.eventcomo envovo.chat.send. En la vista previa del editor no se envía nada: el editor muestra lo que se enviaría.vovo.screen.place: Muestra la pantalla compartida donde estáelement, debajo del dibujo de la propia acción (así que el elemento y lo que hay detrás deben ser transparentes ahí), y lo sigue cuando se mueve;nullla quita.fitescontain(entera, lo predeterminado) ocover(llenando el sitio);radiusredondea sus esquinas, en píxeles;backgroundes un color (#000000) para el hueco quecontaindeja alrededor de una imagen de otra forma, que sin él queda transparente y muestra lo que hay detrás de la escena. Necesita el permisoscreen.show.vovo.camera.place: Muestra la cámara que quien hace el directo eligió en uno de los ajustes de cámara de la acción (camera, su clave; el primero si no se da) donde estáelement, debajo del dibujo de la propia acción (así que esa parte debe ser transparente), y lo sigue cuando se mueve;nullla quita.fitescover(llenando el sitio, lo predeterminado) ocontain(entera);radiusybackgroundcomo envovo.screen.place;mirrorla muestra como lo haría un espejo. La cámara solo se abre mientras alguna página la muestra, la cámara de quien hace el directo está encendida y el pánico está desactivado; el eventocameraavisa cuando se ve. La acción nunca ve sus imágenes ni sabe qué cámara es. Necesita el permisocamera.show.vovo.media.play: Reproduce un clip de Twitch, un vídeo de Twitch o un vídeo de YouTube, a partir de su enlace, en el reproductor oficial, donde lo pusovovo.media.place(si no, en todo el escenario), con su sonido; uno más nuevo ocupa su lugar. Una acción que solo dispara quien lleva el directo lo reproduce al instante; cualquier otra espera a que alguien lo apruebe, aquí o desde un teléfono que pueda hacerlo, ya que puede haberlo pedido un espectador. La promesa se resuelve cuando sale al aire y se rechaza cuando se rechaza, se descarta o se pide durante el pánico.secondslo quita tras ese tiempo: un reproductor no sabe cuándo termina un clip;eventcomo envovo.chat.send. En la vista previa del editor se reproduce allí, en silencio. Necesita el permisomedia.play.vovo.media.place: Dónde se reproduce el clip o vídeo: donde estáelement, debajo del dibujo de la propia acción (así que el elemento y lo que hay detrás deben ser transparentes ahí), siguiéndolo cuando se mueve;nullvuelve a ser todo el escenario. El reproductor mantiene la forma del vídeo dentro del sitio;radiusredondea sus esquinas, en píxeles.vovo.media.stop: Quita del escenario el clip o vídeo de la acción, en todas las páginas que la muestran.vovo.call.start: Inicia una llamada de voz con un modelo de IA, al aire: quien lleva el directo habla al micrófono, el modelo responde en voz alta, y el directo oye a los dos. La app la abre con la clave de OpenAI de quien hace el directo y la mantiene; las páginas solo reproducen la voz.instructionses quién es el modelo y cómo habla;voice, una de las voces del modelo;seconds, el límite de la llamada (300 como máximo, que también es el predeterminado);backoffice, con qué se responde a una pregunta que el modelo pasa "al sistema";phonereproduce la voz como por una línea telefónica. La promesa se resuelve cuando la llamada está abierta, con el modelo oyendo silencio y aún sin reproducirse (call.started); contéstala convovo.call.answer. Se rechaza cuando se niega. Necesita el permisocall, y solo empieza desde algo que quien lleva el directo hizo a mano (un botón del pad, un atajo, un control, el panel de la acción) o en una acción que es solo suya: la llamada se cobra por segundo, lleva el micrófono al modelo y pone al aire lo que dice el modelo sin que nadie lo lea antes. Una llamada a la vez; el pánico cuelga y rechaza; la vista previa del editor no hace ninguna.eventcomo envovo.chat.send.vovo.call.answer: Contesta la llamada: a partir de aquí el micrófono llega al modelo y su voz suena en el directo. Un modelo espera a que hable quien llama; para que hable primero,instructionle dice cómo contestar,openingcon qué debe empezar, ycontextlo que debe saber sin decirlo, enviados en ese orden. Contestada desde una página, queda contestada: contestar otra vez no hace nada.vovo.call.tell: Le dice algo al modelo durante la llamada, en una línea:context(lo predeterminado) es algo que saber sin decirlo,instructionalgo que seguir,aloudalgo que decir. Dos páginas que manejan un evento lo dicen una vez;eventcomo envovo.chat.send.vovo.call.end: Cuelga la llamada: la voz se detiene al instante en todas las páginas, y luego llegacall.ended.vovo.state: Un objeto que sobrevive a las recargas del overlay y a los reinicios de la app. Sus claves de primer nivel se guardan en cuanto las cambias.vovo.settings: Lo elegido de los ajustes que declara la acción (settingsenaction.json), por clave, o cada uno tal como viene la acción: un color como#RRGGBB, un número, true o false, una opción, una línea, la dirección de un archivo (null si no hay), la familia de una fuente, y para una cámara true o false, si se eligió alguna, nunca cuál. Se eligen en Personalizar, en el equipo, nunca desde la acción; el eventosettingsavisa cuando cambian.
Plantillas
{field} dentro de una plantilla se rellena con ese campo del evento, como texto sin formato.
data-on: En un<template>: el evento que la muestra, rellenada con los campos de ese evento.data-name: En un<template>: el nombre que usavovo.showpara mostrarla desde JavaScript.data-seconds: En un<template>: cuánto tiempo se queda antes de quitarse. Sin esto, se queda.data-vovo-<key>: En la raíz del documento, para cada ajuste de activar o desactivar, de elección o de cámara:onuoff(una cámara elegida o no), o la opción elegida, para selectores comohtml[data-vovo-side="Derecha"] .chat.
CSS
--vovo-accent: El color de acento elegido en Vovó.--vovo-<key>: Cada ajuste de la acción, como CSS: un color, un número con su unidad (34px), 1 o 0 para activado o desactivado o para una cámara elegida o no, una opción, línea o familia de fuente entre comillas, un archivo comourl(...)onone.font-family: var(--vovo-font), sans-serif;
Permisos
Una acción los pide en su manifiesto, y quien la instala los aprueba.
chat.send: Escribir en el chat del canal, a través de la app: como quien hace el directo, o a través de la cuenta propia de la persona.media.play: Clips y vídeos en el directo, en sus reproductores oficiales; lo que no pidió quien lleva el directo espera aprobación.call: Llamadas de voz con un modelo de IA, al aire: solo las inicia quien lleva el directo, se pagan por segundo con la clave de OpenAI de quien hace el directo; el micrófono va al modelo, y lo que dice se oye sin que nadie lo lea antes.screen.show: Mostrar en el directo lo que quien hace el directo comparte desde la página para compartir de Vovó.camera.show: Mostrar en el directo la cámara de este equipo que quien hace el directo eligió para la acción en Personalizar, nunca sus imágenes a la acción.pad.play: Reproducir los botones de sonido y vídeo del pad, por su etiqueta.obs.toggle: Mostrar u ocultar fuentes y activar o desactivar filtros en OBS.webhook: Pedir a la app que llame a uno de los webhooks salientes del perfil.