tasks.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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 SUDOERS, USERBOT_PREFIX, app2, eor
  6. from wbb.core.sections import bold, section, w
  7. tasks = {}
  8. TASKS_LOCK = Lock()
  9. arrow = lambda x: x.text + "\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:
  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. r = m.reply_to_message
  47. if len(m.text.split()) == 2:
  48. mid = int(m.text.split(None, 1)[1])
  49. else:
  50. mid = r.message_id if r else None
  51. tasks = all_tasks()
  52. if not mid or not tasks:
  53. return await m.delete()
  54. if mid not in tasks:
  55. return await m.delete()
  56. await rm_task(mid)
  57. await eor(message, text=f"{arrow(m)} Task cancelled")
  58. @app2.on_message(
  59. filters.user(SUDOERS)
  60. & ~filters.forwarded
  61. & ~filters.via_bot
  62. & filters.command("lsTasks", prefixes=USERBOT_PREFIX)
  63. )
  64. async def task_list(_, message: Message):
  65. await rm_task() # Clean completed tasks
  66. tasks = all_tasks()
  67. if not tasks:
  68. return await eor(
  69. message,
  70. text=f"{arrow(message)} No tasks pending",
  71. )
  72. text = bold("Tasks") + "\n"
  73. for i, task in enumerate(list(tasks.items())):
  74. indent = w * 4
  75. t, started = task[1]
  76. elapsed = round(time() - started)
  77. info = t._repr_info()
  78. id = task[0]
  79. text += section(
  80. f"{indent}Task {i}",
  81. body={
  82. "Name": t.get_name(),
  83. "Task ID": id,
  84. "Status": info[0].capitalize(),
  85. "Origin": info[2].split("/")[-1].replace(">", ""),
  86. "Running since": f"{elapsed}s",
  87. },
  88. indent=6,
  89. )
  90. await eor(message, text=text)