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,
|
||||
target: MsgInfo,
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from typing import Callable, Union
|
||||
import re
|
||||
|
||||
from apscheduler.triggers.combining import AndTrigger, OrTrigger
|
||||
from apscheduler.triggers.cron import CronTrigger
|
||||
|
@ -19,7 +20,6 @@ class Command:
|
|||
need_admin: bool = False,
|
||||
is_base_function: bool = False,
|
||||
need_superuser: bool = False,
|
||||
is_regex_function: bool = False,
|
||||
autorun: bool = False):
|
||||
self.function = function
|
||||
self.bind_prefix = bind_prefix
|
||||
|
@ -32,30 +32,52 @@ class Command:
|
|||
self.need_admin = need_admin
|
||||
self.is_base_function = is_base_function
|
||||
self.need_superuser = need_superuser
|
||||
self.is_regex_function = is_regex_function
|
||||
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:
|
||||
def __init__(self,
|
||||
bind_prefix: str,
|
||||
desc: str = None,
|
||||
help_doc: Union[str, list, tuple] = None,
|
||||
alias: Union[str, list, tuple, dict] = None,
|
||||
recommend_modules: Union[str, list, tuple] = None,
|
||||
developers: Union[str, list, tuple] = None,
|
||||
need_superuser: bool = False,
|
||||
need_admin: bool = False):
|
||||
self.bind_prefix = bind_prefix
|
||||
self.help_doc = help_doc
|
||||
self.desc = desc
|
||||
self.alias = alias
|
||||
self.allowed_none = True
|
||||
self.recommend_modules = recommend_modules
|
||||
self.developers = developers
|
||||
self.need_superuser = need_superuser
|
||||
self.is_base_function = False
|
||||
self.is_regex_function = False
|
||||
self.need_admin = need_admin
|
||||
|
||||
|
||||
|
@ -65,7 +87,6 @@ class Schedule:
|
|||
trigger: [AndTrigger, OrTrigger, DateTrigger, CronTrigger, IntervalTrigger],
|
||||
bind_prefix: str,
|
||||
desc: str = None,
|
||||
help_doc: Union[str, list, tuple] = None,
|
||||
alias: Union[str, list, tuple, dict] = None,
|
||||
recommend_modules: Union[str, list, tuple] = None,
|
||||
developers: Union[str, list, tuple] = None,
|
||||
|
@ -76,15 +97,12 @@ class Schedule:
|
|||
self.trigger = trigger
|
||||
self.bind_prefix = bind_prefix
|
||||
self.desc = desc
|
||||
self.help_doc = help_doc
|
||||
self.allowed_none = True
|
||||
self.alias = alias
|
||||
self.recommend_modules = recommend_modules
|
||||
self.developers = developers
|
||||
self.need_superuser = need_superuser
|
||||
self.is_base_function = False
|
||||
self.is_regex_function = False
|
||||
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 re
|
||||
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
|
||||
|
||||
err_prompt = []
|
||||
|
@ -36,7 +37,7 @@ class ModulesManager:
|
|||
_modules_list = set()
|
||||
|
||||
@staticmethod
|
||||
def add_module(module: [Command, Option, Schedule]):
|
||||
def add_module(module: [Command, Option, Schedule, RegexCommand]):
|
||||
ModulesManager._modules_list.add(module)
|
||||
|
||||
@staticmethod
|
||||
|
@ -111,18 +112,10 @@ class ModulesManager:
|
|||
def return_regex_modules():
|
||||
d = {}
|
||||
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})
|
||||
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
|
||||
def return_schedule_function_list():
|
||||
l = []
|
||||
|
@ -133,10 +126,9 @@ class ModulesManager:
|
|||
|
||||
|
||||
load_modules()
|
||||
Modules = ModulesManager.return_modules_list_as_dict()
|
||||
ModulesAliases = ModulesManager.return_modules_alias_map()
|
||||
Modules: Union[Dict[str, Command], Dict[str, Option], Dict[str, Schedule], Dict[str, RegexCommand]] = ModulesManager.return_modules_list_as_dict()
|
||||
ModulesAliases: Dict[str, RegexCommand] = ModulesManager.return_modules_alias_map()
|
||||
ModulesRegex = ModulesManager.return_regex_modules()
|
||||
ModulesHelp = ModulesManager.return_modules_help()
|
||||
|
||||
loadercache = os.path.abspath('.cache_loader')
|
||||
openloadercache = open(loadercache, 'w')
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
import re
|
||||
|
||||
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
|
||||
|
||||
from core.elements import Command, Option, Schedule
|
||||
from core.elements import Command, RegexCommand, Option, Schedule
|
||||
from core.loader import ModulesManager
|
||||
|
||||
from typing import Union
|
||||
|
@ -20,9 +22,24 @@ def command(
|
|||
need_admin: bool = False,
|
||||
is_base_function: bool = False,
|
||||
need_superuser: bool = False,
|
||||
is_regex_function: 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):
|
||||
module = Command(function=function,
|
||||
alias=alias,
|
||||
|
@ -33,7 +50,6 @@ def command(
|
|||
recommend_modules=recommend_modules,
|
||||
developers=developers,
|
||||
is_base_function=is_base_function,
|
||||
is_regex_function=is_regex_function,
|
||||
need_admin=need_admin,
|
||||
need_superuser=need_superuser,
|
||||
autorun=autorun)
|
||||
|
@ -43,20 +59,77 @@ def command(
|
|||
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(
|
||||
bind_prefix: str,
|
||||
desc: str = None,
|
||||
help_doc: Union[str, list, tuple] = None,
|
||||
alias: Union[str, list, tuple, dict] = None,
|
||||
recommend_modules: Union[str, list, tuple] = None,
|
||||
developers: Union[str, list, tuple] = None,
|
||||
need_superuser: 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):
|
||||
module = Option(bind_prefix=bind_prefix,
|
||||
desc=desc,
|
||||
help_doc=help_doc,
|
||||
alias=alias,
|
||||
recommend_modules=recommend_modules,
|
||||
developers=developers,
|
||||
|
@ -72,19 +145,29 @@ def schedule(
|
|||
bind_prefix: str,
|
||||
trigger: Union[AndTrigger, OrTrigger, DateTrigger, CronTrigger, IntervalTrigger],
|
||||
desc: str = None,
|
||||
help_doc: Union[str, list, tuple] = None,
|
||||
alias: Union[str, list, tuple, dict] = None,
|
||||
recommend_modules: Union[str, list, tuple] = None,
|
||||
developers: Union[str, list, tuple] = None,
|
||||
need_superuser: 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):
|
||||
module = Schedule(function=function,
|
||||
trigger=trigger,
|
||||
bind_prefix=bind_prefix,
|
||||
desc=desc,
|
||||
help_doc=help_doc,
|
||||
alias=alias,
|
||||
recommend_modules=recommend_modules,
|
||||
developers=developers,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import re
|
||||
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.logger import Logger
|
||||
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:
|
||||
return
|
||||
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_list = remove_ineffective_text(command_prefix, command.split('&&')) # 并行命令处理
|
||||
if len(command_list) > 5 and not senderInfo.query.isSuperUser:
|
||||
|
@ -41,13 +42,11 @@ async def parser(msg: MessageSession):
|
|||
msg.trigger_msg = command
|
||||
if command_first_word in Modules: # 检查触发命令是否在模块列表中
|
||||
module = Modules[command_first_word]
|
||||
if isinstance(module, Option):
|
||||
return await msg.sendMessage(module.desc)
|
||||
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:
|
||||
if isinstance(module, (Option, Schedule)) or module.autorun:
|
||||
if module.desc is not None:
|
||||
return await msg.sendMessage(module.desc)
|
||||
return
|
||||
if isinstance(module, Command):
|
||||
if module.need_superuser:
|
||||
if not msg.checkSuperUser():
|
||||
return await msg.sendMessage('你没有使用该命令的权限。')
|
||||
|
@ -68,12 +67,22 @@ async def parser(msg: MessageSession):
|
|||
except InvalidCommandFormatError:
|
||||
return await msg.sendMessage('语法错误。\n' + command_parser.return_formatted_help_doc())
|
||||
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):
|
||||
await Modules[command_first_word].function(msg) # 将dict传入下游模块
|
||||
await Modules[command_first_word].function(msg) # 将msg传入下游模块
|
||||
except Exception as e:
|
||||
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: # 遍历正则模块列表
|
||||
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 == 'initialize':
|
||||
if msg.checkSuperUser():
|
||||
await arcb30init(msg)
|
||||
return await arcb30init(msg)
|
||||
else:
|
||||
await msg.sendMessage('权限不足')
|
||||
return
|
||||
return await msg.sendMessage('权限不足')
|
||||
else:
|
||||
if not os.path.exists(assets):
|
||||
resp = {'text': '未找到资源文件!请放置一枚arcaea的apk到机器人的assets目录并重命名为arc.apk后,使用~b30 initialize初始化资源。'}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import re
|
||||
|
||||
from core.elements import MessageSession
|
||||
from core.loader.decorator import command
|
||||
from core.loader.decorator import command, regex
|
||||
from .bugtracker import bugtracker_get
|
||||
|
||||
|
||||
|
@ -16,24 +16,17 @@ async def bugtracker(msg: MessageSession):
|
|||
await msg.sendMessage(result)
|
||||
|
||||
|
||||
@command('bug_regex', desc='正则自动查询Mojira漏洞,所有消息开头为!<mojiraid>和来自Mojira的链接将会被自动查询并发送梗概内容。',
|
||||
developers=['OasisAkari'],
|
||||
is_regex_function=True)
|
||||
@regex('bug_regex', pattern=r'^\!(?:bug |)(.*)-(.*)', mode='M',
|
||||
desc='正则自动查询Mojira漏洞,所有消息开头为!<mojiraid>和来自Mojira的链接将会被自动查询并发送梗概内容。',
|
||||
developers=['OasisAkari'])
|
||||
async def regex_bugtracker(msg: MessageSession):
|
||||
display_msg = msg.asDisplay()
|
||||
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))
|
||||
result = await bugtracker_get(msg.matched_msg.group(1) + '-' + msg.matched_msg.group(2))
|
||||
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)
|
||||
for link in findlink:
|
||||
matchbug = re.match(rlink, link)
|
||||
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 = []
|
||||
if wait_config_list == ['all']:
|
||||
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)
|
||||
else:
|
||||
for module in wait_config_list:
|
||||
|
@ -50,7 +52,7 @@ async def config_modules(msg: MessageSession):
|
|||
else:
|
||||
if modules[module].need_superuser and not msg.checkSuperUser():
|
||||
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}”为基础模块。')
|
||||
else:
|
||||
enable_list.append(module)
|
||||
|
@ -110,6 +112,7 @@ async def bot_help(msg: MessageSession):
|
|||
module_list = ModulesManager.return_modules_list_as_dict()
|
||||
developers = ModulesManager.return_modules_developers_map()
|
||||
alias = ModulesManager.return_modules_alias_map()
|
||||
modules_alias = ModulesManager.return_modules_alias_list()
|
||||
if msg.parsed_msg is not None:
|
||||
msgs = []
|
||||
help_name = msg.parsed_msg['<module>']
|
||||
|
@ -121,12 +124,25 @@ async def bot_help(msg: MessageSession):
|
|||
msgs.append(help_)
|
||||
if 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:
|
||||
dev_list = developers[help_name]
|
||||
if isinstance(dev_list, (list, tuple)):
|
||||
devs = '、'.join(developers[help_name]) if developers[help_name] is not None else ''
|
||||
elif isinstance(dev_list, str):
|
||||
devs = dev_list
|
||||
else:
|
||||
devs = '<数据类型错误,请联系开发者解决>'
|
||||
else:
|
||||
devs = ''
|
||||
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.loader.decorator import command
|
||||
from core.loader.decorator import command, regex as command_regex
|
||||
|
||||
|
||||
def song_txt(music: Music):
|
||||
|
@ -47,11 +47,10 @@ async def _(msg: MessageSession):
|
|||
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):
|
||||
level_labels = ['绿', '黄', '红', '紫', '白']
|
||||
regex = "随个((?:dx|sd|标准))?([绿黄红紫白]?)([0-9]+\+?)"
|
||||
res = re.match(regex, msg.asDisplay())
|
||||
res = msg.matched_msg
|
||||
if res:
|
||||
try:
|
||||
if res.groups()[0] == "dx":
|
||||
|
@ -75,18 +74,14 @@ async def _(msg: MessageSession):
|
|||
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):
|
||||
if re.match(r".*maimai.*什么", msg.asDisplay()):
|
||||
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):
|
||||
regex = "查歌(.+)"
|
||||
name = re.match(regex, msg.asDisplay())
|
||||
if name:
|
||||
name = name.groups()[0].strip()
|
||||
name = msg.matched_msg.groups()[0].strip()
|
||||
if name == "":
|
||||
return
|
||||
res = total_list.filter(title_search=name)
|
||||
|
@ -101,12 +96,10 @@ async def _(msg: MessageSession):
|
|||
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):
|
||||
regex = "([绿黄红紫白]?)id([0-9]+)"
|
||||
groups = re.match(regex, message.asDisplay())
|
||||
if groups:
|
||||
groups = groups.groups()
|
||||
groups = message.matched_msg.groups()
|
||||
level_labels = ['绿', '黄', '红', '紫', '白']
|
||||
if groups[0] != "":
|
||||
try:
|
||||
|
@ -120,19 +113,19 @@ async def _(message: MessageSession):
|
|||
file = f"https://www.diving-fish.com/covers/{music['id']}.jpg"
|
||||
if len(chart['notes']) == 4:
|
||||
msg = f'''{level_name[level_index]} {level}({ds})
|
||||
TAP: {chart['notes'][0]}
|
||||
HOLD: {chart['notes'][1]}
|
||||
SLIDE: {chart['notes'][2]}
|
||||
BREAK: {chart['notes'][3]}
|
||||
谱师: {chart['charter']}'''
|
||||
TAP: {chart['notes'][0]}
|
||||
HOLD: {chart['notes'][1]}
|
||||
SLIDE: {chart['notes'][2]}
|
||||
BREAK: {chart['notes'][3]}
|
||||
谱师: {chart['charter']}'''
|
||||
else:
|
||||
msg = f'''{level_name[level_index]} {level}({ds})
|
||||
TAP: {chart['notes'][0]}
|
||||
HOLD: {chart['notes'][1]}
|
||||
SLIDE: {chart['notes'][2]}
|
||||
TOUCH: {chart['notes'][3]}
|
||||
BREAK: {chart['notes'][4]}
|
||||
谱师: {chart['charter']}'''
|
||||
TAP: {chart['notes'][0]}
|
||||
HOLD: {chart['notes'][1]}
|
||||
SLIDE: {chart['notes'][2]}
|
||||
TOUCH: {chart['notes'][3]}
|
||||
BREAK: {chart['notes'][4]}
|
||||
谱师: {chart['charter']}'''
|
||||
await message.sendMessage([Plain(f"{music['id']}. {music['title']}\n"), BImage(f"{file}"), Plain(msg)])
|
||||
except Exception:
|
||||
await message.sendMessage("未找到该谱面")
|
||||
|
@ -186,12 +179,9 @@ for t in tmp:
|
|||
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):
|
||||
regex = "(.+)是什么歌"
|
||||
name = re.match(regex, msg.asDisplay())
|
||||
if name:
|
||||
name = name.groups()[0].strip().lower()
|
||||
name = msg.matched_msg.groups()[0].strip().lower()
|
||||
if name not in music_aliases:
|
||||
await msg.sendMessage("未找到此歌曲\n舞萌 DX 歌曲别名收集计划:https://docs.qq.com/sheet/DQ0pvUHh6b1hjcGpl")
|
||||
return
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
import re
|
||||
from typing import Union
|
||||
|
||||
import ujson as json
|
||||
|
||||
from core.elements import MessageSession, Plain, Image, Voice, Option
|
||||
from core.loader import ModulesManager
|
||||
from core.loader.decorator import command
|
||||
from core.parser.command import CommandParser
|
||||
from core.loader.decorator import command, regex
|
||||
from core.utils import download_to_cache
|
||||
from database import BotDBUtil
|
||||
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())}')
|
||||
|
||||
|
||||
@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):
|
||||
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):
|
||||
mains = re.findall(r'\[\[(.*?)\]\]', display, re.I)
|
||||
templates = re.findall(r'\{\{(.*?)\}\}', display, re.I)
|
||||
mains = re.findall(r'\[\[(.*?)]]', display, re.I)
|
||||
templates = re.findall(r'{{(.*?)}}', display, re.I)
|
||||
find_dict = {}
|
||||
global_status = 'done'
|
||||
site_lock = False
|
||||
|
@ -248,3 +250,11 @@ async def regex_proc(msg: MessageSession, display, typing=True):
|
|||
waits1 = f'[[{waits}]]'
|
||||
nwaitlist.append(waits1)
|
||||
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