add docs for decorators; introduce regex decorator
This commit is contained in:
parent
f032212b6c
commit
df246d873a
10 changed files with 290 additions and 180 deletions
|
@ -29,7 +29,7 @@ class MessageSession:
|
||||||
"""
|
"""
|
||||||
消息会话,囊括了处理一条消息所需要的东西。
|
消息会话,囊括了处理一条消息所需要的东西。
|
||||||
"""
|
"""
|
||||||
__slots__ = ("target", "session", "trigger_msg", "parsed_msg",)
|
__slots__ = ("target", "session", "trigger_msg", "parsed_msg", "matched_msg",)
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
target: MsgInfo,
|
target: MsgInfo,
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
from typing import Callable, Union
|
from typing import Callable, Union
|
||||||
|
import re
|
||||||
|
|
||||||
from apscheduler.triggers.combining import AndTrigger, OrTrigger
|
from apscheduler.triggers.combining import AndTrigger, OrTrigger
|
||||||
from apscheduler.triggers.cron import CronTrigger
|
from apscheduler.triggers.cron import CronTrigger
|
||||||
|
@ -19,7 +20,6 @@ class Command:
|
||||||
need_admin: bool = False,
|
need_admin: bool = False,
|
||||||
is_base_function: bool = False,
|
is_base_function: bool = False,
|
||||||
need_superuser: bool = False,
|
need_superuser: bool = False,
|
||||||
is_regex_function: bool = False,
|
|
||||||
autorun: bool = False):
|
autorun: bool = False):
|
||||||
self.function = function
|
self.function = function
|
||||||
self.bind_prefix = bind_prefix
|
self.bind_prefix = bind_prefix
|
||||||
|
@ -32,30 +32,52 @@ class Command:
|
||||||
self.need_admin = need_admin
|
self.need_admin = need_admin
|
||||||
self.is_base_function = is_base_function
|
self.is_base_function = is_base_function
|
||||||
self.need_superuser = need_superuser
|
self.need_superuser = need_superuser
|
||||||
self.is_regex_function = is_regex_function
|
|
||||||
self.autorun = autorun
|
self.autorun = autorun
|
||||||
|
|
||||||
|
|
||||||
|
class RegexCommand:
|
||||||
|
def __init__(self,
|
||||||
|
function: Callable,
|
||||||
|
bind_prefix: str,
|
||||||
|
pattern: str,
|
||||||
|
mode: str,
|
||||||
|
flags: re.RegexFlag = 0,
|
||||||
|
alias: Union[str, list, tuple, dict] = None,
|
||||||
|
desc: str = None,
|
||||||
|
recommend_modules: Union[str, list, tuple] = None,
|
||||||
|
developers: Union[str, list, tuple] = None,
|
||||||
|
need_admin: bool = False,
|
||||||
|
is_base_function: bool = False,
|
||||||
|
need_superuser: bool = False):
|
||||||
|
self.function = function
|
||||||
|
self.bind_prefix = bind_prefix
|
||||||
|
self.pattern = pattern
|
||||||
|
self.flags = flags
|
||||||
|
self.mode = mode
|
||||||
|
self.alias = alias
|
||||||
|
self.desc = desc
|
||||||
|
self.recommend_modules = recommend_modules
|
||||||
|
self.developers = developers
|
||||||
|
self.need_admin = need_admin
|
||||||
|
self.is_base_function = is_base_function
|
||||||
|
self.need_superuser = need_superuser
|
||||||
|
|
||||||
|
|
||||||
class Option:
|
class Option:
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
bind_prefix: str,
|
bind_prefix: str,
|
||||||
desc: str = None,
|
desc: str = None,
|
||||||
help_doc: Union[str, list, tuple] = None,
|
|
||||||
alias: Union[str, list, tuple, dict] = None,
|
alias: Union[str, list, tuple, dict] = None,
|
||||||
recommend_modules: Union[str, list, tuple] = None,
|
recommend_modules: Union[str, list, tuple] = None,
|
||||||
developers: Union[str, list, tuple] = None,
|
developers: Union[str, list, tuple] = None,
|
||||||
need_superuser: bool = False,
|
need_superuser: bool = False,
|
||||||
need_admin: bool = False):
|
need_admin: bool = False):
|
||||||
self.bind_prefix = bind_prefix
|
self.bind_prefix = bind_prefix
|
||||||
self.help_doc = help_doc
|
|
||||||
self.desc = desc
|
self.desc = desc
|
||||||
self.alias = alias
|
self.alias = alias
|
||||||
self.allowed_none = True
|
|
||||||
self.recommend_modules = recommend_modules
|
self.recommend_modules = recommend_modules
|
||||||
self.developers = developers
|
self.developers = developers
|
||||||
self.need_superuser = need_superuser
|
self.need_superuser = need_superuser
|
||||||
self.is_base_function = False
|
|
||||||
self.is_regex_function = False
|
|
||||||
self.need_admin = need_admin
|
self.need_admin = need_admin
|
||||||
|
|
||||||
|
|
||||||
|
@ -65,7 +87,6 @@ class Schedule:
|
||||||
trigger: [AndTrigger, OrTrigger, DateTrigger, CronTrigger, IntervalTrigger],
|
trigger: [AndTrigger, OrTrigger, DateTrigger, CronTrigger, IntervalTrigger],
|
||||||
bind_prefix: str,
|
bind_prefix: str,
|
||||||
desc: str = None,
|
desc: str = None,
|
||||||
help_doc: Union[str, list, tuple] = None,
|
|
||||||
alias: Union[str, list, tuple, dict] = None,
|
alias: Union[str, list, tuple, dict] = None,
|
||||||
recommend_modules: Union[str, list, tuple] = None,
|
recommend_modules: Union[str, list, tuple] = None,
|
||||||
developers: Union[str, list, tuple] = None,
|
developers: Union[str, list, tuple] = None,
|
||||||
|
@ -76,15 +97,12 @@ class Schedule:
|
||||||
self.trigger = trigger
|
self.trigger = trigger
|
||||||
self.bind_prefix = bind_prefix
|
self.bind_prefix = bind_prefix
|
||||||
self.desc = desc
|
self.desc = desc
|
||||||
self.help_doc = help_doc
|
|
||||||
self.allowed_none = True
|
|
||||||
self.alias = alias
|
self.alias = alias
|
||||||
self.recommend_modules = recommend_modules
|
self.recommend_modules = recommend_modules
|
||||||
self.developers = developers
|
self.developers = developers
|
||||||
self.need_superuser = need_superuser
|
self.need_superuser = need_superuser
|
||||||
self.is_base_function = False
|
|
||||||
self.is_regex_function = False
|
|
||||||
self.need_admin = need_admin
|
self.need_admin = need_admin
|
||||||
|
|
||||||
|
|
||||||
__all__ = ["Command", "Option", "Schedule", "AndTrigger", "OrTrigger", "DateTrigger", "CronTrigger", "IntervalTrigger"]
|
__all__ = ["Command", "RegexCommand", "Option", "Schedule", "AndTrigger", "OrTrigger", "DateTrigger",
|
||||||
|
"CronTrigger", "IntervalTrigger"]
|
||||||
|
|
|
@ -2,8 +2,9 @@ import importlib
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import traceback
|
import traceback
|
||||||
|
from typing import Dict, Union
|
||||||
|
|
||||||
from core.elements import Command, Option, Schedule
|
from core.elements import Command, Option, Schedule, RegexCommand
|
||||||
from core.logger import Logger
|
from core.logger import Logger
|
||||||
|
|
||||||
err_prompt = []
|
err_prompt = []
|
||||||
|
@ -36,7 +37,7 @@ class ModulesManager:
|
||||||
_modules_list = set()
|
_modules_list = set()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def add_module(module: [Command, Option, Schedule]):
|
def add_module(module: [Command, Option, Schedule, RegexCommand]):
|
||||||
ModulesManager._modules_list.add(module)
|
ModulesManager._modules_list.add(module)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -111,18 +112,10 @@ class ModulesManager:
|
||||||
def return_regex_modules():
|
def return_regex_modules():
|
||||||
d = {}
|
d = {}
|
||||||
for x in ModulesManager._modules_list:
|
for x in ModulesManager._modules_list:
|
||||||
if isinstance(x, Command) and x.is_regex_function:
|
if isinstance(x, RegexCommand):
|
||||||
d.update({x.bind_prefix: x})
|
d.update({x.bind_prefix: x})
|
||||||
return d
|
return d
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def return_modules_help():
|
|
||||||
d = {}
|
|
||||||
for x in ModulesManager._modules_list:
|
|
||||||
if x.help_doc is not None:
|
|
||||||
d.update({x.bind_prefix: x.help_doc})
|
|
||||||
return d
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def return_schedule_function_list():
|
def return_schedule_function_list():
|
||||||
l = []
|
l = []
|
||||||
|
@ -133,10 +126,9 @@ class ModulesManager:
|
||||||
|
|
||||||
|
|
||||||
load_modules()
|
load_modules()
|
||||||
Modules = ModulesManager.return_modules_list_as_dict()
|
Modules: Union[Dict[str, Command], Dict[str, Option], Dict[str, Schedule], Dict[str, RegexCommand]] = ModulesManager.return_modules_list_as_dict()
|
||||||
ModulesAliases = ModulesManager.return_modules_alias_map()
|
ModulesAliases: Dict[str, RegexCommand] = ModulesManager.return_modules_alias_map()
|
||||||
ModulesRegex = ModulesManager.return_regex_modules()
|
ModulesRegex = ModulesManager.return_regex_modules()
|
||||||
ModulesHelp = ModulesManager.return_modules_help()
|
|
||||||
|
|
||||||
loadercache = os.path.abspath('.cache_loader')
|
loadercache = os.path.abspath('.cache_loader')
|
||||||
openloadercache = open(loadercache, 'w')
|
openloadercache = open(loadercache, 'w')
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
|
import re
|
||||||
|
|
||||||
from apscheduler.triggers.combining import AndTrigger, OrTrigger
|
from apscheduler.triggers.combining import AndTrigger, OrTrigger
|
||||||
from apscheduler.triggers.cron import CronTrigger
|
from apscheduler.triggers.cron import CronTrigger
|
||||||
from apscheduler.triggers.date import DateTrigger
|
from apscheduler.triggers.date import DateTrigger
|
||||||
from apscheduler.triggers.interval import IntervalTrigger
|
from apscheduler.triggers.interval import IntervalTrigger
|
||||||
|
|
||||||
from core.elements import Command, Option, Schedule
|
from core.elements import Command, RegexCommand, Option, Schedule
|
||||||
from core.loader import ModulesManager
|
from core.loader import ModulesManager
|
||||||
|
|
||||||
from typing import Union
|
from typing import Union
|
||||||
|
@ -20,9 +22,24 @@ def command(
|
||||||
need_admin: bool = False,
|
need_admin: bool = False,
|
||||||
is_base_function: bool = False,
|
is_base_function: bool = False,
|
||||||
need_superuser: bool = False,
|
need_superuser: bool = False,
|
||||||
is_regex_function: bool = False,
|
|
||||||
autorun: bool = False
|
autorun: bool = False
|
||||||
):
|
):
|
||||||
|
"""
|
||||||
|
|
||||||
|
:param bind_prefix: 绑定的命令前缀。
|
||||||
|
:param alias: 此命令的别名。
|
||||||
|
:param help_doc: 此命令的帮助文档,
|
||||||
|
同时被用作命令解析,当此项不为空时将会尝试解析其中的语法并储存结果在 MessageSession.parsed_msg 中。
|
||||||
|
:param allowed_none: 是否允许命令解析为 None,设为 False 后如果遇到非法命令语法时将直接提醒语法错误。
|
||||||
|
:param desc: 此命令的简介。
|
||||||
|
:param recommend_modules: 推荐打开的其他模块。
|
||||||
|
:param developers: 模块作者。
|
||||||
|
:param need_admin: 此命令是否需要群聊管理员权限。
|
||||||
|
:param is_base_function: 将此命令设为基础命令。设为基础命令后此命令将被强制开启。
|
||||||
|
:param need_superuser: 将此命令设为机器人的超级管理员才可执行。
|
||||||
|
:param autorun: 将此命令设为自动启动类型,设为自动启动类型后将会在机器人运行时自动运行,同时禁用命令处理功能。
|
||||||
|
:return: 此类型的模块。
|
||||||
|
"""
|
||||||
def decorator(function):
|
def decorator(function):
|
||||||
module = Command(function=function,
|
module = Command(function=function,
|
||||||
alias=alias,
|
alias=alias,
|
||||||
|
@ -33,7 +50,6 @@ def command(
|
||||||
recommend_modules=recommend_modules,
|
recommend_modules=recommend_modules,
|
||||||
developers=developers,
|
developers=developers,
|
||||||
is_base_function=is_base_function,
|
is_base_function=is_base_function,
|
||||||
is_regex_function=is_regex_function,
|
|
||||||
need_admin=need_admin,
|
need_admin=need_admin,
|
||||||
need_superuser=need_superuser,
|
need_superuser=need_superuser,
|
||||||
autorun=autorun)
|
autorun=autorun)
|
||||||
|
@ -43,20 +59,77 @@ def command(
|
||||||
return decorator
|
return decorator
|
||||||
|
|
||||||
|
|
||||||
|
def regex(
|
||||||
|
bind_prefix: str,
|
||||||
|
pattern: str,
|
||||||
|
mode: str = "M",
|
||||||
|
flags: re.RegexFlag = 0,
|
||||||
|
recommend_modules: Union[str, list, tuple] = None,
|
||||||
|
alias: Union[str, list, tuple, dict] = None,
|
||||||
|
desc: str = None,
|
||||||
|
developers: Union[str, list, tuple] = None,
|
||||||
|
need_admin: bool = False,
|
||||||
|
is_base_function: bool = False,
|
||||||
|
need_superuser: bool = False):
|
||||||
|
"""
|
||||||
|
|
||||||
|
:param bind_prefix: 绑定的命令前缀。
|
||||||
|
:param pattern: 正则表达式。
|
||||||
|
:param flags: 正则表达式参数
|
||||||
|
:param mode: 正则表达式模式,为 "m" 时为 Match模式, 为 "a" 时为 Find_all 模式。
|
||||||
|
模式所获取到的内容将会储存在 MessageSession.matched_msg 中。
|
||||||
|
:param alias: 此命令的别名。
|
||||||
|
:param desc: 此命令的简介。
|
||||||
|
:param recommend_modules: 推荐打开的其他模块。
|
||||||
|
:param developers: 模块作者。
|
||||||
|
:param need_admin: 此命令是否需要群聊管理员权限。
|
||||||
|
:param is_base_function: 将此命令设为基础命令。设为基础命令后此命令将被强制开启。
|
||||||
|
:param need_superuser: 将此命令设为机器人的超级管理员才可执行。
|
||||||
|
:return: 此类型的模块。
|
||||||
|
"""
|
||||||
|
def decorator(function):
|
||||||
|
module = RegexCommand(function=function,
|
||||||
|
bind_prefix=bind_prefix,
|
||||||
|
pattern=pattern,
|
||||||
|
flags=flags,
|
||||||
|
mode=mode,
|
||||||
|
recommend_modules=recommend_modules,
|
||||||
|
alias=alias,
|
||||||
|
desc=desc,
|
||||||
|
developers=developers,
|
||||||
|
need_admin=need_admin,
|
||||||
|
is_base_function=is_base_function,
|
||||||
|
need_superuser=need_superuser,
|
||||||
|
)
|
||||||
|
ModulesManager.add_module(module)
|
||||||
|
return module
|
||||||
|
|
||||||
|
return decorator
|
||||||
|
|
||||||
|
|
||||||
def option(
|
def option(
|
||||||
bind_prefix: str,
|
bind_prefix: str,
|
||||||
desc: str = None,
|
desc: str = None,
|
||||||
help_doc: Union[str, list, tuple] = None,
|
|
||||||
alias: Union[str, list, tuple, dict] = None,
|
alias: Union[str, list, tuple, dict] = None,
|
||||||
recommend_modules: Union[str, list, tuple] = None,
|
recommend_modules: Union[str, list, tuple] = None,
|
||||||
developers: Union[str, list, tuple] = None,
|
developers: Union[str, list, tuple] = None,
|
||||||
need_superuser: bool = False,
|
need_superuser: bool = False,
|
||||||
need_admin: bool = False
|
need_admin: bool = False
|
||||||
):
|
):
|
||||||
|
"""
|
||||||
|
|
||||||
|
:param bind_prefix: 绑定的命令前缀。
|
||||||
|
:param alias: 此命令的别名。
|
||||||
|
:param desc: 此命令的简介。
|
||||||
|
:param recommend_modules: 推荐打开的其他模块。
|
||||||
|
:param developers: 模块作者。
|
||||||
|
:param need_admin: 此命令是否需要群聊管理员权限。
|
||||||
|
:param need_superuser: 将此命令设为机器人的超级管理员才可执行。
|
||||||
|
:return: 此类型的模块。
|
||||||
|
"""
|
||||||
def decorator(function):
|
def decorator(function):
|
||||||
module = Option(bind_prefix=bind_prefix,
|
module = Option(bind_prefix=bind_prefix,
|
||||||
desc=desc,
|
desc=desc,
|
||||||
help_doc=help_doc,
|
|
||||||
alias=alias,
|
alias=alias,
|
||||||
recommend_modules=recommend_modules,
|
recommend_modules=recommend_modules,
|
||||||
developers=developers,
|
developers=developers,
|
||||||
|
@ -72,19 +145,29 @@ def schedule(
|
||||||
bind_prefix: str,
|
bind_prefix: str,
|
||||||
trigger: Union[AndTrigger, OrTrigger, DateTrigger, CronTrigger, IntervalTrigger],
|
trigger: Union[AndTrigger, OrTrigger, DateTrigger, CronTrigger, IntervalTrigger],
|
||||||
desc: str = None,
|
desc: str = None,
|
||||||
help_doc: Union[str, list, tuple] = None,
|
|
||||||
alias: Union[str, list, tuple, dict] = None,
|
alias: Union[str, list, tuple, dict] = None,
|
||||||
recommend_modules: Union[str, list, tuple] = None,
|
recommend_modules: Union[str, list, tuple] = None,
|
||||||
developers: Union[str, list, tuple] = None,
|
developers: Union[str, list, tuple] = None,
|
||||||
need_superuser: bool = False,
|
need_superuser: bool = False,
|
||||||
need_admin: bool = False
|
need_admin: bool = False
|
||||||
):
|
):
|
||||||
|
"""
|
||||||
|
|
||||||
|
:param bind_prefix: 绑定的命令前缀。
|
||||||
|
:param trigger: 此命令的触发器。
|
||||||
|
:param alias: 此命令的别名。
|
||||||
|
:param desc: 此命令的简介。
|
||||||
|
:param recommend_modules: 推荐打开的其他模块。
|
||||||
|
:param developers: 模块作者。
|
||||||
|
:param need_admin: 此命令是否需要群聊管理员权限。
|
||||||
|
:param need_superuser: 将此命令设为机器人的超级管理员才可执行。
|
||||||
|
:return: 此类型的模块。
|
||||||
|
"""
|
||||||
def decorator(function):
|
def decorator(function):
|
||||||
module = Schedule(function=function,
|
module = Schedule(function=function,
|
||||||
trigger=trigger,
|
trigger=trigger,
|
||||||
bind_prefix=bind_prefix,
|
bind_prefix=bind_prefix,
|
||||||
desc=desc,
|
desc=desc,
|
||||||
help_doc=help_doc,
|
|
||||||
alias=alias,
|
alias=alias,
|
||||||
recommend_modules=recommend_modules,
|
recommend_modules=recommend_modules,
|
||||||
developers=developers,
|
developers=developers,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import re
|
import re
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
from core.elements import MessageSession, Option, command_prefix
|
from core.elements import MessageSession, Command, Option, Schedule, command_prefix
|
||||||
from core.loader import Modules, ModulesAliases, ModulesRegex
|
from core.loader import Modules, ModulesAliases, ModulesRegex
|
||||||
from core.logger import Logger
|
from core.logger import Logger
|
||||||
from core.parser.command import CommandParser, InvalidCommandFormatError, InvalidHelpDocTypeError
|
from core.parser.command import CommandParser, InvalidCommandFormatError, InvalidHelpDocTypeError
|
||||||
|
@ -22,7 +22,8 @@ async def parser(msg: MessageSession):
|
||||||
if senderInfo.query.isInBlackList and not senderInfo.query.isInWhiteList or len(display) == 0:
|
if senderInfo.query.isInBlackList and not senderInfo.query.isInWhiteList or len(display) == 0:
|
||||||
return
|
return
|
||||||
if display[0] in command_prefix: # 检查消息前缀
|
if display[0] in command_prefix: # 检查消息前缀
|
||||||
Logger.info(f'[{msg.target.senderId}{f" ({msg.target.targetId})" if msg.target.targetFrom != msg.target.senderFrom else ""}] -> [Bot]: {display}')
|
Logger.info(
|
||||||
|
f'[{msg.target.senderId}{f" ({msg.target.targetId})" if msg.target.targetFrom != msg.target.senderFrom else ""}] -> [Bot]: {display}')
|
||||||
command = re.sub(r'^' + display[0], '', display)
|
command = re.sub(r'^' + display[0], '', display)
|
||||||
command_list = remove_ineffective_text(command_prefix, command.split('&&')) # 并行命令处理
|
command_list = remove_ineffective_text(command_prefix, command.split('&&')) # 并行命令处理
|
||||||
if len(command_list) > 5 and not senderInfo.query.isSuperUser:
|
if len(command_list) > 5 and not senderInfo.query.isSuperUser:
|
||||||
|
@ -41,13 +42,11 @@ async def parser(msg: MessageSession):
|
||||||
msg.trigger_msg = command
|
msg.trigger_msg = command
|
||||||
if command_first_word in Modules: # 检查触发命令是否在模块列表中
|
if command_first_word in Modules: # 检查触发命令是否在模块列表中
|
||||||
module = Modules[command_first_word]
|
module = Modules[command_first_word]
|
||||||
if isinstance(module, Option):
|
if isinstance(module, (Option, Schedule)) or module.autorun:
|
||||||
return await msg.sendMessage(module.desc)
|
if module.desc is not None:
|
||||||
if module.is_regex_function or module.autorun:
|
|
||||||
if module.help_doc is not None:
|
|
||||||
return await msg.sendMessage(CommandParser(module.help_doc).return_formatted_help_doc())
|
|
||||||
elif module.desc is not None:
|
|
||||||
return await msg.sendMessage(module.desc)
|
return await msg.sendMessage(module.desc)
|
||||||
|
return
|
||||||
|
if isinstance(module, Command):
|
||||||
if module.need_superuser:
|
if module.need_superuser:
|
||||||
if not msg.checkSuperUser():
|
if not msg.checkSuperUser():
|
||||||
return await msg.sendMessage('你没有使用该命令的权限。')
|
return await msg.sendMessage('你没有使用该命令的权限。')
|
||||||
|
@ -68,12 +67,22 @@ async def parser(msg: MessageSession):
|
||||||
except InvalidCommandFormatError:
|
except InvalidCommandFormatError:
|
||||||
return await msg.sendMessage('语法错误。\n' + command_parser.return_formatted_help_doc())
|
return await msg.sendMessage('语法错误。\n' + command_parser.return_formatted_help_doc())
|
||||||
except InvalidHelpDocTypeError:
|
except InvalidHelpDocTypeError:
|
||||||
return await msg.sendMessage('此模块的帮助信息有误,请联系开发者处理。\n错误汇报地址:https://github.com/Teahouse-Studios/bot/issues/new?assignees=OasisAkari&labels=bug&template=5678.md&title=')
|
return await msg.sendMessage(
|
||||||
|
'此模块的帮助信息有误,请联系开发者处理。\n错误汇报地址:https://github.com/Teahouse-Studios/bot/issues/new?assignees=OasisAkari&labels=bug&template=5678.md&title=')
|
||||||
async with msg.Typing(msg):
|
async with msg.Typing(msg):
|
||||||
await Modules[command_first_word].function(msg) # 将dict传入下游模块
|
await Modules[command_first_word].function(msg) # 将msg传入下游模块
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
Logger.error(traceback.format_exc())
|
Logger.error(traceback.format_exc())
|
||||||
await msg.sendMessage('执行命令时发生错误,请报告机器人开发者:\n' + str(e) + '\n错误汇报地址:https://github.com/Teahouse-Studios/bot/issues/new?assignees=OasisAkari&labels=bug&template=5678.md&title=')
|
await msg.sendMessage('执行命令时发生错误,请报告机器人开发者:\n' + str(
|
||||||
|
e) + '\n错误汇报地址:https://github.com/Teahouse-Studios/bot/issues/new?assignees=OasisAkari&labels=bug&template=5678.md&title=')
|
||||||
for regex in ModulesRegex: # 遍历正则模块列表
|
for regex in ModulesRegex: # 遍历正则模块列表
|
||||||
if regex in enabled_modules_list:
|
if regex in enabled_modules_list:
|
||||||
await ModulesRegex[regex].function(msg) # 将整条dict传入下游正则模块
|
regex_module = ModulesRegex[regex]
|
||||||
|
msg.matched_msg = False
|
||||||
|
if regex_module.mode.upper() in ['M', 'MATCH']:
|
||||||
|
msg.matched_msg = re.match(regex_module.pattern, display, flags=regex_module.flags)
|
||||||
|
elif regex_module.mode.upper() in ['A', 'FINDALL']:
|
||||||
|
msg.matched_msg = re.findall(regex_module.pattern, display, flags=regex_module.flags)
|
||||||
|
if msg.matched_msg or msg.matched_msg is not None:
|
||||||
|
async with msg.Typing(msg):
|
||||||
|
await regex_module.function(msg) # 将msg传入下游模块
|
||||||
|
|
|
@ -13,10 +13,9 @@ async def main(msg: MessageSession):
|
||||||
if friendcode:
|
if friendcode:
|
||||||
if friendcode == 'initialize':
|
if friendcode == 'initialize':
|
||||||
if msg.checkSuperUser():
|
if msg.checkSuperUser():
|
||||||
await arcb30init(msg)
|
return await arcb30init(msg)
|
||||||
else:
|
else:
|
||||||
await msg.sendMessage('权限不足')
|
return await msg.sendMessage('权限不足')
|
||||||
return
|
|
||||||
else:
|
else:
|
||||||
if not os.path.exists(assets):
|
if not os.path.exists(assets):
|
||||||
resp = {'text': '未找到资源文件!请放置一枚arcaea的apk到机器人的assets目录并重命名为arc.apk后,使用~b30 initialize初始化资源。'}
|
resp = {'text': '未找到资源文件!请放置一枚arcaea的apk到机器人的assets目录并重命名为arc.apk后,使用~b30 initialize初始化资源。'}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from core.elements import MessageSession
|
from core.elements import MessageSession
|
||||||
from core.loader.decorator import command
|
from core.loader.decorator import command, regex
|
||||||
from .bugtracker import bugtracker_get
|
from .bugtracker import bugtracker_get
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,24 +16,17 @@ async def bugtracker(msg: MessageSession):
|
||||||
await msg.sendMessage(result)
|
await msg.sendMessage(result)
|
||||||
|
|
||||||
|
|
||||||
@command('bug_regex', desc='正则自动查询Mojira漏洞,所有消息开头为!<mojiraid>和来自Mojira的链接将会被自动查询并发送梗概内容。',
|
@regex('bug_regex', pattern=r'^\!(?:bug |)(.*)-(.*)', mode='M',
|
||||||
developers=['OasisAkari'],
|
desc='正则自动查询Mojira漏洞,所有消息开头为!<mojiraid>和来自Mojira的链接将会被自动查询并发送梗概内容。',
|
||||||
is_regex_function=True)
|
developers=['OasisAkari'])
|
||||||
async def regex_bugtracker(msg: MessageSession):
|
async def regex_bugtracker(msg: MessageSession):
|
||||||
display_msg = msg.asDisplay()
|
result = await bugtracker_get(msg.matched_msg.group(1) + '-' + msg.matched_msg.group(2))
|
||||||
if display_msg.find('[Webhook]') != -1:
|
|
||||||
return
|
|
||||||
if display_msg[0] == '!':
|
|
||||||
display_msg = re.sub('^!', '', display_msg)
|
|
||||||
display_msg = re.sub('^bug ', '', display_msg)
|
|
||||||
q = re.match(r'(.*-.*)', display_msg)
|
|
||||||
if q:
|
|
||||||
async with msg.Typing(msg):
|
|
||||||
result = await bugtracker_get(q.group(1))
|
|
||||||
return await msg.sendMessage(result)
|
return await msg.sendMessage(result)
|
||||||
rlink = re.compile(r'https://bugs\.mojang\.com/browse/(.*?-\d*)')
|
|
||||||
|
|
||||||
|
"""rlink = re.compile(r'https://bugs\.mojang\.com/browse/(.*?-\d*)')
|
||||||
findlink = re.findall(rlink, display_msg)
|
findlink = re.findall(rlink, display_msg)
|
||||||
for link in findlink:
|
for link in findlink:
|
||||||
matchbug = re.match(rlink, link)
|
matchbug = re.match(rlink, link)
|
||||||
if matchbug:
|
if matchbug:
|
||||||
await msg.sendMessage(await bugtracker_get(matchbug.group(1)))
|
await msg.sendMessage(await bugtracker_get(matchbug.group(1)))"""
|
||||||
|
|
|
@ -41,7 +41,9 @@ async def config_modules(msg: MessageSession):
|
||||||
enable_list = []
|
enable_list = []
|
||||||
if wait_config_list == ['all']:
|
if wait_config_list == ['all']:
|
||||||
for function in modules:
|
for function in modules:
|
||||||
if not modules[function].need_superuser and not modules[function].is_base_function:
|
if not modules[function].need_superuser:
|
||||||
|
if isinstance(modules[function], Command) and modules[function].is_base_function:
|
||||||
|
continue
|
||||||
enable_list.append(function)
|
enable_list.append(function)
|
||||||
else:
|
else:
|
||||||
for module in wait_config_list:
|
for module in wait_config_list:
|
||||||
|
@ -50,7 +52,7 @@ async def config_modules(msg: MessageSession):
|
||||||
else:
|
else:
|
||||||
if modules[module].need_superuser and not msg.checkSuperUser():
|
if modules[module].need_superuser and not msg.checkSuperUser():
|
||||||
msglist.append(f'失败:你没有打开“{module}”的权限。')
|
msglist.append(f'失败:你没有打开“{module}”的权限。')
|
||||||
elif modules[module].is_base_function:
|
elif isinstance(modules[module], Command) and modules[module].is_base_function:
|
||||||
msglist.append(f'失败:“{module}”为基础模块。')
|
msglist.append(f'失败:“{module}”为基础模块。')
|
||||||
else:
|
else:
|
||||||
enable_list.append(module)
|
enable_list.append(module)
|
||||||
|
@ -110,6 +112,7 @@ async def bot_help(msg: MessageSession):
|
||||||
module_list = ModulesManager.return_modules_list_as_dict()
|
module_list = ModulesManager.return_modules_list_as_dict()
|
||||||
developers = ModulesManager.return_modules_developers_map()
|
developers = ModulesManager.return_modules_developers_map()
|
||||||
alias = ModulesManager.return_modules_alias_map()
|
alias = ModulesManager.return_modules_alias_map()
|
||||||
|
modules_alias = ModulesManager.return_modules_alias_list()
|
||||||
if msg.parsed_msg is not None:
|
if msg.parsed_msg is not None:
|
||||||
msgs = []
|
msgs = []
|
||||||
help_name = msg.parsed_msg['<module>']
|
help_name = msg.parsed_msg['<module>']
|
||||||
|
@ -121,12 +124,25 @@ async def bot_help(msg: MessageSession):
|
||||||
msgs.append(help_)
|
msgs.append(help_)
|
||||||
if msgs:
|
if msgs:
|
||||||
doc = '\n'.join(msgs)
|
doc = '\n'.join(msgs)
|
||||||
|
if help_name in modules_alias:
|
||||||
|
malias = []
|
||||||
|
for a in modules_alias[help_name]:
|
||||||
|
if isinstance(modules_alias[help_name][a], dict):
|
||||||
|
malias.append(f'{a} -> {modules_alias[help_name][a]}')
|
||||||
|
elif isinstance(modules_alias[help_name][a], str):
|
||||||
|
malias.append(f'{a} -> {help_name}')
|
||||||
|
else:
|
||||||
|
malias.append('<数据类型错误,请联系开发者解决>')
|
||||||
|
if malias:
|
||||||
|
doc += '\n命令别名:\n' + '\n'.join(malias)
|
||||||
if help_name in developers:
|
if help_name in developers:
|
||||||
dev_list = developers[help_name]
|
dev_list = developers[help_name]
|
||||||
if isinstance(dev_list, (list, tuple)):
|
if isinstance(dev_list, (list, tuple)):
|
||||||
devs = '、'.join(developers[help_name]) if developers[help_name] is not None else ''
|
devs = '、'.join(developers[help_name]) if developers[help_name] is not None else ''
|
||||||
elif isinstance(dev_list, str):
|
elif isinstance(dev_list, str):
|
||||||
devs = dev_list
|
devs = dev_list
|
||||||
|
else:
|
||||||
|
devs = '<数据类型错误,请联系开发者解决>'
|
||||||
else:
|
else:
|
||||||
devs = ''
|
devs = ''
|
||||||
devs_msg = '\n模块作者:' + devs if devs != '' else ''
|
devs_msg = '\n模块作者:' + devs if devs != '' else ''
|
||||||
|
|
|
@ -9,7 +9,7 @@ from modules.maimai.libraries.maimai_best_40 import generate
|
||||||
|
|
||||||
|
|
||||||
from core.elements import Plain, Image as BImage, MessageSession
|
from core.elements import Plain, Image as BImage, MessageSession
|
||||||
from core.loader.decorator import command
|
from core.loader.decorator import command, regex as command_regex
|
||||||
|
|
||||||
|
|
||||||
def song_txt(music: Music):
|
def song_txt(music: Music):
|
||||||
|
@ -47,11 +47,10 @@ async def _(msg: MessageSession):
|
||||||
await msg.sendMessage(s.strip())
|
await msg.sendMessage(s.strip())
|
||||||
|
|
||||||
|
|
||||||
@command('maimai_random_music_regex1', is_regex_function=True, desc='随个[dx/标准][绿黄红紫白]<难度> 随机一首指定条件的乐曲')
|
@command_regex('maimai_random_music_regex1', pattern=r"随个((?:dx|sd|标准))?([绿黄红紫白]?)([0-9]+\+?)",
|
||||||
|
desc='随个[dx/标准][绿黄红紫白]<难度> 随机一首指定条件的乐曲')
|
||||||
async def _(msg: MessageSession):
|
async def _(msg: MessageSession):
|
||||||
level_labels = ['绿', '黄', '红', '紫', '白']
|
res = msg.matched_msg
|
||||||
regex = "随个((?:dx|sd|标准))?([绿黄红紫白]?)([0-9]+\+?)"
|
|
||||||
res = re.match(regex, msg.asDisplay())
|
|
||||||
if res:
|
if res:
|
||||||
try:
|
try:
|
||||||
if res.groups()[0] == "dx":
|
if res.groups()[0] == "dx":
|
||||||
|
@ -75,18 +74,14 @@ async def _(msg: MessageSession):
|
||||||
await msg.sendMessage("随机命令错误,请检查语法")
|
await msg.sendMessage("随机命令错误,请检查语法")
|
||||||
|
|
||||||
|
|
||||||
@command('maimai_random_music_regex2', is_regex_function=True, desc='XXXmaimaiXXX什么 随机一首歌')
|
@command_regex('maimai_random_music_regex2', pattern=r".*maimai.*什么", desc='XXXmaimaiXXX什么 随机一首歌')
|
||||||
async def _(msg: MessageSession):
|
async def _(msg: MessageSession):
|
||||||
if re.match(r".*maimai.*什么", msg.asDisplay()):
|
|
||||||
await msg.sendMessage(song_txt(total_list.random()))
|
await msg.sendMessage(song_txt(total_list.random()))
|
||||||
|
|
||||||
|
|
||||||
@command('maimai_search_music_regex', is_regex_function=True, desc='查歌<乐曲标题的一部分> 查询符合条件的乐曲')
|
@command_regex('maimai_search_music_regex', pattern=r"查歌(.+)", desc='查歌<乐曲标题的一部分> 查询符合条件的乐曲')
|
||||||
async def _(msg: MessageSession):
|
async def _(msg: MessageSession):
|
||||||
regex = "查歌(.+)"
|
name = msg.matched_msg.groups()[0].strip()
|
||||||
name = re.match(regex, msg.asDisplay())
|
|
||||||
if name:
|
|
||||||
name = name.groups()[0].strip()
|
|
||||||
if name == "":
|
if name == "":
|
||||||
return
|
return
|
||||||
res = total_list.filter(title_search=name)
|
res = total_list.filter(title_search=name)
|
||||||
|
@ -101,12 +96,10 @@ async def _(msg: MessageSession):
|
||||||
await msg.sendMessage(f"结果过多({len(res)} 条),请缩小查询范围。")
|
await msg.sendMessage(f"结果过多({len(res)} 条),请缩小查询范围。")
|
||||||
|
|
||||||
|
|
||||||
@command('maimai_query_chart_regex', is_regex_function=True, desc='[绿黄红紫白]id<歌曲编号> 查询乐曲信息或谱面信息')
|
@command_regex('maimai_query_chart_regex', pattern=r"([绿黄红紫白]?)id([0-9]+)",
|
||||||
|
desc='[绿黄红紫白]id<歌曲编号> 查询乐曲信息或谱面信息')
|
||||||
async def _(message: MessageSession):
|
async def _(message: MessageSession):
|
||||||
regex = "([绿黄红紫白]?)id([0-9]+)"
|
groups = message.matched_msg.groups()
|
||||||
groups = re.match(regex, message.asDisplay())
|
|
||||||
if groups:
|
|
||||||
groups = groups.groups()
|
|
||||||
level_labels = ['绿', '黄', '红', '紫', '白']
|
level_labels = ['绿', '黄', '红', '紫', '白']
|
||||||
if groups[0] != "":
|
if groups[0] != "":
|
||||||
try:
|
try:
|
||||||
|
@ -120,19 +113,19 @@ async def _(message: MessageSession):
|
||||||
file = f"https://www.diving-fish.com/covers/{music['id']}.jpg"
|
file = f"https://www.diving-fish.com/covers/{music['id']}.jpg"
|
||||||
if len(chart['notes']) == 4:
|
if len(chart['notes']) == 4:
|
||||||
msg = f'''{level_name[level_index]} {level}({ds})
|
msg = f'''{level_name[level_index]} {level}({ds})
|
||||||
TAP: {chart['notes'][0]}
|
TAP: {chart['notes'][0]}
|
||||||
HOLD: {chart['notes'][1]}
|
HOLD: {chart['notes'][1]}
|
||||||
SLIDE: {chart['notes'][2]}
|
SLIDE: {chart['notes'][2]}
|
||||||
BREAK: {chart['notes'][3]}
|
BREAK: {chart['notes'][3]}
|
||||||
谱师: {chart['charter']}'''
|
谱师: {chart['charter']}'''
|
||||||
else:
|
else:
|
||||||
msg = f'''{level_name[level_index]} {level}({ds})
|
msg = f'''{level_name[level_index]} {level}({ds})
|
||||||
TAP: {chart['notes'][0]}
|
TAP: {chart['notes'][0]}
|
||||||
HOLD: {chart['notes'][1]}
|
HOLD: {chart['notes'][1]}
|
||||||
SLIDE: {chart['notes'][2]}
|
SLIDE: {chart['notes'][2]}
|
||||||
TOUCH: {chart['notes'][3]}
|
TOUCH: {chart['notes'][3]}
|
||||||
BREAK: {chart['notes'][4]}
|
BREAK: {chart['notes'][4]}
|
||||||
谱师: {chart['charter']}'''
|
谱师: {chart['charter']}'''
|
||||||
await message.sendMessage([Plain(f"{music['id']}. {music['title']}\n"), BImage(f"{file}"), Plain(msg)])
|
await message.sendMessage([Plain(f"{music['id']}. {music['title']}\n"), BImage(f"{file}"), Plain(msg)])
|
||||||
except Exception:
|
except Exception:
|
||||||
await message.sendMessage("未找到该谱面")
|
await message.sendMessage("未找到该谱面")
|
||||||
|
@ -186,12 +179,9 @@ for t in tmp:
|
||||||
music_aliases[arr[i].lower()].append(arr[0])
|
music_aliases[arr[i].lower()].append(arr[0])
|
||||||
|
|
||||||
|
|
||||||
@command('maimai_find_song_regex', is_regex_function=True, desc='<歌曲别名>是什么歌 查询乐曲别名对应的乐曲')
|
@command_regex('maimai_find_song_regex', pattern=r"(.+)是什么歌", desc='<歌曲别名>是什么歌 查询乐曲别名对应的乐曲')
|
||||||
async def _(msg: MessageSession):
|
async def _(msg: MessageSession):
|
||||||
regex = "(.+)是什么歌"
|
name = msg.matched_msg.groups()[0].strip().lower()
|
||||||
name = re.match(regex, msg.asDisplay())
|
|
||||||
if name:
|
|
||||||
name = name.groups()[0].strip().lower()
|
|
||||||
if name not in music_aliases:
|
if name not in music_aliases:
|
||||||
await msg.sendMessage("未找到此歌曲\n舞萌 DX 歌曲别名收集计划:https://docs.qq.com/sheet/DQ0pvUHh6b1hjcGpl")
|
await msg.sendMessage("未找到此歌曲\n舞萌 DX 歌曲别名收集计划:https://docs.qq.com/sheet/DQ0pvUHh6b1hjcGpl")
|
||||||
return
|
return
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import re
|
import re
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
import ujson as json
|
import ujson as json
|
||||||
|
|
||||||
from core.elements import MessageSession, Plain, Image, Voice, Option
|
from core.elements import MessageSession, Plain, Image, Voice, Option
|
||||||
from core.loader import ModulesManager
|
from core.loader import ModulesManager
|
||||||
from core.loader.decorator import command
|
from core.loader.decorator import command, regex
|
||||||
from core.parser.command import CommandParser
|
|
||||||
from core.utils import download_to_cache
|
from core.utils import download_to_cache
|
||||||
from database import BotDBUtil
|
from database import BotDBUtil
|
||||||
from modules.wiki.dbutils import WikiTargetInfo
|
from modules.wiki.dbutils import WikiTargetInfo
|
||||||
|
@ -108,7 +108,9 @@ async def set_headers(msg: MessageSession):
|
||||||
await msg.sendMessage(f'成功更新请求时所使用的Headers:\n{json.dumps(target.get_headers())}')
|
await msg.sendMessage(f'成功更新请求时所使用的Headers:\n{json.dumps(target.get_headers())}')
|
||||||
|
|
||||||
|
|
||||||
@command('wiki_inline', is_regex_function=True, desc='解析消息中带有的[[]]或{{}}字符串自动查询Wiki,如[[海晶石]]', alias='wiki_regex', developers=['OasisAkari'])
|
@regex('wiki_inline', pattern=r'\[\[.*?]]|{{.*?}}', mode='M',
|
||||||
|
desc='解析消息中带有的[[]]或{{}}字符串自动查询Wiki,如[[海晶石]]',
|
||||||
|
alias='wiki_regex', developers=['OasisAkari'])
|
||||||
async def regex_wiki(msg: MessageSession):
|
async def regex_wiki(msg: MessageSession):
|
||||||
await regex_proc(msg, msg.asDisplay())
|
await regex_proc(msg, msg.asDisplay())
|
||||||
|
|
||||||
|
@ -117,8 +119,8 @@ ModulesManager.add_module(Option('wiki_fandom_addon', desc='为Fandom定制的
|
||||||
|
|
||||||
|
|
||||||
async def regex_proc(msg: MessageSession, display, typing=True):
|
async def regex_proc(msg: MessageSession, display, typing=True):
|
||||||
mains = re.findall(r'\[\[(.*?)\]\]', display, re.I)
|
mains = re.findall(r'\[\[(.*?)]]', display, re.I)
|
||||||
templates = re.findall(r'\{\{(.*?)\}\}', display, re.I)
|
templates = re.findall(r'{{(.*?)}}', display, re.I)
|
||||||
find_dict = {}
|
find_dict = {}
|
||||||
global_status = 'done'
|
global_status = 'done'
|
||||||
site_lock = False
|
site_lock = False
|
||||||
|
@ -248,3 +250,11 @@ async def regex_proc(msg: MessageSession, display, typing=True):
|
||||||
waits1 = f'[[{waits}]]'
|
waits1 = f'[[{waits}]]'
|
||||||
nwaitlist.append(waits1)
|
nwaitlist.append(waits1)
|
||||||
await regex_proc(msg, '\n'.join(nwaitlist))
|
await regex_proc(msg, '\n'.join(nwaitlist))
|
||||||
|
|
||||||
|
|
||||||
|
"""async def query_page(msg: MessageSession, title: Union[str, list, tuple]):
|
||||||
|
target = WikiTargetInfo(msg)
|
||||||
|
for t in title:
|
||||||
|
match_interwiki = re.match(r'(.*?):(.*)', t)
|
||||||
|
|
||||||
|
"""
|
Reference in a new issue