aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Sebastiaan Zeeff <[email protected]>2020-05-24 19:54:59 +0200
committerGravatar GitHub <[email protected]>2020-05-24 19:54:59 +0200
commitb25619567d5d1ceee939d4b17c1a90ae9ac337bf (patch)
tree731ae107f009f44b02a06a3856d96fdbf59ad3f8
parentMerge pull request #934 from python-discord/bug/filters/933/dont-delete-in-dms (diff)
parentMerge branch 'master' into help-channels-delete (diff)
Merge pull request #956 from ks129/help-channels-delete
Help System: Move dormant faster if help channel is empty
-rw-r--r--bot/cogs/help_channels.py40
-rw-r--r--bot/constants.py1
-rw-r--r--config-default.yml4
3 files changed, 40 insertions, 5 deletions
diff --git a/bot/cogs/help_channels.py b/bot/cogs/help_channels.py
index 1bd1f9d68..f0e6746f0 100644
--- a/bot/cogs/help_channels.py
+++ b/bot/cogs/help_channels.py
@@ -438,13 +438,13 @@ class HelpChannels(Scheduler, commands.Cog):
"""Return True if `member` has the 'Help Cooldown' role."""
return any(constants.Roles.help_cooldown == role.id for role in member.roles)
- def is_dormant_message(self, message: t.Optional[discord.Message]) -> bool:
- """Return True if the contents of the `message` match `DORMANT_MSG`."""
+ def match_bot_embed(self, message: t.Optional[discord.Message], description: str) -> bool:
+ """Return `True` if the bot's `message`'s embed description matches `description`."""
if not message or not message.embeds:
return False
embed = message.embeds[0]
- return message.author == self.bot.user and embed.description.strip() == DORMANT_MSG.strip()
+ return message.author == self.bot.user and embed.description.strip() == description.strip()
@staticmethod
def is_in_category(channel: discord.TextChannel, category_id: int) -> bool:
@@ -461,7 +461,11 @@ class HelpChannels(Scheduler, commands.Cog):
"""
log.trace(f"Handling in-use channel #{channel} ({channel.id}).")
- idle_seconds = constants.HelpChannels.idle_minutes * 60
+ if not await self.is_empty(channel):
+ idle_seconds = constants.HelpChannels.idle_minutes * 60
+ else:
+ idle_seconds = constants.HelpChannels.deleted_idle_minutes * 60
+
time_elapsed = await self.get_idle_time(channel)
if time_elapsed is None or time_elapsed >= idle_seconds:
@@ -713,6 +717,32 @@ class HelpChannels(Scheduler, commands.Cog):
# be put in the queue.
await self.move_to_available()
+ @commands.Cog.listener()
+ async def on_message_delete(self, msg: discord.Message) -> None:
+ """
+ Reschedule an in-use channel to become dormant sooner if the channel is empty.
+
+ The new time for the dormant task is configured with `HelpChannels.deleted_idle_minutes`.
+ """
+ if not self.is_in_category(msg.channel, constants.Categories.help_in_use):
+ return
+
+ if not await self.is_empty(msg.channel):
+ return
+
+ log.info(f"Claimant of #{msg.channel} ({msg.author}) deleted message, channel is empty now. Rescheduling task.")
+
+ # Cancel existing dormant task before scheduling new.
+ self.cancel_task(msg.channel.id)
+
+ task = TaskData(constants.HelpChannels.deleted_idle_minutes * 60, self.move_idle_channel(msg.channel))
+ self.schedule_task(msg.channel.id, task)
+
+ async def is_empty(self, channel: discord.TextChannel) -> bool:
+ """Return True if the most recent message in `channel` is the bot's `AVAILABLE_MSG`."""
+ msg = await self.get_last_message(channel)
+ return self.match_bot_embed(msg, AVAILABLE_MSG)
+
async def reset_send_permissions(self) -> None:
"""Reset send permissions in the Available category for claimants."""
log.trace("Resetting send permissions in the Available category.")
@@ -788,7 +818,7 @@ class HelpChannels(Scheduler, commands.Cog):
embed = discord.Embed(description=AVAILABLE_MSG)
msg = await self.get_last_message(channel)
- if self.is_dormant_message(msg):
+ if self.match_bot_embed(msg, DORMANT_MSG):
log.trace(f"Found dormant message {msg.id} in {channel_info}; editing it.")
await msg.edit(embed=embed)
else:
diff --git a/bot/constants.py b/bot/constants.py
index fd280e9de..3003c9d36 100644
--- a/bot/constants.py
+++ b/bot/constants.py
@@ -541,6 +541,7 @@ class HelpChannels(metaclass=YAMLGetter):
claim_minutes: int
cmd_whitelist: List[int]
idle_minutes: int
+ deleted_idle_minutes: int
max_available: int
max_total_channels: int
name_prefix: str
diff --git a/config-default.yml b/config-default.yml
index c0b5b062f..2e98186f1 100644
--- a/config-default.yml
+++ b/config-default.yml
@@ -531,6 +531,10 @@ help_channels:
# Allowed duration of inactivity before making a channel dormant
idle_minutes: 30
+ # Allowed duration of inactivity when question message deleted
+ # and no one other sent before message making channel dormant.
+ deleted_idle_minutes: 5
+
# Maximum number of channels to put in the available category
max_available: 2