package main import ( _ "embed" "encoding/json" "log" "os" "path/filepath" ) type WallpaperType string const ( WPTheme WallpaperType = "theme" WPImage WallpaperType = "image" WPBing WallpaperType = "bing" WPColor WallpaperType = "color" ) type Layout string const ( LayoutSingle Layout = "single" LayoutMulti Layout = "multi" ) type ThemeName string const ( ThemeAurora ThemeName = "aurora" ThemeStar ThemeName = "starfield" ThemeGradient ThemeName = "gradient" ThemeParticle ThemeName = "particles" ThemeFractal ThemeName = "fractal" ThemeText ThemeName = "text" ) type SavedColor struct { Color1 string `json:"color1"` Color2 string `json:"color2"` Gradient bool `json:"gradient"` } type Config struct { Zodiac string `json:"zodiac"` City string `json:"city"` WallpaperType WallpaperType `json:"wallpaperType"` Theme ThemeName `json:"theme"` ImagePath string `json:"imagePath"` Color1 string `json:"color1"` Color2 string `json:"color2"` ColorGradient bool `json:"colorGradient"` WallpaperText string `json:"wallpaperText"` Layout Layout `json:"layout"` HideWallpaper bool `json:"hideWallpaper"` HideTime bool `json:"hideTime"` HideWeather bool `json:"hideWeather"` HideZodiac bool `json:"hideZodiac"` HideAINews bool `json:"hideAINews"` ShowSeconds bool `json:"showSeconds"` PhotoDir string `json:"photoDir"` PhotoInterval int `json:"photoInterval"` HidePhoto bool `json:"hidePhoto"` PhotoFrameMode bool `json:"photoFrameMode"` KnowledgeKeyword string `json:"knowledgeKeyword"` KnowledgePrompt string `json:"knowledgePrompt"` HideKnowledge bool `json:"hideKnowledge"` SavedColors []SavedColor `json:"savedColors"` BingAutoRefresh bool `json:"bingAutoRefresh"` AutoStart bool `json:"autoStart"` QWeatherKey string `json:"qweatherKey,omitempty"` TianapiKey string `json:"tianapiKey,omitempty"` CPAKey string `json:"cpaKey,omitempty"` } const defaultZodiac = "射手座" var configPath string //go:embed assets/icons/tray.ico var trayIcon []byte func configDir() string { return filepath.Dir(configPath) } func loadConfig() *Config { data, err := os.ReadFile(configPath) if err != nil { return defaultConfig() } var cfg Config if json.Unmarshal(data, &cfg) != nil { return defaultConfig() } if cfg.Zodiac == "" { cfg.Zodiac = defaultZodiac } if cfg.WallpaperType == "" { cfg.WallpaperType = WPTheme } if cfg.Theme == "" { cfg.Theme = ThemeAurora } if cfg.Color1 == "" { cfg.Color1 = "#1a1a2e" } if cfg.Layout == "" { cfg.Layout = LayoutSingle } return &cfg } func defaultConfig() *Config { return &Config{ Zodiac: defaultZodiac, WallpaperType: WPTheme, Theme: ThemeAurora, Color1: "#1a1a2e", Color2: "#16213e", } } func saveConfig(cfg *Config) error { data, err := json.MarshalIndent(cfg, "", " ") if err != nil { log.Println("配置序列化失败:", err) return err } return os.WriteFile(configPath, data, 0644) } func getSecret(envName, cfgValue string) string { if v := os.Getenv(envName); v != "" { return v } return cfgValue } func (c *Config) qweatherKey() string { return getSecret("U_DESKTOP_QWEATHER_KEY", c.QWeatherKey) } func (c *Config) tianapiKey() string { return getSecret("U_DESKTOP_TIANAPI_KEY", c.TianapiKey) } func (c *Config) cpaKey() string { return getSecret("U_DESKTOP_CPA_KEY", c.CPAKey) }