From 877fa1a75adaf7412b8f33505ea83ad0995dcde4 Mon Sep 17 00:00:00 2001 From: Artin Date: Mon, 4 Jan 2021 22:24:43 +0800 Subject: [PATCH] :bug: Fix cqhttp `Message` null parameter --- nonebot/adapters/cqhttp/message.py | 50 +++++++++++++++--------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/nonebot/adapters/cqhttp/message.py b/nonebot/adapters/cqhttp/message.py index 1a7bd538..e5981ad6 100644 --- a/nonebot/adapters/cqhttp/message.py +++ b/nonebot/adapters/cqhttp/message.py @@ -222,29 +222,29 @@ class Message(BaseMessage): for seg in msg: yield MessageSegment(seg["type"], seg.get("data") or {}) return + elif isinstance(msg, str): + def _iter_message(msg: str) -> Iterable[Tuple[str, str]]: + text_begin = 0 + for cqcode in re.finditer( + r"\[CQ:(?P[a-zA-Z0-9-_.]+)" + r"(?P" + r"(?:,[a-zA-Z0-9-_.]+=[^,\]]+)*" + r"),?\]", msg): + yield "text", msg[text_begin:cqcode.pos + cqcode.start()] + text_begin = cqcode.pos + cqcode.end() + yield cqcode.group("type"), cqcode.group("params").lstrip(",") + yield "text", msg[text_begin:] - def _iter_message(msg: str) -> Iterable[Tuple[str, str]]: - text_begin = 0 - for cqcode in re.finditer( - r"\[CQ:(?P[a-zA-Z0-9-_.]+)" - r"(?P" - r"(?:,[a-zA-Z0-9-_.]+=[^,\]]+)*" - r"),?\]", msg): - yield "text", msg[text_begin:cqcode.pos + cqcode.start()] - text_begin = cqcode.pos + cqcode.end() - yield cqcode.group("type"), cqcode.group("params").lstrip(",") - yield "text", msg[text_begin:] - - for type_, data in _iter_message(msg): - if type_ == "text": - if data: - # only yield non-empty text segment - yield MessageSegment(type_, {"text": unescape(data)}) - else: - data = { - k: unescape(v) for k, v in map( - lambda x: x.split("=", maxsplit=1), - filter(lambda x: x, ( - x.lstrip() for x in data.split(",")))) - } - yield MessageSegment(type_, data) + for type_, data in _iter_message(msg): + if type_ == "text": + if data: + # only yield non-empty text segment + yield MessageSegment(type_, {"text": unescape(data)}) + else: + data = { + k: unescape(v) for k, v in map( + lambda x: x.split("=", maxsplit=1), + filter(lambda x: x, ( + x.lstrip() for x in data.split(",")))) + } + yield MessageSegment(type_, data)