コマンドビルダー

ノードの種類リファレンス

コマンドビルダーで使えるすべてのブロック(ノード)を、カテゴリ別に一覧でまとめた早見表です。ここに載せているのはキャンバス上での正式なノード名です。

ノードの全体像

コマンドビルダーの画面左側には「ブロック」パネルがあり、ここにノードがカテゴリ別に並んでいます。カテゴリは4つのタブに分かれます。

カテゴリタブ役割
「選択」コマンドに渡す入力(オプション)を定義します
「動作」Bot に実際の処理を行わせます(メッセージ送信、ロール付与など)
「条件」状況に応じて処理を分岐させます
「制御」待機やくり返しなど、処理の流れをコントロールします

このほかに、パネルには並ばないものの自動的に登場するノードがあります。

  • 起点ノード: キャンバスに最初から置かれている「スラッシュコマンド」と「エラーハンドラー」。
  • 構造ノード: 条件分岐やくり返しを追加すると自動で生まれる「Else(それ以外)」「条件後」「ループ本体」「ループ後」。
  • コンポーネント: 「メッセージを送信」ノードに後から付け足す「ボタン」「選択メニュー」。

各カテゴリの中はさらに「メッセージ応答」「ロール操作」などのグループに分かれています。ノードの探し方とキャンバスへの追加方法はコマンドビルダーの基本を参照してください。

起点ノード(最初から置かれているノード)

これらは削除したり移動したりはできません。すべてのコマンドの土台になるノードです。

ノード名役割
「スラッシュコマンド」コマンドの入口です。キャンバスに1つだけ存在します。
「エラーハンドラー」コマンドの処理中にエラーが起きたときに動く、もう一つの起点です。コマンドごとに自動で1つ用意され、下流につないだノードでエラー時の応答を組み立てます。エラー応答を実行した本人だけに見せるかどうかを設定できます。

「選択」カテゴリ(オプションノード)

コマンドを実行するときにユーザーから受け取る入力(パラメータ)を定義するノードです。「スラッシュコマンド」ノードにのみつなげます。全部で8種類あります。受け取った値は、後続のノードから変数として参照できます。

ノード名受け取るもの
「テキストオプション」テキスト(文字列)
「添付ファイルオプション」添付ファイル
「チャンネルオプション」チャンネル
「選択オプション」あらかじめ用意した選択肢の中の1つ
「真偽値オプション」「はい」または「いいえ」
「数値オプション」数値
「ロールオプション」ロール
「ユーザーオプション」ユーザー

「動作」カテゴリ(アクションノード)

Bot に実際の処理を行わせるノードです。最も種類が多く、用途別のグループに分かれています。

メッセージ応答

ノード名役割
「メッセージを送信」Bot がメッセージ(プレーンテキスト&埋め込み)を送信します。
「モーダルを送信」Bot がモーダル(入力フォーム)をユーザーに表示し、入力された値を変数に受け取ります。入力フィールドは1つのモーダルにつき最大5個です。起動経路やフィールドの種別ごとの設定は動作(アクション)ノードを参照してください。

メッセージ操作

ノード名役割
「メッセージをピン止めする」特定のメッセージをピン止めします。
「メッセージにリアクションをする」特定のメッセージにリアクションを付けます。
「メッセージを編集」Bot が送信した特定のメッセージを編集します。
「メッセージを削除」特定のメッセージを削除します。
「メッセージの消去」チャンネル内のメッセージをまとめて削除します。

API操作

ノード名役割
「APIリクエストを行う」外部の API に HTTP リクエストを行います。
「IFTTTトリガーを実行する」外部の IFTTT サービスのトリガーを実行します。

チャンネル操作

ノード名役割
「チャンネルを作成」チャンネルを作成します。
「チャンネルを編集」特定のチャンネルを編集します。
「チャンネルを削除」特定のチャンネルを削除します。

ロール操作

ノード名役割
「ロールを付与」特定のユーザーにロールを付与します。
「ロールをはく奪」特定のユーザーのロールをはく奪します。
「ロールを作成」サーバーでロールを作成します。
「ロールを削除」サーバー上のロールを削除します。
「ロールを編集」サーバー上のロールを編集します。

サーバー操作

ノード名役割
「メンバーのBan」特定のメンバーをサーバーから Ban します。
「メンバーのKick」特定のメンバーをサーバーから Kick します。
「メンバーのTimeout」特定のメンバーをサーバーで Timeout します。
「メンバーのニックネーム編集」特定のメンバーのニックネームを編集します。
「インスタント招待の作成」サーバーのインスタント招待(招待リンク)を作成します。

変数操作

コマンドの中で値を一時的に覚えたり計算したりするためのノードです。

ノード名役割
「変数を設定」指定した名前の変数に値(式も可)を代入します。後続ノードから変数名で参照できます。
「変数に演算を適用」既存の変数に対して演算(加減乗除/連結)を適用し、結果で上書きします。
「変数を削除」指定した永続変数の値を空にリセットします。

関数(コマンド内サブルーチン)

同じコマンドの中で再利用したい処理を「関数」として切り出すためのノードです。詳しくはコマンド内関数(サブルーチン)を参照してください。

ノード名役割
「関数定義」関数本体の入口です。関数を新規作成すると、関数本体のキャンバスに自動で1つ配置されます(削除・移動はできません)。設定パネルから関数名・引数 ({param_…})・戻り値の型を編集します。
「関数呼び出し」コマンド本体や別の関数本体から、同じコマンド内の関数を呼び出します。引数を渡し、戻り値を変数として受け取れます。
「戻り値」関数本体の中で、関数の処理を明示的に終わらせて値を返します。戻り値型が void の関数では値の入力は不要です。関数本体の外には置けません。

配列操作

配列(Array)型の変数を出し入れするためのノードです。対象には BSVAR_ で始まる永続変数とコマンド内のローカル変数のどちらも指定でき、対象変数名は { } を付けず名前だけを入力します。添字は0始まりで指定し、負の添字は末尾から数えます。

ノード名役割
「配列に追加」配列変数の末尾に要素を1つ追加します。
「配列から取り出し」配列変数の末尾の要素を取り除きます。取り除いた要素は、任意のローカル変数に退避できます(空欄なら破棄)。
「配列を更新」配列変数の指定した添字の要素を、新しい値で上書きします。範囲外の添字は無視されます。
「配列に挿入」配列変数の指定した添字の前に要素を挿入します。
「配列から削除」配列変数の指定した添字の要素を取り除きます。範囲外の添字は無視されます。
「配列を空にする」配列変数を空の配列にリセットします。

乱数

ランダムな値を生成して、結果をローカル変数に格納するノードです。生成した値は後続ノードから {結果変数名} で参照できます。

ノード名役割
「乱数(数値)」指定した範囲(最小値〜最大値)の乱数を1回だけ生成します。整数・小数を切り替えられます。
「配列から抽選」配列変数からランダムに要素を抽選します。個数が1なら単一の要素、2以上なら配列を返します。

{変数名.length}(要素数)などの参照記法、永続変数とコマンド内変数の違いといった変数のしくみは変数の使い方にまとめています。

「条件」カテゴリ(条件ノード)

状況に応じて処理を分岐させるノードです。全部で7種類あります。条件を設定して追加すると、後述の「Else(それ以外)」「条件後」ノードがいっしょに自動生成されます。

ノード名役割
「確率による条件分岐」設定した確率(0〜100)で、動作がトリガーされるかどうかを分岐します。
「チャンネルによる条件分岐」指定したチャンネルに応じて分岐します。
「比較による条件分岐」二つの値の比較によって分岐します。
「権限による条件分岐」ユーザーが持つ権限によって分岐します。
「ロールによる条件分岐」ユーザーが持つロールによって分岐します。
「ユーザーによる条件分岐」コマンドを実行したユーザーによって分岐します。
「時刻による条件分岐」現在の曜日・時刻・日時によって分岐します。

「制御」カテゴリ(制御ノード)

処理の流れをコントロールするノードです。全部で4種類あります。「反復中断」「反復スキップ」は「ループ本体」につながった範囲でのみ意味を持ち、ループの外に置いても効果はありません。

