メッセージコンポーネント
ボットは Discord とまったく同じように、Discord 形式の components をメッセージに付けられます。クリックは通常のトークンとコールバックの流れを伴う INTERACTION_CREATE として届くので、ライブラリの変更は不要です。このページでは、GameVox が何を表示するか、インタラクションがどうアプリに届くか、そして Discord と制限が異なる点を説明します。
動作するもの
- アクション行(type 1)と、その中のボタン(type 2、スタイル 1〜5)および文字列セレクト(type 3)。リンクボタン(スタイル 5)は
urlを開くだけで、インタラクションは送りません。 - クラウドとセルフホストの両方のサーバー。コンポーネントはメッセージと一緒に保存され、REST での取得や
MESSAGE_CREATE/MESSAGE_UPDATEで返されます。components: []でメッセージを編集すると削除されます。 - すべてのクライアント。デスクトップ版と Web 版のクライアント、iOS、Android がボタンと文字列セレクトを表示し(1 メッセージあたり最大 5 行 × 5 個)、モーダルとエフェメラル返信も表示します。
- モーダル(コールバック type 9)とエフェメラル返信(
flags: 64)。詳しくは下記をご覧ください。
ボタンの行とセレクトを持つメッセージの例:
POST /api/v10/channels/{channel_id}/messages
{
"content": "Next map?",
"components": [
{
"type": 1,
"components": [
{ "type": 2, "style": 1, "label": "Vote", "custom_id": "vote" },
{ "type": 2, "style": 5, "label": "Rules", "url": "https://example.com/rules" }
]
},
{
"type": 1,
"components": [
{
"type": 3,
"custom_id": "map",
"placeholder": "Pick a map",
"options": [
{ "label": "Dust", "value": "dust" },
{ "label": "Nuke", "value": "nuke" }
]
}
]
}
]
} 未対応
- ユーザー、ロール、メンション可能、チャンネルのセレクト(type 5〜8)。受け付けて保存されますが、クライアントでは無効の状態で表示されるため、インタラクションは発生しません。
- コンポーネント v2 のレイアウトコンポーネント。表示されません。
- プレミアムボタン(スタイル 6)。無効の状態で表示されます。
- DM。コンポーネントのインタラクション、モーダル、エフェメラル返信はサーバーのチャンネルでのみ動作します。
クリックを受け取る
クリックは type: 3(MESSAGE_COMPONENT)の INTERACTION_CREATE として届き、data.custom_id、data.component_type、セレクトの場合は data.values を含みます。message はクリックされたメッセージの全体で、ボットのインテントに関係なくコンポーネントも含まれます。送信されたモーダルは type: 5(MODAL_SUBMIT)として届き、入力値は data.components に入ります。
GameVox は、アプリに渡す前に各クリックを保存済みのメッセージと照合します。そのコントロールがまだメッセージ上にあり有効であること、セレクトの値が選択肢に含まれ min_values / max_values の範囲内であること、そしてメンバーがそのチャンネルを閲覧できることが条件です。クリックは、そのメッセージを投稿したボットのアプリにだけ配信されます。
インタラクションはボットのゲートウェイ接続経由で配信されます。インタラクションのエンドポイント URL を設定している場合はそこへ POST されます(OAuth2 を参照)。HTTP モードでは Discord と次の 2 点が異なります:
- それでもゲートウェイのセッションは接続したままにしてください。GameVox は各インタラクションをこのセッション経由でアプリに渡してから、エンドポイントへ POST します。接続中のセッションがなければ何も配信されず、クリックしたメンバーにはアプリがオンラインでないと表示されます。
- レスポンスのボディは無視されます。
POST /interactions/{id}/{token}/callbackを呼び出して応答してください。POST へのレスポンスのボディで返したコールバックは誰にも届きません。
応答する
通常のコールバックエンドポイントを使います。インタラクションのトークンは 15 分間有効です。
| タイプ | 動作 |
|---|---|
4 CHANNEL_MESSAGE_WITH_SOURCE | チャンネルに返信を投稿します。flags: 64 を付けるとエフェメラル返信になります。 |
5 DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE | すぐに受領を返し、最初の PATCH .../messages/@original で返信を投稿します。flags: 64 を付けるとその返信はエフェメラルになります。 |
6 DEFERRED_UPDATE_MESSAGE | 見た目の変化なしに受領を返します。以降 @original はクリックされたメッセージを指すため、後の PATCH .../messages/@original でそのメッセージを編集できます。 |
7 UPDATE_MESSAGE | クリックされたメッセージを、コンポーネントも含めてその場で編集します。 |
9 MODAL | クリックしたメンバーにモーダルを開きます。 |
フォローアップ(1 インタラクションあたり最大 5 件、エフェメラルは flags: 64)と、@original およびフォローアップメッセージへの GET / PATCH / DELETE は Discord と同じように動作します。タイプ 4、5、9 とエフェメラル返信はスラッシュコマンドでも使えます。タイプ 6 と 7 にはクリックされたメッセージが必要です。
エフェメラル返信
エフェメラル返信は、インタラクションを起こしたメンバーが開いているセッションにだけ届き、そのメンバーにしか見えないことが表示されます。チャンネルには書き込まれません。メッセージ履歴にも MESSAGE_CREATE にも現れず、メンバーが再読み込みすると消えます。アプリは 15 分間それを編集・削除できます。エフェメラル返信上のコンポーネントも通常どおり動作します。クラウドとセルフホストのどちらのサーバーでも同じです。
モーダル
- テキスト入力(type 4)のアクション行を最大 5 つまで。モーダル内のそれ以外の要素は破棄されます。スタイル 1 は 1 行、スタイル 2 は段落です。
- タイトルとラベルは 45 文字、プレースホルダーは 100 文字で切り詰められます。入力欄には最大 4000 文字入ります。
requiredの既定値は true です。 - GameVox は、アプリに渡す前に送信内容を開いたモーダルと照合します(必須項目、
min_length、max_length)。 - モーダルは 15 分で期限切れになり、送信できるのは 1 回だけです。
制限
- 1 メッセージの
components: クラウドサーバーでは JSON で 64 KiB まで。セルフホストサーバーでは 128 KiB かつ最上位のコンポーネント 40 個まで。それを超えるリクエストは400で失敗します。 custom_id: 最大 100 文字。これより長いコントロールは使えません。セレクト: 値は最大 25 個、各 100 文字まで。- クリック: コンポーネントのインタラクションは、メンバーごと・サーバーごとに 0.7 秒に 1 回まで。セルフホストサーバーではさらに、メンバーごとに 5 秒間で最大 5 回までです。それより速いクリックは拒否され、アプリには届きません。
- エフェメラル返信とモーダル: 合わせて、アプリごと・メンバーごとに 15 分間で 120 件まで。既存のものの編集は数えません。上限を超えるとリクエストは
429で失敗します。 - エフェメラル返信の本文: 最大 4000 文字。