変数とデータ

永続変数(ストレージ)を作る

永続変数(えいぞくへんすう)は、コマンドの実行が終わっても値が消えずに保存され続ける変数です。「ユーザーごとの所持ポイント」「サーバーごとの累計メッセージ数」のように、Bot に長く覚えておいてほしいデータを扱います。作成・編集・削除はストレージ画面の「変数」タブで行います。コマンドの実行中だけ使う値は一時変数をご覧ください。

リファレンス名(BSVAR_)と表示名

永続変数には「表示名」(例: スコア)と「リファレンス名」(例: BSVAR_score)の 2 つの名前があります。リファレンス名は表示名から自動で作られ、直接編集できません。コマンドの中で値を呼び出すときは、リファレンス名を使います。表示名を中括弧で囲んでも、永続変数としては認識されません。

頭に BSVAR_ が付いていない名前は一時変数として扱われ、コマンドの実行が終わると値が消えます。値を保存しておきたいときは、必ずストレージ画面で作成した BSVAR_ 付きの変数を使ってください。

スコープ

スコープは、その変数の値をどの範囲で共有するかを決めます。

スコープ共有される範囲例
「グローバル(Global)」Bot 全体で 1 つの値Bot 全体の累計実行回数
「サーバー毎(Guild)」Discord サーバーごとに別々の値サーバー内のランキング
「ユーザー毎(User)」Discord ユーザーごとに別々の値(サーバーをまたいで共通)個人の所持ポイント

スコープを後から変えると保存先が変わり、それまでの値が引き継がれないことがあります。作成時に慎重に選んでください。

また、DM(ダイレクトメッセージ)では「サーバー毎(Guild)」の変数を保存できません。 書き込み・計算・リセットは行われず、エラーも表示されません。DM でも使う値は「ユーザー毎(User)」または「グローバル(Global)」で作成してください。

データタイプ

データタイプ入れられる値
「文字列(String)」文字
「数値(Number)」数字
「真偽値(Boolean)」true / false
「オブジェクト(Object)」複数の項目(プロパティ)をまとめたデータ
「配列(Array)」同じ型の値を順番に並べたデータ
「ユーザー(User)」「チャンネル(Channel)」「サーバー(Guild)」「ロール(Role)」Discord の対象への参照

データタイプを指定しなかった場合や、想定外の値が入った場合は「文字列(String)」として扱われます。「デフォルト値」は、まだ一度も値が書き込まれていないときに使われる値です(任意)。

  • オブジェクト型: プロパティは 1 変数あたり最大 50 個です。同じキー名のプロパティを 2 つ作ると、エラーにはならず後から定義したほうの値で上書きされます。よく使う組み合わせはデータ型として登録しておくと再利用できます。
  • ユーザー型・チャンネル型: 各ユーザー(またはチャンネル)にひもづけて保存する中身の型を、「ユーザー/チャンネルごとのデータタイプ」で指定します。自分で作ったデータ型も選べます。
  • 配列型: 「要素の型」を選んで作成します。作成後に要素を出し入れするときは配列操作ノードを使います。

コマンドの中で使う

コマンドビルダーでは、リファレンス名を中括弧で囲んで参照します。オブジェクト型は {BSVAR_profile.level} のようにドットでプロパティを指定できます。

あなたの現在のスコアは {BSVAR_score} です。

値の代入・計算・リセットに使うノードと式の書き方は、コマンド内での変数の使い方をご覧ください。1 回の実行で書き込める回数・実行時間・ステップ数などの上限は上限とクールダウンにまとめています。ほかのメンバーの値を読み書きするには、ノードの「対象ユーザー」を使います(対象ユーザーの指定)。

読み書きの挙動

  • 読み取り: そのスコープで値が書き込まれていればその値、まだ無ければ「デフォルト値」が使われます。
  • 変数が見つからないとき: 置き換えが行われず、{BSVAR_score} のような文字がそのまま表示されます。ストレージ画面で作成していない BSVAR_ 付きの名前に書き込んでも、エラーは出ず保存もされません。変数の作成とリファレンス名のつづりを確認してください。
  • 計算(加算など): 値が未設定でデフォルト値も無い場合は、数値なら 0、真偽値なら false、文字列なら空文字から計算を始めます。{BSVAR_count} + 1 は初回でも崩れません。
  • リセット: 値をデフォルト値に戻します。デフォルト値が無い変数では、その後の参照が空(None と表示される場合があります)になるため、リセットして使う変数にはデフォルト値を設定しておくことをおすすめします。
  • 同時更新: 複数のコマンドが同時に同じ変数を計算で書き換えても、順番に処理され、更新が打ち消し合うことはありません。
  • 取得の遅れ: ごくまれに値の取得が遅れると、その場ではデフォルト値で動作します。多くの場合、次回の実行で本来の値に戻ります。
  • 新しく作った変数が反映されないとき: コマンドを保存し直すか、Bot を再起動してください。

書き込む値の自動変換

  • 真偽値(Boolean): true / yes / on / 1 (大文字・小文字は区別しません)が true になり、それ以外(空文字を含む)はすべて false になります。
  • 数値(Number): 数字として読めない値(例: abc)は、エラーにならず 0 として保存されます。数値型には数字だけを渡してください。

Discord の対象を指す変数

ユーザー・チャンネル・ロール・サーバー型の変数では、メンションや名前を取り出せます。参照先がすでに無い場合(ユーザーの退出、チャンネルやロールの削除など)も、メンションや ID は使えますが、名前は 不明 と表示されます。

関連ページ

最終更新:

目次