💥 🐛 add support for non-plaintext start message

This commit is contained in:
Mix
2021-02-07 02:21:31 +08:00
parent bf7b2a8cbe
commit abcdbc4de9
2 changed files with 16 additions and 12 deletions

View File

@ -13,7 +13,7 @@ from types import ModuleType
from dataclasses import dataclass from dataclasses import dataclass
from importlib._bootstrap import _load from importlib._bootstrap import _load
from contextvars import Context, ContextVar, copy_context from contextvars import Context, ContextVar, copy_context
from typing import Any, Set, List, Dict, Type, Tuple, Union, Optional, TYPE_CHECKING from typing import Any, Set, List, Dict, Type, Tuple, Union, Optional, TYPE_CHECKING, Iterable
from nonebot.log import logger from nonebot.log import logger
from nonebot.matcher import Matcher from nonebot.matcher import Matcher
@ -22,7 +22,7 @@ from nonebot.typing import T_State, T_StateFactory, T_Handler, T_RuleChecker
from nonebot.rule import Rule, startswith, endswith, keyword, command, shell_command, ArgumentParser, regex from nonebot.rule import Rule, startswith, endswith, keyword, command, shell_command, ArgumentParser, regex
if TYPE_CHECKING: if TYPE_CHECKING:
from nonebot.adapters import Bot, Event from nonebot.adapters import Bot, Event, MessageSegment
plugins: Dict[str, "Plugin"] = {} plugins: Dict[str, "Plugin"] = {}
""" """
@ -421,13 +421,16 @@ def on_command(cmd: Union[str, Tuple[str, ...]],
""" """
async def _strip_cmd(bot: "Bot", event: "Event", state: T_State): async def _strip_cmd(bot: "Bot", event: "Event", state: T_State):
message = event.get_message() message: Iterable[MessageSegment] = event.get_message()
segment = message.pop(0) text_processed = False
new_message = message.__class__( for index, segment in enumerate(message):
str(segment) segment: MessageSegment = message.pop(index)
[len(state["_prefix"]["raw_command"]):].lstrip()) # type: ignore if segment.is_text() and not text_processed:
for new_segment in reversed(new_message): segment, *_ = message.__class__(
message.insert(0, new_segment) str(segment)[len(state["_prefix"]["raw_command"]):].lstrip(
)) # type: ignore
text_processed = True
message.insert(index, segment)
handlers = kwargs.pop("handlers", []) handlers = kwargs.pop("handlers", [])
handlers.insert(0, _strip_cmd) handlers.insert(0, _strip_cmd)

View File

@ -25,7 +25,7 @@ from nonebot.exception import ParserExit
from nonebot.typing import T_State, T_RuleChecker from nonebot.typing import T_State, T_RuleChecker
if TYPE_CHECKING: if TYPE_CHECKING:
from nonebot.adapters import Bot, Event from nonebot.adapters import Bot, Event, MessageSegment
class Rule: class Rule:
@ -137,8 +137,9 @@ class TrieRule:
prefix = None prefix = None
suffix = None suffix = None
message = event.get_message() message = event.get_message()
message_seg = message[0] message_seg: Optional[MessageSegment] = next(
if message_seg.is_text(): filter(lambda x: x.is_text(), message), None)
if message_seg is not None:
prefix = cls.prefix.longest_prefix(str(message_seg).lstrip()) prefix = cls.prefix.longest_prefix(str(message_seg).lstrip())
message_seg_r = message[-1] message_seg_r = message[-1]
if message_seg_r.is_text(): if message_seg_r.is_text():