refactor: 将 yirimirai 的组件集成进 platform 包

This commit is contained in:
RockChinQ
2024-09-26 00:23:03 +08:00
parent ee0d6dcdae
commit 1c4a700d92
36 changed files with 1580 additions and 342 deletions

View File

@@ -5,31 +5,34 @@ import traceback
import time
import datetime
import mirai
import mirai.models.message as yiri_message
# import mirai
# import mirai.models.message as yiri_message
import aiocqhttp
from .. import adapter
from ...pipeline.longtext.strategies import forward
from ...core import app
from ..types import message as platform_message
from ..types import events as platform_events
from ..types import entities as platform_entities
class AiocqhttpMessageConverter(adapter.MessageConverter):
@staticmethod
def yiri2target(message_chain: mirai.MessageChain) -> typing.Tuple[list, int, datetime.datetime]:
def yiri2target(message_chain: platform_message.MessageChain) -> typing.Tuple[list, int, datetime.datetime]:
msg_list = aiocqhttp.Message()
msg_id = 0
msg_time = None
for msg in message_chain:
if type(msg) is mirai.Plain:
if type(msg) is platform_message.Plain:
msg_list.append(aiocqhttp.MessageSegment.text(msg.text))
elif type(msg) is yiri_message.Source:
elif type(msg) is platform_message.Source:
msg_id = msg.id
msg_time = msg.time
elif type(msg) is mirai.Image:
elif type(msg) is platform_message.Image:
arg = ''
if msg.base64:
arg = msg.base64
@@ -40,13 +43,11 @@ class AiocqhttpMessageConverter(adapter.MessageConverter):
elif msg.path:
arg = msg.path
msg_list.append(aiocqhttp.MessageSegment.image(arg))
elif type(msg) is mirai.At:
elif type(msg) is platform_message.At:
msg_list.append(aiocqhttp.MessageSegment.at(msg.target))
elif type(msg) is mirai.AtAll:
elif type(msg) is platform_message.AtAll:
msg_list.append(aiocqhttp.MessageSegment.at("all"))
elif type(msg) is mirai.Face:
msg_list.append(aiocqhttp.MessageSegment.face(msg.face_id))
elif type(msg) is mirai.Voice:
elif type(msg) is platform_message.Voice:
arg = ''
if msg.base64:
arg = msg.base64
@@ -74,25 +75,25 @@ class AiocqhttpMessageConverter(adapter.MessageConverter):
yiri_msg_list = []
yiri_msg_list.append(
yiri_message.Source(id=message_id, time=datetime.datetime.now())
platform_message.Source(id=message_id, time=datetime.datetime.now())
)
for msg in message:
if msg.type == "at":
if msg.data["qq"] == "all":
yiri_msg_list.append(yiri_message.AtAll())
yiri_msg_list.append(platform_message.AtAll())
else:
yiri_msg_list.append(
yiri_message.At(
platform_message.At(
target=msg.data["qq"],
)
)
elif msg.type == "text":
yiri_msg_list.append(yiri_message.Plain(text=msg.data["text"]))
yiri_msg_list.append(platform_message.Plain(text=msg.data["text"]))
elif msg.type == "image":
yiri_msg_list.append(yiri_message.Image(url=msg.data["url"]))
yiri_msg_list.append(platform_message.Image(url=msg.data["url"]))
chain = mirai.MessageChain(yiri_msg_list)
chain = platform_message.MessageChain(yiri_msg_list)
return chain
@@ -100,11 +101,11 @@ class AiocqhttpMessageConverter(adapter.MessageConverter):
class AiocqhttpEventConverter(adapter.EventConverter):
@staticmethod
def yiri2target(event: mirai.Event, bot_account_id: int):
def yiri2target(event: platform_events.Event, bot_account_id: int):
msg, msg_id, msg_time = AiocqhttpMessageConverter.yiri2target(event.message_chain)
if type(event) is mirai.GroupMessage:
if type(event) is platform_events.GroupMessage:
role = "member"
if event.sender.permission == "ADMINISTRATOR":
@@ -140,7 +141,7 @@ class AiocqhttpEventConverter(adapter.EventConverter):
}
return aiocqhttp.Event.from_payload(payload)
elif type(event) is mirai.FriendMessage:
elif type(event) is platform_events.FriendMessage:
payload = {
"post_type": "message",
@@ -177,15 +178,15 @@ class AiocqhttpEventConverter(adapter.EventConverter):
permission = "ADMINISTRATOR"
elif event.sender["role"] == "owner":
permission = "OWNER"
converted_event = mirai.GroupMessage(
sender=mirai.models.entities.GroupMember(
converted_event = platform_events.GroupMessage(
sender=platform_entities.GroupMember(
id=event.sender["user_id"], # message_seq 放哪?
member_name=event.sender["nickname"],
permission=permission,
group=mirai.models.entities.Group(
group=platform_entities.Group(
id=event.group_id,
name=event.sender["nickname"],
permission=mirai.models.entities.Permission.Member,
permission=platform_entities.Permission.Member,
),
special_title=event.sender["title"] if "title" in event.sender else "",
join_timestamp=0,
@@ -197,8 +198,8 @@ class AiocqhttpEventConverter(adapter.EventConverter):
)
return converted_event
elif event.message_type == "private":
return mirai.FriendMessage(
sender=mirai.models.entities.Friend(
return platform_events.FriendMessage(
sender=platform_entities.Friend(
id=event.sender["user_id"],
nickname=event.sender["nickname"],
remark="",
@@ -240,7 +241,7 @@ class AiocqhttpAdapter(adapter.MessageSourceAdapter):
self.bot = aiocqhttp.CQHttp()
async def send_message(
self, target_type: str, target_id: str, message: mirai.MessageChain
self, target_type: str, target_id: str, message: platform_message.MessageChain
):
aiocq_msg = AiocqhttpMessageConverter.yiri2target(message)[0]
@@ -251,8 +252,8 @@ class AiocqhttpAdapter(adapter.MessageSourceAdapter):
async def reply_message(
self,
message_source: mirai.MessageEvent,
message: mirai.MessageChain,
message_source: platform_events.MessageEvent,
message: platform_message.MessageChain,
quote_origin: bool = False,
):
aiocq_event = AiocqhttpEventConverter.yiri2target(message_source, self.bot_account_id)
@@ -270,8 +271,8 @@ class AiocqhttpAdapter(adapter.MessageSourceAdapter):
def register_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event, adapter.MessageSourceAdapter], None],
event_type: typing.Type[platform_events.Event],
callback: typing.Callable[[platform_events.Event, adapter.MessageSourceAdapter], None],
):
async def on_message(event: aiocqhttp.Event):
self.bot_account_id = event.self_id
@@ -280,15 +281,15 @@ class AiocqhttpAdapter(adapter.MessageSourceAdapter):
except:
traceback.print_exc()
if event_type == mirai.GroupMessage:
if event_type == platform_events.GroupMessage:
self.bot.on_message("group")(on_message)
elif event_type == mirai.FriendMessage:
elif event_type == platform_events.FriendMessage:
self.bot.on_message("private")(on_message)
def unregister_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event, adapter.MessageSourceAdapter], None],
event_type: typing.Type[platform_events.Event],
callback: typing.Callable[[platform_events.Event, adapter.MessageSourceAdapter], None],
):
return super().unregister_listener(event_type, callback)

View File

@@ -6,26 +6,29 @@ import typing
import traceback
import logging
import mirai
# import mirai
import nakuru
import nakuru.entities.components as nkc
from .. import adapter as adapter_model
from ...pipeline.longtext.strategies import forward
from ...platform.types import message as platform_message
from ...platform.types import entities as platform_entities
from ...platform.types import events as platform_events
class NakuruProjectMessageConverter(adapter_model.MessageConverter):
"""消息转换器"""
@staticmethod
def yiri2target(message_chain: mirai.MessageChain) -> list:
def yiri2target(message_chain: platform_message.MessageChain) -> list:
msg_list = []
if type(message_chain) is mirai.MessageChain:
if type(message_chain) is platform_message.MessageChain:
msg_list = message_chain.__root__
elif type(message_chain) is list:
msg_list = message_chain
elif type(message_chain) is str:
msg_list = [mirai.Plain(message_chain)]
msg_list = [platform_message.Plain(message_chain)]
else:
raise Exception("Unknown message type: " + str(message_chain) + str(type(message_chain)))
@@ -33,22 +36,20 @@ class NakuruProjectMessageConverter(adapter_model.MessageConverter):
# 遍历并转换
for component in msg_list:
if type(component) is mirai.Plain:
if type(component) is platform_message.Plain:
nakuru_msg_list.append(nkc.Plain(component.text, False))
elif type(component) is mirai.Image:
elif type(component) is platform_message.Image:
if component.url is not None:
nakuru_msg_list.append(nkc.Image.fromURL(component.url))
elif component.base64 is not None:
nakuru_msg_list.append(nkc.Image.fromBase64(component.base64))
elif component.path is not None:
nakuru_msg_list.append(nkc.Image.fromFileSystem(component.path))
elif type(component) is mirai.Face:
nakuru_msg_list.append(nkc.Face(id=component.face_id))
elif type(component) is mirai.At:
elif type(component) is platform_message.At:
nakuru_msg_list.append(nkc.At(qq=component.target))
elif type(component) is mirai.AtAll:
elif type(component) is platform_message.AtAll:
nakuru_msg_list.append(nkc.AtAll())
elif type(component) is mirai.Voice:
elif type(component) is platform_message.Voice:
if component.url is not None:
nakuru_msg_list.append(nkc.Record.fromURL(component.url))
elif component.path is not None:
@@ -80,49 +81,47 @@ class NakuruProjectMessageConverter(adapter_model.MessageConverter):
return nakuru_msg_list
@staticmethod
def target2yiri(message_chain: typing.Any, message_id: int = -1) -> mirai.MessageChain:
def target2yiri(message_chain: typing.Any, message_id: int = -1) -> platform_message.MessageChain:
"""将Yiri的消息链转换为YiriMirai的消息链"""
assert type(message_chain) is list
yiri_msg_list = []
import datetime
# 添加Source组件以标记message_id等信息
yiri_msg_list.append(mirai.models.message.Source(id=message_id, time=datetime.datetime.now()))
yiri_msg_list.append(platform_message.Source(id=message_id, time=datetime.datetime.now()))
for component in message_chain:
if type(component) is nkc.Plain:
yiri_msg_list.append(mirai.Plain(text=component.text))
yiri_msg_list.append(platform_message.Plain(text=component.text))
elif type(component) is nkc.Image:
yiri_msg_list.append(mirai.Image(url=component.url))
elif type(component) is nkc.Face:
yiri_msg_list.append(mirai.Face(face_id=component.id))
yiri_msg_list.append(platform_message.Image(url=component.url))
elif type(component) is nkc.At:
yiri_msg_list.append(mirai.At(target=component.qq))
yiri_msg_list.append(platform_message.At(target=component.qq))
elif type(component) is nkc.AtAll:
yiri_msg_list.append(mirai.AtAll())
yiri_msg_list.append(platform_message.AtAll())
else:
pass
# logging.debug("转换后的消息链: " + str(yiri_msg_list))
chain = mirai.MessageChain(yiri_msg_list)
chain = platform_message.MessageChain(yiri_msg_list)
return chain
class NakuruProjectEventConverter(adapter_model.EventConverter):
"""事件转换器"""
@staticmethod
def yiri2target(event: typing.Type[mirai.Event]):
if event is mirai.GroupMessage:
def yiri2target(event: typing.Type[platform_events.Event]):
if event is platform_events.GroupMessage:
return nakuru.GroupMessage
elif event is mirai.FriendMessage:
elif event is platform_events.FriendMessage:
return nakuru.FriendMessage
else:
raise Exception("未支持转换的事件类型: " + str(event))
@staticmethod
def target2yiri(event: typing.Any) -> mirai.Event:
def target2yiri(event: typing.Any) -> platform_events.Event:
yiri_chain = NakuruProjectMessageConverter.target2yiri(event.message, event.message_id)
if type(event) is nakuru.FriendMessage: # 私聊消息事件
return mirai.FriendMessage(
sender=mirai.models.entities.Friend(
return platform_events.FriendMessage(
sender=platform_entities.Friend(
id=event.sender.user_id,
nickname=event.sender.nickname,
remark=event.sender.nickname
@@ -138,16 +137,15 @@ class NakuruProjectEventConverter(adapter_model.EventConverter):
elif event.sender.role == "owner":
permission = "OWNER"
import mirai.models.entities as entities
return mirai.GroupMessage(
sender=mirai.models.entities.GroupMember(
return platform_events.GroupMessage(
sender=platform_entities.GroupMember(
id=event.sender.user_id,
member_name=event.sender.nickname,
permission=permission,
group=mirai.models.entities.Group(
group=platform_entities.Group(
id=event.group_id,
name=event.sender.nickname,
permission=entities.Permission.Member
permission=platform_entities.Permission.Member
),
special_title=event.sender.title,
join_timestamp=0,
@@ -189,7 +187,7 @@ class NakuruProjectAdapter(adapter_model.MessageSourceAdapter):
self,
target_type: str,
target_id: str,
message: typing.Union[mirai.MessageChain, list],
message: typing.Union[platform_message.MessageChain, list],
converted: bool = False
):
task = None
@@ -222,8 +220,8 @@ class NakuruProjectAdapter(adapter_model.MessageSourceAdapter):
async def reply_message(
self,
message_source: mirai.MessageEvent,
message: mirai.MessageChain,
message_source: platform_events.MessageEvent,
message: platform_message.MessageChain,
quote_origin: bool = False
):
message = self.message_converter.yiri2target(message)
@@ -233,14 +231,14 @@ class NakuruProjectAdapter(adapter_model.MessageSourceAdapter):
id=message_source.message_chain.message_id,
)
)
if type(message_source) is mirai.GroupMessage:
if type(message_source) is platform_events.GroupMessage:
await self.send_message(
"group",
message_source.sender.group.id,
message,
converted=True
)
elif type(message_source) is mirai.FriendMessage:
elif type(message_source) is platform_events.FriendMessage:
await self.send_message(
"person",
message_source.sender.id,
@@ -258,8 +256,8 @@ class NakuruProjectAdapter(adapter_model.MessageSourceAdapter):
def register_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
event_type: typing.Type[platform_events.Event],
callback: typing.Callable[[platform_events.Event, adapter_model.MessageSourceAdapter], None]
):
try:
@@ -286,8 +284,8 @@ class NakuruProjectAdapter(adapter_model.MessageSourceAdapter):
def unregister_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
event_type: typing.Type[platform_events.Event],
callback: typing.Callable[[platform_events.Event, adapter_model.MessageSourceAdapter], None]
):
nakuru_event_name = self.event_converter.yiri2target(event_type).__name__

View File

@@ -6,7 +6,7 @@ import datetime
import re
import traceback
import mirai
# import mirai
import botpy
import botpy.message as botpy_message
import botpy.types.message as botpy_message_type
@@ -17,17 +17,21 @@ from .. import adapter as adapter_model
from ...pipeline.longtext.strategies import forward
from ...core import app
from ...config import manager as cfg_mgr
from ...platform.types import entities as platform_entities
from ...platform.types import events as platform_events
from ...platform.types import message as platform_message
class OfficialGroupMessage(mirai.GroupMessage):
class OfficialGroupMessage(platform_events.GroupMessage):
pass
class OfficialFriendMessage(mirai.FriendMessage):
class OfficialFriendMessage(platform_events.FriendMessage):
pass
event_handler_mapping = {
mirai.GroupMessage: ["on_at_message_create", "on_group_at_message_create"],
mirai.FriendMessage: ["on_direct_message_create", "on_c2c_message_create"],
platform_events.GroupMessage: ["on_at_message_create", "on_group_at_message_create"],
platform_events.FriendMessage: ["on_direct_message_create", "on_c2c_message_create"],
}
@@ -123,16 +127,16 @@ class OfficialMessageConverter(adapter_model.MessageConverter):
"""QQ 官方消息转换器"""
@staticmethod
def yiri2target(message_chain: mirai.MessageChain):
def yiri2target(message_chain: platform_message.MessageChain):
"""将 YiriMirai 的消息链转换为 QQ 官方消息"""
msg_list = []
if type(message_chain) is mirai.MessageChain:
if type(message_chain) is platform_message.MessageChain:
msg_list = message_chain.__root__
elif type(message_chain) is list:
msg_list = message_chain
elif type(message_chain) is str:
msg_list = [mirai.Plain(text=message_chain)]
msg_list = [platform_message.Plain(text=message_chain)]
else:
raise Exception(
"Unknown message type: " + str(message_chain) + str(type(message_chain))
@@ -153,22 +157,22 @@ class OfficialMessageConverter(adapter_model.MessageConverter):
# 遍历并转换
for component in msg_list:
if type(component) is mirai.Plain:
if type(component) is platform_message.Plain:
offcial_messages.append({"type": "text", "content": component.text})
elif type(component) is mirai.Image:
elif type(component) is platform_message.Image:
if component.url is not None:
offcial_messages.append({"type": "image", "content": component.url})
elif component.path is not None:
offcial_messages.append(
{"type": "file_image", "content": component.path}
)
elif type(component) is mirai.At:
elif type(component) is platform_message.At:
offcial_messages.append({"type": "at", "content": ""})
elif type(component) is mirai.AtAll:
elif type(component) is platform_message.AtAll:
print(
"上层组件要求发送 AtAll 消息,但 QQ 官方 API 不支持此消息类型,忽略此消息。"
)
elif type(component) is mirai.Voice:
elif type(component) is platform_message.Voice:
print(
"上层组件要求发送 Voice 消息,但 QQ 官方 API 不支持此消息类型,忽略此消息。"
)
@@ -197,29 +201,29 @@ class OfficialMessageConverter(adapter_model.MessageConverter):
message: typing.Union[botpy_message.Message, botpy_message.DirectMessage, botpy_message.GroupMessage, botpy_message.C2CMessage],
message_id: str = None,
bot_account_id: int = 0,
) -> mirai.MessageChain:
) -> platform_message.MessageChain:
yiri_msg_list = []
# 存id
yiri_msg_list.append(
mirai.models.message.Source(
platform_message.Source(
id=save_msg_id(message_id), time=datetime.datetime.now()
)
)
if type(message) not in [botpy_message.DirectMessage, botpy_message.C2CMessage]:
yiri_msg_list.append(mirai.At(target=bot_account_id))
yiri_msg_list.append(platform_message.At(target=bot_account_id))
if hasattr(message, "mentions"):
for mention in message.mentions:
if mention.bot:
continue
yiri_msg_list.append(mirai.At(target=mention.id))
yiri_msg_list.append(platform_message.At(target=mention.id))
for attachment in message.attachments:
if attachment.content_type.startswith("image"):
yiri_msg_list.append(mirai.Image(url=attachment.url))
yiri_msg_list.append(platform_message.Image(url=attachment.url))
else:
logging.warning(
"不支持的附件类型:" + attachment.content_type + ",忽略此附件。"
@@ -227,9 +231,9 @@ class OfficialMessageConverter(adapter_model.MessageConverter):
content = re.sub(r"<@!\d+>", "", str(message.content))
if content.strip() != "":
yiri_msg_list.append(mirai.Plain(text=content))
yiri_msg_list.append(platform_message.Plain(text=content))
chain = mirai.MessageChain(yiri_msg_list)
chain = platform_message.MessageChain(yiri_msg_list)
return chain
@@ -244,10 +248,10 @@ class OfficialEventConverter(adapter_model.EventConverter):
self.member_openid_mapping = member_openid_mapping
self.group_openid_mapping = group_openid_mapping
def yiri2target(self, event: typing.Type[mirai.Event]):
if event == mirai.GroupMessage:
def yiri2target(self, event: typing.Type[platform_events.Event]):
if event == platform_events.GroupMessage:
return botpy_message.Message
elif event == mirai.FriendMessage:
elif event == platform_events.FriendMessage:
return botpy_message.DirectMessage
else:
raise Exception(
@@ -257,8 +261,7 @@ class OfficialEventConverter(adapter_model.EventConverter):
def target2yiri(
self,
event: typing.Union[botpy_message.Message, botpy_message.DirectMessage, botpy_message.GroupMessage, botpy_message.C2CMessage],
) -> mirai.Event:
import mirai.models.entities as mirai_entities
) -> platform_events.Event:
if type(event) == botpy_message.Message: # 频道内,转群聊事件
permission = "MEMBER"
@@ -268,15 +271,15 @@ class OfficialEventConverter(adapter_model.EventConverter):
elif "4" in event.member.roles:
permission = "OWNER"
return mirai.GroupMessage(
sender=mirai_entities.GroupMember(
return platform_events.GroupMessage(
sender=platform_entities.GroupMember(
id=event.author.id,
member_name=event.author.username,
permission=permission,
group=mirai_entities.Group(
group=platform_entities.Group(
id=event.channel_id,
name=event.author.username,
permission=mirai_entities.Permission.Member,
permission=platform_entities.Permission.Member,
),
special_title="",
join_timestamp=int(
@@ -297,8 +300,8 @@ class OfficialEventConverter(adapter_model.EventConverter):
),
)
elif type(event) == botpy_message.DirectMessage: # 频道私聊,转私聊事件
return mirai.FriendMessage(
sender=mirai_entities.Friend(
return platform_events.FriendMessage(
sender=platform_entities.Friend(
id=event.guild_id,
nickname=event.author.username,
remark=event.author.username,
@@ -317,14 +320,14 @@ class OfficialEventConverter(adapter_model.EventConverter):
replacing_member_id = self.member_openid_mapping.save_openid(event.author.member_openid)
return OfficialGroupMessage(
sender=mirai_entities.GroupMember(
sender=platform_entities.GroupMember(
id=replacing_member_id,
member_name=replacing_member_id,
permission="MEMBER",
group=mirai_entities.Group(
group=platform_entities.Group(
id=self.group_openid_mapping.save_openid(event.group_openid),
name=replacing_member_id,
permission=mirai_entities.Permission.Member,
permission=platform_entities.Permission.Member,
),
special_title="",
join_timestamp=int(0),
@@ -345,7 +348,7 @@ class OfficialEventConverter(adapter_model.EventConverter):
user_id_alter = self.member_openid_mapping.save_openid(event.author.user_openid) # 实测这里的user_openid与group的member_openid是一样的
return OfficialFriendMessage(
sender=mirai_entities.Friend(
sender=platform_entities.Friend(
id=user_id_alter,
nickname=user_id_alter,
remark=user_id_alter,
@@ -410,7 +413,7 @@ class OfficialAdapter(adapter_model.MessageSourceAdapter):
self.bot = botpy.Client(intents=intents)
async def send_message(
self, target_type: str, target_id: str, message: mirai.MessageChain
self, target_type: str, target_id: str, message: platform_message.MessageChain
):
message_list = self.message_converter.yiri2target(message)
@@ -437,8 +440,8 @@ class OfficialAdapter(adapter_model.MessageSourceAdapter):
async def reply_message(
self,
message_source: mirai.MessageEvent,
message: mirai.MessageChain,
message_source: platform_events.MessageEvent,
message: platform_message.MessageChain,
quote_origin: bool = False,
):
@@ -463,13 +466,13 @@ class OfficialAdapter(adapter_model.MessageSourceAdapter):
]
)
if type(message_source) == mirai.GroupMessage:
if type(message_source) == platform_events.GroupMessage:
args["channel_id"] = str(message_source.sender.group.id)
args["msg_id"] = cached_message_ids[
str(message_source.message_chain.message_id)
]
await self.bot.api.post_message(**args)
elif type(message_source) == mirai.FriendMessage:
elif type(message_source) == platform_events.FriendMessage:
args["guild_id"] = str(message_source.sender.id)
args["msg_id"] = cached_message_ids[
str(message_source.message_chain.message_id)
@@ -534,9 +537,9 @@ class OfficialAdapter(adapter_model.MessageSourceAdapter):
def register_listener(
self,
event_type: typing.Type[mirai.Event],
event_type: typing.Type[platform_events.Event],
callback: typing.Callable[
[mirai.Event, adapter_model.MessageSourceAdapter], None
[platform_events.Event, adapter_model.MessageSourceAdapter], None
],
):
@@ -560,9 +563,9 @@ class OfficialAdapter(adapter_model.MessageSourceAdapter):
def unregister_listener(
self,
event_type: typing.Type[mirai.Event],
event_type: typing.Type[platform_events.Event],
callback: typing.Callable[
[mirai.Event, adapter_model.MessageSourceAdapter], None
[platform_events.Event, adapter_model.MessageSourceAdapter], None
],
):
delattr(self.bot, event_handler_mapping[event_type])

View File

@@ -1,124 +1,124 @@
import asyncio
import typing
# import asyncio
# import typing
import mirai
import mirai.models.bus
from mirai.bot import MiraiRunner
# import mirai
# import mirai.models.bus
# from mirai.bot import MiraiRunner
from .. import adapter as adapter_model
from ...core import app
# from .. import adapter as adapter_model
# from ...core import app
@adapter_model.adapter_class("yiri-mirai")
class YiriMiraiAdapter(adapter_model.MessageSourceAdapter):
"""YiriMirai适配器"""
bot: mirai.Mirai
# @adapter_model.adapter_class("yiri-mirai")
# class YiriMiraiAdapter(adapter_model.MessageSourceAdapter):
# """YiriMirai适配器"""
# bot: mirai.Mirai
def __init__(self, config: dict, ap: app.Application):
"""初始化YiriMirai的对象"""
self.ap = ap
self.config = config
if 'adapter' not in config or \
config['adapter'] == 'WebSocketAdapter':
self.bot = mirai.Mirai(
qq=config['qq'],
adapter=mirai.WebSocketAdapter(
host=config['host'],
port=config['port'],
verify_key=config['verifyKey']
)
)
elif config['adapter'] == 'HTTPAdapter':
self.bot = mirai.Mirai(
qq=config['qq'],
adapter=mirai.HTTPAdapter(
host=config['host'],
port=config['port'],
verify_key=config['verifyKey']
)
)
else:
raise Exception('Unknown adapter for YiriMirai: ' + config['adapter'])
# def __init__(self, config: dict, ap: app.Application):
# """初始化YiriMirai的对象"""
# self.ap = ap
# self.config = config
# if 'adapter' not in config or \
# config['adapter'] == 'WebSocketAdapter':
# self.bot = mirai.Mirai(
# qq=config['qq'],
# adapter=mirai.WebSocketAdapter(
# host=config['host'],
# port=config['port'],
# verify_key=config['verifyKey']
# )
# )
# elif config['adapter'] == 'HTTPAdapter':
# self.bot = mirai.Mirai(
# qq=config['qq'],
# adapter=mirai.HTTPAdapter(
# host=config['host'],
# port=config['port'],
# verify_key=config['verifyKey']
# )
# )
# else:
# raise Exception('Unknown adapter for YiriMirai: ' + config['adapter'])
async def send_message(
self,
target_type: str,
target_id: str,
message: mirai.MessageChain
):
"""发送消息
# async def send_message(
# self,
# target_type: str,
# target_id: str,
# message: mirai.MessageChain
# ):
# """发送消息
Args:
target_type (str): 目标类型,`person`或`group`
target_id (str): 目标ID
message (mirai.MessageChain): YiriMirai库的消息链
"""
task = None
if target_type == 'person':
task = self.bot.send_friend_message(int(target_id), message)
elif target_type == 'group':
task = self.bot.send_group_message(int(target_id), message)
else:
raise Exception('Unknown target type: ' + target_type)
# Args:
# target_type (str): 目标类型,`person`或`group`
# target_id (str): 目标ID
# message (mirai.MessageChain): YiriMirai库的消息链
# """
# task = None
# if target_type == 'person':
# task = self.bot.send_friend_message(int(target_id), message)
# elif target_type == 'group':
# task = self.bot.send_group_message(int(target_id), message)
# else:
# raise Exception('Unknown target type: ' + target_type)
await task
# await task
async def reply_message(
self,
message_source: mirai.MessageEvent,
message: mirai.MessageChain,
quote_origin: bool = False
):
"""回复消息
# async def reply_message(
# self,
# message_source: mirai.MessageEvent,
# message: mirai.MessageChain,
# quote_origin: bool = False
# ):
# """回复消息
Args:
message_source (mirai.MessageEvent): YiriMirai消息源事件
message (mirai.MessageChain): YiriMirai库的消息链
quote_origin (bool, optional): 是否引用原消息. Defaults to False.
"""
await self.bot.send(message_source, message, quote_origin)
# Args:
# message_source (mirai.MessageEvent): YiriMirai消息源事件
# message (mirai.MessageChain): YiriMirai库的消息链
# quote_origin (bool, optional): 是否引用原消息. Defaults to False.
# """
# await self.bot.send(message_source, message, quote_origin)
async def is_muted(self, group_id: int) -> bool:
result = await self.bot.member_info(target=group_id, member_id=self.bot.qq).get()
if result.mute_time_remaining > 0:
return True
return False
# async def is_muted(self, group_id: int) -> bool:
# result = await self.bot.member_info(target=group_id, member_id=self.bot.qq).get()
# if result.mute_time_remaining > 0:
# return True
# return False
def register_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
):
"""注册事件监听器
# def register_listener(
# self,
# event_type: typing.Type[mirai.Event],
# callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
# ):
# """注册事件监听器
Args:
event_type (typing.Type[mirai.Event]): YiriMirai事件类型
callback (typing.Callable[[mirai.Event], None]): 回调函数接收一个参数为YiriMirai事件
"""
async def wrapper(event: mirai.Event):
await callback(event, self)
self.bot.on(event_type)(wrapper)
# Args:
# event_type (typing.Type[mirai.Event]): YiriMirai事件类型
# callback (typing.Callable[[mirai.Event], None]): 回调函数接收一个参数为YiriMirai事件
# """
# async def wrapper(event: mirai.Event):
# await callback(event, self)
# self.bot.on(event_type)(wrapper)
def unregister_listener(
self,
event_type: typing.Type[mirai.Event],
callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
):
"""注销事件监听器
# def unregister_listener(
# self,
# event_type: typing.Type[mirai.Event],
# callback: typing.Callable[[mirai.Event, adapter_model.MessageSourceAdapter], None]
# ):
# """注销事件监听器
Args:
event_type (typing.Type[mirai.Event]): YiriMirai事件类型
callback (typing.Callable[[mirai.Event], None]): 回调函数接收一个参数为YiriMirai事件
"""
assert isinstance(self.bot, mirai.Mirai)
bus = self.bot.bus
assert isinstance(bus, mirai.models.bus.ModelEventBus)
# Args:
# event_type (typing.Type[mirai.Event]): YiriMirai事件类型
# callback (typing.Callable[[mirai.Event], None]): 回调函数接收一个参数为YiriMirai事件
# """
# assert isinstance(self.bot, mirai.Mirai)
# bus = self.bot.bus
# assert isinstance(bus, mirai.models.bus.ModelEventBus)
bus.unsubscribe(event_type, callback)
# bus.unsubscribe(event_type, callback)
async def run_async(self):
self.bot_account_id = self.bot.qq
return await MiraiRunner(self.bot)._run()
# async def run_async(self):
# self.bot_account_id = self.bot.qq
# return await MiraiRunner(self.bot)._run()
async def kill(self) -> bool:
return False
# async def kill(self) -> bool:
# return False