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