From 74d0dcf6c62d71299357eec9a76daea6a99dd0ca Mon Sep 17 00:00:00 2001 From: Who? <155328415+coddrago@users.noreply.github.com> Date: Fri, 13 Sep 2024 22:37:10 +0700 Subject: [PATCH] Added upgraded eval by sqlmerr --- hikka/modules/upgraded_eval.py | 103 +++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 hikka/modules/upgraded_eval.py diff --git a/hikka/modules/upgraded_eval.py b/hikka/modules/upgraded_eval.py new file mode 100644 index 0000000..678d47a --- /dev/null +++ b/hikka/modules/upgraded_eval.py @@ -0,0 +1,103 @@ +import io +import contextlib +import sys +from meval import meval + +import hikkatl +from hikkatl.errors.rpcerrorlist import MessageIdInvalidError + +from .. import loader, utils, main +from ..log import HikkaException + + +# meta banner: https://github.com/sqlmerr/sqlmerr/blob/main/assets/hikka_mods/sqlmerrmodules_upgradedeval.png?raw=true +# meta developer: @sqlmerr_m + +@loader.tds +class UpgradedEval(loader.Module): + """Just eval with customizable text and stdout""" + strings = { + "name": "UpgradedEval", + "_cfg_text_result": "Text for result", + "_cfg_text_error": "Text for error", + "_cfg_mode": "Code run mode. stdout is when print works. return, this is standard .e" + } + + strings_ru = { + "_cfg_text_result": "Текст результата", + "_cfg_text_error": "Текст ошибки", + "_cfg_mode": "Режим запуска кода. stdout, это когда работает print. return, это стандартный .e", + } + + + + def __init__(self): + self.config = loader.ModuleConfig( + loader.ConfigValue( + "text_result", + "🐍 Code:\m
{code}
\n\n✅ Result:\n
{result}
", + lambda: self.strings("_cfg_text_result"), + validator=loader.validators.String() + ), + loader.ConfigValue( + "text_error", + "🐍 Code:\n
{code}
\n\n❌ Error:\n
{error}
", + lambda: self.strings("_cfg_text_error"), + validator=loader.validators.String() + ), + loader.ConfigValue( + "mode", + "stdout", + lambda: self.strings("_cfg_mode"), + validator=loader.validators.Choice(["stdout", "return"]) + ), + ) + + @loader.command(ru_doc="Улучшенный eval") + async def ie(self, message): + """Upgraded eval""" + args = utils.get_args_raw(message) + + try: + if self.config["mode"] == "stdout": + stdout = io.StringIO() + with contextlib.redirect_stdout(stdout): + await meval(utils.escape_html(args), globals(), **await self.lookup("Evaluator").getattrs(message)) + result = stdout.getvalue() + else: + result = await meval(utils.escape_html(args), globals(), **await self.lookup("Evaluator").getattrs(message)) + + except Exception as e: + item = HikkaException.from_exc_info(*sys.exc_info()) + error = self.lookup("Evaluator").censor( + ( + "\n".join(item.full_stack.splitlines()[:-1]) + + "\n\n" + + "🚫 " + + item.full_stack.splitlines()[-1] + ) + ), + + + await utils.answer( + message, + self.config["text_error"].format( + code=utils.escape_html(utils.get_args_raw(message)), + error=error[0] + ), + ) + + return + + if callable(getattr(result, "stringify", None)): + with contextlib.suppress(Exception): + result = str(result.stringify()) + + with contextlib.suppress(MessageIdInvalidError): + await utils.answer( + message, + self.config["text_result"].format( + code=utils.escape_html(args) if args else "None", + result=result if result else "None" + ), + ) \ No newline at end of file