aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/cogs/help.py5
-rw-r--r--bot/constants.py7
-rw-r--r--bot/decorators.py42
-rw-r--r--config-default.yml3
4 files changed, 54 insertions, 3 deletions
diff --git a/bot/cogs/help.py b/bot/cogs/help.py
index ded068123..2168e2a60 100644
--- a/bot/cogs/help.py
+++ b/bot/cogs/help.py
@@ -10,6 +10,8 @@ from discord.ext.commands import CheckFailure
from fuzzywuzzy import fuzz, process
from bot import constants
+from bot.constants import Roles
+from bot.decorators import redirect_output
from bot.pagination import (
DELETE_EMOJI, FIRST_EMOJI, LAST_EMOJI,
LEFT_EMOJI, LinePaginator, RIGHT_EMOJI,
@@ -23,7 +25,7 @@ REACTIONS = {
LAST_EMOJI: 'end',
DELETE_EMOJI: 'stop'
}
-
+STAFF_ROLES = Roles.helpers, Roles.moderator, Roles.admin, Roles.owner
Cog = namedtuple('Cog', ['name', 'description', 'commands'])
@@ -652,6 +654,7 @@ class Help:
Custom Embed Pagination Help feature
"""
@commands.command('help')
+ @redirect_output(constants.Channels.bot, STAFF_ROLES)
async def new_help(self, ctx, *commands):
"""
Shows Command Help.
diff --git a/bot/constants.py b/bot/constants.py
index 0e0c1845b..f23696e4d 100644
--- a/bot/constants.py
+++ b/bot/constants.py
@@ -482,6 +482,13 @@ class Free(metaclass=YAMLGetter):
cooldown_per: float
+class RedirectOutput(metaclass=YAMLGetter):
+ section = 'redirect_output'
+
+ delete_invocation: bool
+ delete_delay: int
+
+
# Debug mode
DEBUG_MODE = True if 'local' in os.environ.get("SITE_URL", "local") else False
diff --git a/bot/decorators.py b/bot/decorators.py
index 710045c10..ce54f28cd 100644
--- a/bot/decorators.py
+++ b/bot/decorators.py
@@ -1,7 +1,7 @@
import logging
import random
import typing
-from asyncio import Lock
+from asyncio import Lock, sleep
from functools import wraps
from weakref import WeakValueDictionary
@@ -9,7 +9,7 @@ from discord import Colour, Embed
from discord.ext import commands
from discord.ext.commands import CheckFailure, Context
-from bot.constants import ERROR_REPLIES
+from bot.constants import ERROR_REPLIES, RedirectOutput
from bot.utils.checks import with_role_check, without_role_check
log = logging.getLogger(__name__)
@@ -100,3 +100,41 @@ def locked():
return await func(self, ctx, *args, **kwargs)
return inner
return wrap
+
+
+def redirect_output(destination_channel: int, bypass_roles: typing.Container[int] = None):
+ """
+ Changes the channel in the context of the command to redirect the output
+ to a certain channel, unless the author has a role to bypass redirection
+ """
+
+ def wrap(func):
+ @wraps(func)
+ async def inner(self, ctx, *args, **kwargs):
+ if ctx.channel.id == destination_channel:
+ log.trace(f"Command {ctx.command.name} was invoked in destination_channel, not redirecting")
+ return await func(self, ctx, *args, **kwargs)
+
+ if bypass_roles and any(role.id in bypass_roles for role in ctx.author.roles):
+ log.trace(f"{ctx.author} has role to bypass output redirection")
+ return await func(self, ctx, *args, **kwargs)
+
+ 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}")
+ await func(self, ctx, *args, **kwargs)
+
+ message = await old_channel.send(
+ f"Hey, {ctx.author.mention}, you can find the output of your command here: "
+ f"{redirect_channel.mention}"
+ )
+
+ if RedirectOutput.delete_invocation:
+ await sleep(RedirectOutput.delete_delay)
+ await message.delete()
+ await ctx.message.delete()
+ return inner
+ return wrap
diff --git a/config-default.yml b/config-default.yml
index d77f9d186..3ce01916e 100644
--- a/config-default.yml
+++ b/config-default.yml
@@ -350,6 +350,9 @@ free:
cooldown_rate: 1
cooldown_per: 60.0
+redirect_output:
+ delete_invocation: true
+ delete_delay: 15
config:
required_keys: ['bot.token']