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:\n
{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",
),
)