Skip to content

Recorder Mode 運用ガイド

--recorder-mode フラグで起動した「軽量記録専用モード」の使い方・配布方法・確認方法。

spec: standalone-recorder-app Phase 0 PoC 関連実測値: archive/refactoring/recorder-poc-metrics.md(リポジトリ archive 配下。docs サイトには未収録)

何ができるか

  • メモリ ~180 MB で常駐 (Viewer フル 1012 MB の 18%)
  • ログ監視 + DB 保存 を UI なしで実行 (auto-start)
  • ブラウザ自動化 (recorderBrowserAutomation.enabled=true の opt-in 時のみ)
  • トレイアイコン + 30 秒間隔のメトリクスログ + 試合検出時に console 出力

CLI フラグ (一時的な上書き)

UserSettings を変えずに 1 回だけ動作を変えたいとき:

bash
# ブラウザ自動化を強制 ON + 画面付き (--headed) で起動
yarn dev:electron:recorder:browser
# または手動で:
node scripts/dev/run-electron.cjs . --recorder-mode --browser-automation --headed
flag効果
--browser-automationenabled を強制 ON
--no-browser-automationenabled を強制 OFF
--headedheadless=false (画面を出す)
--headlessheadless=true (default)
--target-url=<url>targetUrl 上書き
--auto-full-workflowautoFullWorkflowOnStart=true

優先順位: CLI > UserSettings > default

トレイ右クリックメニューで設定変更

Recorder 起動中、トレイアイコン右クリックで以下のメニューが開く:

状態: 監視 N 件 / ブラウザ ON  (read-only)
─────
☐ ブラウザ自動化              ← トグル (UserSettings.json に保存 + 即時反映)
☐ ヘッドレス (画面を出さない) ← トグル (再起動)
☐ 起動時 fetchSeasonOnly を実行
─────
今すぐ fetchSeasonOnly を実行    ← 1 回だけ即実行
ブラウザ自動化を再起動
─────
終了

トグル操作は <userData>/user-settings.jsonrecorderBrowserAutomation を 更新し、必要なら BrowserAutomation を即座に再起動する。Viewer を起動せずに Recorder 単独で設定変更できる。

ブラウザ自動化の有効化 (Viewer 経由 / 手動編集)

Recorder mode は Viewer 側 localStorage の設定を読めない ため、UserSettings.json に専用 section を持つ。

<userData>/user-settings.json を編集 (例):

json
{
  "myUid": "1046101022",
  "myPlayerNames": ["MyName"],
  "recorderBrowserAutomation": {
    "enabled": true,
    "headless": true,
    "targetUrl": "https://xzysteam.shengtiangames.com/gamerecords/dist/index.html#/pages/home/index",
    "autoFullWorkflowOnStart": false
  }
}
field説明
enabledtrue で Recorder 起動時にブラウザ自動化を開始 (default false)
targetUrlナビゲート先 URL (空で DEFAULT)
headlesstrue でヘッドレス起動 (画面を出さない、default true)
autoFullWorkflowOnStarttrue で起動時に fetchSeasonOnly を 1 回走らせる

ログイン状態は Playwright の storageState に依存。Viewer で 1 度ログインを完了すると Cookie が <userData>/playwright/storage-state.json に記録され、Recorder もそれを読み込む。

試す手順 (開発時)

1. 前提

Viewer を 1 度起動して Profile を作成しておく必要があります (Profile に紐付いたログディレクトリを Recorder が読むため)。

bash
# 通常起動して、オーバーレイタブのプロファイル設定で Profile を 1 つ作る
corepack yarn dev:electron

Profile を保存したら一旦終了。

2. Recorder mode で起動

bash
corepack yarn dev:electron:recorder

console に以下が出れば成功:

🎙️ [Recorder mode] UI 抑制で起動 — renderer / overlay / BP ウィンドウは作りません
[Recorder] window 作成をスキップ
[Recorder] BPOpponentWindow をスキップ
[TrayService] 初期化しました
🟢 [Recorder] 監視開始: C:\path\to\log\dir
🎙️ [Recorder] 1 個のディレクトリを監視中
📊 [MetricsLogger] uptime=0s | total: 89.3MB / 0.0%CPU | processes=1
📊 [MetricsLogger] 計測開始 (30s 間隔)

ゲームを起動して 1 戦すると:

📝 [Watcher:C:\...\log\dir] (各種ログ行)
🎬 [Watcher:C:\...\log\dir] phase → BP
🎬 [Watcher:C:\...\log\dir] phase → INGAME
🎬 [Watcher:C:\...\log\dir] phase → RESULT
✅ [Recorder] 試合 #1 検出: type=Rank_2v2 my=Win (W2 L2) → DB 保存済み

