mirror of
https://github.com/Rapptz/discord.py.git
synced 2025-05-13 17:29:50 +00:00
Fix permission resolution in Channel.permissions_for
This commit is contained in:
parent
320cd39b6a
commit
9188184e85
@ -28,7 +28,7 @@ from . import utils
|
|||||||
from .permissions import Permissions
|
from .permissions import Permissions
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
MemberOverwrite = namedtuple('MemberOverwrite', ['id', 'allow', 'deny'])
|
Overwrites = namedtuple('Overwrites', 'id allow deny type')
|
||||||
|
|
||||||
class Channel(object):
|
class Channel(object):
|
||||||
"""Represents a Discord server channel.
|
"""Represents a Discord server channel.
|
||||||
@ -79,11 +79,11 @@ class Channel(object):
|
|||||||
self.position = kwargs.get('position')
|
self.position = kwargs.get('position')
|
||||||
self.type = kwargs.get('type')
|
self.type = kwargs.get('type')
|
||||||
self.changed_roles = []
|
self.changed_roles = []
|
||||||
self._user_permissions = []
|
self._permission_overwrites = []
|
||||||
for overridden in kwargs.get('permission_overwrites', []):
|
for overridden in kwargs.get('permission_overwrites', []):
|
||||||
|
self._permission_overwrites.append(Overwrites(**overridden))
|
||||||
|
|
||||||
if overridden.get('type') == 'member':
|
if overridden.get('type') == 'member':
|
||||||
del overridden['type']
|
|
||||||
self._user_permissions.append(MemberOverwrite(**overridden))
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# this is pretty inefficient due to the deep nested loops unfortunately
|
# this is pretty inefficient due to the deep nested loops unfortunately
|
||||||
@ -135,25 +135,27 @@ class Channel(object):
|
|||||||
if member.id == self.server.owner.id:
|
if member.id == self.server.owner.id:
|
||||||
return Permissions.ALL
|
return Permissions.ALL
|
||||||
|
|
||||||
base = self.server.get_default_role().permissions
|
default = self.server.get_default_role()
|
||||||
|
base = deepcopy(default.permissions)
|
||||||
|
|
||||||
# Apply server roles that the member has.
|
# Apply server roles that the member has.
|
||||||
for role in member.roles:
|
for role in member.roles:
|
||||||
denied = ~role.permissions.value
|
base.value |= role.permissions.value
|
||||||
base.handle_overwrite(allow=role.permissions.value, deny=denied)
|
|
||||||
|
|
||||||
# Server-wide Manage Roles -> True for everything
|
# Server-wide Manage Roles -> True for everything
|
||||||
if base.can_manage_roles:
|
if base.can_manage_roles:
|
||||||
base = Permissions.ALL
|
base = Permissions.ALL
|
||||||
|
|
||||||
# Apply channel specific permission overwrites
|
member_role_ids = set(map(lambda r: r.id, member.roles))
|
||||||
for role in self.changed_roles:
|
|
||||||
denied = ~role.permissions.value
|
# Apply channel specific role permission overwrites
|
||||||
base.handle_overwrite(allow=role.permissions.value, deny=denied)
|
for overwrite in self._permission_overwrites:
|
||||||
|
if overwrite.type == 'role' and overwrite.id in member_role_ids:
|
||||||
|
base.handle_overwrite(allow=overwrite.allow, deny=overwrite.deny)
|
||||||
|
|
||||||
# Apply member specific permission overwrites
|
# Apply member specific permission overwrites
|
||||||
for overwrite in self._user_permissions:
|
for overwrite in self._permission_overwrites:
|
||||||
if overwrite.id == member.id:
|
if overwrite.type == 'member' and overwrite.id == member.id:
|
||||||
base.handle_overwrite(allow=overwrite.allow, deny=overwrite.deny)
|
base.handle_overwrite(allow=overwrite.allow, deny=overwrite.deny)
|
||||||
|
|
||||||
if base.can_manage_roles:
|
if base.can_manage_roles:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user