aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar MarkKoz <[email protected]>2019-10-03 15:12:44 -0700
committerGravatar MarkKoz <[email protected]>2019-10-03 15:34:35 -0700
commit19ad4392fe50c4c50676fdb509b7208692d48026 (patch)
tree3b81d0f69c1fa88d0382f14cb1c05bb1638939d1
parentReplace with_role decorator with a cog_check (diff)
Add a generic method to manage loading/unloading extensions
-rw-r--r--bot/cogs/extensions.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/bot/cogs/extensions.py b/bot/cogs/extensions.py
index 58ab45ca9..83048bb76 100644
--- a/bot/cogs/extensions.py
+++ b/bot/cogs/extensions.py
@@ -1,5 +1,6 @@
import logging
import os
+import typing as t
from enum import Enum
from pkgutil import iter_modules
@@ -285,6 +286,36 @@ class Extensions(Cog):
log.debug(f"{ctx.author} requested a list of all cogs. Returning a paginated list.")
await LinePaginator.paginate(lines, ctx, embed, max_size=300, empty=False)
+ def manage(self, ext: str, action: Action) -> t.Tuple[str, t.Optional[str]]:
+ """Apply an action to an extension and return the status message and any error message."""
+ verb = action.name.lower()
+ error_msg = None
+
+ if ext not in self.cogs:
+ return f":x: Extension {ext} does not exist.", None
+
+ if (
+ (action is Action.LOAD and ext not in self.bot.extensions)
+ or (action is Action.UNLOAD and ext in self.bot.extensions)
+ or action is Action.RELOAD
+ ):
+ try:
+ for func in action.value:
+ func(self.bot, ext)
+ except Exception as e:
+ log.exception(f"Extension '{ext}' failed to {verb}.")
+
+ error_msg = f"{e.__class__.__name__}: {e}"
+ msg = f":x: Failed to {verb} extension `{ext}`:\n```{error_msg}```"
+ else:
+ msg = f":ok_hand: Extension successfully {verb}ed: `{ext}`."
+ log.debug(msg[10:])
+ else:
+ msg = f":x: Extension `{ext}` is already {verb}ed."
+ log.debug(msg[4:])
+
+ return msg, error_msg
+
# This cannot be static (must have a __func__ attribute).
def cog_check(self, ctx: Context) -> bool:
"""Only allow moderators and core developers to invoke the commands in this cog."""