Browse Source

Add a way to set permission overwrites when creating a channel.

pull/245/merge
Rapptz 9 years ago
parent
commit
f0fc70b2cf
  1. 2
      discord/__init__.py
  2. 71
      discord/client.py
  3. 5
      discord/http.py

2
discord/__init__.py

@ -17,7 +17,7 @@ __license__ = 'MIT'
__copyright__ = 'Copyright 2015-2016 Rapptz' __copyright__ = 'Copyright 2015-2016 Rapptz'
__version__ = '0.10.0-alpha' __version__ = '0.10.0-alpha'
from .client import Client, AppInfo from .client import Client, AppInfo, ChannelPermissions
from .user import User from .user import User
from .game import Game from .game import Game
from .channel import Channel, PrivateChannel from .channel import Channel, PrivateChannel

71
discord/client.py

@ -36,7 +36,7 @@ from .object import Object
from .role import Role from .role import Role
from .errors import * from .errors import *
from .state import ConnectionState from .state import ConnectionState
from .permissions import Permissions from .permissions import Permissions, PermissionOverwrite
from . import utils, compat from . import utils, compat
from .enums import ChannelType, ServerRegion from .enums import ChannelType, ServerRegion
from .voice_client import VoiceClient from .voice_client import VoiceClient
@ -71,6 +71,9 @@ def app_info_icon_url(self):
AppInfo.icon_url = property(app_info_icon_url) AppInfo.icon_url = property(app_info_icon_url)
ChannelPermissions = namedtuple('ChannelPermissions', 'target overwrite')
ChannelPermissions.__new__.__defaults__ = (PermissionOverwrite(),)
class Client: class Client:
"""Represents a client connection that connects to Discord. """Represents a client connection that connects to Discord.
This class is used to interact with the Discord WebSocket and API. 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') yield from self.http.patch(url, json=payload, bucket='move_channel')
@asyncio.coroutine @asyncio.coroutine
def create_channel(self, server, name, type=None): def create_channel(self, server, name, *overwrites, type=None):
"""|coro| """|coro|
Creates a :class:`Channel` in the specified :class:`Server`. Creates a :class:`Channel` in the specified :class:`Server`.
Note that you need the proper permissions to create the channel. 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 Parameters
----------- -----------
server : :class:`Server` server : :class:`Server`
@ -1557,6 +1594,9 @@ class Client:
The channel's name. The channel's name.
type : :class:`ChannelType` type : :class:`ChannelType`
The type of channel to create. Defaults to :attr:`ChannelType.text`. 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 Raises
------- -------
@ -1566,6 +1606,8 @@ class Client:
The server specified was not found. The server specified was not found.
HTTPException HTTPException
Creating the channel failed. Creating the channel failed.
InvalidArgument
The permission overwrite array is not in proper form.
Returns Returns
------- -------
@ -1577,7 +1619,30 @@ class Client:
if type is None: if type is None:
type = ChannelType.text 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) channel = Channel(server=server, **data)
return channel return channel

5
discord/http.py

@ -344,13 +344,16 @@ class HTTPClient:
return self.patch(url, json=payload, bucket=_func_()) return self.patch(url, json=payload, bucket=_func_())
def create_channel(self, guild_id, name, channe_type): def create_channel(self, guild_id, name, channe_type, permission_overwrites=None):
url = '{0.GUILDS}/{1}/channels'.format(self, guild_id) url = '{0.GUILDS}/{1}/channels'.format(self, guild_id)
payload = { payload = {
'name': name, 'name': name,
'type': channe_type 'type': channe_type
} }
if permission_overwrites is not None:
payload['permission_overwrites'] = permission_overwrites
return self.post(url, json=payload, bucket=_func_()) return self.post(url, json=payload, bucket=_func_())
def delete_channel(self, channel_id): def delete_channel(self, channel_id):

Loading…
Cancel
Save