@@ -141,6 +141,9 @@ class View:
141
141
message: Optional[:class:`.Message`]
142
142
The message that this view is attached to.
143
143
If ``None`` then the view has not been sent with a message.
144
+ parent: Optional[:class:`.Interaction`]
145
+ The parent interaction which this view was sent from.
146
+ If ``None`` then the view was not sent using :meth:`InteractionResponse.send_message`.
144
147
"""
145
148
146
149
__discord_ui_view__ : ClassVar [bool ] = True
@@ -187,6 +190,7 @@ def __init__(
187
190
self .__timeout_task : asyncio .Task [None ] | None = None
188
191
self .__stopped : asyncio .Future [bool ] = loop .create_future ()
189
192
self ._message : Message | InteractionMessage | None = None
193
+ self .parent : Interaction | None = None
190
194
191
195
def __repr__ (self ) -> str :
192
196
return f"<{ self .__class__ .__name__ } timeout={ self .timeout } children={ len (self .children )} >"
@@ -363,9 +367,12 @@ async def on_timeout(self) -> None:
363
367
A callback that is called when a view's timeout elapses without being explicitly stopped.
364
368
"""
365
369
if self .disable_on_timeout :
366
- if self ._message :
367
- self .disable_all_items ()
368
- await self ._message .edit (view = self )
370
+ self .disable_all_items ()
371
+ message = self ._message or self .parent
372
+ if message :
373
+ m = await message .edit (view = self )
374
+ if m :
375
+ self ._message = m
369
376
370
377
async def on_check_failure (self , interaction : Interaction ) -> None :
371
378
"""|coro|
@@ -438,6 +445,9 @@ def _dispatch_item(self, item: Item, interaction: Interaction):
438
445
if self .__stopped .done ():
439
446
return
440
447
448
+ if interaction .message :
449
+ self .message = interaction .message
450
+
441
451
asyncio .create_task (
442
452
self ._scheduled_task (item , interaction ),
443
453
name = f"discord-ui-view-dispatch-{ self .id } " ,
0 commit comments