From 1b00fe7921f14cf363b94853c6d04d0c09069b22 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 20 Dec 2020 11:59:23 +0800 Subject: [PATCH 1/3] :sparkles: add state factory support #113 --- nonebot/matcher.py | 18 +++- nonebot/plugin.py | 120 ++++++++++++--------- nonebot/plugin.pyi | 257 +++++++++++++++++++++++++-------------------- nonebot/typing.py | 8 ++ 4 files changed, 239 insertions(+), 164 deletions(-) diff --git a/nonebot/matcher.py b/nonebot/matcher.py index a13ae1dc..09864e13 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -15,7 +15,7 @@ from typing import Type, List, Dict, Union, Callable, Optional, NoReturn, TYPE_C from nonebot.rule import Rule from nonebot.log import logger from nonebot.permission import Permission, USER -from nonebot.typing import T_State, T_Handler, T_ArgsParser +from nonebot.typing import T_State, T_StateFactory, T_Handler, T_ArgsParser from nonebot.exception import PausedException, RejectedException, FinishedException if TYPE_CHECKING: @@ -95,6 +95,11 @@ class Matcher(metaclass=MatcherMeta): :类型: ``T_State`` :说明: 事件响应器默认状态 """ + _default_state_factory: Optional[T_StateFactory] = None + """ + :类型: ``Optional[T_State]`` + :说明: 事件响应器默认工厂函数 + """ _default_parser: Optional[T_ArgsParser] = None """ @@ -126,6 +131,7 @@ class Matcher(metaclass=MatcherMeta): *, module: Optional[str] = None, default_state: Optional[T_State] = None, + default_state_factory: Optional[T_StateFactory] = None, expire_time: Optional[datetime] = None) -> Type["Matcher"]: """ :说明: @@ -143,6 +149,7 @@ class Matcher(metaclass=MatcherMeta): * ``block: bool``: 是否阻止事件向更低优先级的响应器传播 * ``module: Optional[str]``: 事件响应器所在模块名称 * ``default_state: Optional[T_State]``: 默认状态 ``state`` + * ``default_state_factory: Optional[T_StateFactory]``: 默认状态 ``state`` 的工厂函数 * ``expire_time: Optional[datetime]``: 事件响应器最终有效时间点,过时即被删除 :返回: @@ -161,7 +168,8 @@ class Matcher(metaclass=MatcherMeta): "expire_time": expire_time, "priority": priority, "block": block, - "_default_state": default_state or {} + "_default_state": default_state or {}, + "_default_state_factory": default_state_factory }) matchers[priority].append(NewMatcher) @@ -452,11 +460,13 @@ class Matcher(metaclass=MatcherMeta): e_t = current_event.set(event) try: # Refresh preprocess state - self.state.update(state) + state_ = await self._default_state_factory( + bot, event) if self._default_state_factory else self.state + state_.update(state) for _ in range(len(self.handlers)): handler = self.handlers.pop(0) - await self.run_handler(handler, bot, event, self.state) + await self.run_handler(handler, bot, event, state_) except RejectedException: self.handlers.insert(0, handler) # type: ignore diff --git a/nonebot/plugin.py b/nonebot/plugin.py index 8d280d9c..f6bc57e4 100644 --- a/nonebot/plugin.py +++ b/nonebot/plugin.py @@ -18,7 +18,7 @@ from typing import Any, Set, List, Dict, Type, Tuple, Union, Optional from nonebot.log import logger from nonebot.matcher import Matcher from nonebot.permission import Permission -from nonebot.typing import T_State, T_Handler, T_RuleChecker +from nonebot.typing import T_State, T_StateFactory, T_Handler, T_RuleChecker from nonebot.rule import Rule, startswith, endswith, keyword, command, regex plugins: Dict[str, "Plugin"] = {} @@ -108,7 +108,8 @@ def on(type: str = "", temp: bool = False, priority: int = 1, block: bool = False, - state: Optional[T_State] = None) -> Type[Matcher]: + state: Optional[T_State] = None, + state_factory: Optional[T_StateFactory] = None) -> Type[Matcher]: """ :说明: @@ -123,7 +124,8 @@ def on(type: str = "", * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -136,18 +138,21 @@ def on(type: str = "", priority=priority, block=block, handlers=handlers, - default_state=state) + default_state=state, + default_state_factory=state_factory) _tmp_matchers.get().add(matcher) return matcher -def on_metaevent(rule: Optional[Union[Rule, T_RuleChecker]] = None, - *, - handlers: Optional[List[T_Handler]] = None, - temp: bool = False, - priority: int = 1, - block: bool = False, - state: Optional[T_State] = None) -> Type[Matcher]: +def on_metaevent( + rule: Optional[Union[Rule, T_RuleChecker]] = None, + *, + handlers: Optional[List[T_Handler]] = None, + temp: bool = False, + priority: int = 1, + block: bool = False, + state: Optional[T_State] = None, + state_factory: Optional[T_StateFactory] = None) -> Type[Matcher]: """ :说明: @@ -160,7 +165,8 @@ def on_metaevent(rule: Optional[Union[Rule, T_RuleChecker]] = None, * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -173,7 +179,8 @@ def on_metaevent(rule: Optional[Union[Rule, T_RuleChecker]] = None, priority=priority, block=block, handlers=handlers, - default_state=state) + default_state=state, + default_state_factory=state_factory) _tmp_matchers.get().add(matcher) return matcher @@ -185,7 +192,8 @@ def on_message(rule: Optional[Union[Rule, T_RuleChecker]] = None, temp: bool = False, priority: int = 1, block: bool = True, - state: Optional[T_State] = None) -> Type[Matcher]: + state: Optional[T_State] = None, + state_factory: Optional[T_StateFactory] = None) -> Type[Matcher]: """ :说明: @@ -199,7 +207,8 @@ def on_message(rule: Optional[Union[Rule, T_RuleChecker]] = None, * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -212,7 +221,8 @@ def on_message(rule: Optional[Union[Rule, T_RuleChecker]] = None, priority=priority, block=block, handlers=handlers, - default_state=state) + default_state=state, + default_state_factory=state_factory) _tmp_matchers.get().add(matcher) return matcher @@ -223,7 +233,8 @@ def on_notice(rule: Optional[Union[Rule, T_RuleChecker]] = None, temp: bool = False, priority: int = 1, block: bool = False, - state: Optional[T_State] = None) -> Type[Matcher]: + state: Optional[T_State] = None, + state_factory: Optional[T_StateFactory] = None) -> Type[Matcher]: """ :说明: @@ -236,7 +247,8 @@ def on_notice(rule: Optional[Union[Rule, T_RuleChecker]] = None, * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -249,7 +261,8 @@ def on_notice(rule: Optional[Union[Rule, T_RuleChecker]] = None, priority=priority, block=block, handlers=handlers, - default_state=state) + default_state=state, + default_state_factory=state_factory) _tmp_matchers.get().add(matcher) return matcher @@ -260,7 +273,8 @@ def on_request(rule: Optional[Union[Rule, T_RuleChecker]] = None, temp: bool = False, priority: int = 1, block: bool = False, - state: Optional[T_State] = None) -> Type[Matcher]: + state: Optional[T_State] = None, + state_factory: Optional[T_StateFactory] = None) -> Type[Matcher]: """ :说明: @@ -273,7 +287,8 @@ def on_request(rule: Optional[Union[Rule, T_RuleChecker]] = None, * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -286,7 +301,8 @@ def on_request(rule: Optional[Union[Rule, T_RuleChecker]] = None, priority=priority, block=block, handlers=handlers, - default_state=state) + default_state=state, + default_state_factory=state_factory) _tmp_matchers.get().add(matcher) return matcher @@ -308,7 +324,8 @@ def on_startswith(msg: str, * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -334,7 +351,8 @@ def on_endswith(msg: str, * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -360,7 +378,8 @@ def on_keyword(keywords: Set[str], * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -390,7 +409,8 @@ def on_command(cmd: Union[str, Tuple[str, ...]], * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -430,7 +450,8 @@ def on_regex(pattern: str, * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -521,7 +542,8 @@ class MatcherGroup: * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -529,9 +551,8 @@ class MatcherGroup: """ final_kwargs = self.base_kwargs.copy() final_kwargs.update(kwargs) - matcher = Matcher.new(**final_kwargs) + matcher = on(**final_kwargs) self.matchers.append(matcher) - _tmp_matchers.get().add(matcher) return matcher def on_metaevent(self, **kwargs) -> Type[Matcher]: @@ -547,7 +568,8 @@ class MatcherGroup: * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -556,9 +578,8 @@ class MatcherGroup: final_kwargs = self.base_kwargs.copy() final_kwargs.update(kwargs) final_kwargs.pop("type", None) - matcher = Matcher.new("meta_event", **final_kwargs) + matcher = on_metaevent(**final_kwargs) self.matchers.append(matcher) - _tmp_matchers.get().add(matcher) return matcher def on_message(self, **kwargs) -> Type[Matcher]: @@ -575,7 +596,8 @@ class MatcherGroup: * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -584,9 +606,8 @@ class MatcherGroup: final_kwargs = self.base_kwargs.copy() final_kwargs.update(kwargs) final_kwargs.pop("type", None) - matcher = Matcher.new("message", **final_kwargs) + matcher = on_message(**final_kwargs) self.matchers.append(matcher) - _tmp_matchers.get().add(matcher) return matcher def on_notice(self, **kwargs) -> Type[Matcher]: @@ -602,7 +623,8 @@ class MatcherGroup: * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -611,9 +633,8 @@ class MatcherGroup: final_kwargs = self.base_kwargs.copy() final_kwargs.update(kwargs) final_kwargs.pop("type", None) - matcher = Matcher.new("notice", **final_kwargs) + matcher = on_notice(**final_kwargs) self.matchers.append(matcher) - _tmp_matchers.get().add(matcher) return matcher def on_request(self, **kwargs) -> Type[Matcher]: @@ -629,7 +650,8 @@ class MatcherGroup: * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -638,9 +660,8 @@ class MatcherGroup: final_kwargs = self.base_kwargs.copy() final_kwargs.update(kwargs) final_kwargs.pop("type", None) - matcher = Matcher.new("request", **final_kwargs) + matcher = on_request(**final_kwargs) self.matchers.append(matcher) - _tmp_matchers.get().add(matcher) return matcher def on_startswith(self, @@ -662,7 +683,8 @@ class MatcherGroup: * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -688,7 +710,8 @@ class MatcherGroup: * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -714,7 +737,8 @@ class MatcherGroup: * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -744,7 +768,8 @@ class MatcherGroup: * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: @@ -786,7 +811,8 @@ class MatcherGroup: * ``temp: bool``: 是否为临时事件响应器(仅执行一次) * ``priority: int``: 事件响应器优先级 * ``block: bool``: 是否阻止事件向更低优先级传递 - * ``state: Optional[T_State]``: 默认的 state + * ``state: Optional[T_State]``: 默认 state + * ``state_factory: Optional[T_StateFactory]``: 默认 state 的工厂函数 :返回: diff --git a/nonebot/plugin.pyi b/nonebot/plugin.pyi index 232cab4b..db31ad3d 100644 --- a/nonebot/plugin.pyi +++ b/nonebot/plugin.pyi @@ -6,7 +6,7 @@ from typing import Any, Set, List, Dict, Type, Tuple, Union, Optional from nonebot.rule import Rule from nonebot.matcher import Matcher from nonebot.permission import Permission -from nonebot.typing import T_State, T_Handler, T_RuleChecker +from nonebot.typing import T_State, T_StateFactory, T_Handler, T_RuleChecker plugins: Dict[str, "Plugin"] = ... @@ -41,17 +41,20 @@ def on(type: str = ..., temp: bool = ..., priority: int = ..., block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... -def on_metaevent(rule: Optional[Union[Rule, T_RuleChecker]] = ..., - *, - handlers: Optional[List[T_Handler]] = ..., - temp: bool = ..., - priority: int = ..., - block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: +def on_metaevent( + rule: Optional[Union[Rule, T_RuleChecker]] = ..., + *, + handlers: Optional[List[T_Handler]] = ..., + temp: bool = ..., + priority: int = ..., + block: bool = ..., + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... @@ -62,7 +65,8 @@ def on_message(rule: Optional[Union[Rule, T_RuleChecker]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... @@ -72,7 +76,8 @@ def on_notice(rule: Optional[Union[Rule, T_RuleChecker]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... @@ -82,19 +87,22 @@ def on_request(rule: Optional[Union[Rule, T_RuleChecker]] = ..., temp: bool = ..., priority: int = ..., block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... -def on_startswith(msg: str, - rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = ..., - *, - permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., - temp: bool = ..., - priority: int = ..., - block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: +def on_startswith( + msg: str, + rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = ..., + *, + permission: Optional[Permission] = ..., + handlers: Optional[List[T_Handler]] = ..., + temp: bool = ..., + priority: int = ..., + block: bool = ..., + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... @@ -106,7 +114,8 @@ def on_endswith(msg: str, temp: bool = ..., priority: int = ..., block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... @@ -118,7 +127,8 @@ def on_keyword(keywords: Set[str], temp: bool = ..., priority: int = ..., block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... @@ -131,7 +141,8 @@ def on_command(cmd: Union[str, Tuple[str, ...]], temp: bool = ..., priority: int = ..., block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... @@ -144,7 +155,8 @@ def on_regex(pattern: str, temp: bool = ..., priority: int = ..., block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... @@ -201,7 +213,8 @@ class CommandGroup: temp: bool = ..., priority: int = ..., block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... @@ -228,109 +241,127 @@ class MatcherGroup: temp: bool = ..., priority: int = ..., block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... - def on_metaevent(self, - *, - rule: Optional[Union[Rule, T_RuleChecker]] = None, - handlers: Optional[List[T_Handler]] = None, - temp: bool = False, - priority: int = 1, - block: bool = False, - state: Optional[T_State] = None) -> Type[Matcher]: + def on_metaevent( + self, + *, + rule: Optional[Union[Rule, T_RuleChecker]] = None, + handlers: Optional[List[T_Handler]] = None, + temp: bool = False, + priority: int = 1, + block: bool = False, + state: Optional[T_State] = None, + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... - def on_message(self, - *, - rule: Optional[Union[Rule, T_RuleChecker]] = None, - permission: Optional[Permission] = None, - handlers: Optional[List[T_Handler]] = None, - temp: bool = False, - priority: int = 1, - block: bool = True, - state: Optional[T_State] = None) -> Type[Matcher]: + def on_message( + self, + *, + rule: Optional[Union[Rule, T_RuleChecker]] = None, + permission: Optional[Permission] = None, + handlers: Optional[List[T_Handler]] = None, + temp: bool = False, + priority: int = 1, + block: bool = True, + state: Optional[T_State] = None, + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... - def on_notice(self, - *, - rule: Optional[Union[Rule, T_RuleChecker]] = None, - handlers: Optional[List[T_Handler]] = None, - temp: bool = False, - priority: int = 1, - block: bool = False, - state: Optional[T_State] = None) -> Type[Matcher]: + def on_notice( + self, + *, + rule: Optional[Union[Rule, T_RuleChecker]] = None, + handlers: Optional[List[T_Handler]] = None, + temp: bool = False, + priority: int = 1, + block: bool = False, + state: Optional[T_State] = None, + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... - def on_request(self, - *, - rule: Optional[Union[Rule, T_RuleChecker]] = None, - handlers: Optional[List[T_Handler]] = None, - temp: bool = False, - priority: int = 1, - block: bool = False, - state: Optional[T_State] = None) -> Type[Matcher]: + def on_request( + self, + *, + rule: Optional[Union[Rule, T_RuleChecker]] = None, + handlers: Optional[List[T_Handler]] = None, + temp: bool = False, + priority: int = 1, + block: bool = False, + state: Optional[T_State] = None, + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... - def on_startswith(self, - *, - msg: str, - rule: Optional[Optional[Union[Rule, - T_RuleChecker]]] = ..., - permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., - temp: bool = ..., - priority: int = ..., - block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + def on_startswith( + self, + *, + msg: str, + rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = ..., + permission: Optional[Permission] = ..., + handlers: Optional[List[T_Handler]] = ..., + temp: bool = ..., + priority: int = ..., + block: bool = ..., + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... - def on_endswith(self, - *, - msg: str, - rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = ..., - permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., - temp: bool = ..., - priority: int = ..., - block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + def on_endswith( + self, + *, + msg: str, + rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = ..., + permission: Optional[Permission] = ..., + handlers: Optional[List[T_Handler]] = ..., + temp: bool = ..., + priority: int = ..., + block: bool = ..., + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... - def on_keyword(self, - *, - keywords: Set[str], - rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = ..., - permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., - temp: bool = ..., - priority: int = ..., - block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + def on_keyword( + self, + *, + keywords: Set[str], + rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = ..., + permission: Optional[Permission] = ..., + handlers: Optional[List[T_Handler]] = ..., + temp: bool = ..., + priority: int = ..., + block: bool = ..., + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... - def on_command(self, - *, - cmd: Union[str, Tuple[str, ...]], - rule: Optional[Union[Rule, T_RuleChecker]] = ..., - aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = ..., - permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., - temp: bool = ..., - priority: int = ..., - block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + def on_command( + self, + *, + cmd: Union[str, Tuple[str, ...]], + rule: Optional[Union[Rule, T_RuleChecker]] = ..., + aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = ..., + permission: Optional[Permission] = ..., + handlers: Optional[List[T_Handler]] = ..., + temp: bool = ..., + priority: int = ..., + block: bool = ..., + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... - def on_regex(self, - *, - pattern: str, - flags: Union[int, re.RegexFlag] = 0, - rule: Optional[Rule] = ..., - permission: Optional[Permission] = ..., - handlers: Optional[List[T_Handler]] = ..., - temp: bool = ..., - priority: int = ..., - block: bool = ..., - state: Optional[T_State] = ...) -> Type[Matcher]: + def on_regex( + self, + *, + pattern: str, + flags: Union[int, re.RegexFlag] = 0, + rule: Optional[Rule] = ..., + permission: Optional[Permission] = ..., + handlers: Optional[List[T_Handler]] = ..., + temp: bool = ..., + priority: int = ..., + block: bool = ..., + state: Optional[T_State] = ..., + state_factory: Optional[T_StateFactory] = ...) -> Type[Matcher]: ... diff --git a/nonebot/typing.py b/nonebot/typing.py index a86a628b..72e6f47a 100644 --- a/nonebot/typing.py +++ b/nonebot/typing.py @@ -43,6 +43,14 @@ T_State = Dict[Any, Any] 事件处理状态 State 类型 """ +T_StateFactory = Callable[["Bot", "Event"], Awaitable[T_State]] +""" +:类型: ``Callable[[Bot, Event], Awaitable[T_State]]`` + +:说明: + + 事件处理状态 State 类工厂函数 +""" T_EventPreProcessor = Callable[["Bot", "Event", T_State], Awaitable[None]] """ From e44cde0600d11a72c4becd60ee3c5feb827ecd7e Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Sun, 20 Dec 2020 12:09:30 +0800 Subject: [PATCH 2/3] :white_check_mark: add test case --- nonebot/matcher.py | 34 +++++++++++++++++++--------- tests/test_plugins/test_metaevent.py | 7 +++++- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/nonebot/matcher.py b/nonebot/matcher.py index 09864e13..f6746c44 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -159,17 +159,29 @@ class Matcher(metaclass=MatcherMeta): NewMatcher = type( "Matcher", (Matcher,), { - "module": module, - "type": type_, - "rule": rule or Rule(), - "permission": permission or Permission(), - "handlers": handlers or [], - "temp": temp, - "expire_time": expire_time, - "priority": priority, - "block": block, - "_default_state": default_state or {}, - "_default_state_factory": default_state_factory + "module": + module, + "type": + type_, + "rule": + rule or Rule(), + "permission": + permission or Permission(), + "handlers": + handlers or [], + "temp": + temp, + "expire_time": + expire_time, + "priority": + priority, + "block": + block, + "_default_state": + default_state or {}, + "_default_state_factory": + staticmethod(default_state_factory) + if default_state_factory else None }) matchers[priority].append(NewMatcher) diff --git a/tests/test_plugins/test_metaevent.py b/tests/test_plugins/test_metaevent.py index 972fd6be..e2a160e2 100644 --- a/tests/test_plugins/test_metaevent.py +++ b/tests/test_plugins/test_metaevent.py @@ -8,9 +8,14 @@ async def heartbeat(bot: Bot, event: Event, state: T_State) -> bool: return isinstance(event, HeartbeatMetaEvent) -test_matcher = on_metaevent(heartbeat) +async def factory(bot: Bot, event: Event) -> T_State: + return {"factory": True} + + +test_matcher = on_metaevent(heartbeat, state_factory=factory) @test_matcher.receive() async def handle_heartbeat(bot: Bot, event: Event, state: T_State): + print(state) print("[i] Heartbeat") From 340e8c3760781b13371e4233deaa93084d59d3fe Mon Sep 17 00:00:00 2001 From: nonebot Date: Sun, 20 Dec 2020 04:15:01 +0000 Subject: [PATCH 3/3] :memo: update api docs --- docs/api/matcher.md | 20 +++++++- docs/api/plugin.md | 110 ++++++++++++++++++++++++++++++++++---------- docs/api/typing.md | 16 +++++++ 3 files changed, 120 insertions(+), 26 deletions(-) diff --git a/docs/api/matcher.md b/docs/api/matcher.md index 504b88f9..993e2304 100644 --- a/docs/api/matcher.md +++ b/docs/api/matcher.md @@ -167,6 +167,21 @@ sidebarDepth: 0 +### `_default_state_factory` + + +* **类型** + + `Optional[T_State]` + + + +* **说明** + + 事件响应器默认工厂函数 + + + ### `_default_parser` @@ -202,7 +217,7 @@ sidebarDepth: 0 -### _classmethod_ `new(type_='', rule=None, permission=None, handlers=None, temp=False, priority=1, block=False, *, module=None, default_state=None, expire_time=None)` +### _classmethod_ `new(type_='', rule=None, permission=None, handlers=None, temp=False, priority=1, block=False, *, module=None, default_state=None, default_state_factory=None, expire_time=None)` * **说明** @@ -241,6 +256,9 @@ sidebarDepth: 0 * `default_state: Optional[T_State]`: 默认状态 `state` + * `default_state_factory: Optional[T_StateFactory]`: 默认状态 `state` 的工厂函数 + + * `expire_time: Optional[datetime]`: 事件响应器最终有效时间点,过时即被删除 diff --git a/docs/api/plugin.md b/docs/api/plugin.md index 10caf29f..91e3e763 100644 --- a/docs/api/plugin.md +++ b/docs/api/plugin.md @@ -100,7 +100,7 @@ def something_else(): * **说明**: 插件内定义的导出内容 -## `on(type='', rule=None, permission=None, *, handlers=None, temp=False, priority=1, block=False, state=None)` +## `on(type='', rule=None, permission=None, *, handlers=None, temp=False, priority=1, block=False, state=None, state_factory=None)` * **说明** @@ -133,7 +133,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -144,7 +147,7 @@ def something_else(): -## `on_metaevent(rule=None, *, handlers=None, temp=False, priority=1, block=False, state=None)` +## `on_metaevent(rule=None, *, handlers=None, temp=False, priority=1, block=False, state=None, state_factory=None)` * **说明** @@ -171,7 +174,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -182,7 +188,7 @@ def something_else(): -## `on_message(rule=None, permission=None, *, handlers=None, temp=False, priority=1, block=True, state=None)` +## `on_message(rule=None, permission=None, *, handlers=None, temp=False, priority=1, block=True, state=None, state_factory=None)` * **说明** @@ -212,7 +218,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -223,7 +232,7 @@ def something_else(): -## `on_notice(rule=None, *, handlers=None, temp=False, priority=1, block=False, state=None)` +## `on_notice(rule=None, *, handlers=None, temp=False, priority=1, block=False, state=None, state_factory=None)` * **说明** @@ -250,7 +259,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -261,7 +273,7 @@ def something_else(): -## `on_request(rule=None, *, handlers=None, temp=False, priority=1, block=False, state=None)` +## `on_request(rule=None, *, handlers=None, temp=False, priority=1, block=False, state=None, state_factory=None)` * **说明** @@ -288,7 +300,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -332,7 +347,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -376,7 +394,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -420,7 +441,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -469,7 +493,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -518,7 +545,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -666,7 +696,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -704,7 +737,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -745,7 +781,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -783,7 +822,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -821,7 +863,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -865,7 +910,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -909,7 +957,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -953,7 +1004,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -1002,7 +1056,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 @@ -1051,7 +1108,10 @@ def something_else(): * `block: bool`: 是否阻止事件向更低优先级传递 - * `state: Optional[T_State]`: 默认的 state + * `state: Optional[T_State]`: 默认 state + + + * `state_factory: Optional[T_StateFactory]`: 默认 state 的工厂函数 diff --git a/docs/api/typing.md b/docs/api/typing.md index 2ab5d089..3bf49897 100644 --- a/docs/api/typing.md +++ b/docs/api/typing.md @@ -30,6 +30,22 @@ sidebarDepth: 0 +## `T_StateFactory` + + +* **类型** + + `Callable[[Bot, Event], Awaitable[T_State]]` + + + +* **说明** + + 事件处理状态 State 类工厂函数 + + + + ## `T_EventPreProcessor`