PagerMaid-Pyro/pagermaid/hook.py

194 lines
5.6 KiB
Python
Raw Permalink Normal View History

2022-06-27 13:42:24 +00:00
import asyncio
2022-08-01 16:04:45 +00:00
import sys
from typing import TYPE_CHECKING
2022-06-27 13:42:24 +00:00
from pyrogram import StopPropagation
from pagermaid.inject import inject
from pagermaid.static import hook_functions
from pagermaid.utils import logs
if TYPE_CHECKING:
from pagermaid.enums import Message
2022-06-27 13:42:24 +00:00
class Hook:
@staticmethod
def on_startup():
"""
注册一个启动钩子
"""
2023-03-12 03:56:01 +00:00
2022-06-27 13:42:24 +00:00
def decorator(function):
hook_functions["startup"].add(function)
2022-06-27 13:42:24 +00:00
return function
2023-03-12 03:56:01 +00:00
2022-06-27 13:42:24 +00:00
return decorator
@staticmethod
def on_shutdown():
"""
注册一个关闭钩子
"""
2023-03-12 03:56:01 +00:00
2022-06-27 13:42:24 +00:00
def decorator(function):
hook_functions["shutdown"].add(function)
2022-06-27 13:42:24 +00:00
return function
2023-03-12 03:56:01 +00:00
2022-06-27 13:42:24 +00:00
return decorator
@staticmethod
def command_preprocessor():
"""
注册一个命令预处理钩子
"""
def decorator(function):
hook_functions["command_pre"].add(function)
return function
return decorator
@staticmethod
def command_postprocessor():
"""
注册一个命令后处理钩子
"""
def decorator(function):
hook_functions["command_post"].add(function)
return function
return decorator
2022-07-08 14:26:36 +00:00
@staticmethod
def process_error():
"""
注册一个错误处理钩子
"""
def decorator(function):
hook_functions["process_error"].add(function)
return function
return decorator
2022-11-14 14:11:27 +00:00
@staticmethod
def load_success():
"""
注册一个插件加载完成钩子
"""
def decorator(function):
hook_functions["load_plugins_finished"].add(function)
return function
return decorator
2022-06-27 13:42:24 +00:00
@staticmethod
async def startup():
2023-03-12 03:56:01 +00:00
if cors := [
startup(**inject(None, startup)) for startup in hook_functions["startup"]
]: # noqa
2022-06-27 13:42:24 +00:00
try:
await asyncio.gather(*cors)
except Exception as exception:
logs.info(f"[startup]: {type(exception)}: {exception}")
@staticmethod
async def shutdown():
2023-03-12 03:56:01 +00:00
if cors := [
shutdown(**inject(None, shutdown))
for shutdown in hook_functions["shutdown"]
]: # noqa
2022-06-27 13:42:24 +00:00
try:
await asyncio.gather(*cors)
except Exception as exception:
logs.info(f"[shutdown]: {type(exception)}: {exception}")
@staticmethod
async def command_pre(message: "Message", command, sub_command):
2022-08-01 16:04:45 +00:00
cors = []
try:
for pre in hook_functions["command_pre"]:
try:
data = inject(
message, pre, command=command, sub_command=sub_command
)
2022-08-01 16:04:45 +00:00
except Exception as exception:
logs.info(f"[process_error]: {type(exception)}: {exception}")
continue
cors.append(pre(**data)) # noqa
if cors:
await asyncio.gather(*cors)
2022-08-01 16:04:45 +00:00
except SystemExit:
await Hook.shutdown()
sys.exit(0)
except StopPropagation as e:
raise StopPropagation from e
except Exception as exception:
logs.info(f"[command_pre]: {type(exception)}: {exception}")
@staticmethod
async def command_post(message: "Message", command, sub_command):
2022-08-01 16:04:45 +00:00
cors = []
try:
for post in hook_functions["command_post"]:
try:
data = inject(
message, post, command=command, sub_command=sub_command
)
2022-08-01 16:04:45 +00:00
except Exception as exception:
logs.info(f"[process_error]: {type(exception)}: {exception}")
continue
cors.append(post(**data)) # noqa
if cors:
await asyncio.gather(*cors)
2022-08-01 16:04:45 +00:00
except SystemExit:
await Hook.shutdown()
sys.exit(0)
except StopPropagation as e:
raise StopPropagation from e
except Exception as exception:
logs.info(f"[command_post]: {type(exception)}: {exception}")
2022-07-08 14:26:36 +00:00
@staticmethod
2023-03-12 03:56:01 +00:00
async def process_error_exec(
message: "Message", command, exc_info: BaseException, exc_format: str
2023-03-12 03:56:01 +00:00
):
2022-08-01 16:04:45 +00:00
cors = []
try:
for error in hook_functions["process_error"]:
try:
2023-03-12 03:56:01 +00:00
data = inject(
message,
error,
command=command,
exc_info=exc_info,
exc_format=exc_format,
)
2022-08-01 16:04:45 +00:00
except Exception as exception:
logs.info(f"[process_error]: {type(exception)}: {exception}")
continue
cors.append(error(**data)) # noqa
if cors:
2022-07-08 14:26:36 +00:00
await asyncio.gather(*cors)
2022-08-01 16:04:45 +00:00
except SystemExit:
await Hook.shutdown()
sys.exit(0)
except StopPropagation as e:
raise StopPropagation from e
except Exception as exception:
logs.info(f"[process_error]: {type(exception)}: {exception}")
2022-11-14 14:11:27 +00:00
@staticmethod
async def load_success_exec():
2023-03-12 03:56:01 +00:00
if cors := [
load(**inject(None, load))
for load in hook_functions["load_plugins_finished"]
]: # noqa
2022-11-14 14:11:27 +00:00
try:
await asyncio.gather(*cors)
except Exception as exception:
logs.info(f"[load_success_exec]: {type(exception)}: {exception}")