Skip to content

Commit bfff06e

Browse files
committed
Ensure every path to close a help channel cancels scheduled closes
1 parent 41d15cc commit bfff06e

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

bot/exts/help_channels/_channel.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,11 @@ def is_help_forum_post(channel: discord.abc.GuildChannel) -> bool:
4242
return getattr(channel, "parent_id", None) == constants.Channels.python_help
4343

4444

45-
async def _close_help_post(closed_post: discord.Thread, closing_reason: _stats.ClosingReason) -> None:
45+
async def _close_help_post(
46+
closed_post: discord.Thread,
47+
closing_reason: _stats.ClosingReason,
48+
scheduler: scheduling.Scheduler,
49+
) -> None:
4650
"""Close the help post and record stats."""
4751
# Get Thread with updated metadata (such as the title)
4852
closed_post = await get_or_fetch_channel(bot.instance, closed_post.id)
@@ -72,6 +76,8 @@ async def _close_help_post(closed_post: discord.Thread, closing_reason: _stats.C
7276
locked=True,
7377
reason="Locked a closed help post",
7478
)
79+
if closed_post.id in scheduler:
80+
scheduler.cancel(closed_post.id)
7581

7682
_stats.report_post_count()
7783
await _stats.report_complete_session(closed_post, closing_reason)
@@ -88,14 +94,18 @@ async def send_opened_post_message(post: discord.Thread) -> None:
8894
await post.send(embed=embed, content=post.owner.mention)
8995

9096

91-
async def help_post_opened(opened_post: discord.Thread, *, reopen: bool = False) -> None:
97+
async def help_post_opened(
98+
opened_post: discord.Thread,
99+
*,
100+
scheduler: scheduling.Scheduler,
101+
) -> None:
92102
"""Apply new post logic to a new help forum post."""
93103
_stats.report_post_count()
94104
bot.instance.stats.incr("help.claimed")
95105

96106
if not isinstance(opened_post.owner, discord.Member):
97107
log.debug(f"{opened_post.owner_id} isn't a member. Closing post.")
98-
await _close_help_post(opened_post, _stats.ClosingReason.CLEANUP)
108+
await _close_help_post(opened_post, _stats.ClosingReason.CLEANUP, scheduler)
99109
return
100110

101111
try:
@@ -114,12 +124,12 @@ async def help_post_opened(opened_post: discord.Thread, *, reopen: bool = False)
114124
await send_opened_post_message(opened_post)
115125

116126

117-
async def help_post_closed(closed_post: discord.Thread) -> None:
127+
async def help_post_closed(closed_post: discord.Thread, scheduler: scheduling.Scheduler) -> None:
118128
"""Apply archive logic to a manually closed help forum post."""
119-
await _close_help_post(closed_post, _stats.ClosingReason.COMMAND)
129+
await _close_help_post(closed_post, _stats.ClosingReason.COMMAND, scheduler)
120130

121131

122-
async def help_post_archived(archived_post: discord.Thread) -> None:
132+
async def help_post_archived(archived_post: discord.Thread, scheduler: scheduling.Scheduler) -> None:
123133
"""Apply archive logic to an archived help forum post."""
124134
async for thread_update in archived_post.guild.audit_logs(limit=50, action=discord.AuditLogAction.thread_update):
125135
if thread_update.target.id != archived_post.id:
@@ -130,7 +140,7 @@ async def help_post_archived(archived_post: discord.Thread) -> None:
130140
if thread_update.user.id == bot.instance.user.id:
131141
return
132142

133-
await _close_help_post(archived_post, _stats.ClosingReason.INACTIVE)
143+
await _close_help_post(archived_post, _stats.ClosingReason.INACTIVE, scheduler)
134144

135145

136146
async def help_post_deleted(deleted_post_event: discord.RawThreadDeleteEvent) -> None:
@@ -194,7 +204,7 @@ async def maybe_archive_idle_post(post: discord.Thread, scheduler: scheduling.Sc
194204
log.info(
195205
f"#{post} ({post.id}) is idle past {closing_time} and will be archived. Reason: {closing_reason.value}"
196206
)
197-
await _close_help_post(post, closing_reason)
207+
await _close_help_post(post, closing_reason, scheduler)
198208
return
199209

200210
if post.id in scheduler:

bot/exts/help_channels/_cog.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,7 @@ async def close_command(self, ctx: commands.Context) -> None:
8181
# Don't use a discord.py check because the check needs to fail silently.
8282
if await self.close_check(ctx):
8383
log.info(f"Close command invoked by {ctx.author} in #{ctx.channel}.")
84-
await _channel.help_post_closed(ctx.channel)
85-
if ctx.channel.id in self.scheduler:
86-
self.scheduler.cancel(ctx.channel.id)
84+
await _channel.help_post_closed(ctx.channel, self.scheduler)
8785

8886
@help_forum_group.command(name="title", root_aliases=("title",))
8987
async def rename_help_post(self, ctx: commands.Context, *, title: str) -> None:
@@ -112,7 +110,7 @@ async def new_post_listener(self, message: discord.Message) -> None:
112110
if thread.parent_id != self.help_forum_channel.id:
113111
return
114112

115-
await _channel.help_post_opened(thread)
113+
await _channel.help_post_opened(thread, scheduler=self.scheduler)
116114

117115
delay = min(constants.HelpChannels.deleted_idle_minutes, constants.HelpChannels.idle_minutes) * 60
118116
self.scheduler.schedule_later(
@@ -128,6 +126,8 @@ async def on_thread_update(self, before: discord.Thread, after: discord.Thread)
128126
return
129127
if not before.archived and after.archived:
130128
await _channel.help_post_archived(after)
129+
if after.id in self.scheduler:
130+
self.scheduler.cancel(after.id)
131131

132132
@commands.Cog.listener()
133133
async def on_raw_thread_delete(self, deleted_thread_event: discord.RawThreadDeleteEvent) -> None:

0 commit comments

Comments
 (0)