aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar MarkKoz <[email protected]>2020-05-07 21:46:39 -0700
committerGravatar MarkKoz <[email protected]>2020-06-13 11:21:09 -0700
commit211aad8fc14ec81cb6e04cfaf70f6e50221bbc57 (patch)
tree92ed45207862d951ee0a8ba4afc45a0e56c1bc8b
parentCode block: document the cog (diff)
Move some functions into a new channel utility module
* Change `is_help_channel` to`internally use `is_in_category`
-rw-r--r--bot/cogs/codeblock/cog.py14
-rw-r--r--bot/cogs/help_channels.py43
-rw-r--r--bot/utils/channel.py34
3 files changed, 54 insertions, 37 deletions
diff --git a/bot/cogs/codeblock/cog.py b/bot/cogs/codeblock/cog.py
index c1b2b1c68..3c119814f 100644
--- a/bot/cogs/codeblock/cog.py
+++ b/bot/cogs/codeblock/cog.py
@@ -7,7 +7,8 @@ from discord import Message, RawMessageUpdateEvent
from discord.ext.commands import Bot, Cog
from bot.cogs.token_remover import TokenRemover
-from bot.constants import Categories, Channels, DEBUG_MODE
+from bot.constants import Channels, DEBUG_MODE
+from bot.utils.channel import is_help_channel
from bot.utils.messages import wait_for_deletion
from .instructions import get_instructions
@@ -85,15 +86,6 @@ class CodeBlockCog(Cog, name="Code Block"):
log.debug("Could not find instructions message; it was probably deleted.")
return None
- @staticmethod
- def is_help_channel(channel: discord.TextChannel) -> bool:
- """Return True if `channel` is in one of the help categories."""
- log.trace(f"Checking if #{channel} is a help channel.")
- return (
- getattr(channel, "category", None)
- and channel.category.id in (Categories.help_available, Categories.help_in_use)
- )
-
def is_on_cooldown(self, channel: discord.TextChannel) -> bool:
"""
Return True if an embed was sent for `channel` in the last 300 seconds.
@@ -107,7 +99,7 @@ class CodeBlockCog(Cog, name="Code Block"):
"""Return True if `channel` is a help channel, may be on a cooldown, or is whitelisted."""
log.trace(f"Checking if #{channel} qualifies for code block detection.")
return (
- self.is_help_channel(channel)
+ is_help_channel(channel)
or channel.id in self.channel_cooldowns
or channel.id in self.channel_whitelist
)
diff --git a/bot/cogs/help_channels.py b/bot/cogs/help_channels.py
index 6ff285c37..513ce31d0 100644
--- a/bot/cogs/help_channels.py
+++ b/bot/cogs/help_channels.py
@@ -15,6 +15,7 @@ from discord.ext import commands
from bot import constants
from bot.bot import Bot
+from bot.utils import channel as channel_utils
from bot.utils.checks import with_role_check
from bot.utils.scheduling import Scheduler
@@ -370,11 +371,18 @@ class HelpChannels(Scheduler, commands.Cog):
log.trace("Getting the CategoryChannel objects for the help categories.")
try:
- self.available_category = await self.try_get_channel(
- constants.Categories.help_available
+ self.available_category = await channel_utils.try_get_channel(
+ constants.Categories.help_available,
+ self.bot
+ )
+ self.in_use_category = await channel_utils.try_get_channel(
+ constants.Categories.help_in_use,
+ self.bot
+ )
+ self.dormant_category = await channel_utils.try_get_channel(
+ constants.Categories.help_dormant,
+ self.bot
)
- self.in_use_category = await self.try_get_channel(constants.Categories.help_in_use)
- self.dormant_category = await self.try_get_channel(constants.Categories.help_dormant)
except discord.HTTPException:
log.exception("Failed to get a category; cog will be removed")
self.bot.remove_cog(self.qualified_name)
@@ -431,12 +439,6 @@ class HelpChannels(Scheduler, commands.Cog):
embed = message.embeds[0]
return message.author == self.bot.user and embed.description.strip() == description.strip()
- @staticmethod
- def is_in_category(channel: discord.TextChannel, category_id: int) -> bool:
- """Return True if `channel` is within a category with `category_id`."""
- actual_category = getattr(channel, "category", None)
- return actual_category is not None and actual_category.id == category_id
-
async def move_idle_channel(self, channel: discord.TextChannel, has_task: bool = True) -> None:
"""
Make the `channel` dormant if idle or schedule the move if still active.
@@ -488,7 +490,7 @@ class HelpChannels(Scheduler, commands.Cog):
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 self.try_get_channel(category_id)
+ category = await channel_utils.try_get_channel(category_id, self.bot)
payload = [{"id": c.id, "position": c.position} for c in category.channels]
@@ -634,7 +636,7 @@ class HelpChannels(Scheduler, commands.Cog):
channel = message.channel
# Confirm the channel is an in use help channel
- if self.is_in_category(channel, constants.Categories.help_in_use):
+ if channel_utils.is_in_category(channel, constants.Categories.help_in_use):
log.trace(f"Checking if #{channel} ({channel.id}) has been answered.")
# Check if there is an entry in unanswered (does not persist across restarts)
@@ -659,7 +661,8 @@ class HelpChannels(Scheduler, commands.Cog):
await self.check_for_answer(message)
- if not self.is_in_category(channel, constants.Categories.help_available) or self.is_excluded_channel(channel):
+ is_available = channel_utils.is_in_category(channel, constants.Categories.help_available)
+ if not is_available or self.is_excluded_channel(channel):
return # Ignore messages outside the Available category or in excluded channels.
log.trace("Waiting for the cog to be ready before processing messages.")
@@ -669,7 +672,7 @@ class HelpChannels(Scheduler, commands.Cog):
async with self.on_message_lock:
log.trace(f"on_message lock acquired for {message.id}.")
- if not self.is_in_category(channel, constants.Categories.help_available):
+ if not channel_utils.is_in_category(channel, constants.Categories.help_available):
log.debug(
f"Message {message.id} will not make #{channel} ({channel.id}) in-use "
f"because another message in the channel already triggered that."
@@ -802,18 +805,6 @@ class HelpChannels(Scheduler, commands.Cog):
log.trace(f"Dormant message not found in {channel_info}; sending a new message.")
await channel.send(embed=embed)
- async def try_get_channel(self, channel_id: int) -> discord.abc.GuildChannel:
- """Attempt to get or fetch a channel and return it."""
- log.trace(f"Getting the channel {channel_id}.")
-
- channel = self.bot.get_channel(channel_id)
- if not channel:
- log.debug(f"Channel {channel_id} is not in cache; fetching from API.")
- channel = await self.bot.fetch_channel(channel_id)
-
- log.trace(f"Channel #{channel} ({channel_id}) retrieved.")
- return channel
-
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/utils/channel.py b/bot/utils/channel.py
new file mode 100644
index 000000000..47f70ce31
--- /dev/null
+++ b/bot/utils/channel.py
@@ -0,0 +1,34 @@
+import logging
+
+import discord
+
+from bot.constants import Categories
+
+log = logging.getLogger(__name__)
+
+
+def is_help_channel(channel: discord.TextChannel) -> bool:
+ """Return True if `channel` is in one of the help categories (excluding dormant)."""
+ log.trace(f"Checking if #{channel} is a help channel.")
+ categories = (Categories.help_available, Categories.help_in_use)
+
+ return any(is_in_category(channel, category) for category in categories)
+
+
+def is_in_category(channel: discord.TextChannel, category_id: int) -> bool:
+ """Return True if `channel` is within a category with `category_id`."""
+ actual_category = getattr(channel, "category", None)
+ return actual_category is not None and actual_category.id == category_id
+
+
+async def try_get_channel(channel_id: int, client: discord.Client) -> discord.abc.GuildChannel:
+ """Attempt to get or fetch a channel and return it."""
+ log.trace(f"Getting the channel {channel_id}.")
+
+ channel = client.get_channel(channel_id)
+ if not channel:
+ log.debug(f"Channel {channel_id} is not in cache; fetching from API.")
+ channel = await client.fetch_channel(channel_id)
+
+ log.trace(f"Channel #{channel} ({channel_id}) retrieved.")
+ return channel