package main import ( "encoding/json" "errors" "fmt" "os" "path/filepath" "time" ) const ( configDirName = ".htsy" configFileName = "config.json" defaultBaseURL = "https://htsy-gateway.cpshelp.cn" ) type Config struct { BaseURL string `json:"baseUrl,omitempty"` Token string `json:"token,omitempty"` Username string `json:"username,omitempty"` LoginKind string `json:"loginKind,omitempty"` UpdatedAt time.Time `json:"updatedAt,omitempty"` } func defaultConfigPath() (string, error) { if value := os.Getenv("HTSY_CONFIG"); value != "" { return value, nil } home, err := os.UserHomeDir() if err != nil { return "", fmt.Errorf("resolve home directory: %w", err) } return filepath.Join(home, configDirName, configFileName), nil } func resolveConfigPath(path string) (string, error) { if path != "" { return path, nil } return defaultConfigPath() } func loadConfig(path string) (Config, error) { resolved, err := resolveConfigPath(path) if err != nil { return Config{}, err } data, err := os.ReadFile(resolved) if errors.Is(err, os.ErrNotExist) { return Config{BaseURL: defaultBaseURL}, nil } if err != nil { return Config{}, fmt.Errorf("read config %s: %w", resolved, err) } var cfg Config if err := json.Unmarshal(data, &cfg); err != nil { return Config{}, fmt.Errorf("parse config %s: %w", resolved, err) } if cfg.BaseURL == "" { cfg.BaseURL = defaultBaseURL } return cfg, nil } func saveConfig(path string, cfg Config) error { resolved, err := resolveConfigPath(path) if err != nil { return err } if cfg.BaseURL == "" { cfg.BaseURL = defaultBaseURL } cfg.UpdatedAt = time.Now().UTC() dir := filepath.Dir(resolved) if err := os.MkdirAll(dir, 0o700); err != nil { return fmt.Errorf("create config dir %s: %w", dir, err) } data, err := json.MarshalIndent(cfg, "", " ") if err != nil { return fmt.Errorf("encode config: %w", err) } data = append(data, '\n') if err := os.WriteFile(resolved, data, 0o600); err != nil { return fmt.Errorf("write config %s: %w", resolved, err) } return nil } func clearLogin(path string) error { cfg, err := loadConfig(path) if err != nil { return err } cfg.Token = "" cfg.Username = "" cfg.LoginKind = "" return saveConfig(path, cfg) }