[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.
"""
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():

View File

@ -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.

View File

@ -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: