aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar ChrisJL <[email protected]>2021-05-05 18:08:30 +0100
committerGravatar GitHub <[email protected]>2021-05-05 18:08:30 +0100
commitd2fb5a94f7c9298d8ade5f403ae5c252cf5bf039 (patch)
tree9921486d11675bf17c0de4fe05ccf6e487f675f5
parentMerge branch 'main' into patch-1 (diff)
parentMerge pull request #1531 from ToxicKidz/eval-redirect-output (diff)
Merge branch 'main' into patch-1
-rw-r--r--bot/decorators.py28
-rw-r--r--bot/exts/utils/snekbox.py10
2 files changed, 32 insertions, 6 deletions
diff --git a/bot/decorators.py b/bot/decorators.py
index e971a5bd3..f65ec4103 100644
--- a/bot/decorators.py
+++ b/bot/decorators.py
@@ -107,11 +107,19 @@ 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,
+ ping_user: bool = True
+) -> 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.
+
+ If ping_user is False, it will not send a message in the destination channel.
This decorator must go before (below) the `command` decorator.
"""
@@ -119,7 +127,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,12 +136,24 @@ 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)
+ return
+
redirect_channel = ctx.guild.get_channel(destination_channel)
old_channel = ctx.channel
log.trace(f"Redirecting output of {ctx.author}'s command '{ctx.command.name}' to {redirect_channel.name}")
ctx.channel = redirect_channel
- await ctx.channel.send(f"Here's the output of your command, {ctx.author.mention}")
+
+ if ping_user:
+ await ctx.send(f"Here's the output of your command, {ctx.author.mention}")
asyncio.create_task(func(self, ctx, *args, **kwargs))
message = await old_channel.send(
diff --git a/bot/exts/utils/snekbox.py b/bot/exts/utils/snekbox.py
index da95240bb..b1f1ba6a8 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,13 @@ 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,
+ ping_user=False
+ )
async def eval_command(self, ctx: Context, *, code: str = None) -> None:
"""
Run Python code and get the results.