ノード名役割
「待機」指定した時間だけ処理を一時停止します。
「反復処理」接続されたブロックを指定した回数だけくり返し実行します。
「反復中断」現在のループを中断して、「ループ後」の処理へ移動します。
「反復スキップ」現在の反復をスキップして、次の反復へ進みます。

自動生成される構造ノード

条件分岐やくり返しを追加すると、自動でいっしょに作られるノードです。これらは流れの合流点や分岐先を表すための「枠」のような存在で、設定項目はほとんどなく、単独では削除できません(親のノードといっしょに削除されます)。構造ノード同士をつなぐ線も手動では消せません。

ノード名いつ生まれるか役割
「Else(それ以外)」条件分岐を追加したとき条件に当てはまらなかった場合に進む先です。
「条件後」条件分岐を追加したとき条件分岐(当てはまった側/それ以外の側)の評価がすべて終わった後に実行されます。
「ループ本体」「反復処理」を追加したときここにつないだブロックが、指定した回数くり返し実行されます。
「ループ後」「反復処理」を追加したときくり返しが終わった後に実行されます。「反復中断」で抜けたときもここへ移ります。

メッセージに付くコンポーネント

次の2つは「ブロック」パネルには並びません。「メッセージを送信」ノードの設定から「ボタンを追加」「選択メニューを追加」を選ぶことで、そのメッセージにくっつく形で追加します。

ノード名役割
「ボタン」「メッセージを送信」につなげて使う、クリックできるボタンです。
「選択メニュー」メッセージにドロップダウンの選択メニューを追加します。実行者が選んだ値を後続フローで使えます。

ボタン・選択メニューのコンテキスト変数

「ボタン」「選択メニュー」の設定にある「変数名」(結果変数名 variable_name)に名前を入れておくと、押された・操作されたときの情報が、その名前のローカル変数として後続ノードから参照できます。空欄なら変数は作られません。ボタンは変数名をそのまま({button})書くと押されたラベルが得られ、選択メニューはオブジェクトとして扱われるため選ばれた値を {select.value} で取り出します。どちらもドット記法でサブプロパティを参照できます。詳しくはコンポーネントの結果変数を参照してください。

「ボタン」に変数名(例として button)を設定した場合、次の値を参照できます。

参照内容
{button.user}ボタンを押したユーザー({button.user.name} などでさらに細かく参照できます)。
{button.channel}ボタンが押されたチャンネル({button.channel.name} など)。
{button.guild}ボタンが押されたサーバー({button.guild.name} など)。
{button.label}押されたボタンのラベル。
{button.style}ボタンのスタイル(PRIMARY / SECONDARY / SUCCESS / DANGER / LINK)。
{button.disabled}ボタンが無効化されているかどうか。

「選択メニュー」に変数名(例として select)を設定した場合、選ばれた値に加えて、操作した人・チャンネル・サーバーのコンテキストも参照できます。

参照内容
{select.value}選択された値(単一選択時)。
{select.user}選択メニューを操作したユーザー({select.user.name} など)。
{select.channel}操作されたチャンネル({select.channel.name} など)。
{select.guild}操作されたサーバー({select.guild.name} など)。

複数選択したときの選択値の一覧(配列)は今後の対応予定です。

ボタン・選択メニューを押したときの実際の動作

ユーザーがボタンをクリックする、または選択メニューから値を選ぶと、「どのボタンが押されたか」「どの値が選ばれたか」がフローに渡され、つないだ先の処理へ進みます。コマンド内のボタン・選択メニューへの応答は、押した本人にだけ見える形で返されます。複数選択を許可している場合は、選ばれた順番がそのまま保たれます。

選択メニューの単一選択と複数選択

選択メニューは、初期状態では「1つだけ選べる」単一選択になっています。複数選択を有効にすると、選べる個数の下限・上限(0〜25 の範囲)を設定できます。単一選択のときは Discord 側で「ちょうど1つ」に固定されます。

フォームモード(複数の選択をまとめて確定する)

