@@ -788,6 +788,8 @@ class ModalContext(InteractionContext):
788788 """The responses of the modal. The key is the `custom_id` of the component."""
789789 custom_id : str
790790 """The developer defined custom ID of this modal"""
791+ edit_origin : bool
792+ """Whether to edit the original message instead of sending a new one."""
791793
792794 @classmethod
793795 def from_dict (cls , client : "interactions.Client" , payload : dict ) -> Self :
@@ -797,8 +799,42 @@ def from_dict(cls, client: "interactions.Client", payload: dict) -> Self:
797799 }
798800 instance .kwargs = instance .responses
799801 instance .custom_id = payload ["data" ]["custom_id" ]
802+ instance .edit_origin = False
800803 return instance
801804
805+ async def edit (self , message : "Snowflake_Type" , ** kwargs ) -> "interactions.Message" :
806+ if not self .deferred and not self .responded :
807+ await self .defer (edit_origin = True )
808+ return await super ().edit (message , ** kwargs )
809+
810+ async def defer (self , * , ephemeral : bool = False , edit_origin : bool = False ) -> None :
811+ """
812+ Defer the interaction.
813+
814+ Args:
815+ ephemeral: Whether the interaction response should be ephemeral.
816+ edit_origin: Whether to edit the original message instead of sending a followup.
817+ """
818+ if self .deferred :
819+ raise AlreadyDeferred ("Interaction has already been responded to." )
820+ if self .responded :
821+ raise AlreadyResponded ("Interaction has already been responded to." )
822+
823+ payload = {
824+ "type" : CallbackType .DEFERRED_UPDATE_MESSAGE
825+ if edit_origin
826+ else CallbackType .DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE
827+ }
828+ if ephemeral :
829+ payload ["data" ] = {"flags" : MessageFlags .EPHEMERAL }
830+
831+ if edit_origin :
832+ self .edit_origin = True
833+
834+ await self .client .http .post_initial_response (payload , self .id , self .token )
835+ self .deferred = True
836+ self .ephemeral = ephemeral
837+
802838
803839class AutocompleteContext (BaseInteractionContext ):
804840 focussed_option : SlashCommandOption # todo: option parsing
0 commit comments