From d7b5132289f88f63b1b98173d069b6dc52480a49 Mon Sep 17 00:00:00 2001 From: IAmTomahawkx Date: Tue, 25 Jul 2023 12:35:35 -0700 Subject: [PATCH] Add implicit returns to evals where last statement is an expr --- modules/eval.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/modules/eval.py b/modules/eval.py index 8315315..e12f80b 100644 --- a/modules/eval.py +++ b/modules/eval.py @@ -22,8 +22,10 @@ """ from __future__ import annotations +import ast import logging import textwrap +import traceback from discord.ext import commands @@ -56,7 +58,24 @@ def __init__(self, bot: core.Bot, endpoint_url: str) -> None: self.eval_endpoint: str = endpoint_url async def perform_eval(self, code: core.Codeblock) -> str: - formatted = CODE.format(user_code=textwrap.indent(code.content.replace("\t", " "), " ")) + source = code.content + + try: + parsed = ast.parse(source, filename="") + except SyntaxError as e: + return "".join(traceback.format_exception(type(e), e, e.__traceback__)) + + if isinstance(parsed.body[-1], ast.Expr): + expr: ast.Expr = parsed.body[-1] + + lineno = expr.lineno - 1 + + co_mangled = source.splitlines() + co_mangled[lineno] = "return " + co_mangled[lineno] + + source = "\n".join(co_mangled) + + formatted = CODE.format(user_code=textwrap.indent(source.replace("\t", " "), " ")) async with self.bot.session.post(self.eval_endpoint, json={"input": formatted}) as eval_response: if eval_response.status != 200: