diff --git a/main.py b/main.py index 79f0c07c..b7fc6d91 100644 --- a/main.py +++ b/main.py @@ -77,7 +77,7 @@ def main(first_time_init=False): timeout=config.process_message_timeout, retry=config.retry_times, first_time_init=first_time_init) - if first_time_init: # 不是热重载之后的启动,则不启动新的bot线程 + if first_time_init: # 不是热重载之后的启动,则不启动新的bot线程 qq_bot_thread = threading.Thread(target=qqbot.bot.run, args=(), daemon=True) qq_bot_thread.start() diff --git a/pkg/qqbot/manager.py b/pkg/qqbot/manager.py index 594c5c28..fd71739e 100644 --- a/pkg/qqbot/manager.py +++ b/pkg/qqbot/manager.py @@ -3,10 +3,13 @@ import json import os import threading +import mirai.models.bus import openai.error from mirai import At, GroupMessage, MessageEvent, Mirai, Plain, StrangerMessage, WebSocketAdapter, HTTPAdapter, \ FriendMessage, Image +from mirai.models.bus import ModelEventBus + from mirai.models.message import Quote import config @@ -77,7 +80,32 @@ class QQBotManager: pkg.utils.context.set_qqbot_manager(self) + # Caution: 注册新的事件处理器之后,请务必在unsubscribe_all中编写相应的取消订阅代码 + @self.bot.on(FriendMessage) + async def on_friend_message(event: FriendMessage): + go(self.on_person_message, (event,)) + + @self.bot.on(StrangerMessage) + async def on_stranger_message(event: StrangerMessage): + go(self.on_person_message, (event,)) + + @self.bot.on(GroupMessage) + async def on_group_message(event: GroupMessage): + go(self.on_group_message, (event,)) + + def unsubscribe_all(): + assert isinstance(self.bot, Mirai) + bus = self.bot.bus + assert isinstance(bus, mirai.models.bus.ModelEventBus) + + bus.unsubscribe(FriendMessage, on_friend_message) + bus.unsubscribe(StrangerMessage, on_stranger_message) + bus.unsubscribe(GroupMessage, on_group_message) + + self.unsubscribe_all = unsubscribe_all + def first_time_init(self, mirai_http_api_config: dict): + """热重载后不再运行此函数""" if 'adapter' not in mirai_http_api_config or mirai_http_api_config['adapter'] == "WebSocketAdapter": bot = Mirai( @@ -103,18 +131,6 @@ class QQBotManager: self.bot = bot - @self.bot.on(FriendMessage) - async def on_friend_message(event: FriendMessage): - go(self.on_person_message, (event,)) - - @self.bot.on(StrangerMessage) - async def on_stranger_message(event: StrangerMessage): - go(self.on_person_message, (event,)) - - @self.bot.on(GroupMessage) - async def on_group_message(event: GroupMessage): - go(self.on_group_message, (event,)) - def send(self, event, msg, check_quote=True): asyncio.run( self.bot.send(event, msg, quote=True if hasattr(config, @@ -122,7 +138,6 @@ class QQBotManager: # 私聊消息处理 def on_person_message(self, event: MessageEvent): - reply = '' if event.sender.id == self.bot.qq: diff --git a/pkg/utils/reloader.py b/pkg/utils/reloader.py index 67cc51a7..1a883546 100644 --- a/pkg/utils/reloader.py +++ b/pkg/utils/reloader.py @@ -21,11 +21,13 @@ def walk(module, prefix=''): def reload_all(): + # 解除bot的事件注册 + import pkg + pkg.utils.context.get_qqbot_manager().unsubscribe_all() # 执行关闭流程 logging.info("执行程序关闭流程") import main main.stop() - import pkg context = pkg.utils.context.context walk(pkg)