💥 matcher prompt support message formatter

This commit is contained in:
yanyongyu 2021-09-11 13:45:03 +08:00
parent 12c1f6d764
commit b635d01519
2 changed files with 9 additions and 19 deletions

View File

@ -22,4 +22,5 @@ except Exception:
from ._bot import Bot from ._bot import Bot
from ._event import Event from ._event import Event
from ._formatter import MessageFormatter
from ._message import Message, MessageSegment from ._message import Message, MessageSegment

View File

@ -16,6 +16,7 @@ from typing import (Any, Type, List, Dict, Union, Mapping, Iterable, Callable,
from nonebot.rule import Rule from nonebot.rule import Rule
from nonebot.log import logger from nonebot.log import logger
from nonebot.handler import Handler from nonebot.handler import Handler
from nonebot.adapters import MessageFormatter
from nonebot.permission import Permission, USER from nonebot.permission import Permission, USER
from nonebot.typing import (T_State, T_StateFactory, T_Handler, T_ArgsParser, from nonebot.typing import (T_State, T_StateFactory, T_Handler, T_ArgsParser,
T_TypeUpdater, T_PermissionUpdater) T_TypeUpdater, T_PermissionUpdater)
@ -401,7 +402,8 @@ class Matcher(metaclass=MatcherMeta):
def got( def got(
cls, cls,
key: str, key: str,
prompt: Optional[Union[str, "Message", "MessageSegment"]] = None, prompt: Optional[Union[str, "Message", "MessageSegment",
MessageFormatter]] = None,
args_parser: Optional[T_ArgsParser] = None args_parser: Optional[T_ArgsParser] = None
) -> Callable[[T_Handler], T_Handler]: ) -> Callable[[T_Handler], T_Handler]:
""" """
@ -412,7 +414,7 @@ class Matcher(metaclass=MatcherMeta):
:参数: :参数:
* ``key: str``: 参数名 * ``key: str``: 参数名
* ``prompt: Optional[Union[str, Message, MessageSegment]]``: 在参数不存在时向用户发送的消息 * ``prompt: Optional[Union[str, Message, MessageSegment, MessageFormatter]]``: 在参数不存在时向用户发送的消息
* ``args_parser: Optional[T_ArgsParser]``: 可选参数解析函数空则使用默认解析函数 * ``args_parser: Optional[T_ArgsParser]``: 可选参数解析函数空则使用默认解析函数
""" """
@ -420,23 +422,11 @@ class Matcher(metaclass=MatcherMeta):
state["_current_key"] = key state["_current_key"] = key
if key not in state: if key not in state:
if prompt: if prompt:
if isinstance(prompt, str): if isinstance(prompt, MessageFormatter):
await bot.send(event=event, _prompt = prompt.format(**state)
message=prompt.format(**state))
elif isinstance(prompt, Mapping):
if prompt.is_text():
await bot.send(event=event,
message=str(prompt).format(**state))
else:
await bot.send(event=event, message=prompt)
elif isinstance(prompt, Iterable):
await bot.send(
event=event,
message=prompt.__class__(
str(prompt).format(**state)) # type: ignore
)
else: else:
logger.warning("Unknown prompt type, ignored.") _prompt = prompt
await bot.send(event=event, message=_prompt)
raise PausedException raise PausedException
else: else:
state["_skip_key"] = True state["_skip_key"] = True
@ -456,7 +446,6 @@ class Matcher(metaclass=MatcherMeta):
parser_handler = cls.append_handler(_key_parser) parser_handler = cls.append_handler(_key_parser)
def _decorator(func: T_Handler) -> T_Handler: def _decorator(func: T_Handler) -> T_Handler:
print("deco", key, hasattr(cls.handlers[-1].func, "__wrapped__"))
if not hasattr(cls.handlers[-1].func, "__wrapped__"): if not hasattr(cls.handlers[-1].func, "__wrapped__"):
parser = cls.handlers.pop() parser = cls.handlers.pop()
func_handler = Handler(func) func_handler = Handler(func)