Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion nonebot_plugin_chatrecorder/adapters/onebot_v11.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,18 @@ class Serializer(MessageSerializer[Message]):
@override
def serialize(cls, msg: Message) -> JsonMsg:
cache_b64_msg(msg)
return super().serialize(msg)
return [
{"type": seg.type, "data": cls._serialize_data(seg.data)} for seg in msg
]

@classmethod
def _serialize_data(cls, data: dict) -> dict:
# 合并转发消息的 node 段中嵌套着 Message 对象,
# 直接存储会导致 json 序列化失败
return {
k: cls.serialize(v) if isinstance(v, Message) else v
for k, v in data.items()
}

class Deserializer(MessageDeserializer[Message]):
@classmethod
Expand Down
40 changes: 40 additions & 0 deletions tests/test_onebot_v11.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,3 +219,43 @@ async def test_record_send_msg(app: App):
serialize_message(bot, message),
message.extract_plain_text(),
)


async def test_record_send_forward_msg(app: App):
"""测试记录合并转发消息"""
from nonebot.adapters.onebot.v11 import MessageSegment
from nonebot_plugin_uninfo import Scene, SceneType, Session, User

from nonebot_plugin_chatrecorder.adapters.onebot_v11 import record_send_msg
from nonebot_plugin_chatrecorder.message import serialize_message

async with app.test_api() as ctx:
adapter = get_driver()._adapters[Adapter.get_name()]
bot = ctx.create_bot(base=Bot, adapter=adapter, self_id="11")

group_id = 654321
message_id = 11451466666
message = Message(
MessageSegment.node_custom(10, "test", Message("test forward message"))
)
await record_send_msg(
bot,
None,
"send_group_msg",
{"group_id": group_id, "message": message},
{"message_id": message_id},
)
await check_record(
Session(
self_id="11",
adapter="OneBot V11",
scope="QQClient",
scene=Scene(id=str(group_id), type=SceneType.GROUP),
user=User(id="11"),
),
None,
"message_sent",
str(message_id),
serialize_message(bot, message),
message.extract_plain_text(),
)