Vovó API 1
Vovó의 코드에서 직접 생성하므로 항상 이 버전과 맞습니다. 시청자의 텍스트는 언제나 일반 텍스트로 오며, HTML이 되지 않습니다.
간단한 이벤트
모든 플랫폼에서 같으며, {platform}이 어느 플랫폼인지 알려 줍니다. 한 플랫폼에만 있는 것은 아래의 해당 플랫폼 이벤트를 쓰세요.
follow
누군가 채널을 팔로우했습니다. 원본 twitch.follow.
user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.platform(플랫폼): 어디서 일어났는지.
sub
누군가 구독, 재구독하거나 선물 구독을 받았습니다. 원본 twitch.sub.
user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.tier(숫자): 1, 2, 3 중 하나.months(숫자): 총 구독 개월 수.gift(예 또는 아니요): 선물인지 여부.platform(플랫폼): 어디서 일어났는지.
raid
다른 채널이 이 채널로 레이드했습니다. 원본 twitch.raid.
user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.viewers(숫자): 몇 명이 함께 왔는지.platform(플랫폼): 어디서 일어났는지.
chat
채팅의 메시지. 원본 twitch.chat.
user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.text(텍스트): 메시지, 일반 텍스트로.parts(텍스트와 이모트): 순서대로 나눈 메시지: 각 부분의text, 이모트라면 Vovó가 제공하는 그림image까지.vovo.chat.parts(e)로 보여 줄 노드를 만듭니다.platform(플랫폼): 어디서 일어났는지.
tip
누군가 돈이나 비트를 보냈습니다. 원본 twitch.cheer.
user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.amount(숫자): 얼마인지,currency단위로.currency(텍스트):bits, 또는BRL같은 통화 코드.text(텍스트): 메시지, 일반 텍스트로.platform(플랫폼): 어디서 일어났는지.
Twitch
twitch.follow
Twitch 팔로우.
user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.
twitch.sub
Twitch 구독, 재구독, 선물 구독.
user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.tier(숫자): 1, 2, 3 중 하나.months(숫자): 총 구독 개월 수.gift(예 또는 아니요): 선물인지 여부.gifter(텍스트): 선물이라면 누가 줬는지.text(텍스트): 메시지, 일반 텍스트로.
twitch.raid
Twitch 레이드.
user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.viewers(숫자): 몇 명이 함께 왔는지.
twitch.chat
Twitch 채팅 메시지.
user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.text(텍스트): 메시지, 일반 텍스트로.parts(텍스트와 이모트): 순서대로 나눈 메시지: 각 부분의text, 이모트라면 Vovó가 제공하는 그림image까지.vovo.chat.parts(e)로 보여 줄 노드를 만듭니다.color(텍스트): 이름 색,#RRGGBB.badges(텍스트): 배지, 쉼표로 구분:moderator,subscriber.persona(예 또는 아니요): 그 줄이 페르소나 자신의 것(페르소나 계정이 채팅에 쓴 것)이면 true.
twitch.viewers
방송을 보는 사람 수. 방송 중에는 대략 1분에 한 번 Twitch를 읽으며, 숫자가 바뀔 때, 그리고 방송이 끝나면 live가 false로 옵니다.
viewers(숫자): 지금 보는 사람 수.live(예 또는 아니요): 방송 중에는 true.
twitch.cheer
Twitch에서 보낸 비트.
user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.bits(숫자): 비트 수.text(텍스트): 메시지, 일반 텍스트로.
twitch.redemption
채널 포인트 보상이 교환되었습니다.
user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.reward(텍스트): 보상 제목.reward_id(텍스트): Twitch의 보상 id로, 이름을 바꿔도 그대로입니다.input(텍스트): 입력한 내용(텍스트를 요청하는 보상의 경우).redemption(텍스트): Twitch의 이 교환 id. 해당twitch.redemption.resolved와 같습니다.
twitch.redemption.resolved
보상 대기열에서 기다리던 교환이 승인되거나 거절되었습니다(거절하면 포인트가 돌아갑니다).
user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.reward(텍스트): 보상 제목.reward_id(텍스트): Twitch의 보상 id로, 이름을 바꿔도 그대로입니다.input(텍스트): 입력한 내용(텍스트를 요청하는 보상의 경우).status(텍스트):approved(승인) 또는rejected(거절).redemption(텍스트): Twitch의 이 교환 id. 해당twitch.redemption과 같습니다.
twitch.hypetrain
하이프 트레인이 시작, 진행 또는 종료되었습니다.
level(숫자): 현재 레벨.progress(숫자): 이 레벨에서 얻은 포인트.goal(숫자): 이 레벨에 필요한 포인트.ended(예 또는 아니요): 방금 끝났는지 여부.
Vovó와 OBS에서
button
패드의 버튼이 눌렸습니다.
label(텍스트): 버튼 라벨.
hotkey
전역 단축키가 눌렸습니다(게임이 앞에 있든 없든). 트리거는 조건으로 조합을 정하고(keys가 Ctrl+Alt+1), 프로필이 켜져 있는 동안 앱이 듣습니다.
keys(텍스트): 조합, 예:Ctrl+Alt+1.
timer
타이머가 작동했습니다. 트리거는 조건으로 간격을 정하며(every는 초 단위, 5 이상), 없으면 1분마다 작동합니다. 트리거가 나타난 때부터 세고, 패닉 중에는 멈춥니다.
every(숫자): 간격(초).
control
액션의 컨트롤 하나가 패드에서 바뀌었습니다. 새 값은 컨트롤의 키로 vovo.state에도 들어가므로, 나중에 연 페이지도 보여 줍니다. 컨트롤을 제공하는 액션은 트리거로 추가하지 않아도 이것을 받습니다.
key(텍스트): 컨트롤의 키, 액션이 선언한 대로.value(컨트롤 값): 새 값: true 또는 false, 옵션, 정수, 텍스트 한 줄.
settings
꾸미기에서 액션 설정의 선택이 바뀌었습니다. vovo.settings, --vovo-<key> 변수, data-vovo-<key> 속성에 이미 새 값이 들어 있습니다. 설정을 선언한 액션은 트리거로 추가하지 않아도 이것을 받습니다.
key(텍스트): 설정의 키. 모두 액션 기본값으로 돌아갔으면 비어 있음.
panel
액션 패널(매니페스트의 panel, 사이드바의 패널에 표시)에서 무언가 했습니다: 버튼을 누름, 양식을 보냄, 목록 줄의 버튼을 누름. control처럼 패널이 있는 액션은 트리거로 추가하지 않아도 받으며, 방송 운영자만 일으킬 수 있습니다.
name(텍스트): 버튼, 양식, 또는 줄 버튼의 이름, 패널이 선언한 대로.values(컨트롤 값): 양식의 필드, 키별로 각각 텍스트 한 줄. 버튼이면 비어 있음.item(컨트롤 값): 목록 줄이면, 그 줄이 보여 주는 항목(상태에 저장된 그대로).index(숫자): 목록 줄이면 목록에서의 위치(0부터), 아니면 -1.
webhook
수신 웹훅이 호출되었습니다.
hook(텍스트): 웹훅 이름.data(데이터): 보내온 내용, 신뢰할 수 없음: 텍스트로만 보여 주세요.
obs.scene
OBS가 장면을 전환했습니다.
scene(텍스트): 지금 방송 중인 장면.previous(텍스트): 이전 장면.
media.track
이 컴퓨터에서 재생 중인 것이 바뀌었습니다: 다른 곡, 또는 재생과 일시 정지. Windows에 재생 정보를 알려 주는 앱(Spotify, 브라우저, 플레이어)에서 옵니다.
title(텍스트): 곡 제목.artist(텍스트): 아티스트.album(텍스트): 앨범(알 수 있으면).playing(예 또는 아니요): 재생 중이면 true, 일시 정지나 정지면 false.art(텍스트): 커버 주소(<img src>용). 없으면 비어 있음.source(텍스트): 재생 중인 앱.
audio.level
마이크 음량. 바뀌는 동안 초당 약 20번 옵니다(움직이는 입, 미터, 빛 등에). Vovó는 이것을 기다리는 액션을 열린 오버레이가 보여 줄 때만 듣습니다. 소리 자체는 컴퓨터를 떠나지 않고, 음량만 전달됩니다.
level(숫자): 음량, 0(무음)부터 1(최대)까지, 귀에 맞춘 척도.peak(숫자): 지난번 이후 가장 컸던 순간, 0~1.speaking(예 또는 아니요): 목소리가 있는 동안 true, 짧은 쉼에도 잠시 유지됩니다.
screen.color
주 화면의 색. 바뀌는 동안 초당 몇 번 옵니다(게임을 따라가는 빛이나 테두리에). 이것을 기다리는 액션을 열린 오버레이가 보여 줄 때만 읽으며, Vovó의 화면 오버레이는 절대 들어가지 않습니다.
color(텍스트): 평균 색,#RRGGBB.vivid(텍스트): 화면에서 가장 눈에 띄는 색,#RRGGBB. 평균은 회색에 가깝지만 이것은 아닙니다.brightness(숫자): 화면 밝기, 0(검정)~1(흰색).
input.move
스트리머가 게임에서 움직이는 방식. 바뀌는 동안 초당 최대 60번 옵니다: 카메라가 얼마나 돌았는지, 어디로 걷는지, 점프하는지. 카메라를 따라 흔들리고, 옆으로 이동할 때 기울고, 점프할 때 내려앉는 장면에. 마우스, 이동 키(W, A, S, D는 자판 배열과 상관없이 위치로, 또는 화살표 키, 스페이스 바), 처음 연결된 컨트롤러(스틱과 A 버튼)에서 오며, 언제나 방향으로만 전달되고 어떤 키인지는 전달되지 않습니다. 이것을 기다리는 액션을 열린 오버레이가 보여 줄 때만 읽고, 키보드의 나머지는 읽지 않으며, Vovó 창이 앞에 있으면 키는 읽지 않습니다(마우스와 컨트롤러는 읽습니다. 이 컴퓨터에서 그것도 멈추게 하지 않았다면). 관리자 권한으로 실행한 게임은 관리자 권한 없이 실행되는 Vovó에게서 입력을 숨길 수 있습니다.
dx(숫자): 지난번 이후 카메라가 옆으로 얼마나 돌았는지, 오른쪽이 양수: 마우스 자체의 움직임(게임이 붙잡아 두는 포인터 위치가 아님)을 그 카운트로 나타내며, 컨트롤러의 오른쪽 스틱도 더해집니다.dy(숫자): 위아래로 얼마나 돌았는지, 아래가 양수.walk(숫자): -1(뒤)부터 1(앞)까지: W나 S, 화살표 키는 1 또는 -1, 컨트롤러 왼쪽 스틱은 민 만큼; 서 있으면 0.strafe(숫자): -1(왼쪽, A)부터 1(오른쪽, D)까지, 같은 방식.jump(예 또는 아니요): 스페이스 바나 컨트롤러의 A를 누르고 있는 동안 true.
speech.text
스트리머가 마이크에 한 말을 자막용으로 한 문장씩 받아쓴 것: 이 컴퓨터의 Whisper가, 또는 스트리머가 골랐다면 OpenAI가 받아씁니다(설정 > 음성, 음성을 텍스트로). 이것을 듣는 액션을 열린 오버레이가 보여 줄 때만 마이크를 읽으며, 각 문장은 쉼이 끝날 때, 말한 지 1~2초 뒤에 오고, 아무것도 보관하지 않습니다.
text(텍스트): 문장, 텍스트로.
screen.shared
공유 화면이 방송에 나갔거나 내려갔습니다: 화면, 창, 브라우저 탭. 스트리머 자신의 것(Vovó가 직접 캡처했거나, 브라우저의 공유 페이지에서 공유한 것)이거나, 스트리머가 방송에 올린 게스트의 것. 그것을 놓는 액션(vovo.screen.place)이 보여 줍니다. 공유하던 것을 다른 것이 대신하면 on이 참인 채로 다시 옵니다.
on(예 또는 아니요): 무언가 공유 중이면 true.kind(텍스트): 공유 중인 것:screen,window,tab(탭은 공유 페이지에서만). 없으면 비어 있음.audio(예 또는 아니요): 소리도 함께 오면 true.guest(텍스트): 화면 주인인 게스트, 스트리머가 붙인 이름으로. 스트리머 본인 화면이면 비어 있음.
camera
액션이 놓은 카메라(vovo.camera.place)가 그 페이지에 보이기 시작했거나 사라졌습니다. 스트리머가 카메라를 켜거나 껐거나, 패닉이 껐거나, 연결이 빠졌거나, 다른 프로그램이 사용 중입니다. settings처럼, 카메라를 놓는 액션은 트리거로 추가하지 않아도 이것을 받습니다.
camera(텍스트): 보여 주는 카메라 설정의 키(액션이 선언한 그대로).on(예 또는 아니요): 화면이 보이는 동안 true.
persona.answer
페르소나가 누군가에게 답했습니다(승인이 켜져 있으면 승인된 답). 앱이 설정대로 채팅에 보내고 말하며, 액션은 보여 줍니다.
persona(텍스트): 페르소나 이름.user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.question(텍스트): 질문한 내용.answer(텍스트): 답변.mood(텍스트): 답변 처음이나 끝의 대괄호 속 단어([dancing] 이겼다!)에서 가져온, 페르소나에게 시키는 동작(소문자). 없으면 비어 있음. 이 단어는 답변에서 빠져 채팅과 음성에는 나오지 않으므로, 성격 설정에서 말하면서 할 동작을 시킬 수 있습니다.
tts.spoken
앱이 방송에서 소리 내어 읽었습니다: 방송 운영자가 읽기로 고른 채팅 메시지, 또는 승인된 보상 텍스트. 앱이 읽기용 음성(설정 > 음성)으로 직접 말하며, 액션은 보여 주거나 캐릭터의 입을 움직입니다. 페르소나가 직접 채팅에 쓴 줄은 persona가 true로 오고, 앱은 페르소나가 말하도록 설정되어 있을 때만 페르소나 음성으로 읽으므로, 페르소나에 목소리를 입히는 액션이 대신 말합니다.
user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.text(텍스트): 읽은 내용.source(텍스트): 어디서 왔는지:chat또는reward.persona(예 또는 아니요): 그 줄이 페르소나 자신의 것(페르소나 계정이 채팅에 쓴 것)이면 true.
music.request
시청자가 보상이나 채팅 명령어(설정 > 음악)로 Vovó 음악 플레이어에 곡을 신청했고, 그 결과를 알립니다: 승인 대기, 대기열 추가, 재생 시작, 버려짐, 또는 받지 않았음과 그 이유. Vovó는 채팅에 아무것도 쓰지 않습니다. 액션이 거기서 답하거나, 재생 중인 곡을 누가 신청했는지 보여줍니다.
user(텍스트): 누가 했는지, 플랫폼에 보이는 대로.text(텍스트): 신청하려고 쓴 내용.song(텍스트): 찾은 곡, 제목과 아티스트. 찾지 못하면 비어 있습니다.state(텍스트): 결과:waiting,queued,playing,discarded또는refused.why(텍스트): 받지 않은 이유:none(맞는 곡 없음),many(여러 곡이 똑같이 맞음),busy(이미 대기 중이거나 대기열에 한 곡이 있음),full(대기가 너무 많음),queued(그 곡은 이미 대기열에 있음),again(최근에 나왔음). 그 밖에는 비어 있습니다.source(텍스트): 신청 방법:reward또는chat.
sound.played
패드의 소리 버튼이 소리를, 또는 여러 소리 중 뽑은 것을 재생했습니다.
label(텍스트): 버튼 이름.button(숫자): 버튼 id.file(텍스트): 재생한 파일 이름(버튼이 하나를 뽑으면 어느 것인지).seconds(숫자): 파일 길이(초, 소수 첫째 자리까지). Vovó가 알 수 없으면 0.
video.played
패드의 동영상 버튼이 무대 위에 동영상을, 또는 여러 동영상 중 뽑은 것을 재생했습니다.
label(텍스트): 버튼 이름.button(숫자): 버튼 id.file(텍스트): 재생한 파일 이름(버튼이 하나를 뽑으면 어느 것인지).seconds(숫자): 파일 길이(초, 소수 첫째 자리까지). Vovó가 알 수 없으면 0.
remote.talk
누군가 휴대폰에서 무전기처럼 말하기 버튼을 누르고 방송에 말했습니다. 그 목소리가 지금 장면 페이지에서 방송의 모든 오버레이로 재생됩니다. 액션은 말하는 동안 누가 말하는지 보여 줍니다.
name(텍스트): 휴대폰, 스트리머가 페어링할 때 붙인 이름으로.seconds(숫자): 목소리 길이(초, 소수 첫째 자리까지).
call.started
액션이 요청한 음성 통화(vovo.call.start)가 열렸습니다. 모델은 연결되어 무음을 듣고 있고, vovo.call.answer 전까지 모델의 말은 재생되지 않습니다. 액션을 보여 주는 모든 페이지가 이것을 받으므로, 각 페이지가 전화를 울리고 함께 받을 수 있습니다.
seconds(숫자): 통화 한도(초), 요청한 때부터 셉니다.
call.answered
통화를 받았습니다(vovo.call.answer, 어느 페이지에서든). 마이크가 모델에 닿고 모델의 목소리가 방송에 나갑니다.
call.text
통화에서 방금 한 말을 말하는 대로 몇 단어씩 받아쓴 것. 양쪽이 겹칠 수 있습니다. 자막이나 기록용이며, 목소리 자체는 장면 페이지가 재생합니다.
who(텍스트):caller(마이크 앞의 방송 운영자) 또는model.text(텍스트): 단어들, 온 순서대로 앞의 것에 이어 붙입니다.start(숫자): 통화에서 시작한 시점(밀리초).end(숫자): 끝난 시점(밀리초).
call.ended
통화가 끝났거나 열리지 않았습니다. 모든 페이지에서 목소리가 멈췄습니다.
reason(텍스트):hangup(액션 또는 앱),panic,limit(한도),content(모델 검열), 그 밖의 값은 끊어졌거나 열리지 않은 통화.seconds(숫자): 요청한 때부터 얼마나 이어졌는지.
overlay.connected
활성 프로필의 오버레이 페이지가 연결되었습니다: OBS가 장면을 불러오거나 다시 불러왔습니다. 페이지의 액션도 불러온 뒤 받습니다.
scene(텍스트): 장면 이름.pages(숫자): 지금 그 장면을 보여 주는 페이지 수.
JavaScript
vovo.on: 이벤트가 일어날 때마다listener를 호출합니다. 액션의 트리거에 그 이벤트가 있어야 합니다.vovo.show:data-name="name"로 표시한 템플릿을 보여 주며,{fields}를e의 값으로 일반 텍스트로 채웁니다.vovo.emit: 애니메이션이 끝나는 등 무언가 일어났다고 앱에 알립니다. 트리거에name이 있는 액션이 받습니다. 액션을 보여 주는 두 페이지가 같은 이벤트를 처리하면서 내보내도 한 번만 나갑니다. 나중에 하는 호출(애니메이션이 끝날 때)은vovo.chat.send처럼event로 응답하는 이벤트를 밝히고, 뒤에 이벤트가 없으면 5초 안의 같은 이름과 같은 데이터는 하나의 이벤트입니다.vovo.say: 방송에서text를 소리 내어 말합니다. 프로필 음성 또는voice로 지정한 음성(이름의 일부,pt-BR같은 언어,piper:pt_BR-faber-medium처럼 Piper 폴더의 음성)으로 말합니다. 이 컴퓨터가 만들 수 없는 음성(Piper나 그 음성이 없거나 OpenAI 키가 없음)은 대신 프로필 음성으로 말하고, 앱 콘솔이 알려 줍니다.pitch(0.5~2)는 길이를 유지한 채 높이거나 낮추고,ring(0~1)은 금속성 울림을 더하며,small은 가슴 울림을 뺍니다. 어떤 음성으로든 캐릭터 목소리를 만들 수 있습니다. 앱은 같은 이벤트를 처리하면서 요청한 페이지들에 대해 음성을 한 번만 만들고, 각 페이지는 같은 파일을 재생합니다.event는vovo.chat.send와 같고, 뒤에 이벤트가 없으면 5초 안의 같은 텍스트와 같은 음성은 한 번만 만듭니다. 말이 끝나면 완료됩니다.vovo.draw:entries중 하나를 모두 같은 확률로 뽑습니다. 앱이 뽑으므로 추첨은 공정하고, 작업 기록에 당첨자가 남습니다. 액션을 보여 주는 두 페이지(OBS와 미리 보기 창)가 같은 이벤트를 처리하며 뽑으면 같은 답을 받습니다: 당첨자 한 명, 작업 기록에 추첨 한 번.event는vovo.chat.send와 같습니다.vovo.chat.send: 앱을 통해 방송 채팅에text를 씁니다(한 줄, 최대 500자). 스트리머로 쓰거나,as: "persona"로 페르소나 자신의 Twitch 계정(연동, Twitch 아래)을 통해 씁니다. 그 계정이 연결되어 있지 않은 동안에는 그런 줄이 거부되고, 대신 스트리머로 쓰지도 않습니다.chat.send권한이 필요하고, 앱이 속도를 지킵니다(30초에 20줄, 액션당 1초에 한 줄, 어느 계정이 쓰든 같습니다). 이를 넘는 줄이나 패닉 중의 줄은 빠지고 promise가 거부됩니다. 액션을 보여 주는 두 페이지가 한 이벤트를 처리하며 요청한 것은 한 번만 씁니다. 리스너가 돌아온 뒤(await이후, 타이머 안)의 호출은 답하는 이벤트를event로 알려야 합니다(리스너가 받은 바로 그 객체). 그렇지 않으면 앱이 두 번째 호출과 구별할 수 없습니다. 편집기 미리 보기에서는 아무것도 쓰지 않고, 편집기가 그 줄을 보여 줍니다.vovo.pad.play: 패드의 소리나 동영상 버튼을 라벨로(대소문자 구분 없이) 누릅니다. 실제로 누른 것과 같습니다: 보상이나 채팅 명령으로 스트리머가 패드에 둔 소리를 재생할 수 있고,sound.played를 듣는 액션도 받습니다. 소리와 동영상 버튼만 됩니다.pad.play권한이 필요하며, 패닉 중에는 거부하고, 작업 기록에는 액션이 눌렀다고 남으며, 같은 이벤트를 처리하는 두 페이지도 한 번만 누릅니다. 그런 버튼이 없으면 promise가 거부됩니다.event는vovo.chat.send와 같습니다. 편집기 미리 보기에서는 아무것도 재생하지 않고, 무엇이 재생될지 편집기가 알려 줍니다.vovo.pad.busy: 이 액션 자신의 버튼(액션 또는 컨트롤 버튼, 라벨로, 대소문자 구분 없이)을seconds동안 패드에서 진행 중으로 보여 줍니다. 시간이 지남에 따라 버튼 아랫부분이 줄어들며, 컴퓨터와 휴대폰 모두에서 보이므로 방송 운영자가 아직 진행 중임을 알 수 있습니다(재생 중인 소리 버튼처럼).lock: true면 그때까지 눌러도 아무 일도 없고, 콘솔이 이유를 알려 줍니다.0이면 바로 끝납니다. 액션을 보여 주는 페이지가 있을 때만 보이고, 패닉으로 끝나며, 최대 15분입니다. 액션 자신의 버튼에만 닿으므로 권한이 필요 없습니다. 편집기 미리 보기에서는 패드가 바뀌지 않고, 어떻게 바뀔지 편집기가 알려 줍니다.vovo.pad.lock: 이 액션 자신의 버튼을 (vovo.pad.busy처럼 라벨로) 잠급니다. 패드와 휴대폰에서 흐리게 보이고, 눌러도 콘솔에 알릴 뿐 아무 일도 없으며, 액션이false로 풀 때까지 이어집니다. 진행 중인 일이 아니라 액션의 상태를 위한 것이라(장면의 해당 부분이 숨겨진 동안 의미 없는 버튼 등) 줄어드는 표시는 없습니다. 한동안 이어지는 일에는vovo.pad.busy를 쓰세요. 액션을 보여 주는 페이지가 있을 때만 잠기고, 패닉이면 풀립니다. 액션이 다시 시작하면 다시 알려야 합니다. 편집기 미리 보기에서는 패드가 바뀌지 않고, 어떻게 바뀔지 편집기가 알려 줍니다.vovo.obs.source: OBS 장면의 소스를 OBS에서의 이름으로(대소문자와 악센트 구분 없이) 표시(true)하거나 숨깁니다(false).on이 없으면 지금 상태를 전환합니다.obs.toggle권한이 필요하며, 패닉 중에는 거부하고, 작업 기록에 남으며, 같은 이벤트를 처리하는 두 페이지도 한 번만 요청합니다. OBS에 요청하는 즉시 promise가 완료됩니다. OBS에 없는 이름은 의도한 이름과 함께 콘솔에 알립니다.event는vovo.chat.send와 같으며,on을 생략하면 그 자리에 둡니다. 편집기 미리 보기에서는 아무것도 바뀌지 않고, 어떻게 바뀔지 편집기가 알려 줍니다.vovo.obs.filter: OBS 소스의 필터를 OBS에서의 이름으로 켜거나(true) 끕니다(false).on이 없으면 지금 상태를 전환합니다. 권한과 규칙은vovo.obs.source와 같습니다.vovo.chat.parts: 채팅 이벤트의 메시지를 페이지에 넣을 노드로 만듭니다. 단어는 텍스트로(마크업은 절대 아님), 이모트는<img class="vovo-emote">로, 이모트 이름은alt에 들어갑니다. 부분이 없는 메시지는 그 텍스트입니다.vovo.webhook.send: 앱에data를 JSON(최대 16KB)으로, 프로필의 웹훅name(설정 > 웹훅에서 설정)에 보내 달라고 요청합니다. 액션은 주소를 보지 못하고 네트워크에 닿지도 않습니다.webhook권한이 필요하며, 앱이 속도를 지키고(분당 30회, 액션당 1초에 1회), 두 페이지가 함께 요청한 것은 한 번만 보내며, 패닉 중에는 아무것도 호출하지 않습니다. 웹훅이 2xx로 답하면 promise가 완료되고, 아니면 거부됩니다.event는vovo.chat.send와 같습니다. 편집기 미리 보기에서는 아무것도 보내지 않고, 보낼 내용을 편집기가 보여 줍니다.vovo.screen.place:element가 있는 곳에, 액션 자체 그림 아래에 공유 화면을 보여 주며(그러니 그 자리의 요소와 그 뒤는 투명해야 합니다), 요소가 움직이면 따라갑니다.null이면 없앱니다.fit은contain(전체, 기본값) 또는cover(자리를 채움),radius는 모서리 둥글기(픽셀)입니다.background는 모양이 다른 화면 둘레에contain이 남기는 빈 곳을 칠하는 색(#000000)이며, 지정하지 않으면 그곳은 투명하게 남아 장면 뒤에 있는 것이 보입니다.screen.show권한이 필요합니다.vovo.camera.place: 스트리머가 액션의 카메라 설정 중 하나에서 고른 카메라(camera는 그 키, 없으면 첫 번째)를element가 있는 곳에, 액션 자체 그림 아래에 보여 주며(그러니 그 부분은 투명해야 합니다), 요소가 움직이면 따라갑니다.null이면 없앱니다.fit은cover(자리를 채움, 기본값) 또는contain(전체),radius와background는vovo.screen.place와 같고,mirror는 거울처럼 보여 줍니다. 카메라는 어떤 페이지가 보여 주고, 스트리머의 카메라가 켜져 있고, 패닉이 꺼져 있는 동안만 열립니다. 보이는지는camera이벤트가 알려 줍니다. 액션은 화면을 볼 수도, 어떤 카메라인지 알 수도 없습니다.camera.show권한이 필요합니다.vovo.media.play: Twitch 클립, Twitch 동영상, YouTube 동영상을 링크로 공식 플레이어에서,vovo.media.place로 놓은 곳(없으면 무대 전체)에 소리와 함께 재생합니다. 더 새것이 오면 자리를 넘깁니다. 방송 운영자만 일으키는 액션은 바로 재생하고, 그 밖의 액션은 시청자가 요청했을 수도 있으므로 여기나 권한 있는 휴대폰에서 누군가 승인할 때까지 기다립니다. 방송에 나가면 promise가 완료되고, 거절·버림·패닉 중 요청이면 거부됩니다.seconds는 그 시간 뒤에 없앱니다(플레이어는 클립이 언제 끝나는지 모릅니다).event는vovo.chat.send와 같습니다. 편집기 미리 보기에서는 그 자리에서 소리 없이 재생합니다.media.play권한이 필요합니다.vovo.media.place: 클립이나 동영상이 재생되는 곳:element가 있는 곳, 액션 자체 그림 아래(그러니 그 자리의 요소와 그 뒤는 투명해야 합니다)이며, 요소가 움직이면 따라갑니다.null이면 다시 무대 전체입니다. 플레이어는 그 자리 안에서 동영상 비율을 유지하고,radius는 모서리 둥글기(픽셀)입니다.vovo.media.stop: 액션을 보여 주는 모든 페이지에서 액션의 클립이나 동영상을 무대에서 내립니다.vovo.call.start: 방송에서 AI 모델과 음성 통화를 시작합니다. 방송 운영자가 마이크에 말하고, 모델이 소리 내어 답하며, 방송에는 둘 다 나갑니다. 앱이 스트리머의 OpenAI 키로 통화를 열고 유지하며, 페이지는 목소리만 재생합니다.instructions는 모델이 누구이고 어떻게 말하는지,voice는 모델 음성 중 하나,seconds는 통화 한도(최대 300, 기본값도 300),backoffice는 모델이 "시스템에" 넘긴 질문에 대한 답,phone은 목소리를 전화선처럼 재생합니다. 통화가 열려 모델이 무음을 듣고 아직 재생되지 않을 때(call.started) promise가 완료됩니다.vovo.call.answer로 받으세요. 거부되면 promise도 거부됩니다.call권한이 필요하며, 방송 운영자가 손으로 한 일(패드 버튼, 단축키, 컨트롤, 액션 패널)이나 운영자 전용 액션에서만 시작됩니다. 통화는 초 단위로 요금이 들고, 마이크를 모델에 넘기며, 모델이 한 말을 아무도 읽지 않은 채 방송에 내보내기 때문입니다. 한 번에 한 통화, 패닉은 끊고 거부하며, 편집기 미리 보기는 통화하지 않습니다.event는vovo.chat.send와 같습니다.vovo.call.answer: 통화를 받습니다. 이제부터 마이크가 모델에 닿고 모델의 목소리가 방송에 나갑니다. 모델은 건 사람이 먼저 말하기를 기다리므로, 먼저 말하게 하려면instruction으로 받는 방법을,opening으로 첫마디를,context로 알되 말하지 않을 것을 이 순서대로 보냅니다. 한 페이지에서 받으면 받은 것이며, 다시 받아도 아무 일도 없습니다.vovo.call.tell: 통화 중에 모델에게 한 줄로 알립니다.context(기본값)는 알되 말하지 않을 것,instruction은 따를 것,aloud는 말할 것입니다. 같은 이벤트를 처리하는 두 페이지도 한 번만 알립니다.event는vovo.chat.send와 같습니다.vovo.call.end: 통화를 끊습니다. 모든 페이지에서 목소리가 바로 멈추고, 이어서call.ended가 옵니다.vovo.state: 오버레이를 다시 불러오거나 앱을 다시 시작해도 남는 객체. 최상위 키는 설정하는 즉시 저장됩니다.vovo.settings: 액션이 선언한 설정(action.json의settings)에서 고른 값을 키별로, 고르지 않은 것은 액션 기본값으로: 색은#RRGGBB, 숫자, true 또는 false, 옵션, 한 줄, 파일 주소(없으면 null), 글꼴 패밀리, 카메라는 골랐는지를 true 또는 false로(어떤 것인지는 알리지 않습니다). 컴퓨터의 꾸미기에서 고르며, 액션이 고르지는 않습니다. 바뀌면settings이벤트가 알려 줍니다.
템플릿
템플릿 안의 {field}는 이벤트의 그 필드로 일반 텍스트로 채워집니다.
data-on:<template>에 붙임: 그것을 보여 줄 이벤트, 그 이벤트의 필드로 채워집니다.data-name:<template>에 붙임: JavaScript에서vovo.show로 보여 줄 때 쓰는 이름.data-seconds:<template>에 붙임: 사라지기 전까지 머무는 시간. 없으면 계속 남습니다.data-vovo-<key>: 문서 루트에 붙습니다. 켜기/끄기, 선택, 카메라 설정마다on또는off(카메라를 골랐는지), 또는 고른 옵션이 들어가며,html[data-vovo-side="오른쪽"] .chat같은 선택자에 씁니다.
CSS
--vovo-accent: Vovó에서 고른 강조 색.--vovo-<key>: 액션의 각 설정을 CSS로: 색, 단위가 붙은 숫자(34px), 켜짐/꺼짐이나 카메라를 골랐는지는 1 또는 0, 따옴표로 감싼 옵션·한 줄·글꼴 패밀리, 파일은url(...)또는none.font-family: var(--vovo-font), sans-serif;
권한
액션은 매니페스트에서 이것을 요청하고, 설치하는 사람이 승인합니다.
chat.send: 앱을 통해 채널 채팅에 쓰기: 스트리머로, 또는 페르소나 자신의 계정으로.media.play: 공식 플레이어로 방송에 클립과 동영상 재생. 방송 운영자가 요청하지 않은 것은 승인을 기다림.call: 방송에서 AI 모델과 음성 통화: 방송 운영자만 시작할 수 있고, 스트리머의 OpenAI 키로 초 단위로 요금이 듭니다. 마이크는 모델로 가고, 모델의 말은 아무도 읽지 않은 채 들립니다.screen.show: 스트리머가 Vovó 공유 페이지에서 공유하는 것을 방송에 보여 주기.camera.show: 스트리머가 꾸미기에서 액션용으로 고른 이 컴퓨터의 카메라를 방송에 보여 주기. 화면을 액션에 넘기지는 않습니다.pad.play: 패드의 소리와 동영상 버튼을 라벨로 재생하기.obs.toggle: OBS에서 소스를 표시하거나 숨기고, 필터를 켜거나 끄기.webhook: 앱에 프로필의 발신 웹훅 중 하나를 호출하도록 요청하기.