|
|
@ -36,7 +36,7 @@ from .object import Object |
|
|
|
from .role import Role |
|
|
|
from .errors import * |
|
|
|
from .state import ConnectionState |
|
|
|
from .permissions import Permissions |
|
|
|
from .permissions import Permissions, PermissionOverwrite |
|
|
|
from . import utils, compat |
|
|
|
from .enums import ChannelType, ServerRegion |
|
|
|
from .voice_client import VoiceClient |
|
|
@ -71,6 +71,9 @@ def app_info_icon_url(self): |
|
|
|
|
|
|
|
AppInfo.icon_url = property(app_info_icon_url) |
|
|
|
|
|
|
|
ChannelPermissions = namedtuple('ChannelPermissions', 'target overwrite') |
|
|
|
ChannelPermissions.__new__.__defaults__ = (PermissionOverwrite(),) |
|
|
|
|
|
|
|
class Client: |
|
|
|
"""Represents a client connection that connects to Discord. |
|
|
|
This class is used to interact with the Discord WebSocket and API. |
|
|
@ -1542,13 +1545,47 @@ class Client: |
|
|
|
yield from self.http.patch(url, json=payload, bucket='move_channel') |
|
|
|
|
|
|
|
@asyncio.coroutine |
|
|
|
def create_channel(self, server, name, type=None): |
|
|
|
def create_channel(self, server, name, *overwrites, type=None): |
|
|
|
"""|coro| |
|
|
|
|
|
|
|
Creates a :class:`Channel` in the specified :class:`Server`. |
|
|
|
|
|
|
|
Note that you need the proper permissions to create the channel. |
|
|
|
|
|
|
|
The ``overwrites`` argument list can be used to create a 'secret' |
|
|
|
channel upon creation. A namedtuple of :class:`ChannelPermissions` |
|
|
|
is exposed to create a channel-specific permission overwrite in a more |
|
|
|
self-documenting matter. You can also use a regular tuple of ``(target, overwrite)`` |
|
|
|
where the ``overwrite`` expected has to be of type :class:`PermissionOverwrite`. |
|
|
|
|
|
|
|
Examples |
|
|
|
---------- |
|
|
|
|
|
|
|
Creating a voice channel: |
|
|
|
|
|
|
|
.. code-block:: python |
|
|
|
|
|
|
|
await client.create_channel(server, 'Voice', type=discord.ChannelType.voice) |
|
|
|
|
|
|
|
Creating a 'secret' text channel: |
|
|
|
|
|
|
|
.. code-block:: python |
|
|
|
|
|
|
|
everyone_perms = discord.PermissionOverwrite(read_messages=False) |
|
|
|
my_perms = discord.PermissionOverwrite(read_messages=True) |
|
|
|
|
|
|
|
everyone = discord.ChannelPermissions(target=server.default_role, overwrite=everyone_perms) |
|
|
|
mine = discord.ChannelPermissions(target=server.me, overwrite=my_perms) |
|
|
|
await client.create_channel(server, 'secret', everyone, mine) |
|
|
|
|
|
|
|
Or in a more 'compact' way: |
|
|
|
|
|
|
|
.. code-block:: python |
|
|
|
|
|
|
|
everyone = discord.PermissionOverwrite(read_messages=False) |
|
|
|
mine = discord.PermissionOverwrite(read_messages=True) |
|
|
|
await client.create_channel(server, 'secret', (server.default_role, everyone), (server.me, mine)) |
|
|
|
|
|
|
|
Parameters |
|
|
|
----------- |
|
|
|
server : :class:`Server` |
|
|
@ -1557,6 +1594,9 @@ class Client: |
|
|
|
The channel's name. |
|
|
|
type : :class:`ChannelType` |
|
|
|
The type of channel to create. Defaults to :attr:`ChannelType.text`. |
|
|
|
overwrites: |
|
|
|
An argument list of channel specific overwrites to apply on the channel on |
|
|
|
creation. Useful for creating 'secret' channels. |
|
|
|
|
|
|
|
Raises |
|
|
|
------- |
|
|
@ -1566,6 +1606,8 @@ class Client: |
|
|
|
The server specified was not found. |
|
|
|
HTTPException |
|
|
|
Creating the channel failed. |
|
|
|
InvalidArgument |
|
|
|
The permission overwrite array is not in proper form. |
|
|
|
|
|
|
|
Returns |
|
|
|
------- |
|
|
@ -1577,7 +1619,30 @@ class Client: |
|
|
|
if type is None: |
|
|
|
type = ChannelType.text |
|
|
|
|
|
|
|
data = yield from self.http.create_channel(server.id, name, str(type)) |
|
|
|
perms = [] |
|
|
|
for overwrite in overwrites: |
|
|
|
target = overwrite[0] |
|
|
|
perm = overwrite[1] |
|
|
|
if not isinstance(perm, PermissionOverwrite): |
|
|
|
raise InvalidArgument('Expected PermissionOverwrite received {0.__name__}'.format(type(perm))) |
|
|
|
|
|
|
|
allow, deny = perm.pair() |
|
|
|
payload = { |
|
|
|
'allow': allow.value, |
|
|
|
'deny': deny.value, |
|
|
|
'id': target.id |
|
|
|
} |
|
|
|
|
|
|
|
if isinstance(target, User): |
|
|
|
payload['type'] = 'member' |
|
|
|
elif isinstance(target, Role): |
|
|
|
payload['type'] = 'role' |
|
|
|
else: |
|
|
|
raise InvalidArgument('Expected Role, User, or Member target, received {0.__name__}'.format(type(target))) |
|
|
|
|
|
|
|
perms.append(payload) |
|
|
|
|
|
|
|
data = yield from self.http.create_channel(server.id, name, str(type), permission_overwrites=perms) |
|
|
|
channel = Channel(server=server, **data) |
|
|
|
return channel |
|
|
|
|
|
|
|