API da Vovó 1
Gerada a partir do próprio código da Vovó, então sempre bate com esta versão. Texto vindo de viewers chega sempre como texto puro, nunca como HTML.
Eventos simples
Iguais em todas as plataformas; {platform} diz qual. Para o que só uma plataforma tem, use o evento dela, mais abaixo.
follow
Alguém seguiu o canal. Vem de twitch.follow.
user(texto): Quem fez, como aparece na plataforma.platform(plataforma): Onde aconteceu.
sub
Alguém se inscreveu, renovou ou ganhou uma inscrição. Vem de twitch.sub.
user(texto): Quem fez, como aparece na plataforma.tier(número): 1, 2 ou 3.months(número): Meses de inscrição no total.gift(sim ou não): Se foi presente.platform(plataforma): Onde aconteceu.
raid
Outro canal mandou uma raid para este. Vem de twitch.raid.
user(texto): Quem fez, como aparece na plataforma.viewers(número): Quantas pessoas vieram junto.platform(plataforma): Onde aconteceu.
chat
Uma mensagem no chat. Vem de twitch.chat.
user(texto): Quem fez, como aparece na plataforma.text(texto): A mensagem, como texto puro.parts(texto e emotes): A mensagem em partes, na ordem: otextde cada uma e, de um emote, também a imagem, emimage, servida pela Vovó.vovo.chat.parts(e)as transforma em nós para mostrar.platform(plataforma): Onde aconteceu.
tip
Alguém mandou dinheiro ou bits. Vem de twitch.cheer.
user(texto): Quem fez, como aparece na plataforma.amount(número): Quanto, emcurrency.currency(texto):bits, ou um código de moeda comoBRL.text(texto): A mensagem, como texto puro.platform(plataforma): Onde aconteceu.
Twitch
twitch.follow
Um follow na Twitch.
user(texto): Quem fez, como aparece na plataforma.
twitch.sub
Uma inscrição, renovação ou inscrição presenteada na Twitch.
user(texto): Quem fez, como aparece na plataforma.tier(número): 1, 2 ou 3.months(número): Meses de inscrição no total.gift(sim ou não): Se foi presente.gifter(texto): Quem deu, quando foi presente.text(texto): A mensagem, como texto puro.
twitch.raid
Uma raid na Twitch.
user(texto): Quem fez, como aparece na plataforma.viewers(número): Quantas pessoas vieram junto.
twitch.chat
Uma mensagem no chat da Twitch.
user(texto): Quem fez, como aparece na plataforma.text(texto): A mensagem, como texto puro.parts(texto e emotes): A mensagem em partes, na ordem: otextde cada uma e, de um emote, também a imagem, emimage, servida pela Vovó.vovo.chat.parts(e)as transforma em nós para mostrar.color(texto): A cor do nome,#RRGGBB.badges(texto): As insígnias, separadas por vírgula:moderator,subscriber.persona(sim ou não): Verdadeiro quando a linha é da própria persona, escrita no chat pela conta dela.
twitch.viewers
Quantas pessoas assistem à live. A Twitch é lida mais ou menos uma vez por minuto enquanto a live está no ar; isto chega quando o número muda, e com live falso quando a live acaba.
viewers(número): Quantas assistem agora.live(sim ou não): Verdadeiro enquanto a live está no ar.
twitch.cheer
Bits enviados na Twitch.
user(texto): Quem fez, como aparece na plataforma.bits(número): Quantos bits.text(texto): A mensagem, como texto puro.
twitch.redemption
Uma recompensa de pontos do canal resgatada.
user(texto): Quem fez, como aparece na plataforma.reward(texto): O título da recompensa.reward_id(texto): O id da Twitch para a recompensa, que continua o mesmo quando ela é renomeada.input(texto): O que a pessoa digitou, nas recompensas que pedem.redemption(texto): O id da Twitch para este resgate: o mesmo notwitch.redemption.resolveddele.
twitch.redemption.resolved
Um resgate na fila da recompensa foi aprovado ou rejeitado (rejeitado devolve os pontos).
user(texto): Quem fez, como aparece na plataforma.reward(texto): O título da recompensa.reward_id(texto): O id da Twitch para a recompensa, que continua o mesmo quando ela é renomeada.input(texto): O que a pessoa digitou, nas recompensas que pedem.status(texto):approved(aprovado) ourejected(rejeitado).redemption(texto): O id da Twitch para este resgate, como notwitch.redemptiondele.
twitch.hypetrain
Um hype train começou, andou ou terminou.
level(número): O nível atual.progress(número): Pontos dentro deste nível.goal(número): Pontos que este nível pede.ended(sim ou não): Se acabou de terminar.
Da Vovó e do OBS
button
O botão dela no pad foi apertado.
label(texto): O texto do botão.
hotkey
Um atalho global foi apertado, com o jogo na frente ou não. O gatilho diz a combinação com uma condição, keys é Ctrl+Alt+1, e o app escuta enquanto o perfil está no ar.
keys(texto): A combinação, comoCtrl+Alt+1.
timer
Um timer disparou. O gatilho diz de quanto em quanto tempo com uma condição, every é um número de segundos (5 ou mais); sem ela, dispara a cada minuto. Conta a partir de quando o gatilho aparece, e para durante o pânico.
every(número): O intervalo, em segundos.
control
Um dos controles da ação foi mudado no pad. O novo valor também fica em vovo.state, na chave do controle, então uma página aberta depois o mostra. Uma ação que oferece controles recebe isto sem precisar adicioná-lo como gatilho.
key(texto): A chave do controle, como a ação a declara.value(valor de controle): O novo valor: true ou false, uma opção, um número inteiro, ou uma linha de texto.
settings
O que foi escolhido das configurações da ação mudou, em Personalizar: vovo.settings, as variáveis --vovo-<chave> e os atributos data-vovo-<chave> já têm os novos valores. Uma ação que declara configurações recebe isto sem precisar adicioná-lo como gatilho.
key(texto): A chave da configuração, ou vazio quando todas voltaram a como a ação vem.
panel
Algo foi feito no painel da ação (panel no manifesto dela, mostrado em Painéis, na barra lateral): um botão apertado, um formulário enviado, ou um botão numa linha de uma lista. Como o control, uma ação com painel recebe isto sem adicioná-lo como gatilho; só quem opera a live o dispara.
name(texto): O nome do botão, do formulário ou do botão da linha, como o painel o declara.values(valor de controle): Os campos de um formulário, pelas chaves, cada um uma linha de texto; vazio num botão.item(valor de controle): Numa linha de lista, o item que ela mostra, como o estado o guarda.index(número): Numa linha de lista, o lugar dela na lista, a partir de 0; -1 nos outros casos.
webhook
Um webhook de entrada foi chamado.
hook(texto): O nome do webhook.data(dados): O que foi enviado, sem confiança: mostre só como texto.
obs.scene
O OBS trocou de cena.
scene(texto): A cena que está no ar agora.previous(texto): A cena de antes.
media.track
O que toca neste computador mudou: outra faixa, ou play e pausa. Vem de qualquer app que conta ao Windows o que está tocando (Spotify, um navegador, um player).
title(texto): O título da faixa.artist(texto): Quem toca.album(texto): O álbum, quando se sabe.playing(sim ou não): Verdadeiro enquanto toca; falso quando pausada ou parada.art(texto): O endereço da capa, para um<img src>; vazio quando não há.source(texto): O app em que toca.
audio.level
O volume do microfone, umas 20 vezes por segundo enquanto muda: para uma boca que mexe, um medidor, um brilho. A Vovó só escuta enquanto um overlay aberto mostra uma ação que espera isto; o som em si nunca sai do computador, só o volume.
level(número): O volume de 0 (silêncio) a 1 (o máximo), numa escala que segue o ouvido.peak(número): O momento mais alto desde o anterior, de 0 a 1.speaking(sim ou não): Verdadeiro enquanto há voz, mantido um instante nas pausas curtas.
screen.color
A cor da tela principal, algumas vezes por segundo enquanto muda: para um brilho ou uma moldura que acompanha o jogo. Lida só enquanto um overlay aberto mostra uma ação que espera isto; o overlay de tela da Vovó nunca entra.
color(texto): A cor média,#RRGGBB.vivid(texto): A cor que mais chama atenção na tela,#RRGGBB: a média puxa para o cinza, esta não.brightness(número): O quanto a tela está clara, de 0 (preto) a 1 (branco).
input.move
Como quem faz a live se move num jogo, até 60 vezes por segundo enquanto muda: o quanto a câmera girou, para onde anda e se pula. Para uma cena que balança com a câmera, inclina no strafe e afunda no pulo. Vem do mouse, das teclas de movimento (W, A, S e D pelo lugar no teclado, qualquer que seja o layout, ou as setas, e a barra de espaço) e do primeiro controle conectado (os analógicos e o botão A), sempre como uma direção, nunca como qual tecla. Lido só enquanto um overlay aberto mostra uma ação que espera isto, nada do resto do teclado, e as teclas não enquanto a janela da própria Vovó está na frente (o mouse e um controle sim, a não ser que o computador pause também). Um jogo aberto como administrador pode esconder a entrada dele da Vovó, que roda sem isso.
dx(número): O quanto a câmera girou para os lados desde a última vez, para a direita positivo: o movimento do próprio mouse, na contagem dele (não o lugar do ponteiro, que o jogo segura parado), com o analógico direito de um controle somando a ele.dy(número): O quanto girou para cima ou para baixo, para baixo positivo.walk(número): De -1 (para trás) a 1 (para frente): W ou S, ou as setas, dão 1 ou -1, o analógico esquerdo de um controle o tanto que é empurrado; 0 parado.strafe(número): De -1 (esquerda, A) a 1 (direita, D), do mesmo jeito.jump(sim ou não): Verdadeiro enquanto a barra de espaço, ou o A de um controle, está segurada.
speech.text
O que quem faz a live falou no microfone, escrito uma frase por vez, para legendas: pelo Whisper neste computador, ou pela OpenAI quando quem faz a live escolheu (Configurações > Voz, Fala em texto). O microfone só é lido enquanto um overlay aberto mostra uma ação ouvindo isto; cada frase chega quando a pausa dela termina, um ou dois segundos depois de dita, e nada é guardado.
text(texto): A frase, como texto.
screen.shared
Uma tela compartilhada entrou no ar ou saiu dele: uma tela, uma janela ou uma aba do navegador, a de quem faz a live (capturada pela própria Vovó, ou pela página de compartilhar dela no navegador), ou a de um convidado que quem faz a live pôs no ar. Uma ação que a posiciona (vovo.screen.place) a mostra. Chega de novo, com on ainda verdadeiro, quando outra coisa toma o lugar do que era compartilhado.
on(sim ou não): Verdadeiro enquanto algo está compartilhado.kind(texto): O que está compartilhado:screen,windowoutab(uma aba, só pela página de compartilhar); vazio quando nada está.audio(sim ou não): Verdadeiro quando o som vem junto.guest(texto): O convidado de quem é a tela, pelo nome que quem faz a live deu a ele; vazio para a de quem faz a live.
camera
Uma câmera que a ação posicionou (vovo.camera.place) começou a aparecer na página dela, ou parou: quem faz a live ligou ou desligou a câmera, o pânico a desligou, ela foi desconectada, ou outro programa está usando. Como settings, uma ação que posiciona uma câmera recebe isto sem adicionar como gatilho.
camera(texto): A chave da configuração de câmera que ela mostra, como a ação declara.on(sim ou não): true enquanto a imagem dela aparece.
persona.answer
A persona respondeu alguém, aprovada quando a aprovação está ligada. O app já manda no chat e fala, quando está configurado; uma ação mostra.
persona(texto): O nome da persona.user(texto): Quem fez, como aparece na plataforma.question(texto): O que perguntaram.answer(texto): A resposta dela.mood(texto): O que a resposta pede que a persona faça, de uma palavra entre colchetes no começo ou no fim ([dancing] ganhamos!), em minúsculas; vazio sem ela. A palavra sai da resposta, que chega ao chat e à fala sem ela, então a personalidade pode mandar a persona agir enquanto fala.
tts.spoken
O app leu algo em voz alta no ar: uma mensagem do chat que quem faz a live escolheu ler, ou o texto de uma recompensa, depois de aprovado. Ele mesmo fala, na voz de leitura (Configurações > Voz); uma ação mostra, ou dá à boca de um personagem o que fazer. Uma linha que a própria persona escreveu no chat vem com persona verdadeiro, e o app só a fala na voz da persona quando a persona está configurada para falar, então uma ação que dá voz à persona a diz no lugar dele.
user(texto): Quem fez, como aparece na plataforma.text(texto): O que foi lido.source(texto): De onde veio:chatoureward.persona(sim ou não): Verdadeiro quando a linha é da própria persona, escrita no chat pela conta dela.
music.request
Um viewer pediu uma música do player da Vovó, pela recompensa ou pelo comando no chat (Configurações > Música), e isto é o que aconteceu com o pedido: espera aprovação, entrou na fila, começou a tocar, foi descartado, ou foi recusado e por quê. A Vovó não escreve nada no chat; uma ação responde lá, ou mostra quem pediu o que toca.
user(texto): Quem fez, como aparece na plataforma.text(texto): O que a pessoa escreveu para pedir.song(texto): A música que ele achou, com título e artista; vazio quando não achou nenhuma.state(texto): O que aconteceu com ele:waiting,queued,playing,discardedourefused.why(texto): Por que foi recusado:none(nenhuma música bateu),many(várias bateram, iguais),busy(a pessoa já tem um esperando ou na fila),full(muitos esperando),queued(a música já está na fila) ouagain(tocou há pouco); vazio nos outros casos.source(texto): Como pediram:rewardouchat.
sound.played
Um botão de som do pad tocou o som dele, ou o que sorteou entre os sons dele.
label(texto): O nome do botão.button(número): O id do botão.file(texto): O nome do arquivo que tocou, qual entre vários quando o botão sorteia um.seconds(número): Quanto o arquivo dura, em segundos com um décimo; 0 quando a Vovó não soube dizer.
video.played
Um botão de vídeo do pad tocou o vídeo dele sobre o palco, ou o que sorteou entre os vídeos dele.
label(texto): O nome do botão.button(número): O id do botão.file(texto): O nome do arquivo que tocou, qual entre vários quando o botão sorteia um.seconds(número): Quanto o arquivo dura, em segundos com um décimo; 0 quando a Vovó não soube dizer.
remote.talk
Alguém falou no ar pelo celular, segurando o botão de falar como num walkie-talkie: a voz dele toca agora em todos os overlays da live, pela página da cena. Uma ação mostra quem está falando, enquanto fala.
name(texto): O celular, pelo nome que quem faz a live deu a ele ao parear.seconds(número): Quanto a voz dura, em segundos, até o décimo.
call.started
A chamada de voz que a ação pediu (vovo.call.start) está aberta: o modelo está lá, ouvindo silêncio, e o que ele diz ainda não toca, até o vovo.call.answer. Toda página que mostra a ação ouve isto, então cada uma toca o seu telefone e atende no mesmo passo.
seconds(número): O teto da chamada, em segundos, contado de quando ela foi pedida.
call.answered
A chamada foi atendida (vovo.call.answer, de qualquer página): o microfone chega ao modelo e a voz dele toca na live.
call.text
O que acabou de ser dito na chamada, por escrito, poucas palavras por vez e enquanto se fala: os dois lados podem se sobrepor. Para uma legenda ou uma transcrição; a voz quem toca é a página da cena.
who(texto):caller, quem faz a live ao microfone, oumodel.text(texto): As palavras, para juntar às anteriores como vieram.start(número): Quando começaram na chamada, em milissegundos.end(número): Quando terminaram, em milissegundos.
call.ended
A chamada acabou, ou nem abriu: a voz parou em todas as páginas.
reason(texto):hangup(a ação, ou o app),panic,limit(o teto),content(a moderação do modelo), ou qualquer outra coisa para uma chamada que caiu ou nem abriu.seconds(número): Quanto durou, desde que foi pedida.
overlay.connected
Uma página de overlay do perfil ativo conectou: o OBS carregou ou recarregou uma cena. As ações da própria página também ouvem, assim que carregam.
scene(texto): O nome da cena.pages(número): Quantas páginas mostram essa cena agora.
JavaScript
vovo.on: Chamalistenertoda vez que o evento acontece. A ação precisa ter o evento entre os gatilhos.vovo.show: Mostra o template marcadodata-name="name", com os{campos}preenchidos deecomo texto puro.vovo.emit: Avisa o app que algo aconteceu, como o fim de uma animação: as ações que têmnameentre os gatilhos recebem. Duas páginas mostrando a ação o emitem uma vez tratando o mesmo evento; uma chamada feita depois (quando a animação termina) diz a qual evento responde comevent, como emvovo.chat.send, e sem nenhum evento por trás o mesmo nome com os mesmos dados em 5 segundos é um evento só.vovo.say: Falatextem voz alta na live, com a voz do perfil ou a quevoiceindicar (parte do nome dela, um idioma comopt-BR, ou uma voz da pasta do Piper comopiper:pt_BR-faber-medium). Uma voz que este computador não consegue fazer (o Piper ou a voz dele faltando, sem chave da OpenAI) fala com a voz do perfil, e o console do app avisa.pitch(0,5 a 2) a deixa mais aguda ou mais grave no mesmo tempo,ring(0 a 1) dá uma aresta metálica esmalltira o peito dela: a voz de um personagem a partir de qualquer voz. O app faz a fala uma vez para as páginas que a pedem tratando o mesmo evento, e cada uma toca o mesmo arquivo;eventcomo emvovo.chat.send, e sem nenhum evento por trás o mesmo texto na mesma voz em 5 segundos é uma fala só. Resolve quando a fala termina.vovo.draw: Sorteia uma dasentries, todas com a mesma chance. Quem sorteia é o app, então o sorteio é justo, e a auditoria registra quem ganhou. Duas páginas mostrando a ação (o OBS e a janela de prévia) que sorteiam tratando o mesmo evento recebem a mesma resposta: um vencedor, um sorteio na auditoria.eventcomo emvovo.chat.send.vovo.chat.send: Escrevetextno chat da live pelo app: uma linha, até 500 caracteres, como quem faz a live, ou comas: "persona"pela conta própria da persona na Twitch (Integrações, na Twitch). Enquanto essa conta não está conectada, uma linha assim é recusada e nada é escrito como quem faz a live no lugar dela. Precisa da permissãochat.send, e o app controla o ritmo (20 linhas em 30 segundos, uma por segundo por ação, seja qual for a conta que as escreve); uma linha além disso, ou durante o pânico, fica de fora e a promise rejeita. Duas páginas mostrando a ação escrevem uma vez o que pedem tratando o mesmo evento; uma chamada feita depois que o ouvinte terminou (depois de umawait, num timer) diz a qual evento responde comevent, o próprio objeto que o ouvinte recebeu, ou o app não consegue distingui-la de uma segunda. Na prévia do editor nada é escrito: o editor mostra a linha.vovo.pad.play: Aperta um dos botões de som ou vídeo do pad, pelo rótulo (sem diferenciar maiúsculas), como um aperto nele faria: um resgate ou um comando de chat pode tocar um som que quem faz a live pôs no pad, e as ações que ouvemsound.playedficam sabendo. Só botões de som e de vídeo. Precisa da permissãopad.play; o pânico recusa, a auditoria diz que a ação apertou, e duas páginas tratando o mesmo evento apertam uma vez. A promise rejeita quando não existe botão com esse rótulo.eventcomo emvovo.chat.send. Na prévia do editor nada toca: o editor diz o que tocaria.vovo.pad.busy: Mostra um dos botões da própria ação (de ação ou de controle, pelo rótulo, sem diferenciar maiúsculas) em andamento no pad porseconds: o pé dele esvazia conforme o tempo passa, no computador e nos celulares, para quem opera a live saber que aquilo ainda está acontecendo, como o botão de um som enquanto toca. Comlock: true, apertá-lo não faz nada até lá, e o console diz por quê.0encerra na hora. Só aparece enquanto uma página mostra a ação, acaba com o pânico e dura 15 minutos no máximo; não precisa de permissão, porque não alcança botão nenhum além dos da ação. Na prévia do editor o pad não muda: o editor diz o que mudaria.vovo.pad.lock: Trava um dos botões da própria ação (pelo rótulo, como ovovo.pad.busy): esmaecido no pad e nos celulares, e apertá-lo não faz nada além de dizer isso no console, até a ação soltá-lo comfalse. É para um estado da ação, não para algo em andamento (um botão que não quer dizer nada enquanto a parte dele da cena está escondida), então nada esvazia: para o que dura um tempo,vovo.pad.busy. Só vale enquanto uma página mostra a ação, e o pânico solta; uma ação que recomeça diz de novo. Na prévia do editor o pad não muda: o editor diz o que mudaria.vovo.obs.source: Mostra (true) ou esconde (false) uma fonte numa cena do OBS, pelos nomes que o OBS dá a elas, sem diferenciar maiúsculas nem acentos; semon, inverte como está. Precisa da permissãoobs.toggle; o pânico recusa, a auditoria registra, e duas páginas tratando o mesmo evento pedem uma vez. A promise resolve assim que o OBS foi avisado; um nome que o OBS não tem é dito no console, com o que você quis dizer.eventcomo emvovo.chat.send, no lugar deonquando ele fica de fora. Na prévia do editor nada muda: o editor diz o que mudaria.vovo.obs.filter: Liga (true) ou desliga (false) um filtro de uma fonte do OBS, pelos nomes deles no OBS; semon, inverte como está. A mesma permissão e as mesmas regras dovovo.obs.source.vovo.chat.parts: A mensagem de um evento de chat como nós para pôr na página: as palavras como texto, nunca marcação, e os emotes como<img class="vovo-emote">, com o nome do emote emalt. Uma mensagem sem partes é o texto dela.vovo.webhook.send: Pede ao app que enviedata, como JSON (no máximo 16 KB), ao webhook do perfil chamadoname, cadastrado em Configurações > Webhooks. A ação nunca vê o endereço e nunca chega à rede. Precisa da permissãowebhook; o app controla o ritmo (30 por minuto, um por segundo por ação), envia uma vez só o que duas páginas pedem juntas, e não chama nada durante o pânico. A promise resolve quando o webhook responde 2xx e rejeita nos outros casos.eventcomo emvovo.chat.send. Na prévia do editor nada é enviado: o editor mostra o que seria.vovo.screen.place: Mostra a tela compartilhada ondeelementestá, por baixo do desenho da própria ação (então o elemento e o que está atrás dele precisam ser transparentes ali), e o acompanha quando ele se move;nulla tira.fitécontain(inteira, o padrão) oucover(preenchendo o lugar);radiusarredonda os cantos, em pixels;backgroundé uma cor (#000000) para o espaço quecontaindeixa em volta de uma imagem de outro formato, que sem ela fica transparente e mostra o que está atrás da cena. Precisa da permissãoscreen.show.vovo.camera.place: Mostra a câmera que quem faz a live escolheu numa das configurações de câmera da ação (camera, a chave dela; a primeira quando não for dada) ondeelementestá, por baixo do desenho da própria ação (então essa parte precisa ser transparente), e a acompanha quando ele se move;nulla tira.fitécover(preenchendo o lugar, o padrão) oucontain(inteira);radiusebackgroundcomo emvovo.screen.place;mirrormostra como um espelho mostraria. A câmera só é aberta enquanto alguma página a mostra, a câmera de quem faz a live está ligada e o pânico está desligado; o eventocameraavisa quando ela aparece. A ação nunca vê as imagens dela nem fica sabendo qual câmera é. Precisa da permissãocamera.show.vovo.media.play: Toca um clipe da Twitch, um vídeo da Twitch ou um vídeo do YouTube, pelo link, no player oficial, ondevovo.media.placeo pôs (no palco inteiro, senão), com o som; um mais novo toma o lugar dele. Uma ação que só quem opera dispara toca na hora; qualquer outra espera alguém aprovar, aqui ou de um celular com essa permissão, já que pode ter sido pedido por quem assiste. A promise resolve quando vai ao ar e rejeita quando é recusado, descartado ou pedido durante o pânico.secondso tira depois desse tempo: o player não sabe quando um clipe acaba;eventcomo emvovo.chat.send. Na prévia do editor ele toca lá, sem som. Precisa da permissãomedia.play.vovo.media.place: Onde o clipe ou vídeo toca: ondeelementestá, por baixo do desenho da própria ação (então o elemento e o que está atrás dele precisam ser transparentes ali), acompanhando-o quando ele se move;nullvolta ao palco inteiro. O player mantém o formato do vídeo dentro do lugar;radiusarredonda os cantos, em pixels.vovo.media.stop: Tira do palco o clipe ou vídeo da ação, em todas as páginas que a mostram.vovo.call.start: Começa uma chamada de voz com um modelo de IA, no ar: quem faz a live fala ao microfone, o modelo responde em voz alta, e a live ouve os dois. Quem abre é o app, com a chave da OpenAI de quem faz a live, e é ele que a mantém; as páginas só tocam a voz.instructionsé quem o modelo é e como fala;voice, uma das vozes do modelo;seconds, o teto da chamada (300 no máximo, que também é o padrão);backoffice, o que se responde a uma pergunta que o modelo passa "ao sistema";phonetoca a voz como por uma linha de telefone. A promise resolve quando a chamada está aberta, com o modelo ouvindo silêncio e ainda sem tocar (call.started); atenda comvovo.call.answer. Rejeita quando é recusada. Precisa da permissãocall, e só começa por algo que quem opera a live fez com a mão (um botão do pad, um atalho, um controle, o painel da ação) ou numa ação que é só de quem opera: a chamada é cobrada por segundo, leva o microfone ao modelo e põe no ar o que ele diz sem ninguém ler antes. Uma chamada por vez; o pânico desliga e recusa; a prévia do editor não faz nenhuma.eventcomo emvovo.chat.send.vovo.call.answer: Atende a chamada: daqui em diante o microfone chega ao modelo e a voz dele toca na live. Um modelo espera quem ligou falar; para ele falar primeiro,instructiondiz como atender,openingé com o que ele deve abrir, econtexto que ele deve saber sem dizer, mandados nessa ordem. Atendida por uma página, está atendida: atender de novo não faz nada.vovo.call.tell: Diz algo ao modelo durante a chamada, em uma linha:context(o padrão) é algo para saber sem dizer,instructionalgo para seguir,aloudalgo para dizer. Duas páginas tratando o mesmo evento dizem uma vez só;eventcomo emvovo.chat.send.vovo.call.end: Desliga a chamada: a voz para na hora em todas as páginas, e ocall.endedvem em seguida.vovo.state: Um objeto que sobrevive quando o overlay recarrega e quando o app reinicia. As chaves de primeiro nível são salvas assim que você as muda.vovo.settings: O que foi escolhido das configurações que a ação declara (settingsnoaction.json), por chave, ou cada uma como a ação vem: uma cor como#RRGGBB, um número, true ou false, uma opção, uma linha, o endereço de um arquivo (null para nenhum), a família de uma fonte, e para uma câmera true ou false, se alguma foi escolhida, nunca qual. Escolhidas em Personalizar, no computador, nunca pela ação; o eventosettingsavisa quando mudam.
Templates
{campo} dentro de um template é preenchido com aquele campo do evento, como texto puro.
data-on: Num<template>: o evento que o mostra, preenchido com os campos desse evento.data-name: Num<template>: o nome quevovo.showusa para mostrá-lo pelo JavaScript.data-seconds: Num<template>: quanto tempo fica antes de sair. Sem ele, fica.data-vovo-<key>: Na raiz do documento, para cada configuração de ligar ou desligar, de escolha ou de câmera:onouoff(uma câmera escolhida ou não), ou a opção escolhida, para seletores comohtml[data-vovo-side="Direita"] .chat.
CSS
--vovo-accent: A cor de destaque escolhida na Vovó.--vovo-<key>: Cada configuração da ação, como CSS: uma cor, um número com a unidade (34px), 1 ou 0 para ligado ou desligado ou para uma câmera escolhida ou não, uma opção, linha ou família de fonte entre aspas, um arquivo comourl(...)ounone.font-family: var(--vovo-font), sans-serif;
Permissões
A ação pede estas no manifesto, e quem a instala as aprova.
chat.send: Escrever no chat do canal, pelo app: como quem faz a live, ou pela conta própria da persona.media.play: Clipes e vídeos na live, nos players oficiais; o que não vem de quem opera espera aprovação.call: Chamadas de voz com um modelo de IA, no ar: começadas só por quem opera a live, pagas por segundo com a chave da OpenAI de quem faz a live; o microfone vai para o modelo, e o que ele diz é ouvido sem ninguém ler antes.screen.show: Mostrar na live o que quem faz a live compartilha pela página de compartilhar da Vovó.camera.show: Mostrar na live a câmera deste computador que quem faz a live escolheu para a ação em Personalizar, nunca as imagens dela para a ação.pad.play: Tocar os botões de som e de vídeo do pad, pelo rótulo.obs.toggle: Mostrar ou esconder fontes e ligar ou desligar filtros no OBS.webhook: Pedir ao app que chame um dos webhooks de saída do perfil.