userbot.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  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. return await func(
  46. **{k: v for k, v in kwargs.items() if k in spec}
  47. )
  48. @app2.on_message(
  49. filters.user(SUDOERS)
  50. & ~filters.forwarded
  51. & ~filters.via_bot
  52. & ~filters.edited
  53. & filters.command("py", prefixes=USERBOT_PREFIX)
  54. )
  55. async def executor(client, message: Message):
  56. global m, p, r
  57. try:
  58. cmd = message.text.split(" ", maxsplit=1)[1]
  59. except IndexError:
  60. return await message.delete()
  61. m = message
  62. p = print
  63. if m.reply_to_message:
  64. r = m.reply_to_message
  65. if r.reply_markup:
  66. if isinstance(r.reply_markup, ReplyKeyboardMarkup):
  67. return await m.edit("INSECURE!")
  68. old_stderr = sys.stderr
  69. old_stdout = sys.stdout
  70. redirected_output = sys.stdout = StringIO()
  71. redirected_error = sys.stderr = StringIO()
  72. stdout, stderr, exc = None, None, None
  73. try:
  74. await aexec(cmd, client, message)
  75. except Exception:
  76. exc = traceback.format_exc()
  77. stdout = redirected_output.getvalue()
  78. stderr = redirected_error.getvalue()
  79. sys.stdout = old_stdout
  80. sys.stderr = old_stderr
  81. evaluation = ""
  82. if exc:
  83. evaluation = exc
  84. elif stderr:
  85. evaluation = stderr
  86. elif stdout:
  87. evaluation = stdout
  88. else:
  89. evaluation = "Success"
  90. final_output = f"**INPUT:**\n```{escape(cmd)}```\n\n**OUTPUT**:\n```{escape(evaluation.strip())}```"
  91. if len(final_output) > 4096:
  92. filename = "output.txt"
  93. with open(filename, "w+", encoding="utf8") as out_file:
  94. out_file.write(str(evaluation.strip()))
  95. await message.reply_document(
  96. document=filename,
  97. caption=f"**INPUT:**\n`{escape(cmd[0:980])}`\n\n**OUTPUT:**\n`Attached Document`",
  98. quote=False,
  99. )
  100. await message.delete()
  101. os.remove(filename)
  102. else:
  103. await edit_or_reply(message, text=final_output)
  104. @app2.on_message(
  105. filters.user(SUDOERS)
  106. & ~filters.forwarded
  107. & ~filters.via_bot
  108. & ~filters.edited
  109. & filters.command("sh", prefixes=USERBOT_PREFIX),
  110. )
  111. async def shellrunner(client, message: Message):
  112. if len(message.command) < 2:
  113. return await edit_or_reply(
  114. message, text="**Usage:**\n/sh git pull"
  115. )
  116. if message.reply_to_message:
  117. r = message.reply_to_message
  118. if r.reply_markup:
  119. if isinstance(r.reply_markup, ReplyKeyboardMarkup):
  120. return await message.edit("INSECURE!")
  121. text = message.text.split(None, 1)[1]
  122. if "\n" in text:
  123. code = text.split("\n")
  124. output = ""
  125. for x in code:
  126. shell = re.split(
  127. """ (?=(?:[^'"]|'[^']*'|"[^"]*")*$)""", x
  128. )
  129. try:
  130. process = subprocess.Popen(
  131. shell,
  132. stdout=subprocess.PIPE,
  133. stderr=subprocess.PIPE,
  134. )
  135. except Exception as err:
  136. print(err)
  137. await edit_or_reply(
  138. message,
  139. text=f"**INPUT:**\n```{escape(text)}```\n\n**ERROR:**\n```{escape(err)}```",
  140. )
  141. output += f"**{code}**\n"
  142. output += process.stdout.read()[:-1].decode("utf-8")
  143. output += "\n"
  144. else:
  145. shell = re.split(""" (?=(?:[^'"]|'[^']*'|"[^"]*")*$)""", text)
  146. for a in range(len(shell)):
  147. shell[a] = shell[a].replace('"', "")
  148. try:
  149. process = subprocess.Popen(
  150. shell,
  151. stdout=subprocess.PIPE,
  152. stderr=subprocess.PIPE,
  153. )
  154. except Exception as err:
  155. print(err)
  156. exc_type, exc_obj, exc_tb = sys.exc_info()
  157. errors = traceback.format_exception(
  158. etype=exc_type,
  159. value=exc_obj,
  160. tb=exc_tb,
  161. )
  162. return await edit_or_reply(
  163. message,
  164. text=f"**INPUT:**\n```{escape(text)}```\n\n**ERROR:**\n```{''.join(errors)}```",
  165. )
  166. output = process.stdout.read()[:-1].decode("utf-8")
  167. if str(output) == "\n":
  168. output = None
  169. if output:
  170. if len(output) > 4096:
  171. with open("output.txt", "w+") as file:
  172. file.write(output)
  173. await app2.send_document(
  174. message.chat.id,
  175. "output.txt",
  176. reply_to_message_id=message.message_id,
  177. caption=escape(text),
  178. )
  179. return os.remove("output.txt")
  180. await edit_or_reply(
  181. message,
  182. text=f"**INPUT:**\n```{escape(text)}```\n\n**OUTPUT:**\n```{escape(output)}```",
  183. )
  184. else:
  185. await edit_or_reply(
  186. message,
  187. text=f"**INPUT:**\n```{escape(text)}```\n\n**OUTPUT: **\n`No output`",
  188. )
  189. def shell(cmd: list) -> tuple:
  190. proc = subprocess.run(
  191. cmd,
  192. stdout=subprocess.PIPE,
  193. stderr=subprocess.PIPE,
  194. )
  195. stdout, stderr = proc.stdout, proc.stderr
  196. stdout = stdout.decode() if stdout else None
  197. stderr = stderr.decode() if stderr else None
  198. return stdout, stderr
  199. """ C and CPP Eval """
  200. async def sendFile(message: Message, text: str):
  201. file = "output.txt"
  202. async with aiofiles.open(file, mode="w+") as f:
  203. await f.write(text)
  204. await message.reply_document(file)
  205. os.remove(file)
  206. @app2.on_message(
  207. filters.command(["c", "cpp"], prefixes=USERBOT_PREFIX)
  208. & ~filters.edited
  209. & ~filters.via_bot
  210. & filters.user(SUDOERS)
  211. )
  212. async def c_cpp_eval(_, message: Message):
  213. if len(message.command) < 2:
  214. return await message.edit("Write Some Code..")
  215. if message.reply_to_message:
  216. r = message.reply_to_message
  217. if r.reply_markup:
  218. if isinstance(r.reply_markup, ReplyKeyboardMarkup):
  219. return await message.edit("INSECURE!")
  220. code = message.text.split(None, 1)[1]
  221. file = "exec.c"
  222. compiler = "g++"
  223. out_file = "exec"
  224. cmdCompile = [compiler, "-g", file, "-o", out_file]
  225. cmdRun = [f"./{out_file}"]
  226. async with aiofiles.open(file, mode="w+") as f:
  227. await f.write(code)
  228. out, err = shell(cmdCompile)
  229. os.remove(file)
  230. if err:
  231. text = f"**INPUT:**\n```{escape(code)}```\n\n**COMPILE-TIME ERROR:**```{escape(err)}```"
  232. if len(text) > 4090:
  233. return await sendFile(message, text)
  234. return await edit_or_reply(message, text=text)
  235. out, err = shell(cmdRun)
  236. os.remove(out_file)
  237. err = f"**RUNTIME ERROR:**\n```{escape(err)}```" if err else None
  238. out = f"**OUTPUT:**\n```{escape(out)}```" if out else None
  239. text = (
  240. f"**INPUT:**\n```{escape(code)}```\n\n{out if out else err}"
  241. )
  242. if len(text) > 4090:
  243. return await sendFile(message, text)
  244. await edit_or_reply(message, text=text)
  245. @app2.on_message(
  246. filters.command("go", prefixes=USERBOT_PREFIX)
  247. & ~filters.edited
  248. & ~filters.via_bot
  249. & filters.user(SUDOERS)
  250. )
  251. async def goval(_, message: Message):
  252. if len(message.command) < 2:
  253. return await message.edit("Write Some Code...")
  254. if message.reply_to_message:
  255. r = message.reply_to_message
  256. if r.reply_markup:
  257. if isinstance(r.reply_markup, ReplyKeyboardMarkup):
  258. return await message.edit("INSECURE!")
  259. code = message.text.split(None, 1)[1]
  260. file = "main.go"
  261. cmdRun = ["go", "run", file]
  262. async with aiofiles.open(file, mode="w+") as f:
  263. await f.write(code)
  264. stdout, stderr = shell(cmdRun)
  265. os.remove(file)
  266. out = stdout or stderr or None
  267. out = f"**OUTPUT:**\n```{escape(out)}```"
  268. text = f"**INPUT:**\n```{escape(code)}```\n\n{out}"
  269. if len(text) > 4090:
  270. return await sendFile(message, text)
  271. await edit_or_reply(message, text=text)