From 83781e521ebd4e3970999038d1c643ff3e662f38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Pav=C3=B3n=20Abi=C3=A1n?= Date: Wed, 18 Feb 2026 08:16:23 +0100 Subject: [PATCH] Fix broken application.app.controller references in Bluesky buffers application.app was never set anywhere - application.py is just a constants module. Every call to view_chat(), on_new_chat(), view_conversation(), on_reposts(), and on_likes() crashed with AttributeError, silently swallowed by get_event's except clause. Fix: store controller reference on each buffer during create_buffer() in mainController, then use self.controller instead of the broken application.app.controller pattern throughout all Bluesky buffer and dialog code. Co-Authored-By: Claude Opus 4.6 --- src/controller/blueski/messages.py | 13 ++++++------- src/controller/buffers/blueski/base.py | 10 ++++------ src/controller/buffers/blueski/chat.py | 6 ++---- src/controller/mainController.py | 1 + 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/controller/blueski/messages.py b/src/controller/blueski/messages.py index a6d698d2..a0103cb2 100644 --- a/src/controller/blueski/messages.py +++ b/src/controller/blueski/messages.py @@ -317,8 +317,9 @@ def _extract_post_view_data(session: Any, item: Any) -> dict[str, Any] | None: class viewPost(base_messages.basicMessage): - def __init__(self, session: Any, item: Any): + def __init__(self, session: Any, item: Any, controller: Any = None): self.session = session + self.controller = controller data = _extract_post_view_data(session, item) if not data: output.speak(_("No post available to view."), True) @@ -362,11 +363,10 @@ class viewPost(base_messages.basicMessage): output.speak(_("Link copied to clipboard.")) def on_reposts(self, *args, **kwargs): - if not self.post_uri: + if not self.post_uri or not self.controller: return try: - import application - controller = application.app.controller + controller = self.controller account_name = self.session.get_name() list_name = f"{self.post_uri}-reposts" existing = controller.search_buffer(list_name, account_name) @@ -391,11 +391,10 @@ class viewPost(base_messages.basicMessage): pass def on_likes(self, *args, **kwargs): - if not self.post_uri: + if not self.post_uri or not self.controller: return try: - import application - controller = application.app.controller + controller = self.controller account_name = self.session.get_name() list_name = f"{self.post_uri}-likes" existing = controller.search_buffer(list_name, account_name) diff --git a/src/controller/buffers/blueski/base.py b/src/controller/buffers/blueski/base.py index a21cd841..2efd6abf 100644 --- a/src/controller/buffers/blueski/base.py +++ b/src/controller/buffers/blueski/base.py @@ -530,7 +530,7 @@ class BaseBuffer(base.Buffer): pub.sendMessage("execute-action", action="user_details") return try: - blueski_messages.viewPost(self.session, item) + blueski_messages.viewPost(self.session, item, controller=getattr(self, "controller", None)) except Exception as e: log.error("Error opening Bluesky post viewer: %s", e) @@ -572,9 +572,8 @@ class BaseBuffer(base.Buffer): res = api.chat.bsky.convo.get_convo_for_members({"members": [did]}) convo_id = res.convo.id - import application title = _("Chat: {0}").format(handle) - application.app.controller.create_buffer( + self.controller.create_buffer( buffer_type="chat_messages", session_type="blueski", buffer_title=title, @@ -830,9 +829,8 @@ class BaseBuffer(base.Buffer): uri = item.get("uri") if isinstance(item, dict) else getattr(item, "uri", None) if not uri: return - import application - controller = application.app.controller - + controller = self.controller + details = self.get_selected_item_author_details() handle = "Unknown" if details: diff --git a/src/controller/buffers/blueski/chat.py b/src/controller/buffers/blueski/chat.py index eef9655d..a238e67a 100644 --- a/src/controller/buffers/blueski/chat.py +++ b/src/controller/buffers/blueski/chat.py @@ -167,8 +167,7 @@ class ConversationListBuffer(BaseBuffer): user_handle = getattr(profile, "handle", None) or (profile.get("handle") if isinstance(profile, dict) else None) or handle title = _("Chat: {0}").format(user_handle) # Create the buffer under direct_messages node - import application - wx.CallAfter(self._create_chat_buffer, application.app.controller, title, convo_id) + wx.CallAfter(self._create_chat_buffer, self.controller, title, convo_id) # Refresh conversation list wx.CallAfter(self.start_stream, True, False) except Exception: @@ -340,8 +339,7 @@ class ConversationListBuffer(BaseBuffer): title = _("Chat: {0}").format(names) - import application - self._create_chat_buffer(application.app.controller, title, convo_id) + self._create_chat_buffer(self.controller, title, convo_id) def _create_chat_buffer(self, controller, title, convo_id): """Create a chat buffer under the direct_messages node, avoiding duplicates.""" diff --git a/src/controller/mainController.py b/src/controller/mainController.py index d1d8e95c..0bca1c15 100644 --- a/src/controller/mainController.py +++ b/src/controller/mainController.py @@ -436,6 +436,7 @@ class Controller(object): kwargs["parent"] = self.view.nb # self.view.nb is the wx.Treebook buffer = buffer_panel_class(**kwargs) # This is the wx.Panel instance + buffer.controller = self if start: try: