Skip to content
25 changes: 15 additions & 10 deletions discord/channel.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,9 @@
from .webhook import Webhook


async def _single_delete_strategy(messages: Iterable[Message]):
async def _single_delete_strategy(messages: Iterable[Message], *, reason: Optional[str] = None):
for m in messages:
await m.delete()
await m.delete(reason=reason)


class TextChannel(discord.abc.Messageable, discord.abc.GuildChannel, Hashable):
Expand Down Expand Up @@ -376,7 +376,7 @@ async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = Non
reason=reason,
)

async def delete_messages(self, messages: Iterable[Snowflake]) -> None:
async def delete_messages(self, messages: Iterable[Snowflake], *, reason: Optional[str] = None) -> None:
"""|coro|

Deletes a list of messages. This is similar to :meth:`Message.delete`
Expand All @@ -396,6 +396,8 @@ async def delete_messages(self, messages: Iterable[Snowflake]) -> None:
-----------
messages: Iterable[:class:`abc.Snowflake`]
An iterable of messages denoting which ones to bulk delete.
reason: Optional[:class:`str`]
The reason for deleting the messages. Shows up on the audit log.

Raises
------
Expand All @@ -416,14 +418,14 @@ async def delete_messages(self, messages: Iterable[Snowflake]) -> None:

if len(messages) == 1:
message_id: int = messages[0].id
await self._state.http.delete_message(self.id, message_id)
await self._state.http.delete_message(self.id, message_id, reason=reason)
return

if len(messages) > 100:
raise ClientException("Can only bulk delete messages up to 100 messages")

message_ids: SnowflakeList = [m.id for m in messages]
await self._state.http.delete_messages(self.id, message_ids)
await self._state.http.delete_messages(self.id, message_ids, reason=reason)

async def purge(
self,
Expand All @@ -435,6 +437,7 @@ async def purge(
around: Optional[SnowflakeTime] = None,
oldest_first: Optional[bool] = False,
bulk: bool = True,
reason: Optional[str] = None,
) -> List[Message]:
"""|coro|

Expand Down Expand Up @@ -478,6 +481,8 @@ def is_me(m):
If ``True``, use bulk delete. Setting this to ``False`` is useful for mass-deleting
a bot's own messages without :attr:`Permissions.manage_messages`. When ``True``, will
fall back to single delete if messages are older than two weeks.
reason: Optional[:class:`str`]
The reason for deleting the messages. Shows up on the audit log.

Raises
-------
Expand Down Expand Up @@ -511,7 +516,7 @@ def is_me(m):
async for message in iterator:
if count == 100:
to_delete = ret[-100:]
await strategy(to_delete)
await strategy(to_delete, reason=reason)
count = 0
await asyncio.sleep(1)

Expand All @@ -521,10 +526,10 @@ def is_me(m):
if message.id < minimum_time:
# older than 14 days old
if count == 1:
await ret[-1].delete()
await ret[-1].delete(reason=reason)
elif count >= 2:
to_delete = ret[-count:]
await strategy(to_delete)
await strategy(to_delete, reason=reason)

count = 0
strategy = _single_delete_strategy
Expand All @@ -536,10 +541,10 @@ def is_me(m):
if count >= 2:
# more than 2 messages -> bulk delete
to_delete = ret[-count:]
await strategy(to_delete)
await strategy(to_delete, reason=reason)
elif count == 1:
# delete a single message
await ret[-1].delete()
await ret[-1].delete(reason=reason)

return ret

Expand Down
1 change: 0 additions & 1 deletion discord/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,6 @@ async def request(
headers["X-Audit-Log-Reason"] = _uriquote(reason, safe="/ ")

kwargs["headers"] = headers

# Proxy support
if self.proxy is not None:
kwargs["proxy"] = self.proxy
Expand Down
6 changes: 4 additions & 2 deletions discord/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -1157,7 +1157,7 @@ def system_content(self):
if self.type is MessageType.guild_invite_reminder:
return "Wondering who to invite?\nStart by inviting anyone who can help you build the server!"

async def delete(self, *, delay: Optional[float] = None) -> None:
async def delete(self, *, delay: Optional[float] = None, reason: Optional[str] = None) -> None:
"""|coro|

Deletes the message.
Expand All @@ -1174,6 +1174,8 @@ async def delete(self, *, delay: Optional[float] = None) -> None:
delay: Optional[:class:`float`]
If provided, the number of seconds to wait in the background
before deleting the message. If the deletion fails then it is silently ignored.
reason: Optional[:class:`str`]
The reason for deleting the message. Shows up on the audit log.

Raises
------
Expand All @@ -1184,7 +1186,7 @@ async def delete(self, *, delay: Optional[float] = None) -> None:
HTTPException
Deleting the message failed.
"""
del_func = self._state.http.delete_message(self.channel.id, self.id)
del_func = self._state.http.delete_message(self.channel.id, self.id, reason=reason)
if delay is not None:
utils.delay_task(delay, del_func)
else:
Expand Down