diff options
| author | Rapptz <[email protected]> | 2016-06-07 21:29:59 -0400 |
|---|---|---|
| committer | Rapptz <[email protected]> | 2016-06-07 21:29:59 -0400 |
| commit | 631cc5a7d694fe72978fc15ac73240af4c0c2143 (patch) | |
| tree | cd2fbfc833dc3155a7bdada12795cc7edd5b472b | |
| parent | Fix some typos in the FAQ page. (diff) | |
| download | discord.py-631cc5a7d694fe72978fc15ac73240af4c0c2143.tar.xz discord.py-631cc5a7d694fe72978fc15ac73240af4c0c2143.zip | |
Add Client.move_channel to change channel positions.
| -rw-r--r-- | discord/client.py | 65 |
1 files changed, 62 insertions, 3 deletions
diff --git a/discord/client.py b/discord/client.py index bd73e095..afaa3d9f 100644 --- a/discord/client.py +++ b/discord/client.py @@ -1627,6 +1627,8 @@ class Client: You must have the proper permissions to edit the channel. + To move the channel's position use :meth:`move_channel` instead. + The channel is **not** edited in-place. Parameters @@ -1635,8 +1637,6 @@ class Client: The channel to update. name : str The new channel name. - position : int - The new channel's position in the GUI. topic : str The new channel's topic. bitrate : int @@ -1656,7 +1656,6 @@ class Client: payload = { 'name': options.get('name', channel.name), 'topic': options.get('topic', channel.topic), - 'position': options.get('position', channel.position), } user_limit = options.get('user_limit') @@ -1675,6 +1674,66 @@ class Client: log.debug(request_success_log.format(response=r, json=payload, data=data)) @asyncio.coroutine + def move_channel(self, channel, position): + """|coro| + + Moves the specified :class:`Channel` to the given position in the GUI. + Note that voice channels and text channels have different position values. + + This does **not** edit the channel ordering in place. + + .. warning:: + + :class:`Object` instances do not work with this function. + + Parameters + ----------- + channel : :class:`Channel` + The channel to change positions of. + position : int + The position to insert the channel to. + + Raises + ------- + InvalidArgument + If position is less than 0 or greater than the number of channels. + Forbidden + You do not have permissions to change channel order. + HTTPException + If moving the channel failed, or you are of too low rank to move the channel. + """ + + if position < 0: + raise InvalidArgument('Channel position cannot be less than 0.') + + url = '{0}/{1.server.id}/channels'.format(endpoints.SERVERS, channel) + channels = [c for c in channel.server.channels if c.type is channel.type] + + if position >= len(channels): + raise InvalidArgument('Channel position cannot be greater than {}'.format(len(channels) - 1)) + + channels.sort(key=lambda c: c.position) + + try: + # remove ourselves from the channel list + channels.remove(channel) + except ValueError: + # not there somehow lol + return + else: + # add ourselves at our designated position + channels.insert(position, channel) + + payload = [{'id': c.id, 'position': index } for index, c in enumerate(channels)] + + r = yield from self.session.patch(url, data=utils.to_json(payload), headers=self.headers) + log.debug(request_logging_format.format(method='PATCH', response=r)) + yield from utils._verify_successful_response(r) + + yield from r.release() + log.debug(request_success_log.format(json=payload, response=r, data={})) + + @asyncio.coroutine def create_channel(self, server, name, type=None): """|coro| |