From cb741c7b2e3eee7eba4076be0e86e377895ccca9 Mon Sep 17 00:00:00 2001 From: DLmaster361 Date: Sun, 21 Sep 2025 15:11:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=90=8E=E7=AB=AF=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E4=B8=8E=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/core.py | 4 +++- app/api/info.py | 17 ----------------- app/core/config.py | 20 +++++++------------- app/core/task_manager.py | 23 +++++++++++++++++++++-- app/core/timer.py | 38 +++++++++++++++++++++++++++++++++++++- 5 files changed, 68 insertions(+), 34 deletions(-) diff --git a/app/api/core.py b/app/api/core.py index d9384f8..db3d3c2 100644 --- a/app/api/core.py +++ b/app/api/core.py @@ -24,7 +24,7 @@ import time import asyncio from fastapi import APIRouter, WebSocket, WebSocketDisconnect -from app.core import Config, Broadcast +from app.core import Config, Broadcast, TaskManager from app.services import System from app.models.schema import * @@ -44,6 +44,8 @@ async def connect_websocket(websocket: WebSocket): last_ping = time.monotonic() data = {} + await TaskManager.start_startup_queue() + while True: try: diff --git a/app/api/info.py b/app/api/info.py index 54476e3..403cbd9 100644 --- a/app/api/info.py +++ b/app/api/info.py @@ -180,23 +180,6 @@ async def confirm_notice() -> OutBase: # return InfoOut(data=data) -@router.post( - "/startuptask", - summary="获取启动时运行的队列ID", - response_model=InfoOut, - status_code=200, -) -async def get_startup_task() -> InfoOut: - - try: - data = await Config.get_startup_task() - except Exception as e: - return InfoOut( - code=500, status="error", message=f"{type(e).__name__}: {str(e)}", data={} - ) - return InfoOut(data={"queueIdList": data}) - - @router.post( "/webconfig", summary="获取配置分享中心的配置信息", diff --git a/app/core/config.py b/app/core/config.py index 4ed8d10..c580290 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -214,6 +214,13 @@ class QueueConfig(ConfigBase): ), ) + self.Data_LastTimedStart = ConfigItem( + "Data", + "LastTimedStart", + "2000-01-01 00:00", + DateTimeValidator("%Y-%m-%d %H:%M"), + ) + self.TimeSet = MultipleConfig([TimeSet]) self.QueueItem = MultipleConfig([QueueItem]) @@ -1998,19 +2005,6 @@ class AppConfig(GlobalConfig): return remote_web_config - async def get_startup_task(self): - """获取启动时需要运行的队列信息""" - - logger.info("获取启动时需要运行的队列信息") - data = [ - str(uid) - for uid, queue in self.QueueConfig.items() - if queue.get("Info", "StartUpEnabled") - ] - logger.success("启动时需要运行的队列信息获取成功") - - return data - async def save_maa_log(self, log_path: Path, logs: list, maa_result: str) -> bool: """ 保存MAA日志并生成对应统计数据 diff --git a/app/core/task_manager.py b/app/core/task_manager.py index 5a87fde..4f8d7b1 100644 --- a/app/core/task_manager.py +++ b/app/core/task_manager.py @@ -22,7 +22,7 @@ import uuid import asyncio from functools import partial -from typing import Dict, Optional +from typing import Dict, Optional, Literal from .config import Config, MaaConfig, GeneralConfig, QueueConfig from app.models.schema import WebSocketMessage @@ -41,7 +41,9 @@ class _TaskManager: self.task_dict: Dict[uuid.UUID, asyncio.Task] = {} - async def add_task(self, mode: str, uid: str) -> uuid.UUID: + async def add_task( + self, mode: Literal["自动代理", "人工排查", "设置脚本"], uid: str + ) -> uuid.UUID: """ 添加任务 @@ -331,5 +333,22 @@ class _TaskManager: ).model_dump() ) + async def start_startup_queue(self): + """开始运行启动时运行的调度队列""" + + logger.info("开始运行启动时任务") + for uid, queue in Config.QueueConfig.items(): + + if queue.get("Info", "StartUpEnabled") and uid not in self.task_dict: + logger.info(f"启动时需要运行的队列:{uid}") + task_id = await TaskManager.add_task("自动代理", str(uid)) + await Config.send_json( + WebSocketMessage( + id="TaskManager", type="Signal", data={"newTask": str(task_id)} + ).model_dump() + ) + + logger.success("启动时任务开始运行") + TaskManager = _TaskManager() diff --git a/app/core/timer.py b/app/core/timer.py index 975a7db..0f1d338 100644 --- a/app/core/timer.py +++ b/app/core/timer.py @@ -24,7 +24,9 @@ from datetime import datetime from app.services import Matomo, System from app.utils import get_logger -from .config import Config +from app.models.schema import WebSocketMessage +from .config import Config, QueueConfig +from .task_manager import TaskManager logger = get_logger("主业务定时器") @@ -39,6 +41,7 @@ class _MainTimer: while True: await self.set_silence() + await self.timed_start() await asyncio.sleep(1) @@ -69,6 +72,39 @@ class _MainTimer: await asyncio.sleep(3600) + async def timed_start(self): + """定时启动代理任务""" + + curtime = datetime.now().strftime("%Y-%m-%d %H:%M") + + for uid, queue in Config.QueueConfig.items(): + + if not isinstance(queue, QueueConfig) or not queue.get( + "Info", "TimeEnabled" + ): + continue + + # 避免重复调起任务 + if curtime == Config.get("Data", "LastTimeStarted"): + continue + + for time_set in queue.TimeSet.values(): + if ( + time_set.get("Info", "Enabled") + and curtime[11:16] == time_set.get("Info", "Time") + and uid not in Config.task_dict + ): + logger.info(f"定时唤起任务:{uid}") + task_id = await TaskManager.add_task("自动代理", str(uid)) + + await Config.send_json( + WebSocketMessage( + id="TaskManager", + type="Signal", + data={"newTask": str(task_id)}, + ).model_dump() + ) + async def set_silence(self): """静默模式通过模拟老板键来隐藏模拟器窗口"""