3. 終了

トレイアイコンを右クリック → 「終了」 (既存の TrayService 経由)。 または console で Ctrl+C

4. 記録の確認

  • Viewer (yarn dev:electron) で起動 → DB閲覧タブ → Recorder 動作中に保存された試合が見える
  • 直接 SQLite を覗く: userData/matches.db (DB Browser for SQLite 等)

本番配布の方法

現状 (Phase 0): ビルド時に自動で 2 つの exe が生成される

electron-builderafterPack フックで WingStats Manager.exe をコピーして WingStats Recorder.exe を作るので、通常のビルドコマンドで 2 つの exe が同時に出力 されます。

bash
yarn build:electron:win
# → release/win-unpacked/
#     ├ WingStats Manager.exe   (Viewer)
#     ├ WingStats Recorder.exe  (Recorder, 自動生成)
#     └ resources/              (両方が共有)

NSIS インストーラ (*.exe Setup) を実行すると、Program Files 配下に 両方の exe が同時にインストール され、両方のショートカットが自動作成 されます (build/installer.nsh で NSIS をカスタマイズ済):

  • WingStats Manager (スタートメニュー / デスクトップ) → Viewer 起動 (electron-builder 標準)
  • WingStats Recorder (スタートメニュー / デスクトップ) → Recorder 起動 (build/installer.nshcustomInstall で追加)
  • アンインストール時はどちらのショートカットも自動削除される

フラグなしでダブルクリックするだけ で recorder mode に入ります (exe 名に "recorder" を含む自動判定)。

💡 ビルド済み win-unpacked から手動で recorder.exe を作りたいときは yarn make-recorder-exe も使える (afterPack を経由しないケース用)。

GitHub Actions

.github/workflows/release.yml が既存の yarn build:electron を呼んでおり、afterPack フックが自動で走るため、タグ push (v*) の release ビルドにも 2 つの exe が含まれる。追加 workflow 変更は不要。

Phase 0 配布の追加選択肢

リネームコピー以外でも recorder mode に入る方法を併用可能:

方法 A: ショートカット

  1. WingStats Manager.exe のショートカットを作成
  2. プロパティ → リンク先末尾に --recorder-mode を追加
    "C:\...\WingStats Manager.exe" --recorder-mode
  3. ショートカット名を「WingStats Recorder」に rename
  4. 必要なら「実行」ドロップダウンで「最小化」を選択 (UI 出ないので無関係だが整合性のため)

方法 B: バッチファイル (.bat)

bat
@echo off
chcp 65001 >nul
start "" "C:\...\WingStats Manager.exe" --recorder-mode

このファイルを保存して、ダブルクリックで起動。chcp 65001 で console を UTF-8 にしてから起動するため、デバッグ時に console を覗いても文字化けしない。

方法 C: Steam 起動オプション (auto-launch spec と組合せ)

Steam で星の翼のプロパティ → 起動オプションに以下を貼る:

cmd /c start "" "C:\...\WingStats Manager.exe" --recorder-mode --launched-by-steam & "%COMMAND%"

Steam Play でゲーム起動と同時に Recorder が常駐起動。

将来 (Phase 1+): 別 exe で配布

WingStats Recorder.exe を電子ビルダー別 target として生成予定 (T05-T06)。インストーラのチェックボックスで opt-in 選択可能に (T09)。

トラブルシュート

Q: 起動したが 「監視するログディレクトリが見つかりません」

→ Viewer で Profile を 1 つ作って logDir を設定してから再起動。

Q: ゲームを起動しても何も検出されない

  • Profile の logDir が正しいか確認 (Viewer のプロファイル設定で確認可)
  • ゲームのログが本当にそのディレクトリに書かれているか確認 (watch/tail で確かめる)
  • console に 📝 [Watcher:...] のログ行が出ているか確認 — 出ていなければファイル監視が走っていない

Q: 文字化け (cp932)

yarn dev:electron:recorder には chcp 65001 が組み込まれているので通常出ない。手動で WingStats Manager.exe --recorder-mode を直接実行した場合は、cmd で先に chcp 65001 を打ってから起動。

Q: 終了の仕方

トレイ右クリック → 終了。console から Ctrl+C でも可。Task Manager で electron.exe を kill しても DB は WAL なので破損しない。

動作確認テスト (将来)

T03 以降で以下を追加予定:

  1. 単体テスト: RecorderAutoStart.start() が Profile が無いとき startedCount=0 を返す (mock DB)
  2. integration test: 実 Electron を --recorder-mode で spawn → ログを fixture から流し込み → DB に試合が保存されるか確認
  3. ベンチマーク回帰: PoC で計測した 182 MB から大幅に増えていないこと