action.json 与 pad.json
Vovó 从文件夹或 zip 读取的两个文件的每个键,由 Vovó 自己的代码生成,因此始终与这个版本一致。Vovó 会在每个文件进来时检查它,并用一句话说明哪里不对而拒绝它;它不认识的键会被悄悄跳过,读取 schema 的编辑器会给它画下划线。
键由小写字母、数字和 _ 组成,名称还可以有 -,各自最多 32 个字符。
要让编辑器补全键并标出错误,请像示例那样在文件开头写明 schema。vovo dev 会把 action.schema.json 写在动作各部分旁边;Vovó 的源代码在 api 文件夹里有这两个文件。
action.json
动作的清单:它叫什么、听哪些事件、请求什么,以及为操控直播的人提供什么。它与 index.html、style.css、script.js 和 files/ 放在一起,位于包或文件夹中。
{
"$schema": "./action.schema.json",
"name": "Raffle",
"id": "example.raffle",
"version": "1.2.0",
"api": 1,
"author": "A maker",
"site": "https://example.com/raffle",
"description": "!join in chat joins the wheel; the panel draws the winner.",
"license": "MIT",
"triggers": ["chat", "timer"],
"bindings": [
{ "event": "chat", "filter": [{ "field": "text", "op": "starts", "value": "!join" }] },
{ "event": "timer", "filter": [{ "field": "every", "op": "is", "value": 300 }] }
],
"permissions": ["chat.send"],
"controls": [
{ "key": "open", "label": "Entries open", "kind": "toggle" },
{ "key": "prize", "label": "Prize", "kind": "text" }
],
"settings": [
{ "key": "color", "label": "Wheel colour", "kind": "color", "default": "#840926" },
{ "key": "size", "label": "Size", "kind": "number", "min": 200, "max": 800, "step": 10, "unit": "px", "default": 420 },
{ "key": "side", "label": "Side", "kind": "choice", "options": ["Left", "Right"], "default": "Right" }
],
"panel": [
{ "kind": "control", "key": "open" },
{ "kind": "control", "key": "prize" },
{ "kind": "form", "name": "add", "label": "Put someone in", "button": "Put", "fields": [{ "key": "who", "label": "Name" }] },
{ "kind": "button", "name": "draw", "label": "Draw", "confirm": true },
{ "kind": "list", "key": "names", "label": "In the wheel", "empty": "Nobody yet", "buttons": [{ "name": "out", "label": "Take out", "confirm": true }] }
]
}
$schema(文本): 编辑器在哪里找到此文件的 schema:./action.schema.json,由vovo dev写在它旁边。Vovó 不读取这里的任何内容。name(文本; 必填): 它的名称,在配置文件中唯一:导入的动作若与已有动作同名,会提出取代它,否则以“Raffle 2”加入。id(文本,单行, 最多 64 个字符): 制作者只给它起一次、之后不再更改的名称:制作者的名称和动作的名称,中间用点隔开,例如example.raffle,只用小写字母、数字和-。导入较新的版本时,会凭它找到要更新的动作,不管那个动作当时叫什么;没有它时按名称查找。在 Vovó 里创建的副本不保留它。version(文本,单行, 最多 32 个字符): 它自己的版本,显示在动作列表中;当一个包取代某个动作时,还会和该动作原有的版本一起显示,并在包是同一版本或更旧版本时说明。用点隔开的数字按数字比较(1.10.0比1.9.2新,1.0.0-beta.1排在1.0.0之前);其他写法的两个版本只分相同与不同。未写时为1.0.0。api(整数, 1 或以上; 必填): 编写它时所用的 API 版本:1。比这个 Vovó 更新的版本会被拒绝,并说明该怎么办。triggers(事件列表): 它听的事件:API 的事件,或它自己的名称,由vovo.emit和vovo emit触发。与 API 某个名称相近的名称会被拒绝,并给出原本想写的那个。声明了控件、设置或面板的动作,无需列出就会收到control、settings和panel。bindings(列表): 触发器的条件。permissions(权限列表): 它可以向 Vovó 请求的内容,会展示给导入它的人。Vovó 不认识的权限会被拒绝,并给出原本想写的那个。persistent(true 或 false): 它是否常驻屏幕(聊天、目标条),而不是在事件到来时才出现,编辑器和动作列表就是这样称呼它的。它不改变动作的运行方式。operator(true 或 false): 仅限操控直播的人:它听控制板、快捷键、计时器、它的控件以及 OBS 和电脑报告的内容,从不听观众、聊天、奖励、webhook 或其他动作的事件。别人可能触发的触发器会被拒绝。controls(列表, 最多 32 个): 控制板在它运行时可以改变的内容。settings(列表, 最多 32 个): 使用它的人无需改代码就能更改的内容。panel(列表): 它在“面板”中向操控直播的人展示的内容。author(文本,单行, 最多 80 个字符): 谁做的。site(网址, 最多 200 个字符): 可以进一步了解它或其作者的地方。description(文本,单行, 最多 300 个字符): 它做什么,一行说明,导入时显示。license(文本,单行, 最多 100 个字符): 它按什么条款交给别人,由制作者自己说明:许可证的名称(MIT、CC-BY-4.0)或自己写的一行,在导入时和动作列表中显示。许可证全文作为LICENSE(或LICENSE.md、LICENSE.txt)放在此文件旁边,最多 64 KB 文本,可在动作导入之前从导入对话框中阅读。Vovó 只说明所写的内容,不约束任何人:不检查密钥、账号或购买记录。
条件
再次列出每个触发器,附上它触发动作前必须全部满足的条件,与编辑器保存的格式相同。triggers 中每个名称各一个,顺序不限:如果不能一一对应,所有条件都会被悄悄丢弃,每个触发器对任何情况都会触发。
event(事件; 必填):triggers中的一个名称。filter(列表): 它的条件;没有条件时,每个此类事件都会触发动作。
一个条件
事件的某个字段与一个值比较。文本比较不区分大小写;写成文本的数字按数字读取。
field(文本; 必填): 事件的字段,名称与 API 参考一致:viewers、reward、text。timer的间隔是字段every(秒,5 或以上),hotkey的组合键是字段keys,二者都用is。op(is,not,above,atleast,below,atmost,contains,starts之一; 必填): 比较方式:is和not按原样比较,above、atleast、below和atmost按数字比较,contains和starts按文本比较。value(文本、数字或 true/false; 必填): 与字段比较的值。
控件
控制板在动作运行时可以改变的内容:每个都以其键保存在 vovo.state 中,并以 control 事件告知动作,动作无需列出即可收到。
key(键; 必填):vovo.state保存它的位置;两个控件不能共用一个键。label(文本; 必填): 控制板上显示的名称。kind(toggle,choice,counter,text之一; 必填): 开或关;它的选项之一;整数,每次加一或减一;或一行文本,最多 300 个字符。options(文本列表): 选项的各个选项,两个或以上。max(数字): 计数器的目标,显示在计数旁边。
设置
使用动作的人无需改代码即可在“自定义”中更改的内容:以 vovo.settings.<key> 读取,在 CSS 中为 --vovo-<key>,开关和选项还会作为文档上的 data-vovo-<key>。所选内容随动作保存,包只携带默认值。其中文本最多八个。
kind(color,number,toggle,choice,text,file,font,camera之一; 必填): 它是什么,见下面各部分。key(键; 必填): 动作读取它的方式;两个设置不能共用一个键,也不能是accent。label(文本, 最多 60 个字符; 必填): “自定义”中显示的名称。
设置: color
颜色;动作未指定时为 Vovó 的酒红色 #840926。
default(颜色,#RRGGBB): 动作自带的值;未写时用该类型自己的值。
设置: number
从最小到最大、按步长变化的数字;动作未指定时为最小值。
min(数字; 必填): 最小值。max(数字; 必填): 最大值,大于最小值。step(数字): 每一步的大小,大于 0;未写时为 1。unit(px,%,s,ms,em,deg之一): 它的 CSS 变量带的单位;未写时为纯数字。default(数字): 动作自带的值;未写时用该类型自己的值。
设置: toggle
开或关;动作未指定时为关。
default(true 或 false): 动作自带的值;未写时用该类型自己的值。
设置: choice
它的选项之一;动作未指定时为第一个。
options(文本列表, 2 到 12; 必填): 各个选项,每个只出现一次。default(文本): 动作自带的值;未写时用该类型自己的值。
设置: text
一行文本;动作未指定时为空。
default(文本,单行, 最多 200 个字符): 动作自带的值;未写时用该类型自己的值。
设置: file
使用者选择的图片、声音或视频,最多 50 MB;动作自带的值为它自己的某个文件(按路径)或无。
accept(image,sound,video之一): 可以是什么:动作未指定时为图片。default(文件路径或null): 动作自带的值;未写时用该类型自己的值。
设置: font
电脑上的字体之一,按字体族;动作未指定时为 Segoe UI。
default(文本,单行, 最多 64 个字符): 动作自带的值;未写时用该类型自己的值。
设置: camera
电脑上的一个摄像头,由使用动作的人在“自定义”中选择,显示在动作放置它的位置(vovo.camera.place,需要 camera.show 权限);最多四个。它本身不带摄像头,因此没有默认值。
面板
动作在侧边栏“面板”中向操控直播的人展示的内容:按顺序排列的部件,每个由其 kind 说明,由 Vovó 绘制。在那里所做的操作会以 panel 事件传给动作,动作无需列出即可收到。panel 部件开始另一个面板,包含其后直到下一个为止的部件,第一个之前的部件在每个面板都显示;tab 以同样方式把面板分成几个部分。按钮、表单和列表按钮的名称在动作内唯一。一个动作最多声明 24 个面板,每个最多 40 个部件和 12 个标签页。
kind(panel,tab,heading,note,control,button,form,list之一; 必填): 它是什么,见下面各部分。
面板: panel
另一个面板从这里开始,在“面板”中有自己的条目。
label(文本, 最多 30 个字符; 必填): 它在“面板”中的名称。icon(文本, 最多 32 个字符): Vovó 的某个图标名称,或一个表情符号;未写时用该动作在控制板上第一个按钮的图标。
面板: tab
面板的一个部分:其后直到下一个标签页的部件。
label(文本, 最多 30 个字符; 必填): 它的名称。
面板: heading
其后部件的标题,这些部件共用一张卡片。
label(文本, 最多 60 个字符; 必填): 它的文字。
面板: note
一行说明文字。
label(文本, 最多 60 个字符; 必填): 它的文字。
面板: control
动作的某个控件,在这里像在控制板上一样操作。
key(键; 必填): 控件的键。
面板: button
一个按钮。
name(名称; 必填):panel事件中表示按下了什么的名称。label(文本, 最多 60 个字符; 必填): 它的文字。confirm(true 或 false): 第一次按下会询问,第二次才执行。
面板: form
几个字段和一个按钮:输入的内容随按下一起发送,放在事件的 values 中。只有一个字段的表单直接在面板里输入。
name(名称; 必填):panel事件中表示提交了什么的名称。label(文本, 最多 60 个字符; 必填): 它的文字。button(文本): 按钮上的文字。fields(列表, 1 到 4; 必填): 它的字段。
表单的字段
每个都是在面板中输入的一行,按其键随表单发送。
key(名称; 必填): 它在事件values中的键,在表单中只出现一次。label(文本, 最多 60 个字符; 必填): 字段的名称。
面板: list
从动作状态中读取的列表,每项一行,可多达数千行;超过八行的列表有自己的搜索。
key(文本; 必填): 保存它的vovo.state键。path(文本): 在其中通往列表的键,用点连接:round.names。label(文本, 最多 60 个字符; 必填): 它的名称。show(文本): 当列表项是对象时:一行显示的字段,或用每项内容填入{field}的一行文字。empty(文本): 列表为空时显示的文字。buttons(列表, 最多 3 个): 每行的按钮:按下时会把该行的item和index告诉动作。
列表的按钮
列表每一行上的按钮。
name(名称; 必填):panel事件中表示按下了什么的名称。label(文本, 最多 60 个字符; 必填): 它的文字。confirm(true 或 false): 第一次按下会询问,第二次才执行。
pad.json
控制板的按钮包:一个装有声音和视频的 zip 或文件夹,根目录的 pad.json 说明分组及其按钮;没有它时,每个文件夹是一个分组,每个声音或视频是一个以文件名命名的按钮。再次导入时,它会更新其中提到的内容,其余保持不变。
{
"$schema": "./pad.schema.json",
"groups": [
{
"name": "Sounds",
"color": "#2F6FDB",
"buttons": [
{ "label": "Applause", "icon": "👏", "sound": "sounds/applause.mp3", "favorite": true, "hotkey": "F13" },
{ "label": "Drum roll", "sound": "sounds/drums.ogg", "volume": 130 },
{ "label": "Rain", "video": "videos/rain.mp4", "key": "luma", "loop": true }
]
},
{
"name": "Live",
"buttons": [
{ "label": "Raffle", "action": "Raffle" },
{ "label": "Entries", "action": "Raffle", "control": "open" },
{ "label": "Starting", "scene": "Starting soon" },
{ "label": "Camera", "scene": "Game", "source": "Camera" },
{ "label": "Blur", "source": "Camera", "filter": "Blur" },
{ "label": "One minute", "team": "One minute, then I'm back." }
]
}
]
}
$schema(文本): 编辑器在哪里找到此文件的 schema,例如旁边的./pad.schema.json。Vovó 不读取这里的任何内容。groups(列表; 必填): 按顺序排列的分组。
分组
控制板的一个分组及其按钮,按顺序排列。
name(文本, 最多 60 个字符; 必填): 它的名称:配置文件中同名的分组(不区分大小写)会被更新。color(颜色,#RRGGBB): 它的颜色;未写时,已有分组保留自己的颜色,新分组取下一个颜色。buttons(列表): 它的按钮。
按钮
一个按钮及其作用:Vovó 按以下顺序读取找到的第一项:sound;video;带 control 的 action;action;带 filter 的 source,或带 source 的 scene;scene。一个包最多带入 2,000 个按钮。
label(文本, 最多 60 个字符; 必填): 它在控制板上的名称:所在分组中同名的按钮(不区分大小写)会被更新。icon(文本): Vovó 的某个图标名称,或一个表情符号。sound(文件路径): 包中的声音,按其在包内的路径:MP3、OGG、WAV、M4A、WEBM 或 FLAC,最多 20 MB。video(文件路径): 包中的视频,按其在包内的路径:MP4 或 M4V,最多 200 MB;它在整个舞台上方播放。key(文本): 从视频中去掉什么,与 OBS 的滤镜相同:none、luma(黑色)、chroma(绿色)或chroma:#RRGGBB。loop(true 或 false): 视频循环播放,直到再次按下它的按钮。action(文本): 配置文件中的某个动作,按名称指定,以其button事件触发。control(键): 与action一起:它的某个控件,按键指定,像它在控制板上的按钮那样操作。value(文本): 与control一起,用于选项:它选中的选项;未写时依次轮换。scene(文本): OBS 场景,按名称指定,切到直播画面。source(文本): 与scene一起:场景中的某个来源,显示或隐藏。与filter一起:滤镜所在的来源。filter(文本): 与source一起:它的某个滤镜,开启或关闭。team(文本, 最多 300 个字符): 以主播的身份写入团队对话的一条消息,绝不会出现在直播或聊天中;设备的控制板上永远没有这个按钮。favorite(true 或 false): 是否在“收藏”中;未写时,已有按钮保持原样。hotkey(文本): 从任何程序按下它的组合键,按通常写法:F13、Ctrl+Shift+1。配置文件中两个按钮不能共用一个。volume(整数, 0 到 150): 声音或视频的音量,为文件原音量的百分比;未写时,已有按钮保持自己的音量。