From 69945b730fd3f6b6138ce50e49fc3392fcd74d71 Mon Sep 17 00:00:00 2001 From: yj <2077506045@qq.com> Date: 星期一, 28 七月 2025 18:16:52 +0800 Subject: [PATCH] 新增关键词过滤;新增活跃客服统计;新增掉线通知 --- config.py | 194 ++++++++++++++++++++++++++++++++++-------------- 1 files changed, 137 insertions(+), 57 deletions(-) diff --git a/config.py b/config.py index d7919aa..e0b1455 100644 --- a/config.py +++ b/config.py @@ -4,6 +4,8 @@ import os import json +import threading +from loguru import logger class Settings: @@ -12,95 +14,173 @@ def __init__(self, config_file: str = "config.json"): """鍒濆鍖栭厤缃紝浠嶫SON鏂囦欢鍔犺浇""" self.config_file = config_file + self._lock = threading.Lock() # 鐢ㄤ簬绾跨▼瀹夊叏鐨勯厤缃洿鏂� self._load_config() def _load_config(self): """浠嶫SON鏂囦欢鍔犺浇閰嶇疆""" + if not os.path.exists(self.config_file): + raise FileNotFoundError(f"閰嶇疆鏂囦欢 {self.config_file} 涓嶅瓨鍦�") + try: - if os.path.exists(self.config_file): - with open(self.config_file, 'r', encoding='utf-8') as f: - config_data = json.load(f) - self._set_config_from_dict(config_data) - else: - # 濡傛灉閰嶇疆鏂囦欢涓嶅瓨鍦紝浣跨敤榛樿鍊� - self._set_default_config() + 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: - print(f"鍔犺浇閰嶇疆鏂囦欢澶辫触: {e}") - self._set_default_config() + raise Exception(f"鍔犺浇閰嶇疆鏂囦欢澶辫触: {e}") def _set_config_from_dict(self, config_data: dict): """浠庡瓧鍏歌缃厤缃�""" # 鏁版嵁搴撻厤缃� - self.database_url = config_data.get("database", {}).get("url", "mysql+pymysql://root:TAI%402019%23Zjun@120.24.39.179:3306/ecloud_dify") + self.database_url = config_data["database"]["url"] # Redis閰嶇疆 - self.redis_url = config_data.get("redis", {}).get("url", "redis://localhost:6379/0") + self.redis_url = config_data["redis"]["url"] # E浜戠瀹堕厤缃� - ecloud_config = config_data.get("ecloud", {}) - self.ecloud_base_url = ecloud_config.get("base_url", "http://125.122.152.142:9899") - self.ecloud_authorization = ecloud_config.get("authorization", "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxMzYxMTQ1MjE3NSIsInBhc3N3b3JkIjoiJDJhJDEwJEU3Ry5LOEJzekphM2JGQlh0SG8vOXVrUk1NalVweGVVemguUDRnMkJBdHN2YXpBb0JIQWJpIn0.Gd2vbeJjL5pUGFhUngWPLkDTLhD3GUaEPXOkdoTf4KRh9o2FtST1OZJxmZuGdUy7WIYlIPVueoVyIu5iHOyi8A") - self.ecloud_w_id = ecloud_config.get("w_id", "") + 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.get("dify", {}) - self.dify_base_url = dify_config.get("base_url", "https://api.dify.ai/v1") - self.dify_api_key = dify_config.get("api_key", "app-OMnBr7zsf5UTV83Ey8QcSErA") + 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.get("server", {}) - self.server_host = server_config.get("host", "0.0.0.0") - self.server_port = server_config.get("port", 7979) - self.debug = server_config.get("debug", True) + 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.get("logging", {}) - self.log_level = logging_config.get("level", "INFO") - self.log_file = logging_config.get("file", "logs/app.log") + logging_config = config_data["logging"] + self.log_level = logging_config["level"] + self.log_file = logging_config["file"] # 娑堟伅澶勭悊閰嶇疆 - msg_config = config_data.get("message_processing", {}) - self.max_retry_count = msg_config.get("max_retry_count", 3) - self.retry_delay = msg_config.get("retry_delay", 5) - self.queue_timeout = msg_config.get("queue_timeout", 300) + 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.get("customer_service", {}) - self.customer_service_names = customer_service_config.get("names", ["瀹㈡湇1", "瀹㈡湇2"]) + 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", "鏅鸿兘瀹㈡湇") - def _set_default_config(self): - """璁剧疆榛樿閰嶇疆""" - # 鏁版嵁搴撻厤缃� - self.database_url = "mysql+pymysql://root:TAI%402019%23Zjun@120.24.39.179:3306/ecloud_dify" + # 濂藉弸蹇界暐閰嶇疆 + friend_ignore_config = config_data["friend_ignore"] + self.friend_ignore_enabled = friend_ignore_config["enabled"] + self.friend_ignore_whitelist = friend_ignore_config["whitelist"] - # Redis閰嶇疆 - self.redis_url = "redis://localhost:6379/0" + # 闈欓粯妯″紡閰嶇疆 + silence_mode_config = config_data["silence_mode"] + self.silence_mode_enabled = silence_mode_config["enabled"] + self.silence_duration_minutes = silence_mode_config["duration_minutes"] - # E浜戠瀹堕厤缃� - self.ecloud_base_url = "http://125.122.152.142:9899" - self.ecloud_authorization = "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxMzYxMTQ1MjE3NSIsInBhc3N3b3JkIjoiJDJhJDEwJEU3Ry5LOEJzekphM2JGQlh0SG8vOXVrUk1NalVweGVVemguUDRnMkJBdHN2YXpBb0JIQWJpIn0.Gd2vbeJjL5pUGFhUngWPLkDTLhD3GUaEPXOkdoTf4KRh9o2FtST1OZJxmZuGdUy7WIYlIPVueoVyIu5iHOyi8A" - self.ecloud_w_id = "" + # 鍦ㄧ嚎鐘舵�佺洃鎺ч厤缃� + 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"] - # DifyAI閰嶇疆 - self.dify_base_url = "https://api.dify.ai/v1" - self.dify_api_key = "app-OMnBr7zsf5UTV83Ey8QcSErA" + # 閭欢閫氱煡閰嶇疆 + 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"] - # 鏈嶅姟閰嶇疆 - self.server_host = "0.0.0.0" - self.server_port = 7979 - self.debug = True + # 鐭俊閫氱煡閰嶇疆 + 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"] - # 鏃ュ織閰嶇疆 - self.log_level = "INFO" - self.log_file = "logs/app.log" + # 鍏抽敭璇嶈繃婊ら厤缃� + 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", []) - # 娑堟伅澶勭悊閰嶇疆 - self.max_retry_count = 3 - self.retry_delay = 5 - self.queue_timeout = 300 + def update_ecloud_w_id(self, new_w_id: str) -> bool: + """ + 鍔ㄦ�佹洿鏂癊浜戠瀹剁殑w_id閰嶇疆 - # 瀹㈡湇閰嶇疆 - self.customer_service_names = ["瀹㈡湇1", "瀹㈡湇2"] + Args: + new_w_id: 鏂扮殑w_id鍊� + + Returns: + 鏇存柊鎴愬姛杩斿洖True锛屽け璐ヨ繑鍥濬alse + """ + 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"鏇存柊閰嶇疆鏂囦欢澶辫触锛屽洖婊歸_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锛屽け璐ヨ繑鍥濬alse + """ + 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: + """ + 鑾峰彇褰撳墠鐨剋_id + + Returns: + 褰撳墠鐨剋_id鍊� + """ + with self._lock: + return self.ecloud_w_id # 鍏ㄥ眬閰嶇疆瀹炰緥 -- Gitblit v1.9.1