本ドキュメントは、オンライン人狼ゲーム支援システムにおける「botサーバー」(本部botバックエンド)が提供するAPIの仕様を定義します。
/game/setup リクエストに playerListChannelId (任意) を追加。プレイヤーリストメッセージの投稿先チャンネルをID指定できるようにしました。未指定時はまず botテスト、見つからない場合は 一般 を検索します。/game/setup説明: ゲームのタイトルを設定し、そのタイトルをカテゴリ名としてDiscord上にゲーム用のカテゴリと基本的なチャンネル(GM用、投票用など、役職チャンネルを除く)を作成します。通常、ゲーム開始前に最初に呼び出されるAPIです。
discordにてサーバーidの取得が必要。(開発者モードをONにする必要あり) コマンド打つのとどっちが簡素かちょっと要審議かも。
トリガー: スプレッドシートの [ゲーム準備開始] ボタン。
スプレッドシート処理: GMが入力したゲームタイトルをJSON化して送信します。
GMチャンネル, 投票チャンネル)を作成します。役職チャンネルは /role/list/add 受信時に作成されます。playerListChannelId が指定されていればそのチャンネルへ、指定がない場合はまず botテスト、なければ 一般 という名前のテキストチャンネルを探して投稿する。
{
"serverId": "123456789012345678", // DiscordサーバーID,
"gameTitle": "13ア式-5月5日",, // Discordカテゴリ名として使用
"playerListChannelId": "123456789012345678" // (任意) プレイヤーリスト投稿先のチャンネルID
}
/player/list/manual説明: JSON形式でプレイヤーリストを直接botサーバーに送信し、現在のゲームセッションのプレイヤーリストとして設定します。Discordのリアクション機能を使用せずにプレイヤーを登録したい場合や、テスト時に使用します。このAPIでリストが登録された場合、/player/list (リアクション経由) APIはこの手動登録リストを優先して返却します。/game/setup の後に呼び出します。
トリガー: スプレッドシートの [プレイヤーリスト手動登録] ボタン (新設)。
スプレッドシート処理: GMが入力またはシート上で管理しているプレイヤー情報(Discord ID, 表示名, プレイヤー番号)をJSON化して送信します。
/player/list APIはこの手動登録された情報を返すようになります。gameSession.roles の基本的なプレイヤー情報(Discord ID, 表示名, プレイヤー番号)もこのリストに基づいて更新されます。
[
{
"discordId": "123456789012345678",
"screenName": "手動登録ユーザーA",
"playerNumber": 1
},
{
"discordId": "987654321098765432",
"screenName": "手動登録ユーザーB",
"playerNumber": 2
}
// ... 他のプレイヤー
]
{
"message": "Player list manually registered successfully. X players.",
"registeredPlayerCount": 2,
"players": [
{ "discordId": "123456789012345678", "screenName": "手動登録ユーザーA", "playerNumber": 1 },
{ "discordId": "987654321098765432", "screenName": "手動登録ユーザーB", "playerNumber": 2 }
]
}
{
"message": "Validation failed for player list.",
"errors": [
"Player at index 0: discordId is missing or not a string."
]
}
/player/list説明: Discordの特定メッセージへのリアクション等に基づき、ゲーム参加者のDiscord ID、表示名、およびbotサーバー側で割り振られたプレイヤー番号のリストを取得します。/game/setup の後に呼び出します。
注記: /player/list/manual APIによってプレイヤーリストが手動登録されている場合、このAPIはDiscordのリアクション情報を参照せず、手動登録されたリストを返却します。
トリガー: スプレッドシートの [プレイヤーリスト取得] ボタン。
gameSession.roles の基本情報としても保存されます(手動リストがない場合)。スプレッドシート処理: 取得したリストを `メンバー` シートに反映させます。
[
{ "discordId": "123456789012345678", "screenName": "ユーザーA", "playerNumber": 1 },
{ "discordId": "987654321098765432", "screenName": "ユーザーB", "playerNumber": 2 }
// ... 他のプレイヤー
]
/role/list/add説明: スプレッドシートで決定された配役情報をbotサーバーに送信し、Discord上での役職配布(役職チャンネル作成、招待、メンション)を依頼します。/player/list または /player/list/manual の後に呼び出します。botサーバー側では、このAPIから送られた役職情報を、既存のプレイヤーリスト(手動登録またはリアクション経由でgameSession.rolesに基本情報が格納されている)にマージします。
トリガー: スプレッドシートの [配役結果を送信] ボタン。
スプレッドシート処理: 配役情報をJSON化して送信します。
botサーバー処理: 受け取った情報に基づき、/game/setup で作成したカテゴリ内に役職チャンネル(村人を除く)を作成し、プレイヤーを招待、メンションで通知します。
[
{
"discordId": "123456789012345678",
"screenName": "プレイヤー1",
"playerNumber": 1,
"role": "人狼",
"initialFortuneTargetPlayerNumber": null
},
{
"discordId": "987654321098765432",
"screenName": "プレイヤー2",
"playerNumber": 2,
"role": "占い師",
"initialFortuneTargetPlayerNumber": 3
},
// ... 他のプレイヤー
{
"discordId": "112233445566778899",
"screenName": "プレイヤー3",
"playerNumber": 3,
"role": "村人",
"initialFortuneTargetPlayerNumber": null
}
]
注記: リクエストJSON内の discordId と screenName は、botサーバーに既に登録されているプレイヤー情報(/player/list または /player/list/manual で取得・設定されたもの)と playerNumber をキーに照合されます。役職 (role) と初日占い対象 (initialFortuneTargetPlayerNumber) が主にこのAPIで設定・更新される情報となります。
/vote/result説明: スプレッドシートで集計・判定された投票結果(処刑者、投票詳細、決戦情報)をbotサーバーに送信します。
トリガー: スプレッドシートの [投票結果を送信] ボタン。
スプレッドシート処理: 投票結果情報をJSON化して送信します。
botサーバー処理: 処刑者情報や投票ログを記録します。
{
"executedPlayerNumber": 2, // 本日の処刑者のプレイヤー番号
"voterPlayerNumbers": [1, 2, 3, 4, 5], // 投票元プレイヤー番号リスト (投票順)
"votedPlayerNumbers": [2, 3, 2, 3, 2], // 投票先プレイヤー番号リスト (投票順)
"isRunoffVote": true, // 決戦の有無 (boolean)
"runoffVoterPlayerNumbers": [1, 4, 5], // 決戦投票の投票元リスト (決戦時のみ)
"runoffVotedPlayerNumbers": [2, 2, 3] // 決戦投票の投票先リスト (決戦時のみ)
}
注記: 決戦がない場合、runoffVoterPlayerNumbers と runoffVotedPlayerNumbers は空のリスト [] または null とします。
/night/fortuner説明: スプレッドシートで判定された占い結果(対象プレイヤーが人間か人狼か)をbotサーバーに送信し、該当する占い師のDiscordチャンネルへの通知を依頼します。
トリガー: スプレッドシートの [占い結果を送信] ボタン。
スプレッドシート処理: 占い情報をJSON化して送信します。
botサーバー処理: 受け取った結果に基づき、適切な通知メッセージを生成し、該当占い師のDiscordチャンネルへ本部botとして投稿します。
{
"fortuneTellerPlayerNumber": 2, // 占いを行うプレイヤーの番号
"targetPlayerNumber": 3, // 占い先のプレイヤー番号
"result": true // 占い結果 (boolean, 人狼: true, 人間: false)
}
/night/medium説明: スプレッドシートで判定された霊媒結果(直前に処刑されたプレイヤーが人間か人狼か)をbotサーバーに送信し、該当する霊媒師のDiscordチャンネルへの通知を依頼します。
トリガー: スプレッドシートの [霊媒結果を送信] ボタン。
スプレッドシート処理: 霊媒情報をJSON化して送信します。
botサーバー処理: 受け取った結果に基づき、適切な通知メッセージを生成し、該当霊媒師のDiscordチャンネルへ本部botとして投稿します。
{
"mediumPlayerNumber": 3, // 霊媒を行うプレイヤーの番号
"deceasedPlayerNumber": 1, // 直前に処刑されたプレイヤーの番号
"result": false // 霊媒結果 (boolean, 人狼: true, 人間: false)
}
/game/end説明: ゲームの勝敗が決定した際に、勝利陣営をbotサーバーに通知します。その際に、ゲームの状態のリセットも行う。
{
"winningFaction": "人狼陣営" // 例: "人狼陣営", "村人陣営" など
}
/reset説明: botサーバーの現在のゲームセッション情報 (gameSession) を全て初期状態(サーバー起動時と同じ状態)にリセットします。進行中のゲーム情報やプレイヤーリストなどが全てクリアされます。主にテスト時や、予期せぬエラーで状態がおかしくなった場合に使用します。
トリガー: スプレッドシートの [サーバー状態リセット] ボタン (新設推奨)。
スプレッドシート処理: このエンドポイントを呼び出すボタンを設置します。リクエストボディは不要です。
botサーバー処理: gameSession オブジェクトを初期状態に戻します。
なし (空のボディ)
{
"message": "Game session has been reset successfully."
}
カテゴリ名とサーバーidを入力する欄も欲しい。
関連API: POST /game/setup
スプレッドシート上のプレイヤー情報(Discord ID, 表示名, プレイヤー番号)をJSON形式で送信し、プレイヤーリストを確定させる。
リアクションでの参加が難しい場合やテスト用。
関連API: POST /player/list/manual
このボタンを押して取得した結果をメンバーリストに反映させて欲しい。
/player/list/manual で手動登録されていない場合にDiscordのリアクションを参照する。
関連API: GET /player/list
配役を最終決定した時に押すボタン。これを押すとdiscordで配役が始まる。
関連API: POST /role/list/add
役職実行タブに霊媒結果の送信ボタンと占い結果の送信ボタンが欲しい。
POST /night/fortunerPOST /night/mediumゲームが終了した場合にそれを知らせるボタンが欲しい。一応、今の仕様書には勝利陣営を送信する仕様にしているけど、bodyは空でも良い。
関連API: POST /game/end
botサーバーの全ゲーム状態を初期化する。
関連API: POST /reset
ゲーム状態を確認するための開発者向けコマンドです。
/debug_session – gameSession の概要を JSON 表示/debug_channels – 作成済みチャンネルIDと名前を一覧/debug_players – 登録済みプレイヤーリストを表示/debug_roles – 役職割り当て状況を表示/debug_results – 投票・占い・霊媒の結果をまとめて表示/debug_status – ゲーム進行状況を簡易表示/debug_category – ゲーム用カテゴリ内のチャンネルを列挙/debug_messageids – 重要メッセージのIDを確認/debug_dump – gameSession 全体を JSON ダンプ/debug_ping – Bot 応答確認