From febb8a965c8e40c3d3974d769e589a054a23bc0a Mon Sep 17 00:00:00 2001 From: Tyler Date: Tue, 18 Dec 2018 14:14:13 -0600 Subject: [PATCH] Allow additional parameters on channel creation --- discord/guild.py | 49 ++++++++++++++++++++++++++++++++++++++---------- discord/http.py | 13 ++++++------- 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/discord/guild.py b/discord/guild.py index 7f780c36a..1f62e74f0 100644 --- a/discord/guild.py +++ b/discord/guild.py @@ -555,7 +555,7 @@ class Guild(Hashable): return utils.find(pred, members) - def _create_channel(self, name, overwrites, channel_type, category=None, reason=None): + def _create_channel(self, name, overwrites, channel_type, category=None, **options): if overwrites is None: overwrites = {} elif not isinstance(overwrites, dict): @@ -580,11 +580,16 @@ class Guild(Hashable): perms.append(payload) + try: + options['rate_limit_per_user'] = options.pop('slowmode_delay') + except KeyError: + pass + parent_id = category.id if category else None - return self._state.http.create_channel(self.id, name, channel_type.value, parent_id=parent_id, - permission_overwrites=perms, reason=reason) + return self._state.http.create_channel(self.id, channel_type.value, name=name, parent_id=parent_id, + permission_overwrites=perms, **options) - async def create_text_channel(self, name, *, overwrites=None, category=None, reason=None): + async def create_text_channel(self, name, *, overwrites=None, category=None, reason=None, **options): """|coro| Creates a :class:`TextChannel` for the guild. @@ -596,6 +601,12 @@ class Guild(Hashable): channel upon creation. This parameter expects a :class:`dict` of overwrites with the target (either a :class:`Member` or a :class:`Role`) as the key and a :class:`PermissionOverwrite` as the value. + + Note + -------- + Creating a channel of a specified position will not update the position of + other channels to follow suit. A follow-up call to :meth:`~TextChannel.edit` + will be required to update the position of the channel in the channel list. Examples ---------- @@ -619,7 +630,7 @@ class Guild(Hashable): Parameters ----------- - name: str + name: :class:`str` The channel's name. overwrites A :class:`dict` of target (either a role or a member) to @@ -629,7 +640,17 @@ class Guild(Hashable): The category to place the newly created channel under. The permissions will be automatically synced to category if no overwrites are provided. - reason: Optional[str] + position: :class:`int` + The position in the channel list. This is a number that starts + at 0. e.g. the top channel is position 0. + topic: Optional[:class:`str`] + The new channel's topic. + slowmode_delay: :class:`int` + Specifies the slowmode rate limit for user in this channel. + The maximum value possible is `120`. + nsfw: :class:`bool` + To mark the channel as NSFW or not. + reason: Optional[:class:`str`] The reason for creating this channel. Shows up on the audit log. Raises @@ -646,19 +667,27 @@ class Guild(Hashable): :class:`TextChannel` The channel that was just created. """ - data = await self._create_channel(name, overwrites, ChannelType.text, category, reason=reason) + data = await self._create_channel(name, overwrites, ChannelType.text, category, reason=reason, **options) channel = TextChannel(state=self._state, guild=self, data=data) # temporarily add to the cache self._channels[channel.id] = channel return channel - async def create_voice_channel(self, name, *, overwrites=None, category=None, reason=None): + async def create_voice_channel(self, name, *, overwrites=None, category=None, reason=None, **options): """|coro| - Same as :meth:`create_text_channel` except makes a :class:`VoiceChannel` instead. + This is similar to :meth:`create_text_channel` except makes a :class:`VoiceChannel` instead, in addition + to having the following new parameters. + + Parameters + ----------- + bitrate: :class:`int` + The channel's preferred audio bitrate in bits per second. + user_limit: :class:`int` + The channel's limit for number of members that can be in a voice channel. """ - data = await self._create_channel(name, overwrites, ChannelType.voice, category, reason=reason) + data = await self._create_channel(name, overwrites, ChannelType.voice, category, reason=reason, **options) channel = VoiceChannel(state=self._state, guild=self, data=data) # temporarily add to the cache diff --git a/discord/http.py b/discord/http.py index 30b0261a6..2441ca67f 100644 --- a/discord/http.py +++ b/discord/http.py @@ -508,17 +508,16 @@ class HTTPClient: r = Route('PATCH', '/guilds/{guild_id}/channels', guild_id=guild_id) return self.request(r, json=data, reason=reason) - def create_channel(self, guild_id, name, channel_type, parent_id=None, permission_overwrites=None, *, reason=None): + def create_channel(self, guild_id, channel_type, *, reason=None, **options): payload = { - 'name': name, 'type': channel_type } - if permission_overwrites is not None: - payload['permission_overwrites'] = permission_overwrites - - if parent_id is not None: - payload['parent_id'] = parent_id + valid_keys = ('name', 'parent_id', 'topic', 'bitrate', 'nsfw', + 'user_limit', 'position', 'permission_overwrites', 'rate_limit_per_user') + payload.update({ + k: v for k, v in options.items() if k in valid_keys and v is not None + }) return self.request(Route('POST', '/guilds/{guild_id}/channels', guild_id=guild_id), json=payload, reason=reason)