diff --git a/nonebot/__init__.py b/nonebot/__init__.py index 8ee450bd..20ca9113 100644 --- a/nonebot/__init__.py +++ b/nonebot/__init__.py @@ -114,12 +114,18 @@ from .helpers import context_id __all__ = [ 'NoneBot', 'scheduler', 'init', 'get_bot', 'run', + 'CQHttpError', + 'load_plugin', 'load_plugins', 'load_builtin_plugins', 'get_loaded_plugins', + 'message_preprocessor', 'Message', 'MessageSegment', + 'on_command', 'CommandSession', 'CommandGroup', + 'on_natural_language', 'NLPSession', 'NLPResult', 'IntentCommand', 'on_notice', 'NoticeSession', 'on_request', 'RequestSession', + 'context_id', ] diff --git a/nonebot/command/__init__.py b/nonebot/command/__init__.py index be1cfa9e..18010526 100644 --- a/nonebot/command/__init__.py +++ b/nonebot/command/__init__.py @@ -156,55 +156,6 @@ def on_command(name: Union[str, CommandName_T], *, return deco -class CommandGroup: - """ - Group a set of commands with same name prefix. - """ - __slots__ = ('basename', 'permission', 'only_to_me', 'privileged', - 'shell_like') - - def __init__(self, name: Union[str, CommandName_T], - permission: Optional[int] = None, *, - only_to_me: Optional[bool] = None, - privileged: Optional[bool] = None, - shell_like: Optional[bool] = None): - self.basename = (name,) if isinstance(name, str) else name - self.permission = permission # TODO: use .pyi - self.only_to_me = only_to_me - self.privileged = privileged - self.shell_like = shell_like - - def command(self, name: Union[str, CommandName_T], *, - aliases: Optional[Iterable[str]] = None, - permission: Optional[int] = None, - only_to_me: Optional[bool] = None, - privileged: Optional[bool] = None, - shell_like: Optional[bool] = None) -> Callable: - sub_name = (name,) if isinstance(name, str) else name - name = self.basename + sub_name - - kwargs = {} - if aliases is not None: - kwargs['aliases'] = aliases - if permission is not None: - kwargs['permission'] = permission - elif self.permission is not None: - kwargs['permission'] = self.permission - if only_to_me is not None: - kwargs['only_to_me'] = only_to_me - elif self.only_to_me is not None: - kwargs['only_to_me'] = self.only_to_me - if privileged is not None: - kwargs['privileged'] = privileged - elif self.privileged is not None: - kwargs['privileged'] = self.privileged - if shell_like is not None: - kwargs['shell_like'] = shell_like - elif self.shell_like is not None: - kwargs['shell_like'] = self.shell_like - return on_command(name, **kwargs) - - def _find_command(name: Union[str, CommandName_T]) -> Optional[Command]: cmd_name = (name,) if isinstance(name, str) else name if not cmd_name: @@ -686,3 +637,6 @@ def kill_current_session(ctx: Context_T) -> None: ctx_id = context_id(ctx) if ctx_id in _sessions: del _sessions[ctx_id] + + +from nonebot.command.group import CommandGroup diff --git a/nonebot/command/group.py b/nonebot/command/group.py new file mode 100644 index 00000000..6f7d4ca8 --- /dev/null +++ b/nonebot/command/group.py @@ -0,0 +1,26 @@ +from typing import Union, Callable + +from nonebot.command import on_command +from nonebot.typing import CommandName_T + + +class CommandGroup: + """ + Group a set of commands with same name prefix. + """ + + __slots__ = ('basename', 'base_kwargs') + + def __init__(self, name: Union[str, CommandName_T], **kwargs): + self.basename = (name,) if isinstance(name, str) else name + if 'aliases' in kwargs: + del kwargs['aliases'] # ensure there is no aliases here + self.base_kwargs = kwargs + + def command(self, name: Union[str, CommandName_T], **kwargs) -> Callable: + sub_name = (name,) if isinstance(name, str) else name + name = self.basename + sub_name + + final_kwargs = self.base_kwargs.copy() + final_kwargs.update(kwargs) + return on_command(name, **final_kwargs) diff --git a/nonebot/command/group.pyi b/nonebot/command/group.pyi new file mode 100644 index 00000000..ace431a8 --- /dev/null +++ b/nonebot/command/group.pyi @@ -0,0 +1,24 @@ +from typing import Union, Callable, Iterable + +from nonebot.typing import CommandName_T + + +class CommandGroup: + """ + Group a set of commands with same name prefix. + """ + + __slots__ = ('basename', 'base_kwargs') + + def __init__(self, name: Union[str, CommandName_T], *, + permission: int = ..., + only_to_me: bool = ..., + privileged: bool = ..., + shell_like: bool = ...): ... + + def command(self, name: Union[str, CommandName_T], *, + aliases: Iterable[str] = ..., + permission: int = ..., + only_to_me: bool = ..., + privileged: bool = ..., + shell_like: bool = ...) -> Callable: ...