/create
シナリオテンプレートからカテゴリー/チャンネル/ロールを一括生成するコマンド
/create category
事前に用意したシナリオテンプレートを元に、カテゴリー・チャンネル・(必要なら)ロールを一括で作成します。サーバー管理権限が必要です。
基本的な使い方
/create category scenario: ホテル殺人事件
# 新規ロールを自動作成する場合
/create category scenario: ホテル殺人事件 new_role_name: プレイヤー
# 既存ロールを使う場合
/create category scenario: ホテル殺人事件 role: @プレイヤー
# テンプレのスレッド URL を直接指定する場合(後方互換)
/create category thread: https://discord.com/channels/<guild>/<channel>
# 単体メッセージにテンプレを書いて URL 末尾に msg ID を含めた URL を渡す場合
/create category thread: https://discord.com/channels/<guild>/<channel>/<msg>
パラメータ
- scenario ― シナリオ(オートコンプリートで候補を選択)。
threadと排他。 - thread ― テンプレが書かれた スレッド URL(msg ID 無し)または メッセージ URL(末尾に msg ID 付き)を直接指定。後者の場合はその 1 メッセージだけがテンプレとして読まれます。
scenarioと排他。
指定できるのは「同じサーバー内」かつ「実行するあなた自身が閲覧できる」スレッド / メッセージだけです(Bot の権限で、自分に見えていないチャンネルの中身を読み出せてしまわないようにするため)。プライベートスレッドの場合は、そのスレッドに参加していること(またはスレッド管理権限を持つこと)も必要です。 - role ― 既存ロールを指定。
new_role_nameと排他。 - new_role_name ― 新しいロールを作って割り当て。同名が既にあれば
(2)等の接尾辞を自動付与。roleと排他。
scenario / thread はいずれか一方を必ず指定します(両方指定はエラー)。role / new_role_name のどちらも未指定の場合はロール紐づけなしで作成され、全てのチャンネルは管理権限者のみ閲覧できる状態になります。ステージ分割テンプレ(
=== stage === 区切りを含む)の場合は、admin パネル設置のため role または new_role_name の指定が必須です。
テンプレート記法
シナリオをオートコンプリートに載せるための基本運用と、テンプレの書き方を説明します。
基本運用
- サーバーに「テンプレート収納チャンネル」を 1 つ作成する(例:
#シナリオテンプレ) - 各シナリオを スレッド として立てる(スレッドタイトル = オートコンプリートに出る表示名)
- スレッドの先頭に
category: <カテゴリー名>を書く - 以降、下記の統一パーサ仕様に沿ってチャンネル情報を並べる
統一パーサ仕様
Bot はテンプレ全体(スレッドの全メッセージ、または単体メッセージ URL なら 1 メッセージのみ)を上から走査し、各行を以下のルールで解釈します。1 メッセージで完結する書き方も、メッセージごとに分割する書き方も、すべて同じルールでパースされます。
- 1 行目の
category: <カテゴリー名>はメタ情報として抽出 [name] | type | perms形式の行は 新しいチャンネルの開始(同じメッセージ内に複数置いても OK)=== stage ===行は ステージ区切り(詳細はステージ分割)- Discord メッセージ URL(
https://discord.com/channels/.../.../...)が単独で 1 行ある場合は、直前のチャンネルの本文として そのメッセージをコピー(中身がコピーされる、リンクではなく)。
コピー元にできるのは 同じサーバー内かつ 実行する人自身が閲覧できるメッセージだけです(プライベートスレッドなら、参加していること、またはスレッド管理権限を持つことも必要)。判定条件はthreadパラメータに直接指定する場合と同一です。この判定は「そのとき実行した人」で行います — ステージ分割テンプレで別の管理者がボタンを押した場合、その人が読めないチャンネルのコピーは失敗します(テンプレ本文は後から編集できるため、作成者ではなく実行者を基準にしています) - 同じメッセージ内のその他の平文テキストは、直前のチャンネルの本文としてそのまま投稿
- メッセージに添付ファイルが付いている場合は、そのメッセージが最後に書き込んだチャンネル 1 つの末尾に、まとめて添付として送信します。「書き込んだ」とは、同じメッセージ内でヘッダー行によって開いたチャンネル、または同じメッセージ内のメッセージ URL・本文テキストを追加した(継続中の)チャンネルのことです。ただし本文テキストだけで帰属先になれるのは、そのメッセージにテンプレ要素(ヘッダー行 / メッセージ URL /
=== stage ===)が 1 つ以上ある場合に限ります(平文と添付しか無いメッセージは丸ごと memo 扱いになり、本文も添付も送信されません ― 下記 transfer guard)。1 つのメッセージに複数のチャンネルヘッダーを書いた場合、添付が付くのは最後のチャンネルだけです(先頭のチャンネルや全チャンネルには付きません)。メッセージ末尾に=== stage ===が来てステージが切り替わっても、添付の送り先は変わりません添付を確実に狙ったチャンネルへ入れたいなら、添付付きのメッセージには対象チャンネルを 1 つだけ書くのが安全です(複数チャンネルをまとめて書いたメッセージに添付を足すと、意図しない部屋へ入ります)。 - 逆に、そのメッセージが何も書き込んでいない場合は添付を送信しません(添付だけのメッセージ/平文テキスト + 添付だけのメッセージ/
=== stage ===だけ + 添付 のメッセージなど)。平文 + 添付のケースでは平文の方も送信されません(メッセージ全体が memo 扱いになるため、両方まとめて失われます)。区切り行はテンプレ要素ですが「チャンネルへの書き込み」ではないため、添付の送り先にはなりません ― 下記 transfer guard 参照
後ろに混入した雑談・配布物の自動除外(transfer guard)
テンプレを書き終えた後、シナリオ準備中に作業メモ・transfer された他鯖の雑談・運用メモなどがスレッドの後ろに残ることはよくあります。これらが既存チャンネルの本文に混入して事故が起きるのを防ぐため、以下のメッセージ単位の guard が効きます:
- テンプレ要素(チャンネルヘッダー
[name] | .../ ステージ区切り=== stage ===/ Discord メッセージ URL)が 1 つもないメッセージは memo 扱いでスキップされます - 添付ファイルはテンプレ要素に数えません。添付だけのメッセージは memo 扱いでスキップされ、どのチャンネルにも送信されません(テンプレを書き終えた後に投げた画像・配布物が最後のチャンネルへ流れ込む事故を防ぐため)。添付をチャンネルに載せたい場合は、チャンネルヘッダー行またはメッセージ URL と同じメッセージに添付してください(
=== stage ===だけを含むメッセージに添付しても、区切り行は「書き込み」ではないため送信されません) - memo メッセージが 2 件連続した時点でテンプレ解析を打ち切ります(以降のメッセージは無視)
- 結果として、最後のチャンネルヘッダ以降に「あとで権限変える」「次回までに考えとく」のような素テキストだけのメッセージが続いても、それらは どのチャンネルにもコピーされません
[name] | ... と本文を 同じメッセージ内に書く必要があります(旧 multiline 互換)。後続メッセージで本文を追記したい場合は、Discord メッセージ URL を 1 つでも含めるか、新しいヘッダ行を入れてください(添付ファイルはテンプレ要素に数えないため、添付だけのメッセージでは継続できません)。
シンプルな例(1 メッセージで完結)
――― 共有部屋 ―――
[全体連絡] | text | allow_view
https://discord.com/channels/.../.../1111...(コピー元メッセージリンク)
https://discord.com/channels/.../.../2222...
――― キャラ別部屋 ―――
[キャラA] | text | allow_write
https://discord.com/channels/.../.../3333...
[キャラB] | text | allow_write
https://discord.com/channels/.../.../4444...
- 装飾行(
―――など)はチャンネルが開かれていない区間(先頭)では無視される - 各
[name] | ...で新しいチャンネルが開始 - メッセージ URL がそのチャンネルにコピーされる
1 メッセージ = 1 チャンネルの例(メッセージ分割)
category: ホテル殺人事件
(msg 2)
[全体連絡] | text | allow_view
https://discord.com/channels/.../.../1111...
(msg 3)
[キャラA] | text | allow_write
本文テキストもコピーできます
https://discord.com/channels/.../.../2222...
- 各メッセージの 1 行目 がチャンネルヘッダーになっていれば従来の Multiline 形式と同じく動きます
- 2 行目以降は本文(テキスト・メッセージ URL・添付)として上から順に投稿されます
- 本文は 同じメッセージ内で完結させるのが基本です。後続メッセージで本文を追記したい場合、その msg に Discord メッセージ URL(または新しいチャンネルヘッダー / ステージ区切り)のいずれかを含める必要があります。素テキストだけ・添付だけの後続メッセージは 後述の transfer guard によって memo 扱いとなり、どのチャンネルにもコピーされません
ステージ分割
シナリオの進行に合わせて、チャンネルを 段階的に開放したい場面で使う仕組みです。テンプレ内に === stage === 区切り行を挟むと、初回の /create category 実行では 1 ステージ目のチャンネルだけが作成され、以降は admin チャンネルの「次のステージを作成」ボタンで順次開放できます。
区切り行の書式
正規表現 ^\s*=+\s*stage(?:\s+\d+)?\s*=+\s*$ (case insensitive)にマッチする行が区切りとして扱われます。例:
=== stage 1 ===
=== STAGE 2 ===
====== stage ======
括弧内の数字(1, 2 …)は あくまでメモ用で、Bot 側のステージ番号付けには使いません(実際の番号は出現順で 1, 2, 3 ... が割り振られる)。
テンプレ例(3 ステージ)
# ステージ 1: 開幕時に開く部屋
[全体連絡] | text | allow_view
https://discord.com/channels/.../.../1111...
[キャラA] | text | allow_write
[キャラB] | text | allow_write
=== stage 2 ===
# ステージ 2: 中盤に開放
[事件現場] | text | allow_view
https://discord.com/channels/.../.../2222...
[推理ボイス] | voice | allow_speak
=== stage 3 ===
# ステージ 3: 終盤の真相パート
[真相] | text | allow_view
https://discord.com/channels/.../.../3333...
動作
- /create category 実行時にテンプレ全体を解析し、ステージ数を確認
- カテゴリ作成 → ステージ 1 のチャンネルを作成 → カテゴリ末尾に admin チャンネル(管理者専用)を作成
- admin チャンネルに 「招待リンクを発行」ボタン + 「⏭️ 次のステージを作成 (n/N)」ボタン + 進捗表示パネルを設置
- パネルには「📊 進捗: 1 / N ステージ完了」と 次のステージで作成されるチャンネル一覧を表示
- 「次のステージを作成」を押すと確認モーダル → 「✅ 実行」で次ステージのチャンネルが作成される
- 各ステージ完了後、admin チャンネルは カテゴリの末尾に再配置される(新規ステージのチャンネルが間に入っても admin が必ず最下段に)
- 全ステージ完了でパネル本文が「✅ 全 N ステージ完了」に変わり、次ステージボタンが消える
このボタンは何ができる?
- ボタン押下時にテンプレを 毎回再 fetch するため、シナリオ進行中にテンプレ側の本文を編集すれば反映できます(ヘッダー文法は引き続き有効である必要あり)
- 編集してよいのは「まだ作成していないステージ」だけです。未作成ステージのチャンネル追加・削除・リネーム、本文やコピー元 URL の差し替えは自由に行えます
- 一方、作成済みステージの構成を変えると次ステージの実行が拒否されます。Bot はボタン設置時に「作成済みステージの構成」を要約した値を
custom_idに埋めており、押下時に再解析した内容と突き合わせます。=== stage ===の増減だけでなく 区切りの移動(チャンネルヘッダーを別ステージへまたがせる編集)や、作成済みステージ内のチャンネル追加・リネームもここで検知され、エラーで止まります - これは「どのステージが未作成か」を特定できなくなる状態を防ぐためです(作成済みステージへ移したチャンネルは永久に作られず、逆に作成済みステージから出したチャンネルは次の実行で二重に作られてしまいます)。止まった場合は、作成済みステージの部分を元に戻すか、残りを手動で作成してください
- Bot が再起動しても、ボタンの
custom_idにテンプレ source・カテゴリ ID・次のステージ番号がエンコードされているので、復活後のクリックで動作します(DB 不要) - 同一カテゴリで誰かが「次のステージを作成」処理中に他の人がボタンを押すと、「他のユーザーが実行中」と即拒否されます(in-memory ロック、再起動でリセット)
- 古いボタン(連投で出た古い ephemeral 等)から押した場合は 「古いボタンです」と拒否されます(パネルの最新ボタンの ID と照合する stale-click 検知)
制約・注意
- ステージ分割テンプレを実行するときは
roleまたはnew_role_nameの指定が必須です(admin パネルを設置するための admin チャンネルが、ロール紐付けカテゴリでないと意味を持たないため) - 各ステージのチャンネル数は 1 ステージあたり 30 個まで(ステージごとに上限が適用される)
- ステージ実行時にテンプレが消えていた / ロールが消えていた / カテゴリが消えていた等の場合は ephemeral でエラーが返り、パネルのボタンは残されます(テンプレ復活後に再度押せる余地を残すため)
- ステージ番号順に 1 ステージずつしか実行できません(途中スキップは不可)
チャンネルヘッダーの詳細
ヘッダー行の書式
書式は [<name>] | <attr> | <attr> ...。属性は | 区切りで順不同。
型(省略時は text)
- text ― テキストチャンネル
- voice ― ボイスチャンネル
権限プリセット(必須)
text 用:
- private ― 指定ロールにも非公開(管理権限者のみ閲覧可)
- allow_view ― ロールに閲覧 + メッセージ履歴読み取りを付与
- allow_write ― 上記 + メッセージ送信を付与
- allow_all ― 現状
allow_writeと同義
voice 用:
- private ― 指定ロールにも非公開(管理権限者のみ閲覧可)
- allow_view ― ロールに閲覧のみ付与(接続は不可)
- allow_speak ― ロールに閲覧 + 接続 + 発言を付与
- allow_all ― 現状
allow_speakと同義
# ではなく [ ] で括るのは、Discord が #name を自動的にチャンネルリンクへ変換してしまうのを回避するためです。
/create scenario reload
オートコンプリートの候補 cache を即時再取得します。新しいシナリオを追加してすぐ反映したい場合などに使います。サーバー管理権限が必要です。
基本的な使い方
cache の仕組み
- 候補は 1 時間ごとに自動で再取得されます(TTL 1h)。
- スレッドがデフォルト 24 時間で自動アーカイブされるギルドでも、オートコンプリートにはアーカイブ済みスレッドも含まれます。
- Bot 再起動直後の初回オートコンプリートは、先に active なスレッドのみで候補を返し、アーカイブ済みスレッドはバックグラウンドで追加取得します。2 回目以降のオートコンプリートで統合版が出ます。
- 新規シナリオを追加してすぐ候補に反映したい場合は /create scenario reload を叩くと即時 refresh されます。
応答に表示される情報
- 候補数 ―
category:メタが通ったスレッド数(オートコンプリートに出るもの)。 - parse 破綻予兆のあるシナリオ一覧 ― 軽量 dry-run で判定した怪しいスレッド。先頭数件のメッセージ内に
[name] | ...チャンネルヘッダが 1 行も見つからないものが報告されます(統一パーサで 0 チャンネルになるため、実行時に必ずエラーになる候補)。
UI フロー
初回実行の流れ
- /create category を実行する
- 解析結果がエフェメラル(自分だけに見える)で表示される。カテゴリー名・チャンネル一覧(ステージ分割テンプレならステージごとに区切って表示)・ロール情報を確認
- 「✅ 実行」ボタンを押すと作成が始まる
- カテゴリ作成 → ステージ 1 のチャンネル作成 → admin チャンネル設置 のサマリーが表示される(単一ステージなら全チャンネルが作られる)
ただし巻き戻しの削除自体に失敗した場合(途中で Bot の権限が外れた等)は、残骸とロールが残り、片付くまで /create category の再実行がブロックされます(残骸の扱いはステージ分割の「ステージ実行」を参照)。この場合ロールは残骸を消し切った時点で自動削除されます。
ステージ実行の流れ(ステージ分割テンプレのみ)
- カテゴリ末尾の
#adminチャンネルを開く。閲覧できるのは チャンネル作成時点でサーバー管理(Manage Server)権限を持っていたロールの保持者と 管理者(Administrator)権限の保持者で、それ以外には見えません - パネルにある「⏭️ 次のステージを作成 (n/N)」ボタンを押す
- 確認 view が出るので「✅ 実行」を押すと次ステージのチャンネルが作成される
- パネル本文の進捗表示が更新され、admin チャンネルが再びカテゴリ末尾に移動する
- 全ステージ完了でボタンが消え、「✅ 全 N ステージ完了」と表示される
#admin の閲覧権限はチャンネル作成時にロール単位で固定されるのに対し、ボタンの認可は押した時点で判定するためです。ズレは 2 方向あります。
- 見えるが押せない: 閲覧の許可はロールに対して付くため、そのロールからサーバー管理権限だけを後で外した場合、保持者は引き続き
#adminを開けます。ただしボタンは押せません(「権限がありません」で断られます)。 - 押せるが見えない: チャンネル作成後にサーバー管理権限を付けたロールには閲覧の許可が付いていないため、管理者(Administrator)権限も持っていなければ
#adminが見えません。この場合は#adminのチャンネル権限に当該ロールを手で追加してください。
ボタン
- ✅ 実行 ― 即座に作成を開始。レート制限を消費(初回 /create category 確認画面のみ)。同じ人の初回作成は同時に 1 件だけで、実行中に別の確認画面から押すと「まだ実行中です」と断られます(クールタイムのすり抜け防止)
- 🔍 詳細プレビュー ― 解析結果の詳細(チャンネルごとのコンテンツ一覧・コピー元情報など)を表示。作成はしない・レート制限を消費しない
- 🎟️ 招待リンクを発行 ― admin パネル上のボタン。モーダルで日数 / 人数を指定して発行。発行リンクから参加した人 or 既参加者がクリックした人に対象ロールが自動付与される
- ⏭️ 次のステージを作成 (n/N) ― ステージ分割テンプレ専用。押下 → 確認 view → 実行で次ステージのチャンネル作成
制限事項
権限
- 「サーバーを管理」(Manage Server)権限の保持者のみ実行できます(/create category / /create scenario reload 共通)。
- Bot 側に「チャンネルの管理」権限が必要です。
new_role_nameを指定する場合は「ロールの管理」権限も必要です。
回数制限
- 1 日あたりの実行回数制限はありません(以前は 1日5回まででしたが撤廃されました)
- 連続実行は 60 秒の冷却時間があります(同一サーバー内の同一ユーザー)
- 詳細プレビューは冷却時間を消費しません
スレッド / チャンネル数
- スレッドの読み取りは 200 投稿が上限です。これを超えていると、続きのチャンネル定義を読み取れないため次のように扱われます(ちょうど 200 投稿の場合は「超過」になりません)
扱いが分かれるのは 読み取れた 200 投稿の中に
=== stage ===があるかどうかで、テンプレ全体の構成ではありません。- 読めた範囲に区切りが無い(単一ステージとして解析された)― この 1 回で全部作って完了になり、取りこぼしに後から気付く手段が無いため、実行を中止します。何も作られないので、下記の方法で 200 投稿以内に収めればそのまま実行できます。
ステージ分割テンプレでも、最初の=== stage ===が 200 投稿目より後ろにある場合はこちらに該当します(区切りが読めていないため、Bot からは単一ステージのテンプレと区別が付きません) - 読めた範囲に区切りがある ― 読めている範囲のステージは実行できますが警告が出ます。解析できた最後のステージを実行しようとした時点で中止されるので、それまでに 200 投稿以内へ収めてください
- 読めた範囲に区切りが無い(単一ステージとして解析された)― この 1 回で全部作って完了になり、取りこぼしに後から気付く手段が無いため、実行を中止します。何も作られないので、下記の方法で 200 投稿以内に収めればそのまま実行できます。
- 1 ステージあたりに作成できるチャンネル数は 30 が上限です(ステージ分割テンプレなら各ステージごとに 30 まで OK)
- ただし全ステージは 同じカテゴリーに積まれるため、Discord のカテゴリー上限(50 チャンネル)も同時に効きます。admin チャンネル 1 枠を差し引き、テンプレ全体で最大 49 チャンネルまでです(例: 30 + 30 は 1 ステージあたりでは合法でも、合計 60 で上限超過となり実行前にエラーになります)
ヘッダー解析エラー
- 不明なキーワード、型と権限の不整合、権限プリセット未指定などがあると実行はブロックされます
- エラー内容がエフェメラルで表示されるので、タイポを修正してから再実行してください
コピー元の制約
- メッセージ URL でコピーできるのは コマンドを実行したギルド内のメッセージに限ります(別ギルドや DM の URL は拒否されます)
- Bot がそのチャンネルを読める必要があります
- メンションは無効化されて投稿されます(意図せぬ通知を防ぐため)
ロール
role指定時: そのロールをカテゴリーに紐づけて private 化(@everyoneは閲覧不可)new_role_name指定時: ロールを新規作成してから紐づけ。同名が既にあれば(2)/(3)などの接尾辞を自動付与- 両方省略時: ロール紐づけなし、全てのチャンネルは管理権限者のみ閲覧可
- ステージ分割テンプレでは role / new_role_name のいずれかが必須(admin パネル設置のため)
ステージ実行
- ステージは順番にしか実行できません(途中スキップは不可)
- 同一カテゴリの「次のステージを作成」は in-memory ロックで並行実行をガード(同時 2 押しは「他のユーザーが実行中」で 1 つだけ実行)
- ボタンは Bot 再起動後も動作します(ステージ情報が
custom_idに内蔵されているため) - テンプレ source(スレッド or 単体メッセージ)が削除済みの場合や、ロール / カテゴリが削除済みの場合はエフェメラルでエラー。パネルのボタンは残されます
- チャンネル作成やコンテンツ投稿が 1 件でも失敗した場合、そのステージは「未完了」のままになり、進捗もボタンも進みません。さらに その試行で作成したチャンネルは自動的に削除されて巻き戻されます(「チャンネルはあるが中身が入っていない」半端な状態を残さないため)
- したがって、原因(Bot 権限・カテゴリーのチャンネル上限・コピー元の消失など)を解消してから 同じボタンをもう一度押せば、そのステージがまるごと作り直されます(コンテンツも改めて投稿されます)。コピー元メッセージが消えている場合は、テンプレ側を編集すれば次の押下で編集後の内容が使われます
- 添付ファイルのコピーに失敗した場合も失敗として扱われます(添付だけのブロックが落ちて「中身が空のチャンネル」が残るのを防ぐため)
- まれに ステージ作成には成功したがパネルの進捗表示だけ更新できなかった場合も、同様に作成分を巻き戻して未完了に戻します(進捗表示がズレたまま二重作成になるのを防ぐため)。しばらく待ってから同じボタンを押し直してください
- つまり 「ステージ作成 + パネル更新」がすべて成功したときだけ完了扱いになり、途中で失敗した場合は巻き戻しが成功した範囲で何も作られていない状態に戻ります(巻き戻しの削除自体に失敗したときだけは残骸が残るので、次の項目の案内に従ってください)
- まれに 巻き戻しの削除自体に失敗した場合(Bot の権限が途中で外れた等)は、残ったチャンネル名が表示され、それが消えるまで次ステージの実行と /create category の再実行がブロックされます(残骸に加えて新規作成すると重複するため)。実行のたびに自動で再削除を試みるので、一時的なエラーならそのまま押し直せば解消します。解消しない場合は表示されたチャンネルを手動で削除してください。なお自動作成したロールを残骸に紐づけて後で消すのは、初回作成(/create category)の巻き戻しで残った残骸に限ります(残骸を消し切った時点で一緒に削除。消し忘れて
(2)付きの重複ロールが増えないようにするため)。ステージ 2 以降の巻き戻しではロールを消しません— その時点でロールは完了済みステージのチャンネルとカテゴリーで使われているためです - チャンネル作成の途中で Bot が再起動・停止した場合も、作成済みのチャンネルを記録してあるので、次にボタンを押したときに自動で片付けてから作り直します(そのステージが完了していたかどうかはパネルの進捗で判定するため、完了済みのステージが消されることはありません)。
ごく稀に「Discord 側では作られたが記録が間に合わなかった」チャンネルが残ることがあります。この場合は自動削除せず、そのチャンネル名を挙げて実行をブロックします(手で作ったチャンネルと見分けがつかないため、勝手に消しません)。中断で出来たものなら削除、必要なものならリネームしてから、もう一度ボタンを押してください