Files
tg_loader/bot/modules/task_scheduler/monitor.py
2025-12-04 00:12:56 +03:00

85 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Task monitoring
"""
from typing import Tuple
from bot.modules.task_scheduler.queue import task_queue, TaskStatus
import logging
logger = logging.getLogger(__name__)
async def get_task_status(task_id: int) -> dict:
"""
Get task status
Args:
task_id: Task ID
Returns:
Dictionary with task status
"""
task = await task_queue.get_task_by_id(task_id)
if not task:
return {"error": "Task not found"}
return {
"id": task.id,
"user_id": task.user_id,
"task_type": task.task_type,
"status": task.status.value,
"progress": task.progress,
"error_message": task.error_message,
"created_at": task.created_at.isoformat() if task.created_at else None
}
async def get_user_tasks_status(user_id: int) -> list[dict]:
"""
Get status of all user tasks
Args:
user_id: User ID
Returns:
List of user tasks
"""
tasks = await task_queue.get_user_tasks(user_id)
return [await get_task_status(task.id) for task in tasks]
async def cancel_user_task(user_id: int, task_id: int) -> Tuple[bool, str]:
"""
Cancel user task
Args:
user_id: User ID
task_id: Task ID
Returns:
Tuple of (success: bool, message: str)
"""
task = await task_queue.get_task_by_id(task_id)
if not task:
return (False, f"Задача #{task_id} не найдена")
if task.user_id != user_id:
return (False, "Вы можете отменять только свои задачи")
if task.status == TaskStatus.COMPLETED:
return (False, f"Задача #{task_id} уже завершена")
if task.status == TaskStatus.CANCELLED:
return (False, f"Задача #{task_id} уже отменена")
if task.status == TaskStatus.FAILED:
return (False, f"Задача #{task_id} уже завершилась с ошибкой")
success = await task_queue.cancel_task(task_id)
if success:
return (True, f"Задача #{task_id} успешно отменена")
else:
return (False, f"Не удалось отменить задачу #{task_id}. Возможно, она уже завершается.")