import asyncio import inspect from pyrogram.enums import ParseMode from app import BOT, Config, Message from app.utils import shell async def run_cmd(bot: BOT, message: Message) -> Message | None: cmd: str = message.input.strip() reply: Message = await message.reply("executing...") try: proc_stdout: str = await asyncio.create_task( shell.run_shell_cmd(cmd), name=reply.task_id ) except asyncio.exceptions.CancelledError: return await reply.edit("`Cancelled...`") output: str = f"
~${cmd}\n\n{proc_stdout}"
return await reply.edit(output, name="sh.txt", disable_web_page_preview=True)
# Shell with Live Output
async def live_shell(bot: BOT, message: Message):
cmd: str = message.input.strip()
reply: Message = await message.reply("`getting live output....`")
sub_process: shell.AsyncShell = await shell.AsyncShell.run_cmd(cmd)
sleep_for: int = 1
output: str = ""
try:
async for stdout in sub_process.get_output():
if output != stdout:
await reply.edit(
text=f"```shell\n{stdout}```",
disable_web_page_preview=True,
parse_mode=ParseMode.MARKDOWN,
)
output = stdout
if sleep_for >= 6:
sleep_for = 2
await asyncio.create_task(asyncio.sleep(sleep_for), name=reply.task_id)
sleep_for += 2
await reply.edit(
text=f"~${cmd}\n\n{sub_process.full_std}",
name="shell.txt",
disable_web_page_preview=True,
)
except asyncio.exceptions.CancelledError:
sub_process.cancel()
await reply.edit(f"`Cancelled....`")
if Config.DEV_MODE:
Config.CMD_DICT["shell"] = Config.CMD(
cmd="shell",
func=live_shell,
path=inspect.stack()[0][1],
sudo=False,
)
Config.CMD_DICT["sh"] = Config.CMD(
cmd="sh",
func=run_cmd,
path=inspect.stack()[0][1],
sudo=False,
)