2022-06-27 13:42:24 +00:00
|
|
|
import asyncio
|
2022-08-01 16:04:45 +00:00
|
|
|
import sys
|
2022-06-27 13:42:24 +00:00
|
|
|
|
2022-07-05 06:56:00 +00:00
|
|
|
from pyrogram import StopPropagation
|
|
|
|
|
|
|
|
from pagermaid import hook_functions, logs
|
2022-07-24 06:47:13 +00:00
|
|
|
from pagermaid.inject import inject
|
2022-07-05 06:56:00 +00:00
|
|
|
from pagermaid.single_utils 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):
|
2022-07-05 06:56:00 +00:00
|
|
|
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):
|
2022-07-05 06:56:00 +00:00
|
|
|
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
|
|
|
|
|
2022-07-05 06:56:00 +00:00
|
|
|
@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}")
|
2022-07-05 06:56:00 +00:00
|
|
|
|
|
|
|
@staticmethod
|
2024-04-29 14:05:03 +00:00
|
|
|
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:
|
2024-04-29 14:05:03 +00:00
|
|
|
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:
|
2022-07-05 06:56:00 +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"[command_pre]: {type(exception)}: {exception}")
|
2022-07-05 06:56:00 +00:00
|
|
|
|
|
|
|
@staticmethod
|
2024-04-29 14:05:03 +00:00
|
|
|
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:
|
2024-04-29 14:05:03 +00:00
|
|
|
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:
|
2022-07-05 06:56:00 +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"[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
|
|
|
|
):
|
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}")
|