aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar MarkKoz <[email protected]>2020-10-16 13:31:13 -0700
committerGravatar MarkKoz <[email protected]>2020-11-20 15:53:35 -0800
commite7d6b2ba81e3609bd52e2d0c4c9d999e7deb14e8 (patch)
treeaca0db31e70405ee7674b521232015eed31f46ff
parentHelp channels: rename modules to use singular tense (diff)
Help channels: move pin functions to a separate module
-rw-r--r--bot/exts/help_channels/_cog.py50
-rw-r--r--bot/exts/help_channels/_message.py56
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