From 612033f478f5b7cdff570a5ef63357c483105358 Mon Sep 17 00:00:00 2001 From: Rock Chin <1010553892@qq.com> Date: Sun, 23 Apr 2023 15:58:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20nakuru=E9=80=82=E9=85=8D=E5=99=A8?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/qqbot/adapter.py | 56 +++++++++++++++++++- pkg/qqbot/manager.py | 2 +- pkg/qqbot/sources/nakuru.py | 96 ++++++++++++++++++++++++++++++++++ pkg/qqbot/sources/yirimirai.py | 1 + 4 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 pkg/qqbot/sources/nakuru.py diff --git a/pkg/qqbot/adapter.py b/pkg/qqbot/adapter.py index 5d4faa00..0d00915d 100644 --- a/pkg/qqbot/adapter.py +++ b/pkg/qqbot/adapter.py @@ -79,4 +79,58 @@ class MessageSourceAdapter: bool: 是否成功关闭,热重载时若此函数返回False则不会重载MessageSource底层 """ raise NotImplementedError - \ No newline at end of file + + +class MessageConverter: + """消息链转换器基类""" + @staticmethod + def yiri2target(message_chain: mirai.MessageChain): + """将YiriMirai消息链转换为目标消息链 + + Args: + message_chain (mirai.MessageChain): YiriMirai消息链 + + Returns: + typing.Any: 目标消息链 + """ + raise NotImplementedError + + @staticmethod + def target2yiri(message_chain: typing.Any) -> mirai.MessageChain: + """将目标消息链转换为YiriMirai消息链 + + Args: + message_chain (typing.Any): 目标消息链 + + Returns: + mirai.MessageChain: YiriMirai消息链 + """ + raise NotImplementedError + + +class EventConverter: + """事件转换器基类""" + + @staticmethod + def yiri2target(event: typing.Type[mirai.Event]): + """将YiriMirai事件转换为目标事件 + + Args: + event (typing.Type[mirai.Event]): YiriMirai事件 + + Returns: + typing.Any: 目标事件 + """ + raise NotImplementedError + + @staticmethod + def target2yiri(event: typing.Any) -> mirai.Event: + """将目标事件的调用参数转换为YiriMirai的事件参数对象 + + Args: + event (typing.Any): 目标事件 + + Returns: + typing.Type[mirai.Event]: YiriMirai事件 + """ + raise NotImplementedError diff --git a/pkg/qqbot/manager.py b/pkg/qqbot/manager.py index 747854cb..ce5b1c90 100644 --- a/pkg/qqbot/manager.py +++ b/pkg/qqbot/manager.py @@ -92,7 +92,7 @@ class QQBotManager: from pkg.qqbot.sources.yirimirai import YiriMiraiAdapter self.bot_account_id = config.mirai_http_api_config['qq'] self.adapter = YiriMiraiAdapter(mirai_http_api_config) - elif config.msg_source_adapter == 'nonebot2': + elif config.msg_source_adapter == 'nakuru': pass else: self.adapter = pkg.utils.context.get_qqbot_manager().adapter diff --git a/pkg/qqbot/sources/nakuru.py b/pkg/qqbot/sources/nakuru.py new file mode 100644 index 00000000..addc2ed4 --- /dev/null +++ b/pkg/qqbot/sources/nakuru.py @@ -0,0 +1,96 @@ +import mirai + +from ..adapter import MessageSourceAdapter, MessageConverter, EventConverter +import nakuru + +import asyncio +import typing + + +class NakuruProjectMessageConverter(MessageConverter): + @staticmethod + def yiri2target(message_chain: mirai.MessageChain) -> list: + pass + + @staticmethod + def target2yiri(message_chain: typing.Any) -> mirai.MessageChain: + pass + + +class NakuruProjectEventConverter(EventConverter): + @staticmethod + def yiri2target(event: typing.Type[mirai.Event]): + if event is mirai.GroupMessage: + return "GroupMessage" + elif event is mirai.FriendMessage: + return "FriendMessage" + elif event is mirai.StrangerMessage: + return "FriendMessage" + else: + raise Exception("Unknown event type: " + str(event)) + + @staticmethod + def target2yiri(event: typing.Any) -> mirai.Event: + pass + + +class NakuruProjectAdapter(MessageSourceAdapter): + """nakuru-project适配器""" + bot: nakuru.CQHTTP + + message_converter: NakuruProjectMessageConverter + event_converter: NakuruProjectEventConverter + + def __init__(self, config: dict): + """初始化nakuru-project的对象""" + self.bot = nakuru.CQHTTP(**config) + + def send_message( + self, + target_type: str, + target_id: str, + message: mirai.MessageChain + ): + task = None + if target_type == "group": + task = self.bot.sendGroupMessage(int(target_id), self.message_converter.yiri2target(message)) + elif target_type == "person": + task = self.bot.sendFriendMessage(int(target_id), self.message_converter.yiri2target(message)) + else: + raise Exception("Unknown target type: " + target_type) + + asyncio.run(task) + + def reply_message( + self, + message_source: mirai.MessageEvent, + message: mirai.MessageChain, + quote_origin: bool = False + ): + pass + + def is_muted(self, group_id: int) -> bool: + pass + + def register_listener( + self, + event_type: typing.Type[mirai.Event], + callback: typing.Callable[[mirai.Event], None] + ): + def listener_wrapper(app: nakuru.CQHTTP, source: nakuru.GroupMessage): + callback(self.event_converter.target2yiri(source)) + + self.bot.receiver(self.event_converter.yiri2target(event_type))(listener_wrapper) + + def unregister_listener( + self, + event_type: typing.Type[mirai.Event], + callback: typing.Callable[[mirai.Event], None] + ): + pass + + def run_sync(self): + self.bot.run() + + def kill(self) -> bool: + return False diff --git a/pkg/qqbot/sources/yirimirai.py b/pkg/qqbot/sources/yirimirai.py index 0026ba94..8aa14ba4 100644 --- a/pkg/qqbot/sources/yirimirai.py +++ b/pkg/qqbot/sources/yirimirai.py @@ -68,6 +68,7 @@ class YiriMiraiAdapter(MessageSourceAdapter): Args: message_source (mirai.MessageEvent): YiriMirai消息源事件 message (mirai.MessageChain): YiriMirai库的消息链 + quote_origin (bool, optional): 是否引用原消息. Defaults to False. """ asyncio.run(self.bot.send(message_source, message, quote_origin))