botサーバー API仕様書

1. 概要

本ドキュメントは、オンライン人狼ゲーム支援システムにおける「botサーバー」(本部botバックエンド)が提供するAPIの仕様を定義します。

1.1. システム構成
1.2. API連携の基本方針
1.3. 変更点

2. APIエンドポイント

2.1. ゲーム準備 (タイトル設定とカテゴリ作成)

HTTPメソッド: POST
パス: /game/setup

説明: ゲームのタイトルを設定し、そのタイトルをカテゴリ名としてDiscord上にゲーム用のカテゴリと基本的なチャンネル(GM用、投票用など、役職チャンネルを除く)を作成します。通常、ゲーム開始前に最初に呼び出されるAPIです。

discordにてサーバーidの取得が必要。(開発者モードをONにする必要あり) コマンド打つのとどっちが簡素かちょっと要審議かも。

トリガー: スプレッドシートの [ゲーム準備開始] ボタン。

スプレッドシート処理: GMが入力したゲームタイトルをJSON化して送信します。

botサーバー処理:
  1. 受け取ったゲームタイトルを現在のゲームセッション情報として保存します。
  2. 指定されたタイトルでDiscord上に新しいカテゴリを作成します。
  3. 作成したカテゴリ内に、基本的なチャンネル(例: GMチャンネル, 投票チャンネル)を作成します。役職チャンネルは /role/list/add 受信時に作成されます。
  4. プレイヤーリスト作成用の投稿。参加するプレイヤーはここにスタンプをつける。playerListChannelId が指定されていればそのチャンネルへ、指定がない場合はまず botテスト、なければ 一般 という名前のテキストチャンネルを探して投稿する。

リクエストbody (JSON):


{
  "serverId": "123456789012345678", // DiscordサーバーID,
  "gameTitle": "13ア式-5月5日",, // Discordカテゴリ名として使用
  "playerListChannelId": "123456789012345678" // (任意) プレイヤーリスト投稿先のチャンネルID
}
            

2.2. プレイヤーリスト手動登録

HTTPメソッド: POST
パス: /player/list/manual

説明: JSON形式でプレイヤーリストを直接botサーバーに送信し、現在のゲームセッションのプレイヤーリストとして設定します。Discordのリアクション機能を使用せずにプレイヤーを登録したい場合や、テスト時に使用します。このAPIでリストが登録された場合、/player/list (リアクション経由) APIはこの手動登録リストを優先して返却します。/game/setup の後に呼び出します。

トリガー: スプレッドシートの [プレイヤーリスト手動登録] ボタン (新設)。

スプレッドシート処理: GMが入力またはシート上で管理しているプレイヤー情報(Discord ID, 表示名, プレイヤー番号)をJSON化して送信します。

botサーバー処理:
  1. 受け取ったプレイヤーリストを現在のゲームセッションのプレイヤー情報として保存します(既存のプレイヤー情報がある場合は上書きされます)。
  2. 以降、/player/list APIはこの手動登録された情報を返すようになります。
  3. gameSession.roles の基本的なプレイヤー情報(Discord ID, 表示名, プレイヤー番号)もこのリストに基づいて更新されます。

リクエストbody (JSON):


[
  {
    "discordId": "123456789012345678",
    "screenName": "手動登録ユーザーA",
    "playerNumber": 1
  },
  {
    "discordId": "987654321098765432",
    "screenName": "手動登録ユーザーB",
    "playerNumber": 2
  }
  // ... 他のプレイヤー
]
            

レスポンスbody (JSON) (成功時例):


{
  "message": "Player list manually registered successfully. X players.",
  "registeredPlayerCount": 2,
  "players": [
    { "discordId": "123456789012345678", "screenName": "手動登録ユーザーA", "playerNumber": 1 },
    { "discordId": "987654321098765432", "screenName": "手動登録ユーザーB", "playerNumber": 2 }
  ]
}
            

レスポンスbody (JSON) (エラー時例):


{
  "message": "Validation failed for player list.",
  "errors": [
    "Player at index 0: discordId is missing or not a string."
  ]
}
            

2.3. プレイヤーリスト取得 (リアクション経由)

HTTPメソッド: GET
パス: /player/list

説明: Discordの特定メッセージへのリアクション等に基づき、ゲーム参加者のDiscord ID、表示名、およびbotサーバー側で割り振られたプレイヤー番号のリストを取得します。/game/setup の後に呼び出します。

注記: /player/list/manual APIによってプレイヤーリストが手動登録されている場合、このAPIはDiscordのリアクション情報を参照せず、手動登録されたリストを返却します。

トリガー: スプレッドシートの [プレイヤーリスト取得] ボタン。

botサーバー処理:
  1. 手動登録されたプレイヤーリストが存在する場合はそれを返却します。
  2. 手動登録リストがない場合、Discordから参加者情報を収集し、各プレイヤーに一意のplayerNumberを割り当て、JSON配列で返却します。
  3. 取得したプレイヤー情報は gameSession.roles の基本情報としても保存されます(手動リストがない場合)。

スプレッドシート処理: 取得したリストを `メンバー` シートに反映させます。

レスポンスbody (JSON):


