diff --git a/discord/guild.py b/discord/guild.py index 90702fa9f..a09508a98 100644 --- a/discord/guild.py +++ b/discord/guild.py @@ -32,6 +32,8 @@ from .role import Role from .member import Member, VoiceState from .emoji import Emoji from .game import Game +from .permissions import PermissionOverwrite +from .errors import InvalidArgument from .channel import * from .enums import GuildRegion, Status, ChannelType, try_enum, VerificationLevel from .mixins import Hashable @@ -389,6 +391,101 @@ class Guild(Hashable): return utils.find(pred, members) + def _create_channel(self, name, overwrites, type): + if overwrites is None: + overwrites = {} + elif not isinstance(overwrites, dict): + raise InvalidArgument('overwrites parameter expects a dict.') + + perms = [] + for target, perm in overwrites.items(): + 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, Role): + payload['type'] = 'role' + else: + payload['type'] = 'member' + + perms.append(payload) + + return self._state.http.create_channel(self.id, name, str(type), permission_overwrites=perms) + + @asyncio.coroutine + def create_text_channel(self, name, *, overwrites=None): + """|coro| + + Creates a :class:`TextChannel` for the guild. + + Note that you need the proper permissions to create the channel. + + The ``overwrites`` parameter can be used to create a 'secret' + channel upon creation. This parameter expects a `dict` of + overwrites with the target (either a :class:`Member` or a :class:`Role`) + as the key and a :class:`PermissionOverwrite` as the value. + + Examples + ---------- + + Creating a basic channel: + + .. code-block:: python + + channel = await guild.create_text_channel('cool-channel') + + Creating a "secret" channel: + + .. code-block:: python + + overwrites = { + guild.default_role: discord.PermissionOverwrite(read_messages=False), + guild.me: discord.PermissionOverwrite(read_messages=True) + } + + channel = await guild.create_text_channel('secret', overwrites=overwrites) + + Parameters + ----------- + name: str + The channel's name. + overwrites + A `dict` of target (either a role or a member) to + :class:`PermissionOverwrite` to apply upon creation of a channel. + Useful for creating secret channels. + + Raises + ------- + Forbidden + You do not have the proper permissions to create this channel. + HTTPException + Creating the channel failed. + InvalidArgument + The permission overwrite information is not in proper form. + + Returns + ------- + :class:`TextChannel` + The channel that was just created. + """ + data = yield from self._create_channel(name, overwrites, ChannelType.text) + return TextChannel(state=self._state, guild=self, data=data) + + @asyncio.coroutine + def create_voice_channel(self, name, *, overwrites=None): + """|coro| + + Same as :meth:`create_text_channel` except makes a + :class:`VoiceChannel` instead. + """ + data = yield from self._create_channel(name, overwrites, ChannelType.voice) + return VoiceChannel(state=self._state, guild=self, data=data) @asyncio.coroutine def leave(self):