diff options
| author | 2021-04-17 12:28:36 -0400 | |
|---|---|---|
| committer | 2021-04-17 12:28:36 -0400 | |
| commit | a2059decb86138f367618dcd5ef5b42fe5de7eae (patch) | |
| tree | 6045405d23a661a2c29ae0d97750c74a698e74ed | |
| parent | Merge pull request #1528 from python-discord/mbaruh/allow_eval (diff) | |
chore: Redirect output to bot-commands channel for the eval command
Diffstat (limited to '')
| -rw-r--r-- | bot/decorators.py | 20 | ||||
| -rw-r--r-- | bot/exts/utils/snekbox.py | 9 | 
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. | 
