From 36de1ea49bb6597179bf9931adfef41ed59e5d5f Mon Sep 17 00:00:00 2001 From: ks129 <45097959+ks129@users.noreply.github.com> Date: Thu, 2 Jul 2020 15:53:22 +0300 Subject: Help System: Implement question message pinning --- bot/cogs/help_channels.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/bot/cogs/help_channels.py b/bot/cogs/help_channels.py index 187adfe51..bb97759ee 100644 --- a/bot/cogs/help_channels.py +++ b/bot/cogs/help_channels.py @@ -113,6 +113,10 @@ class HelpChannels(Scheduler, 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): super().__init__() @@ -548,6 +552,22 @@ class HelpChannels(Scheduler, commands.Cog): A caller argument is provided for metrics. """ + msg_id = await self.question_messages.pop(channel.id) + + # When message ID exist in cache, try to get it from cache first. When this fail, use API request. + # When this return 404, this mean that message is deleted and can't be unpinned. + if msg_id: + msg = discord.utils.get(self.bot.cached_messages, id=msg_id) + if msg is None: + try: + msg = await channel.fetch_message(msg_id) + except discord.NotFound: + log.debug(f"Can't unpin message {msg_id} because this is deleted.") + + # When we got message, then unpin it + if msg: + await msg.unpin() + log.info(f"Moving #{channel} ({channel.id}) to the Dormant category.") await self.move_to_bottom_position( @@ -688,6 +708,14 @@ class HelpChannels(Scheduler, commands.Cog): log.info(f"Channel #{channel} was claimed by `{message.author.id}`.") await self.move_to_in_use(channel) await self.revoke_send_permissions(message.author) + # Pin message for better access and storage this to cache + try: + await message.pin() + except discord.NotFound: + log.info(f"Pinning message {message.id} ({channel}) failed because message got deleted.") + else: + await self.question_messages.set(channel.id, message.id) + # Add user with channel for dormant check. await self.help_channel_claimants.set(channel.id, message.author.id) -- cgit v1.2.3 From a201e76c805fe69e70e39bbd8a24f81ee5d0fe9b Mon Sep 17 00:00:00 2001 From: ks129 <45097959+ks129@users.noreply.github.com> Date: Wed, 8 Jul 2020 21:39:17 +0300 Subject: Help Channels: Simplify unpinning Remove complex None checking message fetching and replace it with `bot.http.unpin_message` and catch exception when message don't exist. --- bot/cogs/help_channels.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/bot/cogs/help_channels.py b/bot/cogs/help_channels.py index bb97759ee..9313efc67 100644 --- a/bot/cogs/help_channels.py +++ b/bot/cogs/help_channels.py @@ -554,19 +554,12 @@ class HelpChannels(Scheduler, commands.Cog): """ msg_id = await self.question_messages.pop(channel.id) - # When message ID exist in cache, try to get it from cache first. When this fail, use API request. - # When this return 404, this mean that message is deleted and can't be unpinned. - if msg_id: - msg = discord.utils.get(self.bot.cached_messages, id=msg_id) - if msg is None: - try: - msg = await channel.fetch_message(msg_id) - except discord.NotFound: - log.debug(f"Can't unpin message {msg_id} because this is deleted.") - - # When we got message, then unpin it - if msg: - await msg.unpin() + try: + await self.bot.http.unpin_message(channel.id, msg_id) + except discord.HTTPException: + log.trace(f"Message {msg_id} don't exist, can't unpin.") + else: + log.trace(f"Unpinned message {msg_id}.") log.info(f"Moving #{channel} ({channel.id}) to the Dormant category.") -- cgit v1.2.3 From de924691e4967b85424fe6e802d7f92846bb0850 Mon Sep 17 00:00:00 2001 From: Dennis Pham Date: Sat, 11 Jul 2020 21:46:12 -0400 Subject: Fix comment --- bot/cogs/help_channels.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bot/cogs/help_channels.py b/bot/cogs/help_channels.py index 9313efc67..b06934eff 100644 --- a/bot/cogs/help_channels.py +++ b/bot/cogs/help_channels.py @@ -701,7 +701,7 @@ class HelpChannels(Scheduler, commands.Cog): log.info(f"Channel #{channel} was claimed by `{message.author.id}`.") await self.move_to_in_use(channel) await self.revoke_send_permissions(message.author) - # Pin message for better access and storage this to cache + # Pin message for better access and store this to cache try: await message.pin() except discord.NotFound: -- cgit v1.2.3 From f3fb8190c7c9541146ed79df2b0ad906fc067414 Mon Sep 17 00:00:00 2001 From: ks129 <45097959+ks129@users.noreply.github.com> Date: Tue, 28 Jul 2020 21:24:25 +0300 Subject: Handle message unpinning better --- bot/cogs/help_channels.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bot/cogs/help_channels.py b/bot/cogs/help_channels.py index b06934eff..2c53069f0 100644 --- a/bot/cogs/help_channels.py +++ b/bot/cogs/help_channels.py @@ -556,8 +556,11 @@ class HelpChannels(Scheduler, commands.Cog): try: await self.bot.http.unpin_message(channel.id, msg_id) - except discord.HTTPException: - log.trace(f"Message {msg_id} don't exist, can't unpin.") + except discord.HTTPException as e: + if e.code == 10008: + log.trace(f"Message {msg_id} don't exist, can't unpin.") + else: + log.warn(f"Got unexpected status {e.code} when unpinning message {msg_id}: {e.text}") else: log.trace(f"Unpinned message {msg_id}.") -- cgit v1.2.3