mirror of
https://github.com/nonebot/nonebot2.git
synced 2025-07-28 00:31:14 +00:00
✨ add send pause reject finish template
This commit is contained in:
@ -10,18 +10,18 @@ from types import ModuleType
|
||||
from datetime import datetime
|
||||
from contextvars import ContextVar
|
||||
from collections import defaultdict
|
||||
from typing import (Any, Type, List, Dict, Union, Mapping, Iterable, Callable,
|
||||
Optional, NoReturn, TYPE_CHECKING)
|
||||
from typing import (TYPE_CHECKING, Any, Dict, List, Type, Union, Mapping,
|
||||
Callable, Iterable, NoReturn, Optional)
|
||||
|
||||
from nonebot.rule import Rule
|
||||
from nonebot.log import logger
|
||||
from nonebot.handler import Handler
|
||||
from nonebot.adapters import MessageTemplate
|
||||
from nonebot.permission import Permission, USER
|
||||
from nonebot.typing import (T_State, T_StateFactory, T_Handler, T_ArgsParser,
|
||||
T_TypeUpdater, T_PermissionUpdater)
|
||||
from nonebot.exception import (PausedException, RejectedException,
|
||||
FinishedException, StopPropagation)
|
||||
from nonebot.permission import USER, Permission
|
||||
from nonebot.exception import (PausedException, StopPropagation,
|
||||
FinishedException, RejectedException)
|
||||
from nonebot.typing import (T_State, T_Handler, T_ArgsParser, T_TypeUpdater,
|
||||
T_StateFactory, T_PermissionUpdater)
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from nonebot.adapters import Bot, Event, Message, MessageSegment
|
||||
@ -31,8 +31,9 @@ matchers: Dict[int, List[Type["Matcher"]]] = defaultdict(list)
|
||||
:类型: ``Dict[int, List[Type[Matcher]]]``
|
||||
:说明: 用于存储当前所有的事件响应器
|
||||
"""
|
||||
current_bot: ContextVar = ContextVar("current_bot")
|
||||
current_event: ContextVar = ContextVar("current_event")
|
||||
current_bot: ContextVar["Bot"] = ContextVar("current_bot")
|
||||
current_event: ContextVar["Event"] = ContextVar("current_event")
|
||||
current_state: ContextVar[T_State] = ContextVar("current_state")
|
||||
|
||||
|
||||
class MatcherMeta(type):
|
||||
@ -421,7 +422,7 @@ class Matcher(metaclass=MatcherMeta):
|
||||
async def _key_getter(bot: "Bot", event: "Event", state: T_State):
|
||||
state["_current_key"] = key
|
||||
if key not in state:
|
||||
if prompt:
|
||||
if prompt is not None:
|
||||
if isinstance(prompt, MessageTemplate):
|
||||
_prompt = prompt.format(**state)
|
||||
else:
|
||||
@ -472,8 +473,8 @@ class Matcher(metaclass=MatcherMeta):
|
||||
return _decorator
|
||||
|
||||
@classmethod
|
||||
async def send(cls, message: Union[str, "Message", "MessageSegment"],
|
||||
**kwargs) -> Any:
|
||||
async def send(cls, message: Union[str, "Message", "MessageSegment",
|
||||
MessageTemplate], **kwargs) -> Any:
|
||||
"""
|
||||
:说明:
|
||||
|
||||
@ -484,14 +485,19 @@ class Matcher(metaclass=MatcherMeta):
|
||||
* ``message: Union[str, Message, MessageSegment]``: 消息内容
|
||||
* ``**kwargs``: 其他传递给 ``bot.send`` 的参数,请参考对应 adapter 的 bot 对象 api
|
||||
"""
|
||||
bot: "Bot" = current_bot.get()
|
||||
bot = current_bot.get()
|
||||
event = current_event.get()
|
||||
return await bot.send(event=event, message=message, **kwargs)
|
||||
state = current_state.get()
|
||||
if isinstance(message, MessageTemplate):
|
||||
_message = message.format(**state)
|
||||
else:
|
||||
_message = message
|
||||
return await bot.send(event=event, message=_message, **kwargs)
|
||||
|
||||
@classmethod
|
||||
async def finish(cls,
|
||||
message: Optional[Union[str, "Message",
|
||||
"MessageSegment"]] = None,
|
||||
message: Optional[Union[str, "Message", "MessageSegment",
|
||||
MessageTemplate]] = None,
|
||||
**kwargs) -> NoReturn:
|
||||
"""
|
||||
:说明:
|
||||
@ -505,14 +511,19 @@ class Matcher(metaclass=MatcherMeta):
|
||||
"""
|
||||
bot = current_bot.get()
|
||||
event = current_event.get()
|
||||
if message is not None:
|
||||
await bot.send(event=event, message=message, **kwargs)
|
||||
state = current_state.get()
|
||||
if isinstance(message, MessageTemplate):
|
||||
_message = message.format(**state)
|
||||
else:
|
||||
_message = message
|
||||
if _message is not None:
|
||||
await bot.send(event=event, message=_message, **kwargs)
|
||||
raise FinishedException
|
||||
|
||||
@classmethod
|
||||
async def pause(cls,
|
||||
prompt: Optional[Union[str, "Message",
|
||||
"MessageSegment"]] = None,
|
||||
prompt: Optional[Union[str, "Message", "MessageSegment",
|
||||
MessageTemplate]] = None,
|
||||
**kwargs) -> NoReturn:
|
||||
"""
|
||||
:说明:
|
||||
@ -526,8 +537,13 @@ class Matcher(metaclass=MatcherMeta):
|
||||
"""
|
||||
bot = current_bot.get()
|
||||
event = current_event.get()
|
||||
if prompt:
|
||||
await bot.send(event=event, message=prompt, **kwargs)
|
||||
state = current_state.get()
|
||||
if isinstance(prompt, MessageTemplate):
|
||||
_prompt = prompt.format(**state)
|
||||
else:
|
||||
_prompt = prompt
|
||||
if _prompt is not None:
|
||||
await bot.send(event=event, message=_prompt, **kwargs)
|
||||
raise PausedException
|
||||
|
||||
@classmethod
|
||||
@ -547,8 +563,13 @@ class Matcher(metaclass=MatcherMeta):
|
||||
"""
|
||||
bot = current_bot.get()
|
||||
event = current_event.get()
|
||||
if prompt:
|
||||
await bot.send(event=event, message=prompt, **kwargs)
|
||||
state = current_state.get()
|
||||
if isinstance(prompt, MessageTemplate):
|
||||
_prompt = prompt.format(**state)
|
||||
else:
|
||||
_prompt = prompt
|
||||
if _prompt is not None:
|
||||
await bot.send(event=event, message=_prompt, **kwargs)
|
||||
raise RejectedException
|
||||
|
||||
def stop_propagation(self):
|
||||
@ -563,6 +584,7 @@ class Matcher(metaclass=MatcherMeta):
|
||||
async def run(self, bot: "Bot", event: "Event", state: T_State):
|
||||
b_t = current_bot.set(bot)
|
||||
e_t = current_event.set(event)
|
||||
s_t = current_state.set(self.state)
|
||||
try:
|
||||
# Refresh preprocess state
|
||||
self.state = await self._default_state_factory(
|
||||
@ -655,3 +677,4 @@ class Matcher(metaclass=MatcherMeta):
|
||||
logger.info(f"Matcher {self} running complete")
|
||||
current_bot.reset(b_t)
|
||||
current_event.reset(e_t)
|
||||
current_state.reset(s_t)
|
||||
|
Reference in New Issue
Block a user