2022-11-07 09:54:09 -06:00
# -*- coding: utf-8 -*-
2022-11-18 10:28:45 -06:00
import wx
2022-11-08 12:41:04 -06:00
import logging
2024-05-18 16:53:57 -06:00
import mastodon
2023-04-05 13:28:09 -06:00
import output
2024-05-18 16:53:57 -06:00
from mastodon import MastodonError
2022-11-07 09:54:09 -06:00
from pubsub import pub
2022-12-08 11:14:14 -06:00
from mysc import restart
2023-06-08 00:40:38 +01:00
from mysc.thread_utils import call_threaded
2022-11-18 10:28:45 -06:00
from wxUI.dialogs.mastodon import search as search_dialogs
2022-11-20 02:23:12 -06:00
from wxUI.dialogs.mastodon import dialogs
2023-04-05 13:28:09 -06:00
from wxUI.dialogs import userAliasDialogs
2022-11-20 02:23:12 -06:00
from wxUI import commonMessageDialogs
2023-06-08 00:40:38 +01:00
from wxUI.dialogs.mastodon import updateProfile as update_profile_dialogs
2024-05-17 17:45:47 -06:00
from wxUI.dialogs.mastodon import showUserProfile , communityTimeline
2023-06-08 00:40:38 +01:00
from sessions.mastodon.utils import html_filter
2025-03-07 13:01:08 -06:00
from . import userActions , settings
from .filters import create_filter , manage_filters
2022-11-07 09:54:09 -06:00
2022-11-08 12:41:04 -06:00
log = logging . getLogger ( "controller.mastodon.handler" )
2022-11-07 09:54:09 -06:00
class Handler ( object ):
def __init__ ( self ):
super ( Handler , self ) . __init__ ()
2022-12-20 12:21:30 -06:00
# Structure to hold names for menu bar items.
# empty names mean the item will be Disabled.
self . menus = dict (
# In application menu.
2023-06-08 00:40:38 +01:00
updateProfile = _ ( "Update Profile" ),
2022-12-20 12:21:30 -06:00
menuitem_search = _ ( "&Search" ),
lists = None ,
2023-04-05 13:28:09 -06:00
manageAliases = _ ( "Manage user aliases" ),
2022-12-20 12:21:30 -06:00
# In item menu.
compose = _ ( "&Post" ),
reply = _ ( "Re&ply" ),
share = _ ( "&Boost" ),
2026-01-21 10:57:00 -06:00
quote = _ ( "&Quote" ),
2022-12-20 12:21:30 -06:00
fav = _ ( "&Add to favorites" ),
unfav = _ ( "Remove from favorites" ),
view = _ ( "&Show post" ),
view_conversation = _ ( "View conversa&tion" ),
2023-04-05 12:57:37 -06:00
ocr = _ ( "Read text in picture" ),
2022-12-20 12:21:30 -06:00
delete = _ ( "&Delete" ),
# In user menu.
follow = _ ( "&Actions..." ),
timeline = _ ( "&View timeline..." ),
dm = _ ( "Direct me&ssage" ),
2023-04-05 13:28:09 -06:00
addAlias = _ ( "Add a&lias" ),
2022-12-20 12:21:30 -06:00
addToList = None ,
removeFromList = None ,
2025-10-02 16:26:50 -04:00
details = _ ( "S&how user profile" ),
2022-12-20 12:21:30 -06:00
favs = None ,
# In buffer Menu.
2024-05-21 14:59:47 -04:00
community_timeline = _ ( "Create c&ommunity timeline" ),
2025-03-07 10:13:13 -06:00
filter = _ ( "Create a &filter" ),
2025-03-07 13:01:08 -06:00
manage_filters = _ ( "&Manage filters" )
2022-12-20 12:21:30 -06:00
)
2022-12-21 10:24:44 -06:00
# Name for the "tweet" menu in the menu bar.
self . item_menu = _ ( "&Post" )
2022-11-07 09:54:09 -06:00
def create_buffers ( self , session , createAccounts = True , controller = None ):
session . get_user_info ()
2022-11-14 17:51:27 -06:00
name = session . get_name ()
2022-12-19 08:45:05 -06:00
controller . accounts . append ( name )
2022-11-07 09:54:09 -06:00
if createAccounts == True :
2022-11-16 11:01:52 -06:00
pub . sendMessage ( "core.create_account" , name = name , session_id = session . session_id , logged = True )
2022-11-14 17:51:27 -06:00
root_position = controller . view . search ( name , name )
2022-11-08 12:41:04 -06:00
for i in session . settings [ 'general' ][ 'buffer_order' ]:
if i == 'home' :
2022-11-14 17:51:27 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "BaseBuffer" , session_type = session . type , buffer_title = _ ( "Home" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , function = "timeline_home" , name = "home_timeline" , sessionObject = session , account = name , sound = "tweet_received.ogg" ))
2022-11-08 12:41:04 -06:00
elif i == 'local' :
2022-11-14 17:51:27 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "BaseBuffer" , session_type = session . type , buffer_title = _ ( "Local" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , function = "timeline_local" , name = "local_timeline" , sessionObject = session , account = name , sound = "tweet_received.ogg" ))
2022-11-08 12:41:04 -06:00
elif i == 'federated' :
2022-11-14 17:51:27 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "BaseBuffer" , session_type = session . type , buffer_title = _ ( "Federated" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , function = "timeline_public" , name = "federated_timeline" , sessionObject = session , account = name , sound = "tweet_received.ogg" ))
2022-11-11 17:12:03 -06:00
elif i == 'mentions' :
2022-11-14 17:51:27 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "MentionsBuffer" , session_type = session . type , buffer_title = _ ( "Mentions" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , function = "notifications" , name = "mentions" , sessionObject = session , account = name , sound = "mention_received.ogg" ))
2022-11-12 11:20:16 -06:00
elif i == 'direct_messages' :
2022-11-14 17:51:27 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "ConversationListBuffer" , session_type = session . type , buffer_title = _ ( "Direct messages" ), parent_tab = root_position , start = False , kwargs = dict ( compose_func = "compose_conversation" , parent = controller . view . nb , function = "conversations" , name = "direct_messages" , sessionObject = session , account = name , sound = "dm_received.ogg" ))
2022-11-08 15:45:12 -06:00
elif i == 'sent' :
2022-11-14 17:51:27 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "BaseBuffer" , session_type = session . type , buffer_title = _ ( "Sent" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , function = "account_statuses" , name = "sent" , sessionObject = session , account = name , sound = "tweet_received.ogg" , id = session . db [ "user_id" ]))
2022-11-09 17:08:48 -06:00
elif i == 'favorites' :
2022-11-14 17:51:27 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "BaseBuffer" , session_type = session . type , buffer_title = _ ( "Favorites" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , function = "favourites" , name = "favorites" , sessionObject = session , account = name , sound = "favourite.ogg" ))
2022-11-11 17:25:04 -06:00
elif i == 'bookmarks' :
2022-11-14 17:51:27 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "BaseBuffer" , session_type = session . type , buffer_title = _ ( "Bookmarks" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , function = "bookmarks" , name = "bookmarks" , sessionObject = session , account = name , sound = "favourite.ogg" ))
2022-11-13 22:17:28 -06:00
elif i == 'followers' :
2022-11-19 19:37:10 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "UserBuffer" , session_type = session . type , buffer_title = _ ( "Followers" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , compose_func = "compose_user" , function = "account_followers" , name = "followers" , sessionObject = session , account = name , sound = "update_followers.ogg" , id = session . db [ "user_id" ]))
2022-11-13 22:17:28 -06:00
elif i == 'following' :
2022-11-19 19:37:10 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "UserBuffer" , session_type = session . type , buffer_title = _ ( "Following" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , compose_func = "compose_user" , function = "account_following" , name = "following" , sessionObject = session , account = name , sound = "update_followers.ogg" , id = session . db [ "user_id" ]))
2022-11-13 22:17:28 -06:00
elif i == 'muted' :
2022-11-14 17:51:27 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "UserBuffer" , session_type = session . type , buffer_title = _ ( "Muted users" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , compose_func = "compose_user" , function = "mutes" , name = "muted" , sessionObject = session , account = name ))
2022-11-16 12:51:58 -06:00
elif i == 'blocked' :
2022-11-14 17:51:27 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "UserBuffer" , session_type = session . type , buffer_title = _ ( "Blocked users" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , compose_func = "compose_user" , function = "blocks" , name = "blocked" , sessionObject = session , account = name ))
2022-12-14 12:12:05 -06:00
elif i == 'notifications' :
pub . sendMessage ( "createBuffer" , buffer_type = "NotificationsBuffer" , session_type = session . type , buffer_title = _ ( "Notifications" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , compose_func = "compose_notification" , function = "notifications" , name = "notifications" , sessionObject = session , account = name ))
2026-01-12 01:53:03 -06:00
elif i == 'announcements' :
pub . sendMessage ( "createBuffer" , buffer_type = "AnnouncementsBuffer" , session_type = session . type , buffer_title = _ ( "Announcements" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , function = "announcements" , name = "announcements" , sessionObject = session , account = name , sound = "new_event.ogg" ))
2022-11-20 02:23:12 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "EmptyBuffer" , session_type = "base" , buffer_title = _ ( "Timelines" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , name = "timelines" , account = name ))
timelines_position = controller . view . search ( "timelines" , name )
for i in session . settings [ "other_buffers" ][ "timelines" ]:
2022-12-21 08:45:14 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "BaseBuffer" , session_type = session . type , buffer_title = _ ( "Timeline for {} " ) . format ( i ), parent_tab = timelines_position , start = False , kwargs = dict ( parent = controller . view . nb , function = "account_statuses" , name = " {} -timeline" . format ( i ), sessionObject = session , account = name , sound = "tweet_timeline.ogg" , id = i ))
2022-11-20 02:23:12 -06:00
for i in session . settings [ "other_buffers" ][ "followers_timelines" ]:
2022-12-19 02:41:19 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "UserBuffer" , session_type = session . type , buffer_title = _ ( "Followers for {} " ) . format ( i ), parent_tab = timelines_position , start = False , kwargs = dict ( parent = controller . view . nb , compose_func = "compose_user" , function = "account_followers" , name = " {} -followers" . format ( i ,), sessionObject = session , account = name , sound = "new_event.ogg" , id = i ))
2022-11-20 02:23:12 -06:00
for i in session . settings [ "other_buffers" ][ "following_timelines" ]:
2022-12-19 02:41:19 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "UserBuffer" , session_type = session . type , buffer_title = _ ( "Following for {} " ) . format ( i ), parent_tab = timelines_position , start = False , kwargs = dict ( parent = controller . view . nb , compose_func = "compose_user" , function = "account_following" , name = " {} -following" . format ( i ,), sessionObject = session , account = name , sound = "new_event.ogg" , id = i ))
2022-11-14 17:51:27 -06:00
# pub.sendMessage("createBuffer", buffer_type="EmptyBuffer", session_type="base", buffer_title=_("Lists"), parent_tab=root_position, start=False, kwargs=dict(parent=controller.view.nb, name="lists", name))
2022-11-07 09:54:09 -06:00
# lists_position =controller.view.search("lists", session.db["user_name"])
# for i in session.settings["other_buffers"]["lists"]:
2022-11-14 17:51:27 -06:00
# pub.sendMessage("createBuffer", buffer_type="ListBuffer", session_type=session.type, buffer_title=_(u"List for {}").format(i), parent_tab=lists_position, start=False, kwargs=dict(parent=controller.view.nb, function="list_timeline", name="%s-list" % (i,), sessionObject=session, name, bufferType=None, sound="list_tweet.ogg", list_id=utils.find_list(i, session.db["lists"]), include_ext_alt_text=True, tweet_mode="extended"))
2022-11-18 10:28:45 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "EmptyBuffer" , session_type = "base" , buffer_title = _ ( "Searches" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , name = "searches" , account = name ))
2024-02-07 12:14:06 -06:00
searches_position = controller . view . search ( "searches" , name )
2023-07-10 12:53:24 -06:00
for term in session . settings [ "other_buffers" ][ "post_searches" ]:
pub . sendMessage ( "createBuffer" , buffer_type = "SearchBuffer" , session_type = session . type , buffer_title = _ ( "Search for {} " ) . format ( term ), parent_tab = searches_position , start = True , kwargs = dict ( parent = controller . view . nb , compose_func = "compose_post" , function = "search" , name = " %s -searchterm" % ( term ,), sessionObject = session , account = session . get_name (), sound = "search_updated.ogg" , q = term , result_type = "statuses" ))
2024-05-17 17:45:47 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "EmptyBuffer" , session_type = "base" , buffer_title = _ ( "Communities" ), parent_tab = root_position , start = False , kwargs = dict ( parent = controller . view . nb , name = "communities" , account = name ))
communities_position = controller . view . search ( "communities" , name )
2024-05-18 14:17:06 -06:00
for community in session . settings [ "other_buffers" ][ "communities" ]:
2024-05-19 19:04:34 -06:00
bufftype = _ ( "Local" ) if community . split ( "@" )[ 0 ] == "local" else _ ( "federated" )
community_name = community . split ( "@" )[ 1 ] . replace ( "https://" , "" )
title = _ ( f " { bufftype } timeline for { community_name } " )
pub . sendMessage ( "createBuffer" , buffer_type = "CommunityBuffer" , session_type = session . type , buffer_title = title , parent_tab = communities_position , start = True , kwargs = dict ( parent = controller . view . nb , function = "timeline" , compose_func = "compose_post" , name = community , sessionObject = session , community_url = community . split ( "@" )[ 1 ], account = session . get_name (), sound = "search_updated.ogg" , timeline = community . split ( "@" )[ 0 ]))
2022-11-07 09:54:09 -06:00
# for i in session.settings["other_buffers"]["trending_topic_buffers"]:
2022-11-14 17:51:27 -06:00
# pub.sendMessage("createBuffer", buffer_type="TrendsBuffer", session_type=session.type, buffer_title=_("Trending topics for %s") % (i), parent_tab=root_position, start=False, kwargs=dict(parent=controller.view.nb, name="%s_tt" % (i,), sessionObject=session, name, trendsFor=i, sound="trends_updated.ogg"))
2022-11-08 12:41:04 -06:00
def start_buffer ( self , controller , buffer ):
2022-11-20 02:23:12 -06:00
if hasattr ( buffer , "finished_timeline" ) and buffer . finished_timeline == False :
change_title = True
else :
change_title = False
2022-11-08 12:41:04 -06:00
try :
2022-11-08 13:49:15 -06:00
buffer . start_stream ( play_sound = False )
2022-11-08 12:41:04 -06:00
except Exception as err :
2022-11-12 11:20:16 -06:00
log . exception ( "Error %s starting buffer %s on account %s , with args %r and kwargs %r ." % ( str ( err ), buffer . name , buffer . account , buffer . args , buffer . kwargs ))
2022-11-20 02:23:12 -06:00
if change_title :
pub . sendMessage ( "buffer-title-changed" , buffer = buffer )
2022-11-12 11:20:16 -06:00
def open_conversation ( self , controller , buffer ):
2024-05-21 12:50:43 -06:00
# detect if we are in a community buffer.
# Community buffers are special because we'll need to retrieve the object locally at first.
if hasattr ( buffer , "community_url" ):
post = buffer . get_item_from_instance ()
else :
post = buffer . get_item ()
2022-11-16 13:28:45 -06:00
if post . reblog != None :
post = post . reblog
2022-11-14 17:51:27 -06:00
conversations_position = controller . view . search ( "direct_messages" , buffer . session . get_name ())
2022-11-16 13:28:45 -06:00
pub . sendMessage ( "createBuffer" , buffer_type = "ConversationBuffer" , session_type = buffer . session . type , buffer_title = _ ( "Conversation with {0} " ) . format ( post . account . acct ), parent_tab = conversations_position , start = True , kwargs = dict ( parent = controller . view . nb , function = "status_context" , name = " %s -conversation" % ( post . id ,), sessionObject = buffer . session , account = buffer . session . get_name (), sound = "search_updated.ogg" , post = post , id = post . id ))
2022-11-14 12:39:32 -06:00
def follow ( self , buffer ):
if not hasattr ( buffer , "get_item" ):
return
2024-11-26 22:35:35 -06:00
# Community buffers are special because we'll need to retrieve the object locally at first.
if hasattr ( buffer , "community_url" ):
item = buffer . get_item_from_instance ()
else :
item = buffer . get_item ()
2022-11-14 12:39:32 -06:00
if buffer . type == "user" :
users = [ item . acct ]
elif buffer . type == "baseBuffer" :
if item . reblog != None :
users = [ user . acct for user in item . reblog . mentions if user . id != buffer . session . db [ "user_id" ]]
if item . reblog . account . acct not in users and item . account . id != buffer . session . db [ "user_id" ]:
users . insert ( 0 , item . reblog . account . acct )
else :
users = [ user . acct for user in item . mentions if user . id != buffer . session . db [ "user_id" ]]
2022-11-24 15:22:09 -06:00
if item . account . acct not in users :
2022-11-14 12:39:32 -06:00
users . insert ( 0 , item . account . acct )
2024-01-05 15:49:18 -06:00
elif buffer . type == "notificationsBuffer" :
if buffer . is_post ():
status = item . status
if status . reblog != None :
users = [ user . acct for user in status . reblog . mentions if user . id != buffer . session . db [ "user_id" ]]
if status . reblog . account . acct not in users and status . account . id != buffer . session . db [ "user_id" ]:
users . insert ( 0 , status . reblog . account . acct )
else :
users = [ user . acct for user in status . mentions if user . id != buffer . session . db [ "user_id" ]]
2024-02-07 12:04:24 -06:00
if hasattr ( item , "account" ):
acct = item . account . acct
else :
acct = item . acct
if acct not in users :
2024-01-05 15:49:18 -06:00
users . insert ( 0 , item . account . acct )
2022-11-20 02:23:12 -06:00
u = userActions . userActions ( buffer . session , users )
2022-11-18 10:28:45 -06:00
def search ( self , controller , session , value ):
log . debug ( "Creating a new search..." )
dlg = search_dialogs . searchDialog ( value )
if dlg . ShowModal () == wx . ID_OK and dlg . term . GetValue () != "" :
term = dlg . term . GetValue ()
searches_position = controller . view . search ( "searches" , session . get_name ())
if dlg . posts . GetValue () == True :
if term not in session . settings [ "other_buffers" ][ "post_searches" ]:
session . settings [ "other_buffers" ][ "post_searches" ] . append ( term )
session . settings . write ()
2023-06-01 15:48:53 +01:00
pub . sendMessage ( "createBuffer" , buffer_type = "SearchBuffer" , session_type = session . type , buffer_title = _ ( "Search for {} " ) . format ( term ), parent_tab = searches_position , start = True , kwargs = dict ( parent = controller . view . nb , compose_func = "compose_post" , function = "search" , name = " %s -searchterm" % ( term ,), sessionObject = session , account = session . get_name (), sound = "search_updated.ogg" , q = term , result_type = "statuses" ))
2022-11-18 10:28:45 -06:00
else :
log . error ( "A buffer for the %s search term is already created. You can't create a duplicate buffer." % ( term ,))
return
elif dlg . users . GetValue () == True :
pub . sendMessage ( "createBuffer" , buffer_type = "UserBuffer" , session_type = session . type , buffer_title = _ ( "Search for {} " ) . format ( term ), parent_tab = searches_position , start = True , kwargs = dict ( parent = controller . view . nb , compose_func = "compose_user" , function = "account_search" , name = " %s -searchUser" % ( term ,), sessionObject = session , account = session . get_name (), sound = "search_updated.ogg" , q = term ))
2022-11-20 02:23:12 -06:00
dlg . Destroy ()
# ToDo: explore how to play sound & save config differently.
# currently, TWBlue will play the sound and save the config for the timeline even if the buffer did not load or something else.
def open_timeline ( self , controller , buffer ):
if not hasattr ( buffer , "get_item" ):
return
2024-11-26 22:44:38 -06:00
if hasattr ( buffer , "community_url" ):
item = buffer . get_item_from_instance ()
else :
item = buffer . get_item ()
2022-11-20 02:23:12 -06:00
if buffer . type == "user" :
users = [ item . acct ]
elif buffer . type == "baseBuffer" :
if item . reblog != None :
users = [ user . acct for user in item . reblog . mentions if user . id != buffer . session . db [ "user_id" ]]
if item . reblog . account . acct not in users and item . account . id != buffer . session . db [ "user_id" ]:
users . insert ( 0 , item . reblog . account . acct )
else :
users = [ user . acct for user in item . mentions if user . id != buffer . session . db [ "user_id" ]]
if item . account . acct not in users and item . account . id != buffer . session . db [ "user_id" ]:
users . insert ( 0 , item . account . acct )
2022-12-19 17:53:10 -06:00
u = userActions . UserTimeline ( buffer . session , users )
if u . dialog . ShowModal () == wx . ID_OK :
action = u . process_action ()
if action == None :
return
user = u . user
if action == "posts" :
2023-08-27 17:56:39 +01:00
self . openPostTimeline ( controller , buffer , user )
2022-12-19 17:53:10 -06:00
elif action == "followers" :
2023-08-27 17:56:39 +01:00
self . openFollowersTimeline ( controller , buffer , user )
2022-12-19 17:53:10 -06:00
elif action == "following" :
2023-08-27 17:56:39 +01:00
self . openFollowingTimeline ( controller , buffer , user )
def openPostTimeline ( self , controller , buffer , user ):
"""Opens post timeline for user"""
if user . statuses_count == 0 :
dialogs . no_posts ()
return
if user . id in buffer . session . settings [ "other_buffers" ][ "timelines" ]:
commonMessageDialogs . timeline_exist ()
return
timelines_position = controller . view . search ( "timelines" , buffer . session . get_name ())
pub . sendMessage ( "createBuffer" , buffer_type = "BaseBuffer" , session_type = buffer . session . type , buffer_title = _ ( "Timeline for {} " ) . format ( user . username ,), parent_tab = timelines_position , start = True , kwargs = dict ( parent = controller . view . nb , function = "account_statuses" , name = " %s -timeline" % ( user . id ,), sessionObject = buffer . session , account = buffer . session . get_name (), sound = "tweet_timeline.ogg" , id = user . id ))
buffer . session . settings [ "other_buffers" ][ "timelines" ] . append ( user . id )
buffer . session . sound . play ( "create_timeline.ogg" )
buffer . session . settings . write ()
def openFollowersTimeline ( self , controller , buffer , user ):
"""Open followers timeline for user"""
if user . followers_count == 0 :
dialogs . no_followers ()
return
if user . id in buffer . session . settings [ "other_buffers" ][ "followers_timelines" ]:
commonMessageDialogs . timeline_exist ()
return
timelines_position = controller . view . search ( "timelines" , buffer . session . get_name ())
pub . sendMessage ( "createBuffer" , buffer_type = "UserBuffer" , session_type = buffer . session . type , buffer_title = _ ( "Followers for {} " ) . format ( user . username ,), parent_tab = timelines_position , start = True , kwargs = dict ( parent = controller . view . nb , compose_func = "compose_user" , function = "account_followers" , name = " %s -followers" % ( user . id ,), sessionObject = buffer . session , account = buffer . session . get_name (), sound = "new_event.ogg" , id = user . id ))
buffer . session . settings [ "other_buffers" ][ "followers_timelines" ] . append ( user . id )
buffer . session . sound . play ( "create_timeline.ogg" )
buffer . session . settings . write ()
def openFollowingTimeline ( self , controller , buffer , user ):
"""Open following timeline for user"""
if user . following_count == 0 :
dialogs . no_following ()
return
if user . id in buffer . session . settings [ "other_buffers" ][ "following_timelines" ]:
commonMessageDialogs . timeline_exist ()
return
timelines_position = controller . view . search ( "timelines" , buffer . session . get_name ())
pub . sendMessage ( "createBuffer" , buffer_type = "UserBuffer" , session_type = buffer . session . type , buffer_title = _ ( "Following for {} " ) . format ( user . username ,), parent_tab = timelines_position , start = True , kwargs = dict ( parent = controller . view . nb , compose_func = "compose_user" , function = "account_following" , name = " %s -followers" % ( user . id ,), sessionObject = buffer . session , account = buffer . session . get_name (), sound = "new_event.ogg" , id = user . id ))
buffer . session . settings [ "other_buffers" ][ "following_timelines" ] . append ( user . id )
buffer . session . sound . play ( "create_timeline.ogg" )
2022-11-20 02:23:12 -06:00
buffer . session . settings . write ()
2022-12-08 11:14:14 -06:00
def account_settings ( self , buffer , controller ):
d = settings . accountSettingsController ( buffer , controller )
if d . response == wx . ID_OK :
d . save_configuration ()
if d . needs_restart == True :
commonMessageDialogs . needs_restart ()
buffer . session . settings . write ()
buffer . session . save_persistent_data ()
restart . restart_program ()
2023-04-05 13:28:09 -06:00
def add_alias ( self , buffer ):
if not hasattr ( buffer , "get_item" ):
return
item = buffer . get_item ()
if buffer . type == "user" :
users = [ item . acct ]
elif buffer . type == "baseBuffer" :
if item . reblog != None :
users = [ user . acct for user in item . reblog . mentions if user . id != buffer . session . db [ "user_id" ]]
if item . reblog . account . acct not in users and item . account . id != buffer . session . db [ "user_id" ]:
users . insert ( 0 , item . reblog . account . acct )
else :
users = [ user . acct for user in item . mentions if user . id != buffer . session . db [ "user_id" ]]
if item . account . acct not in users :
users . insert ( 0 , item . account . acct )
dlg = userAliasDialogs . addAliasDialog ( _ ( "Add an user alias" ), users )
if dlg . get_response () == wx . ID_OK :
user , alias = dlg . get_user ()
if user == "" or alias == "" :
return
try :
full_user = buffer . session . api . account_lookup ( user )
except Exception as e :
log . exception ( "Error adding alias to user {} ." . format ( user ))
return
buffer . session . settings [ "user-aliases" ][ str ( full_user . id )] = alias
buffer . session . settings . write ()
output . speak ( _ ( "Alias has been set correctly for {} ." ) . format ( user ))
2023-06-08 00:40:38 +01:00
pub . sendMessage ( "alias-added" )
def update_profile ( self , session ):
"""Updates the users dialog"""
profile = session . api . me ()
data = {
'display_name' : profile . display_name ,
'note' : html_filter ( profile . note ),
2023-06-09 10:53:11 +01:00
'header' : profile . header ,
'avatar' : profile . avatar ,
'fields' : [( field . name , html_filter ( field . value )) for field in profile . fields ],
2023-06-09 14:38:22 +01:00
'locked' : profile . locked ,
'bot' : profile . bot ,
# discoverable could be None, set it to False
'discoverable' : profile . discoverable if profile . discoverable else False ,
2023-06-08 00:40:38 +01:00
}
2023-07-10 09:58:08 -06:00
log . debug ( f "Received data_ { data [ 'fields' ] } " )
2023-06-08 00:40:38 +01:00
dialog = update_profile_dialogs . UpdateProfileDialog ( ** data )
2023-06-09 10:53:11 +01:00
if dialog . ShowModal () != wx . ID_OK :
log . debug ( "User canceled dialog" )
return
2023-06-08 00:40:38 +01:00
updated_data = dialog . data
2023-06-09 10:53:11 +01:00
if updated_data == data :
log . debug ( "No profile info was changed." )
return
2023-06-08 00:40:38 +01:00
# remove data that hasn't been updated
for key in data :
if data [ key ] == updated_data [ key ]:
del updated_data [ key ]
log . debug ( f "Updating users profile with: { updated_data } " )
2023-08-10 17:19:58 +01:00
call_threaded ( session . api_call , "account_update_credentials" , _ ( "Update profile" ), report_success = True , ** updated_data )
2023-10-10 17:43:31 -06:00
def user_details ( self , buffer ):
2023-08-12 10:32:29 +01:00
"""Displays user profile in a dialog.
This works as long as the focused item hass a 'account' key."""
2023-08-10 17:19:58 +01:00
if not hasattr ( buffer , 'get_item' ):
return # Tell user?
item = buffer . get_item ()
2023-08-10 19:15:34 +01:00
if not item :
return # empty buffer
2023-08-10 17:19:58 +01:00
2023-08-27 17:56:39 +01:00
log . debug ( f "Opening user profile. dictionary: { item } " )
mentionedUsers = list ()
holdUser = item . account if item . get ( 'account' ) else None
2024-01-05 15:49:18 -06:00
if hasattr ( item , "type" ) and item . type in [ "status" , "mention" , "reblog" , "favourite" , "update" , "poll" ]: # statuses in Notification buffers
item = item . status
2023-08-27 17:56:39 +01:00
if item . get ( 'username' ): # account dict
holdUser = item
elif isinstance ( item . get ( 'mentions' ), list ):
2023-08-12 10:32:29 +01:00
# mentions in statuses
2023-08-10 17:19:58 +01:00
if item . reblog :
item = item . reblog
2023-08-27 17:56:39 +01:00
mentionedUsers = [( user . acct , user . id ) for user in item . mentions ]
2023-08-10 19:15:34 +01:00
holdUser = item . account
2023-08-27 17:56:39 +01:00
if not holdUser :
2023-08-10 17:19:58 +01:00
dialogs . no_user ()
return
2023-08-27 17:56:39 +01:00
if len ( mentionedUsers ) == 0 :
2023-08-10 19:15:34 +01:00
user = holdUser
else :
2023-08-27 17:56:39 +01:00
mentionedUsers . insert ( 0 , ( holdUser . display_name , holdUser . username , holdUser . id ))
mentionedUsers = list ( set ( mentionedUsers ))
selectedUser = showUserProfile . selectUserDialog ( mentionedUsers )
2023-08-10 19:15:34 +01:00
if not selectedUser :
return # Canceled selection
elif selectedUser [ - 1 ] == holdUser . id :
user = holdUser
2023-08-12 10:32:29 +01:00
else : # We don't have this user's dictionary, get it!
2023-08-10 19:15:34 +01:00
user = buffer . session . api . account ( selectedUser [ - 1 ])
2023-08-27 17:56:39 +01:00
dlg = showUserProfile . ShowUserProfile ( user )
2023-08-10 17:19:58 +01:00
dlg . ShowModal ()
2024-05-17 17:45:47 -06:00
2024-05-18 17:24:28 -06:00
def community_timeline ( self , controller , buffer ):
2024-05-17 17:45:47 -06:00
dlg = communityTimeline . CommunityTimeline ()
if dlg . ShowModal () != wx . ID_OK :
return
url = dlg . url . GetValue ()
bufftype = dlg . get_action ()
2024-05-18 16:53:57 -06:00
local_api = mastodon . Mastodon ( api_base_url = url )
try :
instance = local_api . instance ()
except MastodonError :
commonMessageDialogs . invalid_instance ()
return
2024-05-17 17:46:49 -06:00
if bufftype == "local" :
2024-05-18 16:53:57 -06:00
title = _ ( f "Local timeline for { url . replace ( 'https://' , '' ) } " )
2024-05-17 17:46:49 -06:00
else :
title = _ ( f "Federated timeline for { url } " )
bufftype = "public"
2024-05-17 17:45:47 -06:00
dlg . Destroy ()
tl_info = f " { bufftype } @ { url } "
if tl_info in buffer . session . settings [ "other_buffers" ][ "communities" ]:
return # buffer already exists.
buffer . session . settings [ "other_buffers" ][ "communities" ] . append ( tl_info )
2024-05-17 17:46:49 -06:00
buffer . session . settings . write ()
communities_position = controller . view . search ( "communities" , buffer . session . get_name ())
pub . sendMessage ( "createBuffer" , buffer_type = "CommunityBuffer" , session_type = buffer . session . type , buffer_title = title , parent_tab = communities_position , start = True , kwargs = dict ( parent = controller . view . nb , function = "timeline" , name = tl_info , sessionObject = buffer . session , account = buffer . session . get_name (), sound = "tweet_timeline.ogg" , community_url = url , timeline = bufftype ))
2025-03-07 10:13:13 -06:00
def create_filter ( self , controller , buffer ):
2025-03-07 13:01:08 -06:00
filterController = create_filter . CreateFilterController ( buffer . session )
2025-03-07 10:13:13 -06:00
try :
filter = filterController . get_response ()
except MastodonError as error :
log . exception ( "Error adding filter." )
commonMessageDialogs . error_adding_filter ()
2025-03-07 13:01:08 -06:00
return self . create_filter ( controller = controller , buffer = buffer )
def manage_filters ( self , controller , buffer ):
manageFiltersController = manage_filters . ManageFiltersController ( buffer . session )
manageFiltersController . get_response ()