From 10221520d9d9b9b997322dc82485a386e66139cc Mon Sep 17 00:00:00 2001 From: yanyongyu Date: Thu, 6 Aug 2020 17:54:55 +0800 Subject: [PATCH] add matcher expire support --- nonebot/config.py | 2 ++ nonebot/matcher.py | 14 +++++++++++--- nonebot/message.py | 13 ++++++++++++- tests/.env.dev | 1 + tests/test_plugins/test_matcher.py | 2 +- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/nonebot/config.py b/nonebot/config.py index 8e4d8efb..a58c0dea 100644 --- a/nonebot/config.py +++ b/nonebot/config.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +from datetime import timedelta from ipaddress import IPv4Address from typing import Set, Dict, Union, Optional @@ -29,6 +30,7 @@ class Config(BaseSettings): # bot runtime configs superusers: Set[int] = set() nickname: Union[str, Set[str]] = "" + session_expire_timeout: timedelta = timedelta(minutes=2) # custom configs custom_config: dict = {} diff --git a/nonebot/matcher.py b/nonebot/matcher.py index a65ba161..96cc01dd 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- from functools import wraps +from datetime import datetime from collections import defaultdict from typing import Type, List, Dict, Optional, Callable @@ -20,6 +21,7 @@ class Matcher: rule: Rule = Rule() handlers: List[Handler] = [] temp: bool = False + expire_time: Optional[datetime] = None priority: int = 1 _default_state: dict = {} @@ -41,7 +43,8 @@ class Matcher: temp: bool = False, priority: int = 1, *, - default_state: dict = {}) -> Type["Matcher"]: + default_state: dict = {}, + expire_time: Optional[datetime] = None) -> Type["Matcher"]: """创建新的 Matcher Returns: @@ -53,6 +56,7 @@ class Matcher: "rule": rule, "handlers": handlers, "temp": temp, + "expire_time": expire_time, "priority": priority, "_default_state": default_state }) @@ -154,7 +158,9 @@ class Matcher: self.handlers, temp=True, priority=0, - default_state=self.state) + default_state=self.state, + expire_time=datetime.now() + + bot.config.session_expire_timeout) matchers[0].append(matcher) return except PausedException: @@ -162,7 +168,9 @@ class Matcher: self.handlers, temp=True, priority=0, - default_state=self.state) + default_state=self.state, + expire_time=datetime.now() + + bot.config.session_expire_timeout) matchers[0].append(matcher) return except FinishedException: diff --git a/nonebot/message.py b/nonebot/message.py index 81a5778b..cfa1918c 100644 --- a/nonebot/message.py +++ b/nonebot/message.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- import asyncio +from datetime import datetime from typing import Set, Callable from nonebot.log import logger @@ -30,10 +31,19 @@ async def handle_event(bot, event: Event): return for priority in sorted(matchers.keys()): - for index in range(len(matchers[priority])): + index = 0 + while index <= len(matchers[priority]): Matcher = matchers[priority][index] + + # Delete expired Matcher + if datetime.now() > Matcher.expire_time: + del matchers[priority][index] + continue + + # Check rule try: if not Matcher.check_rule(bot, event): + index += 1 continue except Exception as e: logger.error( @@ -42,6 +52,7 @@ async def handle_event(bot, event: Event): continue matcher = Matcher() + # TODO: BeforeMatcherRun if Matcher.temp: del matchers[priority][index] diff --git a/tests/.env.dev b/tests/.env.dev index 7f675006..7db5af38 100644 --- a/tests/.env.dev +++ b/tests/.env.dev @@ -2,3 +2,4 @@ DRIVER=nonebot.drivers.fastapi HOST=0.0.0.0 PORT=2333 DEBUG=true +CUSTOM_CONFIG={"custom": 1} diff --git a/tests/test_plugins/test_matcher.py b/tests/test_plugins/test_matcher.py index f7bf957c..6f5c4e37 100644 --- a/tests/test_plugins/test_matcher.py +++ b/tests/test_plugins/test_matcher.py @@ -4,7 +4,7 @@ from nonebot.rule import Rule from nonebot.event import Event from nonebot.plugin import on_message -from nonebot.adapters.coolq import Message +from nonebot.adapters.cqhttp import Message print(repr(Message("asdfasdf[CQ:at,qq=123][CQ:at,qq=all]")))