From 0236746e6542b0b93d9b943f6c4217d39ac99651 Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Wed, 1 Dec 2021 19:21:31 +0800 Subject: [PATCH] :bug: fix rule and permission not handle skip --- nonebot/permission.py | 9 +++++++-- nonebot/rule.py | 25 ++++++++++++++----------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/nonebot/permission.py b/nonebot/permission.py index 7724d1dd..185022e0 100644 --- a/nonebot/permission.py +++ b/nonebot/permission.py @@ -16,6 +16,7 @@ from typing import Any, Dict, List, Type, Union, Callable, NoReturn, Optional from nonebot import params from nonebot.handler import Handler from nonebot.adapters import Bot, Event +from nonebot.exception import SkippedException from nonebot.typing import T_PermissionChecker @@ -96,9 +97,13 @@ class Permission: _dependency_cache=dependency_cache, ) for checker in self.checkers - ) + ), + return_exceptions=True, + ) + return next( + filter(lambda x: bool(x) and not isinstance(x, SkippedException), results), + False, ) - return any(results) def __and__(self, other) -> NoReturn: raise RuntimeError("And operation between Permissions is not allowed.") diff --git a/nonebot/rule.py b/nonebot/rule.py index e72cc372..9469c517 100644 --- a/nonebot/rule.py +++ b/nonebot/rule.py @@ -35,9 +35,9 @@ from pygtrie import CharTrie from nonebot.log import logger from nonebot.handler import Handler from nonebot import params, get_driver -from nonebot.exception import ParserExit from nonebot.typing import T_State, T_RuleChecker from nonebot.adapters import Bot, Event, MessageSegment +from nonebot.exception import ParserExit, SkippedException PREFIX_KEY = "_prefix" SUFFIX_KEY = "_suffix" @@ -130,18 +130,21 @@ class Rule: """ if not self.checkers: return True - results = await asyncio.gather( - *( - checker( - bot=bot, - event=event, - state=state, - _stack=stack, - _dependency_cache=dependency_cache, + try: + results = await asyncio.gather( + *( + checker( + bot=bot, + event=event, + state=state, + _stack=stack, + _dependency_cache=dependency_cache, + ) + for checker in self.checkers ) - for checker in self.checkers ) - ) + except SkippedException: + return False return all(results) def __and__(self, other: Optional[Union["Rule", T_RuleChecker]]) -> "Rule":