2022-11-08 17:53:59 -06:00
# -*- coding: utf-8 -*-
2022-11-11 15:51:16 -06:00
import os
import wx
2022-11-08 17:53:59 -06:00
import widgetUtils
import config
2022-11-10 17:54:38 -06:00
import output
2022-11-08 17:53:59 -06:00
from controller.twitter import messages
2022-11-10 17:54:38 -06:00
from sessions.mastodon import templates
from wxUI.dialogs.mastodon import tootDialogs
2022-11-08 17:53:59 -06:00
2022-11-11 15:51:16 -06:00
class toot ( messages . basicTweet ):
def __init__ ( self , session , title , caption , text = "" , max = 500 , * args , ** kwargs ):
self . max = max
self . title = title
self . session = session
self . message = tootDialogs . Toot ( caption = caption , text = text , * args , ** kwargs )
self . message . SetTitle ( title )
2022-11-08 17:53:59 -06:00
self . message . text . SetInsertionPoint ( len ( self . message . text . GetValue ()))
2022-11-11 15:51:16 -06:00
widgetUtils . connect_event ( self . message . spellcheck , widgetUtils . BUTTON_PRESSED , self . spellcheck )
widgetUtils . connect_event ( self . message . text , widgetUtils . ENTERED_TEXT , self . text_processor )
widgetUtils . connect_event ( self . message . translate , widgetUtils . BUTTON_PRESSED , self . translate )
widgetUtils . connect_event ( self . message . add , widgetUtils . BUTTON_PRESSED , self . on_attach )
widgetUtils . connect_event ( self . message . remove_attachment , widgetUtils . BUTTON_PRESSED , self . remove_attachment )
# ToDo: Add autocomplete feature to mastodon and uncomment this.
# widgetUtils.connect_event(self.message.autocomplete_users, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
widgetUtils . connect_event ( self . message . add_toot , widgetUtils . BUTTON_PRESSED , self . add_toot )
widgetUtils . connect_event ( self . message . remove_toot , widgetUtils . BUTTON_PRESSED , self . remove_toot )
self . attachments = []
self . thread = []
2022-11-08 17:53:59 -06:00
self . text_processor ()
2022-11-11 15:51:16 -06:00
def add_toot ( self , event , update_gui = True , * args , ** kwargs ):
text = self . message . text . GetValue ()
attachments = self . attachments [::]
2022-11-11 16:21:15 -06:00
tootdata = dict ( text = text , attachments = attachments , sensitive = self . message . sensitive . GetValue (), spoiler_text = None )
if tootdata . get ( "sensitive" ) == True :
tootdata . update ( spoiler_text = self . message . spoiler . GetValue ())
2022-11-11 15:51:16 -06:00
self . thread . append ( tootdata )
self . attachments = []
if update_gui :
self . message . reset_controls ()
self . message . add_item ( item = [ text , len ( attachments )], list_type = "toot" )
self . message . text . SetFocus ()
self . text_processor ()
def get_toot_data ( self ):
self . add_toot ( event = None , update_gui = False )
return self . thread
2022-11-08 17:53:59 -06:00
def text_processor ( self , * args , ** kwargs ):
super ( toot , self ) . text_processor ( * args , ** kwargs )
2022-11-11 15:51:16 -06:00
if len ( self . thread ) > 0 :
if hasattr ( self . message , "toots" ):
self . message . toots . Enable ( True )
self . message . remove_toot . Enable ( True )
else :
self . message . toots . Enable ( False )
self . message . remove_toot . Enable ( False )
2022-11-08 17:53:59 -06:00
if len ( self . attachments ) > 0 :
self . message . attachments . Enable ( True )
self . message . remove_attachment . Enable ( True )
else :
self . message . attachments . Enable ( False )
self . message . remove_attachment . Enable ( False )
2022-11-11 15:51:16 -06:00
if len ( self . message . text . GetValue ()) > 0 or len ( self . attachments ) > 0 :
self . message . add_toot . Enable ( True )
2022-11-08 17:53:59 -06:00
else :
2022-11-11 15:51:16 -06:00
self . message . add_toot . Enable ( False )
2022-11-08 17:53:59 -06:00
2022-11-11 15:51:16 -06:00
def remove_toot ( self , * args , ** kwargs ):
toot = self . message . toots . GetFocusedItem ()
if toot > - 1 and len ( self . thread ) > toot :
self . thread . pop ( toot )
self . message . remove_item ( list_type = "toot" )
self . text_processor ()
self . message . text . SetFocus ()
def can_attach ( self ):
if len ( self . attachments ) == 0 :
return True
elif len ( self . attachments ) == 1 and ( self . attachments [ 0 ][ "type" ] == "poll" or self . attachments [ 0 ][ "type" ] == "video" or self . attachments [ 0 ][ "type" ] == "audio" ):
return False
elif len ( self . attachments ) < 4 :
return True
return False
def on_attach ( self , * args , ** kwargs ):
can_attach = self . can_attach ()
menu = self . message . attach_menu ( can_attach )
self . message . Bind ( wx . EVT_MENU , self . on_attach_image , self . message . add_image )
self . message . Bind ( wx . EVT_MENU , self . on_attach_video , self . message . add_video )
self . message . Bind ( wx . EVT_MENU , self . on_attach_audio , self . message . add_audio )
self . message . Bind ( wx . EVT_MENU , self . on_attach_poll , self . message . add_poll )
self . message . PopupMenu ( menu , self . message . add . GetPosition ())
def on_attach_image ( self , * args , ** kwargs ):
can_attach = self . can_attach ()
big_media_present = False
for a in self . attachments :
if a [ "type" ] == "video" or a [ "type" ] == "audio" or a [ "type" ] == "poll" :
big_media_present = True
break
if can_attach == False or big_media_present == True :
return self . message . unable_to_attach_file ()
image , description = self . message . get_image ()
if image != None :
if image . endswith ( "gif" ):
image_type = "gif"
else :
image_type = "photo"
imageInfo = { "type" : image_type , "file" : image , "description" : description }
if len ( self . attachments ) > 0 and image_type == "gif" :
return self . message . unable_to_attach_file ()
self . attachments . append ( imageInfo )
self . message . add_item ( item = [ os . path . basename ( imageInfo [ "file" ]), imageInfo [ "type" ], imageInfo [ "description" ]])
self . text_processor ()
def on_attach_video ( self , * args , ** kwargs ):
if len ( self . attachments ) >= 4 :
return self . message . unable_to_attach_file ()
can_attach = self . can_attach ()
big_media_present = False
for a in self . attachments :
if a [ "type" ] == "video" or a [ "type" ] == "audio" or a [ "type" ] == "poll" :
big_media_present = True
break
if can_attach == False or big_media_present == True :
return self . message . unable_to_attach_file ()
video = self . message . get_video ()
if video != None :
videoInfo = { "type" : "video" , "file" : video , "description" : "" }
self . attachments . append ( videoInfo )
self . message . add_item ( item = [ os . path . basename ( videoInfo [ "file" ]), videoInfo [ "type" ], videoInfo [ "description" ]])
self . text_processor ()
def on_attach_audio ( self , * args , ** kwargs ):
if len ( self . attachments ) >= 4 :
return self . message . unable_to_attach_file ()
can_attach = self . can_attach ()
big_media_present = False
for a in self . attachments :
if a [ "type" ] == "video" or a [ "type" ] == "audio" or a [ "type" ] == "poll" :
big_media_present = True
break
if can_attach == False or big_media_present == True :
return self . message . unable_to_attach_file ()
audio = self . message . get_audio ()
if audio != None :
audioInfo = { "type" : "audio" , "file" : audio , "description" : "" }
self . attachments . append ( audioInfo )
self . message . add_item ( item = [ os . path . basename ( audioInfo [ "file" ]), audioInfo [ "type" ], audioInfo [ "description" ]])
self . text_processor ()
def on_attach_poll ( self , * args , ** kwargs ):
if len ( self . attachments ) > 0 :
return self . message . unable_to_attach_poll ()
can_attach = self . can_attach ()
big_media_present = False
for a in self . attachments :
if a [ "type" ] == "video" or a [ "type" ] == "audio" or a [ "type" ] == "poll" :
big_media_present = True
break
if can_attach == False or big_media_present == True :
return self . message . unable_to_attach_file ()
dlg = tootDialogs . poll ()
if dlg . ShowModal () == wx . ID_OK :
day = 86400
periods = [ 300 , 1800 , 3600 , 21600 , day , day * 2 , day * 3 , day * 4 , day * 5 , day * 6 , day * 7 ]
period = periods [ dlg . period . GetSelection ()]
poll_options = dlg . get_options ()
multiple = dlg . multiple . GetValue ()
hide_totals = dlg . hide_votes . GetValue ()
data = dict ( type = "poll" , file = "" , description = _ ( "Poll with {} options" ) . format ( len ( poll_options )), options = poll_options , expires_in = period , multiple = multiple , hide_totals = hide_totals )
self . attachments . append ( data )
self . message . add_item ( item = [ data [ "file" ], data [ "type" ], data [ "description" ]])
self . text_processor ()
dlg . Destroy ()
def get_data ( self ):
self . add_toot ( event = None , update_gui = False )
return self . thread
def get_visibility ( self ):
visibility_settings = [ "public" , "unlisted" , "private" , "direct" ]
return visibility_settings [ self . message . visibility . GetSelection ()]
2022-11-10 17:54:38 -06:00
class viewToot ( toot ):
def __init__ ( self , toot , offset_hours = 0 , date = "" , item_url = "" ):
if toot . reblog != None :
toot = toot . reblog
author = toot . account . display_name if toot . account . display_name != "" else toot . account . username
title = _ ( u "Toot from {} " ) . format ( author )
image_description = templates . process_image_descriptions ( toot . media_attachments )
text = templates . process_text ( toot , safe = False )
date = templates . process_date ( toot . created_at , relative_times = False , offset_hours = offset_hours )
2022-11-11 15:51:16 -06:00
privacy_settings = dict ( public = _ ( "Public" ), unlisted = _ ( "Not listed" ), private = _ ( "followers only" ), direct = _ ( "Mentioned people" ))
privacy = privacy_settings . get ( toot . visibility )
2022-11-10 17:54:38 -06:00
boost_count = str ( toot . reblogs_count )
favs_count = str ( toot . favourites_count )
# Gets the client from where this toot was made.
source_obj = toot . get ( "application" )
if source_obj == None :
source = _ ( "Remote instance" )
else :
source = source_obj . get ( "name" )
2022-11-11 15:51:16 -06:00
self . message = tootDialogs . viewToot ( text = text , boosts_count = boost_count , favs_count = favs_count , source = source , date = date , privacy = privacy )
2022-11-10 17:54:38 -06:00
self . message . SetTitle ( title )
if image_description != "" :
self . message . image_description . Enable ( True )
self . message . image_description . ChangeValue ( image_description )
widgetUtils . connect_event ( self . message . spellcheck , widgetUtils . BUTTON_PRESSED , self . spellcheck )
if item_url != "" :
self . message . enable_button ( "share" )
widgetUtils . connect_event ( self . message . share , widgetUtils . BUTTON_PRESSED , self . share )
self . item_url = item_url
widgetUtils . connect_event ( self . message . translateButton , widgetUtils . BUTTON_PRESSED , self . translate )
self . message . ShowModal ()
# We won't need text_processor in this dialog, so let's avoid it.
def text_processor ( self ):
pass
def share ( self , * args , ** kwargs ):
if hasattr ( self , "item_url" ):
output . copy ( self . item_url )
output . speak ( _ ( "Link copied to clipboard." ))