2023-01-26 13:21:46 +00:00
|
|
|
|
import inspect
|
2023-01-28 05:53:11 +00:00
|
|
|
|
import re
|
2023-06-03 07:27:43 +00:00
|
|
|
|
from typing import Union, overload
|
2021-10-24 10:55:45 +00:00
|
|
|
|
|
|
|
|
|
from apscheduler.triggers.combining import AndTrigger, OrTrigger
|
|
|
|
|
from apscheduler.triggers.cron import CronTrigger
|
|
|
|
|
from apscheduler.triggers.date import DateTrigger
|
|
|
|
|
from apscheduler.triggers.interval import IntervalTrigger
|
|
|
|
|
|
2021-11-12 14:25:53 +00:00
|
|
|
|
from core.loader import ModulesManager
|
2022-08-06 13:39:24 +00:00
|
|
|
|
from core.parser.args import parse_template
|
2023-03-04 08:51:56 +00:00
|
|
|
|
from core.types import Module
|
2023-02-05 14:33:33 +00:00
|
|
|
|
from core.types.module.component_meta import *
|
2021-10-24 10:55:45 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Bind:
|
2023-03-04 08:51:56 +00:00
|
|
|
|
class Module:
|
2021-10-24 10:55:45 +00:00
|
|
|
|
def __init__(self, bind_prefix):
|
|
|
|
|
self.bind_prefix = bind_prefix
|
|
|
|
|
|
2023-03-04 08:51:56 +00:00
|
|
|
|
def command(self,
|
|
|
|
|
help_doc: Union[str, list, tuple] = None,
|
|
|
|
|
*help_docs,
|
|
|
|
|
options_desc: dict = None,
|
|
|
|
|
required_admin: bool = False,
|
|
|
|
|
required_superuser: bool = False,
|
|
|
|
|
available_for: Union[str, list, tuple] = '*',
|
|
|
|
|
exclude_from: Union[str, list, tuple] = '',
|
|
|
|
|
priority: int = 1):
|
2021-10-24 10:55:45 +00:00
|
|
|
|
def decorator(function):
|
2021-12-25 14:01:33 +00:00
|
|
|
|
nonlocal help_doc
|
|
|
|
|
if isinstance(help_doc, str):
|
|
|
|
|
help_doc = [help_doc]
|
2022-01-27 13:16:53 +00:00
|
|
|
|
if help_docs:
|
|
|
|
|
help_doc += help_docs
|
2022-08-06 13:39:24 +00:00
|
|
|
|
if help_doc is None:
|
|
|
|
|
help_doc = []
|
|
|
|
|
|
2021-10-24 10:55:45 +00:00
|
|
|
|
ModulesManager.bind_to_module(self.bind_prefix, CommandMeta(function=function,
|
2022-08-06 13:39:24 +00:00
|
|
|
|
help_doc=parse_template(help_doc),
|
2022-01-27 13:16:53 +00:00
|
|
|
|
options_desc=options_desc,
|
2021-10-24 10:55:45 +00:00
|
|
|
|
required_admin=required_admin,
|
2021-11-19 16:33:53 +00:00
|
|
|
|
required_superuser=required_superuser,
|
2022-01-26 13:45:17 +00:00
|
|
|
|
available_for=available_for,
|
2022-08-06 13:39:24 +00:00
|
|
|
|
exclude_from=exclude_from,
|
|
|
|
|
priority=priority))
|
2022-05-25 16:15:08 +00:00
|
|
|
|
return function
|
2022-07-31 08:33:20 +00:00
|
|
|
|
|
2021-10-24 10:55:45 +00:00
|
|
|
|
return decorator
|
|
|
|
|
|
2023-03-04 08:51:56 +00:00
|
|
|
|
def regex(self, pattern: Union[str, re.Pattern], mode: str = "M", flags: re.RegexFlag = 0,
|
|
|
|
|
desc: str = None,
|
|
|
|
|
required_admin: bool = False,
|
|
|
|
|
required_superuser: bool = False,
|
|
|
|
|
available_for: Union[str, list, tuple] = '*',
|
|
|
|
|
exclude_from: Union[str, list, tuple] = '',
|
|
|
|
|
show_typing: bool = True, logging: bool = True):
|
2021-10-24 10:55:45 +00:00
|
|
|
|
def decorator(function):
|
|
|
|
|
ModulesManager.bind_to_module(self.bind_prefix, RegexMeta(function=function,
|
|
|
|
|
pattern=pattern,
|
|
|
|
|
mode=mode,
|
2021-11-02 14:58:42 +00:00
|
|
|
|
flags=flags,
|
2023-03-04 08:51:56 +00:00
|
|
|
|
desc=desc,
|
|
|
|
|
required_admin=required_admin,
|
|
|
|
|
required_superuser=required_superuser,
|
|
|
|
|
available_for=available_for,
|
|
|
|
|
exclude_from=exclude_from,
|
2022-12-08 09:13:48 +00:00
|
|
|
|
show_typing=show_typing,
|
|
|
|
|
logging=logging))
|
2022-05-25 16:15:08 +00:00
|
|
|
|
return function
|
2022-07-31 08:33:20 +00:00
|
|
|
|
|
2021-10-24 10:55:45 +00:00
|
|
|
|
return decorator
|
|
|
|
|
|
2023-03-04 08:51:56 +00:00
|
|
|
|
def schedule(self, trigger: Union[AndTrigger, OrTrigger, DateTrigger, CronTrigger, IntervalTrigger]):
|
2021-10-24 10:55:45 +00:00
|
|
|
|
def decorator(function):
|
2023-03-04 08:51:56 +00:00
|
|
|
|
ModulesManager.bind_to_module(self.bind_prefix, ScheduleMeta(function=function, trigger=trigger))
|
2022-05-25 16:15:08 +00:00
|
|
|
|
return function
|
2022-07-31 08:33:20 +00:00
|
|
|
|
|
2021-10-24 10:55:45 +00:00
|
|
|
|
return decorator
|
|
|
|
|
|
2023-06-03 07:02:12 +00:00
|
|
|
|
on_command = command
|
|
|
|
|
on_regex = regex
|
|
|
|
|
on_schedule = schedule
|
2023-03-04 08:51:56 +00:00
|
|
|
|
|
2023-06-03 07:27:43 +00:00
|
|
|
|
@overload
|
|
|
|
|
def handle(self,
|
|
|
|
|
help_doc: Union[str, list, tuple] = None,
|
|
|
|
|
*help_docs,
|
|
|
|
|
options_desc: dict = None,
|
|
|
|
|
required_admin: bool = False,
|
|
|
|
|
required_superuser: bool = False,
|
|
|
|
|
available_for: Union[str, list, tuple] = '*',
|
|
|
|
|
exclude_from: Union[str, list, tuple] = '',
|
|
|
|
|
priority: int = 1):
|
|
|
|
|
...
|
|
|
|
|
|
|
|
|
|
@overload
|
|
|
|
|
def handle(self, pattern: Union[str, re.Pattern], mode: str = "M", flags: re.RegexFlag = 0,
|
|
|
|
|
desc: str = None,
|
|
|
|
|
required_admin: bool = False,
|
|
|
|
|
required_superuser: bool = False,
|
|
|
|
|
available_for: Union[str, list, tuple] = '*',
|
|
|
|
|
exclude_from: Union[str, list, tuple] = '',
|
|
|
|
|
show_typing: bool = True, logging: bool = True):
|
|
|
|
|
...
|
|
|
|
|
|
|
|
|
|
@overload
|
|
|
|
|
def handle(self, trigger: Union[AndTrigger, OrTrigger, DateTrigger, CronTrigger, IntervalTrigger]):
|
|
|
|
|
...
|
|
|
|
|
|
2023-03-04 08:51:56 +00:00
|
|
|
|
def handle(self, *args, **kwargs):
|
|
|
|
|
first_key = args[0] if args else (kwargs[list(kwargs.keys())[0]] if kwargs else None)
|
|
|
|
|
if isinstance(first_key, re.Pattern):
|
|
|
|
|
return self.regex(*args, **kwargs)
|
|
|
|
|
elif isinstance(first_key, (AndTrigger, OrTrigger, DateTrigger, CronTrigger, IntervalTrigger)):
|
|
|
|
|
return self.schedule(*args, **kwargs)
|
|
|
|
|
return self.command(*args, **kwargs)
|
2021-10-24 10:55:45 +00:00
|
|
|
|
|
|
|
|
|
|
2023-03-04 08:51:56 +00:00
|
|
|
|
def module(
|
2022-01-20 12:13:03 +00:00
|
|
|
|
bind_prefix: str,
|
|
|
|
|
alias: Union[str, list, tuple, dict] = None,
|
|
|
|
|
desc: str = None,
|
2023-03-04 08:51:56 +00:00
|
|
|
|
recommend_modules: Union[str, list, tuple] = None,
|
2022-01-20 12:13:03 +00:00
|
|
|
|
developers: Union[str, list, tuple] = None,
|
|
|
|
|
required_admin: bool = False,
|
|
|
|
|
base: bool = False,
|
2022-01-26 13:45:17 +00:00
|
|
|
|
required_superuser: bool = False,
|
|
|
|
|
available_for: Union[str, list, tuple] = '*',
|
2023-04-05 05:36:11 +00:00
|
|
|
|
exclude_from: Union[str, list, tuple] = '',
|
|
|
|
|
support_languages: Union[str, list, tuple] = None
|
2022-01-26 13:45:17 +00:00
|
|
|
|
):
|
2021-10-24 10:55:45 +00:00
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
:param bind_prefix: 绑定的命令前缀。
|
|
|
|
|
:param alias: 此命令的别名。
|
2023-03-04 08:51:56 +00:00
|
|
|
|
同时被用作命令解析,当此项不为空时将会尝试解析其中的语法并储存结果在 MessageSession.parsed_msg 中。
|
2021-10-24 10:55:45 +00:00
|
|
|
|
:param desc: 此命令的简介。
|
|
|
|
|
:param recommend_modules: 推荐打开的其他模块。
|
|
|
|
|
:param developers: 模块作者。
|
2023-04-14 14:52:45 +00:00
|
|
|
|
:param required_admin: 此命令是否需要群组管理员权限。
|
2021-10-24 10:55:45 +00:00
|
|
|
|
:param base: 将此命令设为基础命令。设为基础命令后此命令将被强制开启。
|
|
|
|
|
:param required_superuser: 将此命令设为机器人的超级管理员才可执行。
|
2022-01-26 13:45:17 +00:00
|
|
|
|
:param available_for: 此命令支持的平台列表。
|
|
|
|
|
:param exclude_from: 此命令排除的平台列表。
|
2021-10-24 10:55:45 +00:00
|
|
|
|
:return: 此类型的模块。
|
|
|
|
|
"""
|
2023-03-04 08:51:56 +00:00
|
|
|
|
module = Module(alias=alias,
|
|
|
|
|
bind_prefix=bind_prefix,
|
|
|
|
|
desc=desc,
|
|
|
|
|
recommend_modules=recommend_modules,
|
|
|
|
|
developers=developers,
|
|
|
|
|
base=base,
|
|
|
|
|
required_admin=required_admin,
|
|
|
|
|
required_superuser=required_superuser,
|
|
|
|
|
available_for=available_for,
|
2023-04-05 05:36:11 +00:00
|
|
|
|
exclude_from=exclude_from,
|
|
|
|
|
support_languages=support_languages)
|
2023-03-01 13:41:42 +00:00
|
|
|
|
frame = inspect.currentframe()
|
|
|
|
|
ModulesManager.add_module(module, frame.f_back.f_globals["__name__"])
|
2023-03-04 08:51:56 +00:00
|
|
|
|
return Bind.Module(bind_prefix)
|