From 3462295562eeaba288d09f4944fab948514e09ae Mon Sep 17 00:00:00 2001 From: Ju4tCode <42488585+yanyongyu@users.noreply.github.com> Date: Thu, 16 Mar 2023 15:51:48 +0800 Subject: [PATCH] :bug: fix missing cache in session updater (#1807) --- nonebot/internal/matcher/matcher.py | 73 ++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/nonebot/internal/matcher/matcher.py b/nonebot/internal/matcher/matcher.py index a498bb24..838fa484 100644 --- a/nonebot/internal/matcher/matcher.py +++ b/nonebot/internal/matcher/matcher.py @@ -10,6 +10,7 @@ from typing import ( Union, TypeVar, Callable, + ClassVar, Iterable, NoReturn, Optional, @@ -89,38 +90,38 @@ class MatcherMeta(type): class Matcher(metaclass=MatcherMeta): """事件响应器类""" - plugin: Optional["Plugin"] = None + plugin: ClassVar[Optional["Plugin"]] = None """事件响应器所在插件""" - module: Optional[ModuleType] = None + module: ClassVar[Optional[ModuleType]] = None """事件响应器所在插件模块""" - plugin_name: Optional[str] = None + plugin_name: ClassVar[Optional[str]] = None """事件响应器所在插件名""" - module_name: Optional[str] = None + module_name: ClassVar[Optional[str]] = None """事件响应器所在点分割插件模块路径""" - type: str = "" + type: ClassVar[str] = "" """事件响应器类型""" - rule: Rule = Rule() + rule: ClassVar[Rule] = Rule() """事件响应器匹配规则""" - permission: Permission = Permission() + permission: ClassVar[Permission] = Permission() """事件响应器触发权限""" handlers: List[Dependent[Any]] = [] """事件响应器拥有的事件处理函数列表""" - priority: int = 1 + priority: ClassVar[int] = 1 """事件响应器优先级""" block: bool = False """事件响应器是否阻止事件传播""" - temp: bool = False + temp: ClassVar[bool] = False """事件响应器是否为临时""" - expire_time: Optional[datetime] = None + expire_time: ClassVar[Optional[datetime]] = None """事件响应器过期时间点""" - _default_state: T_State = {} + _default_state: ClassVar[T_State] = {} """事件响应器默认状态""" - _default_type_updater: Optional[Dependent[str]] = None + _default_type_updater: ClassVar[Optional[Dependent[str]]] = None """事件响应器类型更新函数""" - _default_permission_updater: Optional[Dependent[Permission]] = None + _default_permission_updater: ClassVar[Optional[Dependent[Permission]]] = None """事件响应器权限更新函数""" HANDLER_PARAM_TYPES = ( @@ -643,17 +644,43 @@ class Matcher(metaclass=MatcherMeta): """阻止事件传播""" self.block = True - async def update_type(self, bot: Bot, event: Event) -> str: + async def update_type( + self, + bot: Bot, + event: Event, + stack: Optional[AsyncExitStack] = None, + dependency_cache: Optional[T_DependencyCache] = None, + ) -> str: updater = self.__class__._default_type_updater return ( - await updater(bot=bot, event=event, state=self.state, matcher=self) + await updater( + bot=bot, + event=event, + state=self.state, + matcher=self, + stack=stack, + dependency_cache=dependency_cache, + ) if updater else "message" ) - async def update_permission(self, bot: Bot, event: Event) -> Permission: + async def update_permission( + self, + bot: Bot, + event: Event, + stack: Optional[AsyncExitStack] = None, + dependency_cache: Optional[T_DependencyCache] = None, + ) -> Permission: if updater := self.__class__._default_permission_updater: - return await updater(bot=bot, event=event, state=self.state, matcher=self) + return await updater( + bot=bot, + event=event, + state=self.state, + matcher=self, + stack=stack, + dependency_cache=dependency_cache, + ) permission = self.permission if len(permission.checkers) == 1 and isinstance( user_perm := tuple(permission.checkers)[0].call, User @@ -731,8 +758,10 @@ class Matcher(metaclass=MatcherMeta): except RejectedException: await self.resolve_reject() - type_ = await self.update_type(bot, event) - permission = await self.update_permission(bot, event) + type_ = await self.update_type(bot, event, stack, dependency_cache) + permission = await self.update_permission( + bot, event, stack, dependency_cache + ) Matcher.new( type_, @@ -750,8 +779,10 @@ class Matcher(metaclass=MatcherMeta): default_permission_updater=self.__class__._default_permission_updater, ) except PausedException: - type_ = await self.update_type(bot, event) - permission = await self.update_permission(bot, event) + type_ = await self.update_type(bot, event, stack, dependency_cache) + permission = await self.update_permission( + bot, event, stack, dependency_cache + ) Matcher.new( type_,