Zeva Rose 2021-06-27 19:37:22 -06:00
parent 0589a8902c
commit b164694c43

View file

@ -5,8 +5,11 @@ import re
import ulid import ulid
import base64 import base64
import subprocess import subprocess
import traceback from inspect import getsource
import inspect import discord
import time
import sys
import os
from discord.ext import commands from discord.ext import commands
from jarvis.utils import build_embed, convert_bytesize from jarvis.utils import build_embed, convert_bytesize
from jarvis.utils.field import Field from jarvis.utils.field import Field
@ -238,15 +241,70 @@ class DevCog(commands.Cog):
output = subprocess.check_output(["cloc", "."]).decode("UTF-8") output = subprocess.check_output(["cloc", "."]).decode("UTF-8")
await ctx.send(f"```\n{output}\n```") await ctx.send(f"```\n{output}\n```")
@commands.command(name="eval") def resolve_variable(self, variable):
if hasattr(variable, "__iter__"):
var_length = len(list(variable))
if (var_length > 100) and (not isinstance(variable, str)):
return f"<a {type(variable).__name__} iterable with more than 100 values ({var_length})>"
elif not var_length:
return f"<an empty {type(variable).__name__} iterable>"
if (not variable) and (not isinstance(variable, bool)):
return f"<an empty {type(variable).__name__} object>"
return (
variable
if (len(f"{variable}") <= 1000)
else f"<a long {type(variable).__name__} object with the length of {len(f'{variable}'):,}>"
)
def prepare(self, string):
arr = (
string.strip("```")
.replace("py\n", "")
.replace("python\n", "")
.split("\n")
)
if not arr[::-1][0].replace(" ", "").startswith("return"):
arr[len(arr) - 1] = "return " + arr[::-1][0]
return "".join(f"\n\t{i}" for i in arr)
@commands.command(pass_context=True, aliases=["eval", "exec", "evaluate"])
@commands.is_owner() @commands.is_owner()
async def _eval(self, ctx, *, code: str): async def _eval(self, ctx, *, code: str):
code = f"async def fn():{code}" silent = "-s" in code
code = self.prepare(code.replace("-s", ""))
args = {
"discord": discord,
"sauce": getsource,
"sys": sys,
"os": os,
"imp": __import__,
"this": self,
"ctx": ctx,
}
try: try:
output = exec(code, globals(), locals()) exec(f"async def func():{code}", args)
except Exception: a = time()
output = traceback.format_exc() response = await eval("func()", args)
await ctx.send(f"```{output}```") if (
silent
or (response is None)
or isinstance(response, discord.Message)
):
del args, code
return
await ctx.send(
f"```py\n{self.resolve_variable(response)}````{type(response).__name__} | {(time() - a) / 1000} ms`"
)
except Exception as e:
await ctx.send(
f"Error occurred:```\n{type(e).__name__}: {str(e)}```"
)
del args, code, silent
def setup(bot): def setup(bot):