Make launcher a Windows GUI app
This commit is contained in:
@@ -36,7 +36,7 @@ jobs:
|
|||||||
VERSION="${GITHUB_REF_NAME}"
|
VERSION="${GITHUB_REF_NAME}"
|
||||||
BUILD_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
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 "-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
|
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
|
- name: Package executables
|
||||||
|
|||||||
36
EXE.md
36
EXE.md
@@ -1,25 +1,33 @@
|
|||||||
# exe Packaging
|
# Windows Release Packaging
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
|
Release の zip は Gitea Actions で作ります。
|
||||||
|
|
||||||
```powershell
|
```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`
|
`vrc_osc.exe` を直接起動した場合は更新チェックしません。
|
||||||
- `config\secrets.toml`
|
|
||||||
- `config\guests.txt`
|
## 配置
|
||||||
|
|
||||||
|
Release zip を展開したフォルダに以下を置きます。
|
||||||
|
|
||||||
|
- `vrc_osc.exe`
|
||||||
|
- `vrc_osc_launcher.exe`
|
||||||
|
- `vrwt_tool.exe`
|
||||||
|
- `config\`
|
||||||
- `runtime\`
|
- `runtime\`
|
||||||
|
|
||||||
`runtime\` is created on startup if it does not exist.
|
`runtime\` は起動時に作られます。
|
||||||
|
|
||||||
## 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.
|
|
||||||
|
|||||||
134
README.md
134
README.md
@@ -1,133 +1,73 @@
|
|||||||
# VRC_OSC
|
# VRC_OSC
|
||||||
|
|
||||||
VRC_OSC は、VRChat の状態を見て Discord やログ連携を行うためのツールです。
|
VRChat のログ監視、Discord ミュート連携、OCR、同意リスト生成をまとめたツールです。
|
||||||
|
|
||||||
一番の使い方は、VRChat の `ExMenu` から操作することです。
|
## 主な機能
|
||||||
`ExMenu` は VRChat のメニュー画面に出る、追加の操作メニューです。
|
|
||||||
|
|
||||||
## できること
|
- VRChat の入退出ログを監視して `join / leave` を出力
|
||||||
|
- Discord のミュート切り替え
|
||||||
- VRChat のログを見て Discord に通知する
|
- OCR で画面文字を取得
|
||||||
- 変更があった部分だけを差分で送る
|
- 同意フォーム用の JSON 生成とログ抽出
|
||||||
- Discord のミュートを VRChat 側の操作に合わせて切り替える
|
- Gitea Release からの自動更新
|
||||||
- VRChat 画面を読み取って OCR する
|
|
||||||
- OCR した文字を翻訳してコピーする
|
|
||||||
|
|
||||||
## 画面イメージ
|
|
||||||
|
|
||||||
### ExMenu
|
|
||||||
|
|
||||||
VRChat のメニュー画面から、このツールの機能を操作します。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
### VRC Log
|
|
||||||
|
|
||||||
VRChat のログ確認や通知の流れは、次のようなイメージです。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 使い方
|
|
||||||
|
|
||||||
1. 必要な設定ファイルを用意します。
|
|
||||||
2. ツールを起動します。
|
|
||||||
3. VRChat を開きます。
|
|
||||||
4. VRChat の `ExMenu` から必要な機能を選びます。
|
|
||||||
|
|
||||||
### Discord のミュート連動
|
|
||||||
|
|
||||||
VRChat 側で特定の操作が行われたときに、Discord のミュート状態を切り替えます。
|
|
||||||
通話中に VRChat を使うとき、Discord の音声操作を手で切り替える手間を減らすための機能です。
|
|
||||||
|
|
||||||
### OCR と翻訳
|
|
||||||
|
|
||||||
VRChat 画面の文字を読み取って、必要に応じて翻訳します。
|
|
||||||
見た文字や翻訳結果はコピーできるので、内容をそのまま使いやすくなります。
|
|
||||||
|
|
||||||
## 起動方法
|
## 起動方法
|
||||||
|
|
||||||
PowerShell から起動する場合:
|
配布 zip を展開したら、まず `vrc_osc_launcher.exe` を起動してください。
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
bin\vrc_osc.ps1
|
vrc_osc_launcher.exe
|
||||||
```
|
```
|
||||||
|
|
||||||
Python から直接起動する場合:
|
launcher は起動時に最新 Release を確認します。新しい版があれば自動で更新してから本体を起動します。
|
||||||
|
|
||||||
|
本体を直接起動することもできます。
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
python src\app.py
|
vrc_osc.exe
|
||||||
```
|
```
|
||||||
|
|
||||||
## 事前準備
|
ただし、この場合は自動更新は走りません。
|
||||||
|
|
||||||
依存関係を入れます。
|
## 配布物
|
||||||
|
|
||||||
```powershell
|
Release の zip には次のファイルが入ります。
|
||||||
python -m pip install -r requirements.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
## 設定ファイル
|
- `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/config.toml`
|
||||||
- `config/secrets.toml`
|
- `config/secrets.toml`
|
||||||
- `config/guests.txt`
|
- `config/guests.txt`
|
||||||
|
|
||||||
サンプルはそれぞれ `*.example.*` を使って作成できます。
|
最初は各 `*.example.*` をコピーして使ってください。
|
||||||
|
|
||||||
## 初期セットアップ
|
## Release 更新
|
||||||
|
|
||||||
最初は、`config/` のサンプルファイルを実ファイルにしてから中身を埋めます。
|
自動更新は Gitea の Release を参照します。
|
||||||
|
|
||||||
1. `config/config.example.toml` を `config/config.toml` にコピーします。
|
- 更新元: `https://git.vrcworldtour.com/every_holiday/VRCWT-OSC/releases`
|
||||||
2. `config/secrets.example.toml` を `config/secrets.toml` にコピーします。
|
- 対象 asset: `vrc_osc-windows.zip`
|
||||||
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 行追加します。
|
|
||||||
|
|
||||||
`guests.txt` は、例として次のように書きます。
|
## 開発時のビルド
|
||||||
|
|
||||||
```text
|
```powershell
|
||||||
GuestUserA
|
go test ./...
|
||||||
GuestUserB
|
go build -ldflags="-H windowsgui" -o .\dist\vrc_osc.exe ./cmd/vrc_osc
|
||||||
YourNameHere
|
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/runtime.log`
|
||||||
- 通常の実行ログ
|
|
||||||
- `runtime/join_leave.log`
|
- `runtime/join_leave.log`
|
||||||
- join / leave だけを抜き出したログ
|
|
||||||
- `runtime/latest_ocr.png`
|
- `runtime/latest_ocr.png`
|
||||||
- `runtime/latest_screenshot.png`
|
- `runtime/latest_screenshot.png`
|
||||||
|
|
||||||
## 詳しい資料
|
|
||||||
|
|
||||||
- [設計書](doc/design.md)
|
|
||||||
- [シーケンス図](doc/sequence.md)
|
|
||||||
- [ワークフロー](doc/workflow.md)
|
|
||||||
|
|||||||
56
cmd/vrc_osc_launcher/main.go
Normal file
56
cmd/vrc_osc_launcher/main.go
Normal file
@@ -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),
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user