Skip to content

Commit 025d772

Browse files
authored
Merge pull request #600 from Makiyu-py/566-impl
Add delay and delete_after Parameters on Interaction functions
2 parents f5c3e60 + b125ee0 commit 025d772

File tree

3 files changed

+52
-29
lines changed

3 files changed

+52
-29
lines changed

discord/interactions.py

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ async def edit_original_message(
280280
files: List[File] = MISSING,
281281
view: Optional[View] = MISSING,
282282
allowed_mentions: Optional[AllowedMentions] = None,
283+
delete_after: Optional[float] = None,
283284
) -> InteractionMessage:
284285
"""|coro|
285286
@@ -311,6 +312,10 @@ async def edit_original_message(
311312
view: Optional[:class:`~discord.ui.View`]
312313
The updated view to update this message with. If ``None`` is passed then
313314
the view is removed.
315+
delete_after: Optional[:class:`float`]
316+
If provided, the number of seconds to wait in the background
317+
before deleting the message we just edited. If the deletion fails,
318+
then it is silently ignored.
314319
315320
Raises
316321
-------
@@ -354,16 +359,26 @@ async def edit_original_message(
354359
message = InteractionMessage(state=self._state, channel=self.channel, data=data) # type: ignore
355360
if view and not view.is_finished():
356361
self._state.store_view(view, message.id)
362+
363+
if delete_after is not None:
364+
await self.delete_original_message(delay=delete_after)
365+
357366
return message
358367

359-
async def delete_original_message(self) -> None:
368+
async def delete_original_message(self, *, delay: Optional[float] = None) -> None:
360369
"""|coro|
361370
362371
Deletes the original interaction response message.
363372
364373
This is a lower level interface to :meth:`InteractionMessage.delete` in case
365374
you do not want to fetch the message and save an HTTP request.
366375
376+
Parameters
377+
-----------
378+
delay: Optional[:class:`float`]
379+
If provided, the number of seconds to wait before deleting the message.
380+
The waiting is done in the background and deletion failures are ignored.
381+
367382
Raises
368383
-------
369384
HTTPException
@@ -372,12 +387,17 @@ async def delete_original_message(self) -> None:
372387
Deleted a message that is not yours.
373388
"""
374389
adapter = async_context.get()
375-
await adapter.delete_original_interaction_response(
390+
func = adapter.delete_original_interaction_response(
376391
self.application_id,
377392
self.token,
378393
session=self._session,
379394
)
380395

396+
if delay is not None:
397+
utils.delay_task(delay, func)
398+
else:
399+
await func
400+
381401

382402
class InteractionResponse:
383403
"""Represents a Discord interaction response.
@@ -608,10 +628,7 @@ async def send_message(
608628

609629
self._responded = True
610630
if delete_after is not None:
611-
async def delete():
612-
await asyncio.sleep(delete_after)
613-
await self._parent.delete_original_message()
614-
asyncio.ensure_future(delete(), loop=self._parent._state.loop)
631+
await self._parent.delete_original_message(delay=delete_after)
615632
return self._parent
616633

617634
async def edit_message(
@@ -622,6 +639,7 @@ async def edit_message(
622639
embeds: List[Embed] = MISSING,
623640
attachments: List[Attachment] = MISSING,
624641
view: Optional[View] = MISSING,
642+
delete_after: Optional[float] = None
625643
) -> None:
626644
"""|coro|
627645
@@ -643,6 +661,10 @@ async def edit_message(
643661
view: Optional[:class:`~discord.ui.View`]
644662
The updated view to update this message with. If ``None`` is passed then
645663
the view is removed.
664+
delete_after: Optional[:class:`float`]
665+
If provided, the number of seconds to wait in the background
666+
before deleting the message we just edited. If the deletion fails,
667+
then it is silently ignored.
646668
647669
Raises
648670
-------
@@ -705,6 +727,8 @@ async def edit_message(
705727
state.store_view(view, message_id)
706728

707729
self._responded = True
730+
if delete_after is not None:
731+
await self._parent.delete_original_message(delay=delete_after)
708732

709733
async def send_autocomplete_result(
710734
self,
@@ -797,6 +821,7 @@ async def edit(
797821
files: List[File] = MISSING,
798822
view: Optional[View] = MISSING,
799823
allowed_mentions: Optional[AllowedMentions] = None,
824+
delete_after: Optional[float] = None,
800825
) -> InteractionMessage:
801826
"""|coro|
802827
@@ -822,6 +847,10 @@ async def edit(
822847
view: Optional[:class:`~discord.ui.View`]
823848
The updated view to update this message with. If ``None`` is passed then
824849
the view is removed.
850+
delete_after: Optional[:class:`float`]
851+
If provided, the number of seconds to wait in the background
852+
before deleting the message we just edited. If the deletion fails,
853+
then it is silently ignored.
825854
826855
Raises
827856
-------
@@ -847,6 +876,7 @@ async def edit(
847876
files=files,
848877
view=view,
849878
allowed_mentions=allowed_mentions,
879+
delete_after=delete_after
850880
)
851881

852882
async def delete(self, *, delay: Optional[float] = None) -> None:
@@ -869,16 +899,4 @@ async def delete(self, *, delay: Optional[float] = None) -> None:
869899
HTTPException
870900
Deleting the message failed.
871901
"""
872-
873-
if delay is not None:
874-
875-
async def inner_call(delay: float = delay):
876-
await asyncio.sleep(delay)
877-
try:
878-
await self._state._interaction.delete_original_message()
879-
except HTTPException:
880-
pass
881-
882-
asyncio.create_task(inner_call())
883-
else:
884-
await self._state._interaction.delete_original_message()
902+
await self._state._interaction.delete_original_message(delay=delay)

discord/message.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,18 +1137,11 @@ async def delete(self, *, delay: Optional[float] = None) -> None:
11371137
HTTPException
11381138
Deleting the message failed.
11391139
"""
1140+
del_func = self._state.http.delete_message(self.channel.id, self.id)
11401141
if delay is not None:
1141-
1142-
async def delete(delay: float):
1143-
await asyncio.sleep(delay)
1144-
try:
1145-
await self._state.http.delete_message(self.channel.id, self.id)
1146-
except HTTPException:
1147-
pass
1148-
1149-
asyncio.create_task(delete(delay))
1142+
utils.delay_task(delay, del_func)
11501143
else:
1151-
await self._state.http.delete_message(self.channel.id, self.id)
1144+
await del_func
11521145

11531146
@overload
11541147
async def edit(

discord/utils.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
Any,
4545
AsyncIterator,
4646
Callable,
47+
Coroutine,
4748
Dict,
4849
ForwardRef,
4950
Generic,
@@ -222,6 +223,17 @@ def count(self, value: Any) -> int:
222223
return self.__proxied.count(value)
223224

224225

226+
def delay_task(delay: float, func: Coroutine):
227+
async def inner_call():
228+
await asyncio.sleep(delay)
229+
try:
230+
await func
231+
except HTTPException:
232+
pass
233+
234+
asyncio.create_task(inner_call())
235+
236+
225237
@overload
226238
def parse_time(timestamp: None) -> None:
227239
...

0 commit comments

Comments
 (0)