From d1bb4786b6f45bc62f501b77e076f9f62c16da9a Mon Sep 17 00:00:00 2001 From: Nelo <41271523+NeloBlivion@users.noreply.github.com> Date: Wed, 7 Jan 2026 00:46:47 -0500 Subject: [PATCH 1/4] attempt view refresh fix --- discord/interactions.py | 7 ++++--- discord/ui/view.py | 8 +++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/discord/interactions.py b/discord/interactions.py index 47498c6946..f81cceeb51 100644 --- a/discord/interactions.py +++ b/discord/interactions.py @@ -597,8 +597,9 @@ async def edit_original_response( previous_allowed_mentions=previous_mentions, suppress=suppress, ) - if view and self.message: - self._state.prevent_view_updates_for(self.message.id) + _message = self.message or self._original_response + if view and message: + self._state.prevent_view_updates_for(message.id) adapter = async_context.get() http = self._state.http data = await adapter.edit_original_interaction_response( @@ -1191,7 +1192,7 @@ async def edit_message( raise InteractionResponded(self._parent) parent = self._parent - msg = parent.message + msg = parent.message or parent._original_response state = parent._state message_id = msg.id if msg else None if parent.type not in (InteractionType.component, InteractionType.modal_submit): diff --git a/discord/ui/view.py b/discord/ui/view.py index ec4c0cd8a7..755cdc730e 100644 --- a/discord/ui/view.py +++ b/discord/ui/view.py @@ -26,6 +26,7 @@ from __future__ import annotations import asyncio +import logging import os import sys import time @@ -75,6 +76,8 @@ from ..state import ConnectionState from ..types.components import Component as ComponentPayload +_log = logging.getLogger(__name__) + V = TypeVar("V", bound="BaseView", covariant=True) @@ -996,4 +999,7 @@ def update_from_message(self, message_id: int, components: list[ComponentPayload # pre-req: is_message_tracked == true view = self._synced_message_views[message_id] components = [_component_factory(d, state=self._state) for d in components] - view.refresh(components) + try: + view.refresh(components) + except: + _log.warning(f"Failed to refresh View {view} from Message {message_id} due to mismatched state. Items may not have complete data.") From ed6b6e055828f225b8ac7ea7ecac0d4e98552ad0 Mon Sep 17 00:00:00 2001 From: Nelo <41271523+NeloBlivion@users.noreply.github.com> Date: Wed, 7 Jan 2026 01:06:11 -0500 Subject: [PATCH 2/4] rename to _refresh --- discord/abc.py | 2 +- discord/interactions.py | 2 +- discord/message.py | 4 ++-- discord/ui/modal.py | 6 +++--- discord/ui/view.py | 6 +++--- discord/webhook/async_.py | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/discord/abc.py b/discord/abc.py index da8e5d37cc..a32f906cd8 100644 --- a/discord/abc.py +++ b/discord/abc.py @@ -1688,7 +1688,7 @@ async def send( if view.is_dispatchable(): state.store_view(view, ret.id) view.message = ret - view.refresh(ret.components) + view._refresh(ret.components) if delete_after is not None: await ret.delete(delay=delete_after) diff --git a/discord/interactions.py b/discord/interactions.py index f81cceeb51..0be1b1c9a7 100644 --- a/discord/interactions.py +++ b/discord/interactions.py @@ -618,7 +618,7 @@ async def edit_original_response( message = InteractionMessage(state=state, channel=self.channel, data=data) # type: ignore if view: if not view.is_finished(): - view.refresh(message.components) + view._refresh(message.components) if view.is_dispatchable(): self._state.store_view(view, message.id) diff --git a/discord/message.py b/discord/message.py index 2ef90bdd9e..2f13274a36 100644 --- a/discord/message.py +++ b/discord/message.py @@ -1882,7 +1882,7 @@ async def edit( if view and not view.is_finished(): view.message = message - view.refresh(message.components) + view._refresh(message.components) if view.is_dispatchable(): self._state.store_view(view, self.id) @@ -2551,7 +2551,7 @@ async def edit(self, **fields: Any) -> Message | None: msg = self._state.create_message(channel=self.channel, data=data) # type: ignore if view and not view.is_finished(): view.message = msg - view.refresh(msg.components) + view._refresh(msg.components) if view.is_dispatchable(): self._state.store_view(view, self.id) return msg diff --git a/discord/ui/modal.py b/discord/ui/modal.py index 8620cec363..71b3269fad 100644 --- a/discord/ui/modal.py +++ b/discord/ui/modal.py @@ -360,7 +360,7 @@ def remove_item(self, item: InputText) -> Self: pass return self - def refresh(self, interaction: Interaction, data: list[ComponentPayload]): + def _refresh(self, interaction: Interaction, data: list[ComponentPayload]): components = [ component for parent_component in data @@ -444,7 +444,7 @@ def add_item(self, item: ModalItem) -> Self: super().add_item(item) return self - def refresh(self, interaction: Interaction, data: list[ComponentPayload]): + def _refresh(self, interaction: Interaction, data: list[ComponentPayload]): for component, child in zip(data, self.children): child.refresh_from_modal(interaction, component) @@ -516,7 +516,7 @@ async def dispatch(self, user_id: int, custom_id: str, interaction: Interaction) try: components = interaction.data["components"] - modal.refresh(interaction, components) + modal._refresh(interaction, components) await modal.callback(interaction) self.remove_modal(modal, user_id) except Exception as e: diff --git a/discord/ui/view.py b/discord/ui/view.py index 755cdc730e..60d8dc5dea 100644 --- a/discord/ui/view.py +++ b/discord/ui/view.py @@ -729,7 +729,7 @@ def clear_items(self) -> None: self.__weights.clear() return self - def refresh(self, components: list[Component]): + def _refresh(self, components: list[Component]): # This is pretty hacky at the moment old_state: dict[tuple[int, str], ViewItem[V]] = { (item.type.value, item.custom_id): item for item in self.children if item.is_dispatchable() # type: ignore @@ -898,7 +898,7 @@ def add_item(self, item: ViewItem[V]) -> Self: super().add_item(item) return self - def refresh(self, components: list[Component]): + def _refresh(self, components: list[Component]): # Refreshes view data using discord's values # Assumes the components and items are identical if not components: @@ -1000,6 +1000,6 @@ def update_from_message(self, message_id: int, components: list[ComponentPayload view = self._synced_message_views[message_id] components = [_component_factory(d, state=self._state) for d in components] try: - view.refresh(components) + view._refresh(components) except: _log.warning(f"Failed to refresh View {view} from Message {message_id} due to mismatched state. Items may not have complete data.") diff --git a/discord/webhook/async_.py b/discord/webhook/async_.py index c9093f7781..af4d39e537 100644 --- a/discord/webhook/async_.py +++ b/discord/webhook/async_.py @@ -1902,7 +1902,7 @@ async def send( if self.parent and not view.parent: view.parent = self.parent if msg: - view.refresh(msg.components) + view._refresh(msg.components) if view.is_dispatchable(): self._state.store_view(view, message_id) @@ -2113,7 +2113,7 @@ async def edit_message( message = self._create_message(data) if view and not view.is_finished(): view.message = message - view.refresh(message.components) + view._refresh(message.components) if view.is_dispatchable(): self._state.store_view(view, message_id) return message From 850edd6014587160827cb5f62bae0d1cb271102e Mon Sep 17 00:00:00 2001 From: Nelo <41271523+NeloBlivion@users.noreply.github.com> Date: Wed, 7 Jan 2026 01:12:43 -0500 Subject: [PATCH 3/4] _message --- discord/interactions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/discord/interactions.py b/discord/interactions.py index 0be1b1c9a7..530cb8777f 100644 --- a/discord/interactions.py +++ b/discord/interactions.py @@ -598,8 +598,8 @@ async def edit_original_response( suppress=suppress, ) _message = self.message or self._original_response - if view and message: - self._state.prevent_view_updates_for(message.id) + if view and _message: + self._state.prevent_view_updates_for(_message.id) adapter = async_context.get() http = self._state.http data = await adapter.edit_original_interaction_response( From 242909d7554f1d008cabeafbfba68f209633a862 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 7 Jan 2026 06:13:50 +0000 Subject: [PATCH 4/4] style(pre-commit): auto fixes from pre-commit.com hooks --- discord/ui/view.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/discord/ui/view.py b/discord/ui/view.py index 60d8dc5dea..9b1da0ee9d 100644 --- a/discord/ui/view.py +++ b/discord/ui/view.py @@ -1002,4 +1002,6 @@ def update_from_message(self, message_id: int, components: list[ComponentPayload try: view._refresh(components) except: - _log.warning(f"Failed to refresh View {view} from Message {message_id} due to mismatched state. Items may not have complete data.") + _log.warning( + f"Failed to refresh View {view} from Message {message_id} due to mismatched state. Items may not have complete data." + )