Lib.utils.AutoRestartOnebot
自动重启 Onebot 实现端
1""" 2自动重启 Onebot 实现端 3""" 4 5from Lib.utils import EventClassifier, Logger, Actions 6from Lib.core import ConfigManager, EventManager, ThreadPool 7 8import time 9 10heartbeat_interval = -1 11last_heartbeat_time = -1 12logger = Logger.get_logger() 13 14 15@ThreadPool.async_task 16def restart_onebot(message): 17 """ 18 重启 Onebot 实现端 19 Args: 20 message: 触发重启的原因 21 Returns: 22 None 23 """ 24 if ConfigManager.GlobalConfig().auto_restart_onebot.enable is False: 25 logger.warning(f"检测到 {message},由于未启用自动重启功能,将不会自动重启 Onebot 实现端") 26 return 27 logger.warning(f"因为 {message},将尝试自动重启 Onebot 实现端!") 28 action = Actions.SetRestart(2000).call() 29 if action.get_result().is_ok: 30 logger.warning("尝试重启 Onebot 实现端成功!") 31 else: 32 logger.error("尝试重启 Onebot 实现端失败!") 33 34 35@EventManager.event_listener(EventClassifier.HeartbeatMetaEvent) 36def on_heartbeat(event: EventClassifier.HeartbeatMetaEvent): 37 """ 38 心跳包事件监听器 39 Args: 40 event: 心跳包事件 41 """ 42 global heartbeat_interval, last_heartbeat_time 43 heartbeat_interval = event.interval / 1000 44 last_heartbeat_time = time.time() 45 status = event.status 46 if status['online'] is not True or status['good'] is not True: 47 logger.warning("心跳包状态异常,当前状态:%s" % status) 48 restart_onebot("心跳包状态异常") 49 50 51def check_heartbeat(): 52 """ 53 心跳包检查线程 54 """ 55 flag = -1 # 心跳包状态,-1表示正常,其他表示异常 56 interval = 0.1 # 心跳包检查间隔 57 has_new_heartbeat = False # 是否有有新的心跳包 58 _last_heartbeat_time = -1 # 用于检测是否有新的心跳包 59 while True: 60 if heartbeat_interval != -1: 61 interval = heartbeat_interval / 4 62 63 # 检查是否有新的心跳包 64 if _last_heartbeat_time != last_heartbeat_time: 65 has_new_heartbeat = True 66 _last_heartbeat_time = last_heartbeat_time 67 68 # 检查心跳包是否超时 69 if time.time() - last_heartbeat_time > heartbeat_interval * 2: 70 if flag == -1: 71 logger.warning("心跳包超时!请检查 Onebot 实现端是否正常运行!") 72 restart_onebot("心跳包超时") 73 flag = 3 74 elif flag > 0 and has_new_heartbeat: 75 flag -= 1 76 has_new_heartbeat = False 77 elif flag == 0: 78 logger.info("心跳包间隔已恢复正常") 79 flag = -1 80 81 time.sleep(interval)
heartbeat_interval =
-1
last_heartbeat_time =
-1
logger =
<RootLogger root (INFO)>
def
restart_onebot(*args, **kwargs):
64 def wrapper(*args, **kwargs): 65 if isinstance(thread_pool, ThreadPoolExecutor): 66 return thread_pool.submit(_wrapper, func, *args, **kwargs) 67 else: 68 logger.warning("Thread Pool is not initialized. Please call init() before using it.") 69 return func(*args, **kwargs)
重启 Onebot 实现端
Arguments:
- message: 触发重启的原因
Returns:
None
@EventManager.event_listener(EventClassifier.HeartbeatMetaEvent)
def
on_heartbeat(event: Lib.utils.EventClassifier.HeartbeatMetaEvent):
36@EventManager.event_listener(EventClassifier.HeartbeatMetaEvent) 37def on_heartbeat(event: EventClassifier.HeartbeatMetaEvent): 38 """ 39 心跳包事件监听器 40 Args: 41 event: 心跳包事件 42 """ 43 global heartbeat_interval, last_heartbeat_time 44 heartbeat_interval = event.interval / 1000 45 last_heartbeat_time = time.time() 46 status = event.status 47 if status['online'] is not True or status['good'] is not True: 48 logger.warning("心跳包状态异常,当前状态:%s" % status) 49 restart_onebot("心跳包状态异常")
心跳包事件监听器
Arguments:
- event: 心跳包事件
def
check_heartbeat():
52def check_heartbeat(): 53 """ 54 心跳包检查线程 55 """ 56 flag = -1 # 心跳包状态,-1表示正常,其他表示异常 57 interval = 0.1 # 心跳包检查间隔 58 has_new_heartbeat = False # 是否有有新的心跳包 59 _last_heartbeat_time = -1 # 用于检测是否有新的心跳包 60 while True: 61 if heartbeat_interval != -1: 62 interval = heartbeat_interval / 4 63 64 # 检查是否有新的心跳包 65 if _last_heartbeat_time != last_heartbeat_time: 66 has_new_heartbeat = True 67 _last_heartbeat_time = last_heartbeat_time 68 69 # 检查心跳包是否超时 70 if time.time() - last_heartbeat_time > heartbeat_interval * 2: 71 if flag == -1: 72 logger.warning("心跳包超时!请检查 Onebot 实现端是否正常运行!") 73 restart_onebot("心跳包超时") 74 flag = 3 75 elif flag > 0 and has_new_heartbeat: 76 flag -= 1 77 has_new_heartbeat = False 78 elif flag == 0: 79 logger.info("心跳包间隔已恢复正常") 80 flag = -1 81 82 time.sleep(interval)
心跳包检查线程