mirror of
				https://github.com/nonebot/nonebot2.git
				synced 2025-10-27 13:06:40 +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