mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-12 00:36:03 +00:00
refactor: 将 yirimirai 的组件集成进 platform 包
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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__
|
||||
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user