Skip to content

Commit

Permalink
cleaned up eval
Browse files Browse the repository at this point in the history
  • Loading branch information
nfearnley committed Jun 8, 2024
1 parent 08b454b commit 70a82bf
Show file tree
Hide file tree
Showing 9 changed files with 221 additions and 222 deletions.
5 changes: 2 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ dependencies = [
"packaging==24.0",
"sizeroyale==1.0.5",
"numexpr==2.9.0",
"mre>=0.12.0",
]

[project.optional-dependencies]
Expand Down Expand Up @@ -82,12 +83,10 @@ build-backend = "hatchling.build"
select = [
"F", # Pyflakes
"E", "W", # pycodestyle
"C90", # mccabe
"N", # pep8-naming
"UP", # pyupgrade
"ANN", # flake8-annotations
"ASYNC", # flake8-async
"BLE", # flake8-blind-except
"FBT", # flake8-boolean-trap
"B", # flake8-bugbear
"A", # flake8-builtins
Expand All @@ -110,7 +109,7 @@ select = [
"RUF", # Ruff-specific rules

]
ignore = ["E501", "COM812", "PIE790", "RET504", "RUF001", "RUF013", "ANN101", "ANN102"]
ignore = ["E501", "ANN101", "ANN102", "ANN401", "ANN204", "COM812", "PIE790", "RET504", "RUF001", "RUF013"]

[tool.ruff.lint.pep8-naming]
ignore-names = ["fromJSON", "toJSON"]
2 changes: 2 additions & 0 deletions requirements-dev.lock
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ markupsafe==2.1.5
# via werkzeug
mccabe==0.7.0
# via flake8
mre==0.12.0
# via sizebot
multidict==6.0.5
# via aiohttp
# via yarl
Expand Down
2 changes: 2 additions & 0 deletions requirements.lock
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ jsonschema-specifications==2023.12.1
markupsafe==2.1.5
# via jinja2
# via werkzeug
mre==0.12.0
# via sizebot
multidict==6.0.5
# via aiohttp
# via yarl
Expand Down
56 changes: 22 additions & 34 deletions sizebot/cogs/eval.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
from discord import Embed
from discord.ext import commands

from sizebot.lib import utils
from sizebot.lib.utils import chunk_msg, format_traceback
from sizebot.lib.constants import emojis
from sizebot.lib.eval import runEval, get_fullname
from sizebot.lib.eval import run_eval, format_error, remove_code_block
from sizebot.lib.types import BotContext


Expand All @@ -22,67 +22,55 @@ def __init__(self, bot: commands.Bot):
multiline = True
)
@commands.is_owner()
async def eval(self, ctx: BotContext, *, evalStr: str):
async def eval(self, ctx: BotContext, *, eval_str: str) -> None:
"""Evaluate a Python expression."""
evalStr = utils.remove_code_block(evalStr)
eval_str = remove_code_block(eval_str)

logger.info(f"{ctx.author.display_name} tried to eval {evalStr!r}.")
logger.info(f"{ctx.author.display_name} tried to eval {eval_str!r}.")

# Show user that bot is busy doing something
waitMsg = None
wait_msg = None
if isinstance(ctx.channel, discord.TextChannel):
waitMsg = await ctx.send(f"{emojis.run_program} Running eval... {emojis.loading}")
wait_msg = await ctx.send(f"{emojis.run_program} Running eval... {emojis.loading}")

async with ctx.typing():
try:
result = await runEval(ctx, evalStr)
result = await run_eval(ctx, eval_str)
except Exception as err:
logger.error("eval error:\n" + utils.format_traceback(err))
await ctx.send(emojis.warning + f" ` {utils.format_error(err)} `")
logger.error("eval error:\n" + format_traceback(err))
await ctx.send(emojis.warning + f" ` {format_error(err)} `")
return
finally:
# Remove wait message when done
if waitMsg:
await waitMsg.delete(delay=0)
if wait_msg:
await wait_msg.delete(delay=0)

if isinstance(result, Embed):
await ctx.send(embed=result)
else:
strResult = str(result).replace("```", r"\`\`\`")
for m in utils.chunk_msg(strResult):
for m in chunk_msg(result):
await ctx.send(m)

@commands.command(
hidden = True,
multiline = True
)
@commands.is_owner()
async def evil(self, ctx: BotContext, *, evalStr: str):
async def evil(self, ctx: BotContext, *, eval_str: str) -> None:
"""Evaluate a Python expression, but evilly."""
# PERMISSION: requires manage_messages
await ctx.message.delete(delay = 0)

evalStr = utils.remove_code_block(evalStr)
eval_str = remove_code_block(eval_str)

logger.info(f"{ctx.author.display_name} tried to quietly eval {evalStr!r}.")

async with ctx.typing():
try:
await runEval(ctx, evalStr, returnValue = False)
except Exception as err:
logger.error("eval error:\n" + utils.format_traceback(err))
await ctx.author.send(emojis.warning + f" ` {utils.format_error(err)} `")
logger.info(f"{ctx.author.display_name} tried to quietly eval {eval_str!r}.")

try:
await run_eval(ctx, eval_str)
except Exception as err:
logger.error("eval error:\n" + format_traceback(err))
await ctx.author.send(emojis.warning + f" ` {format_error(err)} `")

def format_error(err: Exception) -> str:
fullname = get_fullname(err)

errMessage = str(err)
if errMessage:
errMessage = f": {errMessage}"

return f"{fullname}{errMessage}"

async def setup(bot: commands.Bot):
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(EvalCog(bot))

12 changes: 12 additions & 0 deletions sizebot/lib/discordplusplus.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from typing import Self

from discord import Embed as RawEmbed

class Embed(RawEmbed):
def add_field(self, *, name: str | None = None, value: str | None = None, inline: bool = True) -> Self:
if name is None:
name = "\u200b"
if value is None:
value = "\u200b"

return super().add_field(name=name, value=value, inline=inline)
Loading

0 comments on commit 70a82bf

Please sign in to comment.