[
  { "discordId": "123456789012345678", "screenName": "ユーザーA", "playerNumber": 1 },
  { "discordId": "987654321098765432", "screenName": "ユーザーB", "playerNumber": 2 }
  // ... 他のプレイヤー
]
            

2.4. 配役リスト送信

HTTPメソッド: POST
パス: /role/list/add

説明: スプレッドシートで決定された配役情報をbotサーバーに送信し、Discord上での役職配布(役職チャンネル作成、招待、メンション)を依頼します。/player/list または /player/list/manual の後に呼び出します。botサーバー側では、このAPIから送られた役職情報を、既存のプレイヤーリスト(手動登録またはリアクション経由でgameSession.rolesに基本情報が格納されている)にマージします。

トリガー: スプレッドシートの [配役結果を送信] ボタン。

スプレッドシート処理: 配役情報をJSON化して送信します。

botサーバー処理: 受け取った情報に基づき、/game/setup で作成したカテゴリ内に役職チャンネル(村人を除く)を作成し、プレイヤーを招待、メンションで通知します。

リクエストbody (JSON):


[
  {
    "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内の discordIdscreenName は、botサーバーに既に登録されているプレイヤー情報(/player/list または /player/list/manual で取得・設定されたもの)と playerNumber をキーに照合されます。役職 (role) と初日占い対象 (initialFortuneTargetPlayerNumber) が主にこのAPIで設定・更新される情報となります。

2.5. 投票結果送信

HTTPメソッド: POST
パス: /vote/result

説明: スプレッドシートで集計・判定された投票結果(処刑者、投票詳細、決戦情報)をbotサーバーに送信します。

トリガー: スプレッドシートの [投票結果を送信] ボタン。

スプレッドシート処理: 投票結果情報をJSON化して送信します。

botサーバー処理: 処刑者情報や投票ログを記録します。

リクエストbody (JSON):


{
  "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]  // 決戦投票の投票先リスト (決戦時のみ)
}
            

注記: 決戦がない場合、runoffVoterPlayerNumbersrunoffVotedPlayerNumbers は空のリスト [] または null とします。

2.6. 占い結果送信

HTTPメソッド: POST
パス: /night/fortuner

説明: スプレッドシートで判定された占い結果(対象プレイヤーが人間か人狼か)をbotサーバーに送信し、該当する占い師のDiscordチャンネルへの通知を依頼します。

トリガー: スプレッドシートの [占い結果を送信] ボタン。

スプレッドシート処理: 占い情報をJSON化して送信します。

botサーバー処理: 受け取った結果に基づき、適切な通知メッセージを生成し、該当占い師のDiscordチャンネルへ本部botとして投稿します。

リクエストbody (JSON):


{
  "fortuneTellerPlayerNumber": 2, // 占いを行うプレイヤーの番号
  "targetPlayerNumber": 3,       // 占い先のプレイヤー番号
  "result": true                 // 占い結果 (boolean, 人狼: true, 人間: false)
}
            

2.7. 霊媒結果送信

HTTPメソッド: POST
パス: /night/medium

説明: スプレッドシートで判定された霊媒結果(直前に処刑されたプレイヤーが人間か人狼か)をbotサーバーに送信し、該当する霊媒師のDiscordチャンネルへの通知を依頼します。

トリガー: スプレッドシートの [霊媒結果を送信] ボタン。

スプレッドシート処理: 霊媒情報をJSON化して送信します。

botサーバー処理: 受け取った結果に基づき、適切な通知メッセージを生成し、該当霊媒師のDiscordチャンネルへ本部botとして投稿します。

リクエストbody (JSON):


{
  "mediumPlayerNumber": 3, // 霊媒を行うプレイヤーの番号
  "deceasedPlayerNumber": 1, // 直前に処刑されたプレイヤーの番号
  "result": false            // 霊媒結果 (boolean, 人狼: true, 人間: false)
}
            

2.8. ゲーム終了通知

HTTPメソッド: POST
パス: /game/end

説明: ゲームの勝敗が決定した際に、勝利陣営をbotサーバーに通知します。その際に、ゲームの状態のリセットも行う。

リクエストbody (JSON):


{
  "winningFaction": "人狼陣営" // 例: "人狼陣営", "村人陣営" など
}
            

2.9. サーバー状態リセット (新規追加)

HTTPメソッド: POST
パス: /reset

説明: botサーバーの現在のゲームセッション情報 (gameSession) を全て初期状態(サーバー起動時と同じ状態)にリセットします。進行中のゲーム情報やプレイヤーリストなどが全てクリアされます。主にテスト時や、予期せぬエラーで状態がおかしくなった場合に使用します。

トリガー: スプレッドシートの [サーバー状態リセット] ボタン (新設推奨)。

スプレッドシート処理: このエンドポイントを呼び出すボタンを設置します。リクエストボディは不要です。

botサーバー処理: gameSession オブジェクトを初期状態に戻します。

リクエストbody (JSON):

なし (空のボディ)

レスポンスbody (JSON) (成功時例):


{
  "message": "Game session has been reset successfully."
}
            

3. スプレッドシートに追加して欲しいボタンと機能の一覧

4. デバッグ用スラッシュコマンド

ゲーム状態を確認するための開発者向けコマンドです。