mirror of
https://github.com/Rapptz/discord.py.git
synced 2025-05-16 10:49:24 +00:00
Add server management commands.
This commit is contained in:
parent
79bdf2a721
commit
b87dfccfce
@ -940,6 +940,8 @@ class Client:
|
|||||||
|
|
||||||
All fields except ``password`` are optional.
|
All fields except ``password`` are optional.
|
||||||
|
|
||||||
|
The profile is **not** edited in place.
|
||||||
|
|
||||||
Note
|
Note
|
||||||
-----
|
-----
|
||||||
To upload an avatar, a *bytes-like object* must be passed in that
|
To upload an avatar, a *bytes-like object* must be passed in that
|
||||||
@ -961,20 +963,25 @@ class Client:
|
|||||||
The new username you wish to change to.
|
The new username you wish to change to.
|
||||||
avatar : bytes
|
avatar : bytes
|
||||||
A *bytes-like object* representing the image to upload.
|
A *bytes-like object* representing the image to upload.
|
||||||
|
Could be ``None`` to denote no avatar.
|
||||||
|
|
||||||
Raises
|
Raises
|
||||||
------
|
------
|
||||||
HTTPException
|
HTTPException
|
||||||
Editing your profile failed.
|
Editing your profile failed.
|
||||||
|
InvalidArgument
|
||||||
|
Wrong image format passed for ``avatar``.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
avatar_bytes = fields.get('avatar')
|
try:
|
||||||
avatar = None
|
avatar_bytes = fields['avatar']
|
||||||
|
except KeyError:
|
||||||
|
avatar = self.user.avatar
|
||||||
|
else:
|
||||||
if avatar_bytes is not None:
|
if avatar_bytes is not None:
|
||||||
fmt = 'data:{mime};base64,{data}'
|
avatar = utils._bytes_to_base64_data(avatar_bytes)
|
||||||
mime = utils._get_mime_type_for_image(avatar_bytes)
|
else:
|
||||||
b64 = b64encode(avatar_bytes).decode('ascii')
|
avatar = None
|
||||||
avatar = fmt.format(mime=mime, data=b64)
|
|
||||||
|
|
||||||
payload = {
|
payload = {
|
||||||
'password': password,
|
'password': password,
|
||||||
@ -1052,6 +1059,8 @@ class Client:
|
|||||||
|
|
||||||
You must have the proper permissions to edit the channel.
|
You must have the proper permissions to edit the channel.
|
||||||
|
|
||||||
|
The channel is **not** edited in-place.
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
channel : :class:`Channel`
|
channel : :class:`Channel`
|
||||||
@ -1164,3 +1173,138 @@ class Client:
|
|||||||
response = yield from self.session.delete(url, headers=self.headers)
|
response = yield from self.session.delete(url, headers=self.headers)
|
||||||
log.debug(request_logging_format.format(method='DELETE', response=response))
|
log.debug(request_logging_format.format(method='DELETE', response=response))
|
||||||
yield from utils._verify_successful_response(response)
|
yield from utils._verify_successful_response(response)
|
||||||
|
|
||||||
|
# Server management
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def leave_server(self, server):
|
||||||
|
"""|coro|
|
||||||
|
|
||||||
|
Leaves a :class:`Server`.
|
||||||
|
|
||||||
|
Warning
|
||||||
|
--------
|
||||||
|
If you are the owner of the server then it is deleted.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
server : :class:`Server`
|
||||||
|
The server to leave.
|
||||||
|
|
||||||
|
Raises
|
||||||
|
--------
|
||||||
|
HTTPException
|
||||||
|
If leaving the server failed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
url = '{0}/{1.id}'.format(endpoints.SERVERS, server)
|
||||||
|
response = yield from self.session.delete(url, headers=self.headers)
|
||||||
|
log.debug(request_logging_format.format(method='DELETE', response=response))
|
||||||
|
yield from utils._verify_successful_response(response)
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def create_server(self, name, region=None, icon=None):
|
||||||
|
"""|coro|
|
||||||
|
|
||||||
|
Creates a :class:`Server`.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
name : str
|
||||||
|
The name of the server.
|
||||||
|
region : :class:`ServerRegion`
|
||||||
|
The region for the voice communication server.
|
||||||
|
Defaults to :attr`ServerRegion.us_west`.
|
||||||
|
icon : bytes
|
||||||
|
The *bytes-like* object representing the icon. See :meth:`edit_profile`
|
||||||
|
for more details on what is expected.
|
||||||
|
|
||||||
|
Raises
|
||||||
|
------
|
||||||
|
HTTPException
|
||||||
|
Server creation failed.
|
||||||
|
InvalidArgument
|
||||||
|
Invalid icon image format given. Must be PNG or JPG.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
:class:`Server`
|
||||||
|
The server created. This is not the same server that is
|
||||||
|
added to cache.
|
||||||
|
"""
|
||||||
|
if icon is not None:
|
||||||
|
icon = utils._bytes_to_base64_data(icon)
|
||||||
|
|
||||||
|
r = yield from self.session.post(endpoints.SERVERS, headers=self.headers)
|
||||||
|
log.debug(request_logging_format.format(method='POST', response=r))
|
||||||
|
yield from utils._verify_successful_response(r)
|
||||||
|
data = yield from r.json()
|
||||||
|
log.debug(request_success_log.format(response=r, json=payload, data=data))
|
||||||
|
return Server(**data)
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def edit_server(self, server, **fields):
|
||||||
|
"""|coro|
|
||||||
|
|
||||||
|
Edits a :class:`Server`.
|
||||||
|
|
||||||
|
You must have the proper permissions to edit the server.
|
||||||
|
|
||||||
|
The server is **not** edited in-place.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
server : :class:`Server`
|
||||||
|
The server to edit.
|
||||||
|
name : str
|
||||||
|
The new name of the server.
|
||||||
|
icon : bytes
|
||||||
|
A *bytes-like* object representing the icon. See :meth:`edit_profile`
|
||||||
|
for more details. Could be ``None`` to denote
|
||||||
|
region : :class:`ServerRegion`
|
||||||
|
The new region for the server's voice communication.
|
||||||
|
afk_channel : :class:`Channel`
|
||||||
|
The new channel that is the AFK channel. Could be ``None`` for no AFK channel.
|
||||||
|
afk_timeout : int
|
||||||
|
The number of seconds until someone is moved to the AFK channel.
|
||||||
|
|
||||||
|
Raises
|
||||||
|
-------
|
||||||
|
Forbidden
|
||||||
|
You do not have permissions to edit the server.
|
||||||
|
NotFound
|
||||||
|
The server you are trying to edit does not exist.
|
||||||
|
HTTPException
|
||||||
|
Editing the server failed.
|
||||||
|
InvalidArgument
|
||||||
|
The image format passed in to ``icon`` is invalid. It must be
|
||||||
|
PNG or JPG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
try:
|
||||||
|
icon_bytes = fields['icon']
|
||||||
|
except KeyError:
|
||||||
|
icon = server.icon
|
||||||
|
else:
|
||||||
|
if icon_bytes is not None:
|
||||||
|
icon = utils._bytes_to_base64_data(icon_bytes)
|
||||||
|
else:
|
||||||
|
icon = None
|
||||||
|
|
||||||
|
payload = {
|
||||||
|
'region': str(fields.get('region', server.region)),
|
||||||
|
'afk_timeout': fields.get('afk_timeout', server.afk_timeout),
|
||||||
|
'icon': icon,
|
||||||
|
'name': fields.get('name', server.name),
|
||||||
|
}
|
||||||
|
|
||||||
|
afk_channel = fields.get('afk_channel')
|
||||||
|
if afk_channel is None:
|
||||||
|
afk_channel = server.afk_channel
|
||||||
|
|
||||||
|
payload['afk_channel'] = getattr(afk_channel, 'id', None)
|
||||||
|
|
||||||
|
url = '{0}/{1.id}'.format(endpoints.SERVERS, server)
|
||||||
|
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)
|
||||||
|
@ -27,6 +27,7 @@ DEALINGS IN THE SOFTWARE.
|
|||||||
from re import split as re_split
|
from re import split as re_split
|
||||||
from .errors import HTTPException, Forbidden, NotFound, InvalidArgument
|
from .errors import HTTPException, Forbidden, NotFound, InvalidArgument
|
||||||
import datetime
|
import datetime
|
||||||
|
from base64 import b64encode
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
def parse_time(timestamp):
|
def parse_time(timestamp):
|
||||||
@ -81,6 +82,12 @@ def _get_mime_type_for_image(data):
|
|||||||
else:
|
else:
|
||||||
raise InvalidArgument('Unsupported image type given')
|
raise InvalidArgument('Unsupported image type given')
|
||||||
|
|
||||||
|
def _bytes_to_base64_data(data):
|
||||||
|
fmt = 'data:{mime};base64,{data}'
|
||||||
|
mime = _get_mime_type_for_image(data)
|
||||||
|
b64 = b64encode(data).decode('ascii')
|
||||||
|
return fmt.format(mime=mime, data=b64)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
create_task = asyncio.ensure_future
|
create_task = asyncio.ensure_future
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user