Browse Source

Add support for role objects in GuildChannel.permissions_for

pull/6713/head
Rapptz 4 years ago
parent
commit
ef4394f87d
  1. 52
      discord/abc.py

52
discord/abc.py

@ -452,8 +452,9 @@ class GuildChannel(Protocol):
category = self.guild.get_channel(self.category_id)
return bool(category and category.overwrites == self.overwrites)
def permissions_for(self, member):
"""Handles permission resolution for the current :class:`~discord.Member`.
def permissions_for(self, obj, /):
"""Handles permission resolution for the :class:`~discord.Member`
or :class:`~discord.Role`.
This function takes into consideration the following cases:
@ -462,15 +463,27 @@ class GuildChannel(Protocol):
- Channel overrides
- Member overrides
If a :class:`~discord.Role` is passed, then it checks the permissions
someone with that role would have, which is essentially:
- The default role permissions
- The default role permission overwrites
- The permission overwrites of the role used as a parameter
.. versionchanged:: 2.0
The object passed in can now be a role object.
Parameters
----------
member: :class:`~discord.Member`
The member to resolve permissions for.
obj: Union[:class:`~discord.Member`, :class:`~discord.Role`]
The object to resolve permissions for. This could be either
a member or a role. If it's a role then member overwrites
are not computed.
Returns
-------
:class:`~discord.Permissions`
The resolved permissions for the member.
The resolved permissions for the member or role.
"""
# The current cases can be explained as:
@ -487,12 +500,35 @@ class GuildChannel(Protocol):
# The operation first takes into consideration the denied
# and then the allowed.
if self.guild.owner_id == member.id:
if self.guild.owner_id == obj.id:
return Permissions.all()
default = self.guild.default_role
base = Permissions(default.permissions.value)
roles = member._roles
# Handle the role case first
if isinstance(obj, Role):
if obj.is_default():
overwrite = utils.get(self._overwrites, type=_Overwrites.ROLE, id=obj.id)
if overwrite is not None:
base.handle_overwrite(overwrite.allow, overwrite.deny)
return base
denies = 0
allows = 0
guild_id = self.guild.id
for overwrite in self._overwrites:
if not overwrite.is_role():
continue
if overwrite.id in (obj.id, guild_id):
denies |= overwrite.deny
allows |= overwrite.allow
base.handle_overwrite(allows, denies)
return base
roles = obj._roles
get_role = self.guild.get_role
# Apply guild roles that the member has.
@ -530,7 +566,7 @@ class GuildChannel(Protocol):
# Apply member specific permission overwrites
for overwrite in remaining_overwrites:
if overwrite.is_member() and overwrite.id == member.id:
if overwrite.is_member() and overwrite.id == obj.id:
base.handle_overwrite(allow=overwrite.allow, deny=overwrite.deny)
break

Loading…
Cancel
Save