mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-14 13:42:56 +08:00
* ✨ 添加全局优先级hook * ✨ 添加基础配置api * ✨ 添加数据库连接测试 * 💬 提示重启 * 🩹 填充过配置时友好提示 * 🐛 首次生成简易配置后自动加载 * ✨ 添加配置后重启接口 * ✨ 添加重启标志文件 * ✨ 添加重启脚本命令 * ✨ 添加重启系统限制 * ✨ 首次配置判断是否为win系统 * 🔥 移除bat * ✨ 添加关于菜单 * ✨ 支持整合包插件安装和添加整合包文档 * 🩹 检测数据库路径 * 🩹 修改数据库路径检测 * 🩹 修改数据库路径检测 * 🩹 修复路径注入 * 🎨 显示添加优先级 * 🐛 修改PriorityLifecycle字典类名称 * ⚡ 修复路径问题 * ⚡ 修复路径检测 * ✨ 新增路径验证功能,确保用户输入的路径安全并在项目根目录内 * ✨ 优化路径验证功能,增加对非法字符和路径长度的检查,确保用户输入的路径更加安全 * 🚨 auto fix by pre-commit hooks * ✨ 优化获取文件列表的代码格式 * 📝 修改README中webui示例图 * ✨ 更新PriorityLifecycle.on_startup装饰器 * ✨ 简化安装依赖的命令构建逻辑 * 🚨 auto fix by pre-commit hooks --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
166 lines
5.3 KiB
Python
166 lines
5.3 KiB
Python
import nonebot
|
|
from nonebot import get_loaded_plugins
|
|
from nonebot.drivers import Driver
|
|
from nonebot.plugin import Plugin
|
|
from nonebot.utils import is_coroutine_callable
|
|
from nonebot_plugin_apscheduler import scheduler
|
|
|
|
from zhenxun.configs.utils import PluginExtraData, Task
|
|
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 PriorityLifecycle
|
|
|
|
driver: Driver = nonebot.get_driver()
|
|
|
|
|
|
async def _handle_setting(
|
|
plugin: Plugin,
|
|
task_info_list: list[tuple[bool, TaskInfo]],
|
|
task_list: list[Task],
|
|
):
|
|
"""处理插件设置
|
|
|
|
参数:
|
|
plugin: Plugin
|
|
task_info_list: 被动技能db数据列表
|
|
task_list: 被动技能列表
|
|
"""
|
|
metadata = plugin.metadata
|
|
if not metadata:
|
|
return
|
|
extra = metadata.extra
|
|
extra_data = PluginExtraData(**extra)
|
|
if extra_data.tasks:
|
|
task_info_list.extend(
|
|
(
|
|
task.create_status,
|
|
TaskInfo(
|
|
module=task.module,
|
|
name=task.name,
|
|
status=task.status,
|
|
default_status=task.default_status,
|
|
),
|
|
)
|
|
for task in extra_data.tasks
|
|
)
|
|
task_list.extend(extra_data.tasks)
|
|
|
|
|
|
async def update_to_group(create_list: list[tuple[bool, TaskInfo]]):
|
|
"""根据创建时状态对群组进行被动技能更新
|
|
|
|
参数:
|
|
create_list: 被动技能创建列表
|
|
"""
|
|
if blocks := [t[1].module for t in create_list if not t[0]]:
|
|
if group_list := await GroupConsole.all():
|
|
for group in group_list:
|
|
block_tasks = list(
|
|
set(CommonUtils.convert_module_format(group.block_task) + blocks)
|
|
)
|
|
group.block_task = CommonUtils.convert_module_format(block_tasks)
|
|
await GroupConsole.bulk_update(group_list, ["block_task"], 10)
|
|
|
|
|
|
async def to_db(
|
|
load_task: list[str],
|
|
create_list: list[tuple[bool, TaskInfo]],
|
|
update_list: list[TaskInfo],
|
|
):
|
|
"""将被动技能保存至数据库
|
|
|
|
参数:
|
|
load_task: 已加载的被动技能模块
|
|
create_list: 被动技能创建列表
|
|
update_list: 被动技能更新列表
|
|
"""
|
|
if create_list:
|
|
_create_list = [t[1] for t in create_list]
|
|
await TaskInfo.bulk_create(_create_list, 10)
|
|
await update_to_group(create_list)
|
|
if update_list:
|
|
await TaskInfo.bulk_update(
|
|
update_list,
|
|
["run_time", "name"],
|
|
10,
|
|
)
|
|
if load_task:
|
|
await TaskInfo.filter(module__in=load_task).update(load_status=True)
|
|
await TaskInfo.filter(module__not_in=load_task).update(load_status=False)
|
|
|
|
|
|
async def get_run_task(task: Task, *args, **kwargs):
|
|
is_run = False
|
|
if task.check:
|
|
if is_coroutine_callable(task.check):
|
|
if await task.check(*task.check_args):
|
|
is_run = True
|
|
elif task.check(*task.check_args):
|
|
is_run = True
|
|
else:
|
|
bot = task.check_args[0]
|
|
group_id = task.check_args[1]
|
|
if not await CommonUtils.task_is_block(bot, task.module, group_id):
|
|
is_run = True
|
|
if is_run and task.run_func:
|
|
if is_coroutine_callable(task.run_func):
|
|
await task.run_func(*args, **kwargs)
|
|
else:
|
|
task.run_func(*args, **kwargs)
|
|
|
|
|
|
async def create_schedule(task: Task):
|
|
scheduler_model = task.scheduler
|
|
if not scheduler_model or not task.run_func:
|
|
return
|
|
try:
|
|
scheduler.add_job(
|
|
get_run_task,
|
|
scheduler_model.trigger,
|
|
run_date=scheduler_model.run_date,
|
|
hour=scheduler_model.hour,
|
|
minute=scheduler_model.minute,
|
|
second=scheduler_model.second,
|
|
id=scheduler_model.id,
|
|
max_instances=scheduler_model.max_instances,
|
|
args=scheduler_model.args,
|
|
kwargs=scheduler_model.kwargs,
|
|
)
|
|
logger.debug(f"成功动态创建定时任务: {task.name}({task.module})")
|
|
except Exception as e:
|
|
logger.error(f"动态创建定时任务 {task.name}({task.module}) 失败", e=e)
|
|
|
|
|
|
@PriorityLifecycle.on_startup(priority=5)
|
|
async def _():
|
|
"""
|
|
初始化插件数据配置
|
|
"""
|
|
task_list: list[Task] = []
|
|
task_info_list: list[tuple[bool, TaskInfo]] = []
|
|
for plugin in get_loaded_plugins():
|
|
await _handle_setting(plugin, task_info_list, task_list)
|
|
if not task_info_list:
|
|
await TaskInfo.all().update(load_status=False)
|
|
return
|
|
module_dict = {t[1]: t[0] for t in await TaskInfo.all().values_list("id", "module")}
|
|
load_task = []
|
|
create_list = []
|
|
update_list = []
|
|
for status, task in task_info_list:
|
|
if task.module not in module_dict:
|
|
create_list.append((status, task))
|
|
else:
|
|
task.id = module_dict[task.module]
|
|
update_list.append(task)
|
|
load_task.append(task.module)
|
|
await to_db(load_task, create_list, update_list)
|
|
# db_task = await TaskInfo.filter(load_status=True, status=True).values_list(
|
|
# "module", flat=True
|
|
# )
|
|
# task_list = [t for t in task_list if t.module in db_task]
|
|
# for task in task_list:
|
|
# create_schedule(task)
|