PagerMaid-Pyro/pagermaid/modules/system.py

133 lines
3.8 KiB
Python
Raw Normal View History

2024-02-05 13:16:25 +00:00
import html
import sys
2023-06-18 03:13:16 +00:00
from getpass import getuser
2022-08-02 04:57:08 +00:00
from os.path import exists, sep
2022-05-23 12:40:30 +00:00
from platform import node
2024-02-05 13:16:25 +00:00
from time import perf_counter
2022-05-23 12:40:30 +00:00
2024-02-05 13:16:25 +00:00
from pagermaid.common.system import run_eval, paste_pb
from pagermaid.config import Config
2022-08-02 04:57:08 +00:00
from pagermaid.enums import Message
2023-06-18 03:13:16 +00:00
from pagermaid.listener import listener
from pagermaid.utils import execute, lang
from pagermaid.utils.bot_utils import attach_log, upload_attachment
2022-05-23 12:40:30 +00:00
2024-02-05 13:16:25 +00:00
code_result = (
f"<b>{lang('eval_code')}</b>\n"
'<pre language="{}">{}</pre>\n\n'
f'<b>{lang("eval_result")}</b>\n'
"{}\n"
f"<b>{lang('eval_time')}</b>"
)
2022-05-23 12:40:30 +00:00
2023-03-12 03:56:01 +00:00
@listener(
is_plugin=False,
command="sh",
need_admin=True,
description=lang("sh_des"),
parameters=lang("sh_parameters"),
)
2022-06-20 13:55:14 +00:00
async def sh(message: Message):
2023-03-12 03:56:01 +00:00
"""Use the command-line from Telegram."""
2022-05-23 12:40:30 +00:00
user = getuser()
2022-06-08 03:18:21 +00:00
command = message.arguments
2022-05-23 12:40:30 +00:00
hostname = node()
if not command:
2023-03-12 03:56:01 +00:00
await message.edit(lang("arg_error"))
2022-05-23 12:40:30 +00:00
return
2024-02-05 13:16:25 +00:00
message = await message.edit(f"`{user}`@{hostname} ~\n> `$` {command}")
2022-05-23 12:40:30 +00:00
result = await execute(command)
if result:
2024-02-05 13:16:25 +00:00
final_result = None
if len(result) > 3072:
if Config.USE_PB:
url = await paste_pb(result)
if url:
final_result = html.escape(f"{url}/bash")
else:
final_result = f"<code>{html.escape(result)}</code>"
if (len(result) > 3072 and not Config.USE_PB) or final_result is None:
2022-07-08 14:26:36 +00:00
await attach_log(result, message.chat.id, "output.log", message.id)
2022-05-23 12:40:30 +00:00
return
2024-02-05 13:16:25 +00:00
await message.edit(f"`{user}`@{hostname} ~\n> `#` {command}\n\n{final_result}")
2022-05-23 12:40:30 +00:00
else:
return
2023-03-12 03:56:01 +00:00
@listener(
is_plugin=False, command="restart", need_admin=True, description=lang("restart_des")
)
2022-06-20 13:55:14 +00:00
async def restart(message: Message):
2023-03-12 03:56:01 +00:00
"""To re-execute PagerMaid."""
2022-05-23 12:40:30 +00:00
if not message.text[0].isalpha():
2023-03-12 03:56:01 +00:00
await message.edit(lang("restart_log"))
sys.exit(0)
2022-05-23 12:40:30 +00:00
2023-03-12 03:56:01 +00:00
@listener(
is_plugin=False,
command="eval",
need_admin=True,
description=lang("eval_des"),
parameters=lang("eval_parameters"),
)
2022-06-20 13:55:14 +00:00
async def sh_eval(message: Message):
2023-03-12 03:56:01 +00:00
"""Run python commands from Telegram."""
dev_mode = exists(f"data{sep}dev")
2022-05-23 12:40:30 +00:00
try:
if not dev_mode:
raise AssertionError
2022-05-23 12:40:30 +00:00
cmd = message.text.split(" ", maxsplit=1)[1]
except (IndexError, AssertionError):
2023-03-12 03:56:01 +00:00
return await message.edit(lang("eval_need_dev"))
2024-02-05 13:16:25 +00:00
message = await message.edit_text(f"<b>{lang('eval_executing')}</b>")
start_time = perf_counter()
2023-01-31 16:24:56 +00:00
final_output = await run_eval(cmd, message)
2024-02-05 13:16:25 +00:00
stop_time = perf_counter()
result = None
if len(final_output) > 3072:
if Config.USE_PB:
url = await paste_pb(final_output)
if url:
result = html.escape(f"{url}/python")
2022-05-23 12:40:30 +00:00
else:
2024-02-05 13:16:25 +00:00
result = f"<code>{html.escape(final_output)}</code>"
text = code_result.format(
"python",
html.escape(cmd),
result if result else "...",
round(stop_time - start_time, 5),
)
await message.edit(text)
if (len(final_output) > 3072 and not Config.USE_PB) or result is None:
await attach_log(final_output, message.chat.id, "output.log", message.id)
2022-05-23 12:40:30 +00:00
2023-03-12 03:56:01 +00:00
@listener(
is_plugin=False,
command="send_log",
need_admin=True,
description=lang("send_log_des"),
)
2022-08-02 04:57:08 +00:00
async def send_log(message: Message):
2023-03-12 03:56:01 +00:00
"""Send log to a chat."""
if not exists("data/pagermaid.log.txt"):
2022-08-02 04:57:08 +00:00
return await message.edit(lang("send_log_not_found"))
2023-03-12 03:56:01 +00:00
await upload_attachment(
"data/pagermaid.log.txt",
2023-03-12 03:56:01 +00:00
message.chat.id,
2024-02-04 07:33:01 +00:00
message.reply_to_message_id,
message_thread_id=message.message_thread_id,
2023-03-12 03:56:01 +00:00
thumb=f"pagermaid{sep}assets{sep}logo.jpg",
caption=lang("send_log_caption"),
)
2022-08-02 04:57:08 +00:00
await message.safe_delete()