mirror of
https://github.com/Rapptz/discord.py.git
synced 2025-06-04 02:52:33 +00:00
Add support for role objects in GuildChannel.permissions_for
This commit is contained in:
parent
1209585de5
commit
ef4394f87d
@ -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…
x
Reference in New Issue
Block a user