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
2023-04-05 13:28:09 -06:00
import output
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
from sessions . mastodon . utils import html_filter
2022-12-08 11:14:14 -06:00
from . import userActions , settings
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 " ) ,
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 ,
details = None ,
favs = None ,
# In buffer Menu.
trends = None ,
filter = None ,
manage_filters = None
)
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 ) )
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 ) )
2022-11-07 09:54:09 -06:00
# searches_position =controller.view.search("searches", session.db["user_name"])
# for i in session.settings["other_buffers"]["tweet_searches"]:
2022-11-14 17:51:27 -06:00
# pub.sendMessage("createBuffer", buffer_type="SearchBuffer", session_type=session.type, buffer_title=_(u"Search for {}").format(i), parent_tab=searches_position, start=False, kwargs=dict(parent=controller.view.nb, function="search_tweets", name="%s-searchterm" % (i,), sessionObject=session, name, bufferType="searchPanel", sound="search_updated.ogg", q=i, include_ext_alt_text=True, tweet_mode="extended"))
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 ) :
2022-11-16 13:28:45 -06:00
post = buffer . get_item ( )
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
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 " ] ]
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 )
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 ( )
# 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, function="search_tweets", name="%s-searchterm" % (term,), sessionObject=session, account=session.get_name(), bufferType="searchPanel", sound="search_updated.ogg", q=term, include_ext_alt_text=True, tweet_mode="extended"))
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
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 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 " :
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 " )
elif action == " followers " :
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 " )
elif action == " following " :
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 ) ,
}
dialog = update_profile_dialogs . UpdateProfileDialog ( * * data )
if dialog . ShowModal ( ) != wx . ID_OK : return
updated_data = dialog . data
# 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 } " )
call_threaded ( session . api_call , " account_update_credentials " , _ ( " Update profile " ) , report_success = True , * * updated_data )