2014-11-12 20:41:29 -06:00
# -*- coding: utf-8 -*-
2022-02-24 16:18:01 -06:00
import os
2023-06-03 00:39:42 +01:00
import sys
2022-02-24 16:18:01 -06:00
import logging
import webbrowser
2021-10-26 10:45:11 -05:00
import wx
2018-08-26 02:48:04 -05:00
import requests
2022-02-24 16:18:01 -06:00
import keystrokeEditor
import sessions
import widgetUtils
import config
import languageHandler
import application
import sound
import output
from pubsub import pub
2022-11-07 15:55:28 -06:00
from extra import SoundsTutorial
2022-11-07 16:15:04 -06:00
from update import updater
2022-02-24 16:18:01 -06:00
from wxUI import view , dialogs , commonMessageDialogs , sysTrayIcon
from keyboard_handler . wx_handler import WXKeyboardHandler
2015-03-04 17:52:27 -06:00
from sessionmanager import manager , sessionManager
2021-07-02 17:22:24 -05:00
from controller import buffers
2015-01-25 02:38:17 -06:00
from mysc import restart
2015-07-06 12:05:03 -05:00
from mysc import localization
2022-11-07 16:15:04 -06:00
from mysc . thread_utils import call_threaded
from mysc . repeating_timer import RepeatingTimer
2022-11-07 09:54:09 -06:00
from controller . mastodon import handler as MastodonHandler
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
from controller . atprotosocial import handler as ATProtoSocialHandler # Added import
2022-11-07 16:15:04 -06:00
from . import settings , userAlias
2014-11-12 20:41:29 -06:00
2015-01-13 12:31:37 -06:00
log = logging . getLogger ( " mainController " )
2014-11-12 20:41:29 -06:00
class Controller ( object ) :
2021-06-16 16:18:41 -05:00
""" Main Controller for TWBlue. It manages the main window and sessions. """
def search_buffer ( self , name_ , user ) :
""" Searches a buffer.
name_ str : The name for the buffer
user str : The account for the buffer .
for example you may want to search the home_timeline buffer for the tw_blue2 user .
Return type : buffers . buffer object . """
for i in self . buffers :
if i . name == name_ and i . account == user : return i
def get_current_buffer ( self ) :
""" Get the current focused bufferObject.
Return type : buffers . buffer object . """
buffer = self . view . get_current_buffer ( )
if hasattr ( buffer , " account " ) :
buffer = self . search_buffer ( buffer . name , buffer . account )
return buffer
def get_best_buffer ( self ) :
""" Get the best buffer for doing something using the session object.
This function is useful when you need to open a timeline or post a tweet , and the user is in a buffer without a session , for example the events buffer .
Return type : twitterBuffers . buffer object . """
# Gets the parent buffer to know what account is doing an action
view_buffer = self . view . get_current_buffer ( )
# If the account has no session attached, we will need to search the first available non-empty buffer for that account to use its session.
if view_buffer . type == " account " or view_buffer . type == " empty " :
buffer = self . get_first_buffer ( view_buffer . account )
else :
buffer = self . search_buffer ( view_buffer . name , view_buffer . account )
if buffer != None : return buffer
def get_first_buffer ( self , account ) :
""" Gets the first valid buffer for an account.
account str : A twitter username .
The first valid buffer is the home timeline . """
for i in self . buffers :
if i . account == account and i . invisible == True and i . session != None :
return i
def get_last_buffer ( self , account ) :
""" Gets the last valid buffer for an account.
account str : A twitter username .
The last valid buffer is the last buffer that contains a session object assigned . """
results = self . get_buffers_for_account ( account )
return results [ - 1 ]
def get_first_buffer_index ( self , account ) :
buff = self . get_first_buffer ( account )
return self . view . search ( buff . name , buff . account )
def get_last_buffer_index ( self , account ) :
buff = self . get_last_buffer ( account )
return self . view . search ( buff . name , buff . account )
def get_buffers_for_account ( self , account ) :
results = [ ]
buffers = self . view . get_buffers ( )
[ results . append ( self . search_buffer ( i . name , i . account ) ) for i in buffers if i . account == account and ( i . type != " account " ) ]
return results
2025-08-30 22:48:00 +02:00
def get_handler ( self , type ) :
""" Return the controller handler for a given session type. """
try :
if type == " mastodon " :
return MastodonHandler . Handler ( )
if type == " atprotosocial " :
return ATProtoSocialHandler . Handler ( )
except Exception :
log . exception ( " Error creating handler for type %s " , type )
return None
2021-06-16 16:18:41 -05:00
def bind_other_events ( self ) :
""" Binds the local application events with their functions. """
log . debug ( " Binding other application events... " )
2022-11-18 16:29:53 -06:00
# Core application pubsub events.
2021-06-16 16:18:41 -05:00
pub . subscribe ( self . logout_account , " logout " )
pub . subscribe ( self . login_account , " login " )
pub . subscribe ( self . execute_action , " execute-action " )
pub . subscribe ( self . search_topic , " search " )
2022-11-18 16:29:53 -06:00
pub . subscribe ( self . create_buffer , " createBuffer " )
pub . subscribe ( self . toggle_share_settings , " toggleShare " )
pub . subscribe ( self . invisible_shorcuts_changed , " invisible-shorcuts-changed " )
pub . subscribe ( self . create_account_buffer , " core.create_account " )
2023-04-05 09:39:39 -06:00
pub . subscribe ( self . change_buffer_title , " core.change_buffer_title " )
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
pub . subscribe ( self . handle_compose_dialog_send , " compose_dialog.send_post " ) # For new compose dialog
2022-11-18 16:29:53 -06:00
# Mastodon specific events.
pub . subscribe ( self . mastodon_new_item , " mastodon.new_item " )
2022-11-25 17:43:03 -06:00
pub . subscribe ( self . mastodon_updated_item , " mastodon.updated_item " )
2022-11-19 19:36:21 -06:00
pub . subscribe ( self . mastodon_new_conversation , " mastodon.conversation_received " )
2023-03-23 13:17:55 -06:00
pub . subscribe ( self . mastodon_error_post , " mastodon.error_post " )
2023-04-03 13:35:05 -06:00
2022-11-18 16:29:53 -06:00
# connect application events to GUI
widgetUtils . connect_event ( self . view , widgetUtils . CLOSE_EVENT , self . exit_ )
2022-02-24 16:29:59 -06:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . show_hide , menuitem = self . view . show_hide )
2023-06-08 00:40:38 +01:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . update_profile , menuitem = self . view . updateProfile )
2022-02-24 16:29:59 -06:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . search , menuitem = self . view . menuitem_search )
2023-04-03 13:35:05 -06:00
# widgetUtils.connect_event(self.view, widgetUtils.MENU, self.list_manager, menuitem=self.view.lists)
2022-02-24 16:29:59 -06:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . find , menuitem = self . view . find )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . accountConfiguration , menuitem = self . view . account_settings )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . configuration , menuitem = self . view . prefs )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . ocr_image , menuitem = self . view . ocr )
2021-06-16 16:18:41 -05:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . learn_sounds , menuitem = self . view . sounds_tutorial )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . exit , menuitem = self . view . close )
widgetUtils . connect_event ( self . view , widgetUtils . CLOSE_EVENT , self . exit )
if widgetUtils . toolkit == " wx " :
log . debug ( " Binding the exit function... " )
widgetUtils . connectExitFunction ( self . exit_ )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . edit_keystrokes , menuitem = self . view . keystroke_editor )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . post_tweet , self . view . compose )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . post_reply , self . view . reply )
2022-12-20 12:21:30 -06:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . post_retweet , self . view . share )
2021-06-16 16:18:41 -05:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . add_to_favourites , self . view . fav )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . remove_from_favourites , self . view . unfav )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . view_item , self . view . view )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . delete , self . view . delete )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . follow , menuitem = self . view . follow )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . send_dm , self . view . dm )
2023-10-10 17:43:31 -06:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . user_details , self . view . details )
2021-06-16 16:18:41 -05:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . get_more_items , menuitem = self . view . load_previous_items )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . clear_buffer , menuitem = self . view . clear )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . remove_buffer , self . view . deleteTl )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . check_for_updates , self . view . check_for_updates )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . about , menuitem = self . view . about )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . visit_website , menuitem = self . view . visit_website )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . get_soundpacks , menuitem = self . view . get_soundpacks )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . manage_accounts , self . view . manage_accounts )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . toggle_autoread , menuitem = self . view . autoread )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . toggle_buffer_mute , self . view . mute_buffer )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . open_timeline , self . view . timeline )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . open_favs_timeline , self . view . favs )
2024-05-18 17:24:28 -06:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . community_timeline , self . view . community_timeline )
2021-06-16 16:18:41 -05:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . open_conversation , menuitem = self . view . view_conversation )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . seekLeft , menuitem = self . view . seekLeft )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . seekRight , menuitem = self . view . seekRight )
if widgetUtils . toolkit == " wx " :
widgetUtils . connect_event ( self . view . nb , widgetUtils . NOTEBOOK_PAGE_CHANGED , self . buffer_changed )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . view_documentation , self . view . doc )
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . view_changelog , self . view . changelog )
2023-04-05 13:28:09 -06:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . add_alias , self . view . addAlias )
2021-06-16 16:18:41 -05:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . update_buffer , self . view . update_buffer )
2023-04-05 13:28:09 -06:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . manage_aliases , self . view . manageAliases )
2023-02-25 10:39:05 +01:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . report_error , self . view . reportError )
2025-03-07 10:13:34 -06:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . create_filter , self . view . filter )
2025-03-07 13:01:08 -06:00
widgetUtils . connect_event ( self . view , widgetUtils . MENU , self . manage_filters , self . view . manage_filters )
2021-06-16 16:18:41 -05:00
def set_systray_icon ( self ) :
self . systrayIcon = sysTrayIcon . SysTrayIcon ( )
2023-04-03 13:35:05 -06:00
widgetUtils . connect_event ( self . systrayIcon , widgetUtils . MENU , self . post_tweet , menuitem = self . systrayIcon . post )
2021-06-16 16:18:41 -05:00
widgetUtils . connect_event ( self . systrayIcon , widgetUtils . MENU , self . configuration , menuitem = self . systrayIcon . global_settings )
widgetUtils . connect_event ( self . systrayIcon , widgetUtils . MENU , self . accountConfiguration , menuitem = self . systrayIcon . account_settings )
widgetUtils . connect_event ( self . systrayIcon , widgetUtils . MENU , self . show_hide , menuitem = self . systrayIcon . show_hide )
widgetUtils . connect_event ( self . systrayIcon , widgetUtils . MENU , self . check_for_updates , menuitem = self . systrayIcon . check_for_updates )
widgetUtils . connect_event ( self . systrayIcon , widgetUtils . MENU , self . view_documentation , menuitem = self . systrayIcon . doc )
widgetUtils . connect_event ( self . systrayIcon , widgetUtils . MENU , self . exit , menuitem = self . systrayIcon . exit )
widgetUtils . connect_event ( self . systrayIcon , widgetUtils . TASKBAR_LEFT_CLICK , self . taskbar_left_click )
widgetUtils . connect_event ( self . systrayIcon , widgetUtils . TASKBAR_RIGHT_CLICK , self . taskbar_right_click )
def taskbar_left_click ( self , * args , * * kwargs ) :
if self . showing == True :
self . view . set_focus ( )
else :
self . show_hide ( )
def taskbar_right_click ( self , * args , * * kwargs ) :
self . systrayIcon . show_menu ( )
2022-03-24 10:37:21 -06:00
def get_handler ( self , type ) :
handler = self . handlers . get ( type )
2025-08-30 22:48:00 +02:00
if handler is None :
2023-04-03 13:35:05 -06:00
if type == " mastodon " :
2022-11-07 09:54:09 -06:00
handler = MastodonHandler . Handler ( )
2025-08-30 22:48:00 +02:00
elif type == " atprotosocial " :
handler = ATProtoSocialHandler . Handler ( )
self . handlers [ type ] = handler
2022-11-07 09:17:08 -06:00
return handler
2022-03-24 10:37:21 -06:00
2021-06-16 16:18:41 -05:00
def __init__ ( self ) :
super ( Controller , self ) . __init__ ( )
# Visibility state.
self . showing = True
# main window
self . view = view . mainFrame ( )
# buffers list.
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
self . buffers : list [ buffers . base . Buffer ] = [ ] # Added type hint
2021-06-16 16:18:41 -05:00
self . started = False
# accounts list.
self . accounts = [ ]
# This saves the current account (important in invisible mode)
self . current_account = " "
2022-12-20 12:21:30 -06:00
# this saves current menu bar layout.
self . menubar_current_handler = " "
2022-03-24 10:37:21 -06:00
# Handlers are special objects as they manage the mapping of available features and events in different social networks.
self . handlers = dict ( )
2021-06-16 16:18:41 -05:00
self . view . prepare ( )
self . bind_other_events ( )
2022-02-24 16:26:05 -06:00
self . set_systray_icon ( )
2021-06-16 16:18:41 -05:00
def check_invisible_at_startup ( self ) :
2022-11-03 17:11:13 -06:00
# Visibility check.
2021-06-16 16:18:41 -05:00
if config . app [ " app-settings " ] [ " hide_gui " ] == True :
self . show_hide ( )
self . view . Show ( )
self . view . Hide ( )
# Invisible keyboard Shorcuts check.
if config . app [ " app-settings " ] [ " use_invisible_keyboard_shorcuts " ] == True :
km = self . create_invisible_keyboard_shorcuts ( )
self . register_invisible_keyboard_shorcuts ( km )
def do_work ( self ) :
""" Creates the buffer objects for all accounts. This does not starts the buffer streams, only creates the objects. """
log . debug ( " Creating buffers for all sessions... " )
for i in sessions . sessions :
log . debug ( " Working on session %s " % ( i , ) )
if sessions . sessions [ i ] . is_logged == False :
2025-08-30 22:48:00 +02:00
# Try auto-login for ATProtoSocial sessions if credentials exist
try :
if getattr ( sessions . sessions [ i ] , " type " , None ) == " atprotosocial " :
sessions . sessions [ i ] . login ( )
except Exception :
log . exception ( " Auto-login attempt failed for session %s " , i )
if sessions . sessions [ i ] . is_logged == False :
self . create_ignored_session_buffer ( sessions . sessions [ i ] )
continue
# Supported session types
valid_session_types = [ " mastodon " , " atprotosocial " ]
2022-11-07 09:54:09 -06:00
if sessions . sessions [ i ] . type in valid_session_types :
2025-08-30 22:48:00 +02:00
try :
handler = self . get_handler ( type = sessions . sessions [ i ] . type )
if handler is not None :
handler . create_buffers ( sessions . sessions [ i ] , controller = self )
except Exception :
log . exception ( " Error creating buffers for session %s ( %s ) " , i , sessions . sessions [ i ] . type )
2021-06-16 16:18:41 -05:00
log . debug ( " Setting updates to buffers every %d seconds... " % ( 60 * config . app [ " app-settings " ] [ " update_period " ] , ) )
self . update_buffers_function = RepeatingTimer ( 60 * config . app [ " app-settings " ] [ " update_period " ] , self . update_buffers )
self . update_buffers_function . start ( )
def start ( self ) :
""" Starts all buffer objects. Loads their items. """
for i in sessions . sessions :
if sessions . sessions [ i ] . is_logged == False : continue
self . start_buffers ( sessions . sessions [ i ] )
self . set_buffer_positions ( sessions . sessions [ i ] )
2022-03-24 10:37:21 -06:00
if hasattr ( sessions . sessions [ i ] , " start_streaming " ) :
sessions . sessions [ i ] . start_streaming ( )
2021-06-16 16:18:41 -05:00
if config . app [ " app-settings " ] [ " play_ready_sound " ] == True :
sessions . sessions [ list ( sessions . sessions . keys ( ) ) [ 0 ] ] . sound . play ( " ready.ogg " )
if config . app [ " app-settings " ] [ " speak_ready_msg " ] == True :
output . speak ( _ ( u " Ready " ) )
self . started = True
2022-12-20 12:21:30 -06:00
if len ( self . accounts ) > 0 :
b = self . get_first_buffer ( self . accounts [ 0 ] )
self . update_menus ( handler = self . get_handler ( b . session . type ) )
2021-06-29 17:16:53 -05:00
2021-06-16 16:18:41 -05:00
def create_ignored_session_buffer ( self , session ) :
2022-11-16 11:01:52 -06:00
pub . sendMessage ( " core.create_account " , name = session . get_name ( ) , session_id = session . session_id )
2021-06-16 16:18:41 -05:00
def login_account ( self , session_id ) :
for i in sessions . sessions :
if sessions . sessions [ i ] . session_id == session_id : session = sessions . sessions [ i ]
session . login ( )
2022-11-08 08:48:35 -06:00
handler = self . get_handler ( type = session . type )
if handler != None and hasattr ( handler , " create_buffers " ) :
2025-08-30 22:48:00 +02:00
try :
handler . create_buffers ( session = session , controller = self , createAccounts = False )
except Exception :
log . exception ( " Error creating buffers after login for session %s ( %s ) " , session . session_id , session . type )
2021-06-16 16:18:41 -05:00
self . start_buffers ( session )
2022-11-18 13:41:12 -06:00
if hasattr ( session , " start_streaming " ) :
session . start_streaming ( )
2021-06-16 16:18:41 -05:00
2022-11-16 11:01:52 -06:00
def create_account_buffer ( self , name , session_id , logged = False ) :
2022-03-24 10:37:21 -06:00
account = buffers . base . AccountBuffer ( self . view . nb , name , name , session_id )
2022-11-16 11:01:52 -06:00
if logged == False :
account . logged = logged
2022-03-24 10:37:21 -06:00
account . setup_account ( )
self . buffers . append ( account )
self . view . add_buffer ( account . buffer , name = name )
2021-08-30 10:51:26 -05:00
def create_buffer ( self , buffer_type = " baseBuffer " , session_type = " twitter " , buffer_title = " " , parent_tab = None , start = False , kwargs = { } ) :
2025-08-30 22:48:00 +02:00
# Copy kwargs to avoid mutating a shared dict across calls
if not isinstance ( kwargs , dict ) :
kwargs = { }
else :
kwargs = dict ( kwargs )
2021-08-30 10:51:26 -05:00
log . debug ( " Creating buffer of type {0} with parent_tab of {2} arguments {1} " . format ( buffer_type , kwargs , parent_tab ) )
2022-11-15 13:31:11 -06:00
if kwargs . get ( " parent " ) == None :
kwargs [ " parent " ] = self . view . nb
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
if not hasattr ( buffers , session_type ) and session_type != " atprotosocial " : # Allow atprotosocial to be handled separately
2021-08-30 10:51:26 -05:00
raise AttributeError ( " Session type %s does not exist yet. " % ( session_type ) )
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
2025-08-30 22:48:00 +02:00
try :
buffer_panel_class = None
if session_type == " atprotosocial " :
from wxUI . buffers . atprotosocial import panels as ATProtoSocialPanels # Import new panels
if buffer_type == " home_timeline " :
buffer_panel_class = ATProtoSocialPanels . ATProtoSocialHomeTimelinePanel
# kwargs for HomeTimelinePanel: parent, name, session
# 'name' is buffer_title, 'parent' is self.view.nb
# 'session' needs to be fetched based on user_id in kwargs
if " user_id " in kwargs and " session " not in kwargs : # Ensure session is passed
kwargs [ " session " ] = sessions . sessions . get ( kwargs [ " user_id " ] )
# Clean unsupported kwarg for panel ctor
if " user_id " in kwargs :
kwargs . pop ( " user_id " , None )
if " name " not in kwargs : kwargs [ " name " ] = buffer_title
elif buffer_type == " user_timeline " :
buffer_panel_class = ATProtoSocialPanels . ATProtoSocialUserTimelinePanel
# kwargs for UserTimelinePanel: parent, name, session, target_user_did, target_user_handle
if " user_id " in kwargs and " session " not in kwargs :
kwargs [ " session " ] = sessions . sessions . get ( kwargs [ " user_id " ] )
kwargs . pop ( " user_id " , None )
if " name " not in kwargs : kwargs [ " name " ] = buffer_title
# target_user_did and target_user_handle must be in kwargs from atprotosocial.Handler
elif buffer_type == " notifications " :
buffer_panel_class = ATProtoSocialPanels . ATProtoSocialNotificationPanel
if " user_id " in kwargs and " session " not in kwargs :
kwargs [ " session " ] = sessions . sessions . get ( kwargs [ " user_id " ] )
kwargs . pop ( " user_id " , None )
if " name " not in kwargs : kwargs [ " name " ] = buffer_title
# target_user_did and target_user_handle must be in kwargs from atprotosocial.Handler
elif buffer_type == " notifications " :
buffer_panel_class = ATProtoSocialPanels . ATProtoSocialNotificationPanel
if " user_id " in kwargs and " session " not in kwargs :
kwargs [ " session " ] = sessions . sessions . get ( kwargs [ " user_id " ] )
kwargs . pop ( " user_id " , None )
if " name " not in kwargs : kwargs [ " name " ] = buffer_title
elif buffer_type == " user_list_followers " or buffer_type == " user_list_following " :
buffer_panel_class = ATProtoSocialPanels . ATProtoSocialUserListPanel
elif buffer_type == " following_timeline " :
buffer_panel_class = ATProtoSocialPanels . ATProtoSocialFollowingTimelinePanel
# Clean stray keys that this panel doesn't accept
kwargs . pop ( " user_id " , None )
kwargs . pop ( " list_type " , None )
if " name " not in kwargs : kwargs [ " name " ] = buffer_title
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
else :
2025-08-30 22:48:00 +02:00
log . warning ( f " Unsupported ATProtoSocial buffer type: { buffer_type } . Falling back to generic. " )
# Fallback to trying to find it in generic buffers or error
available_buffers = getattr ( buffers , " base " , None ) # Or some generic panel module
if available_buffers and hasattr ( available_buffers , buffer_type ) :
buffer_panel_class = getattr ( available_buffers , buffer_type )
elif available_buffers and hasattr ( available_buffers , " TimelinePanel " ) : # Example generic
buffer_panel_class = getattr ( available_buffers , " TimelinePanel " )
else :
raise AttributeError ( f " ATProtoSocial buffer type { buffer_type } not found in atprotosocial.panels or base panels. " )
else : # Existing logic for other session types
available_buffers = getattr ( buffers , session_type )
if not hasattr ( available_buffers , buffer_type ) :
raise AttributeError ( " Specified buffer type does not exist: %s " % ( buffer_type , ) )
buffer_panel_class = getattr ( available_buffers , buffer_type )
# Instantiate the panel
# Ensure 'parent' kwarg is correctly set if not already
if " parent " not in kwargs :
kwargs [ " parent " ] = self . view . nb # self.view.nb is the wx.Treebook
buffer = buffer_panel_class ( * * kwargs ) # This is the wx.Panel instance
if start :
2021-08-31 10:31:18 -05:00
try :
2025-08-30 22:48:00 +02:00
if hasattr ( buffer , " start_stream " ) :
buffer . start_stream ( mandatory = True , play_sound = False )
2021-08-31 10:31:18 -05:00
except ValueError :
commonMessageDialogs . unauthorized ( )
return
2025-08-30 22:48:00 +02:00
self . buffers . append ( buffer )
if parent_tab == None :
log . debug ( " Appending buffer {} ... " . format ( buffer , ) )
self . view . add_buffer ( buffer . buffer , buffer_title )
2021-08-31 10:31:18 -05:00
else :
2025-08-30 22:48:00 +02:00
self . view . insert_buffer ( buffer . buffer , buffer_title , parent_tab )
log . debug ( " Inserting buffer {0} into control {1} " . format ( buffer , parent_tab ) )
except Exception :
log . exception ( " Error creating buffer ' %s ' for session_type ' %s ' " , buffer_type , session_type )
2021-08-30 10:51:26 -05:00
2021-06-16 16:18:41 -05:00
def set_buffer_positions ( self , session ) :
" Sets positions for buffers if values exist in the database. "
for i in self . buffers :
2022-11-14 17:51:27 -06:00
if i . account == session . get_name ( ) and i . name + " _pos " in session . db and hasattr ( i . buffer , ' list ' ) :
2021-06-16 16:18:41 -05:00
i . buffer . list . select_item ( session . db [ str ( i . name + " _pos " ) ] )
def logout_account ( self , session_id ) :
for i in sessions . sessions :
if sessions . sessions [ i ] . session_id == session_id : session = sessions . sessions [ i ]
2022-11-14 17:51:27 -06:00
name = session . get_name ( )
2021-06-16 16:18:41 -05:00
delete_buffers = [ ]
for i in self . buffers :
2022-11-14 17:51:27 -06:00
if i . account == name and i . name != name :
2021-06-16 16:18:41 -05:00
delete_buffers . append ( i . name )
for i in delete_buffers :
2022-11-15 16:15:09 -06:00
self . destroy_buffer ( i , name )
2021-06-16 16:18:41 -05:00
session . db = None
2022-11-20 02:23:12 -06:00
session . logged = False
2021-06-16 16:18:41 -05:00
2022-11-15 16:15:09 -06:00
def destroy_buffer ( self , buffer_name , session_name ) :
buffer = self . search_buffer ( buffer_name , session_name )
if buffer == None :
return
buff = self . view . search ( buffer . name , session_name )
if buff == None :
return
2021-06-16 16:18:41 -05:00
self . view . delete_buffer ( buff )
self . buffers . remove ( buffer )
del buffer
def search_topic ( self , term ) :
self . search ( value = term )
def search ( self , event = None , value = " " , * args , * * kwargs ) :
2022-11-07 16:06:52 -06:00
buffer = self . get_best_buffer ( )
handler = self . get_handler ( type = buffer . session . type )
if handler != None and hasattr ( handler , " search " ) :
return handler . search ( controller = self , session = buffer . session , value = value )
2021-06-16 16:18:41 -05:00
def find ( self , * args , * * kwargs ) :
if ' string ' in kwargs :
string = kwargs [ ' string ' ]
else :
string = ' '
dlg = dialogs . find . findDialog ( string )
if dlg . get_response ( ) == widgetUtils . OK and dlg . get ( " string " ) != " " :
string = dlg . get ( " string " )
#If we still have an empty string for some reason (I.E. user clicked cancel, etc), return here.
if string == ' ' :
log . debug ( " Find canceled. " )
return
page = self . get_current_buffer ( )
if not hasattr ( page . buffer , " list " ) :
output . speak ( _ ( u " No session is currently in focus. Focus a session with the next or previous session shortcut. " ) , True )
return
count = page . buffer . list . get_count ( )
if count < 1 :
output . speak ( _ ( u " Empty buffer. " ) , True )
return
start = page . buffer . list . get_selected ( )
for i in range ( start , count ) :
if string . lower ( ) in page . buffer . list . get_text_column ( i , 1 ) . lower ( ) :
page . buffer . list . select_item ( i )
return output . speak ( page . get_message ( ) , True )
output . speak ( _ ( u " {0} not found. " ) . format ( string , ) , True )
def seekLeft ( self , * args , * * kwargs ) :
try :
sound . URLPlayer . seek ( - 5000 )
except :
output . speak ( " Unable to seek. " , True )
def seekRight ( self , * args , * * kwargs ) :
try :
sound . URLPlayer . seek ( 5000 )
except :
output . speak ( " Unable to seek. " , True )
def edit_keystrokes ( self , * args , * * kwargs ) :
2022-12-20 13:02:27 -06:00
buffer = self . get_best_buffer ( )
editor = keystrokeEditor . KeystrokeEditor ( buffer . session . type )
2021-06-16 16:18:41 -05:00
if editor . changed == True :
config . keymap . write ( )
register = False
# determines if we need to reassign the keymap.
if self . showing == False :
register = True
elif config . app [ " app-settings " ] [ " use_invisible_keyboard_shorcuts " ] == True :
register = True
# If there is a keyboard handler instance we need unregister all old keystrokes before register the new ones.
if hasattr ( self , " keyboard_handler " ) :
keymap = { }
for i in editor . hold_map :
if hasattr ( self , i ) : keymap [ editor . hold_map [ i ] ] = getattr ( self , i )
self . unregister_invisible_keyboard_shorcuts ( keymap )
self . invisible_shorcuts_changed ( registered = register )
def learn_sounds ( self , * args , * * kwargs ) :
""" Opens the sounds tutorial for the current account. """
buffer = self . get_best_buffer ( )
SoundsTutorial . soundsTutorial ( buffer . session )
def configuration ( self , * args , * * kwargs ) :
""" Opens the global settings dialogue. """
d = settings . globalSettingsController ( )
if d . response == widgetUtils . OK :
d . save_configuration ( )
if d . needs_restart == True :
commonMessageDialogs . needs_restart ( )
restart . restart_program ( )
def accountConfiguration ( self , * args , * * kwargs ) :
""" Opens the account settings dialogue for the current account. """
2022-11-07 12:26:58 -06:00
buffer = self . get_best_buffer ( )
handler = self . get_handler ( type = buffer . session . type )
if handler != None and hasattr ( handler , " account_settings " ) :
manager . manager . set_current_session ( buffer . session . session_id )
return handler . account_settings ( buffer = buffer , controller = self )
2021-06-16 16:18:41 -05:00
def check_for_updates ( self , * args , * * kwargs ) :
2023-06-03 00:39:42 +01:00
if not getattr ( sys , ' frozen ' , False ) :
log . debug ( " Running from source, can ' t update " )
commonMessageDialogs . cant_update_source ( )
return
2021-06-16 16:18:41 -05:00
update = updater . do_update ( )
if update == False :
view . no_update_available ( )
def delete ( self , * args , * * kwargs ) :
""" Deletes an item in the current buffer.
Users can only remove their tweets and direct messages , other users ' tweets and people (followers, friends, blocked, etc) can not be removed using this method. " " "
buffer = self . view . get_current_buffer ( )
if hasattr ( buffer , " account " ) :
buffer = self . search_buffer ( buffer . name , buffer . account )
buffer . destroy_status ( )
def exit ( self , * args , * * kwargs ) :
if config . app [ " app-settings " ] [ " ask_at_exit " ] == True :
answer = commonMessageDialogs . exit_dialog ( self . view )
if answer == widgetUtils . YES :
self . exit_ ( )
else :
self . exit_ ( )
def exit_ ( self , * args , * * kwargs ) :
for i in self . buffers : i . save_positions ( )
log . debug ( " Exiting... " )
log . debug ( " Saving global configuration... " )
for item in sessions . sessions :
2022-11-16 12:35:19 -06:00
if sessions . sessions [ item ] . logged == False :
continue
2021-06-16 16:18:41 -05:00
sessions . sessions [ item ] . sound . cleaner . cancel ( )
2021-06-25 23:35:33 -05:00
log . debug ( " Saving database for " + sessions . sessions [ item ] . session_id )
sessions . sessions [ item ] . save_persistent_data ( )
2022-02-24 16:26:05 -06:00
self . systrayIcon . RemoveIcon ( )
pidpath = os . path . join ( os . getenv ( " temp " ) , " {} .pid " . format ( application . name ) )
if os . path . exists ( pidpath ) :
os . remove ( pidpath )
2021-06-16 16:18:41 -05:00
widgetUtils . exit_application ( )
def follow ( self , * args , * * kwargs ) :
2022-11-07 12:26:58 -06:00
buffer = self . get_current_buffer ( )
handler = self . get_handler ( type = buffer . session . type )
if handler != None and hasattr ( handler , " follow " ) :
return handler . follow ( buffer = buffer )
2021-06-16 16:18:41 -05:00
2021-07-06 13:58:13 -05:00
def add_alias ( self , * args , * * kwargs ) :
2022-11-07 12:26:58 -06:00
buffer = self . get_best_buffer ( )
handler = self . get_handler ( type = buffer . session . type )
if handler != None and hasattr ( handler , " add_alias " ) :
return handler . add_alias ( buffer = buffer )
2021-10-26 10:45:11 -05:00
def manage_aliases ( self , * args , * * kwargs ) :
2022-11-07 12:26:58 -06:00
buffer = self . get_best_buffer ( )
alias_controller = userAlias . userAliasController ( buffer . session . settings )
2021-07-06 13:58:13 -05:00
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
def post_tweet ( self , event = None ) : # This is the "New Post" menu item
""" Opens the compose dialog for a new post. """
2021-06-16 16:18:41 -05:00
buffer = self . get_best_buffer ( )
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
if not buffer or not buffer . session :
output . speak ( _ ( " No active session to compose a post. " ) , True )
return
session = buffer . session
2025-08-30 22:48:00 +02:00
# Compose for Bluesky (ATProto): dialog with attachments/CW/language
if getattr ( session , " type " , " " ) == " atprotosocial " :
# In invisible interface, prefer a quick, minimal compose to avoid complex UI
if self . showing == False :
# Parent=None so it shows even if main window is hidden
dlg = wx . TextEntryDialog ( None , _ ( " Write your post: " ) , _ ( " Compose " ) )
if dlg . ShowModal ( ) == wx . ID_OK :
text = dlg . GetValue ( ) . strip ( )
dlg . Destroy ( )
if not text :
return
try :
uri = session . send_message ( text )
if uri :
output . speak ( _ ( " Post sent successfully! " ) , True )
else :
output . speak ( _ ( " Failed to send post. " ) , True )
except Exception :
log . exception ( " Error sending Bluesky post from invisible compose " )
output . speak ( _ ( " An error occurred while posting to Bluesky. " ) , True )
else :
dlg . Destroy ( )
return
from wxUI . dialogs . atprotosocial . postDialogs import Post as ATPostDialog
dlg = ATPostDialog ( )
if dlg . ShowModal ( ) == wx . ID_OK :
text , files , cw_text , langs = dlg . get_payload ( )
dlg . Destroy ( )
if not text and not files :
return
try :
uri = session . send_message ( text , files = files , cw_text = cw_text , is_sensitive = bool ( cw_text ) , languages = langs )
if uri :
output . speak ( _ ( " Post sent successfully! " ) , True )
try :
if hasattr ( buffer , " start_stream " ) :
buffer . start_stream ( mandatory = False , play_sound = False )
except Exception :
pass
else :
output . speak ( _ ( " Failed to send post. " ) , True )
except Exception :
log . exception ( " Error sending Bluesky post from compose dialog " )
output . speak ( _ ( " An error occurred while posting to Bluesky. " ) , True )
else :
dlg . Destroy ( )
return
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
# For a new post, reply_to_uri and quote_uri are None.
# Import the new dialog
from wxUI . dialogs . composeDialog import ComposeDialog
# Pass self.view as parent
dialog = ComposeDialog ( parent = self . view , session = session )
# We don't call dialog.ShowModal() directly if its on_send uses pubsub.
# The dialog will be shown, and its on_send will publish a message.
# mainController.handle_compose_dialog_send will handle the rest.
dialog . Show ( ) # Use Show() for non-modal if pubsub handles closing, or ShowModal() if dialog handles its lifecycle
def handle_compose_dialog_send ( self , session , text , files , reply_to , cw_text , is_sensitive , kwargs , dialog_instance ) :
""" Handles the actual sending of a post after ComposeDialog publishes data. """
async def do_send_post ( ) :
try :
wx . CallAfter ( dialog_instance . send_btn . Disable )
wx . CallAfter ( wx . BeginBusyCursor )
post_uri = await session . send_message (
message = text ,
files = files ,
reply_to = reply_to ,
cw_text = cw_text ,
is_sensitive = is_sensitive ,
* * kwargs
)
if post_uri :
output . speak ( _ ( " Post sent successfully! " ) , True )
wx . CallAfter ( dialog_instance . EndModal , wx . ID_OK )
# Optionally, add to relevant buffer or update UI
# This might involve fetching the new post and adding to message_cache and posts_buffer
# new_post_data = await session.util.get_post_by_uri(post_uri) # Assuming such a util method
# if new_post_data:
# await self.check_buffers(new_post_data) # check_buffers needs to handle PostView or dict
else :
# This case should ideally be handled by send_message raising an error
output . speak ( _ ( " Failed to send post. The server did not confirm the post creation. " ) , True )
wx . CallAfter ( dialog_instance . send_btn . Enable , True )
except NotificationError as e :
logger . error ( f " NotificationError sending post via dialog: { e } " , exc_info = True )
output . speak ( _ ( " Error sending post: {error} " ) . format ( error = str ( e ) ) , True )
wx . CallAfter ( wx . MessageBox , str ( e ) , _ ( " Post Error " ) , wx . OK | wx . ICON_ERROR , dialog_instance )
if not dialog_instance . IsBeingDeleted ( ) : wx . CallAfter ( dialog_instance . send_btn . Enable , True )
except Exception as e :
logger . error ( f " Unexpected error sending post via dialog: { e } " , exc_info = True )
output . speak ( _ ( " An unexpected error occurred: {error} " ) . format ( error = str ( e ) ) , True )
wx . CallAfter ( wx . MessageBox , str ( e ) , _ ( " Error " ) , wx . OK | wx . ICON_ERROR , dialog_instance )
if not dialog_instance . IsBeingDeleted ( ) : wx . CallAfter ( dialog_instance . send_btn . Enable , True )
finally :
if not dialog_instance . IsBeingDeleted ( ) : wx . CallAfter ( wx . EndBusyCursor )
asyncio . create_task ( do_send_post ( ) )
2021-06-16 16:18:41 -05:00
def post_reply ( self , * args , * * kwargs ) :
2025-08-30 22:48:00 +02:00
buffer = self . get_current_buffer ( )
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
if not buffer or not buffer . session :
output . speak ( _ ( " No active session to reply. " ) , True )
return
2025-08-30 22:48:00 +02:00
selected_item_uri = None
if hasattr ( buffer , " get_selected_item_id " ) :
selected_item_uri = buffer . get_selected_item_id ( )
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
if not selected_item_uri :
output . speak ( _ ( " No item selected to reply to. " ) , True )
return
2025-08-30 22:48:00 +02:00
session = buffer . session
if getattr ( session , " type " , " " ) == " atprotosocial " :
if self . showing == False :
dlg = wx . TextEntryDialog ( None , _ ( " Write your reply: " ) , _ ( " Reply " ) )
if dlg . ShowModal ( ) == wx . ID_OK :
text = dlg . GetValue ( ) . strip ( )
dlg . Destroy ( )
if not text :
return
try :
uri = session . send_message ( text , reply_to = selected_item_uri )
if uri :
output . speak ( _ ( " Reply sent. " ) , True )
else :
output . speak ( _ ( " Failed to send reply. " ) , True )
except Exception :
log . exception ( " Error sending Bluesky reply (invisible) " )
output . speak ( _ ( " An error occurred while replying. " ) , True )
else :
dlg . Destroy ( )
return
from wxUI . dialogs . atprotosocial . postDialogs import Post as ATPostDialog
dlg = ATPostDialog ( caption = _ ( " Reply " ) )
if dlg . ShowModal ( ) == wx . ID_OK :
text , files , cw_text , langs = dlg . get_payload ( )
dlg . Destroy ( )
if not text and not files :
return
try :
uri = session . send_message ( text , files = files , cw_text = cw_text , is_sensitive = bool ( cw_text ) , languages = langs , reply_to = selected_item_uri )
if uri :
output . speak ( _ ( " Reply sent. " ) , True )
try :
if hasattr ( buffer , " start_stream " ) :
buffer . start_stream ( mandatory = False , play_sound = False )
except Exception :
pass
else :
output . speak ( _ ( " Failed to send reply. " ) , True )
except Exception :
log . exception ( " Error sending Bluesky reply (dialog) " )
output . speak ( _ ( " An error occurred while replying. " ) , True )
else :
dlg . Destroy ( )
return
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
from wxUI . dialogs . composeDialog import ComposeDialog
2025-08-30 22:48:00 +02:00
dialog = ComposeDialog ( parent = self . view , session = buffer . session , reply_to_uri = selected_item_uri , initial_text = " " )
dialog . Show ( )
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
2021-06-16 16:18:41 -05:00
def send_dm ( self , * args , * * kwargs ) :
buffer = self . get_current_buffer ( )
2022-11-07 13:02:54 -06:00
if hasattr ( buffer , " send_message " ) :
buffer . send_message ( )
2021-06-16 16:18:41 -05:00
def post_retweet ( self , * args , * * kwargs ) :
buffer = self . get_current_buffer ( )
2025-08-30 22:48:00 +02:00
if hasattr ( buffer , " share_item " ) :
return buffer . share_item ( )
session = getattr ( buffer , " session " , None )
if not session :
return
if getattr ( session , " type " , " " ) == " atprotosocial " :
item_uri = None
if hasattr ( buffer , " get_selected_item_id " ) :
item_uri = buffer . get_selected_item_id ( )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
if not item_uri :
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
output . speak ( _ ( " No item selected. " ) , True )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
return
2025-08-30 22:48:00 +02:00
if self . showing == False :
dlg = wx . TextEntryDialog ( None , _ ( " Write your quote (optional): " ) , _ ( " Quote " ) )
if dlg . ShowModal ( ) == wx . ID_OK :
text = dlg . GetValue ( ) . strip ( )
dlg . Destroy ( )
try :
2025-11-07 09:24:02 +01:00
if text :
uri = session . send_message ( text , quote_uri = item_uri )
if uri :
output . speak ( _ ( " Quote posted. " ) , True )
else :
output . speak ( _ ( " Failed to send quote. " ) , True )
2025-08-30 22:48:00 +02:00
else :
2025-11-07 09:24:02 +01:00
# Confirm repost (share) depending on preference (boost_mode)
ask = True
try :
ask = session . settings [ " general " ] . get ( " boost_mode " , " ask " ) == " ask "
except Exception :
ask = True
if ask :
confirm = wx . MessageDialog ( None , _ ( " Would you like to share this post? " ) , _ ( " Boost " ) , wx . YES_NO | wx . ICON_QUESTION )
if confirm . ShowModal ( ) != wx . ID_YES :
confirm . Destroy ( )
return
confirm . Destroy ( )
r_uri = session . repost ( item_uri )
if r_uri :
output . speak ( _ ( " Post shared. " ) , True )
else :
output . speak ( _ ( " Failed to share post. " ) , True )
2025-08-30 22:48:00 +02:00
except Exception :
2025-11-07 09:24:02 +01:00
log . exception ( " Error sharing/quoting Bluesky post (invisible) " )
output . speak ( _ ( " An error occurred while sharing the post. " ) , True )
2025-08-30 22:48:00 +02:00
else :
dlg . Destroy ( )
return
from wxUI . dialogs . atprotosocial . postDialogs import Post as ATPostDialog
dlg = ATPostDialog ( caption = _ ( " Quote post " ) )
if dlg . ShowModal ( ) == wx . ID_OK :
text , files , cw_text , langs = dlg . get_payload ( )
dlg . Destroy ( )
try :
2025-11-07 09:24:02 +01:00
if text or files or cw_text :
uri = session . send_message ( text , files = files , cw_text = cw_text , is_sensitive = bool ( cw_text ) , languages = langs , quote_uri = item_uri )
if uri :
output . speak ( _ ( " Quote posted. " ) , True )
try :
if hasattr ( buffer , " start_stream " ) :
buffer . start_stream ( mandatory = False , play_sound = False )
except Exception :
pass
else :
output . speak ( _ ( " Failed to send quote. " ) , True )
else :
# Confirm repost without comment depending on preference
ask = True
2025-08-30 22:48:00 +02:00
try :
2025-11-07 09:24:02 +01:00
ask = session . settings [ " general " ] . get ( " boost_mode " , " ask " ) == " ask "
2025-08-30 22:48:00 +02:00
except Exception :
2025-11-07 09:24:02 +01:00
ask = True
if ask :
confirm = wx . MessageDialog ( self . view , _ ( " Would you like to share this post? " ) , _ ( " Boost " ) , wx . YES_NO | wx . ICON_QUESTION )
if confirm . ShowModal ( ) != wx . ID_YES :
confirm . Destroy ( )
return
confirm . Destroy ( )
r_uri = session . repost ( item_uri )
if r_uri :
output . speak ( _ ( " Post shared. " ) , True )
else :
output . speak ( _ ( " Failed to share post. " ) , True )
2025-08-30 22:48:00 +02:00
except Exception :
2025-11-07 09:24:02 +01:00
log . exception ( " Error sharing/quoting Bluesky post (dialog) " )
output . speak ( _ ( " An error occurred while sharing the post. " ) , True )
2025-08-30 22:48:00 +02:00
else :
dlg . Destroy ( )
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
return
2021-06-16 16:18:41 -05:00
def add_to_favourites ( self , * args , * * kwargs ) :
buffer = self . get_current_buffer ( )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
if hasattr ( buffer , " add_to_favorites " ) : # Generic buffer method
2022-11-07 13:02:54 -06:00
return buffer . add_to_favorites ( )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
elif buffer . session and buffer . session . KIND == " atprotosocial " :
item_uri = buffer . get_selected_item_id ( )
if not item_uri :
output . speak ( _ ( " No item selected to like. " ) , True )
return
social_handler = self . get_handler ( buffer . session . KIND )
async def _like ( ) :
result = await social_handler . like_item ( buffer . session , item_uri )
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
wx . CallAfter ( output . speak , result [ " message " ] , True ) # Ensure UI updates on main thread
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
if result . get ( " status " ) == " success " and result . get ( " like_uri " ) :
if hasattr ( buffer , " store_item_viewer_state " ) :
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
# Ensure store_item_viewer_state is called on main thread if it modifies UI/shared data
wx . CallAfter ( buffer . store_item_viewer_state , item_uri , " like_uri " , result [ " like_uri " ] )
# Also update the item in message_cache to reflect the like
if buffer . session and hasattr ( buffer . session , " message_cache " ) and item_uri in buffer . session . message_cache :
cached_post = buffer . session . message_cache [ item_uri ]
if isinstance ( cached_post , dict ) and isinstance ( cached_post . get ( " viewer " ) , dict ) :
cached_post [ " viewer " ] [ " like " ] = result [ " like_uri " ]
elif hasattr ( cached_post , " viewer " ) and cached_post . viewer : # SDK model
cached_post . viewer . like = result [ " like_uri " ]
# No need to call buffer.update_item here unless it re-renders from scratch
# The visual feedback might come from a list refresh or specific item update later
asyncio . create_task ( _like ( ) ) # wx.CallAfter for the task itself if _like might interact with UI before await
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
2021-06-16 16:18:41 -05:00
def remove_from_favourites ( self , * args , * * kwargs ) :
buffer = self . get_current_buffer ( )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
if hasattr ( buffer , " remove_from_favorites " ) : # Generic buffer method
2022-11-07 13:02:54 -06:00
return buffer . remove_from_favorites ( )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
elif buffer . session and buffer . session . KIND == " atprotosocial " :
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
item_uri = buffer . get_selected_item_id ( )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
if not item_uri :
output . speak ( _ ( " No item selected to unlike. " ) , True )
return
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
like_uri = None
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
# Check viewer state from message_cache first, then panel's internal viewer_states
if buffer . session and hasattr ( buffer . session , " message_cache " ) and item_uri in buffer . session . message_cache :
cached_post = buffer . session . message_cache [ item_uri ]
if isinstance ( cached_post , dict ) and isinstance ( cached_post . get ( " viewer " ) , dict ) :
like_uri = cached_post [ " viewer " ] . get ( " like " )
elif hasattr ( cached_post , " viewer " ) and cached_post . viewer : # SDK model
like_uri = cached_post . viewer . like
if not like_uri and hasattr ( buffer , " get_item_viewer_state " ) : # Fallback to panel's state if any
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
like_uri = buffer . get_item_viewer_state ( item_uri , " like_uri " )
if not like_uri :
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
output . speak ( _ ( " Could not find the original like record for this post, or it ' s already unliked. " ) , True )
logger . warning ( f " Attempted to unlike post { item_uri } but its like_uri was not found. " )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
return
social_handler = self . get_handler ( buffer . session . KIND )
async def _unlike ( ) :
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
result = await social_handler . unlike_item ( buffer . session , like_uri )
wx . CallAfter ( output . speak , result [ " message " ] , True )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
if result . get ( " status " ) == " success " :
if hasattr ( buffer , " store_item_viewer_state " ) :
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
wx . CallAfter ( buffer . store_item_viewer_state , item_uri , " like_uri " , None )
# Also update the item in message_cache
if buffer . session and hasattr ( buffer . session , " message_cache " ) and item_uri in buffer . session . message_cache :
cached_post = buffer . session . message_cache [ item_uri ]
if isinstance ( cached_post , dict ) and isinstance ( cached_post . get ( " viewer " ) , dict ) :
cached_post [ " viewer " ] [ " like " ] = None
elif hasattr ( cached_post , " viewer " ) and cached_post . viewer :
cached_post . viewer . like = None
asyncio . create_task ( _unlike ( ) )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
2021-06-16 16:18:41 -05:00
def toggle_like ( self , * args , * * kwargs ) :
buffer = self . get_current_buffer ( )
2022-11-07 13:02:54 -06:00
if hasattr ( buffer , " toggle_favorite " ) :
return buffer . toggle_favorite ( )
2021-06-16 16:18:41 -05:00
2023-02-17 23:19:34 -06:00
def vote ( self , * args , * * kwargs ) :
buffer = self . get_current_buffer ( )
if hasattr ( buffer , " vote " ) :
return buffer . vote ( )
2021-06-16 16:18:41 -05:00
def view_item ( self , * args , * * kwargs ) :
buffer = self . get_current_buffer ( )
2022-11-07 13:02:54 -06:00
if hasattr ( buffer , " view_item " ) :
return buffer . view_item ( )
2021-06-16 16:18:41 -05:00
def open_in_browser ( self , * args , * * kwargs ) :
buffer = self . get_current_buffer ( )
if hasattr ( buffer , " open_in_browser " ) :
buffer . open_in_browser ( )
def open_favs_timeline ( self , * args , * * kwargs ) :
2022-11-07 13:55:08 -06:00
buffer = self . get_best_buffer ( )
handler = self . get_handler ( type = buffer . session . type )
if handler != None and hasattr ( handler , " open_timeline " ) :
return handler . open_timeline ( controller = self , buffer = buffer , default = " favorites " )
2021-06-16 16:18:41 -05:00
2022-11-07 13:55:08 -06:00
def open_timeline ( self , * args , * * kwargs ) :
buffer = self . get_best_buffer ( )
handler = self . get_handler ( type = buffer . session . type )
if handler != None and hasattr ( handler , " open_timeline " ) :
return handler . open_timeline ( controller = self , buffer = buffer )
2021-06-16 16:18:41 -05:00
def open_conversation ( self , * args , * * kwargs ) :
2022-11-07 13:55:08 -06:00
buffer = self . get_best_buffer ( )
handler = self . get_handler ( type = buffer . session . type )
if handler != None and hasattr ( handler , " open_conversation " ) :
return handler . open_conversation ( controller = self , buffer = buffer )
2021-06-16 16:18:41 -05:00
def show_hide ( self , * args , * * kwargs ) :
km = self . create_invisible_keyboard_shorcuts ( )
if self . showing == True :
if config . app [ " app-settings " ] [ " use_invisible_keyboard_shorcuts " ] == False :
self . register_invisible_keyboard_shorcuts ( km )
self . view . Hide ( )
self . fix_wrong_buffer ( )
self . showing = False
else :
if config . app [ " app-settings " ] [ " use_invisible_keyboard_shorcuts " ] == False :
self . unregister_invisible_keyboard_shorcuts ( km )
self . view . Show ( )
self . showing = True
def get_more_items ( self , * args , * * kwargs ) :
2022-11-07 15:55:28 -06:00
buffer = self . get_current_buffer ( )
if hasattr ( buffer , " get_more_items " ) :
return buffer . get_more_items ( )
2021-06-16 16:18:41 -05:00
def clear_buffer ( self , * args , * * kwargs ) :
2022-11-07 15:55:28 -06:00
buffer = self . get_current_buffer ( )
2022-11-24 16:36:08 -06:00
if hasattr ( buffer , " clear_list " ) :
2022-11-07 15:55:28 -06:00
return buffer . clear_list ( )
2021-06-16 16:18:41 -05:00
def remove_buffer ( self , * args , * * kwargs ) :
buffer = self . get_current_buffer ( )
2022-11-07 15:55:28 -06:00
if not hasattr ( buffer , " account " ) :
return
2021-06-16 16:18:41 -05:00
buff = self . view . search ( buffer . name , buffer . account )
answer = buffer . remove_buffer ( )
2022-11-07 15:55:28 -06:00
if answer == False :
return
2021-06-16 16:18:41 -05:00
log . debug ( " destroying buffer... " )
self . right ( )
self . view . delete_buffer ( buff )
buffer . session . sound . play ( " delete_timeline.ogg " )
self . buffers . remove ( buffer )
del buffer
def skip_buffer ( self , forward = True ) :
buff = self . get_current_buffer ( )
if buff . invisible == False :
self . view . advance_selection ( forward )
def buffer_changed ( self , * args , * * kwargs ) :
buffer = self . get_current_buffer ( )
2022-12-20 12:21:30 -06:00
old_account = self . current_account
new_account = buffer . account
if new_account != old_account :
2021-06-16 16:18:41 -05:00
self . current_account = buffer . account
2022-12-20 12:21:30 -06:00
new_first_buffer = self . get_first_buffer ( new_account )
2022-12-20 13:02:27 -06:00
if new_first_buffer != None and new_first_buffer . session . type != self . menubar_current_handler :
2022-12-20 12:21:30 -06:00
handler = self . get_handler ( new_first_buffer . session . type )
self . menubar_current_handler = new_first_buffer . session . type
self . update_menus ( handler )
2022-11-07 15:55:28 -06:00
if not hasattr ( buffer , " session " ) or buffer . session == None :
return
2021-06-16 16:18:41 -05:00
muted = autoread = False
if buffer . name in buffer . session . settings [ " other_buffers " ] [ " muted_buffers " ] :
muted = True
elif buffer . name in buffer . session . settings [ " other_buffers " ] [ " autoread_buffers " ] :
autoread = True
self . view . check_menuitem ( " mute_buffer " , muted )
self . view . check_menuitem ( " autoread " , autoread )
2022-12-20 12:21:30 -06:00
def update_menus ( self , handler ) :
if hasattr ( handler , " menus " ) :
for m in list ( handler . menus . keys ( ) ) :
if hasattr ( self . view , m ) :
menu_item = getattr ( self . view , m )
if handler . menus [ m ] == None :
menu_item . Enable ( False )
else :
menu_item . Enable ( True )
menu_item . SetItemLabel ( handler . menus [ m ] )
2022-12-21 10:24:44 -06:00
if hasattr ( handler , " item_menu " ) :
self . view . menubar . SetMenuLabel ( 1 , handler . item_menu )
2022-12-20 12:21:30 -06:00
2021-06-16 16:18:41 -05:00
def fix_wrong_buffer ( self ) :
buf = self . get_best_buffer ( )
if buf == None :
for i in self . accounts :
buffer = self . view . search ( " home_timeline " , i )
2022-11-07 15:55:28 -06:00
if buffer != None :
break
2021-06-16 16:18:41 -05:00
else :
2022-11-14 17:51:27 -06:00
buffer = self . view . search ( " home_timeline " , buf . session . get_name ( ) )
2021-06-16 16:18:41 -05:00
if buffer != None :
self . view . change_buffer ( buffer )
def up ( self , * args , * * kwargs ) :
page = self . get_current_buffer ( )
if not hasattr ( page . buffer , " list " ) :
output . speak ( _ ( u " No session is currently in focus. Focus a session with the next or previous session shortcut. " ) , True )
return
position = page . buffer . list . get_selected ( )
index = position - 1
try :
page . buffer . list . select_item ( index )
except :
pass
if position == page . buffer . list . get_selected ( ) :
page . session . sound . play ( " limit.ogg " )
2021-12-10 15:23:41 -06:00
# try:
output . speak ( page . get_message ( ) , True )
# except:
# pass
2021-06-16 16:18:41 -05:00
def down ( self , * args , * * kwargs ) :
page = self . get_current_buffer ( )
if not hasattr ( page . buffer , " list " ) :
output . speak ( _ ( u " No session is currently in focus. Focus a session with the next or previous session shortcut. " ) , True )
return
position = page . buffer . list . get_selected ( )
index = position + 1
2021-12-10 15:23:41 -06:00
# try:
page . buffer . list . select_item ( index )
# except:
# pass
2021-06-16 16:18:41 -05:00
if position == page . buffer . list . get_selected ( ) :
page . session . sound . play ( " limit.ogg " )
2021-12-10 15:23:41 -06:00
# try:
output . speak ( page . get_message ( ) , True )
# except:
# pass
2021-06-16 16:18:41 -05:00
def left ( self , * args , * * kwargs ) :
buff = self . view . get_current_buffer_pos ( )
buffer = self . get_current_buffer ( )
if not hasattr ( buffer . buffer , " list " ) :
output . speak ( _ ( u " No session is currently in focus. Focus a session with the next or previous session shortcut. " ) , True )
return
if buff == self . get_first_buffer_index ( buffer . account ) or buff == 0 :
self . view . change_buffer ( self . get_last_buffer_index ( buffer . account ) )
else :
self . view . change_buffer ( buff - 1 )
while self . get_current_buffer ( ) . invisible == False : self . skip_buffer ( False )
buffer = self . get_current_buffer ( )
if self . showing == True : buffer . buffer . set_focus_in_list ( )
try :
msg = _ ( u " %s , %s of %s " ) % ( self . view . get_buffer_text ( ) , buffer . buffer . list . get_selected ( ) + 1 , buffer . buffer . list . get_count ( ) )
except :
msg = _ ( u " %s . Empty " ) % ( self . view . get_buffer_text ( ) , )
output . speak ( msg , True )
def right ( self , * args , * * kwargs ) :
buff = self . view . get_current_buffer_pos ( )
buffer = self . get_current_buffer ( )
if not hasattr ( buffer . buffer , " list " ) :
output . speak ( _ ( u " No session is currently in focus. Focus a session with the next or previous session shortcut. " ) , True )
return
if buff == self . get_last_buffer_index ( buffer . account ) or buff + 1 == self . view . get_buffer_count ( ) :
self . view . change_buffer ( self . get_first_buffer_index ( buffer . account ) )
else :
self . view . change_buffer ( buff + 1 )
while self . get_current_buffer ( ) . invisible == False : self . skip_buffer ( True )
buffer = self . get_current_buffer ( )
if self . showing == True : buffer . buffer . set_focus_in_list ( )
try :
msg = _ ( u " %s , %s of %s " ) % ( self . view . get_buffer_text ( ) , buffer . buffer . list . get_selected ( ) + 1 , buffer . buffer . list . get_count ( ) )
except :
msg = _ ( u " %s . Empty " ) % ( self . view . get_buffer_text ( ) , )
output . speak ( msg , True )
def next_account ( self , * args , * * kwargs ) :
2023-02-06 02:43:00 -06:00
try :
index = self . accounts . index ( self . current_account )
except ValueError :
index = - 1
2021-06-16 16:18:41 -05:00
if index + 1 == len ( self . accounts ) :
index = 0
else :
index = index + 1
account = self . accounts [ index ]
self . current_account = account
buffer_object = self . get_first_buffer ( account )
if buffer_object == None :
2025-08-30 22:48:00 +02:00
output . speak ( _ ( u " {0} : This account is not logged in. " ) . format ( account ) , True )
2021-06-16 16:18:41 -05:00
return
buff = self . view . search ( buffer_object . name , account )
if buff == None :
2025-08-30 22:48:00 +02:00
output . speak ( _ ( u " {0} : This account is not logged in. " ) . format ( account ) , True )
2021-06-16 16:18:41 -05:00
return
self . view . change_buffer ( buff )
buffer = self . get_current_buffer ( )
if self . showing == True : buffer . buffer . set_focus_in_list ( )
try :
msg = _ ( u " %s . %s , %s of %s " ) % ( buffer . account , self . view . get_buffer_text ( ) , buffer . buffer . list . get_selected ( ) + 1 , buffer . buffer . list . get_count ( ) )
except :
msg = _ ( u " %s . Empty " ) % ( self . view . get_buffer_text ( ) , )
output . speak ( msg , True )
def previous_account ( self , * args , * * kwargs ) :
2023-02-08 23:00:45 -06:00
try :
index = self . accounts . index ( self . current_account )
except ValueError :
index = 0
2021-06-16 16:18:41 -05:00
if index - 1 < 0 :
index = len ( self . accounts ) - 1
else :
index = index - 1
account = self . accounts [ index ]
self . current_account = account
buffer_object = self . get_first_buffer ( account )
if buffer_object == None :
2025-08-30 22:48:00 +02:00
output . speak ( _ ( u " {0} : This account is not logged in. " ) . format ( account ) , True )
2021-06-16 16:18:41 -05:00
return
buff = self . view . search ( buffer_object . name , account )
if buff == None :
2025-08-30 22:48:00 +02:00
output . speak ( _ ( u " {0} : This account is not logged in. " ) . format ( account ) , True )
2021-06-16 16:18:41 -05:00
return
self . view . change_buffer ( buff )
buffer = self . get_current_buffer ( )
if self . showing == True : buffer . buffer . set_focus_in_list ( )
try :
msg = _ ( u " %s . %s , %s of %s " ) % ( buffer . account , self . view . get_buffer_text ( ) , buffer . buffer . list . get_selected ( ) + 1 , buffer . buffer . list . get_count ( ) )
except :
msg = _ ( u " %s . Empty " ) % ( self . view . get_buffer_text ( ) , )
output . speak ( msg , True )
def go_home ( self ) :
buffer = self . get_current_buffer ( )
buffer . buffer . list . select_item ( 0 )
2021-12-10 15:23:41 -06:00
# try:
output . speak ( buffer . get_message ( ) , True )
# except:
# pass
2021-06-16 16:18:41 -05:00
def go_end ( self ) :
buffer = self . get_current_buffer ( )
buffer . buffer . list . select_item ( buffer . buffer . list . get_count ( ) - 1 )
2021-12-10 15:23:41 -06:00
# try:
output . speak ( buffer . get_message ( ) , True )
# except:
# pass
2021-06-16 16:18:41 -05:00
def go_page_up ( self ) :
buffer = self . get_current_buffer ( )
if buffer . buffer . list . get_selected ( ) < = 20 :
index = 0
else :
index = buffer . buffer . list . get_selected ( ) - 20
buffer . buffer . list . select_item ( index )
2021-12-10 15:23:41 -06:00
# try:
output . speak ( buffer . get_message ( ) , True )
# except:
# pass
2021-06-16 16:18:41 -05:00
def go_page_down ( self ) :
buffer = self . get_current_buffer ( )
if buffer . buffer . list . get_selected ( ) > = buffer . buffer . list . get_count ( ) - 20 :
index = buffer . buffer . list . get_count ( ) - 1
else :
index = buffer . buffer . list . get_selected ( ) + 20
buffer . buffer . list . select_item ( index )
2021-12-10 15:23:41 -06:00
# try:
output . speak ( buffer . get_message ( ) , True )
# except:
# pass
2021-06-16 16:18:41 -05:00
def url ( self , * args , * * kwargs ) :
buffer = self . get_current_buffer ( )
2022-11-07 15:55:28 -06:00
if hasattr ( buffer , " url " ) :
buffer . url ( )
2021-06-16 16:18:41 -05:00
def audio ( self , * args , * * kwargs ) :
2022-11-07 15:55:28 -06:00
buffer = self . get_current_buffer ( )
if hasattr ( buffer , " audio " ) :
return buffer . audio ( )
2021-06-16 16:18:41 -05:00
def volume_down ( self , * args , * * kwargs ) :
2022-11-07 15:55:28 -06:00
buffer = self . get_current_buffer ( )
if hasattr ( buffer , " volume_down " ) :
return buffer . volume_down ( )
2021-06-16 16:18:41 -05:00
def volume_up ( self , * args , * * kwargs ) :
2022-11-07 15:55:28 -06:00
buffer = self . get_current_buffer ( )
if hasattr ( buffer , " volume_up " ) :
return buffer . volume_up ( )
2021-06-16 16:18:41 -05:00
def create_invisible_keyboard_shorcuts ( self ) :
keymap = { }
for i in config . keymap [ " keymap " ] :
if hasattr ( self , i ) :
2021-07-06 17:01:42 -05:00
if config . keymap [ " keymap " ] [ i ] != " " :
keymap [ config . keymap [ " keymap " ] [ i ] ] = getattr ( self , i )
2021-06-16 16:18:41 -05:00
return keymap
def register_invisible_keyboard_shorcuts ( self , keymap ) :
if config . changed_keymap :
2024-05-16 10:52:11 -06:00
build_number = sys . getwindowsversion ( ) . build
if build_number > 22000 :
system = " Windows 11 "
keystroke_editor_shortcut = " Control+Win+Alt+K "
else :
system = " Windows 10 "
keystroke_editor_shortcut = " Win+Alt+K "
commonMessageDialogs . changed_keymap ( system , keystroke_editor_shortcut )
2021-07-13 17:53:01 -05:00
# Make sure we pass a keymap without undefined keystrokes.
new_keymap = { key : keymap [ key ] for key in keymap . keys ( ) if keymap [ key ] != " " }
2021-06-16 16:18:41 -05:00
self . keyboard_handler = WXKeyboardHandler ( self . view )
2021-07-13 17:53:01 -05:00
self . keyboard_handler . register_keys ( new_keymap )
2021-06-16 16:18:41 -05:00
def unregister_invisible_keyboard_shorcuts ( self , keymap ) :
try :
self . keyboard_handler . unregister_keys ( keymap )
del self . keyboard_handler
except AttributeError :
pass
def notify ( self , session , play_sound = None , message = None , notification = False ) :
2022-11-07 15:55:28 -06:00
if session . settings [ " sound " ] [ " session_mute " ] == True :
return
2021-06-16 16:18:41 -05:00
if play_sound != None :
session . sound . play ( play_sound )
if message != None :
output . speak ( message , speech = session . settings [ " reporting " ] [ " speech_reporting " ] , braille = session . settings [ " reporting " ] [ " braille_reporting " ] )
def start_buffers ( self , session ) :
log . debug ( " starting buffers... Session %s " % ( session . session_id , ) )
2022-11-07 15:55:28 -06:00
handler = self . get_handler ( type = session . type )
2021-06-16 16:18:41 -05:00
for i in self . buffers :
if i . session == session and i . needs_init == True :
2022-11-07 15:55:28 -06:00
handler . start_buffer ( controller = self , buffer = i )
2021-06-16 16:18:41 -05:00
def set_positions ( self ) :
for i in sessions . sessions :
self . set_buffer_positions ( i )
def invisible_shorcuts_changed ( self , registered ) :
if registered == True :
km = self . create_invisible_keyboard_shorcuts ( )
self . register_invisible_keyboard_shorcuts ( km )
elif registered == False :
km = self . create_invisible_keyboard_shorcuts ( )
self . unregister_invisible_keyboard_shorcuts ( km )
def about ( self , * args , * * kwargs ) :
self . view . about_dialog ( )
def get_soundpacks ( self , * args , * * kwargs ) :
# This should redirect users of other languages to the right version of the TWBlue website.
lang = languageHandler . curLang [ : 2 ]
url = application . url
final_url = " {0} / {1} /soundpacks " . format ( url , lang )
try :
response = requests . get ( final_url )
except :
output . speak ( _ ( u " An error happened while trying to connect to the server. Please try later. " ) )
return
2023-12-31 12:20:06 -06:00
# There is no twblue.mcvsoftware.com/en, so if English is the language used this should be False anyway.
2021-06-16 16:18:41 -05:00
if response . status_code == 200 and lang != " en " :
webbrowser . open_new_tab ( final_url )
else :
webbrowser . open_new_tab ( application . url + " /soundpacks " )
def visit_website ( self , * args , * * kwargs ) :
# This should redirect users of other languages to the right version of the TWBlue website.
lang = languageHandler . curLang [ : 2 ]
url = application . url
final_url = " {0} / {1} " . format ( url , lang )
try :
response = requests . get ( final_url )
except :
output . speak ( _ ( u " An error happened while trying to connect to the server. Please try later. " ) )
return
2023-12-31 12:20:06 -06:00
# There is no twblue.mcvsoftware.com/en, so if English is the language used this should be False anyway.
2021-06-16 16:18:41 -05:00
if response . status_code == 200 and lang != " en " :
webbrowser . open_new_tab ( final_url )
else :
webbrowser . open_new_tab ( application . url )
def manage_accounts ( self , * args , * * kwargs ) :
sm = sessionManager . sessionManagerController ( started = True )
sm . fill_list ( )
sm . show ( )
for i in sm . new_sessions :
2022-11-08 08:48:35 -06:00
handler = self . get_handler ( type = sessions . sessions [ i ] . type )
2022-11-08 15:16:01 -06:00
if handler != None and hasattr ( handler , " create_buffers " ) :
2022-11-08 08:48:35 -06:00
handler . create_buffers ( controller = self , session = sessions . sessions [ i ] )
2021-06-16 16:18:41 -05:00
call_threaded ( self . start_buffers , sessions . sessions [ i ] )
for i in sm . removed_sessions :
if sessions . sessions [ i ] . logged == True :
self . logout_account ( sessions . sessions [ i ] . session_id )
2022-12-21 10:24:44 -06:00
self . destroy_buffer ( sessions . sessions [ i ] . get_name ( ) , sessions . sessions [ i ] . get_name ( ) )
if sessions . sessions [ i ] . get_name ( ) in self . accounts :
self . accounts . remove ( sessions . sessions [ i ] . get_name ( ) )
2021-06-16 16:18:41 -05:00
sessions . sessions . pop ( i )
def toggle_autoread ( self , * args , * * kwargs ) :
buffer = self . get_current_buffer ( )
2022-11-07 15:55:28 -06:00
if hasattr ( buffer , " session " ) and buffer . session == None :
return
2021-06-16 16:18:41 -05:00
if buffer . name not in buffer . session . settings [ " other_buffers " ] [ " autoread_buffers " ] :
buffer . session . settings [ " other_buffers " ] [ " autoread_buffers " ] . append ( buffer . name )
output . speak ( _ ( u " The auto-reading of new tweets is enabled for this buffer " ) , True )
elif buffer . name in buffer . session . settings [ " other_buffers " ] [ " autoread_buffers " ] :
buffer . session . settings [ " other_buffers " ] [ " autoread_buffers " ] . remove ( buffer . name )
output . speak ( _ ( u " The auto-reading of new tweets is disabled for this buffer " ) , True )
buffer . session . settings . write ( )
def toggle_session_mute ( self , * args , * * kwargs ) :
buffer = self . get_best_buffer ( )
if buffer . session . settings [ " sound " ] [ " session_mute " ] == False :
buffer . session . settings [ " sound " ] [ " session_mute " ] = True
output . speak ( _ ( u " Session mute on " ) , True )
elif buffer . session . settings [ " sound " ] [ " session_mute " ] == True :
buffer . session . settings [ " sound " ] [ " session_mute " ] = False
output . speak ( _ ( u " Session mute off " ) , True )
buffer . session . settings . write ( )
def toggle_buffer_mute ( self , * args , * * kwargs ) :
buffer = self . get_current_buffer ( )
2022-11-07 15:55:28 -06:00
if hasattr ( buffer , " session " ) and buffer . session == None :
return
2021-06-16 16:18:41 -05:00
if buffer . name not in buffer . session . settings [ " other_buffers " ] [ " muted_buffers " ] :
buffer . session . settings [ " other_buffers " ] [ " muted_buffers " ] . append ( buffer . name )
output . speak ( _ ( u " Buffer mute on " ) , True )
elif buffer . name in buffer . session . settings [ " other_buffers " ] [ " muted_buffers " ] :
buffer . session . settings [ " other_buffers " ] [ " muted_buffers " ] . remove ( buffer . name )
output . speak ( _ ( u " Buffer mute off " ) , True )
buffer . session . settings . write ( )
def view_documentation ( self , * args , * * kwargs ) :
lang = localization . get ( " documentation " )
os . chdir ( " documentation/ %s " % ( lang , ) )
webbrowser . open ( " manual.html " )
os . chdir ( " ../../ " )
def view_changelog ( self , * args , * * kwargs ) :
2021-11-03 12:30:46 -06:00
lang = localization . get ( " documentation " )
os . chdir ( " documentation/ %s " % ( lang , ) )
webbrowser . open ( " changelog.html " )
os . chdir ( " ../../ " )
2021-06-16 16:18:41 -05:00
def copy_to_clipboard ( self , * args , * * kwargs ) :
output . copy ( self . get_current_buffer ( ) . get_message ( ) )
output . speak ( _ ( u " Copied " ) )
def repeat_item ( self , * args , * * kwargs ) :
output . speak ( self . get_current_buffer ( ) . get_message ( ) )
2023-08-27 17:56:39 +01:00
def execute_action ( self , action , kwargs = { } ) :
2021-06-16 16:18:41 -05:00
if hasattr ( self , action ) :
2023-08-27 17:56:39 +01:00
getattr ( self , action ) ( * * kwargs )
2021-06-16 16:18:41 -05:00
def update_buffers ( self ) :
for i in self . buffers [ : ] :
if i . session != None and i . session . is_logged == True :
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
# For ATProtoSocial, initial load is in session.start() or manual.
# Periodic updates would need a separate timer or manual refresh via update_buffer.
if i . session . KIND != " atprotosocial " :
try :
i . start_stream ( mandatory = True ) # This is likely for streaming connections or timed polling within buffer
except Exception as err :
log . exception ( " Error %s starting buffer %s on account %s , with args %r and kwargs %r . " % ( str ( err ) , i . name , i . account , i . args , i . kwargs ) )
2021-06-16 16:18:41 -05:00
def update_buffer ( self , * args , * * kwargs ) :
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
""" Handles the ' Update buffer ' menu command to fetch newest items. """
bf = self . get_current_buffer ( ) # bf is the buffer panel instance
if not bf or not hasattr ( bf , " session " ) or not bf . session :
output . speak ( _ ( u " No active session for this buffer. " ) , True )
return
output . speak ( _ ( u " Updating buffer... " ) , True )
session = bf . session
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
async def do_update ( ) :
new_ids = [ ]
try :
if session . KIND == " atprotosocial " :
if bf . name == f " { session . label } Home " : # Assuming buffer name indicates type
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
# Its panel's load_initial_posts calls session.fetch_home_timeline
if hasattr ( bf , " load_initial_posts " ) : # Generic for timeline panels
await bf . load_initial_posts ( limit = config . app [ " app-settings " ] . get ( " items_per_request " , 20 ) )
new_ids = getattr ( bf , " item_uris " , [ ] )
else : # Should not happen if panel is correctly typed
logger . warning ( f " Home timeline panel for { session . KIND } missing load_initial_posts " )
elif bf . type == " notifications " and hasattr ( bf , " refresh_notifications " ) :
await bf . refresh_notifications ( limit = config . app [ " app-settings " ] . get ( " items_per_request " , 20 ) )
new_ids = [ ]
elif bf . type == " user_timeline " and hasattr ( bf , " load_initial_posts " ) :
await bf . load_initial_posts ( limit = config . app [ " app-settings " ] . get ( " items_per_request " , 20 ) )
new_ids = getattr ( bf , " item_uris " , [ ] )
elif bf . type in [ " user_list_followers " , " user_list_following " ] and hasattr ( bf , " load_initial_users " ) :
await bf . load_initial_users ( limit = config . app [ " app-settings " ] . get ( " items_per_request " , 30 ) )
new_ids = [ u . get ( " did " ) for u in getattr ( bf , " user_list_data " , [ ] ) if isinstance ( u , dict ) ]
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
else :
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
if hasattr ( bf , " start_stream " ) : # Fallback for non-ATProtoSocial panels or unhandled types
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
count = bf . start_stream ( mandatory = True , avoid_autoreading = True )
if count is not None : new_ids = [ str ( x ) for x in range ( count ) ] # Dummy IDs for count
else :
output . speak ( _ ( u " This buffer type cannot be updated in this way. " ) , True )
return
else : # For other session types (e.g. Mastodon)
if hasattr ( bf , " start_stream " ) :
count = bf . start_stream ( mandatory = True , avoid_autoreading = True )
if count is not None : new_ids = [ str ( x ) for x in range ( count ) ] # Dummy IDs for count
else :
output . speak ( _ ( u " Unable to update this buffer. " ) , True )
return
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
# Generic feedback based on new_ids for timelines or user lists
if bf . type in [ " home_timeline " , " user_timeline " ] :
output . speak ( _ ( " {0} posts retrieved " ) . format ( len ( new_ids ) ) , True )
elif bf . type in [ " user_list_followers " , " user_list_following " ] :
output . speak ( _ ( " {0} users retrieved " ) . format ( len ( new_ids ) ) , True )
elif bf . type == " notifications " :
output . speak ( _ ( " Notifications updated. " ) , True )
# else, original start_stream might have given feedback
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
except NotificationError as e :
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
output . speak ( str ( e ) , True ) # Ensure output.speak is on main thread if called from here
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
except Exception as e_general :
logger . error ( f " Error updating buffer { bf . name } : { e_general } " , exc_info = True )
output . speak ( _ ( " An error occurred while updating the buffer. " ) , True )
wx . CallAfter ( asyncio . create_task , do_update ( ) )
def get_more_items ( self , * args , * * kwargs ) :
""" Handles ' Load previous items ' menu command. """
bf = self . get_current_buffer ( ) # bf is the buffer panel instance
if not bf or not hasattr ( bf , " session " ) or not bf . session :
output . speak ( _ ( u " No active session for this buffer. " ) , True )
2021-06-16 16:18:41 -05:00
return
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
session = bf . session
# The buffer panel (bf) needs to store its own cursor for pagination of older items
# e.g., bf.pagination_cursor or bf.older_items_cursor
# This cursor should be set by the result of previous fetch_..._timeline(new_only=False) calls.
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
# For ATProtoSocial, session methods like fetch_home_timeline store their own cursor (e.g., session.home_timeline_cursor)
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
# The panel (bf) itself should manage its own cursor for "load more"
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
current_cursor = None
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
can_load_more_natively = False
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
if session . KIND == " atprotosocial " :
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
if hasattr ( bf , " load_more_posts " ) : # For ATProtoSocialUserTimelinePanel & ATProtoSocialHomeTimelinePanel
can_load_more_natively = True
if hasattr ( bf , " load_more_posts " ) :
can_load_more_natively = True
elif hasattr ( bf , " load_more_users " ) :
can_load_more_natively = True
elif bf . type == " notifications " and hasattr ( bf , " load_more_notifications " ) : # Check for specific load_more
can_load_more_natively = True
elif bf . type == " notifications " and hasattr ( bf , " refresh_notifications " ) : # Fallback for notifications to refresh
# If load_more_notifications doesn't exist, 'Load More' will just refresh.
can_load_more_natively = True # It will call refresh_notifications via the final 'else'
else :
if hasattr ( bf , " get_more_items " ) :
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
return bf . get_more_items ( )
else :
output . speak ( _ ( u " This buffer does not support loading more items in this way. " ) , True )
return
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
else : # For other non-ATProtoSocial session types
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
if hasattr ( bf , " get_more_items " ) :
return bf . get_more_items ( )
else :
output . speak ( _ ( u " This buffer does not support loading more items. " ) , True )
return
output . speak ( _ ( u " Loading more items... " ) , True )
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
async def do_load_more ( ) :
try :
if session . KIND == " atprotosocial " :
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
if hasattr ( bf , " load_more_posts " ) :
await bf . load_more_posts ( limit = config . app [ " app-settings " ] . get ( " items_per_request " , 20 ) )
elif hasattr ( bf , " load_more_users " ) :
await bf . load_more_users ( limit = config . app [ " app-settings " ] . get ( " items_per_request " , 30 ) )
elif bf . type == " notifications " and hasattr ( bf , " refresh_notifications " ) :
# This will re-fetch recent, not older. A true "load_more_notifications(cursor=...)" is needed for that.
wx . CallAfter ( output . speak , _ ( " Refreshing notifications... " ) , True )
await bf . refresh_notifications ( limit = config . app [ " app-settings " ] . get ( " items_per_request " , 20 ) )
# Feedback is handled by panel methods for consistency
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
except NotificationError as e :
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
wx . CallAfter ( output . speak , str ( e ) , True )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
except Exception as e_general :
logger . error ( f " Error loading more items for buffer { bf . name } : { e_general } " , exc_info = True )
output . speak ( _ ( " An error occurred while loading more items. " ) , True )
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
wx . CallAfter ( asyncio . create_task , do_load_more ( ) )
2021-06-16 16:18:41 -05:00
def buffer_title_changed ( self , buffer ) :
2021-11-01 05:18:46 -06:00
if buffer . name . endswith ( " -timeline " ) :
2021-06-16 16:18:41 -05:00
title = _ ( u " Timeline for {} " ) . format ( buffer . username , )
2021-11-01 05:18:46 -06:00
elif buffer . name . endswith ( " -followers " ) :
2021-06-16 16:18:41 -05:00
title = _ ( u " Followers for {} " ) . format ( buffer . username , )
2021-11-01 05:18:46 -06:00
elif buffer . name . endswith ( " -friends " ) :
2021-06-16 16:18:41 -05:00
title = _ ( u " Friends for {} " ) . format ( buffer . username , )
2022-11-20 02:23:12 -06:00
elif buffer . name . endswith ( " -following " ) :
title = _ ( u " Following for {} " ) . format ( buffer . username , )
2021-06-16 16:18:41 -05:00
buffer_index = self . view . search ( buffer . name , buffer . account )
self . view . set_page_title ( buffer_index , title )
def ocr_image ( self , * args , * * kwargs ) :
buffer = self . get_current_buffer ( )
2022-11-07 15:55:28 -06:00
if hasattr ( buffer , " ocr_image " ) :
return buffer . ocr_image ( )
2021-06-16 16:18:41 -05:00
def save_data_in_db ( self ) :
for i in sessions . sessions :
2021-06-25 23:35:33 -05:00
sessions . sessions [ i ] . save_persistent_data ( )
2021-06-28 17:03:26 -05:00
2022-01-25 12:01:03 -06:00
def toggle_share_settings ( self , shareable = True ) :
2022-12-20 12:21:30 -06:00
self . view . share . Enable ( shareable )
2022-01-25 12:01:03 -06:00
2022-11-18 16:29:53 -06:00
def mastodon_new_item ( self , item , session_name , _buffers ) :
sound_to_play = None
for buff in _buffers :
buffer = self . search_buffer ( buff , session_name )
if buffer == None or buffer . session . get_name ( ) != session_name :
return
buffer . add_new_item ( item )
if buff == " home_timeline " : sound_to_play = " tweet_received.ogg "
elif buff == " mentions " : sound_to_play = " mention_received.ogg "
elif buff == " direct_messages " : sound_to_play = " dm_received.ogg "
elif buff == " sent " : sound_to_play = " tweet_send.ogg "
2022-11-19 19:36:21 -06:00
elif buff == " followers " or buff == " following " : sound_to_play = " update_followers.ogg "
2022-12-19 16:07:45 -06:00
elif buff == " notifications " : sound_to_play = " new_event.ogg "
2022-11-18 16:29:53 -06:00
elif " timeline " in buff : sound_to_play = " tweet_timeline.ogg "
else : sound_to_play = None
if sound_to_play != None and buff not in buffer . session . settings [ " other_buffers " ] [ " muted_buffers " ] :
self . notify ( buffer . session , sound_to_play )
2022-11-19 19:36:21 -06:00
2022-11-25 17:43:03 -06:00
def mastodon_updated_item ( self , item , session_name , _buffers ) :
sound_to_play = None
for buff in _buffers . keys ( ) :
buffer = self . search_buffer ( buff , session_name )
if buffer == None or buffer . session . get_name ( ) != session_name :
return
buffer . update_item ( item , _buffers [ buff ] )
2022-11-19 19:36:21 -06:00
# Normally, we'd define this function on mastodon's session, but we need to access conversationListBuffer and here is the best place to do so.
def mastodon_new_conversation ( self , conversation , session_name ) :
buffer = self . search_buffer ( " direct_messages " , session_name )
if buffer == None :
2022-11-20 14:54:10 -06:00
log . error ( " Buffer not found: direct_messages on {} " . format ( session_name ) )
2022-11-19 19:36:21 -06:00
return # Direct messages buffer is hidden
new_position , number_of_items = buffer . order_buffer ( [ conversation ] )
buffer . put_items_on_list ( number_of_items )
if new_position > - 1 :
buffer . buffer . list . select_item ( new_position )
2022-11-20 15:01:15 -06:00
# if number_of_items > 0:
# sound_to_play = "dm_received.ogg"
# if "direct_messages" not in buffer.session.settings["other_buffers"]["muted_buffers"]:
2023-02-25 10:39:05 +01:00
# self.notify(buffer.session, sound_to_play)
2024-12-31 18:51:00 -06:00
def mastodon_error_post ( self , name , reply_to , visibility , posts , language ) :
2023-03-23 13:17:55 -06:00
home = self . search_buffer ( " home_timeline " , name )
2023-04-03 13:35:05 -06:00
if home != None :
2024-12-31 18:51:00 -06:00
wx . CallAfter ( home . post_from_error , visibility = visibility , reply_to = reply_to , data = posts , lang = language )
2023-03-23 13:17:55 -06:00
2023-04-05 09:39:39 -06:00
def change_buffer_title ( self , name , buffer , title ) :
buffer_index = self . view . search ( buffer , name )
if buffer_index != None and buffer_index > - 1 :
self . view . set_page_title ( buffer_index , title )
2023-02-25 10:39:05 +01:00
def report_error ( self , * args , * * kwargs ) :
""" Redirects the user to the issue page on github """
log . debug ( " Redirecting the user to report an error... " )
webbrowser . open_new_tab ( application . report_bugs_url )
2023-06-08 00:40:38 +01:00
def update_profile ( self , * args ) :
""" Updates the users profile """
log . debug ( " Update profile " )
buffer = self . get_best_buffer ( )
handler = self . get_handler ( buffer . session . type )
if handler :
handler . update_profile ( buffer . session )
2023-08-10 17:19:58 +01:00
2023-10-10 17:43:31 -06:00
def user_details ( self , * args ) :
2023-08-10 17:19:58 +01:00
""" Displays a user ' s profile. """
log . debug ( " Showing user profile... " )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
buffer = self . get_current_buffer ( ) # Use current buffer to get context if item is selected
if not buffer or not buffer . session :
buffer = self . get_best_buffer ( ) # Fallback if current buffer has no session
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
if not buffer or not buffer . session :
output . speak ( _ ( " No active session to view user details. " ) , True )
return
2023-08-10 17:19:58 +01:00
handler = self . get_handler ( type = buffer . session . type )
2023-10-10 17:43:31 -06:00
if handler and hasattr ( handler , ' user_details ' ) :
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
# The handler's user_details method is responsible for extracting context
# (e.g., selected user) from the buffer and displaying the profile.
# For ATProtoSocial, handler.user_details calls the ShowUserProfileDialog.
# It's an async method, so needs to be called appropriately.
async def _show_details ( ) :
await handler . user_details ( buffer )
wx . CallAfter ( asyncio . create_task , _show_details ( ) )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
else :
output . speak ( _ ( " This session type does not support viewing user details in this way. " ) , True )
2023-08-27 17:56:39 +01:00
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
def openPostTimeline ( self , * args , user = None ) : # "user" here is often the user object from selected item
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
""" Opens selected user ' s posts timeline. Renamed to open_user_timeline in handlers for clarity. """
current_buffer = self . get_current_buffer ( )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
if not current_buffer or not current_buffer . session :
current_buffer = self . get_best_buffer ( )
if not current_buffer or not current_buffer . session :
output . speak ( _ ( " No active session available. " ) , True )
return
session_to_use = current_buffer . session
handler = self . get_handler ( type = session_to_use . type )
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
# Prefer the new standardized 'open_user_timeline'
if hasattr ( handler , ' open_user_timeline ' ) :
user_payload = user # Use passed 'user' if available
if user_payload is None and hasattr ( current_buffer , ' get_selected_item_author_details ' ) :
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
author_details = current_buffer . get_selected_item_author_details ( )
if author_details :
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
user_payload = author_details
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
async def _open_timeline ( ) :
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
# Pass self (mainController) to the handler method so it can call self.add_buffer
await handler . open_user_timeline ( main_controller = self , session = session_to_use , user_payload = user_payload )
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
wx . CallAfter ( asyncio . create_task , _open_timeline ( ) )
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
elif hasattr ( handler , ' openPostTimeline ' ) : # Fallback for older handler structure
# This path might not correctly pass main_controller if the old handler expects it differently
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
handler . openPostTimeline ( self , current_buffer , user )
else :
output . speak ( _ ( " This session type does not support opening user timelines directly. " ) , True )
2023-08-27 17:56:39 +01:00
def openFollowersTimeline ( self , * args , user = None ) :
""" Opens selected user ' s followers timeline
Parameters :
args : Other argument . Useful when binding to widgets .
user : if specified , open this user timeline . It is currently mandatory , but could be optional when user selection is implemented in handler
"""
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
current_buffer = self . get_current_buffer ( )
if not current_buffer or not current_buffer . session :
current_buffer = self . get_best_buffer ( )
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
if not current_buffer or not current_buffer . session :
output . speak ( _ ( " No active session available. " ) , True )
return
session_to_use = current_buffer . session
handler = self . get_handler ( type = session_to_use . type )
if user is None and hasattr ( current_buffer , ' get_selected_item_author_details ' ) :
author_details = current_buffer . get_selected_item_author_details ( )
if author_details : user = author_details
if handler and hasattr ( handler , ' open_followers_timeline ' ) :
async def _open_followers ( ) :
await handler . open_followers_timeline ( main_controller = self , session = session_to_use , user_payload = user )
wx . CallAfter ( asyncio . create_task , _open_followers ( ) )
elif handler and hasattr ( handler , ' openFollowersTimeline ' ) : # Fallback
handler . openFollowersTimeline ( self , current_buffer , user )
else :
output . speak ( _ ( " This session type does not support opening followers list. " ) , True )
2023-08-27 17:56:39 +01:00
def openFollowingTimeline ( self , * args , user = None ) :
""" Opens selected user ' s following timeline
Parameters :
args : Other argument . Useful when binding to widgets .
user : if specified , open this user timeline . It is currently mandatory , but could be optional when user selection is implemented in handler
"""
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
current_buffer = self . get_current_buffer ( )
if not current_buffer or not current_buffer . session :
current_buffer = self . get_best_buffer ( )
if not current_buffer or not current_buffer . session :
output . speak ( _ ( " No active session available. " ) , True )
return
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
session_to_use = current_buffer . session
handler = self . get_handler ( type = session_to_use . type )
if user is None and hasattr ( current_buffer , ' get_selected_item_author_details ' ) :
author_details = current_buffer . get_selected_item_author_details ( )
if author_details : user = author_details
Hi there! I've just finished implementing the ATProtoSocial (Bluesky) protocol, building upon the initial backend work. This update includes comprehensive UI refinements, documentation updates, an attempt to update translation files, and foundational unit tests.
Here's a breakdown of what I accomplished:
1. **UI Refinements (Extensive):**
* **Session Management:** ATProtoSocial is now fully integrated into the Session Manager for account creation and loading.
* **Compose Dialog:** I created and wired up a new generic `ComposeDialog`. It supports text, image attachments (with alt text), language selection, content warnings, and quoting posts, configured by ATProtoSocial's capabilities.
* **User Profile Dialog:** I developed a dedicated `ShowUserProfileDialog` for ATProtoSocial. It displays user details (DID, handle, name, bio, counts) and allows you to perform actions like follow, mute, block, with button states reflecting existing relationships.
* **Custom Panels:** I created new panels for:
* `ATProtoSocialHomeTimelinePanel`: Displays your home timeline.
* `ATProtoSocialUserTimelinePanel`: Displays a specific user's posts.
* `ATProtoSocialNotificationPanel`: Displays notifications.
* `ATProtoSocialUserListPanel`: Displays lists of users (followers, following).
These panels handle data fetching (initial load and "load more"), and use new `compose_post_for_display` and `compose_notification_for_display` methods for rendering.
* **Controller Integration:** I updated `mainController.py` and `atprotosocial/handler.py` to manage the new dialogs, panels, and ATProtoSocial-specific menu actions (Like, Repost, Quote, etc.). Asynchronous operations are handled using `wx.CallAfter`.
2. **Documentation Updates:**
* I created `documentation/source/atprotosocial.rst` detailing Bluesky support, account setup, and features.
* I updated `documentation/source/index.rst` to include the new page.
* I updated `documentation/source/basic_concepts.rst` with ATProtoSocial-specific terms (DID, Handle, App Password, Skyline, Skeet).
* I added a comprehensive entry to `doc/changelog.md` for this feature.
3. **Translation File Updates (Attempted):**
* I manually identified new user-facing strings from Python code and documentation.
* I manually updated `tools/twblue.pot` (application strings) and `tools/twblue-documentation.pot` (documentation strings) with these new strings. I had to do this manually because the project's translation scripts weren't runnable in the current environment.
* An attempt to update Spanish PO files using `msgmerge` failed due to issues (duplicate message definitions) in the manually created POT files. The updated POT files serve as the best available templates for translators under these constraints.
4. **Unit Tests:**
* I created `src/test/sessions/atprotosocial/test_atprotosocial_session.py`.
* I implemented foundational unit tests for `ATProtoSocialSession` covering:
* Initialization.
* Mocked authentication (login/authorize, success/failure).
* Mocked post sending (text, quotes, media).
* Mocked timeline fetching (home, user).
* Mocked notification fetching and handler dispatch.
* The tests utilize `unittest.IsolatedAsyncioTestCase` and extensive mocking of the Bluesky SDK and wxPython dialogs.
**Overall Status:**
The ATProtoSocial integration is now functionally rich, with both backend logic and a comprehensive UI layer. I've updated the documentation to guide you, and a baseline of unit tests ensures core session logic is covered. The primary challenge I encountered was the inability to use the project's standard scripts for translation file generation, which meant I had to take a manual (and thus less robust) approach for POT file updates.
2025-05-30 16:16:21 +00:00
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
if handler and hasattr ( handler , ' open_following_timeline ' ) :
async def _open_following ( ) :
await handler . open_following_timeline ( main_controller = self , session = session_to_use , user_payload = user )
wx . CallAfter ( asyncio . create_task , _open_following ( ) )
elif handler and hasattr ( handler , ' openFollowingTimeline ' ) : # Fallback
handler . openFollowingTimeline ( self , current_buffer , user )
else :
output . speak ( _ ( " This session type does not support opening following list. " ) , True )
2024-05-17 17:45:47 -06:00
feat: Initial integration of ATProtoSocial (Bluesky) protocol
This commit introduces the initial implementation for supporting the ATProtoSocial (Bluesky) protocol within your application.
Key changes and features I implemented:
1. **Core Protocol Structure:**
* I added new directories `src/sessions/atprotosocial` and `src/controller/atprotosocial`.
* I populated these with foundational files (`session.py`, `utils.py`, `handler.py`, `compose.py`, etc.), mirroring the Mastodon implementation structure but adapted for ATProtoSocial.
2. **Authentication:**
* I implemented login and authorization using Bluesky SDK (handle and app password) in `sessions/atprotosocial/session.py`.
* I integrated this into your session management UI (`sessionManagerDialog.py`) to allow adding ATProtoSocial accounts.
3. **Posting Capabilities:**
* I implemented sending text posts, posts with images, replies, and quoting posts in `sessions/atprotosocial/session.py` and `utils.py`.
* I updated `compose.py` to reflect ATProtoSocial's panel configuration (character limits, media support, quoting).
4. **Notifications:**
* I implemented fetching and processing of notifications (likes, reposts, follows, mentions, replies, quotes) in `sessions/atprotosocial/session.py`.
* Notifications are formatted for display.
5. **Timelines:**
* I implemented fetching and processing for home timeline and user-specific timelines in `sessions/atprotosocial/session.py`.
* This includes handling of posts, reposts, and replies within your application's buffer and message cache system.
6. **User Actions:**
* I implemented core user actions: follow, unfollow, mute, unmute, block, unblock in `sessions/atprotosocial/utils.py`.
* I integrated these actions into the controller layer (`controller/atprotosocial/handler.py`) and exposed them via `session.get_user_actions()`.
7. **User Management & Profile:**
* I implemented fetching user profiles, follower lists, following lists, and user search in `sessions/atprotosocial/utils.py` and `controller/atprotosocial/userList.py`.
8. **UI Integration (Initial Pass):**
* I adapted your session management UI for ATProtoSocial account creation.
* I updated main controller logic to load the ATProtoSocial handler and create basic buffers (Home, Notifications).
* I modified menu item labels based on the active session type (e.g., "Post" vs "Toot", "Like" vs "Favorite").
* I integrated core actions like reposting and liking into existing UI flows.
* I added basic integration for timeline refresh and loading more items.
* I added placeholder integration for viewing user profiles and user-specific timelines.
**Current Status & Next Steps:**
This represents a significant portion of the ATProtoSocial integration. The backend logic for most core features is in place. The immediate next steps, which were part of the original plan but not yet completed, would be:
* **Refining UI elements:** Fully implementing dedicated dialogs (compose, user profile), custom panels for new buffer types, and ensuring accurate rendering of ATProtoSocial posts and notifications.
* **Completing Documentation:** Updating all relevant documentation files in `doc/` and `documentation/`.
* **Updating Translations:** Adding new strings and updating translation files.
* **Adding Tests:** Creating unit and integration tests for the new protocol.
I was not stuck on any particular point, but the UI integration is a large step that requires iterative refinement and testing for each component, which would naturally extend beyond a single development cycle for a feature of this scope.
2025-05-26 14:11:01 +00:00
def community_timeline ( self , * args , user = None ) : # user param seems unused here based on mastodon impl
2024-05-17 17:45:47 -06:00
buffer = self . get_best_buffer ( )
handler = self . get_handler ( type = buffer . session . type )
2024-05-18 17:24:28 -06:00
if handler and hasattr ( handler , ' community_timeline ' ) :
handler . community_timeline ( self , buffer )
2025-03-07 10:13:34 -06:00
def create_filter ( self , * args , * * kwargs ) :
buffer = self . get_best_buffer ( )
handler = self . get_handler ( type = buffer . session . type )
if handler and hasattr ( handler , ' create_filter ' ) :
handler . create_filter ( self , buffer )
2025-03-07 13:01:08 -06:00
def manage_filters ( self , * args , * * kwargs ) :
buffer = self . get_best_buffer ( )
handler = self . get_handler ( type = buffer . session . type )
if handler and hasattr ( handler , ' manage_filters ' ) :
2025-08-30 22:48:00 +02:00
handler . manage_filters ( self , buffer )