Files
huya-go/main.go
T

88 lines
2.6 KiB
Go

package main
import (
"embed"
"fmt"
"log"
"os"
"path/filepath"
"time"
"github.com/wailsapp/wails/v2"
"github.com/wailsapp/wails/v2/pkg/options"
"github.com/wailsapp/wails/v2/pkg/options/assetserver"
"github.com/wailsapp/wails/v2/pkg/options/windows"
"huya-go/internal/gui"
"huya-go/internal/instance"
)
//go:embed all:frontend/dist
var assets embed.FS
func main() {
// 实例槽位必须在 wails.Run 之前占用:WebView2 的用户数据目录要按实例区分,
// 而它只能在创建窗口之前设定。占位结果随后注入 App,避免重复占位。
lease, leaseErr := instance.Acquire()
writeStartupTrace(fmt.Sprintf("启动: 实例=%s 数据目录=%s", lease.Name(), lease.Paths().DataDir), leaseErr)
app := gui.NewApp(lease, leaseErr)
appOptions := &options.App{
Title: "虎牙抢购助手",
Width: 1280,
Height: 820,
MinWidth: 1024,
MinHeight: 680,
AssetServer: &assetserver.Options{
Assets: assets,
},
OnStartup: app.Startup,
OnShutdown: app.Shutdown,
Bind: []interface{}{
app,
},
}
// 每个实例一个独立的 WebView2 用户数据目录。Wails 默认用
// %APPDATA%\<可执行文件名>,所有实例共用,而 WebView2 的一个数据目录
// 只能有一个浏览器进程,第二个实例会偶发创建环境失败。
if webviewDir := lease.WebviewUserDataDir(); webviewDir != "" {
if err := os.MkdirAll(webviewDir, 0o700); err != nil {
writeStartupTrace("WebView2 用户数据目录创建失败: "+err.Error(), nil)
} else {
appOptions.Windows = &windows.Options{WebviewUserDataPath: webviewDir}
}
}
if err := wails.Run(appOptions); err != nil {
log.Printf("启动失败: %v", err)
writeStartupTrace("启动失败: "+err.Error(), nil)
os.Exit(1)
}
}
// writeStartupTrace 把每次启动/失败追加到 <用户缓存目录>/huya-go/startup.log。
//
// GUI 应用没有控制台,而 WebView2 环境创建失败时 OnStartup 根本不会执行、
// 应用自己的日志文件也不会生成——那时只有这份文件能说明「窗口为什么没起来」。
func writeStartupTrace(line string, cause error) {
dir, err := os.UserCacheDir()
if err != nil || dir == "" {
return
}
path := filepath.Join(dir, "huya-go", "startup.log")
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
return
}
file, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o644)
if err != nil {
return
}
defer func() { _ = file.Close() }()
if cause != nil {
line = fmt.Sprintf("%s (原因: %v)", line, cause)
}
_, _ = fmt.Fprintf(file, "%s pid=%d %s\n", time.Now().Format("2006-01-02 15:04:05.000"), os.Getpid(), line)
}