mirror of
https://github.com/Rapptz/discord.py.git
synced 2025-04-21 00:07:51 +00:00
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))
|
||||
log.debug(request_logging_format.format(method='PATCH', 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