add admin eval commands
This commit is contained in:
parent
796d5aa763
commit
cabd0bc1c9
2 changed files with 76 additions and 1 deletions
|
@ -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")
|
||||||
|
|
|
@ -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 =====
|
||||||
|
|
Loading…
Reference in a new issue