添加全局优先级hook

This commit is contained in:
HibiKier 2025-03-10 00:38:28 +08:00
parent f1d32bff89
commit 94ed4cd067
19 changed files with 121 additions and 30 deletions

4
bot.py
View File

@ -14,9 +14,9 @@ driver.register_adapter(OneBotV11Adapter)
# driver.register_adapter(DoDoAdapter)
# driver.register_adapter(DiscordAdapter)
from zhenxun.services.db_context import disconnect, init
from zhenxun.services.db_context import disconnect
driver.on_startup(init)
# driver.on_startup(init)
driver.on_shutdown(disconnect)
# nonebot.load_builtin_plugins("echo")

View File

@ -16,6 +16,7 @@ from zhenxun.models.sign_user import SignUser
from zhenxun.models.user_console import UserConsole
from zhenxun.services.log import logger
from zhenxun.utils.decorator.shop import shop_register
from zhenxun.utils.manager.priority_manager import HookPriorityManager
from zhenxun.utils.manager.resource_manager import ResourceManager
from zhenxun.utils.platform import PlatformUtils
@ -70,7 +71,7 @@ from public.bag_users t1
"""
@driver.on_startup
@HookPriorityManager.on_startup()
async def _():
await ResourceManager.init_resources()
"""签到与用户的数据迁移"""

View File

@ -14,6 +14,7 @@ from zhenxun.services.log import logger
from zhenxun.utils._build_image import BuildImage
from zhenxun.utils._image_template import ImageTemplate
from zhenxun.utils.http_utils import AsyncHttpx
from zhenxun.utils.manager.priority_manager import HookPriorityManager
from zhenxun.utils.platform import PlatformUtils
BASE_PATH = DATA_PATH / "welcome_message"
@ -87,7 +88,7 @@ def migrate(path: Path):
json.dump(new_data, f, ensure_ascii=False, indent=4)
@driver.on_startup
@HookPriorityManager.on_startup()
def _():
"""数据迁移

View File

@ -11,6 +11,7 @@ from zhenxun.configs.config import Config
from zhenxun.configs.path_config import DATA_PATH
from zhenxun.configs.utils import RegisterConfig
from zhenxun.services.log import logger
from zhenxun.utils.manager.priority_manager import HookPriorityManager
_yaml = YAML(pure=True)
_yaml.allow_unicode = True
@ -102,7 +103,7 @@ def _generate_simple_config(exists_module: list[str]):
temp_file.unlink()
@driver.on_startup
@HookPriorityManager.on_startup()
def _():
"""
初始化插件数据配置

View File

@ -20,6 +20,7 @@ from zhenxun.utils.enum import (
PluginLimitType,
PluginType,
)
from zhenxun.utils.manager.priority_manager import HookPriorityManager
from .manager import manager
@ -95,7 +96,7 @@ async def _handle_setting(
)
@driver.on_startup
@HookPriorityManager.on_startup()
async def _():
"""
初始化插件数据配置

View File

@ -10,6 +10,7 @@ from zhenxun.models.group_console import GroupConsole
from zhenxun.models.task_info import TaskInfo
from zhenxun.services.log import logger
from zhenxun.utils.common_utils import CommonUtils
from zhenxun.utils.manager.priority_manager import HookPriorityManager
driver: Driver = nonebot.get_driver()
@ -132,7 +133,7 @@ async def create_schedule(task: Task):
logger.error(f"动态创建定时任务 {task.name}({task.module}) 失败", e=e)
@driver.on_startup
@HookPriorityManager.on_startup()
async def _():
"""
初始化插件数据配置

View File

@ -10,11 +10,12 @@ from zhenxun.configs.path_config import TEXT_PATH
from zhenxun.models.group_console import GroupConsole
from zhenxun.services.log import logger
from zhenxun.utils.http_utils import AsyncHttpx
from zhenxun.utils.manager.priority_manager import HookPriorityManager
driver: Driver = nonebot.get_driver()
@driver.on_startup
@HookPriorityManager.on_startup()
async def update_city():
"""
部分插件需要中国省份城市
@ -61,7 +62,7 @@ async def _():
await update_city()
@driver.on_startup
@HookPriorityManager.on_startup()
async def _():
"""开启/禁用插件格式修改"""
_, is_create = await GroupConsole.get_or_create(group_id=133133133)

