From 4134a17a29e5e1cf5bd14e83ca260b472aa28a41 Mon Sep 17 00:00:00 2001 From: Sebastian Law <44045823+SebbyLaw@users.noreply.github.com> Date: Thu, 8 Apr 2021 19:04:10 -0700 Subject: [PATCH] [commands] Raise error when a cog name is already registered --- discord/ext/commands/bot.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/discord/ext/commands/bot.py b/discord/ext/commands/bot.py index dabe14398f4f..4ab5ee35021e 100644 --- a/discord/ext/commands/bot.py +++ b/discord/ext/commands/bot.py @@ -489,15 +489,25 @@ def decorator(func): # cogs - def add_cog(self, cog): + def add_cog(self, cog: Cog, *, override: bool = False) -> None: """Adds a "cog" to the bot. A cog is a class that has its own event listeners and commands. + .. versionchanged:: 2.0 + + :exc:`.ClientException` is raised when a cog with the same name + is already loaded. + Parameters ----------- cog: :class:`.Cog` The cog to register to the bot. + override: :class:`bool` + If a previously loaded cog with the same name should be ejected + instead of raising an error. + + .. versionadded:: 2.0 Raises ------- @@ -505,13 +515,23 @@ def add_cog(self, cog): The cog does not inherit from :class:`.Cog`. CommandError An error happened during loading. + .ClientException + A cog with the same name is already loaded. """ if not isinstance(cog, Cog): raise TypeError('cogs must derive from Cog') + cog_name = cog.__cog_name__ + existing = self.__cogs.get(cog_name) + + if existing is not None: + if not override: + raise discord.ClientException(f'Cog named {cog_name!r} already loaded') + self.remove_cog(cog_name) + cog = cog._inject(self) - self.__cogs[cog.__cog_name__] = cog + self.__cogs[cog_name] = cog def get_cog(self, name): """Gets the cog instance requested.