永続変数(ストレージ)を作る
永続変数(えいぞくへんすう)は、コマンドの実行が終わっても値が消えずに保存され続ける変数です。「ユーザーごとの所持ポイント」「サーバーごとの累計メッセージ数」「コイントスの通算勝敗」のように、Bot に長く覚えておいてほしいデータはすべて永続変数で扱います。
このページでは、永続変数とは何か、値を共有する範囲を決める「スコープ」、そしてコマンドの中での参照のしかたを、操作のイメージとあわせて説明します。変数を実際に作成・編集・削除するのはストレージ画面で、その細かい操作はそちらのページで解説しています。
永続変数とは
BotShade の変数には、大きく分けて 2 つの種類があります。
| 種類 | 値の寿命 | 主な用途 |
|---|---|---|
| 永続変数(ストレージ) | コマンドの実行が終わっても残る(データベースに保存) | ポイント、勝敗記録、サーバー設定など長く覚えておきたい値 |
| 一時変数 | そのコマンドの実行中だけ。終わると消える | 計算の途中結果、その場限りのメモ |
永続変数はストレージ画面の「変数」タブで作成します。作成した変数は Bot のデータベースに記録され、ユーザーが何度コマンドを実行しても値が引き継がれます。
一方、コマンドの実行中だけ使う一時変数は、ストレージ画面で作らなくてもコマンドビルダーの中で自由に使えます。詳しくは一時変数をご覧ください。
リファレンス名(BSVAR_)と表示名
永続変数には、2 つの「名前」があります。ストレージ画面で変数を作るとき、人が読むための「表示名」を入力すると、それをもとに BSVAR_ で始まる「リファレンス名」が自動で作られます。
| 名前 | 例 | 役割 |
|---|---|---|
| 「表示名」 | スコア | 一覧などに表示される、人間向けのわかりやすいラベル |
| 「リファレンス名」 | BSVAR_score | コマンドビルダーなどで実際に値を呼び出すときに使う名前 |
たとえば「表示名」に スコア と入れると、「リファレンス名」は BSVAR_score のように自動生成されます。この BSVAR_ という頭の文字が、「これは保存され続ける永続変数です」という目印になっています。
頭に BSVAR_ が付いていない名前は、永続変数ではなく一時変数として扱われ、コマンドの実行が終わると値が消えてしまいます。値を保存しておきたいときは、必ずストレージ画面で作成した BSVAR_ 付きの変数を使ってください。
スコープ — 値を共有する範囲を決める
永続変数を作るとき、いちばん大切な設定が「スコープ」です。スコープは、その変数の値をどの範囲で共有して覚えておくかを決めるもので、次の 3 つから選びます。
| 選択肢(画面の表示) | 共有される範囲 | わかりやすい例 |
|---|---|---|
| 「グローバル(Global)」 | Bot 全体で 1 つの値を共有 | Bot 全体の累計実行回数 |
| 「サーバー毎(Guild)」 | Discord サーバー(ギルド)ごとに別々の値 | サーバー内のランキング、サーバーごとの設定 |
| 「ユーザー毎(User)」 | Discord ユーザーごとに別々の値(サーバーをまたいで共通) | 各ユーザーの通算成績、個人の所持ポイント |
イメージしやすいように、同じ「スコア」という変数で考えてみます。
- 「グローバル(Global)」にすると、誰がどのサーバーで使っても、同じ 1 つのスコアを共有します。
- 「サーバー毎(Guild)」にすると、サーバー A のスコアとサーバー B のスコアは別々に記録されます。
- 「ユーザー毎(User)」にすると、ユーザーごとに自分専用のスコアを持ち、別のサーバーで使っても同じ自分の値が引き継がれます。
スコープは後から変えると保存先が変わり、それまでの値が引き継がれないことがあります。作成時に慎重に選んでください(global=全体共有 / guild=サーバーごと / user=ユーザーごと)。
「ユーザー毎(User)」のスコープは、サーバーに属さない DM(ダイレクトメッセージ)でも動きますが、「サーバー毎(Guild)」のスコープはサーバーの情報が必要なため、DM では値を保存できません。サーバーを前提にした変数は、サーバー内で実行されるコマンドで使ってください。
データタイプ — 保存する値の種類
スコープと並んで、変数を作るときに選ぶのが「データタイプ」です。これは、その変数にどんな種類の値を入れるかを表します。データタイプには次の種類があります。
| 選択肢(画面の表示) | 入れられる値 | 例 |
|---|---|---|
| 「文字列(String)」 | 文章や言葉などの文字 | あいさつ文、ニックネーム |
| 「数値(Number)」 | 数字 | ポイント、回数、レベル |
| 「真偽値(Boolean)」 | true(はい) か false(いいえ) の二択 | 機能のオン/オフ、フラグ |
| 「オブジェクト(Object)」 | 複数の項目をまとめた、ひとかたまりのデータ | プロフィール(名前・年齢・称号など) |
| 「ユーザー(User)」 | Discord ユーザーへの参照 | 最後にコマンドを使った人 |
| 「チャンネル(Channel)」 | Discord チャンネルへの参照 | 通知を送るチャンネル |
| 「サーバー(Guild)」 | Discord サーバーへの参照 | 連携先のサーバー |
| 「ロール(Role)」 | Discord ロールへの参照 | 付与する役職 |
「データタイプ」を選ぶと、その下の「デフォルト値」(初期値)の入力欄が、選んだ型に合わせて変わります。たとえば「数値(Number)」なら数字専用の入力欄に、「真偽値(Boolean)」なら true / false を選ぶ欄になります。デフォルト値は、まだ一度も値が書き込まれていないときに使われる最初の値です(入力は任意です)。
データタイプを指定しなかった場合や、想定外の値が入った場合は、自動的に「文字列(String)」として扱われます。
オブジェクト型のプロパティ
「オブジェクト(Object)」型は、複数の項目をひとまとめにして保存できる型です。たとえば「プロフィール」という 1 つの変数の中に、「名前」「レベル」「称号」といった項目をまとめて持たせられます。
オブジェクト型では「プロパティ」を定義し、「プロパティ追加」で項目を 1 つずつ追加して、それぞれに「キー名」(項目の名前)・「型」・「初期値」を設定します。1 つのオブジェクト型変数に追加できるプロパティは最大 50 個までです。
同じキー名のプロパティを 2 つ作ると、後から定義したほうの値で上書きされ、エラーにはなりません。キー名はそれぞれ重複しないように付けてください。
よく使う項目の組み合わせは、別途「データ型」として登録しておくと、オブジェクト型の変数を作るときに再利用できます。データ型の詳しい作り方はデータ型をご覧ください。
ユーザー型・チャンネル型で指定する「ごとのデータタイプ」
「ユーザー(User)」型または「チャンネル(Channel)」型を選んだときは、追加で「ユーザー/チャンネルごとのデータタイプ」を指定します。これは「各ユーザー(またはチャンネル)に、どんな種類のデータをひもづけて保存するか」を決める設定です。文字列・数値・オブジェクトなどのほか、自分で作ったデータ型も選べます。
永続変数を作成する
永続変数の実体は、すべてストレージ画面で作成します。ここでは流れの概要だけ紹介します。
ストレージ画面を開く
Bot の管理画面で、左メニューの「データストレージ」(画面上部のメニューでは「ストレージ」)を開きます。
「変数」タブで作成を始める
「変数」タブを開き、右上の「新しい変数を作成」をクリックします。
表示名を入力する
「表示名」に分かりやすい名前を入力します。入力すると、「リファレンス名」に BSVAR_ 付きのキーが自動で作られます(リファレンス名は直接編集できません)。
データタイプとスコープを選ぶ
「データタイプ」で保存する値の種類を選び、「スコープ」で値を共有する範囲(global / guild / user)を選びます。
必要に応じて設定を整える
必要であれば「デフォルト値」(初期値)を入力します。オブジェクト型の場合は「プロパティ追加」で項目(キー名・型・初期値)を定義します。
保存する
「保存」をクリックすると「変数を保存しました」と表示されます。作成した変数は「全変数一覧」に追加されます。
作成済みの変数を編集するには一覧の鉛筆アイコンをクリックし、削除するには編集画面の左下にあるゴミ箱アイコンをクリックします。これらの操作の詳細はストレージで説明しています。
コマンドの中で永続変数を使う
作成した永続変数は、コマンドビルダーで組み立てるコマンドやイベントの中から参照できます。参照するときは、ストレージ画面で自動生成された「リファレンス名」(BSVAR_ で始まる名前)を、中括弧で囲って書きます。
たとえば「リファレンス名」が BSVAR_score の変数なら、メッセージや式の中で次のように書くと、その時点の値に置き換わります。
あなたの現在のスコアは {BSVAR_score} です。値を読み取るだけでなく、コマンドビルダーのノードを使って値を書き換えることもできます。
- 値を上書きして保存する(代入)
{BSVAR_score} + 1のように、今の値をもとに計算して保存する(加算など)- 値を初期値に戻す(削除・リセット)
これらの具体的なノードの選び方や式の書き方は、コマンド内での変数の使い方で詳しく解説しています。
コマンドビルダーで参照するときは、必ず「リファレンス名」(BSVAR_ 付き)を使ってください。表示名(例: スコア)をそのまま中括弧で囲っても、永続変数としては認識されません。
オブジェクト型の変数では、{BSVAR_profile.level} のように .(ドット)でプロパティ名をつなげて、中の項目を個別に参照できます。
実際の動作と既定値
ここでは、コマンドの実行中に永続変数がどのように読み書きされるか、実際の挙動と初期値の決まり方をまとめます。
値の読み取り(参照)
メッセージや式の中で {BSVAR_score} のように書くと、Bot はその時点の値を探して文字に置き換えます。値の決まり方は次の順序です。
保存済みの値があればそれを使う
過去にそのスコープ(全体 / サーバー / ユーザー)で値が書き込まれていれば、その保存値をそのまま使います。
なければデフォルト値(初期値)を使う
まだ一度も書き込まれていない場合は、ストレージ画面で設定した「デフォルト値」が使われます。
参照に使った名前(リファレンス名)に対応する変数が見つからない場合は、置き換えが行われず、{BSVAR_score} のような文字がそのままメッセージに表示されます(対処は「注意点・うまくいかないとき」を参照)。
値の書き込み(代入・計算・リセット)
コマンドビルダーのノードで永続変数を書き換えると、次のように動きます。
- 代入(上書き): 指定した値で変数を上書きし、保存します。次回以降のコマンド実行でも、その新しい値が引き継がれます。
- 計算(加算など):
{BSVAR_score} + 1のように今の値をもとに計算し、結果を保存します。今の値がまだ書き込まれておらずデフォルト値も未設定の場合は、数値なら0、真偽値ならfalse、文字列なら空文字から計算を始めるので、{BSVAR_count} + 1のような書き方が初回でも崩れません。 - 削除(リセット): 保存していた値を取り消し、その変数をデフォルト値に戻します。同じコマンドの後続のノードでも、以降は初期値として扱われ、次回以降の実行でも(再び書き込むまでは)デフォルト値のままになります。
デフォルト値を設定していない変数を「削除(リセット)」すると、戻る先の値が無いため、その後の参照では値が空のまま(None と表示される場合があります)になります。リセットして使う変数には、デフォルト値を設定しておくことをおすすめします。
入力された値の扱い(型ごとの自動変換)
変数に書き込む値は、変数のデータタイプに合わせて自動で整えられます。
- 真偽値(Boolean):
true/yes/on/1のいずれか(大文字・小文字は区別しません)を書き込むと「はい(true)」になります。それ以外の値(空文字を含む)はすべて「いいえ(false)」になります。 - 数値(Number): 数字として読み取れない値(たとえば
abc)を書き込もうとすると、エラーにはならず0として保存されます。意図しない0を避けるため、数値型の変数には数字だけを渡すようにしてください。
Discord の対象を指す変数(ユーザー・チャンネルなど)
「ユーザー(User)」「チャンネル(Channel)」「ロール(Role)」「サーバー(Guild)」型の変数は、対象そのものへの参照として保存されます。コマンドの中では、メンション(<@123...> のような形)や名前を取り出して表示できます。
参照先の対象がすでに見つからなくなっている場合(ユーザーがサーバーを抜けた、チャンネルやロールが削除されたなど)でも、メンションや ID は引き続き利用できますが、名前を取り出そうとすると 不明 と表示されます。
一時変数(BSVAR_ なし)との違い
BSVAR_ が付いていない名前をコマンドビルダーで使うと、その値はそのコマンドの実行中だけ保持され、コマンドが終わると消えます。データベースには保存されないため、次にコマンドが実行されたときには残っていません。計算の途中結果やその場限りのメモにはこれで十分ですが、ポイントや勝敗のように覚えておきたい値には必ず BSVAR_ 付きの永続変数を使ってください。
ストレージ画面で作成していない BSVAR_ 付きの名前をコマンドの中で書き込もうとしても、保存は行われません。Discord 上にエラーは出ず、その名前の参照は {BSVAR_score} のような文字のまま残ります。永続変数は必ずストレージ画面で先に作成してください。
上限と同時アクセス時の挙動
| 項目 | 内容 |
|---|---|
| オブジェクト型のプロパティ数 | 1 変数あたり最大 50 個 |
| コマンド 1 回の実行時間 | 最大 30 秒(超えると中断) |
| コマンド 1 回の処理ステップ数 | 最大 5000 ステップ(繰り返しは回数分を消費) |
複数のコマンドが同時に同じ永続変数を計算で書き換えても(たとえば多くのユーザーが同時にポイントを加算しても)、計算は順番に処理され、更新が打ち消し合うことはありません。{BSVAR_count} + 1 のような加算が同時にたくさん走っても、最終的な合計は正しく積み上がります。
表示されるメッセージ
永続変数の読み書きそのものについて、Bot が Discord 上に専用のメッセージを出すことは基本的にありません。値の参照は静かにメッセージへ反映され、書き込みも画面上には特別な通知なく行われます。
ただし、変数の保存に失敗するなどコマンドの実行自体がエラーになった場合は、次の一般的なメッセージが表示されます。
コマンドの実行中にエラーが発生しました。このメッセージが出たときは、しばらく待って再度コマンドを実行すると解消することがあります。
注意点・うまくいかないとき
DM(ダイレクトメッセージ)では「サーバー毎(Guild)」の変数を保存できません。 DM にはサーバーの情報が無いため、サーバー単位で保存する変数への書き込み・削除・計算は行われません。このとき Discord 上にはエラーは表示されませんが、値は更新されません。DM でも使いたい値は「ユーザー毎(User)」または「グローバル(Global)」のスコープで作成してください。
- 値が
{BSVAR_...}のまま表示される: その名前の変数がストレージ画面で作成されていないか、リファレンス名のつづりが違っている可能性があります。「全変数一覧」に表示されているか、コマンド側で正しいリファレンス名を使っているかを確認してください。 - 数値が意図せず
0になる: 数値型の変数に、数字として読めない値を書き込んだ可能性があります。渡している値が数字になっているか確認してください。 - 対象の名前が
不明と表示される: ユーザー・チャンネル・ロール・サーバーを指す変数で、参照先がすでに削除・退出済みのときに起こります。メンションや ID は引き続き使えます。 - 一時的に古い値や初期値が表示される: ごくまれにデータの取得に時間がかかると、その場ではデフォルト値で動作を続けることがあります。多くの場合、次回の実行で本来の値に戻ります。
コマンドの中で使える操作(ノード)
コマンドビルダーでは、永続変数に対して次の操作(ノード)が使えます。式やノードの詳しい書き方はコマンド内での変数の使い方をご覧ください。
| 操作 | できること |
|---|---|
| 値を代入する | 変数に値を上書きして保存します。BSVAR_ 付きで作成済みの変数なら永続化され、それ以外は実行中のみ保持されます。 |
| 値を計算して保存する | 今の値をもとに計算(加算など)し、結果を保存します。同時実行でも更新が打ち消し合いません。 |
| 値をリセットする | 保存していた値を取り消し、変数をデフォルト値に戻します。 |
反映のタイミング
新しく作った変数をコマンドの中で参照しても値が出てこないときは、まず変数を保存できているか(「全変数一覧」に表示されているか)を確認してください。それでも反映されない場合は、コマンドを保存し直すか Bot を再起動すると確実に反映されます。
次のステップ / 関連ページ
- ストレージ — 変数を実際に作成・編集・削除する画面の詳しい操作
- 変数の概要 — BotShade の変数全体の考え方
- 一時変数 — コマンド実行中だけ使う変数
- データ型 — オブジェクト型で使う独自データ型の作り方
- コマンド内での変数の使い方 — 式やノードでの永続変数の書き方
- コマンドビルダーの概要と使い方 — コマンドの組み立て方