tasks.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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 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. @app2.on_message(
  55. filters.user(SUDOERS)
  56. & ~filters.forwarded
  57. & ~filters.via_bot
  58. & filters.command("lsTasks", prefixes=USERBOT_PREFIX)
  59. )
  60. async def task_list(_, message: Message):
  61. await rm_task() # Clean completed tasks
  62. tasks = all_tasks()
  63. if not tasks:
  64. return await eor(
  65. message,
  66. text=f"{arrow(message)} No tasks pending",
  67. )
  68. text = bold("Tasks") + "\n"
  69. for i, task in enumerate(list(tasks.items())):
  70. indent = w * 4
  71. t, started = task[1]
  72. elapsed = round(time() - started)
  73. info = t._repr_info()
  74. id = task[0]
  75. text += section(
  76. f"{indent}Task {i}",
  77. body={
  78. "Name": t.get_name(),
  79. "Task ID": id,
  80. "Status": info[0].capitalize(),
  81. "Origin": info[2].split("/")[-1].replace(">", ""),
  82. "Running since": f"{elapsed}s",
  83. },
  84. indent=6,
  85. )
  86. await eor(message, text=text)