aboutsummaryrefslogtreecommitdiffstats
path: root/bot
diff options
context:
space:
mode:
authorGravatar Daniel Brown <[email protected]>2021-04-11 14:45:38 -0500
committerGravatar GitHub <[email protected]>2021-04-11 14:45:38 -0500
commitc1bf0535aaebd0fe2278a03f9beb12213d969510 (patch)
treedda4f4e5b58626c98238431d74884cbeb5ba4a33 /bot
parentMerge branch 'main' into akarys/630/automatic-linking-everywhere (diff)
parentMerge pull request #672 from python-discord/feature/timed-execution (diff)
Merge branch 'main' into akarys/630/automatic-linking-everywhere
Diffstat (limited to 'bot')
-rw-r--r--bot/exts/evergreen/timed.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/bot/exts/evergreen/timed.py b/bot/exts/evergreen/timed.py
new file mode 100644
index 00000000..635ccb32
--- /dev/null
+++ b/bot/exts/evergreen/timed.py
@@ -0,0 +1,44 @@
+from copy import copy
+from time import perf_counter
+
+from discord import Message
+from discord.ext import commands
+
+
+class TimedCommands(commands.Cog):
+ """Time the command execution of a command."""
+
+ @staticmethod
+ async def create_execution_context(ctx: commands.Context, command: str) -> commands.Context:
+ """Get a new execution context for a command."""
+ msg: Message = copy(ctx.message)
+ msg.content = f"{ctx.prefix}{command}"
+
+ return await ctx.bot.get_context(msg)
+
+ @commands.command(name="timed", aliases=["time", "t"])
+ async def timed(self, ctx: commands.Context, *, command: str) -> None:
+ """Time the command execution of a command."""
+ new_ctx = await self.create_execution_context(ctx, command)
+
+ if not new_ctx.command:
+ help_command = f"{ctx.prefix}help"
+ error = f"The command you are trying to time doesn't exist. Use `{help_command}` for a list of commands."
+
+ await ctx.send(error)
+ return
+
+ if new_ctx.command.qualified_name == "timed":
+ await ctx.send("You are not allowed to time the execution of the `timed` command.")
+ return
+
+ t_start = perf_counter()
+ await new_ctx.command.invoke(new_ctx)
+ t_end = perf_counter()
+
+ await ctx.send(f"Command execution for `{new_ctx.command}` finished in {(t_end - t_start):.4f} seconds.")
+
+
+def setup(bot: commands.Bot) -> None:
+ """Cog load."""
+ bot.add_cog(TimedCommands(bot))