プロジェクト

全般

プロフィール

機能 #407

完了

機能 #396: ゲーム内常駐ペット育成機能の追加

機能 #406: VRChatアバターの読み込み

アバター連携フィード基盤(ObsHttpServer 拡張: pet 状態 + イベントSSE)

機能 #407: アバター連携フィード基盤(ObsHttpServer 拡張: pet 状態 + イベントSSE)

エージェント ちゃん さんが12日前に追加. 12日前に更新.

ステータス:
完了
優先度:
通常
担当者:
対象バージョン:
開始日:
2026/06/24
期日:
進捗率:

100%

予定工数:

説明

背景

#406 決定記録(docs/poc/vrm-avatar-loading.md)に基づく three-vrm アバター対応の基盤。beatoraja から VRM アバターへ「状態」と「イベント」を配信する共通フィードを実装する。

作業内容

  • 既存 bms.player.beatoraja.stream.obs.ObsHttpServer(loopback / obs/ 静的配信 / /state.json)を拡張、または同等のローカル HTTP を追加。
  • エンドポイント:
    • GET /pet/state.json … ペット状態スナップショット(no-store)
    • GET /pet/events … momentary イベントの SSE(Server-Sent Events)配信
  • JSON スキーマ定義:
    • state: name / level / exp / nextLevelExp / friendship / mood / personality
    • event: 単曲結果(クリア種別・スコア差・BP)/ pet_comment / level-up / セッション要約 / 練習推薦
  • 入力源は #397(ペット状態永続化)。未実装項目はスタブ可。

完了条件

  • ブラウザ/curl で state.json とイベント SSE が取得できる。
  • スキーマのユニットテスト(JSON 生成)。

依存

#397(ペット状態)。three-vrm 側(別子チケット)と本フィードの契約が一致すること。

エージェント ちゃん さんが12日前に更新 操作 #1

  • ステータス未着手 から 実装中 に変更
  • 進捗率0 から 10 に変更

実装に着手しました。

  • ブランチ: feature/407
  • 対応方針: 既存 ObsHttpServer を拡張し、ペット状態スナップショット GET /pet/state.json(no-store)と momentary イベントの GET /pet/events(SSE)を追加。状態は #397PetDataPetGrowthCalculator で level/exp/nextLevelExp を導出、personality は #405 待ちで null スタブ)を入力源とし、イベントは result / pet_comment / level_up / session_summary / practice_recommend のスキーマと配信基盤(ブローカ)を定義。本チケットでは state 反映と単曲 result イベントを実配線し、残りはスキーマ+publish API のみ(後続子チケットで配線)。JSON 生成のユニットテストを追加。

エージェント ちゃん さんが12日前に更新 操作 #2

  • ステータス実装中 から 完了 に変更
  • 進捗率10 から 100 に変更

対応が完了しました。

概要

three-vrm Web アバターへ「状態」と「イベント」を配信する共通フィードを、既存 loopback ObsHttpServer を拡張して実装(#406 決定記録準拠)。入力源は #397 のペット状態。

変更点

  • GET /pet/state.json(no-store スナップショット)追加。スキーマ name/level/exp/nextLevelExp/friendship/mood/personality。level/exp/nextLevelExp は PetData.totalExp から PetGrowthCalculator で導出(exp=現レベル内累積、nextLevelExp=現レベルのスパン、max level で 0)。personality は #405 待ちで null スタブ。
  • GET /pet/events(Server-Sent Events)追加。接続時に retry +現在状態 event: state を送信し、状態更新ごとに state をブロードキャスト、無イベント時は約15秒間隔の keepalive コメント。
  • PetEvent スキーマ(snake_case)定義: result / pet_comment / level_up / session_summary / practice_recommend。本チケットでの実配線は単曲 resultMusicResult、PLAY かつ非コースのみ)だけ。残りはスキーマ+publish API(後続子チケットで配線)。
  • ペットエンドポイントに CORS Access-Control-Allow-Origin: * を付与(Tauri/OBS ブラウザソースの別オリジン想定)。
  • 新規 PetFeed はスレッド安全な SSE ハブ(concurrent 購読者集合・有界キュー・close センチネル)。JSON は新規 package-local JsonWriter で生成し、既存 ObsState の builder は不変。
  • 変更ファイル: 新規 stream/obs/JsonWriter.java / PetFeedState.java / PetEvent.java / PetFeed.java、変更 stream/obs/ObsHttpServer.java / ObsController.java / MainController.java / result/MusicResult.java、テスト stream/obs/PetFeedStateTest.java / PetEventTest.java / PetFeedTest.java(計 11 ファイル)。

テスト

  • .\gradlew.bat test : 成功(フルスイート BUILD SUCCESSFUL)。新規ユニットテスト 3 本(state JSON 導出/エスケープ、各 event の type/payload、ブローカ挙動)。
  • 手動スモーク:ObsHttpServer 実起動で /pet/state.json(200/no-store/CORS/スキーマ一致)と /pet/events(200/event-stream、retry→state→publish した result をエスケープ込みで受信)を確認。

関連 MR

  • !84 (feature/407 → develop)

他の形式にエクスポート: PDF Atom