tasks.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. from asyncio import Lock, create_task
  2. from time import time
  3. from pyrogram import filters
  4. from pyrogram.types import Message
  5. from wbb import BOT_ID, SUDOERS, USERBOT_PREFIX, app2
  6. from wbb.core.sections import bold, section, w
  7. tasks = {}
  8. TASKS_LOCK = Lock()
  9. arrow = lambda x: (x.text if x else "") + "\n`→`"
  10. def all_tasks():
  11. return tasks
  12. async def add_task(
  13. taskFunc,
  14. task_name,
  15. *args,
  16. **kwargs,
  17. ):
  18. async with TASKS_LOCK:
  19. global tasks
  20. task_id = (list(tasks.keys())[-1] + 1) if tasks else 0
  21. task = create_task(
  22. taskFunc(*args, **kwargs),
  23. name=task_name,
  24. )
  25. tasks[task_id] = task, int(time())
  26. return task, task_id
  27. async def rm_task(task_id=None):
  28. global tasks
  29. async with TASKS_LOCK:
  30. for key, value in list(tasks.items()):
  31. if value[0].done() or value[0].cancelled():
  32. del tasks[key]
  33. if (task_id is not None) and (task_id in tasks):
  34. task = tasks[task_id][0]
  35. if not task.done():
  36. task.cancel()
  37. del tasks[task_id]
  38. async def _get_tasks_text():
  39. await rm_task() # Clean completed tasks
  40. if not tasks:
  41. return f"{arrow('')} No pending task"
  42. text = bold("Tasks") + "\n"
  43. for i, task in enumerate(list(tasks.items())):
  44. indent = w * 4
  45. t, started = task[1]
  46. elapsed = round(time() - started)
  47. info = t._repr_info()
  48. id = task[0]
  49. text += section(
  50. f"{indent}Task {i}",
  51. body={
  52. "Name": t.get_name(),
  53. "Task ID": id,
  54. "Status": info[0].capitalize(),
  55. "Origin": info[2].split("/")[-1].replace(">", ""),
  56. "Running since": f"{elapsed}s",
  57. },
  58. indent=8,
  59. )
  60. return text
  61. @app2.on_message(
  62. SUDOERS
  63. & ~filters.forwarded
  64. & ~filters.via_bot
  65. & filters.command("lsTasks", prefixes=USERBOT_PREFIX)
  66. )
  67. async def task_list(_, message: Message):
  68. if message.from_user.is_self:
  69. await message.delete()
  70. results = await app2.get_inline_bot_results(
  71. BOT_ID,
  72. "tasks",
  73. )
  74. await app2.send_inline_bot_result(
  75. message.chat.id,
  76. results.query_id,
  77. results.results[0].id,
  78. )