Archived
1
0
Fork 0

add docs for decorators; introduce regex decorator

This commit is contained in:
yzhh 2021-10-13 23:22:11 +08:00
parent f032212b6c
commit df246d873a
10 changed files with 290 additions and 180 deletions

View file

@ -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,

View file

@ -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"]

View file

@ -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')

View file

@ -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,

View file

@ -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传入下游模块

View file

@ -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初始化资源。'}

View file

@ -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)))"""

View file

@ -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 ''

View file

@ -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

View file

@ -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)
"""