Feature: 支持主动销毁事件响应器 (#1444)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Akirami 2022-12-06 14:19:48 +08:00 committed by GitHub
parent 9826bc29ca
commit 06c33ad6ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 13 deletions

View File

@ -247,6 +247,11 @@ class Matcher(metaclass=MatcherMeta):
return NewMatcher
@classmethod
def destroy(cls) -> None:
"""销毁当前的事件响应器"""
matchers[cls.priority].remove(cls)
@classmethod
async def check_perm(
cls,

View File

@ -112,7 +112,6 @@ def run_postprocessor(func: T_RunPostProcessor) -> T_RunPostProcessor:
async def _check_matcher(
priority: int,
Matcher: Type[Matcher],
bot: "Bot",
event: "Event",
@ -122,7 +121,7 @@ async def _check_matcher(
) -> None:
if Matcher.expire_time and datetime.now() > Matcher.expire_time:
with contextlib.suppress(Exception):
matchers[priority].remove(Matcher)
Matcher.destroy()
return
try:
@ -138,7 +137,7 @@ async def _check_matcher(
if Matcher.temp:
with contextlib.suppress(Exception):
matchers[priority].remove(Matcher)
Matcher.destroy()
await _run_matcher(Matcher, bot, event, state, stack, dependency_cache)
@ -294,7 +293,7 @@ async def handle_event(bot: "Bot", event: "Event") -> None:
pending_tasks = [
_check_matcher(
priority, matcher, bot, event, state.copy(), stack, dependency_cache
matcher, bot, event, state.copy(), stack, dependency_cache
)
for matcher in matchers[priority]
]

View File

@ -187,25 +187,19 @@ async def test_expire(app: App, load_plugin):
async with app.test_api() as ctx:
bot = ctx.create_bot()
assert test_temp_matcher in matchers[test_temp_matcher.priority]
await _check_matcher(
test_temp_matcher.priority, test_temp_matcher, bot, event, {}
)
await _check_matcher(test_temp_matcher, bot, event, {})
assert test_temp_matcher not in matchers[test_temp_matcher.priority]
event = make_fake_event()()
async with app.test_api() as ctx:
bot = ctx.create_bot()
assert test_datetime_matcher in matchers[test_datetime_matcher.priority]
await _check_matcher(
test_datetime_matcher.priority, test_datetime_matcher, bot, event, {}
)
await _check_matcher(test_datetime_matcher, bot, event, {})
assert test_datetime_matcher not in matchers[test_datetime_matcher.priority]
event = make_fake_event()()
async with app.test_api() as ctx:
bot = ctx.create_bot()
assert test_timedelta_matcher in matchers[test_timedelta_matcher.priority]
await _check_matcher(
test_timedelta_matcher.priority, test_timedelta_matcher, bot, event, {}
)
await _check_matcher(test_timedelta_matcher, bot, event, {})
assert test_timedelta_matcher not in matchers[test_timedelta_matcher.priority]