action.json と pad.json
Vovó がフォルダーや zip から読む 2 つのファイルのすべてのキーです。Vovó 自身のコードから生成されるので、常にこのバージョンと一致します。Vovó は各ファイルを受け取るときに確認し、何が間違っているかを一文で示して拒否します。知らないキーは何も言わずに読み飛ばしますが、スキーマを読むエディターはそこに下線を引きます。
キーは小文字、数字、_ からなり、名前には - も使えます。どちらも 32 文字までです。
エディターにキーを補完させ、間違いに下線を引かせるには、例のようにファイルの先頭でスキーマを指定します。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(テキスト): エディターがこのファイルのスキーマを見つける場所です。vovo devが横に書き出す./action.schema.jsonを指定します。Vovó はここを何も読みません。name(テキスト; 必須): 名前です。プロファイル内で一意です。既にあるアクションと同じ名前で取り込んだアクションは、その置き換えを提案するか、「Raffle 2」として入ります。id(テキスト、1 行, 最大 64 文字): 作った人が一度だけ付け、以後変えない名前です。作った人の名前とアクションの名前を点でつなぎ、example.raffleのように小文字、数字、-で書きます。新しいバージョンを取り込むと、そのアクションがそのとき何という名前になっていても、これで更新先のアクションを見つけます。なければ名前で探します。Vovó の中で作ったコピーには引き継がれません。version(テキスト、1 行, 最大 32 文字): アクション自身のバージョンで、アクションの一覧に表示されます。パッケージがアクションと置き換わるときは、そのアクションのこれまでのバージョンと並べて表示され、パッケージが同じバージョンか古いバージョンならそう知らせます。点で区切った数字は数として読みます(1.10.0は1.9.2より新しく、1.0.0-beta.1は1.0.0より前です)。それ以外の書き方では、2 つのバージョンは同じか違うかだけです。なければ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(テキスト、1 行, 最大 80 文字): 作った人です。site(Web アドレス, 最大 200 文字): アクションや作った人について詳しく読める場所です。description(テキスト、1 行, 最大 300 文字): 何をするかを 1 行で。取り込むときに表示されます。license(テキスト、1 行, 最大 100 文字): どんな条件で渡すかを、作った人の言葉で示します。ライセンスの名前(MIT、CC-BY-4.0)か自分で書いた 1 行で、取り込むときとアクションの一覧に表示されます。ライセンスの全文はこのファイルの横にLICENSE(またはLICENSE.md、LICENSE.txt)として置きます。テキストは 64 KB までで、アクションが入る前にインポートのダイアログから読めます。Vovó は書かれていることを伝えるだけで、誰にも何も強制しません。キーもアカウントも購入も確認しません。
条件
各トリガーをもう一度、アクションを起動するためにすべて満たす必要がある条件とともに、エディターが保存する形で書きます。triggers の名前ごとに 1 つずつ、順序は自由です。一対一で対応しないと、すべての条件が何も言わずに外され、各トリガーはどんな場合にも起動します。
event(イベント; 必須):triggersにある名前の 1 つです。filter(リスト): その条件です。なければ、その種類のイベントすべてで起動します。
条件 1 つ
イベントのフィールドの 1 つを値と比べます。テキストは大文字と小文字を区別せずに比べ、テキストで書かれた数は数として読みます。
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で保存される場所です。2 つのコントロールが同じキーを使うことはできません。label(テキスト; 必須): パッドでの呼び名です。kind(toggle,choice,counter,textのいずれか; 必須): オンかオフ、選択肢の 1 つ、1 ずつ増減する整数、または 300 文字までの 1 行のテキストです。options(テキストのリスト): 選択肢の項目で、2 つ以上です。max(数値): カウンターの目標で、数の横に表示されます。
設定
アクションを使う人がコードなしで「カスタマイズ」から変えられるものです。vovo.settings.<key> として、CSS では --vovo-<key> として読み、オン・オフと選択肢はドキュメントの data-vovo-<key> にもなります。選んだ内容はアクションとともに残り、パッケージには既定値だけが入ります。テキストは 8 つまでです。
kind(color,number,toggle,choice,text,file,font,cameraのいずれか; 必須): 種類です。下の各項目を参照してください。key(キー; 必須): アクションが読むときの名前です。2 つの設定が同じキーを使うことはできず、accentも使えません。label(テキスト, 最大 60 文字; 必須): 「カスタマイズ」での呼び名です。
設定: color
色です。アクションが指定しなければ、Vovó のワインレッド #840926 です。
default(色、#RRGGBB): アクションの初期値です。なければ種類ごとの値になります。
設定: number
最小から最大までを刻みで動く数です。アクションが指定しなければ最小値です。
min(数値; 必須): 最小値です。max(数値; 必須): 最大値で、最小値より大きくします。step(数値): 1 刻みの大きさで、0 より大きくします。なければ 1 です。unit(px,%,s,ms,em,degのいずれか): CSS 変数に付く単位です。なければ単なる数です。default(数値): アクションの初期値です。なければ種類ごとの値になります。
設定: toggle
オンかオフです。アクションが指定しなければオフです。
default(true か false): アクションの初期値です。なければ種類ごとの値になります。
設定: choice
選択肢の 1 つです。アクションが指定しなければ最初のものです。
options(テキストのリスト, 2 から 12; 必須): 選択肢で、それぞれ 1 回だけ書きます。default(テキスト): アクションの初期値です。なければ種類ごとの値になります。
設定: text
1 行のテキストです。アクションが指定しなければ空です。
default(テキスト、1 行, 最大 200 文字): アクションの初期値です。なければ種類ごとの値になります。
設定: file
使う人が選ぶ画像、音、動画で、50 MB までです。アクションの初期値は、自分のファイルのどれか(パスで指定)か、なしです。
accept(image,sound,videoのいずれか): 何を選べるかです。アクションが指定しなければ画像です。default(ファイルのパス、またはnull): アクションの初期値です。なければ種類ごとの値になります。
設定: font
コンピューターのフォントの 1 つで、ファミリー名で指定します。アクションが指定しなければ Segoe UI です。
default(テキスト、1 行, 最大 64 文字): アクションの初期値です。なければ種類ごとの値になります。
設定: camera
コンピューターのカメラのひとつ。アクションを使う人が「カスタマイズ」で選び、アクションが置いた場所に表示されます(vovo.camera.place、camera.show 権限が必要)。最大 4 つ。初期状態ではカメラがないので、既定値はありません。
パネル
サイドバーの「パネル」で、配信を操作する人にアクションが見せるものです。部品を順に並べ、それぞれ kind で種類を示し、Vovó が描きます。そこで行われたことは panel イベントとしてアクションに届き、一覧に書かなくても受け取れます。panel の部品は別のパネルを始め、次のパネルまでの部品がそこに入ります。最初のパネルより前の部品はすべてのパネルに表示されます。tab も同じようにパネルをセクションに分けます。ボタン、フォーム、リストのボタンの名前はアクション内で一意です。1 つのアクションが宣言できるパネルは 24 個まで、各パネルの部品は 40 個まで、タブは 12 個までです。
kind(panel,tab,heading,note,control,button,form,listのいずれか; 必須): 種類です。下の各項目を参照してください。
パネル: panel
ここから別のパネルが始まり、「パネル」に専用の項目ができます。
label(テキスト, 最大 30 文字; 必須): 「パネル」での名前です。icon(テキスト, 最大 32 文字): Vovó のアイコンの名前か絵文字です。なければ、パッドにあるアクションの最初のボタンのアイコンです。
パネル: tab
パネルのセクションです。次のタブまでの部品が入ります。
label(テキスト, 最大 30 文字; 必須): 名前です。
パネル: heading
後に続く部品の見出しで、それらは 1 枚のカードにまとまります。
label(テキスト, 最大 60 文字; 必須): 表示する文字です。
パネル: note
何かを伝える 1 行です。
label(テキスト, 最大 60 文字; 必須): 表示する文字です。
パネル: control
アクションのコントロールの 1 つで、パッドと同じようにここで操作します。
key(キー; 必須): コントロールのキーです。
パネル: button
ボタンです。
name(名前; 必須):panelイベントで、押されたものとして伝わる名前です。label(テキスト, 最大 60 文字; 必須): 表示する文字です。confirm(true か false): 1 回目の押下で確認し、2 回目で実行します。
パネル: form
いくつかの欄とボタンです。入力した内容は押したときにイベントの values で届きます。欄が 1 つのフォームはパネルの中で直接入力します。
name(名前; 必須):panelイベントで、送信されたものとして伝わる名前です。label(テキスト, 最大 60 文字; 必須): 表示する文字です。button(テキスト): ボタンの文字です。fields(リスト, 1 から 4; 必須): フォームの欄です。
フォームの欄
それぞれパネルで入力する 1 行で、キーの名前でフォームとともに送られます。
key(名前; 必須): イベントのvaluesでのキーで、フォーム内で 1 回だけ使います。label(テキスト, 最大 60 文字; 必須): 欄の名前です。
パネル: list
アクションの状態から読むリストで、項目ごとに 1 行、何千行でも構いません。8 行を超えるリストには専用の検索が付きます。
key(テキスト; 必須): リストを持つvovo.stateのキーです。path(テキスト): その中でリストまでのキーを、ドットでつないで書きます:round.names。label(テキスト, 最大 60 文字; 必須): 名前です。show(テキスト): 項目がオブジェクトの場合に、行に表示するフィールド、または各項目から{field}を埋める行を書きます。empty(テキスト): 空のあいだに表示する文字です。buttons(リスト, 最大 3): 各行のボタンです。押すと、その行のitemとindexがアクションに伝わります。
リストのボタン
リストの各行に付くボタンです。
name(名前; 必須):panelイベントで、押されたものとして伝わる名前です。label(テキスト, 最大 60 文字; 必須): 表示する文字です。confirm(true か false): 1 回目の押下で確認し、2 回目で実行します。
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(テキスト): エディターがこのファイルのスキーマを見つける場所で、たとえば横に置いた./pad.schema.jsonです。Vovó はここを何も読みません。groups(リスト; 必須): 順に並べたグループです。
グループ
パッドのグループと、そのボタンを順に並べたものです。
name(テキスト, 最大 60 文字; 必須): 名前です。プロファイルに同じ名前のグループがあれば(大文字と小文字は区別しません)、それを更新します。color(色、#RRGGBB): グループの色です。なければ、既にあるグループは自分の色のまま、新しいグループには次の色が付きます。buttons(リスト): グループのボタンです。
ボタン
ボタンとその働きです。Vovó は次の順に、最初に見つかったものを読みます:sound、video、control 付きの action、action、filter 付きの source または source 付きの scene、scene。1 つのパックで取り込めるボタンは 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(テキスト): プロファイルのアクションの 1 つで、名前で指定し、そのbuttonイベントとして起動します。control(キー):actionと一緒に使い、そのコントロールの 1 つをキーで指定します。パッドのボタンと同じように操作されます。value(テキスト):controlと一緒に、選択肢の場合に選ぶ項目を指定します。なければ順に切り替えます。scene(テキスト): OBS のシーンで、名前で指定し、放送に出します。source(テキスト):sceneと一緒なら、そのシーンのソースを表示・非表示にします。filterと一緒なら、フィルターが付いたソースです。filter(テキスト):sourceと一緒に、そのフィルターの 1 つをオン・オフします。team(テキスト, 最大 300 文字): 配信者としてチームの会話に書き込むメッセージ。配信やチャットには出ません。デバイスのパッドにはこのボタンは表示されません。favorite(true か false): お気に入りに入れるかどうかです。なければ、既にあるボタンは今のままです。hotkey(テキスト): どのプログラムからでもボタンを押せる組み合わせで、普段の書き方で書きます:F13、Ctrl+Shift+1。プロファイルの 2 つのボタンが同じ組み合わせを使うことはできません。volume(整数, 0 から 150): 効果音や動画の音量で、ファイルに対する割合(%)です。なければ、既にあるボタンは今の音量のままです。