diff options
| author | 2021-01-03 11:36:13 -0800 | |
|---|---|---|
| committer | 2021-01-04 23:19:55 -0800 | |
| commit | e281bb4981cd16cdc716c2fb28b470c310700ab9 (patch) | |
| tree | fdc3826dfc587aac1e859d7b0ff093431421e7b8 | |
| parent | HelpChannels: prevent user from claiming multiple channels quickly (diff) | |
HelpChannels: move function to the channel module
Diffstat (limited to '')
| -rw-r--r-- | bot/exts/help_channels/_channel.py | 42 | ||||
| -rw-r--r-- | bot/exts/help_channels/_cog.py | 45 | 
2 files changed, 45 insertions, 42 deletions
diff --git a/bot/exts/help_channels/_channel.py b/bot/exts/help_channels/_channel.py index e717d7af8..224214b00 100644 --- a/bot/exts/help_channels/_channel.py +++ b/bot/exts/help_channels/_channel.py @@ -4,8 +4,10 @@ from datetime import datetime, timedelta  import discord +import bot  from bot import constants  from bot.exts.help_channels import _caches, _message +from bot.utils.channel import try_get_channel  log = logging.getLogger(__name__) @@ -55,3 +57,43 @@ async def get_in_use_time(channel_id: int) -> t.Optional[timedelta]:  def is_excluded_channel(channel: discord.abc.GuildChannel) -> bool:      """Check if a channel should be excluded from the help channel system."""      return not isinstance(channel, discord.TextChannel) or channel.id in EXCLUDED_CHANNELS + + +async def move_to_bottom(channel: discord.TextChannel, category_id: int, **options) -> None: +    """ +    Move the `channel` to the bottom position of `category` and edit channel attributes. + +    To ensure "stable sorting", we use the `bulk_channel_update` endpoint and provide the current +    positions of the other channels in the category as-is. This should make sure that the channel +    really ends up at the bottom of the category. + +    If `options` are provided, the channel will be edited after the move is completed. This is the +    same order of operations that `discord.TextChannel.edit` uses. For information on available +    options, see the documentation on `discord.TextChannel.edit`. While possible, position-related +    options should be avoided, as it may interfere with the category move we perform. +    """ +    # Get a fresh copy of the category from the bot to avoid the cache mismatch issue we had. +    category = await try_get_channel(category_id) + +    payload = [{"id": c.id, "position": c.position} for c in category.channels] + +    # Calculate the bottom position based on the current highest position in the category. If the +    # category is currently empty, we simply use the current position of the channel to avoid making +    # unnecessary changes to positions in the guild. +    bottom_position = payload[-1]["position"] + 1 if payload else channel.position + +    payload.append( +        { +            "id": channel.id, +            "position": bottom_position, +            "parent_id": category.id, +            "lock_permissions": True, +        } +    ) + +    # We use d.py's method to ensure our request is processed by d.py's rate limit manager +    await bot.instance.http.bulk_channel_update(category.guild.id, payload) + +    # Now that the channel is moved, we can edit the other attributes +    if options: +        await channel.edit(**options) diff --git a/bot/exts/help_channels/_cog.py b/bot/exts/help_channels/_cog.py index 5695d0d05..f25bf132c 100644 --- a/bot/exts/help_channels/_cog.py +++ b/bot/exts/help_channels/_cog.py @@ -325,45 +325,6 @@ class HelpChannels(commands.Cog):              self.scheduler.schedule_later(delay, channel.id, self.move_idle_channel(channel)) -    async def move_to_bottom_position(self, channel: discord.TextChannel, category_id: int, **options) -> None: -        """ -        Move the `channel` to the bottom position of `category` and edit channel attributes. - -        To ensure "stable sorting", we use the `bulk_channel_update` endpoint and provide the current -        positions of the other channels in the category as-is. This should make sure that the channel -        really ends up at the bottom of the category. - -        If `options` are provided, the channel will be edited after the move is completed. This is the -        same order of operations that `discord.TextChannel.edit` uses. For information on available -        options, see the documentation on `discord.TextChannel.edit`. While possible, position-related -        options should be avoided, as it may interfere with the category move we perform. -        """ -        # Get a fresh copy of the category from the bot to avoid the cache mismatch issue we had. -        category = await channel_utils.try_get_channel(category_id) - -        payload = [{"id": c.id, "position": c.position} for c in category.channels] - -        # Calculate the bottom position based on the current highest position in the category. If the -        # category is currently empty, we simply use the current position of the channel to avoid making -        # unnecessary changes to positions in the guild. -        bottom_position = payload[-1]["position"] + 1 if payload else channel.position - -        payload.append( -            { -                "id": channel.id, -                "position": bottom_position, -                "parent_id": category.id, -                "lock_permissions": True, -            } -        ) - -        # We use d.py's method to ensure our request is processed by d.py's rate limit manager -        await self.bot.http.bulk_channel_update(category.guild.id, payload) - -        # Now that the channel is moved, we can edit the other attributes -        if options: -            await channel.edit(**options) -      async def move_to_available(self) -> None:          """Make a channel available."""          log.trace("Making a channel available.") @@ -375,7 +336,7 @@ class HelpChannels(commands.Cog):          log.trace(f"Moving #{channel} ({channel.id}) to the Available category.") -        await self.move_to_bottom_position( +        await _channel.move_to_bottom(              channel=channel,              category_id=constants.Categories.help_available,          ) @@ -390,7 +351,7 @@ class HelpChannels(commands.Cog):          """          log.info(f"Moving #{channel} ({channel.id}) to the Dormant category.") -        await self.move_to_bottom_position( +        await _channel.move_to_bottom(              channel=channel,              category_id=constants.Categories.help_dormant,          ) @@ -446,7 +407,7 @@ class HelpChannels(commands.Cog):          """Make a channel in-use and schedule it to be made dormant."""          log.info(f"Moving #{channel} ({channel.id}) to the In Use category.") -        await self.move_to_bottom_position( +        await _channel.move_to_bottom(              channel=channel,              category_id=constants.Categories.help_in_use,          )  |