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)

心跳包检查线程