選択メニューには、選ぶたびにすぐ次へ進む通常の動作のほかに、複数のメニューの選択をいったん貯めておき、最後に「確定」ボタンでまとめて反映する「フォームモード」があります。フォームモードでは次のように動きます。

  • 各選択メニューで選んでも、その時点ではフローは止まりません。複数のメニューを自由に選べます。
  • 「確定」ボタンを押すと、貯めておいた選択内容がまとめて変数に反映され、続きの処理へ進みます。
  • 「キャンセル」ボタンを押すと、貯めておいた選択内容は破棄され、変数には反映されません。

フォームモードを使うときは、必ず「確定」または「キャンセル」にあたるボタンをいっしょに置いてください。確定・キャンセルのボタンがないと、選択内容がいつまでも確定されず、最終的にコンポーネントの有効期限(後述)が切れるまで宙ぶらりんになります。

上限とタイムアウト

ボタン・選択メニューには、Discord の仕様やコマンドの実行時間に由来する上限・時間制限があります。

コンポーネントの上限

項目上限
ボタンのラベル80 文字まで
選択メニューのプレースホルダー(未選択時の案内文)150 文字まで
選択メニューの選択肢の数25 個まで
選択肢ごとのラベル・値・説明それぞれ 100 文字まで
複数選択時の選べる個数(下限・上限)0〜25 の範囲

上限を超えた分はエラーにならず、そのまま切り捨てられます。文字数は変数を展開した「後」の長さで判定されるため、ラベルに変数を入れている場合は実行時の値によって内容が失われることがあります。

タイムアウトと自動無効化

項目時間内容
コンポーネントの有効期限約 300 秒(5分)この時間内にボタン・選択メニューが操作されないと、自動的に押せない状態(グレーアウト)になります。
コマンド全体の実行時間最大 30 秒コマンド1回の処理がこの時間を超えると、タイムアウトとして中断されます。

有効期限内であれば、ユーザーは何度でもボタンをクリックできます。無効化された後に操作したいときは、もう一度コマンドを実行してください。

クールダウンと権限

ボタン・選択メニューを含むコマンドも、実行前にクールダウンと権限が確認されます。クールダウンはコマンドごとに設定でき(初期状態は無効、待ち時間の単位は秒・分・時間)、管理者も例外なく待ち時間が必要です。権限チェックは右クリックメニュー(コンテキストメニュー)にも適用され、拒否されると Botの権限設定により、このコマンド/メニューを実行する権限がありません。 が本人にだけ表示されます。設定方法はコマンド設定、そのほかに表示されるメッセージはコマンドビルダーの基本を参照してください。

注意点・うまくいかないとき

ボタン・選択メニューを使うときに気をつけたいポイントです。

  • 長く待つと反映できないことがある: Discord 側の制限により、最初の操作からおよそ 15 分が過ぎると、Bot が応答やコンポーネントの更新を行えなくなります。フォームモードで「確定」を押さずに放置した場合などは、この時間を過ぎると選択内容が反映されません。
  • 複数同時クリックは最初の1回だけ: 同じメッセージのボタンを連続・同時に押しても、確実に処理されるのは最初の1回です。続けて操作したいときは、応答が返ってから次の操作を行ってください。
  • リンクボタンは処理が走らない: リンクスタイルのボタンは URL を開くだけで、Bot 側の処理(分岐や変数の更新)は呼び出されません。
  • モーダルのキャンセルは何も起きない: 「モーダルを送信」で表示した入力フォームを、ユーザーがキャンセル(閉じる)した場合、Bot 側では何も処理されません。送信されたときだけ続きの処理が動きます。
  • 空の選択メニューは表示されない: 選択肢がすべて取り除かれて空になった選択メニューは、メッセージに表示されません。少なくとも1つは有効な選択肢が必要です。

補足: 整理に使う「グループ」

ノードを視覚的にまとめたいときは「グループ」枠を使えます。グループをドラッグすると中のノードもいっしょに動きます。コマンドの実行結果(動作)には影響しません。

次のステップ / 関連ページ

最終更新:

目次