mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-18 10:40:03 +08:00
✨ feat(core): 增强定时任务与群组标签管理,重构调度核心
✨ 新功能 * **标签 (tags)**: 引入群组标签服务。 * 支持静态标签和动态标签 (基于 Alconna 规则自动匹配群信息)。 * 支持黑名单模式及 `@all` 特殊标签。 * 提供 `tag_manage` 超级用户插件 (list, create, edit, delete 等)。 * 群成员变动时自动失效动态标签缓存。 * **调度 (scheduler)**: 增强定时任务。 * 重构 `ScheduledJob` 模型,支持 `TAG`, `ALL_GROUPS` 等多种目标类型。 * 新增任务别名 (`name`)、创建者、权限、来源等字段。 * 支持一次性任务 (`schedule_once`) 和 Alconna 命令行参数 (`--params-cli`)。 * 新增执行选项 (`jitter`, `spread`) 和并发策略 (`ALLOW`, `SKIP`, `QUEUE`)。 * 支持批量获取任务状态。 ♻️ 重构优化 * **调度器核心**: * 拆分 `service.py` 为 `manager.py` (API) 和 `types.py` (模型)。 * 合并 `adapter.py` / `job.py` 至 `engine.py` (统一调度引擎)。 * 引入 `targeting.py` 模块管理任务目标解析。 * **调度器插件 (scheduler_admin)**: * 迁移命令参数校验逻辑至 `ArparmaBehavior`。 * 引入 `dependencies.py` 和 `data_source.py` 解耦业务逻辑与依赖注入。 * 适配新的任务目标类型展示。
This commit is contained in:
@@ -64,9 +64,9 @@ class ScheduleRepository:
|
||||
async def get_by_plugin_and_group(
|
||||
plugin_name: str, group_ids: list[str]
|
||||
) -> list[ScheduledJob]:
|
||||
"""根据插件和群组ID列表获取任务"""
|
||||
"""[DEPRECATED] 根据插件和群组ID列表获取任务"""
|
||||
return await ScheduledJob.filter(
|
||||
plugin_name=plugin_name, group_id__in=group_ids
|
||||
plugin_name=plugin_name, target_descriptor__in=group_ids
|
||||
).all()
|
||||
|
||||
@staticmethod
|
||||
@@ -77,20 +77,30 @@ class ScheduleRepository:
|
||||
return await ScheduledJob.update_or_create(defaults=defaults, **kwargs)
|
||||
|
||||
@staticmethod
|
||||
async def query_schedules(**filters: Any) -> list[ScheduledJob]:
|
||||
async def query_schedules(
|
||||
page: int | None = None, page_size: int | None = None, **filters: Any
|
||||
) -> tuple[list[ScheduledJob], int]:
|
||||
"""
|
||||
根据任意条件查询任务列表
|
||||
|
||||
参数:
|
||||
page: 页码(从1开始)
|
||||
page_size: 每页数量
|
||||
**filters: 过滤条件,如 group_id="123", plugin_name="abc"
|
||||
|
||||
返回:
|
||||
list[ScheduledJob]: 任务列表
|
||||
tuple[list[ScheduledJob], int]: (任务列表, 总数)
|
||||
"""
|
||||
cleaned_filters = {k: v for k, v in filters.items() if v is not None}
|
||||
if not cleaned_filters:
|
||||
return await ScheduledJob.all()
|
||||
return await ScheduledJob.filter(**cleaned_filters).all()
|
||||
query = ScheduledJob.filter(**cleaned_filters)
|
||||
|
||||
total_count = await query.count()
|
||||
|
||||
if page is not None and page_size is not None:
|
||||
offset = (page - 1) * page_size
|
||||
query = query.offset(offset).limit(page_size)
|
||||
|
||||
return await query.all(), total_count
|
||||
|
||||
@staticmethod
|
||||
def filter(**kwargs: Any) -> QuerySet[ScheduledJob]:
|
||||
|
||||
Reference in New Issue
Block a user