Explorar o código

加入时间管理模块,使用md5验证实现热加载config.json变化

a5225662 %!s(int64=3) %!d(string=hai) anos
pai
achega
9fe59f2949
Modificáronse 4 ficheiros con 82 adicións e 2 borrados
  1. 4 0
      channel/wechat/wechat_channel.py
  2. 72 0
      common/time_check.py
  3. 4 1
      config-template.json
  4. 2 1
      config.py

+ 4 - 0
channel/wechat/wechat_channel.py

@@ -12,6 +12,7 @@ from concurrent.futures import ThreadPoolExecutor
 from common.log import logger
 from common.tmp_dir import TmpDir
 from config import conf
+from common.time_check import time_checker
 import requests
 import io
 import time
@@ -66,6 +67,8 @@ class WechatChannel(Channel):
             else:
                 self._do_send_text(query, from_user_id)
 
+
+    @time_checker
     def handle_text(self, msg):
         logger.debug("[WX]receive text msg: " + json.dumps(msg, ensure_ascii=False))
         content = msg['Text']
@@ -109,6 +112,7 @@ class WechatChannel(Channel):
                 thread_pool.submit(self._do_send_text, content, to_user_id)
 
 
+    @time_checker
     def handle_group(self, msg):
         logger.debug("[WX]receive group msg: " + json.dumps(msg, ensure_ascii=False))
         group_name = msg['User'].get('NickName', None)

+ 72 - 0
common/time_check.py

@@ -0,0 +1,72 @@
+import time,re,hashlib
+from config import load_config,md5,conf
+import config
+
+
+def get_file_md5(file_name):
+    """
+    计算文件的md5
+    :param file_name:
+    :return m.hexdigest():
+    """
+    m = hashlib.md5()   #创建md5对象
+    with open(file_name,'rb') as fobj:
+        while True:
+            data = fobj.read(1024)
+            if not data:
+                break
+            m.update(data)  #更新md5对象
+ 
+    return m.hexdigest()    #返回md5值
+
+
+def time_checker(f):
+    # print(args[0]())
+    def wrapTheFunction(self, *args, **kwargs):
+        global md5  # 从config.py拿来一个全局变量md5  默认是False
+        if md5 == None:
+            _config = conf()
+        elif md5 == get_file_md5("./config.json"):
+            _config = conf()
+            # chat_time_module = _config["chat_time_module"]
+            # chat_start_time = _config["chat_start_time"]
+            # chat_stopt_time = _config["chat_stop_time"]
+        else:
+            print("检测到配置文件变化")
+            _config = load_config()  # 启动时间支持热更改  修改config.json文件后即可生效
+            md5 = get_file_md5("./config.json")
+            # config.md5 = get_file_md5("./config.json")
+        
+        chat_time_module = _config["chat_time_module"]
+        chat_start_time = _config["chat_start_time"]
+        chat_stopt_time = _config["chat_stop_time"]
+        # print(md5,chat_time_module,chat_start_time,chat_stopt_time)
+
+        if chat_time_module:
+            time_regex = re.compile(r'^([01]?[0-9]|2[0-4])(:)([0-5][0-9])$')  #时间匹配,包含24:00
+
+            starttime_format_check = time_regex.match(chat_start_time)  # 检查停止时间格式
+            stoptime_format_check = time_regex.match(chat_stopt_time)  # 检查停止时间格式
+            chat_time_check = chat_start_time < chat_stopt_time # 确定启动时间<停止时间
+
+            if starttime_format_check and stoptime_format_check and chat_time_check:
+                # print('服务启动时间:{}'.format(CHAT_START_TIME))
+                # print('服务结束时间:{}'.format(CHAT_STOP_TIME))
+                if chat_start_time>"23:59":
+                    print('启动时间可能存在问题,请修改')
+            else:
+                print("时间格式不正确,请在config.json中修改您的CHAT_START_TIME/CHAT_STOP_TIME,否则可能会影响您正常使用,程序正在自动退出")
+
+            now_time = time.strftime("%H:%M", time.localtime())
+            if chat_start_time <= now_time <= chat_stopt_time:
+                # print("在服务时间内")
+                # 正常请求并返回
+                f(self, *args, **kwargs)
+                return None
+            else:
+                print('不在服务时间内,禁止访问')
+                return None
+        else:
+            f(self, *args, **kwargs)
+    return wrapTheFunction
+

+ 4 - 1
config-template.json

@@ -11,6 +11,9 @@
    "voice_reply_voice": false,
    "conversation_max_tokens": 1000,
    "expires_in_seconds": 3600,
-   "character_desc": "你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。"
+   "character_desc": "你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。",
+   "chat_time_module": false,
+   "chat_start_time": "00:00",
+   "chat_stop_time": "24:00"   
  }
 

+ 2 - 1
config.py

@@ -5,7 +5,7 @@ import os
 from common.log import logger
 
 config = {}
-
+md5 = None
 
 def load_config():
     global config
@@ -17,6 +17,7 @@ def load_config():
     # 将json字符串反序列化为dict类型
     config = json.loads(config_str)
     logger.info("[INIT] load config: {}".format(config))
+    return config