package config import ( "encoding/json" "os" "path/filepath" "time" "qiweimanager/logger" ) var ( // 全局配置管理器实例 globalConfigManager *ConfigManager // 全局配置实例 globalConfig *Config ) // ConfigManager 配置管理器,负责加载和保存配置 type ConfigManager struct { configFilePath string logger *logger.Logger } // NewConfigManager 创建配置管理器实例 func NewConfigManager(appName string, logger *logger.Logger) (*ConfigManager, error) { // 获取可执行文件路径 exePath, err := os.Executable() if err != nil { // 如果无法获取可执行文件路径,使用当前工作目录作为备选 configDir, err := os.Getwd() if err != nil { return nil, err } // 创建配置目录 appConfigDir := filepath.Join(configDir, "config") if err := os.MkdirAll(appConfigDir, 0755); err != nil { return nil, err } // 构建配置文件完整路径 configFilePath := filepath.Join(appConfigDir, "config.json") return &ConfigManager{ configFilePath: configFilePath, logger: logger, }, nil } // 获取可执行文件所在目录 exeDir := filepath.Dir(exePath) // 创建应用程序配置目录(位于可执行文件同级的config目录) appConfigDir := filepath.Join(exeDir, "config") if err := os.MkdirAll(appConfigDir, 0755); err != nil { return nil, err } // 构建配置文件完整路径 configFilePath := filepath.Join(appConfigDir, "config.json") return &ConfigManager{ configFilePath: configFilePath, logger: logger, }, nil } // LoadConfig 从文件加载配置 func (cm *ConfigManager) LoadConfig() (*Config, error) { // 检查配置文件是否存在 if _, err := os.Stat(cm.configFilePath); os.IsNotExist(err) { cm.logger.Info("配置文件不存在,使用默认配置: %s", cm.configFilePath) // 返回默认配置 return NewDefaultConfig(), nil } // 读取配置文件内容 configData, err := os.ReadFile(cm.configFilePath) if err != nil { cm.logger.Error("读取配置文件失败: %v", err) return nil, err } // 解析配置文件 config := &Config{} if err := json.Unmarshal(configData, config); err != nil { cm.logger.Error("解析配置文件失败: %v", err) // 解析失败时返回默认配置 return NewDefaultConfig(), nil } config.ApplyDefaults() cm.logger.Info("配置文件加载成功: %s", cm.configFilePath) return config, nil } // SaveConfig 将配置保存到文件 func (cm *ConfigManager) SaveConfig(config *Config) error { config.ApplyDefaults() // 更新最后修改时间 config.LastUpdated = time.Now().Unix() // 将配置转换为JSON configData, err := json.MarshalIndent(config, "", " ") if err != nil { cm.logger.Error("序列化配置失败: %v", err) return err } // 写入配置文件 if err := os.WriteFile(cm.configFilePath, configData, 0644); err != nil { cm.logger.Error("写入配置文件失败: %v", err) return err } cm.logger.Info("配置文件保存成功: %s", cm.configFilePath) return nil } // InitGlobalConfig 初始化全局配置 func InitGlobalConfig(appName string, logger *logger.Logger) error { var err error globalConfigManager, err = NewConfigManager(appName, logger) if err != nil { return err } // 加载配置 globalConfig, err = globalConfigManager.LoadConfig() return err } // GetGlobalConfig 获取全局配置实例 func GetGlobalConfig() *Config { return globalConfig } // SaveGlobalConfig 保存全局配置 func SaveGlobalConfig() error { if globalConfigManager != nil && globalConfig != nil { return globalConfigManager.SaveConfig(globalConfig) } return nil } // UpdateCallbackConfig 更新回调配置 func UpdateCallbackConfig(callbackConfig CallbackConfig) error { if globalConfig != nil { globalConfig.CallbackConfig = callbackConfig return SaveGlobalConfig() } return nil } // UpdateAutoReplyConfig updates automatic customer-service settings. func UpdateAutoReplyConfig(autoReplyConfig AutoReplyConfig) error { if globalConfig != nil { globalConfig.AutoReplyConfig = autoReplyConfig globalConfig.ApplyDefaults() return SaveGlobalConfig() } return nil } // ReloadGlobalConfig reloads config.json from disk. func ReloadGlobalConfig() (*Config, error) { if globalConfigManager == nil { return nil, nil } cfg, err := globalConfigManager.LoadConfig() if err != nil { return nil, err } cfg.ApplyDefaults() globalConfig = cfg return globalConfig, nil }