tasks.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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, app, app2, eor
  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:
  34. if task_id in tasks:
  35. if not tasks[task_id][0].done():
  36. tasks[task_id][0].cancel()
  37. del tasks[task_id]
  38. @app2.on_message(
  39. filters.user(SUDOERS)
  40. & ~filters.forwarded
  41. & ~filters.via_bot
  42. & filters.command("cancelTask", prefixes=USERBOT_PREFIX)
  43. )
  44. async def task_cancel(_, message: Message):
  45. m = message
  46. if len(message.text.split()) != 2:
  47. return await m.delete()
  48. task_id = int(m.text.split(None, 1)[1])
  49. tasks = all_tasks()
  50. if task_id not in tasks:
  51. return await m.delete()
  52. await rm_task(task_id)
  53. await eor(message, text=f"{arrow(m)} Task cancelled")
  54. async def _get_tasks_text():
  55. await rm_task() # Clean completed tasks
  56. if not tasks:
  57. return f"{arrow('')} No pending task"
  58. text = bold("Tasks") + "\n"
  59. for i, task in enumerate(list(tasks.items())):
  60. indent = w * 4
  61. t, started = task[1]
  62. elapsed = round(time() - started)
  63. info = t._repr_info()
  64. id = task[0]
  65. text += section(
  66. f"{indent}Task {i}",
  67. body={
  68. "Name": t.get_name(),
  69. "Task ID": id,
  70. "Status": info[0].capitalize(),
  71. "Origin": info[2].split("/")[-1].replace(">", ""),
  72. "Running since": f"{elapsed}s",
  73. },
  74. indent=8,
  75. )
  76. return text
  77. @app2.on_message(
  78. filters.user(SUDOERS)
  79. & ~filters.forwarded
  80. & ~filters.via_bot
  81. & filters.command("lsTasks", prefixes=USERBOT_PREFIX)
  82. )
  83. async def task_list(_, message: Message):
  84. if message.from_user.is_self:
  85. await message.delete()
  86. results = await app2.get_inline_bot_results(
  87. BOT_ID,
  88. f"tasks",
  89. )
  90. await app2.send_inline_bot_result(
  91. message.chat.id,
  92. results.query_id,
  93. results.results[0].id,
  94. hide_via=True,
  95. )