2021-02-01 15:13:11 +00:00
|
|
|
|
import re
|
2021-05-15 12:32:43 +00:00
|
|
|
|
import traceback
|
2021-02-01 15:13:11 +00:00
|
|
|
|
|
2021-08-19 12:17:48 +00:00
|
|
|
|
from core.elements import MessageSession, Option, command_prefix
|
2021-07-26 14:33:49 +00:00
|
|
|
|
from core.loader import Modules, ModulesAliases, ModulesRegex
|
2021-07-07 16:00:24 +00:00
|
|
|
|
from core.logger import Logger
|
2021-07-19 16:12:29 +00:00
|
|
|
|
from core.parser.command import CommandParser, InvalidCommandFormatError, InvalidHelpDocTypeError
|
2021-08-07 07:56:48 +00:00
|
|
|
|
from core.utils import remove_ineffective_text, RemoveDuplicateSpace
|
2021-07-11 02:19:40 +00:00
|
|
|
|
from database import BotDBUtil
|
2021-02-01 15:13:11 +00:00
|
|
|
|
|
2021-02-03 14:43:24 +00:00
|
|
|
|
|
2021-07-24 08:59:15 +00:00
|
|
|
|
async def parser(msg: MessageSession):
|
2021-02-03 07:40:17 +00:00
|
|
|
|
"""
|
|
|
|
|
接收消息必经的预处理器
|
2021-07-24 08:59:15 +00:00
|
|
|
|
:param msg: 从监听器接收到的dict,该dict将会经过此预处理器传入下游
|
2021-02-03 07:40:17 +00:00
|
|
|
|
:return: 无返回
|
|
|
|
|
"""
|
2021-07-26 12:43:51 +00:00
|
|
|
|
display = RemoveDuplicateSpace(msg.asDisplay()) # 将消息转换为一般显示形式
|
2021-07-24 08:59:15 +00:00
|
|
|
|
msg.target.senderInfo = senderInfo = BotDBUtil.SenderInfo(msg.target.senderId)
|
2021-08-25 11:45:03 +00:00
|
|
|
|
enabled_modules_list = BotDBUtil.Module(msg).check_target_enabled_module_list()
|
2021-07-15 14:59:32 +00:00
|
|
|
|
if senderInfo.query.isInBlackList and not senderInfo.query.isInWhiteList or len(display) == 0:
|
2021-06-04 13:53:24 +00:00
|
|
|
|
return
|
|
|
|
|
if display[0] in command_prefix: # 检查消息前缀
|
2021-08-25 11:23:59 +00:00
|
|
|
|
Logger.info(display)
|
2021-06-04 13:53:24 +00:00
|
|
|
|
command = re.sub(r'^' + display[0], '', display)
|
2021-06-07 13:49:39 +00:00
|
|
|
|
command_list = remove_ineffective_text(command_prefix, command.split('&&')) # 并行命令处理
|
2021-07-15 14:59:32 +00:00
|
|
|
|
if len(command_list) > 5 and not senderInfo.query.isSuperUser:
|
2021-07-26 12:43:51 +00:00
|
|
|
|
await msg.sendMessage('你不是本机器人的超级管理员,最多只能并排执行5个命令。')
|
2021-07-12 13:31:11 +00:00
|
|
|
|
return
|
2021-06-04 13:53:24 +00:00
|
|
|
|
for command in command_list:
|
2021-06-05 10:25:21 +00:00
|
|
|
|
command_spilt = command.split(' ') # 切割消息
|
2021-06-04 13:53:24 +00:00
|
|
|
|
try:
|
2021-07-24 08:59:15 +00:00
|
|
|
|
msg.trigger_msg = command # 触发该命令的消息,去除消息前缀
|
2021-06-05 10:25:21 +00:00
|
|
|
|
command_first_word = command_spilt[0]
|
2021-07-08 15:52:05 +00:00
|
|
|
|
if command_first_word in ModulesAliases:
|
|
|
|
|
command_spilt[0] = ModulesAliases[command_first_word]
|
2021-06-05 10:25:21 +00:00
|
|
|
|
command = ' '.join(command_spilt)
|
|
|
|
|
command_spilt = command.split(' ')
|
|
|
|
|
command_first_word = command_spilt[0]
|
2021-07-24 08:59:15 +00:00
|
|
|
|
msg.trigger_msg = command
|
2021-07-08 15:52:05 +00:00
|
|
|
|
if command_first_word in Modules: # 检查触发命令是否在模块列表中
|
2021-07-09 09:36:38 +00:00
|
|
|
|
module = Modules[command_first_word]
|
2021-07-27 14:31:45 +00:00
|
|
|
|
if isinstance(module, Option):
|
2021-07-27 16:03:48 +00:00
|
|
|
|
return await msg.sendMessage(module.desc)
|
2021-07-27 14:31:45 +00:00
|
|
|
|
if module.is_regex_function or module.autorun:
|
2021-07-27 16:03:48 +00:00
|
|
|
|
if module.help_doc is not None:
|
2021-07-26 14:33:49 +00:00
|
|
|
|
return await msg.sendMessage(CommandParser(module.help_doc).return_formatted_help_doc())
|
2021-07-27 16:03:48 +00:00
|
|
|
|
elif module.desc is not None:
|
|
|
|
|
return await msg.sendMessage(module.desc)
|
2021-07-27 14:31:45 +00:00
|
|
|
|
if module.need_superuser:
|
2021-07-15 14:59:32 +00:00
|
|
|
|
if not senderInfo.query.isSuperUser:
|
2021-07-26 14:33:49 +00:00
|
|
|
|
return await msg.sendMessage('你没有使用该命令的权限。')
|
2021-08-21 15:58:07 +00:00
|
|
|
|
elif not module.is_base_function:
|
2021-08-25 11:45:03 +00:00
|
|
|
|
if command_first_word not in enabled_modules_list: # 若未开启
|
2021-07-26 14:33:49 +00:00
|
|
|
|
return await msg.sendMessage(f'此模块未启用,请发送~enable {command_first_word}启用本模块。')
|
2021-08-21 15:58:07 +00:00
|
|
|
|
if module.need_admin:
|
|
|
|
|
if not await msg.checkPermission():
|
|
|
|
|
return await msg.sendMessage('此命令仅能被该群组的管理员所使用,请联系管理员执行此命令。')
|
2021-07-19 16:12:29 +00:00
|
|
|
|
help_doc = module.help_doc
|
|
|
|
|
if help_doc is not None:
|
|
|
|
|
try:
|
2021-08-19 12:17:48 +00:00
|
|
|
|
command_parser = CommandParser(help_doc)
|
2021-07-19 16:12:29 +00:00
|
|
|
|
try:
|
2021-08-19 12:17:48 +00:00
|
|
|
|
msg.parsed_msg = command_parser.parse(command)
|
2021-07-19 16:12:29 +00:00
|
|
|
|
except InvalidCommandFormatError:
|
2021-08-19 12:17:48 +00:00
|
|
|
|
return await msg.sendMessage('语法错误。\n' + command_parser.return_formatted_help_doc())
|
2021-07-19 16:12:29 +00:00
|
|
|
|
except InvalidHelpDocTypeError:
|
2021-08-24 06:49:35 +00:00
|
|
|
|
return await msg.sendMessage('此模块的帮助信息有误,请联系开发者处理。\n错误汇报地址:https://github.com/Teahouse-Studios/bot/issues/new?assignees=OasisAkari&labels=bug&template=5678.md&title=')
|
2021-07-26 12:43:51 +00:00
|
|
|
|
async with msg.Typing(msg):
|
2021-07-24 08:59:15 +00:00
|
|
|
|
await Modules[command_first_word].function(msg) # 将dict传入下游模块
|
2021-06-10 05:49:19 +00:00
|
|
|
|
except Exception as e:
|
|
|
|
|
traceback.print_exc()
|
2021-08-24 06:49:35 +00:00
|
|
|
|
await msg.sendMessage('执行命令时发生错误,请报告机器人开发者:\n' + str(e) + '\n错误汇报地址:https://github.com/Teahouse-Studios/bot/issues/new?assignees=OasisAkari&labels=bug&template=5678.md&title=')
|
2021-07-26 14:33:49 +00:00
|
|
|
|
for regex in ModulesRegex: # 遍历正则模块列表
|
2021-08-25 11:45:03 +00:00
|
|
|
|
if regex in enabled_modules_list:
|
2021-07-26 14:33:49 +00:00
|
|
|
|
await ModulesRegex[regex].function(msg) # 将整条dict传入下游正则模块
|