userbot.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. """
  2. CREDITS:
  3. MOST OF THE CODE IN THIS FILE IS WRITTEN BY @Pokurt.
  4. SOURCE:
  5. https://github.com/pokurt/Nana-Remix/blob/master/nana/plugins/devs.py
  6. """
  7. import os
  8. import re
  9. import subprocess
  10. import sys
  11. import traceback
  12. from html import escape
  13. from io import StringIO
  14. from pyrogram import filters
  15. from pyrogram.errors import MessageNotModified
  16. from pyrogram.types import Message, ReplyKeyboardMarkup
  17. from wbb import app2 # don't remove
  18. from wbb import SUDOERS, USERBOT_PREFIX, eor
  19. from wbb.core.tasks import add_task, rm_task
  20. # Eval and Sh module from nana-remix
  21. m = None
  22. p = print
  23. r = None
  24. arrow = lambda x: (x.text if isinstance(x, Message) else "") + "\n`→`"
  25. async def aexec(code, client, message):
  26. exec(
  27. "async def __aexec(client, message): "
  28. + "".join(f"\n {a}" for a in code.split("\n"))
  29. )
  30. return await locals()["__aexec"](client, message)
  31. async def iter_edit(message: Message, text: str):
  32. async for m in app2.get_chat_history(message.chat.id):
  33. # If no replies found, reply
  34. if m.id == message.id:
  35. return 0
  36. if not m.from_user or not m.text or not m.reply_to_message:
  37. continue
  38. if (
  39. (m.reply_to_message.id == message.id)
  40. and (m.from_user.id == message.from_user.id)
  41. and ("→" in m.text)
  42. ):
  43. try:
  44. return await m.edit(text)
  45. except MessageNotModified:
  46. return
  47. @app2.on_message(
  48. SUDOERS
  49. & ~filters.forwarded
  50. & ~filters.via_bot
  51. & filters.command("eval", prefixes=USERBOT_PREFIX)
  52. )
  53. async def executor(client, message: Message):
  54. global m, p, r
  55. try:
  56. cmd = message.text.split(" ", maxsplit=1)[1]
  57. except IndexError:
  58. return await message.delete()
  59. if message.chat.type == ChatType.CHANNEL:
  60. return
  61. m = message
  62. p = print
  63. # To prevent keyboard input attacks
  64. if m.reply_to_message:
  65. r = m.reply_to_message
  66. if r.reply_markup and isinstance(r.reply_markup, ReplyKeyboardMarkup):
  67. return await eor(m, text="INSECURE!")
  68. status = None
  69. old_stderr = sys.stderr
  70. old_stdout = sys.stdout
  71. redirected_output = sys.stdout = StringIO()
  72. redirected_error = sys.stderr = StringIO()
  73. stdout, stderr, exc = None, None, None
  74. try:
  75. task, task_id = await add_task(
  76. aexec,
  77. "Eval",
  78. cmd,
  79. client,
  80. m,
  81. )
  82. text = f"{arrow('')} Pending Task `{task_id}`"
  83. if not message.edit_date:
  84. status = await m.reply(text, quote=True)
  85. await task
  86. except Exception as e:
  87. e = traceback.format_exc()
  88. print(e)
  89. exc = e.splitlines()[-1]
  90. await rm_task()
  91. stdout = redirected_output.getvalue()
  92. stderr = redirected_error.getvalue()
  93. sys.stdout = old_stdout
  94. sys.stderr = old_stderr
  95. evaluation = ""
  96. if exc:
  97. evaluation = exc
  98. elif stderr:
  99. evaluation = stderr
  100. elif stdout:
  101. evaluation = stdout
  102. else:
  103. evaluation = "Success"
  104. final_output = f"**→**\n`{escape(evaluation.strip())}`"
  105. if len(final_output) > 4096:
  106. filename = "output.txt"
  107. with open(filename, "w+", encoding="utf8") as out_file:
  108. out_file.write(str(evaluation.strip()))
  109. await message.reply_document(
  110. document=filename,
  111. caption="`→`\n **Attached Document**",
  112. quote=False,
  113. )
  114. os.remove(filename)
  115. if status:
  116. await status.delete()
  117. return
  118. # Edit the output if input is edited
  119. if message.edit_date:
  120. status_ = await iter_edit(message, final_output)
  121. if status_ == 0:
  122. return await message.reply(final_output, quote=True)
  123. return
  124. if not status.from_user:
  125. status = await app2.get_messages(status.chat.id, status.id)
  126. await eor(status, text=final_output, quote=True)
  127. @app2.on_message(
  128. SUDOERS
  129. & ~filters.forwarded
  130. & ~filters.via_bot
  131. & filters.command("sh", prefixes=USERBOT_PREFIX),
  132. )
  133. async def shellrunner(_, message: Message):
  134. if len(message.command) < 2:
  135. return await eor(message, text="**Usage:**\n/sh git pull")
  136. if message.reply_to_message:
  137. r = message.reply_to_message
  138. if r.reply_markup and isinstance(
  139. r.reply_markup,
  140. ReplyKeyboardMarkup,
  141. ):
  142. return await eor(message, text="INSECURE!")
  143. text = message.text.split(None, 1)[1]
  144. if "\n" in text:
  145. code = text.split("\n")
  146. output = ""
  147. for x in code:
  148. shell = re.split(""" (?=(?:[^'"]|'[^']*'|"[^"]*")*$)""", x)
  149. try:
  150. process = subprocess.Popen(
  151. shell,
  152. stdout=subprocess.PIPE,
  153. stderr=subprocess.PIPE,
  154. )
  155. except Exception as err:
  156. print(err)
  157. await eor(
  158. message,
  159. text=f"**INPUT:**\n```{escape(text)}```\n\n**ERROR:**\n```{escape(err)}```",
  160. )
  161. output += f"**{code}**\n"
  162. output += process.stdout.read()[:-1].decode("utf-8")
  163. output += "\n"
  164. else:
  165. shell = re.split(""" (?=(?:[^'"]|'[^']*'|"[^"]*")*$)""", text)
  166. for a, _ in enumerate(shell):
  167. shell[a] = shell[a].replace('"', "")
  168. try:
  169. process = subprocess.Popen(
  170. shell,
  171. stdout=subprocess.PIPE,
  172. stderr=subprocess.PIPE,
  173. )
  174. except Exception as err:
  175. print(err)
  176. errors = traceback.format_exc()
  177. return await eor(
  178. message,
  179. text=f"**INPUT:**\n```{escape(text)}```\n\n**ERROR:**\n```{''.join(errors)}```",
  180. )
  181. output = process.stdout.read()[:-1].decode("utf-8")
  182. if str(output) == "\n":
  183. output = None
  184. if output:
  185. if len(output) > 4096:
  186. with open("output.txt", "w+") as file:
  187. file.write(output)
  188. await app2.send_document(
  189. message.chat.id,
  190. "output.txt",
  191. reply_to_message_id=message.id,
  192. caption=escape(text),
  193. )
  194. return os.remove("output.txt")
  195. await eor(
  196. message,
  197. text=f"**INPUT:**\n```{escape(text)}```\n\n**OUTPUT:**\n```{escape(output)}```",
  198. )
  199. else:
  200. await eor(
  201. message,
  202. text=f"**INPUT:**\n```{escape(text)}```\n\n**OUTPUT: **\n`No output`",
  203. )
  204. @app2.on_message(SUDOERS & filters.command("reserve", prefixes=USERBOT_PREFIX))
  205. async def reserve_channel_handler(_, message: Message):
  206. if len(message.text.split()) != 2:
  207. return await eor(message, text="Pass a username as argument!!")
  208. username = message.text.split(None, 1)[1].strip().replace("@", "")
  209. m = await eor(message, text="Reserving...")
  210. chat = await app2.create_channel(username, "Created by .reserve command")
  211. try:
  212. await app2.update_chat_username(chat.id, username)
  213. except Exception as e:
  214. await m.edit(f"Couldn't Reserve, Error: `{str(e)}`")
  215. return await app2.delete_channel(chat.id)
  216. await m.edit(f"Reserved @{username} Successfully")