userbot.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. """
  2. CREDITS:
  3. EVAL AND SH FUNCTION IN THIS MODULE 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 inspect import getfullargspec
  14. from io import StringIO
  15. import aiofiles
  16. from pyrogram import filters
  17. from pyrogram.types import Message, ReplyKeyboardMarkup
  18. from wbb import app # don't remove
  19. from wbb import SUDOERS, USERBOT_PREFIX, app2, arq
  20. from wbb.core.decorators.misc import exec_time
  21. __MODULE__ = "Userbot"
  22. __HELP__ = """
  23. .alive - Send Alive Message.
  24. .py - Execute Python Code.
  25. .sh - Execute Shell Code.
  26. .approve | .disapprove - Approve Or Disapprove A User To PM You.
  27. .block | .unblock - Block Or Unblock A User.
  28. .create (b|s|c) Name - create [basic|super]group & channel
  29. """
  30. # Eval and Sh module from nana-remix
  31. m = None
  32. p = print
  33. r = None
  34. exec_time = exec_time
  35. arq = arq
  36. async def aexec(code, client, message):
  37. exec(
  38. "async def __aexec(client, message): "
  39. + "".join(f"\n {a}" for a in code.split("\n"))
  40. )
  41. return await locals()["__aexec"](client, message)
  42. async def edit_or_reply(msg: Message, **kwargs):
  43. func = msg.edit_text if msg.from_user.is_self else msg.reply
  44. spec = getfullargspec(func.__wrapped__).args
  45. await func(**{k: v for k, v in kwargs.items() if k in spec})
  46. @app2.on_message(
  47. filters.user(SUDOERS)
  48. & ~filters.forwarded
  49. & ~filters.via_bot
  50. & ~filters.edited
  51. & filters.command("py", 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. m = message
  60. p = print
  61. if m.reply_to_message:
  62. r = m.reply_to_message
  63. if r.reply_markup:
  64. if isinstance(r.reply_markup, ReplyKeyboardMarkup):
  65. return await m.edit("INSECURE!")
  66. old_stderr = sys.stderr
  67. old_stdout = sys.stdout
  68. redirected_output = sys.stdout = StringIO()
  69. redirected_error = sys.stderr = StringIO()
  70. stdout, stderr, exc = None, None, None
  71. try:
  72. await aexec(cmd, client, message)
  73. except Exception:
  74. exc = traceback.format_exc()
  75. stdout = redirected_output.getvalue()
  76. stderr = redirected_error.getvalue()
  77. sys.stdout = old_stdout
  78. sys.stderr = old_stderr
  79. evaluation = ""
  80. if exc:
  81. evaluation = exc
  82. elif stderr:
  83. evaluation = stderr
  84. elif stdout:
  85. evaluation = stdout
  86. else:
  87. evaluation = "Success"
  88. final_output = f"**INPUT:**\n```{escape(cmd)}```\n\n**OUTPUT**:\n```{escape(evaluation.strip())}```"
  89. if len(final_output) > 4096:
  90. filename = "output.txt"
  91. with open(filename, "w+", encoding="utf8") as out_file:
  92. out_file.write(str(evaluation.strip()))
  93. await message.reply_document(
  94. document=filename,
  95. caption=f"**INPUT:**\n`{escape(cmd[0:980])}`\n\n**OUTPUT:**\n`Attached Document`",
  96. quote=False,
  97. )
  98. await message.delete()
  99. os.remove(filename)
  100. else:
  101. await edit_or_reply(message, text=final_output)
  102. @app2.on_message(
  103. filters.user(SUDOERS)
  104. & ~filters.forwarded
  105. & ~filters.via_bot
  106. & ~filters.edited
  107. & filters.command("sh", prefixes=USERBOT_PREFIX),
  108. )
  109. async def shellrunner(client, message: Message):
  110. if len(message.command) < 2:
  111. return await edit_or_reply(
  112. message, text="**Usage:**\n/sh git pull"
  113. )
  114. if message.reply_to_message:
  115. r = message.reply_to_message
  116. if r.reply_markup:
  117. if isinstance(r.reply_markup, ReplyKeyboardMarkup):
  118. return await message.edit("INSECURE!")
  119. text = message.text.split(None, 1)[1]
  120. if "\n" in text:
  121. code = text.split("\n")
  122. output = ""
  123. for x in code:
  124. shell = re.split(
  125. """ (?=(?:[^'"]|'[^']*'|"[^"]*")*$)""", x
  126. )
  127. try:
  128. process = subprocess.Popen(
  129. shell,
  130. stdout=subprocess.PIPE,
  131. stderr=subprocess.PIPE,
  132. )
  133. except Exception as err:
  134. print(err)
  135. await edit_or_reply(
  136. message,
  137. text=f"**INPUT:**\n```{escape(text)}```\n\n**ERROR:**\n```{escape(err)}```",
  138. )
  139. output += f"**{code}**\n"
  140. output += process.stdout.read()[:-1].decode("utf-8")
  141. output += "\n"
  142. else:
  143. shell = re.split(""" (?=(?:[^'"]|'[^']*'|"[^"]*")*$)""", text)
  144. for a in range(len(shell)):
  145. shell[a] = shell[a].replace('"', "")
  146. try:
  147. process = subprocess.Popen(
  148. shell,
  149. stdout=subprocess.PIPE,
  150. stderr=subprocess.PIPE,
  151. )
  152. except Exception as err:
  153. print(err)
  154. exc_type, exc_obj, exc_tb = sys.exc_info()
  155. errors = traceback.format_exception(
  156. etype=exc_type,
  157. value=exc_obj,
  158. tb=exc_tb,
  159. )
  160. return await edit_or_reply(
  161. message,
  162. text=f"**INPUT:**\n```{escape(text)}```\n\n**ERROR:**\n```{''.join(errors)}```",
  163. )
  164. output = process.stdout.read()[:-1].decode("utf-8")
  165. if str(output) == "\n":
  166. output = None
  167. if output:
  168. if len(output) > 4096:
  169. with open("output.txt", "w+") as file:
  170. file.write(output)
  171. await app2.send_document(
  172. message.chat.id,
  173. "output.txt",
  174. reply_to_message_id=message.message_id,
  175. caption=escape(text),
  176. )
  177. return os.remove("output.txt")
  178. await edit_or_reply(
  179. message,
  180. text=f"**INPUT:**\n```{escape(text)}```\n\n**OUTPUT:**\n```{escape(output)}```",
  181. )
  182. else:
  183. await edit_or_reply(
  184. message,
  185. text=f"**INPUT:**\n```{escape(text)}```\n\n**OUTPUT: **\n`No output`",
  186. )
  187. def shell(cmd: list) -> tuple:
  188. proc = subprocess.run(
  189. cmd,
  190. stdout=subprocess.PIPE,
  191. stderr=subprocess.PIPE,
  192. )
  193. stdout, stderr = proc.stdout, proc.stderr
  194. stdout = stdout.decode() if stdout else None
  195. stderr = stderr.decode() if stderr else None
  196. return stdout, stderr
  197. """ C and CPP Eval """
  198. async def sendFile(message: Message, text: str):
  199. file = "output.txt"
  200. async with aiofiles.open(file, mode="w+") as f:
  201. await f.write(text)
  202. await message.reply_document(file)
  203. os.remove(file)
  204. @app2.on_message(
  205. filters.command(["c", "cpp"], prefixes=USERBOT_PREFIX)
  206. & ~filters.edited
  207. & ~filters.via_bot
  208. & filters.user(SUDOERS)
  209. )
  210. async def c_cpp_eval(_, message: Message):
  211. if len(message.command) < 2:
  212. return await message.edit("Write Some Code..")
  213. if message.reply_to_message:
  214. r = message.reply_to_message
  215. if r.reply_markup:
  216. if isinstance(r.reply_markup, ReplyKeyboardMarkup):
  217. return await message.edit("INSECURE!")
  218. code = message.text.split(None, 1)[1]
  219. file = "exec.c"
  220. compiler = "g++"
  221. out_file = "exec"
  222. cmdCompile = [compiler, "-g", file, "-o", out_file]
  223. cmdRun = [f"./{out_file}"]
  224. async with aiofiles.open(file, mode="w+") as f:
  225. await f.write(code)
  226. out, err = shell(cmdCompile)
  227. os.remove(file)
  228. if err:
  229. text = f"**INPUT:**\n```{escape(code)}```\n\n**COMPILE-TIME ERROR:**```{escape(err)}```"
  230. if len(text) > 4090:
  231. return await sendFile(message, text)
  232. return await edit_or_reply(message, text=text)
  233. out, err = shell(cmdRun)
  234. os.remove(out_file)
  235. err = f"**RUNTIME ERROR:**\n```{escape(err)}```" if err else None
  236. out = f"**OUTPUT:**\n```{escape(out)}```" if out else None
  237. text = (
  238. f"**INPUT:**\n```{escape(code)}```\n\n{out if out else err}"
  239. )
  240. if len(text) > 4090:
  241. return await sendFile(message, text)
  242. await edit_or_reply(message, text=text)
  243. @app2.on_message(
  244. filters.command("go", prefixes=USERBOT_PREFIX)
  245. & ~filters.edited
  246. & ~filters.via_bot
  247. & filters.user(SUDOERS)
  248. )
  249. async def goval(_, message: Message):
  250. if len(message.command) < 2:
  251. return await message.edit("Write Some Code...")
  252. if message.reply_to_message:
  253. r = message.reply_to_message
  254. if r.reply_markup:
  255. if isinstance(r.reply_markup, ReplyKeyboardMarkup):
  256. return await message.edit("INSECURE!")
  257. code = message.text.split(None, 1)[1]
  258. file = "main.go"
  259. cmdRun = ["go", "run", file]
  260. async with aiofiles.open(file, mode="w+") as f:
  261. await f.write(code)
  262. stdout, stderr = shell(cmdRun)
  263. os.remove(file)
  264. out = stdout or stderr or None
  265. out = f"**OUTPUT:**\n```{escape(out)}```"
  266. text = f"**INPUT:**\n```{escape(code)}```\n\n{out}"
  267. if len(text) > 4090:
  268. return await sendFile(message, text)
  269. await edit_or_reply(message, text=text)