implement text merger

This commit is contained in:
StarHeartHunt 2021-07-08 10:49:02 +08:00
parent 79b6601d12
commit 7df407056b

View File

@ -2,7 +2,7 @@ import json
import itertools import itertools
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any, Dict, Tuple, Type, Union, Mapping, Iterable from typing import Any, Dict, List, Tuple, Type, Union, Mapping, Iterable
from nonebot.adapters import Message as BaseMessage, MessageSegment as BaseMessageSegment from nonebot.adapters import Message as BaseMessage, MessageSegment as BaseMessageSegment
from nonebot.typing import overrides from nonebot.typing import overrides
@ -137,6 +137,18 @@ class Message(BaseMessage[MessageSegment]):
else: else:
yield MessageSegment(seg["type"], seg.get("data") or {}) yield MessageSegment(seg["type"], seg.get("data") or {})
def _merge(self) -> "Message":
i: int
seg: MessageSegment
msg: List[MessageSegment] = []
for i, seg in enumerate(self):
if seg.type == "text" and i != 0 and msg[-1].type == "text":
msg[-1] = MessageSegment(
"text", {"text": msg[-1].data["text"] + seg.data["text"]})
else:
msg.append(seg)
return Message(msg)
@overrides(BaseMessage) @overrides(BaseMessage)
def extract_plain_text(self) -> str: def extract_plain_text(self) -> str:
return "".join(seg.data["text"] for seg in self if seg.is_text()) return "".join(seg.data["text"] for seg in self if seg.is_text())
@ -169,7 +181,7 @@ class MessageDeserializer:
for seg in itertools.chain(*self.data["content"]): for seg in itertools.chain(*self.data["content"]):
tag = seg.pop("tag") tag = seg.pop("tag")
msg += MessageSegment(tag if tag != "img" else "image", seg) msg += MessageSegment(tag if tag != "img" else "image", seg)
return msg return msg._merge()
else: else:
return Message(MessageSegment(self.type, self.data)) return Message(MessageSegment(self.type, self.data))