From 23d5fcfcda7343cbce249670fbbf6ef550fb1635 Mon Sep 17 00:00:00 2001 From: every_holiday Date: Thu, 25 Jun 2026 00:09:58 +0900 Subject: [PATCH] Make launcher a Windows GUI app --- .gitea/workflows/build-windows-exe.yml | 2 +- EXE.md | 36 ++++--- README.md | 134 +++++++------------------ cmd/vrc_osc_launcher/main.go | 56 +++++++++++ 4 files changed, 116 insertions(+), 112 deletions(-) create mode 100644 cmd/vrc_osc_launcher/main.go diff --git a/.gitea/workflows/build-windows-exe.yml b/.gitea/workflows/build-windows-exe.yml index 1bcf841..f093bda 100644 --- a/.gitea/workflows/build-windows-exe.yml +++ b/.gitea/workflows/build-windows-exe.yml @@ -36,7 +36,7 @@ jobs: VERSION="${GITHUB_REF_NAME}" BUILD_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)" GO111MODULE=on GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "-H windowsgui -X vrc_osc_go/internal/buildinfo.Version=${VERSION} -X vrc_osc_go/internal/buildinfo.BuildTime=${BUILD_TIME}" -o dist/vrc_osc.exe ./cmd/vrc_osc - GO111MODULE=on GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "-X vrc_osc_go/internal/buildinfo.Version=${VERSION} -X vrc_osc_go/internal/buildinfo.BuildTime=${BUILD_TIME}" -o dist/vrc_osc_launcher.exe ./cmd/vrc_osc_launcher + GO111MODULE=on GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "-H windowsgui -X vrc_osc_go/internal/buildinfo.Version=${VERSION} -X vrc_osc_go/internal/buildinfo.BuildTime=${BUILD_TIME}" -o dist/vrc_osc_launcher.exe ./cmd/vrc_osc_launcher GO111MODULE=on GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -ldflags "-X vrc_osc_go/internal/buildinfo.Version=${VERSION} -X vrc_osc_go/internal/buildinfo.BuildTime=${BUILD_TIME}" -o dist/vrwt_tool.exe ./cmd/vrwt_tool - name: Package executables diff --git a/EXE.md b/EXE.md index a125657..46446a6 100644 --- a/EXE.md +++ b/EXE.md @@ -1,25 +1,33 @@ -# exe Packaging +# Windows Release Packaging ## Build +Release の zip は Gitea Actions で作ります。 + ```powershell -.\build_exe.ps1 +go build -ldflags="-H windowsgui" -o .\dist\vrc_osc.exe ./cmd\vrc_osc +go build -ldflags="-H windowsgui" -o .\dist\vrc_osc_launcher.exe ./cmd\vrc_osc_launcher +go build -o .\dist\vrwt_tool.exe ./cmd\vrwt_tool ``` -This uses `PyInstaller` and writes the result to `dist\vrc_osc\`. +## 起動 -## Distribution Layout +通常は `vrc_osc_launcher.exe` を起動してください。 -Place these next to `vrc_osc.exe`: +- 起動時に最新 Release をチェック +- 新しい版があれば自動更新 +- 更新後に本体を起動 -- `config\config.toml` -- `config\secrets.toml` -- `config\guests.txt` +`vrc_osc.exe` を直接起動した場合は更新チェックしません。 + +## 配置 + +Release zip を展開したフォルダに以下を置きます。 + +- `vrc_osc.exe` +- `vrc_osc_launcher.exe` +- `vrwt_tool.exe` +- `config\` - `runtime\` -`runtime\` is created on startup if it does not exist. - -## Notes - -- `src\common\project_paths.py` resolves paths relative to the exe when frozen. -- Keep `config\` beside the exe. The app does not look inside the PyInstaller temp directory for persistent files. +`runtime\` は起動時に作られます。 diff --git a/README.md b/README.md index 7119ac8..c5692aa 100644 --- a/README.md +++ b/README.md @@ -1,133 +1,73 @@ # VRC_OSC -VRC_OSC は、VRChat の状態を見て Discord やログ連携を行うためのツールです。 +VRChat のログ監視、Discord ミュート連携、OCR、同意リスト生成をまとめたツールです。 -一番の使い方は、VRChat の `ExMenu` から操作することです。 -`ExMenu` は VRChat のメニュー画面に出る、追加の操作メニューです。 +## 主な機能 -## できること - -- VRChat のログを見て Discord に通知する - - 変更があった部分だけを差分で送る -- Discord のミュートを VRChat 側の操作に合わせて切り替える -- VRChat 画面を読み取って OCR する -- OCR した文字を翻訳してコピーする - -## 画面イメージ - -### ExMenu - -VRChat のメニュー画面から、このツールの機能を操作します。 - -![ExMenu 1](doc/ExMenu1.png) - -![ExMenu 2](doc/ExMenu2.png) - -### VRC Log - -VRChat のログ確認や通知の流れは、次のようなイメージです。 - -![VRC Log](doc/VRC_Log.png) - -## 使い方 - -1. 必要な設定ファイルを用意します。 -2. ツールを起動します。 -3. VRChat を開きます。 -4. VRChat の `ExMenu` から必要な機能を選びます。 - -### Discord のミュート連動 - -VRChat 側で特定の操作が行われたときに、Discord のミュート状態を切り替えます。 -通話中に VRChat を使うとき、Discord の音声操作を手で切り替える手間を減らすための機能です。 - -### OCR と翻訳 - -VRChat 画面の文字を読み取って、必要に応じて翻訳します。 -見た文字や翻訳結果はコピーできるので、内容をそのまま使いやすくなります。 +- VRChat の入退出ログを監視して `join / leave` を出力 +- Discord のミュート切り替え +- OCR で画面文字を取得 +- 同意フォーム用の JSON 生成とログ抽出 +- Gitea Release からの自動更新 ## 起動方法 -PowerShell から起動する場合: +配布 zip を展開したら、まず `vrc_osc_launcher.exe` を起動してください。 ```powershell -bin\vrc_osc.ps1 +vrc_osc_launcher.exe ``` -Python から直接起動する場合: +launcher は起動時に最新 Release を確認します。新しい版があれば自動で更新してから本体を起動します。 + +本体を直接起動することもできます。 ```powershell -python src\app.py +vrc_osc.exe ``` -## 事前準備 +ただし、この場合は自動更新は走りません。 -依存関係を入れます。 +## 配布物 -```powershell -python -m pip install -r requirements.txt -``` +Release の zip には次のファイルが入ります。 -## 設定ファイル +- `vrc_osc.exe` +- `vrc_osc_launcher.exe` +- `vrwt_tool.exe` +- `config.example.toml` +- `secrets.example.toml` +- `guests.example.txt` -設定は `config/` に置きます。 +## 設定 + +設定ファイルは exe の横の `config/` に置きます。 - `config/config.toml` - `config/secrets.toml` - `config/guests.txt` -サンプルはそれぞれ `*.example.*` を使って作成できます。 +最初は各 `*.example.*` をコピーして使ってください。 -## 初期セットアップ +## Release 更新 -最初は、`config/` のサンプルファイルを実ファイルにしてから中身を埋めます。 +自動更新は Gitea の Release を参照します。 -1. `config/config.example.toml` を `config/config.toml` にコピーします。 -2. `config/secrets.example.toml` を `config/secrets.toml` にコピーします。 -3. `config/guests.example.txt` を `config/guests.txt` にコピーします。 -4. `config/config.toml` の `self.name` を自分の VRChat 表示名にします。 -5. `config/secrets.toml` の `discord.webhook_url` を設定します。 -6. `config/secrets.toml` の `vrchat.username` と `vrchat.password` を設定します。 -7. `config/guests.txt` に、あらかじめ guest として見たい参加者名を 1 行ずつ書きます。 -8. 自分の名前も guest 扱いしたい場合は、`guests.txt` に自分の名前も 1 行追加します。 +- 更新元: `https://git.vrcworldtour.com/every_holiday/VRCWT-OSC/releases` +- 対象 asset: `vrc_osc-windows.zip` -`guests.txt` は、例として次のように書きます。 +## 開発時のビルド -```text -GuestUserA -GuestUserB -YourNameHere +```powershell +go test ./... +go build -ldflags="-H windowsgui" -o .\dist\vrc_osc.exe ./cmd/vrc_osc +go build -ldflags="-H windowsgui" -o .\dist\vrc_osc_launcher.exe ./cmd/vrc_osc_launcher +go build -o .\dist\vrwt_tool.exe ./cmd\vrwt_tool ``` -## よく使う設定 - -- `discord.webhook_url` - - Discord に通知を送るための Webhook URL -- `vrchat.username` - - VRChat のアカウント名 -- `vrchat.password` - - VRChat のパスワード -- `staff.names` - - スタッフとして扱う名前 -- `guest.file` - - guest 名簿のファイル - -## 補足 - -この README は、まず使い方が分かることを優先して簡単にまとめています。 -細かい内部仕様が必要な場合は、ソースコードと `config/*.example.*` を見てください。 - -## 生成されるログ +## ログ - `runtime/runtime.log` - - 通常の実行ログ - `runtime/join_leave.log` - - join / leave だけを抜き出したログ - `runtime/latest_ocr.png` - `runtime/latest_screenshot.png` - -## 詳しい資料 - -- [設計書](doc/design.md) -- [シーケンス図](doc/sequence.md) -- [ワークフロー](doc/workflow.md) diff --git a/cmd/vrc_osc_launcher/main.go b/cmd/vrc_osc_launcher/main.go new file mode 100644 index 0000000..d3d6155 --- /dev/null +++ b/cmd/vrc_osc_launcher/main.go @@ -0,0 +1,56 @@ +package main + +import ( + "flag" + "log" + "os" + "path/filepath" + "syscall" + + "vrc_osc_go/internal/buildinfo" + "vrc_osc_go/internal/common" + "vrc_osc_go/internal/update" +) + +func main() { + var baseURL string + var ownerRepo string + var assetName string + flag.StringVar(&baseURL, "base-url", "https://git.vrcworldtour.com", "Gitea base URL") + flag.StringVar(&ownerRepo, "repo", "every_holiday/VRCWT-OSC", "owner/repo") + flag.StringVar(&assetName, "asset", "vrc_osc-windows.zip", "release asset name") + flag.Parse() + + client := &update.Client{BaseURL: baseURL} + mgr := &update.Manager{ + Client: client, + OwnerRepo: ownerRepo, + AssetName: assetName, + CurrentLabel: buildinfo.Version, + } + if _, err := mgr.CheckAndUpdate(); err != nil { + log.Printf("auto update skipped: %v", err) + } + exe := filepath.Join(common.RootDir(), "vrc_osc.exe") + if _, err := os.Stat(exe); err != nil { + showError("vrc_osc_launcher", "missing exe: "+err.Error()) + log.Fatalf("missing exe: %v", err) + } + if err := update.Launch(exe, os.Args[1:]); err != nil { + showError("vrc_osc_launcher", "launch failed: "+err.Error()) + log.Fatalf("launch failed: %v", err) + } +} + +func showError(title, message string) { + user32 := syscall.NewLazyDLL("user32.dll") + msgBox := user32.NewProc("MessageBoxW") + const mbOK = 0x00000000 + const mbIconError = 0x00000010 + _, _, _ = msgBox.Call( + 0, + uintptr(syscall.StringToUTF16Ptr(message)), + uintptr(syscall.StringToUTF16Ptr(title)), + uintptr(mbOK|mbIconError), + ) +}