View File

@ -10,7 +10,6 @@ from nonebot_plugin_alconna import (
store_true,
)
from nonebot_plugin_apscheduler import scheduler
from nonebot_plugin_uninfo import Uninfo
from zhenxun.configs.utils import (
Command,
@ -23,7 +22,7 @@ from zhenxun.utils.depends import UserName
from zhenxun.utils.message import MessageUtils
from ._data_source import SignManage
from .goods_register import driver # noqa: F401
from .goods_register import Uninfo
from .utils import clear_sign_data_pic
__plugin_meta__ = PluginMetadata(

View File

@ -1,7 +1,6 @@
from decimal import Decimal
import nonebot
from nonebot.drivers import Driver
from nonebot_plugin_uninfo import Uninfo
from zhenxun.models.sign_user import SignUser
@ -9,14 +8,7 @@ from zhenxun.models.user_console import UserConsole
from zhenxun.utils.decorator.shop import shop_register
from zhenxun.utils.platform import PlatformUtils
driver: Driver = nonebot.get_driver()
# @driver.on_startup
# async def _():
# """
# 导入内置的三个商品
# """
driver = nonebot.get_driver()
@shop_register(

View File

@ -16,6 +16,7 @@ from zhenxun.models.sign_log import SignLog
from zhenxun.models.sign_user import SignUser
from zhenxun.utils.http_utils import AsyncHttpx
from zhenxun.utils.image_utils import BuildImage
from zhenxun.utils.manager.priority_manager import HookPriorityManager
from zhenxun.utils.platform import PlatformUtils
from .config import (
@ -54,7 +55,7 @@ LG_MESSAGE = [
]
@driver.on_startup
@HookPriorityManager.on_startup()
async def init_image():
SIGN_RESOURCE_PATH.mkdir(parents=True, exist_ok=True)
SIGN_TODAY_CARD_PATH.mkdir(exist_ok=True, parents=True)

View File

@ -10,6 +10,7 @@ from zhenxun.configs.config import Config as gConfig
from zhenxun.configs.utils import PluginExtraData, RegisterConfig
from zhenxun.services.log import logger, logger_
from zhenxun.utils.enum import PluginType
from zhenxun.utils.manager.priority_manager import HookPriorityManager
from .api.logs import router as ws_log_routes
from .api.logs.log_manager import LOG_STORAGE
@ -91,7 +92,7 @@ WsApiRouter.include_router(status_routes)
WsApiRouter.include_router(chat_routes)
@driver.on_startup
@HookPriorityManager.on_startup()
async def _():
try:

View File

@ -13,6 +13,7 @@ from zhenxun.models.bot_connect_log import BotConnectLog
from zhenxun.models.chat_history import ChatHistory
from zhenxun.models.statistics import Statistics
from zhenxun.services.log import logger
from zhenxun.utils.manager.priority_manager import HookPriorityManager
from zhenxun.utils.platform import PlatformUtils
from ....base_model import BaseResultModel, QueryModel
@ -31,7 +32,7 @@ driver: Driver = nonebot.get_driver()
CONNECT_TIME = 0
@driver.on_startup
@HookPriorityManager.on_startup()
async def _():
global CONNECT_TIME
CONNECT_TIME = int(time.time())

View File

@ -8,6 +8,7 @@ from zhenxun.configs.config import BotConfig
from zhenxun.models.plugin_info import PluginInfo
from zhenxun.models.task_info import TaskInfo
from zhenxun.services.log import logger
from zhenxun.utils.manager.priority_manager import HookPriorityManager
from ....base_model import BaseResultModel, QueryModel, Result
from ....utils import authentication
@ -21,7 +22,7 @@ router = APIRouter(prefix="/database")
driver: Driver = nonebot.get_driver()
@driver.on_startup
@HookPriorityManager.on_startup()
async def _():
for plugin in nonebot.get_loaded_plugins():
module = plugin.name

View File

@ -1,9 +1,12 @@
import nonebot
from nonebot.utils import is_coroutine_callable
from tortoise import Tortoise
from tortoise.connection import connections
from tortoise.models import Model as Model_
from zhenxun.configs.config import BotConfig
from zhenxun.utils.exception import HookPriorityException
from zhenxun.utils.manager.priority_manager import HookPriorityManager
from .log import logger
@ -11,6 +14,9 @@ SCRIPT_METHOD = []
MODELS: list[str] = []
driver = nonebot.get_driver()
class Model(Model_):
"""
自动添加模块
@ -26,7 +32,7 @@ class Model(Model_):
SCRIPT_METHOD.append((cls.__module__, func))
class DbUrlIsNode(Exception):
class DbUrlIsNode(HookPriorityException):
"""
数据库链接地址为空
"""
@ -42,9 +48,18 @@ class DbConnectError(Exception):
pass
@HookPriorityManager.on_startup(1)
async def init():
if not BotConfig.db_url:
raise DbUrlIsNode("数据库配置为空,请在.env.dev中配置DB_URL...")
# raise DbUrlIsNode("数据库配置为空,请在.env.dev中配置DB_URL...")
error = f"""
***********************************************************************
**********************************配置为空******************************
请打开WebUi进行基础配置配置地址http://{driver.config.host}:{driver.config.port}
***********************************************************************
***********************************************************************
"""
raise DbUrlIsNode("\n" + error.strip())
try:
await Tortoise.init(
db_url=BotConfig.db_url,

View File

@ -6,6 +6,7 @@ from nonebot.utils import is_coroutine_callable
from pydantic import BaseModel
from zhenxun.services.log import logger
from zhenxun.utils.manager.priority_manager import HookPriorityManager
driver = nonebot.get_driver()
@ -100,6 +101,6 @@ class PluginInitManager:
logger.error(f"执行: {module_path}:remove 失败", e=e)
@driver.on_startup
@HookPriorityManager.on_startup()
async def _():
await PluginInitManager.install_all()

View File

@ -1,6 +1,13 @@
from strenum import StrEnum
class HookPriorityType(StrEnum):
STARTUP = "STARTUP"
"""启动"""
SHUTDOWN = "SHUTDOWN"
"""关闭"""
class GoldHandle(StrEnum):
"""
金币处理

View File

@ -1,3 +1,15 @@
class HookPriorityException(BaseException):
"""
钩子优先级异常
"""
def __init__(self, info: str = "") -> None:
self.info = info
def __str__(self) -> str:
return self.info
class NotFoundError(Exception):
"""
未发现

View File

@ -22,6 +22,4 @@ class MessageManager:
@classmethod
def get(cls, uid: str) -> list[str]:
if uid in cls.data:
return cls.data[uid]
return []
return cls.data[uid] if uid in cls.data else []

View File

@ -0,0 +1,57 @@
from collections.abc import Callable
from typing import ClassVar
import nonebot
from nonebot.utils import is_coroutine_callable
from zhenxun.services.log import logger
from zhenxun.utils.enum import HookPriorityType
from zhenxun.utils.exception import HookPriorityException
driver = nonebot.get_driver()
class HookPriorityManager:
_data: ClassVar[dict[HookPriorityType, dict[int, list[Callable]]]] = {}
@classmethod
def add(cls, hook_type: HookPriorityType, func: Callable, priority: int = 5):
if hook_type not in cls._data:
cls._data[hook_type] = {}
if priority not in cls._data[hook_type]:
cls._data[hook_type][priority] = []
cls._data[hook_type][priority].append(func)
@classmethod
def on_startup(cls, priority: int = 5):
def wrapper(func):
cls.add(HookPriorityType.STARTUP, func, priority)
return func
return wrapper
@classmethod
def on_shutdown(cls, priority: int = 5):
def wrapper(func):
cls.add(HookPriorityType.SHUTDOWN, func, priority)
return func
return wrapper
@driver.on_startup
async def _():
priority_data = HookPriorityManager._data.get(HookPriorityType.STARTUP)
if not priority_data:
return
priority_list = sorted(priority_data.keys())
priority = 0
try:
for priority in priority_list:
for func in priority_data[priority]:
if is_coroutine_callable(func):
await func()
else:
func()
except HookPriorityException as e:
logger.error(f"打断优先级 [{priority}] on_startup 方法. {type(e)}: {e}")