aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar ToxicKidz <[email protected]>2021-04-17 12:28:36 -0400
committerGravatar ToxicKidz <[email protected]>2021-04-17 12:28:36 -0400
commita2059decb86138f367618dcd5ef5b42fe5de7eae (patch)
tree6045405d23a661a2c29ae0d97750c74a698e74ed
parentMerge pull request #1528 from python-discord/mbaruh/allow_eval (diff)
chore: Redirect output to bot-commands channel for the eval command
-rw-r--r--bot/decorators.py20
-rw-r--r--bot/exts/utils/snekbox.py9
2 files changed, 24 insertions, 5 deletions
diff --git a/bot/decorators.py b/bot/decorators.py
index e971a5bd3..5d9d74bd7 100644
--- a/bot/decorators.py
+++ b/bot/decorators.py
@@ -107,11 +107,16 @@ def has_no_roles(*roles: t.Union[str, int]) -> t.Callable:
return commands.check(predicate)
-def redirect_output(destination_channel: int, bypass_roles: t.Container[int] = None) -> t.Callable:
+def redirect_output(
+ destination_channel: int,
+ bypass_roles: t.Optional[t.Container[int]] = None,
+ channels: t.Optional[t.Container[int]] = None,
+ categories: t.Optional[t.Container[int]] = None
+) -> t.Callable:
"""
Changes the channel in the context of the command to redirect the output to a certain channel.
- Redirect is bypassed if the author has a role to bypass redirection.
+ Redirect is bypassed if the author has a bypass role or if it is in a channel that can bypass redirection.
This decorator must go before (below) the `command` decorator.
"""
@@ -119,7 +124,7 @@ def redirect_output(destination_channel: int, bypass_roles: t.Container[int] = N
@command_wraps(func)
async def inner(self: Cog, ctx: Context, *args, **kwargs) -> None:
if ctx.channel.id == destination_channel:
- log.trace(f"Command {ctx.command.name} was invoked in destination_channel, not redirecting")
+ log.trace(f"Command {ctx.command} was invoked in destination_channel, not redirecting")
await func(self, ctx, *args, **kwargs)
return
@@ -128,6 +133,15 @@ def redirect_output(destination_channel: int, bypass_roles: t.Container[int] = N
await func(self, ctx, *args, **kwargs)
return
+ elif channels and ctx.channel.id not in channels:
+ log.trace(f"{ctx.author} used {ctx.command} in a channel that can bypass output redirection")
+ await func(self, ctx, *args, **kwargs)
+ return
+
+ elif categories and ctx.channel.category.id not in categories:
+ log.trace(f"{ctx.author} used {ctx.command} in a category that can bypass output redirection")
+ await func(self, ctx, *args, **kwargs)
+
redirect_channel = ctx.guild.get_channel(destination_channel)
old_channel = ctx.channel
diff --git a/bot/exts/utils/snekbox.py b/bot/exts/utils/snekbox.py
index da95240bb..4cc7291e8 100644
--- a/bot/exts/utils/snekbox.py
+++ b/bot/exts/utils/snekbox.py
@@ -13,7 +13,7 @@ from discord.ext.commands import Cog, Context, command, guild_only
from bot.bot import Bot
from bot.constants import Categories, Channels, Roles, URLs
-from bot.decorators import not_in_blacklist
+from bot.decorators import redirect_output
from bot.utils import send_to_paste_service
from bot.utils.messages import wait_for_deletion
@@ -280,7 +280,12 @@ class Snekbox(Cog):
@command(name="eval", aliases=("e",))
@guild_only()
- @not_in_blacklist(channels=NO_EVAL_CHANNELS, categories=NO_EVAL_CATEGORIES, override_roles=EVAL_ROLES)
+ @redirect_output(
+ destination_channel=Channels.bot_commands,
+ bypass_roles=EVAL_ROLES,
+ categories=NO_EVAL_CATEGORIES,
+ channels=NO_EVAL_CHANNELS
+ )
async def eval_command(self, ctx: Context, *, code: str = None) -> None:
"""
Run Python code and get the results.