diff --git a/discord/channel.py b/discord/channel.py index 095bf528be..178db9ebc9 100644 --- a/discord/channel.py +++ b/discord/channel.py @@ -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): @@ -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` @@ -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 ------ @@ -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, @@ -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| @@ -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 ------- @@ -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) @@ -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 @@ -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 diff --git a/discord/http.py b/discord/http.py index 95d53f153e..7c75f96fae 100644 --- a/discord/http.py +++ b/discord/http.py @@ -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 diff --git a/discord/message.py b/discord/message.py index 2d61736197..e40e152b1f 100644 --- a/discord/message.py +++ b/discord/message.py @@ -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. @@ -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 ------ @@ -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: