85 lines
2.3 KiB
Python
85 lines
2.3 KiB
Python
"""
|
||
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}. Возможно, она уже завершается.")
|
||
|