nonebot2/nonebot/plugin/on.py

843 lines
28 KiB
Python
Raw Normal View History

2021-11-08 01:02:35 +08:00
import re
2021-11-09 00:57:59 +08:00
import sys
import inspect
from types import ModuleType
2021-11-14 18:51:23 +08:00
from typing import Any, Set, Dict, List, Type, Tuple, Union, Optional
2021-11-08 01:02:35 +08:00
from nonebot.matcher import Matcher
2021-11-11 17:33:30 +08:00
from .manager import _current_plugin
2021-11-08 01:02:35 +08:00
from nonebot.permission import Permission
from nonebot.dependencies import Dependent
from nonebot.typing import (
T_State,
T_Handler,
T_RuleChecker,
T_PermissionChecker,
)
from nonebot.rule import (
Rule,
ArgumentParser,
regex,
command,
keyword,
endswith,
startswith,
shell_command,
)
2021-11-08 01:02:35 +08:00
def _store_matcher(matcher: Type[Matcher]) -> None:
plugin = _current_plugin.get()
# only store the matcher defined in the plugin
if plugin:
plugin.matcher.add(matcher)
2021-11-09 00:57:59 +08:00
def _get_matcher_module(depth: int = 1) -> Optional[ModuleType]:
current_frame = inspect.currentframe()
if current_frame is None:
return None
frame = inspect.getouterframes(current_frame)[depth + 1].frame
module_name = frame.f_globals["__name__"]
return sys.modules.get(module_name)
def on(
type: str = "",
rule: Optional[Union[Rule, T_RuleChecker]] = None,
permission: Optional[Union[Permission, T_PermissionChecker]] = None,
*,
handlers: Optional[List[Union[T_Handler, Dependent]]] = None,
temp: bool = False,
priority: int = 1,
block: bool = False,
state: Optional[T_State] = None,
_depth: int = 0,
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个基础事件响应器可自定义类型
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `type: str`: 事件响应器类型
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
matcher = Matcher.new(
type,
Rule() & rule,
Permission() | permission,
temp=temp,
priority=priority,
block=block,
handlers=handlers,
plugin=_current_plugin.get(),
module=_get_matcher_module(_depth + 1),
default_state=state,
)
2021-11-08 01:02:35 +08:00
_store_matcher(matcher)
return matcher
def on_metaevent(
rule: Optional[Union[Rule, T_RuleChecker]] = None,
*,
handlers: Optional[List[Union[T_Handler, Dependent]]] = None,
temp: bool = False,
priority: int = 1,
block: bool = False,
state: Optional[T_State] = None,
_depth: int = 0,
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个元事件响应器
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
matcher = Matcher.new(
"meta_event",
Rule() & rule,
Permission(),
temp=temp,
priority=priority,
block=block,
handlers=handlers,
plugin=_current_plugin.get(),
module=_get_matcher_module(_depth + 1),
default_state=state,
)
2021-11-08 01:02:35 +08:00
_store_matcher(matcher)
return matcher
def on_message(
rule: Optional[Union[Rule, T_RuleChecker]] = None,
permission: Optional[Union[Permission, T_PermissionChecker]] = None,
*,
handlers: Optional[List[Union[T_Handler, Dependent]]] = None,
temp: bool = False,
priority: int = 1,
block: bool = True,
state: Optional[T_State] = None,
_depth: int = 0,
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个消息事件响应器
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
matcher = Matcher.new(
"message",
Rule() & rule,
Permission() | permission,
temp=temp,
priority=priority,
block=block,
handlers=handlers,
plugin=_current_plugin.get(),
module=_get_matcher_module(_depth + 1),
default_state=state,
)
2021-11-08 01:02:35 +08:00
_store_matcher(matcher)
return matcher
def on_notice(
rule: Optional[Union[Rule, T_RuleChecker]] = None,
*,
handlers: Optional[List[Union[T_Handler, Dependent]]] = None,
temp: bool = False,
priority: int = 1,
block: bool = False,
state: Optional[T_State] = None,
_depth: int = 0,
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个通知事件响应器
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
matcher = Matcher.new(
"notice",
Rule() & rule,
Permission(),
temp=temp,
priority=priority,
block=block,
handlers=handlers,
plugin=_current_plugin.get(),
module=_get_matcher_module(_depth + 1),
default_state=state,
)
2021-11-08 01:02:35 +08:00
_store_matcher(matcher)
return matcher
def on_request(
rule: Optional[Union[Rule, T_RuleChecker]] = None,
*,
handlers: Optional[List[Union[T_Handler, Dependent]]] = None,
temp: bool = False,
priority: int = 1,
block: bool = False,
state: Optional[T_State] = None,
_depth: int = 0,
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个请求事件响应器
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
matcher = Matcher.new(
"request",
Rule() & rule,
Permission(),
temp=temp,
priority=priority,
block=block,
handlers=handlers,
plugin=_current_plugin.get(),
module=_get_matcher_module(_depth + 1),
default_state=state,
)
2021-11-08 01:02:35 +08:00
_store_matcher(matcher)
return matcher
def on_startswith(
msg: Union[str, Tuple[str, ...]],
rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = None,
ignorecase: bool = False,
_depth: int = 0,
**kwargs,
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个消息事件响应器并且当消息的**文本部分**以指定内容开头时响应
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `msg: Union[str, Tuple[str, ...]]`: 指定消息开头内容
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `ignorecase: bool`: 是否忽略大小写
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
return on_message(startswith(msg, ignorecase) & rule, **kwargs, _depth=_depth + 1)
2021-11-08 01:02:35 +08:00
def on_endswith(
msg: Union[str, Tuple[str, ...]],
rule: Optional[Optional[Union[Rule, T_RuleChecker]]] = None,
ignorecase: bool = False,
_depth: int = 0,
**kwargs,
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个消息事件响应器并且当消息的**文本部分**以指定内容结尾时响应
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `msg: Union[str, Tuple[str, ...]]`: 指定消息结尾内容
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `ignorecase: bool`: 是否忽略大小写
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
return on_message(endswith(msg, ignorecase) & rule, **kwargs, _depth=_depth + 1)
2021-11-08 01:02:35 +08:00
def on_keyword(
keywords: Set[str],
rule: Optional[Union[Rule, T_RuleChecker]] = None,
_depth: int = 0,
**kwargs,
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个消息事件响应器并且当消息纯文本部分包含关键词时响应
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `keywords: Set[str]`: 关键词列表
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
2021-11-11 17:33:30 +08:00
return on_message(keyword(*keywords) & rule, **kwargs, _depth=_depth + 1)
2021-11-08 01:02:35 +08:00
def on_command(
cmd: Union[str, Tuple[str, ...]],
rule: Optional[Union[Rule, T_RuleChecker]] = None,
aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = None,
_depth: int = 0,
**kwargs,
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个消息事件响应器并且当消息以指定命令开头时响应
2021-11-08 01:02:35 +08:00
2021-12-02 03:17:10 +08:00
命令匹配规则参考: `命令形式匹配 <rule.md#command-command>`_
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `cmd: Union[str, Tuple[str, ...]]`: 指定命令内容
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `aliases: Optional[Set[Union[str, Tuple[str, ...]]]]`: 命令别名
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
commands = set([cmd]) | (aliases or set())
2021-12-29 22:23:35 +08:00
block = kwargs.pop("block", False)
2021-12-23 22:16:55 +08:00
return on_message(
2021-12-29 22:23:35 +08:00
command(*commands) & rule, block=block, **kwargs, _depth=_depth + 1
2021-12-23 22:16:55 +08:00
)
def on_shell_command(
cmd: Union[str, Tuple[str, ...]],
rule: Optional[Union[Rule, T_RuleChecker]] = None,
aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = None,
parser: Optional[ArgumentParser] = None,
_depth: int = 0,
**kwargs,
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:19:21 +08:00
注册一个支持 `shell_like` 解析参数的命令消息事件响应器
2021-11-08 01:02:35 +08:00
2022-01-12 18:19:21 +08:00
与普通的 `on_command` 不同的是在添加 `parser` 参数时, 响应器会自动处理消息
2021-11-08 01:02:35 +08:00
2022-01-12 18:19:21 +08:00
并将用户输入的原始参数列表保存在 `state["argv"]`, `parser` 处理的参数保存在 `state["args"]`
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `cmd: Union[str, Tuple[str, ...]]`: 指定命令内容
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `aliases: Optional[Set[Union[str, Tuple[str, ...]]]]`: 命令别名
* `parser: Optional[ArgumentParser]`: `nonebot.rule.ArgumentParser` 对象
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
commands = set([cmd]) | (aliases or set())
return on_message(
shell_command(*commands, parser=parser) & rule,
**kwargs,
_depth=_depth + 1,
)
def on_regex(
pattern: str,
flags: Union[int, re.RegexFlag] = 0,
rule: Optional[Union[Rule, T_RuleChecker]] = None,
_depth: int = 0,
**kwargs,
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个消息事件响应器并且当消息匹配正则表达式时响应
2021-11-08 01:02:35 +08:00
2021-12-02 03:17:10 +08:00
命令匹配规则参考: `正则匹配 <rule.md#regex-regex-flags-0>`_
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `pattern: str`: 正则表达式
* `flags: Union[int, re.RegexFlag]`: 正则匹配标志
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
2021-11-11 17:33:30 +08:00
return on_message(regex(pattern, flags) & rule, **kwargs, _depth=_depth + 1)
2021-11-08 01:02:35 +08:00
class CommandGroup:
"""命令组,用于声明一组有相同名称前缀的命令。"""
def __init__(self, cmd: Union[str, Tuple[str, ...]], **kwargs):
"""
:参数:
2022-01-12 18:19:21 +08:00
* `cmd: Union[str, Tuple[str, ...]]`: 命令前缀
* `**kwargs`: 其他传递给 `on_command` 的参数默认值参考 `on_command <#on-command-cmd-rule-none-aliases-none-kwargs>`_
2021-11-08 01:02:35 +08:00
"""
self.basecmd: Tuple[str, ...] = (cmd,) if isinstance(cmd, str) else cmd
"""
2022-01-12 18:16:05 +08:00
命令前缀
2021-11-08 01:02:35 +08:00
"""
if "aliases" in kwargs:
del kwargs["aliases"]
self.base_kwargs: Dict[str, Any] = kwargs
"""
2022-01-12 18:19:21 +08:00
其他传递给 `on_command` 的参数默认值
2021-11-08 01:02:35 +08:00
"""
def command(self, cmd: Union[str, Tuple[str, ...]], **kwargs) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个新的命令
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `cmd: Union[str, Tuple[str, ...]]`: 命令前缀
* `**kwargs`: 其他传递给 `on_command` 的参数将会覆盖命令组默认值
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
sub_cmd = (cmd,) if isinstance(cmd, str) else cmd
cmd = self.basecmd + sub_cmd
final_kwargs = self.base_kwargs.copy()
final_kwargs.update(kwargs)
2021-11-11 17:33:30 +08:00
return on_command(cmd, **final_kwargs, _depth=1)
2021-11-08 01:02:35 +08:00
def shell_command(
self, cmd: Union[str, Tuple[str, ...]], **kwargs
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个新的命令
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `cmd: Union[str, Tuple[str, ...]]`: 命令前缀
* `**kwargs`: 其他传递给 `on_shell_command` 的参数将会覆盖命令组默认值
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
sub_cmd = (cmd,) if isinstance(cmd, str) else cmd
cmd = self.basecmd + sub_cmd
final_kwargs = self.base_kwargs.copy()
final_kwargs.update(kwargs)
2021-11-11 17:33:30 +08:00
return on_shell_command(cmd, **final_kwargs, _depth=1)
2021-11-08 01:02:35 +08:00
class MatcherGroup:
2022-01-12 18:19:21 +08:00
"""事件响应器组合,统一管理。为 `Matcher` 创建提供默认属性。"""
2021-11-08 01:02:35 +08:00
def __init__(self, **kwargs):
"""
2022-01-12 18:19:21 +08:00
创建一个事件响应器组合参数为默认值 `on` 一致
2021-11-08 01:02:35 +08:00
"""
self.matchers: List[Type[Matcher]] = []
"""
2022-01-12 18:16:05 +08:00
组内事件响应器列表
2021-11-08 01:02:35 +08:00
"""
self.base_kwargs: Dict[str, Any] = kwargs
"""
2022-01-12 18:19:21 +08:00
其他传递给 `on` 的参数默认值
2021-11-08 01:02:35 +08:00
"""
def on(self, **kwargs) -> Type[Matcher]:
"""
2022-01-12 18:16:05 +08:00
注册一个基础事件响应器可自定义类型
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `type: str`: 事件响应器类型
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
final_kwargs = self.base_kwargs.copy()
final_kwargs.update(kwargs)
2021-11-11 17:33:30 +08:00
matcher = on(**final_kwargs, _depth=1)
2021-11-08 01:02:35 +08:00
self.matchers.append(matcher)
return matcher
def on_metaevent(self, **kwargs) -> Type[Matcher]:
"""
2022-01-12 18:16:05 +08:00
注册一个元事件响应器
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
final_kwargs = self.base_kwargs.copy()
final_kwargs.update(kwargs)
final_kwargs.pop("type", None)
final_kwargs.pop("permission", None)
2021-11-11 17:33:30 +08:00
matcher = on_metaevent(**final_kwargs, _depth=1)
2021-11-08 01:02:35 +08:00
self.matchers.append(matcher)
return matcher
def on_message(self, **kwargs) -> Type[Matcher]:
"""
2022-01-12 18:16:05 +08:00
注册一个消息事件响应器
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
final_kwargs = self.base_kwargs.copy()
final_kwargs.update(kwargs)
final_kwargs.pop("type", None)
2021-11-11 17:33:30 +08:00
matcher = on_message(**final_kwargs, _depth=1)
2021-11-08 01:02:35 +08:00
self.matchers.append(matcher)
return matcher
def on_notice(self, **kwargs) -> Type[Matcher]:
"""
2022-01-12 18:16:05 +08:00
注册一个通知事件响应器
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
final_kwargs = self.base_kwargs.copy()
final_kwargs.update(kwargs)
final_kwargs.pop("type", None)
2021-11-11 17:33:30 +08:00
matcher = on_notice(**final_kwargs, _depth=1)
2021-11-08 01:02:35 +08:00
self.matchers.append(matcher)
return matcher
def on_request(self, **kwargs) -> Type[Matcher]:
"""
2022-01-12 18:16:05 +08:00
注册一个请求事件响应器
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
final_kwargs = self.base_kwargs.copy()
final_kwargs.update(kwargs)
final_kwargs.pop("type", None)
2021-11-11 17:33:30 +08:00
matcher = on_request(**final_kwargs, _depth=1)
2021-11-08 01:02:35 +08:00
self.matchers.append(matcher)
return matcher
def on_startswith(
self, msg: Union[str, Tuple[str, ...]], **kwargs
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个消息事件响应器并且当消息的**文本部分**以指定内容开头时响应
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `msg: Union[str, Tuple[str, ...]]`: 指定消息开头内容
* `ignorecase: bool`: 是否忽略大小写
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
final_kwargs = self.base_kwargs.copy()
final_kwargs.update(kwargs)
final_kwargs.pop("type", None)
2021-11-11 17:33:30 +08:00
matcher = on_startswith(msg, **final_kwargs, _depth=1)
2021-11-08 01:02:35 +08:00
self.matchers.append(matcher)
return matcher
def on_endswith(self, msg: Union[str, Tuple[str, ...]], **kwargs) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个消息事件响应器并且当消息的**文本部分**以指定内容结尾时响应
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `msg: Union[str, Tuple[str, ...]]`: 指定消息结尾内容
* `ignorecase: bool`: 是否忽略大小写
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
final_kwargs = self.base_kwargs.copy()
final_kwargs.update(kwargs)
final_kwargs.pop("type", None)
2021-11-11 17:33:30 +08:00
matcher = on_endswith(msg, **final_kwargs, _depth=1)
2021-11-08 01:02:35 +08:00
self.matchers.append(matcher)
return matcher
def on_keyword(self, keywords: Set[str], **kwargs) -> Type[Matcher]:
"""
2022-01-12 18:16:05 +08:00
注册一个消息事件响应器并且当消息纯文本部分包含关键词时响应
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `keywords: Set[str]`: 关键词列表
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
final_kwargs = self.base_kwargs.copy()
final_kwargs.update(kwargs)
final_kwargs.pop("type", None)
2021-11-11 17:33:30 +08:00
matcher = on_keyword(keywords, **final_kwargs, _depth=1)
2021-11-08 01:02:35 +08:00
self.matchers.append(matcher)
return matcher
def on_command(
self,
cmd: Union[str, Tuple[str, ...]],
aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = None,
**kwargs,
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个消息事件响应器并且当消息以指定命令开头时响应
2021-11-08 01:02:35 +08:00
2022-01-12 18:16:05 +08:00
命令匹配规则参考: `命令形式匹配 <rule.md#command-command>`_
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `cmd: Union[str, Tuple[str, ...]]`: 指定命令内容
* `aliases: Optional[Set[Union[str, Tuple[str, ...]]]]`: 命令别名
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
final_kwargs = self.base_kwargs.copy()
final_kwargs.update(kwargs)
final_kwargs.pop("type", None)
2021-11-11 17:33:30 +08:00
matcher = on_command(cmd, aliases=aliases, **final_kwargs, _depth=1)
2021-11-08 01:02:35 +08:00
self.matchers.append(matcher)
return matcher
def on_shell_command(
self,
cmd: Union[str, Tuple[str, ...]],
aliases: Optional[Set[Union[str, Tuple[str, ...]]]] = None,
parser: Optional[ArgumentParser] = None,
**kwargs,
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:19:21 +08:00
注册一个支持 `shell_like` 解析参数的命令消息事件响应器
2021-11-08 01:02:35 +08:00
2022-01-12 18:19:21 +08:00
与普通的 `on_command` 不同的是在添加 `parser` 参数时, 响应器会自动处理消息
2021-11-08 01:02:35 +08:00
2022-01-12 18:19:21 +08:00
并将用户输入的原始参数列表保存在 `state["argv"]`, `parser` 处理的参数保存在 `state["args"]`
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `cmd: Union[str, Tuple[str, ...]]`: 指定命令内容
* `aliases: Optional[Set[Union[str, Tuple[str, ...]]]]`: 命令别名
* `parser: Optional[ArgumentParser]`: `nonebot.rule.ArgumentParser` 对象
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
final_kwargs = self.base_kwargs.copy()
final_kwargs.update(kwargs)
final_kwargs.pop("type", None)
matcher = on_shell_command(
cmd, aliases=aliases, parser=parser, **final_kwargs, _depth=1
)
2021-11-08 01:02:35 +08:00
self.matchers.append(matcher)
return matcher
def on_regex(
self, pattern: str, flags: Union[int, re.RegexFlag] = 0, **kwargs
) -> Type[Matcher]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
注册一个消息事件响应器并且当消息匹配正则表达式时响应
2021-11-08 01:02:35 +08:00
2022-01-12 18:16:05 +08:00
命令匹配规则参考: `正则匹配 <rule.md#regex-regex-flags-0>`_
2021-11-08 01:02:35 +08:00
:参数:
2022-01-12 18:19:21 +08:00
* `pattern: str`: 正则表达式
* `flags: Union[int, re.RegexFlag]`: 正则匹配标志
* `rule: Optional[Union[Rule, T_RuleChecker]]`: 事件响应规则
* `permission: Optional[Union[Permission, T_PermissionChecker]] =]]`: 事件响应权限
* `handlers: Optional[List[Union[T_Handler, Dependent]]]`: 事件处理函数列表
* `temp: bool`: 是否为临时事件响应器仅执行一次
* `priority: int`: 事件响应器优先级
* `block: bool`: 是否阻止事件向更低优先级传递
* `state: Optional[T_State]`: 默认 state
2021-11-08 01:02:35 +08:00
:返回:
2022-01-12 18:19:21 +08:00
- `Type[Matcher]`
2021-11-08 01:02:35 +08:00
"""
final_kwargs = self.base_kwargs.copy()
final_kwargs.update(kwargs)
final_kwargs.pop("type", None)
2021-11-11 17:33:30 +08:00
matcher = on_regex(pattern, flags=flags, **final_kwargs, _depth=1)
2021-11-08 01:02:35 +08:00
self.matchers.append(matcher)
return matcher