diff options
| author | 2020-10-16 13:31:13 -0700 | |
|---|---|---|
| committer | 2020-11-20 15:53:35 -0800 | |
| commit | e7d6b2ba81e3609bd52e2d0c4c9d999e7deb14e8 (patch) | |
| tree | aca0db31e70405ee7674b521232015eed31f46ff | |
| parent | Help channels: rename modules to use singular tense (diff) | |
Help channels: move pin functions to a separate module
Diffstat (limited to '')
| -rw-r--r-- | bot/exts/help_channels/_cog.py | 50 | ||||
| -rw-r--r-- | bot/exts/help_channels/_message.py | 56 | 
2 files changed, 59 insertions, 47 deletions
diff --git a/bot/exts/help_channels/_cog.py b/bot/exts/help_channels/_cog.py index e58660af8..b3d720b24 100644 --- a/bot/exts/help_channels/_cog.py +++ b/bot/exts/help_channels/_cog.py @@ -12,6 +12,7 @@ from discord.ext import commands  from bot import constants  from bot.bot import Bot  from bot.exts.help_channels import _channel +from bot.exts.help_channels._message import pin, unpin  from bot.exts.help_channels._name import create_name_queue  from bot.utils import channel as channel_utils  from bot.utils.scheduling import Scheduler @@ -103,10 +104,6 @@ class HelpChannels(commands.Cog):      # RedisCache[discord.TextChannel.id, UtcPosixTimestamp]      claim_times = RedisCache() -    # This cache maps a help channel to original question message in same channel. -    # RedisCache[discord.TextChannel.id, discord.Message.id] -    question_messages = RedisCache() -      def __init__(self, bot: Bot):          self.bot = bot          self.scheduler = Scheduler(self.__class__.__name__) @@ -495,7 +492,7 @@ class HelpChannels(commands.Cog):          embed = discord.Embed(description=DORMANT_MSG)          await channel.send(embed=embed) -        await self.unpin(channel) +        await unpin(channel)          log.trace(f"Pushing #{channel} ({channel.id}) into the channel queue.")          self.channel_queue.put_nowait(channel) @@ -616,7 +613,7 @@ class HelpChannels(commands.Cog):              await self.move_to_in_use(channel)              await self.revoke_send_permissions(message.author) -            await self.pin(message) +            await pin(message)              # Add user with channel for dormant check.              await self.help_channel_claimants.set(channel.id, message.author.id) @@ -773,47 +770,6 @@ class HelpChannels(commands.Cog):              log.trace(f"Dormant message not found in {channel_info}; sending a new message.")              await channel.send(embed=embed) -    async def pin_wrapper(self, msg_id: int, channel: discord.TextChannel, *, pin: bool) -> bool: -        """ -        Pin message `msg_id` in `channel` if `pin` is True or unpin if it's False. - -        Return True if successful and False otherwise. -        """ -        channel_str = f"#{channel} ({channel.id})" -        if pin: -            func = self.bot.http.pin_message -            verb = "pin" -        else: -            func = self.bot.http.unpin_message -            verb = "unpin" - -        try: -            await func(channel.id, msg_id) -        except discord.HTTPException as e: -            if e.code == 10008: -                log.debug(f"Message {msg_id} in {channel_str} doesn't exist; can't {verb}.") -            else: -                log.exception( -                    f"Error {verb}ning message {msg_id} in {channel_str}: {e.status} ({e.code})" -                ) -            return False -        else: -            log.trace(f"{verb.capitalize()}ned message {msg_id} in {channel_str}.") -            return True - -    async def pin(self, message: discord.Message) -> None: -        """Pin an initial question `message` and store it in a cache.""" -        if await self.pin_wrapper(message.id, message.channel, pin=True): -            await self.question_messages.set(message.channel.id, message.id) - -    async def unpin(self, channel: discord.TextChannel) -> None: -        """Unpin the initial question message sent in `channel`.""" -        msg_id = await self.question_messages.pop(channel.id) -        if msg_id is None: -            log.debug(f"#{channel} ({channel.id}) doesn't have a message pinned.") -        else: -            await self.pin_wrapper(msg_id, channel, pin=False) -      async def wait_for_dormant_channel(self) -> discord.TextChannel:          """Wait for a dormant channel to become available in the queue and return it."""          log.trace("Waiting for a dormant channel.") diff --git a/bot/exts/help_channels/_message.py b/bot/exts/help_channels/_message.py new file mode 100644 index 000000000..e593aacc9 --- /dev/null +++ b/bot/exts/help_channels/_message.py @@ -0,0 +1,56 @@ +import logging + +import discord +from async_rediscache import RedisCache + +import bot + +log = logging.getLogger(__name__) + +# This cache maps a help channel to original question message in same channel. +# RedisCache[discord.TextChannel.id, discord.Message.id] +_question_messages = RedisCache(namespace="HelpChannels.question_messages") + + +async def pin(message: discord.Message) -> None: +    """Pin an initial question `message` and store it in a cache.""" +    if await _pin_wrapper(message.id, message.channel, pin=True): +        await _question_messages.set(message.channel.id, message.id) + + +async def unpin(channel: discord.TextChannel) -> None: +    """Unpin the initial question message sent in `channel`.""" +    msg_id = await _question_messages.pop(channel.id) +    if msg_id is None: +        log.debug(f"#{channel} ({channel.id}) doesn't have a message pinned.") +    else: +        await _pin_wrapper(msg_id, channel, pin=False) + + +async def _pin_wrapper(msg_id: int, channel: discord.TextChannel, *, pin: bool) -> bool: +    """ +    Pin message `msg_id` in `channel` if `pin` is True or unpin if it's False. + +    Return True if successful and False otherwise. +    """ +    channel_str = f"#{channel} ({channel.id})" +    if pin: +        func = bot.instance.http.pin_message +        verb = "pin" +    else: +        func = bot.instance.http.unpin_message +        verb = "unpin" + +    try: +        await func(channel.id, msg_id) +    except discord.HTTPException as e: +        if e.code == 10008: +            log.debug(f"Message {msg_id} in {channel_str} doesn't exist; can't {verb}.") +        else: +            log.exception( +                f"Error {verb}ning message {msg_id} in {channel_str}: {e.status} ({e.code})" +            ) +        return False +    else: +        log.trace(f"{verb.capitalize()}ned message {msg_id} in {channel_str}.") +        return True  |