package main import ( "bytes" "encoding/binary" "encoding/json" "image" "image/color" "image/png" "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"` KnowledgeKeyword string `json:"knowledgeKeyword"` KnowledgePrompt string `json:"knowledgePrompt"` HideKnowledge bool `json:"hideKnowledge"` SavedColors []SavedColor `json:"savedColors"` BingAutoRefresh bool `json:"bingAutoRefresh"` } const defaultZodiac = "射手座" var configPath string 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, _ := json.MarshalIndent(cfg, "", " ") return os.WriteFile(configPath, data, 0644) } func generateIcon() []byte { img := image.NewRGBA(image.Rect(0, 0, 16, 16)) c := color.RGBA{R: 88, G: 101, B: 242, A: 255} for y := 0; y < 16; y++ { for x := 0; x < 16; x++ { img.Set(x, y, c) } } var buf bytes.Buffer png.Encode(&buf, img) pngData := buf.Bytes() ico := make([]byte, 22+len(pngData)) binary.LittleEndian.PutUint16(ico[0:], 0) binary.LittleEndian.PutUint16(ico[2:], 1) binary.LittleEndian.PutUint16(ico[4:], 1) ico[6], ico[7], ico[8], ico[9] = 16, 16, 0, 0 binary.LittleEndian.PutUint16(ico[10:], 1) binary.LittleEndian.PutUint16(ico[12:], 32) binary.LittleEndian.PutUint32(ico[14:], uint32(len(pngData))) binary.LittleEndian.PutUint32(ico[18:], 22) copy(ico[22:], pngData) return ico }