add admin eval commands

This commit is contained in:
Infinidoge 2024-12-19 01:11:19 -05:00
parent 796d5aa763
commit cabd0bc1c9
Signed by: Infinidoge
SSH key fingerprint: SHA256:oAMyvotlNFraMmZmr+p6AxnNfW/GioTs1pOn3V4tQ7A
2 changed files with 76 additions and 1 deletions

View file

@ -1,6 +1,11 @@
import io
import logging import logging
import os import os
import pprint
import sys import sys
import textwrap
import traceback
from contextlib import redirect_stdout
from disnake import Guild, Intents, Message from disnake import Guild, Intents, Message
from disnake.ext import commands from disnake.ext import commands
@ -10,6 +15,7 @@ from dotenv import find_dotenv, load_dotenv
from .db import run_db_migrations, setup_db from .db import run_db_migrations, setup_db
from .notifications import Notifications from .notifications import Notifications
from .settings import Settings from .settings import Settings
from .utils import cleanup_code
# Logger setup # Logger setup
logger_disnake = logging.getLogger("disnake") logger_disnake = logging.getLogger("disnake")
@ -122,12 +128,73 @@ async def on_command_error(ctx, error):
await ctx.send(error) await ctx.send(error)
@bot.command() @bot.command(hidden=True)
@commands.is_owner() @commands.is_owner()
async def echo(ctx, arg): async def echo(ctx, arg):
await ctx.send(arg) await ctx.send(arg)
@bot.command(hidden=True)
@commands.is_owner()
async def sql(ctx, *, query):
params = {
"guild_id": ctx.guild.id,
}
query = cleanup_code(query)
cur = await ctx.bot.db.execute(query)
result = await cur.fetchall()
# TODO: Finish SQL evaluation command
@bot.command(hidden=True, name="eval")
@commands.is_owner()
async def admin_eval(self, ctx, *, body: str):
env = {
"bot": self.bot,
"ctx": ctx,
"channel": ctx.message.channel,
"author": ctx.message.author,
"guild": ctx.message.guild,
"message": ctx.message,
}
env.update(globals())
body = cleanup_code(body)
stdout = io.StringIO()
to_compile = "async def func():\n{}".format(textwrap.indent(body, " "))
try:
exec(to_compile, env)
except Exception as e:
return await ctx.send("```py\n{}: {}\n```".format(e.__class__.__name__, e))
func = env["func"]
try:
with redirect_stdout(stdout):
ret = await func()
except Exception:
value = stdout.getvalue()
await ctx.send("```py\n{}{}\n```".format(value, traceback.format_exc()))
else:
value = stdout.getvalue()
try:
await ctx.message.add_reaction("\u2705")
except:
pass
if ret is None:
if value:
await ctx.send("```py\n{}\n```".format(value))
else:
await ctx.send("```py\n{}{}\n```".format(value, ret))
@bot.command() @bot.command()
async def ping(ctx): async def ping(ctx):
await ctx.send("Pong") await ctx.send("Pong")

View file

@ -174,5 +174,13 @@ async def confirm(ctx, message, delete_msgs=False, response_check=get_positivity
pass pass
return reply_bool return reply_bool
def cleanup_code(content):
"""Automatically removes code blocks from the code."""
# remove ```py\n```
if content.startswith("```") and content.endswith("```"):
return "\n".join(content.split("\n")[1:-1])
# remove `foo`
return content.strip("` \n")
# ===== End code borrowed from Avrae ===== # ===== End code borrowed from Avrae =====