Skip to content

Commit 0c020ff

Browse files
committed
Really postpone deleting old messages to the end
1 parent 8a0e706 commit 0c020ff

2 files changed

Lines changed: 21 additions & 16 deletions

File tree

bot/exts/moderation/clean.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -307,14 +307,16 @@ async def _delete_messages_individually(self, channel_messages: dict[TextChannel
307307
deleted.append(message)
308308
return deleted
309309

310-
async def _delete_found(
310+
async def _delete_bulk(
311311
self, message_mappings: dict[TextChannel, list[Message]], executor:AsyncExecutor
312-
) -> list[Message]:
312+
) -> tuple[list[Message], dict[TextChannel, list[Message]]]:
313313
"""
314314
Delete the detected messages.
315315
316316
Deletion is made in bulk per channel for messages less than 14d old.
317-
The function returns the deleted messages.
317+
318+
The function returns the deleted messages. Additionally, messages older than 14d are returned to
319+
be deleted separately.
318320
If cleaning was cancelled in the middle, return messages already deleted.
319321
"""
320322
deleted = []
@@ -325,7 +327,7 @@ async def _delete_found(
325327
for current_index, message in enumerate(messages):
326328
if not self.cleaning:
327329
# Means that the cleaning was canceled
328-
return deleted
330+
return deleted, {}
329331

330332
if self.is_older_than_14d(message):
331333
# Further messages are too old to be deleted in bulk
@@ -341,21 +343,15 @@ async def _delete_found(
341343
to_delete = []
342344

343345
if not self.cleaning:
344-
return deleted
346+
return deleted, {}
345347
if len(to_delete) > 0:
346348
# Deleting any leftover messages if there are any
347349
executor.submit(channel.delete_messages(to_delete))
348350
deleted.extend(to_delete)
349351

350352
await executor.gather(return_exceptions=True)
351353

352-
if old_messages:
353-
if not self.cleaning:
354-
return deleted
355-
old_deleted = await self._delete_messages_individually(old_messages)
356-
deleted.extend(old_deleted)
357-
358-
return deleted
354+
return deleted, old_messages
359355

360356
async def _modlog_cleaned_messages(
361357
self,
@@ -440,14 +436,15 @@ async def _clean_messages(
440436
executor.submit(self._delete_invocation(ctx))
441437

442438
deleted_messages = []
439+
old_messages = {channel: [] for channel in deletion_channels}
443440

444441
if self._use_cache(second_limit):
445442
log.trace(f"Messages for cleaning by {ctx.author.id} will be searched in the cache.")
446443
message_mappings, message_ids = self._get_messages_from_cache(
447444
channels=deletion_channels, to_delete=predicate, lower_limit=first_limit
448445
)
449446
self.mod_log.ignore(Event.message_delete, *message_ids)
450-
deleted_messages = await self._delete_found(message_mappings, executor)
447+
deleted_messages, old_messages = await self._delete_bulk(message_mappings, executor)
451448
second_limit = self._earliest_cache_datetime()
452449

453450
if self._use_api(first_limit):
@@ -459,12 +456,17 @@ async def _clean_messages(
459456
before=second_limit
460457
)
461458
self.mod_log.ignore(Event.message_delete, *message_ids)
462-
api_deleted_messages = await self._delete_found(message_mappings, executor)
459+
api_deleted_messages, api_old_messages = await self._delete_bulk(message_mappings, executor)
463460
deleted_messages.extend(api_deleted_messages)
461+
for channel, messages in api_old_messages.items():
462+
old_messages[channel].extend(messages)
464463

465464
if not self.cleaning:
466465
# Means that the cleaning was canceled
467466
return None
467+
if old_messages:
468+
old_deleted = await self._delete_messages_individually(old_messages)
469+
deleted_messages.extend(old_deleted)
468470

469471
self.cleaning = False
470472
log.trace("Cleaning completed, wrapping up")

tests/bot/exts/moderation/test_clean.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import unittest
22
from unittest.mock import AsyncMock, MagicMock, patch
33

4+
import arrow
5+
46
from bot.exts.moderation.clean import Clean
57
from tests.helpers import MockBot, MockContext, MockGuild, MockMember, MockMessage, MockRole, MockTextChannel
68

@@ -20,7 +22,8 @@ def setUp(self):
2022
self.cog._modlog_cleaned_messages = AsyncMock(return_value=self.log_url)
2123

2224
self.cog._use_cache = MagicMock(return_value=True)
23-
self.cog._delete_found = AsyncMock(return_value=[42, 84])
25+
self.cog._use_api = MagicMock(return_value=False)
26+
self.cog._delete_bulk = AsyncMock(return_value=([42, 84], {}))
2427

2528
@patch("bot.exts.moderation.clean.is_mod_channel")
2629
async def test_clean_deletes_invocation_in_non_mod_channel(self, mod_channel_check):
@@ -51,7 +54,7 @@ async def test_clean_doesnt_attempt_deletion_when_attempt_delete_invocation_is_f
5154
await self.cog._clean_messages(
5255
self.ctx,
5356
None,
54-
first_limit=MockMessage(),
57+
first_limit=arrow.utcnow().datetime,
5558
attempt_delete_invocation=False,
5659
),
5760
self.log_url,

0 commit comments

Comments
 (0)