mirror of
https://github.com/nonebot/nonebot2.git
synced 2026-02-26 20:54:44 +00:00
💥 Remove: 移除 Python 3.9 支持 (#3860)
This commit is contained in:
@@ -13,10 +13,8 @@ from typing import ( # noqa: UP035
|
||||
Callable,
|
||||
ClassVar,
|
||||
NoReturn,
|
||||
Optional,
|
||||
Type,
|
||||
TypeVar,
|
||||
Union,
|
||||
overload,
|
||||
)
|
||||
from typing_extensions import Self
|
||||
@@ -87,15 +85,15 @@ current_handler: ContextVar[Dependent[Any]] = ContextVar("current_handler")
|
||||
class MatcherSource:
|
||||
"""Matcher 源代码上下文信息"""
|
||||
|
||||
plugin_id: Optional[str] = None
|
||||
plugin_id: str | None = None
|
||||
"""事件响应器所在插件标识符"""
|
||||
module_name: Optional[str] = None
|
||||
module_name: str | None = None
|
||||
"""事件响应器所在插件模块的路径名"""
|
||||
lineno: Optional[int] = None
|
||||
lineno: int | None = None
|
||||
"""事件响应器所在行号"""
|
||||
|
||||
@property
|
||||
def plugin(self) -> Optional["Plugin"]:
|
||||
def plugin(self) -> "Plugin | None":
|
||||
"""事件响应器所在插件"""
|
||||
from nonebot.plugin import get_plugin
|
||||
|
||||
@@ -103,17 +101,17 @@ class MatcherSource:
|
||||
return get_plugin(self.plugin_id)
|
||||
|
||||
@property
|
||||
def plugin_name(self) -> Optional[str]:
|
||||
def plugin_name(self) -> str | None:
|
||||
"""事件响应器所在插件名"""
|
||||
return self.plugin and self.plugin.name
|
||||
|
||||
@property
|
||||
def module(self) -> Optional[ModuleType]:
|
||||
def module(self) -> ModuleType | None:
|
||||
if self.module_name is not None:
|
||||
return sys.modules.get(self.module_name)
|
||||
|
||||
@property
|
||||
def file(self) -> Optional[Path]:
|
||||
def file(self) -> Path | None:
|
||||
if self.module is not None and (file := inspect.getsourcefile(self.module)):
|
||||
return Path(file).absolute()
|
||||
|
||||
@@ -121,8 +119,8 @@ class MatcherSource:
|
||||
class MatcherMeta(type):
|
||||
if TYPE_CHECKING:
|
||||
type: str
|
||||
_source: Optional[MatcherSource]
|
||||
module_name: Optional[str]
|
||||
_source: MatcherSource | None
|
||||
module_name: str | None
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return (
|
||||
@@ -140,7 +138,7 @@ class MatcherMeta(type):
|
||||
class Matcher(metaclass=MatcherMeta):
|
||||
"""事件响应器类"""
|
||||
|
||||
_source: ClassVar[Optional[MatcherSource]] = None
|
||||
_source: ClassVar[MatcherSource | None] = None
|
||||
|
||||
type: ClassVar[str] = ""
|
||||
"""事件响应器类型"""
|
||||
@@ -156,15 +154,15 @@ class Matcher(metaclass=MatcherMeta):
|
||||
"""事件响应器是否阻止事件传播"""
|
||||
temp: ClassVar[bool] = False
|
||||
"""事件响应器是否为临时"""
|
||||
expire_time: ClassVar[Optional[datetime]] = None
|
||||
expire_time: ClassVar[datetime | None] = None
|
||||
"""事件响应器过期时间点"""
|
||||
|
||||
_default_state: ClassVar[T_State] = {}
|
||||
"""事件响应器默认状态"""
|
||||
|
||||
_default_type_updater: ClassVar[Optional[Dependent[str]]] = None
|
||||
_default_type_updater: ClassVar[Dependent[str] | None] = None
|
||||
"""事件响应器类型更新函数"""
|
||||
_default_permission_updater: ClassVar[Optional[Dependent[Permission]]] = None
|
||||
_default_permission_updater: ClassVar[Dependent[Permission] | None] = None
|
||||
"""事件响应器权限更新函数"""
|
||||
|
||||
HANDLER_PARAM_TYPES: ClassVar[tuple[Type[Param], ...]] = ( # noqa: UP006
|
||||
@@ -197,22 +195,22 @@ class Matcher(metaclass=MatcherMeta):
|
||||
def new(
|
||||
cls,
|
||||
type_: str = "",
|
||||
rule: Optional[Rule] = None,
|
||||
permission: Optional[Permission] = None,
|
||||
handlers: Optional[list[Union[T_Handler, Dependent[Any]]]] = None,
|
||||
rule: Rule | None = None,
|
||||
permission: Permission | None = None,
|
||||
handlers: list[T_Handler | Dependent[Any]] | None = None,
|
||||
temp: bool = False,
|
||||
priority: int = 1,
|
||||
block: bool = False,
|
||||
*,
|
||||
plugin: Optional["Plugin"] = None,
|
||||
module: Optional[ModuleType] = None,
|
||||
source: Optional[MatcherSource] = None,
|
||||
expire_time: Optional[Union[datetime, timedelta]] = None,
|
||||
default_state: Optional[T_State] = None,
|
||||
default_type_updater: Optional[Union[T_TypeUpdater, Dependent[str]]] = None,
|
||||
default_permission_updater: Optional[
|
||||
Union[T_PermissionUpdater, Dependent[Permission]]
|
||||
] = None,
|
||||
plugin: "Plugin | None" = None,
|
||||
module: ModuleType | None = None,
|
||||
source: MatcherSource | None = None,
|
||||
expire_time: datetime | timedelta | None = None,
|
||||
default_state: T_State | None = None,
|
||||
default_type_updater: T_TypeUpdater | Dependent[str] | None = None,
|
||||
default_permission_updater: T_PermissionUpdater
|
||||
| Dependent[Permission]
|
||||
| None = None,
|
||||
) -> Type[Self]: # noqa: UP006
|
||||
"""
|
||||
创建一个新的事件响应器,并存储至 `matchers <#matchers>`_
|
||||
@@ -332,27 +330,27 @@ class Matcher(metaclass=MatcherMeta):
|
||||
matchers[cls.priority].remove(cls)
|
||||
|
||||
@classproperty
|
||||
def plugin(cls) -> Optional["Plugin"]:
|
||||
def plugin(cls) -> "Plugin | None":
|
||||
"""事件响应器所在插件"""
|
||||
return cls._source and cls._source.plugin
|
||||
|
||||
@classproperty
|
||||
def plugin_id(cls) -> Optional[str]:
|
||||
def plugin_id(cls) -> str | None:
|
||||
"""事件响应器所在插件标识符"""
|
||||
return cls._source and cls._source.plugin_id
|
||||
|
||||
@classproperty
|
||||
def plugin_name(cls) -> Optional[str]:
|
||||
def plugin_name(cls) -> str | None:
|
||||
"""事件响应器所在插件名"""
|
||||
return cls._source and cls._source.plugin_name
|
||||
|
||||
@classproperty
|
||||
def module(cls) -> Optional[ModuleType]:
|
||||
def module(cls) -> ModuleType | None:
|
||||
"""事件响应器所在插件模块"""
|
||||
return cls._source and cls._source.module
|
||||
|
||||
@classproperty
|
||||
def module_name(cls) -> Optional[str]:
|
||||
def module_name(cls) -> str | None:
|
||||
"""事件响应器所在插件模块路径"""
|
||||
return cls._source and cls._source.module_name
|
||||
|
||||
@@ -361,8 +359,8 @@ class Matcher(metaclass=MatcherMeta):
|
||||
cls,
|
||||
bot: Bot,
|
||||
event: Event,
|
||||
stack: Optional[AsyncExitStack] = None,
|
||||
dependency_cache: Optional[T_DependencyCache] = None,
|
||||
stack: AsyncExitStack | None = None,
|
||||
dependency_cache: T_DependencyCache | None = None,
|
||||
) -> bool:
|
||||
"""检查是否满足触发权限
|
||||
|
||||
@@ -386,8 +384,8 @@ class Matcher(metaclass=MatcherMeta):
|
||||
bot: Bot,
|
||||
event: Event,
|
||||
state: T_State,
|
||||
stack: Optional[AsyncExitStack] = None,
|
||||
dependency_cache: Optional[T_DependencyCache] = None,
|
||||
stack: AsyncExitStack | None = None,
|
||||
dependency_cache: T_DependencyCache | None = None,
|
||||
) -> bool:
|
||||
"""检查是否满足匹配规则
|
||||
|
||||
@@ -432,7 +430,7 @@ class Matcher(metaclass=MatcherMeta):
|
||||
|
||||
@classmethod
|
||||
def append_handler(
|
||||
cls, handler: T_Handler, parameterless: Optional[Iterable[Any]] = None
|
||||
cls, handler: T_Handler, parameterless: Iterable[Any] | None = None
|
||||
) -> Dependent[Any]:
|
||||
handler_ = Dependent[Any].parse(
|
||||
call=handler,
|
||||
@@ -444,7 +442,7 @@ class Matcher(metaclass=MatcherMeta):
|
||||
|
||||
@classmethod
|
||||
def handle(
|
||||
cls, parameterless: Optional[Iterable[Any]] = None
|
||||
cls, parameterless: Iterable[Any] | None = None
|
||||
) -> Callable[[T_Handler], T_Handler]:
|
||||
"""装饰一个函数来向事件响应器直接添加一个处理函数
|
||||
|
||||
@@ -460,7 +458,7 @@ class Matcher(metaclass=MatcherMeta):
|
||||
|
||||
@classmethod
|
||||
def receive(
|
||||
cls, id: str = "", parameterless: Optional[Iterable[Any]] = None
|
||||
cls, id: str = "", parameterless: Iterable[Any] | None = None
|
||||
) -> Callable[[T_Handler], T_Handler]:
|
||||
"""装饰一个函数来指示 NoneBot 在接收用户新的一条消息后继续运行该函数
|
||||
|
||||
@@ -503,8 +501,8 @@ class Matcher(metaclass=MatcherMeta):
|
||||
def got(
|
||||
cls,
|
||||
key: str,
|
||||
prompt: Optional[Union[str, Message, MessageSegment, MessageTemplate]] = None,
|
||||
parameterless: Optional[Iterable[Any]] = None,
|
||||
prompt: str | Message | MessageSegment | MessageTemplate | None = None,
|
||||
parameterless: Iterable[Any] | None = None,
|
||||
) -> Callable[[T_Handler], T_Handler]:
|
||||
"""装饰一个函数来指示 NoneBot 获取一个参数 `key`
|
||||
|
||||
@@ -550,7 +548,7 @@ class Matcher(metaclass=MatcherMeta):
|
||||
@classmethod
|
||||
async def send(
|
||||
cls,
|
||||
message: Union[str, Message, MessageSegment, MessageTemplate],
|
||||
message: str | Message | MessageSegment | MessageTemplate,
|
||||
**kwargs: Any,
|
||||
) -> Any:
|
||||
"""发送一条消息给当前交互用户
|
||||
@@ -572,7 +570,7 @@ class Matcher(metaclass=MatcherMeta):
|
||||
@classmethod
|
||||
async def finish(
|
||||
cls,
|
||||
message: Optional[Union[str, Message, MessageSegment, MessageTemplate]] = None,
|
||||
message: str | Message | MessageSegment | MessageTemplate | None = None,
|
||||
**kwargs,
|
||||
) -> NoReturn:
|
||||
"""发送一条消息给当前交互用户并结束当前事件响应器
|
||||
@@ -589,7 +587,7 @@ class Matcher(metaclass=MatcherMeta):
|
||||
@classmethod
|
||||
async def pause(
|
||||
cls,
|
||||
prompt: Optional[Union[str, Message, MessageSegment, MessageTemplate]] = None,
|
||||
prompt: str | Message | MessageSegment | MessageTemplate | None = None,
|
||||
**kwargs,
|
||||
) -> NoReturn:
|
||||
"""发送一条消息给当前交互用户并暂停事件响应器,在接收用户新的一条消息后继续下一个处理函数
|
||||
@@ -613,7 +611,7 @@ class Matcher(metaclass=MatcherMeta):
|
||||
@classmethod
|
||||
async def reject(
|
||||
cls,
|
||||
prompt: Optional[Union[str, Message, MessageSegment, MessageTemplate]] = None,
|
||||
prompt: str | Message | MessageSegment | MessageTemplate | None = None,
|
||||
**kwargs,
|
||||
) -> NoReturn:
|
||||
"""最近使用 `got` / `receive` 接收的消息不符合预期,
|
||||
@@ -643,7 +641,7 @@ class Matcher(metaclass=MatcherMeta):
|
||||
async def reject_arg(
|
||||
cls,
|
||||
key: str,
|
||||
prompt: Optional[Union[str, Message, MessageSegment, MessageTemplate]] = None,
|
||||
prompt: str | Message | MessageSegment | MessageTemplate | None = None,
|
||||
**kwargs,
|
||||
) -> NoReturn:
|
||||
"""最近使用 `got` 接收的消息不符合预期,
|
||||
@@ -668,7 +666,7 @@ class Matcher(metaclass=MatcherMeta):
|
||||
async def reject_receive(
|
||||
cls,
|
||||
id: str = "",
|
||||
prompt: Optional[Union[str, Message, MessageSegment, MessageTemplate]] = None,
|
||||
prompt: str | Message | MessageSegment | MessageTemplate | None = None,
|
||||
**kwargs,
|
||||
) -> NoReturn:
|
||||
"""最近使用 `receive` 接收的消息不符合预期,
|
||||
@@ -698,14 +696,12 @@ class Matcher(metaclass=MatcherMeta):
|
||||
raise SkippedException
|
||||
|
||||
@overload
|
||||
def get_receive(self, id: str) -> Union[Event, None]: ...
|
||||
def get_receive(self, id: str) -> Event | None: ...
|
||||
|
||||
@overload
|
||||
def get_receive(self, id: str, default: T) -> Union[Event, T]: ...
|
||||
def get_receive(self, id: str, default: T) -> Event | T: ...
|
||||
|
||||
def get_receive(
|
||||
self, id: str, default: Optional[T] = None
|
||||
) -> Optional[Union[Event, T]]:
|
||||
def get_receive(self, id: str, default: T | None = None) -> Event | T | None:
|
||||
"""获取一个 `receive` 事件
|
||||
|
||||
如果没有找到对应的事件,返回 `default` 值
|
||||
@@ -718,14 +714,12 @@ class Matcher(metaclass=MatcherMeta):
|
||||
self.state[LAST_RECEIVE_KEY] = event
|
||||
|
||||
@overload
|
||||
def get_last_receive(self) -> Union[Event, None]: ...
|
||||
def get_last_receive(self) -> Event | None: ...
|
||||
|
||||
@overload
|
||||
def get_last_receive(self, default: T) -> Union[Event, T]: ...
|
||||
def get_last_receive(self, default: T) -> Event | T: ...
|
||||
|
||||
def get_last_receive(
|
||||
self, default: Optional[T] = None
|
||||
) -> Optional[Union[Event, T]]:
|
||||
def get_last_receive(self, default: T | None = None) -> Event | T | None:
|
||||
"""获取最近一次 `receive` 事件
|
||||
|
||||
如果没有事件,返回 `default` 值
|
||||
@@ -733,14 +727,12 @@ class Matcher(metaclass=MatcherMeta):
|
||||
return self.state.get(LAST_RECEIVE_KEY, default)
|
||||
|
||||
@overload
|
||||
def get_arg(self, key: str) -> Union[Message, None]: ...
|
||||
def get_arg(self, key: str) -> Message | None: ...
|
||||
|
||||
@overload
|
||||
def get_arg(self, key: str, default: T) -> Union[Message, T]: ...
|
||||
def get_arg(self, key: str, default: T) -> Message | T: ...
|
||||
|
||||
def get_arg(
|
||||
self, key: str, default: Optional[T] = None
|
||||
) -> Optional[Union[Message, T]]:
|
||||
def get_arg(self, key: str, default: T | None = None) -> Message | T | None:
|
||||
"""获取一个 `got` 消息
|
||||
|
||||
如果没有找到对应的消息,返回 `default` 值
|
||||
@@ -758,12 +750,12 @@ class Matcher(metaclass=MatcherMeta):
|
||||
self.state[REJECT_TARGET] = target
|
||||
|
||||
@overload
|
||||
def get_target(self) -> Union[str, None]: ...
|
||||
def get_target(self) -> str | None: ...
|
||||
|
||||
@overload
|
||||
def get_target(self, default: T) -> Union[str, T]: ...
|
||||
def get_target(self, default: T) -> str | T: ...
|
||||
|
||||
def get_target(self, default: Optional[T] = None) -> Optional[Union[str, T]]:
|
||||
def get_target(self, default: T | None = None) -> str | T | None:
|
||||
return self.state.get(REJECT_TARGET, default)
|
||||
|
||||
def stop_propagation(self):
|
||||
@@ -774,8 +766,8 @@ class Matcher(metaclass=MatcherMeta):
|
||||
self,
|
||||
bot: Bot,
|
||||
event: Event,
|
||||
stack: Optional[AsyncExitStack] = None,
|
||||
dependency_cache: Optional[T_DependencyCache] = None,
|
||||
stack: AsyncExitStack | None = None,
|
||||
dependency_cache: T_DependencyCache | None = None,
|
||||
) -> str:
|
||||
updater = self.__class__._default_type_updater
|
||||
return (
|
||||
@@ -795,8 +787,8 @@ class Matcher(metaclass=MatcherMeta):
|
||||
self,
|
||||
bot: Bot,
|
||||
event: Event,
|
||||
stack: Optional[AsyncExitStack] = None,
|
||||
dependency_cache: Optional[T_DependencyCache] = None,
|
||||
stack: AsyncExitStack | None = None,
|
||||
dependency_cache: T_DependencyCache | None = None,
|
||||
) -> Permission:
|
||||
if updater := self.__class__._default_permission_updater:
|
||||
return await updater(
|
||||
@@ -832,8 +824,8 @@ class Matcher(metaclass=MatcherMeta):
|
||||
bot: Bot,
|
||||
event: Event,
|
||||
state: T_State,
|
||||
stack: Optional[AsyncExitStack] = None,
|
||||
dependency_cache: Optional[T_DependencyCache] = None,
|
||||
stack: AsyncExitStack | None = None,
|
||||
dependency_cache: T_DependencyCache | None = None,
|
||||
):
|
||||
logger.trace(
|
||||
f"{self} run with incoming args: "
|
||||
@@ -877,16 +869,14 @@ class Matcher(metaclass=MatcherMeta):
|
||||
bot: Bot,
|
||||
event: Event,
|
||||
state: T_State,
|
||||
stack: Optional[AsyncExitStack] = None,
|
||||
dependency_cache: Optional[T_DependencyCache] = None,
|
||||
stack: AsyncExitStack | None = None,
|
||||
dependency_cache: T_DependencyCache | None = None,
|
||||
):
|
||||
exc: Optional[Union[FinishedException, RejectedException, PausedException]] = (
|
||||
None
|
||||
)
|
||||
exc: FinishedException | RejectedException | PausedException | None = None
|
||||
|
||||
def _handle_special_exception(
|
||||
exc_group: BaseExceptionGroup[
|
||||
Union[FinishedException, RejectedException, PausedException]
|
||||
FinishedException | RejectedException | PausedException
|
||||
],
|
||||
):
|
||||
nonlocal exc
|
||||
|
||||
Reference in New Issue
Block a user