@@ -63,6 +63,18 @@ class _Context(ClientSerializerMixin):
6363 locale : Optional [Locale ] = field (converter = Locale , default = None )
6464 guild_locale : Optional [Locale ] = field (converter = Locale , default = None )
6565
66+ @property
67+ def deferred_ephemeral (self ) -> bool :
68+ """
69+ .. versionadded:: 4.4.0
70+
71+ Returns whether the current interaction was deferred ephemerally.
72+ """
73+ return bool (
74+ self .message .flags & MessageFlags .EPHEMERAL
75+ and self .message .flags & MessageFlags .LOADING
76+ )
77+
6678 def __attrs_post_init__ (self ) -> None :
6779 if self .member and self .guild_id :
6880 self .member ._extras ["guild_id" ] = self .guild_id
@@ -488,25 +500,37 @@ async def edit(
488500
489501 return msg if msg is not None else Message (** payload , _client = self ._client )
490502
491- async def defer (self , ephemeral : Optional [bool ] = False ) -> None :
503+ async def defer (self , ephemeral : Optional [bool ] = False ) -> Message :
492504 """
505+ .. versionchanged:: 4.4.0
506+ Now returns the created message object
507+
493508 This "defers" an interaction response, allowing up
494509 to a 15-minute delay between invocation and responding.
495510
496511 :param Optional[bool] ephemeral: Whether the deferred state is hidden or not.
512+ :return: The deferred message
513+ :rtype: Message
497514 """
498515 if not self .responded :
499516 self .deferred = True
500517 _ephemeral : int = MessageFlags .EPHEMERAL .value if ephemeral else 0
501518 self .callback = InteractionCallbackType .DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE
502-
503519 await self ._client .create_interaction_response (
504520 token = self .token ,
505521 application_id = int (self .id ),
506522 data = {"type" : self .callback .value , "data" : {"flags" : _ephemeral }},
507523 )
508-
524+ try :
525+ _msg = await self ._client .get_original_interaction_response (
526+ self .token , str (self .application_id )
527+ )
528+ except LibraryException :
529+ pass
530+ else :
531+ self .message = Message (** _msg , _client = self ._client )
509532 self .responded = True
533+ return self .message
510534
511535 async def send (self , content : Optional [str ] = MISSING , ** kwargs ) -> Message :
512536 payload , files = await super ().send (content , ** kwargs )
@@ -730,19 +754,23 @@ async def send(self, content: Optional[str] = MISSING, **kwargs) -> Message:
730754
731755 async def defer (
732756 self , ephemeral : Optional [bool ] = False , edit_origin : Optional [bool ] = False
733- ) -> None :
757+ ) -> Message :
734758 """
759+ .. versionchanged:: 4.4.0
760+ Now returns the created message object
761+
735762 This "defers" a component response, allowing up
736763 to a 15-minute delay between invocation and responding.
737764
738765 :param Optional[bool] ephemeral: Whether the deferred state is hidden or not.
739766 :param Optional[bool] edit_origin: Whether you want to edit the original message or send a followup message
767+ :return: The deferred message
768+ :rtype: Message
740769 """
741770 if not self .responded :
742771
743772 self .deferred = True
744773 _ephemeral : int = MessageFlags .EPHEMERAL .value if bool (ephemeral ) else 0
745-
746774 # ephemeral doesn't change callback typings. just data json
747775 if edit_origin :
748776 self .callback = InteractionCallbackType .DEFERRED_UPDATE_MESSAGE
@@ -754,8 +782,16 @@ async def defer(
754782 application_id = int (self .id ),
755783 data = {"type" : self .callback .value , "data" : {"flags" : _ephemeral }},
756784 )
757-
785+ try :
786+ _msg = await self ._client .get_original_interaction_response (
787+ self .token , str (self .application_id )
788+ )
789+ except LibraryException :
790+ pass
791+ else :
792+ self .message = Message (** _msg , _client = self ._client )
758793 self .responded = True
794+ return self .message
759795
760796 async def disable_all_components (
761797 self , respond_to_interaction : Optional [bool ] = True , ** other_kwargs : Optional [dict ]
0 commit comments