Add source
This commit is contained in:
84
bot/modules/task_scheduler/monitor.py
Normal file
84
bot/modules/task_scheduler/monitor.py
Normal file
@@ -0,0 +1,84 @@
|
||||
"""
|
||||
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}. Возможно, она уже завершается.")
|
||||
|
||||
Reference in New Issue
Block a user