PagerMaid-Modify/pagermaid/listener.py

105 lines
4.0 KiB
Python
Raw Normal View History

""" PagerMaid event listener. """
import sys
from telethon import events
from telethon.errors import MessageTooLongError
from distutils2.util import strtobool
from traceback import format_exc
from time import gmtime, strftime, time
from telethon.events import StopPropagation
from pagermaid import bot, config, help_messages
from pagermaid.utils import attach_log
def noop(*args, **kw):
pass
def listener(**args):
""" Register an event listener. """
command = args.get('command', None)
description = args.get('description', None)
parameters = args.get('parameters', None)
pattern = args.get('pattern', None)
diagnostics = args.get('diagnostics', True)
ignore_edited = args.get('ignore_edited', False)
is_plugin = args.get('is_plugin', True)
if command is not None:
if command in help_messages:
raise ValueError(f"出错了呜呜呜 ~ 命令 \"{command}\" 已经被注册。")
pattern = fr"^-{command}(?: |$)([\s\S]*)"
if pattern is not None and not pattern.startswith('(?i)'):
args['pattern'] = f"(?i){pattern}"
else:
args['pattern'] = pattern
if 'ignore_edited' in args:
del args['ignore_edited']
if 'command' in args:
del args['command']
if 'diagnostics' in args:
del args['diagnostics']
if 'description' in args:
del args['description']
if 'parameters' in args:
del args['parameters']
if 'is_plugin' in args:
del args['is_plugin']
def decorator(function):
async def handler(context):
try:
try:
parameter = context.pattern_match.group(1).split(' ')
if parameter == ['']:
parameter = []
context.parameter = parameter
context.arguments = context.pattern_match.group(1)
except BaseException:
context.parameter = None
context.arguments = None
await function(context)
except StopPropagation:
raise StopPropagation
except MessageTooLongError:
await context.edit("出错了呜呜呜 ~ 生成的输出太长,无法显示。")
except BaseException:
exc_info = sys.exc_info()[1]
exc_format = format_exc()
try:
await context.edit("出错了呜呜呜 ~ 执行此命令时发生错误。")
except BaseException:
pass
if not diagnostics:
return
2020-04-06 06:16:23 +00:00
if strtobool(config['error_report']):
report = f"# Generated: {strftime('%H:%M %d/%m/%Y', gmtime())}. \n" \
f"# ChatID: {str(context.chat_id)}. \n" \
f"# UserID: {str(context.sender_id)}. \n" \
f"# Message: \n-----BEGIN TARGET MESSAGE-----\n" \
f"{context.text}\n-----END TARGET MESSAGE-----\n" \
f"# Traceback: \n-----BEGIN TRACEBACK-----\n" \
f"{str(exc_format)}\n-----END TRACEBACK-----\n" \
f"# Error: \"{str(exc_info)}\". \n"
2020-08-09 09:14:16 +00:00
await attach_log(report, -1001441461877, f"exception.{time()}.pagermaid", None,
2020-04-06 06:16:23 +00:00
"Error report generated.")
if not ignore_edited:
bot.add_event_handler(handler, events.MessageEdited(**args))
bot.add_event_handler(handler, events.NewMessage(**args))
return handler
if not is_plugin and 'disabled_cmd' in config:
if config['disabled_cmd'].count(command) != 0:
return noop
if description is not None and command is not None:
if parameters is None:
parameters = ""
help_messages.update({
2020-04-02 15:13:22 +00:00
f"{command}": f"**使用方法:** `-{command} {parameters}`\
\n{description}"
})
return decorator