yj
2025-09-03 f28ac0166536a2a4b68cac685a41ea667f60f7e9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
"""
配置管理模块
"""
 
import os
import json
import threading
from loguru import logger
 
 
class Settings:
    """应用配置"""
 
    def __init__(self, config_file: str = "config.json"):
        """初始化配置,从JSON文件加载"""
        self.config_file = config_file
        self._lock = threading.Lock()  # 用于线程安全的配置更新
        self._load_config()
 
    def _load_config(self):
        """从JSON文件加载配置"""
        if not os.path.exists(self.config_file):
            raise FileNotFoundError(f"配置文件 {self.config_file} 不存在")
 
        try:
            with open(self.config_file, 'r', encoding='utf-8') as f:
                config_data = json.load(f)
            self._set_config_from_dict(config_data)
        except Exception as e:
            raise Exception(f"加载配置文件失败: {e}")
 
    def _set_config_from_dict(self, config_data: dict):
        """从字典设置配置"""
        # 数据库配置
        self.database_url = config_data["database"]["url"]
 
        # Redis配置
        self.redis_url = config_data["redis"]["url"]
 
        # E云管家配置
        ecloud_config = config_data["ecloud"]
        self.ecloud_base_url = ecloud_config["base_url"]
        self.ecloud_authorization = ecloud_config["authorization"]
        self.ecloud_w_id = ecloud_config["w_id"]
 
        # DifyAI配置
        dify_config = config_data["dify"]
        self.dify_base_url = dify_config["base_url"]
        self.dify_api_key = dify_config["api_key"]
        self.dify_streaming_enabled = dify_config["streaming_enabled"]
        self.dify_streaming_timeout = dify_config["streaming_timeout"]
 
        # 服务配置
        server_config = config_data["server"]
        self.server_host = server_config["host"]
        self.server_port = server_config["port"]
        self.debug = server_config["debug"]
 
        # 日志配置
        logging_config = config_data["logging"]
        self.log_level = logging_config["level"]
        self.log_file = logging_config["file"]
 
        # 消息处理配置
        msg_config = config_data["message_processing"]
        self.max_retry_count = msg_config["max_retry_count"]
        self.retry_delay = msg_config["retry_delay"]
        self.queue_timeout = msg_config["queue_timeout"]
 
        # 客服配置
        customer_service_config = config_data["customer_service"]
        self.customer_service_names = customer_service_config["names"]
        self.customer_service_default_name = customer_service_config.get("default_name", "智能客服")
 
        # 好友忽略配置
        friend_ignore_config = config_data["friend_ignore"]
        self.friend_ignore_enabled = friend_ignore_config["enabled"]
        self.friend_ignore_whitelist = friend_ignore_config["whitelist"]
 
        # 静默模式配置
        silence_mode_config = config_data.get("silence_mode", {})
        self.silence_mode_enabled = silence_mode_config.get("enabled", True)
        self.silence_duration_minutes = silence_mode_config.get("duration_minutes", 10)
 
        # 在线状态监控配置
        online_status_config = config_data["online_status_monitor"]
        self.online_status_enabled = online_status_config["enabled"]
        self.online_status_check_interval = online_status_config["check_interval_minutes"]
        self.online_status_notification_message = online_status_config["notification_message"]
 
        # 邮件通知配置
        email_config = config_data["email_notification"]
        self.email_enabled = email_config["enabled"]
        self.email_smtp_server = email_config["smtp_server"]
        self.email_smtp_port = email_config["smtp_port"]
        self.email_smtp_username = email_config["smtp_username"]
        self.email_smtp_password = email_config["smtp_password"]
        self.email_from_email = email_config["from_email"]
        self.email_to_emails = email_config["to_emails"]
 
        # 短信通知配置
        sms_config = config_data["sms_notification"]
        self.sms_enabled = sms_config["enabled"]
        self.sms_api_url = sms_config["api_url"]
        self.sms_username = sms_config["username"]
        self.sms_password = sms_config["password"]
        self.sms_phone_numbers = sms_config["phone_numbers"]
 
        # 关键词过滤配置
        keyword_filter_config = config_data.get("keyword_filter", {})
        self.keyword_filter_enabled = keyword_filter_config.get("enabled", False)
        self.keyword_filter_keywords = keyword_filter_config.get("keywords", [])
 
        # 消息聚合配置
        message_aggregation_config = config_data.get("message_aggregation", {})
        self.message_aggregation_enabled = message_aggregation_config.get("enabled", True)
        self.message_aggregation_timeout = message_aggregation_config.get("timeout_seconds", 15)
 
        # 结束字符串配置
        self.end_str_list = config_data.get("end_str_list", [])
        
        # 测试群组关键字配置
        self.test_group_keywords = config_data.get("test_group_keywords", [])
 
    def update_ecloud_w_id(self, new_w_id: str) -> bool:
        """
        动态更新E云管家的w_id配置
 
        Args:
            new_w_id: 新的w_id值
 
        Returns:
            更新成功返回True,失败返回False
        """
        if not new_w_id or new_w_id == self.ecloud_w_id:
            return True
 
        with self._lock:
            try:
                # 更新内存中的配置
                old_w_id = self.ecloud_w_id
                self.ecloud_w_id = new_w_id
 
                # 更新配置文件
                if self._update_config_file_w_id(new_w_id):
                    logger.info(f"成功更新w_id: {old_w_id} -> {new_w_id}")
                    return True
                else:
                    # 如果文件更新失败,回滚内存配置
                    self.ecloud_w_id = old_w_id
                    logger.error(f"更新配置文件失败,回滚w_id: {new_w_id} -> {old_w_id}")
                    return False
 
            except Exception as e:
                logger.error(f"更新w_id异常: {str(e)}")
                return False
 
    def _update_config_file_w_id(self, new_w_id: str) -> bool:
        """
        更新配置文件中的w_id
 
        Args:
            new_w_id: 新的w_id值
 
        Returns:
            更新成功返回True,失败返回False
        """
        try:
            # 读取当前配置文件
            with open(self.config_file, 'r', encoding='utf-8') as f:
                config_data = json.load(f)
 
            # 更新w_id
            config_data["ecloud"]["w_id"] = new_w_id
 
            # 写回配置文件
            with open(self.config_file, 'w', encoding='utf-8') as f:
                json.dump(config_data, f, indent=2, ensure_ascii=False)
 
            return True
 
        except Exception as e:
            logger.error(f"更新配置文件w_id失败: {str(e)}")
            return False
 
    def get_current_w_id(self) -> str:
        """
        获取当前的w_id
 
        Returns:
            当前的w_id值
        """
        with self._lock:
            return self.ecloud_w_id
 
 
# 全局配置实例
settings = Settings()