Add invite management functions.
This commit is contained in:
parent
17171aaa60
commit
2f86a853d6
@ -1308,3 +1308,137 @@ class Client:
|
|||||||
r = yield from self.session.patch(url, headers=self.headers, data=to_json(payload))
|
r = yield from self.session.patch(url, headers=self.headers, data=to_json(payload))
|
||||||
log.debug(request_logging_format.format(method='PATCH', response=r))
|
log.debug(request_logging_format.format(method='PATCH', response=r))
|
||||||
yield from utils._verify_successful_response(r)
|
yield from utils._verify_successful_response(r)
|
||||||
|
|
||||||
|
# Invite management
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def create_invite(self, destination, **options):
|
||||||
|
"""|coro|
|
||||||
|
|
||||||
|
Creates an invite for the destination which could be either a
|
||||||
|
:class:`Server` or :class:`Channel`.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
------------
|
||||||
|
destination
|
||||||
|
The :class:`Server` or :class:`Channel` to create the invite to.
|
||||||
|
max_age : int
|
||||||
|
How long the invite should last. If it's 0 then the invite
|
||||||
|
doesn't expire. Defaults to 0.
|
||||||
|
max_uses : int
|
||||||
|
How many uses the invite could be used for. If it's 0 then there
|
||||||
|
are unlimited uses. Defaults to 0.
|
||||||
|
temporary : bool
|
||||||
|
Denotes that the invite grants temporary membership
|
||||||
|
(i.e. they get kicked after they disconnect). Defaults to False.
|
||||||
|
xkcd : bool
|
||||||
|
Indicates if the invite URL is human readable. Defaults to False.
|
||||||
|
|
||||||
|
Raises
|
||||||
|
-------
|
||||||
|
HTTPException
|
||||||
|
Invite creation failed.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
--------
|
||||||
|
:class:`Invite`
|
||||||
|
The invite that was created.
|
||||||
|
"""
|
||||||
|
|
||||||
|
payload = {
|
||||||
|
'max_age': options.get('max_age', 0),
|
||||||
|
'max_uses': options.get('max_uses', 0),
|
||||||
|
'temporary': options.get('temporary', False),
|
||||||
|
'xkcdpass': options.get('xkcd', False)
|
||||||
|
}
|
||||||
|
|
||||||
|
url = '{0}/{1.id}/invites'.format(endpoints.CHANNELS, destination)
|
||||||
|
response = yield from self.session.post(url, headers=self.headers, data=to_json(payload))
|
||||||
|
log.debug(request_logging_format.format(method='POST', response=response))
|
||||||
|
|
||||||
|
yield from utils._verify_successful_response(response)
|
||||||
|
data = yield from response.json()
|
||||||
|
log.debug(request_success_log.format(json=payload, response=response, data=data))
|
||||||
|
|
||||||
|
data['server'] = self.connection._get_server(data['guild']['id'])
|
||||||
|
channel_id = data['channel']['id']
|
||||||
|
data['channel'] = utils.find(lambda ch: ch.id == channel_id, data['server'].channels)
|
||||||
|
return Invite(**data)
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def get_invite(self, url):
|
||||||
|
"""|coro|
|
||||||
|
|
||||||
|
Gets a :class:`Invite` from a discord.gg URL or ID.
|
||||||
|
|
||||||
|
Note
|
||||||
|
------
|
||||||
|
If the invite is for a server you have not joined, the server and channel
|
||||||
|
attributes of the returned invite will be :class:`Object` with the names
|
||||||
|
patched in.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
-----------
|
||||||
|
url : str
|
||||||
|
The discord invite ID or URL (must be a discord.gg URL).
|
||||||
|
|
||||||
|
Raises
|
||||||
|
-------
|
||||||
|
NotFound
|
||||||
|
The invite has expired.
|
||||||
|
HTTPException
|
||||||
|
Getting the invite failed.
|
||||||
|
InvalidArgument
|
||||||
|
|
||||||
|
|
||||||
|
Returns
|
||||||
|
--------
|
||||||
|
:class:`Invite`
|
||||||
|
The invite from the URL/ID.
|
||||||
|
"""
|
||||||
|
|
||||||
|
destination = self._resolve_invite(url)
|
||||||
|
rurl = '{0}/invite/{1}'.format(endpoints.API_BASE, destination)
|
||||||
|
response = yield from self.session.get(rurl, headers=self.headers)
|
||||||
|
log.debug(request_logging_format.format(method='GET', response=response))
|
||||||
|
yield from utils._verify_successful_response(response)
|
||||||
|
data = yield from response.json()
|
||||||
|
server = self.connection._get_server(data['guild']['id'])
|
||||||
|
if server is not None:
|
||||||
|
ch_id = data['channel']['id']
|
||||||
|
channels = getattr(server, 'channels', [])
|
||||||
|
channel = utils.find(lambda c: c.id == ch_id, channels)
|
||||||
|
else:
|
||||||
|
server = Object(id=data['guild']['id'])
|
||||||
|
server.name = data['guild']['name']
|
||||||
|
channel = Object(id=data['channel']['id'])
|
||||||
|
channel.name = data['channel']['name']
|
||||||
|
data['server'] = server
|
||||||
|
data['channel'] = channel
|
||||||
|
return Invite(**data)
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def accept_invite(self, invite):
|
||||||
|
"""|coro|
|
||||||
|
|
||||||
|
Accepts an :class:`Invite`, URL or ID to an invite.
|
||||||
|
|
||||||
|
The URL must be a discord.gg URL. e.g. "http://discord.gg/codehere".
|
||||||
|
An ID for the invite is just the "codehere" portion of the invite URL.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
-----------
|
||||||
|
invite
|
||||||
|
The :class:`Invite` or URL to an invite to accept.
|
||||||
|
|
||||||
|
Raises
|
||||||
|
-------
|
||||||
|
HTTPException
|
||||||
|
Accepting the invite failed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
destination = self._resolve_invite(invite)
|
||||||
|
url = '{0}/invite/{1}'.format(endpoints.API_BASE, destination)
|
||||||
|
response = yield from self.session.post(url, headers=self.headers)
|
||||||
|
log.debug(request_logging_format.format(method='POST', response=response))
|
||||||
|
yield from utils._verify_successful_response(response)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user