aboutsummaryrefslogtreecommitdiff
path: root/discord/abc.py
diff options
context:
space:
mode:
Diffstat (limited to 'discord/abc.py')
-rw-r--r--discord/abc.py110
1 files changed, 106 insertions, 4 deletions
diff --git a/discord/abc.py b/discord/abc.py
index e2ae12e2..d50966e4 100644
--- a/discord/abc.py
+++ b/discord/abc.py
@@ -34,7 +34,17 @@ from collections import namedtuple
from .message import Message
from .iterators import LogsFromIterator
from .context_managers import Typing
-from .errors import ClientException, NoMoreMessages
+from .errors import ClientException, NoMoreMessages, InvalidArgument
+from .permissions import PermissionOverwrite, Permissions
+from .role import Role
+
+import discord.utils
+
+class _Undefined:
+ def __repr__(self):
+ return 'see-below'
+
+_undefined = _Undefined()
class Snowflake(metaclass=abc.ABCMeta):
__slots__ = ()
@@ -236,16 +246,16 @@ class GuildChannel:
The channel's permission overwrites.
"""
ret = []
- for ow in self._permission_overwrites:
+ for ow in self._overwrites:
allow = Permissions(ow.allow)
deny = Permissions(ow.deny)
overwrite = PermissionOverwrite.from_pair(allow, deny)
if ow.type == 'role':
# accidentally quadratic
- target = discord.utils.find(lambda r: r.id == ow.id, self.server.roles)
+ target = discord.utils.find(lambda r: r.id == ow.id, self.guild.roles)
elif ow.type == 'member':
- target = self.server.get_member(ow.id)
+ target = self.guild.get_member(ow.id)
ret.append((target, overwrite))
return ret
@@ -364,6 +374,98 @@ class GuildChannel:
"""
yield from self._state.http.delete_channel(self.id)
+ @asyncio.coroutine
+ def set_permissions(self, target, *, overwrite=_undefined, **permissions):
+ """|coro|
+
+ Sets the channel specific permission overwrites for a target in the
+ channel.
+
+ The ``target`` parameter should either be a :class:`Member` or a
+ :class:`Role` that belongs to guild.
+
+ The ``overwrite`` parameter, if given, must either be ``None`` or
+ :class:`PermissionOverwrite`. For convenience, you can pass in
+ keyword arguments denoting :class:`Permissions` attributes. If this is
+ done, then you cannot mix the keyword arguments with the ``overwrite``
+ parameter.
+
+ If the ``overwrite`` parameter is ``None``, then the permission
+ overwrites are deleted.
+
+ You must have :attr:`Permissions.manage_roles` permission to use this.
+
+ Examples
+ ----------
+
+ Setting allow and deny: ::
+
+ await message.channel.set_permissions(message.author, read_messages=True,
+ send_messages=False)
+
+ Deleting overwrites ::
+
+ await channel.set_permissions(member, overwrite=None)
+
+ Using :class:`PermissionOverwrite` ::
+
+ overwrite = discord.PermissionOverwrite()
+ overwrite.send_messages = False
+ overwrite.read_messages = True
+ await channel.set_permissions(member, overwrite=overwrite)
+
+ Parameters
+ -----------
+ target
+ The :class:`Member` or :class:`Role` to overwrite permissions for.
+ overwrite: :class:`PermissionOverwrite`
+ The permissions to allow and deny to the target.
+ \*\*permissions
+ A keyword argument list of permissions to set for ease of use.
+ Cannot be mixed with ``overwrite``.
+
+ Raises
+ -------
+ Forbidden
+ You do not have permissions to edit channel specific permissions.
+ HTTPException
+ Editing channel specific permissions failed.
+ InvalidArgument
+ The overwrite parameter invalid or the target type was not
+ :class:`Role` or :class:`Member`.
+ """
+
+ http = self._state.http
+
+ if isinstance(target, User):
+ perm_type = 'member'
+ elif isinstance(target, Role):
+ perm_type = 'role'
+ else:
+ raise InvalidArgument('target parameter must be either Member or Role')
+
+ if isinstance(overwrite, _Undefined):
+ if len(permissions) == 0:
+ raise InvalidArgument('No overwrite provided.')
+ try:
+ overwrite = PermissionOverwrite(**permissions)
+ except:
+ raise InvalidArgument('Invalid permissions given to keyword arguments.')
+ else:
+ if len(permissions) > 0:
+ raise InvalidArgument('Cannot mix overwrite and keyword arguments.')
+
+ # TODO: wait for event
+
+ if overwrite is None:
+ yield from http.delete_channel_permissions(self.id, target.id)
+ elif isinstance(overwrite, PermissionOverwrite):
+ (allow, deny) = overwrite.pair()
+ yield from http.edit_channel_permissions(self.id, target.id, allow.value, deny.value, perm_type)
+ else:
+ raise InvalidArgument('Invalid overwrite type provided.')
+
+
class MessageChannel(metaclass=abc.ABCMeta):
__slots__ = ()