aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRapptz <[email protected]>2015-10-21 18:50:38 -0400
committerRapptz <[email protected]>2015-10-21 19:44:37 -0400
commit6bb6a0a0a779da64dc4cf2c8d0eddae1ff148e5b (patch)
treeee757faff40e28407f76782f4d18d62600b4a26d
parentLog to root logger by default in on_error (diff)
downloaddiscord.py-6bb6a0a0a779da64dc4cf2c8d0eddae1ff148e5b.tar.xz
discord.py-6bb6a0a0a779da64dc4cf2c8d0eddae1ff148e5b.zip
Add Client.add_roles and Client.remove_roles
-rw-r--r--discord/client.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/discord/client.py b/discord/client.py
index 644a96ab..3730943f 100644
--- a/discord/client.py
+++ b/discord/client.py
@@ -41,6 +41,8 @@ import threading
from ws4py.client import WebSocketBaseClient
import sys
import logging
+import itertools
+
log = logging.getLogger(__name__)
request_logging_format = '{name}: {response.request.method} {response.url} has returned {response.status_code}'
@@ -1079,6 +1081,63 @@ class Client(object):
log.debug(request_logging_format.format(response=response, name='delete_role'))
return is_response_successful(response)
+ def add_roles(self, member, *roles):
+ """Gives the specified :class:`Member` a number of :class:`Role`s.
+
+ You must have the proper permissions to use this function.
+
+ :param member: The :class:`Member` to give roles to.
+ :param roles: The :class:`Role`s to give the member.
+ :return: ``True`` if the operation was successful, ``False`` otherwise.
+ """
+
+ url = '{0}/{1.server.id}/members/{1.id}'.format(endpoints.SERVERS, member)
+ new_roles = [role.id for role in itertools.chain(member.roles, roles)]
+ payload = {
+ 'roles': new_roles
+ }
+
+ response = requests.patch(url, headers=self.headers, json=payload)
+ log.debug(request_logging_format.format(response=response, name='add_roles'))
+ if is_response_successful(response):
+ member.roles = list(itertools.chain(member.roles, roles))
+ return True
+
+ return False
+
+ def remove_roles(self, member, *roles):
+ """Removes the :class:`Role`s from the :class:`Member`.
+
+ You must have the proper permissions to use this function.
+
+ :param member: The :class:`Member` to remove roles from.
+ :param roles: The :class:`Role`s to remove from the member.
+ :return: ``True`` if the operation was successful, ``False`` otherwise.
+ """
+
+ url = '{0}/{1.server.id}/members/{1.id}'.format(endpoints.SERVERS, member)
+
+ new_roles = [role.id for role in member.roles]
+ for role in roles:
+ if role.id in new_roles:
+ new_roles.remove(role.id)
+
+ payload = {
+ 'roles': new_roles
+ }
+
+ response = requests.patch(url, headers=self.headers, json=payload)
+ log.debug(request_logging_format.format(response=response, name='remove_roles'))
+ if is_response_successful(response):
+ member.roles = []
+ for role in member.server.roles:
+ if role.id in new_roles:
+ member.roles.append(role)
+
+ return True
+
+ return False
+
def create_role(self, server, **fields):
"""Creates a :class:`Role`.