[Permissions] Ensure defaults are cleared when clearing all rules (#3041)

- fixes #3037
This commit is contained in:
Michael H 2019-11-04 17:09:01 -05:00 committed by Kowlin
parent a729a474b1
commit ddd9c4c6b0
4 changed files with 17 additions and 8 deletions

View File

@ -0,0 +1 @@
defaults are cleared properly when clearing all rules

View File

@ -544,7 +544,7 @@ class Permissions(commands.Cog):
Handles config. 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): for category in (COG, COMMAND):
async with self.config.custom(category).all() as all_rules: async with self.config.custom(category).all() as all_rules:
for name, rules in all_rules.items(): for name, rules in all_rules.items():

View File

@ -779,7 +779,7 @@ class RedBase(commands.GroupMixin, commands.bot.BotBase, RPCMixin): # pylint: d
for subcommand in set(command.walk_commands()): for subcommand in set(command.walk_commands()):
subcommand.requires.reset() 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. """Clear all permission overrides in a scope.
Parameters 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 ``None``, this will clear all global rules and leave all
guild rules untouched. 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(): 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(): 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: def add_permissions_hook(self, hook: commands.CheckPredicate) -> None:
"""Add a permissions hook. """Add a permissions hook.

View File

@ -398,11 +398,9 @@ class Requires:
else: else:
rules[model_id] = rule 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. """Clear all rules of a particular scope.
This will preserve the default rule, if set.
Parameters Parameters
---------- ----------
guild_id : int guild_id : int
@ -410,6 +408,12 @@ class Requires:
`Requires.GLOBAL`, this will clear all global rules and `Requires.GLOBAL`, this will clear all global rules and
leave all guild rules untouched. 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: if guild_id:
rules = self._guild_rules.setdefault(guild_id, _RulesDict()) rules = self._guild_rules.setdefault(guild_id, _RulesDict())
@ -417,7 +421,7 @@ class Requires:
rules = self._global_rules rules = self._global_rules
default = rules.get(self.DEFAULT, None) default = rules.get(self.DEFAULT, None)
rules.clear() rules.clear()
if default is not None: if default is not None and preserve_default_rule:
rules[self.DEFAULT] = default rules[self.DEFAULT] = default
def reset(self) -> None: def reset(self) -> None: