""" Devtools plugin for userbot-only development and admin commands. Provides /sh, /xsh for shell commands and /eval, /e for Python code evaluation. Also triggers if the message starts with 'sh', 'xsh', 'e', or 'eval' (with or without a slash or exclamation mark, and with any capitalization). Restricted to OWNER_ID only. Usable in any chat where the userbot is present. """ import asyncio import re from pyrogram import filters from pyrogram.types import Message from DragMusic import userbot from config import OWNER_ID # Regex filters for command matching (case-insensitive) sh_filter = filters.user(OWNER_ID) & filters.regex(r"^[!/]*x?sh( |$)", re.IGNORECASE) eval_filter = filters.user(OWNER_ID) & filters.regex(r"^[!/]*(e|eval)( |$)", re.IGNORECASE) @userbot.one.on_message(sh_filter) async def shell_command_handler(client, message: Message): print("sh/xsh command received from OWNER_ID") # Debug print parts = message.text.split(None, 1) if len(parts) < 2: await message.reply_text("Usage: sh ") return cmd = parts[1] try: process = await asyncio.create_subprocess_shell( cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, ) stdout, stderr = await process.communicate() output = (stdout + stderr).decode().strip() if not output: output = "No output." # Telegram message limit if len(output) > 4096: for i in range(0, len(output), 4096): await message.reply_text(f"{output[i:i+4096]}") else: await message.reply_text(f"{output}") except Exception as e: await message.reply_text(f"Error: {e}") @userbot.one.on_message(eval_filter) async def eval_handler(client, message: Message): print("eval command received from OWNER_ID") # Debug print parts = message.text.split(None, 1) if len(parts) < 2: await message.reply_text("Usage: eval ") return code = parts[1] try: env = { "client": client, "message": message, "userbot": userbot, "asyncio": asyncio, } exec( f"async def __aexec(client, message):\n" + "\n".join(f" {l}" for l in code.split("\n")), env, ) result = await env["__aexec"](client, message) if result is not None: await message.reply_text(f"{result}") except Exception as e: await message.reply_text(f"Error: {e}") # Add more dev/admin commands below as needed