diff --git a/changelog.d/permissions/3037.bugfix.rst b/changelog.d/permissions/3037.bugfix.rst new file mode 100644 index 000000000..c783beaa1 --- /dev/null +++ b/changelog.d/permissions/3037.bugfix.rst @@ -0,0 +1 @@ +defaults are cleared properly when clearing all rules \ No newline at end of file diff --git a/redbot/cogs/permissions/permissions.py b/redbot/cogs/permissions/permissions.py index 2e0aa9422..e3cd995b0 100644 --- a/redbot/cogs/permissions/permissions.py +++ b/redbot/cogs/permissions/permissions.py @@ -544,7 +544,7 @@ class Permissions(commands.Cog): Handles config. """ - self.bot.clear_permission_rules(guild_id) + self.bot.clear_permission_rules(guild_id, preserve_default_rule=False) for category in (COG, COMMAND): async with self.config.custom(category).all() as all_rules: for name, rules in all_rules.items(): diff --git a/redbot/core/bot.py b/redbot/core/bot.py index acdffc957..796ed7a27 100644 --- a/redbot/core/bot.py +++ b/redbot/core/bot.py @@ -779,7 +779,7 @@ class RedBase(commands.GroupMixin, commands.bot.BotBase, RPCMixin): # pylint: d for subcommand in set(command.walk_commands()): subcommand.requires.reset() - def clear_permission_rules(self, guild_id: Optional[int]) -> None: + def clear_permission_rules(self, guild_id: Optional[int], **kwargs) -> None: """Clear all permission overrides in a scope. Parameters @@ -789,11 +789,15 @@ class RedBase(commands.GroupMixin, commands.bot.BotBase, RPCMixin): # pylint: d ``None``, this will clear all global rules and leave all guild rules untouched. + **kwargs + Keyword arguments to be passed to each required call of + ``commands.Requires.clear_all_rules`` + """ for cog in self.cogs.values(): - cog.requires.clear_all_rules(guild_id) + cog.requires.clear_all_rules(guild_id, **kwargs) for command in self.walk_commands(): - command.requires.clear_all_rules(guild_id) + command.requires.clear_all_rules(guild_id, **kwargs) def add_permissions_hook(self, hook: commands.CheckPredicate) -> None: """Add a permissions hook. diff --git a/redbot/core/commands/requires.py b/redbot/core/commands/requires.py index c5b4187a4..b6f188de1 100644 --- a/redbot/core/commands/requires.py +++ b/redbot/core/commands/requires.py @@ -398,11 +398,9 @@ class Requires: else: rules[model_id] = rule - def clear_all_rules(self, guild_id: int) -> None: + def clear_all_rules(self, guild_id: int, *, preserve_default_rule: bool = True) -> None: """Clear all rules of a particular scope. - This will preserve the default rule, if set. - Parameters ---------- guild_id : int @@ -410,6 +408,12 @@ class Requires: `Requires.GLOBAL`, this will clear all global rules and leave all guild rules untouched. + Other Parameters + ---------------- + preserve_default_rule : bool + Whether to preserve the default rule or not. + This defaults to being preserved + """ if guild_id: rules = self._guild_rules.setdefault(guild_id, _RulesDict()) @@ -417,7 +421,7 @@ class Requires: rules = self._global_rules default = rules.get(self.DEFAULT, None) rules.clear() - if default is not None: + if default is not None and preserve_default_rule: rules[self.DEFAULT] = default def reset(self) -> None: