feat: 热重载前后更新bot事件订阅

This commit is contained in:
Rock Chin
2023-01-02 11:33:26 +08:00
parent bc3cffa041
commit 14154bafd0
3 changed files with 32 additions and 15 deletions

View File

@@ -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()

View File

@@ -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:

View File

@@ -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)