Files
qiweimanager-master/config/config_manager.go

178 lines
4.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}