feat: nakuru适配器基础模型

This commit is contained in:
Rock Chin
2023-04-23 15:58:37 +08:00
parent 48ee940d8e
commit 612033f478
4 changed files with 153 additions and 2 deletions

View File

@@ -79,4 +79,58 @@ class MessageSourceAdapter:
bool: 是否成功关闭热重载时若此函数返回False则不会重载MessageSource底层
"""
raise NotImplementedError
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

View File

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

View File

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

View File

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