2019-02-26 23:53:56 +01:00
# -*- coding: utf-8 -*-
2015-11-03 04:41:01 -06:00
import time
2015-04-03 16:57:08 -06:00
import platform
if platform . system ( ) == " Windows " :
import wx
2015-08-24 09:54:15 -05:00
from wxUI import buffers , dialogs , commonMessageDialogs , menus
2018-09-22 21:55:19 -05:00
from controller import user
2015-04-03 16:57:08 -06:00
elif platform . system ( ) == " Linux " :
from gi . repository import Gtk
from gtkUI import buffers , dialogs , commonMessageDialogs
2018-09-22 21:55:19 -05:00
from controller import messages
2014-11-12 20:41:29 -06:00
import widgetUtils
2015-01-05 06:05:31 -06:00
import arrow
2014-11-12 20:41:29 -06:00
import webbrowser
import output
import config
import sound
2015-01-05 06:05:31 -06:00
import languageHandler
2015-01-18 17:19:39 -06:00
import logging
2019-02-26 23:53:56 +01:00
from audio_services import youtube_utils
2018-09-22 21:55:19 -05:00
from controller . buffers import baseBuffers
2018-08-16 17:26:19 -05:00
from sessions . twitter import compose , utils
2015-01-02 09:38:44 -06:00
from mysc . thread_utils import call_threaded
2021-01-05 09:34:52 -06:00
from tweepy . error import TweepError
2015-02-26 15:21:26 -06:00
from pubsub import pub
2018-08-16 17:26:19 -05:00
from sessions . twitter . long_tweets import twishort , tweets
2014-11-12 20:41:29 -06:00
2015-01-18 17:19:39 -06:00
log = logging . getLogger ( " controller.buffers " )
2015-02-07 10:43:37 -06:00
def _tweets_exist ( function ) :
""" A decorator to execute a function only if the selected buffer contains at least one item. """
def function_ ( self , * args , * * kwargs ) :
if self . buffer . list . get_count ( ) > 0 :
function ( self , * args , * * kwargs )
return function_
2018-09-22 21:55:19 -05:00
class baseBufferController ( baseBuffers . buffer ) :
def __init__ ( self , parent , function , name , sessionObject , account , sound = None , bufferType = None , compose_func = " compose_tweet " , * args , * * kwargs ) :
super ( baseBufferController , self ) . __init__ ( parent , function , * args , * * kwargs )
log . debug ( " Initializing buffer %s , account %s " % ( name , account , ) )
if bufferType != None :
self . buffer = getattr ( buffers , bufferType ) ( parent , name )
2014-11-12 20:41:29 -06:00
else :
2018-09-22 21:55:19 -05:00
self . buffer = buffers . basePanel ( parent , name )
self . invisible = True
self . name = name
self . type = self . buffer . type
self . session = sessionObject
self . compose_function = getattr ( compose , compose_func )
log . debug ( " Compose_function: %s " % ( self . compose_function , ) )
self . account = account
self . buffer . account = account
self . bind_events ( )
self . sound = sound
if " -timeline " in self . name or " -favorite " in self . name :
self . finished_timeline = False
# Add a compatibility layer for username based timelines from config.
# ToDo: Remove this in some new versions of the client, when user ID timelines become mandatory.
2015-03-17 12:24:29 -06:00
try :
2018-09-22 21:55:19 -05:00
int ( self . kwargs [ " user_id " ] )
except ValueError :
self . is_screen_name = True
self . kwargs [ " screen_name " ] = self . kwargs [ " user_id " ]
self . kwargs . pop ( " user_id " )
2015-01-05 05:33:09 -06:00
2018-10-19 17:35:56 -05:00
def get_buffer_name ( self ) :
""" Get buffer name from a set of different techniques. """
# firstly let's take the easier buffers.
basic_buffers = dict ( home_timeline = _ ( u " Home " ) , mentions = _ ( u " Mentions " ) , direct_messages = _ ( u " Direct messages " ) , sent_direct_messages = _ ( u " Sent direct messages " ) , sent_tweets = _ ( u " Sent tweets " ) , favourites = _ ( u " Likes " ) , followers = _ ( u " Followers " ) , friends = _ ( u " Friends " ) , blocked = _ ( u " Blocked users " ) , muted = _ ( u " Muted users " ) )
2019-06-06 11:52:23 -05:00
if self . name in list ( basic_buffers . keys ( ) ) :
2018-10-19 17:35:56 -05:00
return basic_buffers [ self . name ]
2018-11-13 16:33:17 -06:00
# Check user timelines
elif hasattr ( self , " username " ) :
if " -timeline " in self . name :
return _ ( u " {username} ' s timeline " ) . format ( username = self . username , )
elif " -favorite " in self . name :
return _ ( u " {username} ' s likes " ) . format ( username = self . username , )
elif " -followers " in self . name :
return _ ( u " {username} ' s followers " ) . format ( username = self . username , )
elif " -friends " in self . name :
return _ ( u " {username} ' s friends " ) . format ( username = self . username , )
log . error ( " Error getting name for buffer %s " % ( self . name , ) )
return _ ( u " Unknown buffer " )
2018-10-19 17:35:56 -05:00
2018-09-22 21:55:19 -05:00
def post_status ( self , * args , * * kwargs ) :
2015-01-05 06:05:31 -06:00
title = _ ( u " Tweet " )
caption = _ ( u " Write the tweet here " )
2017-11-08 12:09:53 -06:00
tweet = messages . tweet ( self . session , title , caption , " " )
2015-01-05 06:05:31 -06:00
if tweet . message . get_response ( ) == widgetUtils . OK :
2018-02-06 17:37:49 -06:00
if config . app [ " app-settings " ] [ " remember_mention_and_longtweet " ] :
config . app [ " app-settings " ] [ " longtweet " ] = tweet . message . long_tweet . GetValue ( )
config . app . write ( )
2015-01-05 06:05:31 -06:00
text = tweet . message . get_text ( )
2017-11-08 12:09:53 -06:00
if len ( text ) > 280 and tweet . message . get ( " long_tweet " ) == True :
2016-07-15 12:29:48 -05:00
if not hasattr ( tweet , " attachments " ) :
2015-07-13 04:45:06 -05:00
text = twishort . create_tweet ( self . session . settings [ " twitter " ] [ " user_key " ] , self . session . settings [ " twitter " ] [ " user_secret " ] , text )
else :
text = twishort . create_tweet ( self . session . settings [ " twitter " ] [ " user_key " ] , self . session . settings [ " twitter " ] [ " user_secret " ] , text , 1 )
2016-07-19 09:06:43 -05:00
if not hasattr ( tweet , " attachments " ) or len ( tweet . attachments ) == 0 :
2018-08-22 17:11:15 -05:00
item = self . session . api_call ( call_name = " update_status " , status = text , _sound = " tweet_send.ogg " , tweet_mode = " extended " )
2018-08-16 11:17:15 -05:00
# else:
# call_threaded(self.post_with_media, text=text, attachments=tweet.attachments, _sound="tweet_send.ogg")
if item != None :
pub . sendMessage ( " sent-tweet " , data = item , user = self . session . db [ " user_name " ] )
2015-04-03 16:57:08 -06:00
if hasattr ( tweet . message , " destroy " ) : tweet . message . destroy ( )
2017-01-14 06:11:41 -06:00
self . session . settings . write ( )
2015-01-05 06:05:31 -06:00
2021-01-04 11:16:56 -06:00
# ToDo: Update to tweepy.
2016-07-15 12:29:48 -05:00
def post_with_media ( self , text , attachments ) :
media_ids = [ ]
for i in attachments :
photo = open ( i [ " file " ] , " rb " )
2018-08-18 23:09:08 -05:00
img = self . session . twitter . upload_media ( media = photo )
self . session . twitter . create_metadata ( media_id = img [ " media_id " ] , alt_text = dict ( text = i [ " description " ] ) )
2016-07-15 12:29:48 -05:00
media_ids . append ( img [ " media_id " ] )
2018-08-18 23:09:08 -05:00
self . session . twitter . update_status ( status = text , media_ids = media_ids )
2016-03-29 16:09:44 -06:00
2015-01-25 02:38:17 -06:00
def get_formatted_message ( self ) :
2018-07-18 09:30:03 -05:00
if self . type == " dm " or self . name == " direct_messages " :
return self . compose_function ( self . get_right_tweet ( ) , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session ) [ 1 ]
2015-01-25 02:38:17 -06:00
return self . get_message ( )
2015-01-05 05:33:09 -06:00
def get_message ( self ) :
2015-09-29 08:38:05 -05:00
tweet = self . get_right_tweet ( )
2018-07-18 09:30:03 -05:00
return " " . join ( self . compose_function ( tweet , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session ) )
2015-01-05 05:33:09 -06:00
2015-06-01 17:52:23 -05:00
def get_full_tweet ( self ) :
tweet = self . get_right_tweet ( )
tweetsList = [ ]
2021-01-04 11:16:56 -06:00
tweet_id = tweet . id
2016-06-25 19:48:21 -05:00
message = None
2021-01-04 11:16:56 -06:00
if hasattr ( tweet , " message " ) :
message = tweet . message
2015-06-13 07:35:04 -05:00
try :
2021-01-04 11:16:56 -06:00
tweet = self . session . twitter . get_status ( id = tweet_id , include_ext_alt_text = True , tweet_mode = " extended " )
tweet . full_text = utils . expand_urls ( tweet . full_text , tweet . entities )
2021-01-05 09:34:52 -06:00
except TweepError as e :
2015-06-13 07:35:04 -05:00
utils . twitter_error ( e )
return
2016-06-25 19:48:21 -05:00
if message != None :
2021-01-04 11:16:56 -06:00
tweet . message = message
2015-06-01 17:52:23 -05:00
l = tweets . is_long ( tweet )
while l != False :
tweetsList . append ( tweet )
2015-06-13 07:35:04 -05:00
try :
2021-01-04 11:16:56 -06:00
tweet = self . session . twitter . get_status ( id = l , include_ext_alt_text = True )
tweet . full_text = utils . expand_urls ( tweet . full_text , tweet . entities )
2021-01-05 09:34:52 -06:00
except TweepError as e :
2015-06-13 07:35:04 -05:00
utils . twitter_error ( e )
2015-06-15 04:59:23 -05:00
return
2015-06-01 17:52:23 -05:00
l = tweets . is_long ( tweet )
if l == False :
tweetsList . append ( tweet )
return ( tweet , tweetsList )
2018-10-19 17:35:56 -05:00
def start_stream ( self , mandatory = False , play_sound = True , avoid_autoreading = False ) :
2015-11-03 04:41:01 -06:00
# starts stream every 3 minutes.
current_time = time . time ( )
2015-12-26 09:02:08 -06:00
if self . execution_time == 0 or current_time - self . execution_time > = 180 or mandatory == True :
2015-11-03 04:41:01 -06:00
self . execution_time = current_time
log . debug ( " Starting stream for buffer %s , account %s and type %s " % ( self . name , self . account , self . type ) )
log . debug ( " args: %s , kwargs: %s " % ( self . args , self . kwargs ) )
2018-07-18 09:30:03 -05:00
if self . name == " direct_messages " :
number_of_items = self . session . get_cursored_stream ( self . name , self . function , * self . args , * * self . kwargs )
else :
val = self . session . call_paged ( self . function , * self . args , * * self . kwargs )
number_of_items = self . session . order_buffer ( self . name , val )
log . debug ( " Number of items retrieved: %d " % ( number_of_items , ) )
2015-11-03 04:41:01 -06:00
self . put_items_on_list ( number_of_items )
2017-01-02 10:47:44 -06:00
if hasattr ( self , " finished_timeline " ) and self . finished_timeline == False :
if " -timeline " in self . name :
2021-01-04 12:30:38 -06:00
self . username = val [ 0 ] . user . screen_name
2017-01-02 10:47:44 -06:00
elif " -favorite " in self . name :
self . username = self . session . api_call ( " show_user " , * * self . kwargs ) [ " screen_name " ]
self . finished_timeline = True
2018-08-15 11:19:31 -05:00
if number_of_items > 0 and self . name != " sent_tweets " and self . name != " sent_direct_messages " and self . sound != None and self . session . settings [ " sound " ] [ " session_mute " ] == False and self . name not in self . session . settings [ " other_buffers " ] [ " muted_buffers " ] and play_sound == True :
2015-11-03 04:41:01 -06:00
self . session . sound . play ( self . sound )
2018-10-19 17:35:56 -05:00
# Autoread settings
if avoid_autoreading == False and mandatory == True and number_of_items > 0 and self . name in self . session . settings [ " other_buffers " ] [ " autoread_buffers " ] :
self . auto_read ( number_of_items )
2015-12-26 09:02:08 -06:00
return number_of_items
2014-11-12 20:41:29 -06:00
2018-10-19 17:35:56 -05:00
def auto_read ( self , number_of_items ) :
if number_of_items == 1 and self . name in self . session . settings [ " other_buffers " ] [ " autoread_buffers " ] and self . name not in self . session . settings [ " other_buffers " ] [ " muted_buffers " ] and self . session . settings [ " sound " ] [ " session_mute " ] == False :
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
tweet = self . session . db [ self . name ] [ - 1 ]
2018-11-01 15:04:26 -06:00
else :
tweet = self . session . db [ self . name ] [ 0 ]
2018-11-13 16:33:17 -06:00
output . speak ( _ ( u " New tweet in {0} " ) . format ( self . get_buffer_name ( ) ) )
2018-11-01 15:04:26 -06:00
output . speak ( " " . join ( self . compose_function ( tweet , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session ) ) )
2018-10-19 17:35:56 -05:00
elif number_of_items > 1 and self . name in self . session . settings [ " other_buffers " ] [ " autoread_buffers " ] and self . name not in self . session . settings [ " other_buffers " ] [ " muted_buffers " ] and self . session . settings [ " sound " ] [ " session_mute " ] == False :
2018-11-01 15:04:26 -06:00
output . speak ( _ ( u " {0} new tweets in {1} . " ) . format ( number_of_items , self . get_buffer_name ( ) ) )
2018-10-19 17:35:56 -05:00
2015-02-03 09:59:18 -06:00
def get_more_items ( self ) :
2015-04-10 09:34:24 -05:00
elements = [ ]
2015-02-03 09:59:18 -06:00
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
last_id = self . session . db [ self . name ] [ 0 ] [ " id " ]
else :
2015-03-20 17:04:39 -06:00
last_id = self . session . db [ self . name ] [ - 1 ] [ " id " ]
2015-02-03 09:59:18 -06:00
try :
items = self . session . get_more_items ( self . function , count = self . session . settings [ " general " ] [ " max_tweets_per_call " ] , max_id = last_id , * self . args , * * self . kwargs )
2021-01-05 09:34:52 -06:00
except TweepError as e :
output . speak ( e . reason , True )
2018-09-18 09:09:25 -05:00
if items == None :
return
2015-02-03 09:59:18 -06:00
for i in items :
2017-11-13 20:26:15 -06:00
if utils . is_allowed ( i , self . session . settings , self . name ) == True and utils . find_item ( i [ " id " ] , self . session . db [ self . name ] ) == None :
2016-04-28 13:54:06 -05:00
i = self . session . check_quoted_status ( i )
i = self . session . check_long_tweet ( i )
2015-04-10 09:34:24 -05:00
elements . append ( i )
2015-02-03 09:59:18 -06:00
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
self . session . db [ self . name ] . insert ( 0 , i )
else :
self . session . db [ self . name ] . append ( i )
selection = self . buffer . list . get_selected ( )
2015-04-10 09:34:24 -05:00
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
for i in elements :
2018-07-18 09:30:03 -05:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session )
2015-04-10 09:34:24 -05:00
self . buffer . list . insert_item ( True , * tweet )
else :
for i in items :
2018-07-18 09:30:03 -05:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session )
2015-04-10 09:34:24 -05:00
self . buffer . list . insert_item ( False , * tweet )
2015-03-24 03:47:16 -06:00
# self.buffer.list.select_item(selection+elements)
# else:
self . buffer . list . select_item ( selection )
2015-04-10 09:34:24 -05:00
output . speak ( _ ( u " %s items retrieved " ) % ( str ( len ( elements ) ) ) , True )
2015-02-03 09:59:18 -06:00
2017-03-24 05:10:15 -06:00
def remove_buffer ( self , force = False ) :
2015-03-19 05:34:18 -06:00
if " -timeline " in self . name :
2017-03-24 05:10:15 -06:00
if force == False :
dlg = commonMessageDialogs . remove_buffer ( )
else :
dlg = widgetUtils . YES
2015-02-11 16:14:25 -06:00
if dlg == widgetUtils . YES :
2015-02-12 13:18:24 -06:00
if self . name [ : - 9 ] in self . session . settings [ " other_buffers " ] [ " timelines " ] :
self . session . settings [ " other_buffers " ] [ " timelines " ] . remove ( self . name [ : - 9 ] )
2017-01-14 06:11:41 -06:00
self . session . settings . write ( )
2018-11-22 13:35:19 -06:00
if self . name in self . session . db :
2017-03-24 05:25:02 -06:00
self . session . db . pop ( self . name )
2015-02-12 10:35:13 -06:00
return True
elif dlg == widgetUtils . NO :
return False
2015-03-17 05:12:29 -06:00
elif " favorite " in self . name :
2017-03-24 05:10:15 -06:00
if force == False :
dlg = commonMessageDialogs . remove_buffer ( )
else :
dlg = widgetUtils . YES
2015-03-17 05:12:29 -06:00
if dlg == widgetUtils . YES :
if self . name [ : - 9 ] in self . session . settings [ " other_buffers " ] [ " favourites_timelines " ] :
self . session . settings [ " other_buffers " ] [ " favourites_timelines " ] . remove ( self . name [ : - 9 ] )
2018-11-22 13:35:19 -06:00
if self . name in self . session . db :
2017-03-24 05:25:02 -06:00
self . session . db . pop ( self . name )
2017-01-14 06:11:41 -06:00
self . session . settings . write ( )
2015-03-17 05:12:29 -06:00
return True
elif dlg == widgetUtils . NO :
return False
2015-02-11 16:14:25 -06:00
else :
2015-04-10 09:34:24 -05:00
output . speak ( _ ( u " This buffer is not a timeline; it can ' t be deleted. " ) , True )
2015-02-12 10:35:13 -06:00
return False
2015-02-11 16:14:25 -06:00
2016-04-16 13:31:37 -05:00
def remove_tweet ( self , id ) :
if type ( self . session . db [ self . name ] ) == dict : return
2019-06-06 11:52:23 -05:00
for i in range ( 0 , len ( self . session . db [ self . name ] ) ) :
2016-04-16 13:31:37 -05:00
if self . session . db [ self . name ] [ i ] [ " id " ] == id :
self . session . db [ self . name ] . pop ( i )
self . remove_item ( i )
2014-11-12 20:41:29 -06:00
def put_items_on_list ( self , number_of_items ) :
2018-07-18 09:30:03 -05:00
# Define the list we're going to use as cursored stuff are a bit different.
2018-08-13 11:26:55 -05:00
if self . name != " direct_messages " and self . name != " sent_direct_messages " :
2018-07-18 09:30:03 -05:00
list_to_use = self . session . db [ self . name ]
else :
list_to_use = self . session . db [ self . name ] [ " items " ]
2016-08-06 14:09:27 -05:00
if number_of_items == 0 and self . session . settings [ " general " ] [ " persist_size " ] == 0 : return
2015-01-18 17:19:39 -06:00
log . debug ( " The list contains %d items " % ( self . buffer . list . get_count ( ) , ) )
log . debug ( " Putting %d items on the list " % ( number_of_items , ) )
2014-11-12 20:41:29 -06:00
if self . buffer . list . get_count ( ) == 0 :
2018-07-18 09:30:03 -05:00
for i in list_to_use :
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session )
2015-03-28 05:02:17 -06:00
self . buffer . list . insert_item ( False , * tweet )
2015-01-22 08:54:41 -06:00
self . buffer . set_position ( self . session . settings [ " general " ] [ " reverse_timelines " ] )
2016-08-06 14:09:27 -05:00
elif self . buffer . list . get_count ( ) > 0 and number_of_items > 0 :
2014-11-12 20:41:29 -06:00
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
2018-07-18 10:52:12 -05:00
items = list_to_use [ len ( list_to_use ) - number_of_items : ]
2016-06-28 10:11:56 -05:00
for i in items :
2018-07-18 09:30:03 -05:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session )
2014-11-12 20:41:29 -06:00
self . buffer . list . insert_item ( False , * tweet )
else :
2018-07-18 09:30:03 -05:00
items = list_to_use [ 0 : number_of_items ]
2016-07-20 04:47:39 -05:00
items . reverse ( )
for i in items :
2018-07-18 09:30:03 -05:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session )
2016-07-20 04:47:39 -05:00
self . buffer . list . insert_item ( True , * tweet )
2015-01-18 17:19:39 -06:00
log . debug ( " Now the list contains %d items " % ( self . buffer . list . get_count ( ) , ) )
2014-11-12 20:41:29 -06:00
def add_new_item ( self , item ) :
2018-07-18 09:30:03 -05:00
tweet = self . compose_function ( item , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session )
2014-11-12 20:41:29 -06:00
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
self . buffer . list . insert_item ( False , * tweet )
else :
self . buffer . list . insert_item ( True , * tweet )
2015-03-11 17:17:29 -06:00
if self . name in self . session . settings [ " other_buffers " ] [ " autoread_buffers " ] and self . name not in self . session . settings [ " other_buffers " ] [ " muted_buffers " ] and self . session . settings [ " sound " ] [ " session_mute " ] == False :
2018-05-18 13:38:58 -05:00
output . speak ( " " . join ( tweet [ : 2 ] ) , speech = self . session . settings [ " reporting " ] [ " speech_reporting " ] , braille = self . session . settings [ " reporting " ] [ " braille_reporting " ] )
2015-05-12 14:53:23 -04:00
#Improve performance on Windows
2015-10-14 17:07:57 -05:00
# if platform.system() == "Windows":
# call_threaded(utils.is_audio,item)
2014-11-12 20:41:29 -06:00
def bind_events ( self ) :
2015-01-18 17:19:39 -06:00
log . debug ( " Binding events... " )
2015-04-04 21:25:52 -06:00
self . buffer . set_focus_function ( self . onFocus )
2015-04-10 09:34:24 -05:00
widgetUtils . connect_event ( self . buffer . list . list , widgetUtils . KEYPRESS , self . get_event )
2018-09-22 21:55:19 -05:00
widgetUtils . connect_event ( self . buffer , widgetUtils . BUTTON_PRESSED , self . post_status , self . buffer . tweet )
2015-01-05 06:05:31 -06:00
# if self.type == "baseBuffer":
2018-09-22 21:55:19 -05:00
widgetUtils . connect_event ( self . buffer , widgetUtils . BUTTON_PRESSED , self . share_item , self . buffer . retweet )
widgetUtils . connect_event ( self . buffer , widgetUtils . BUTTON_PRESSED , self . send_message , self . buffer . dm )
2015-01-05 06:05:31 -06:00
widgetUtils . connect_event ( self . buffer , widgetUtils . BUTTON_PRESSED , self . reply , self . buffer . reply )
2015-08-24 09:54:15 -05:00
# Replace for the correct way in other platforms.
widgetUtils . connect_event ( self . buffer . list . list , wx . EVT_LIST_ITEM_RIGHT_CLICK , self . show_menu )
widgetUtils . connect_event ( self . buffer . list . list , wx . EVT_LIST_KEY_DOWN , self . show_menu_by_key )
def show_menu ( self , ev , pos = 0 , * args , * * kwargs ) :
if self . buffer . list . get_count ( ) == 0 : return
2018-07-18 09:30:03 -05:00
if self . name == " sent_tweets " or self . name == " direct_messages " :
2015-08-24 09:54:15 -05:00
menu = menus . sentPanelMenu ( )
elif self . name == " direct_messages " :
menu = menus . dmPanelMenu ( )
2018-09-22 21:55:19 -05:00
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . send_message , menuitem = menu . reply )
2015-08-24 09:54:15 -05:00
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . user_actions , menuitem = menu . userActions )
else :
menu = menus . basePanelMenu ( )
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . reply , menuitem = menu . reply )
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . user_actions , menuitem = menu . userActions )
2018-09-22 21:55:19 -05:00
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . share_item , menuitem = menu . retweet )
2015-08-24 09:54:15 -05:00
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . fav , menuitem = menu . fav )
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . unfav , menuitem = menu . unfav )
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . url_ , menuitem = menu . openUrl )
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . audio , menuitem = menu . play )
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . view , menuitem = menu . view )
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . copy , menuitem = menu . copy )
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . destroy_status , menuitem = menu . remove )
2019-02-19 17:41:34 -06:00
if hasattr ( menu , " openInBrowser " ) :
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . open_in_browser , menuitem = menu . openInBrowser )
2015-08-24 09:54:15 -05:00
if pos != 0 :
self . buffer . PopupMenu ( menu , pos )
else :
self . buffer . PopupMenu ( menu , ev . GetPosition ( ) )
def view ( self , * args , * * kwargs ) :
pub . sendMessage ( " execute-action " , action = " view_item " )
def copy ( self , * args , * * kwargs ) :
pub . sendMessage ( " execute-action " , action = " copy_to_clipboard " )
def user_actions ( self , * args , * * kwargs ) :
pub . sendMessage ( " execute-action " , action = " follow " )
def fav ( self , * args , * * kwargs ) :
pub . sendMessage ( " execute-action " , action = " add_to_favourites " )
def unfav ( self , * args , * * kwargs ) :
pub . sendMessage ( " execute-action " , action = " remove_from_favourites " )
def delete_item_ ( self , * args , * * kwargs ) :
pub . sendMessage ( " execute-action " , action = " delete_item " )
def url_ ( self , * args , * * kwargs ) :
self . url ( )
def show_menu_by_key ( self , ev ) :
if self . buffer . list . get_count ( ) == 0 :
return
if ev . GetKeyCode ( ) == wx . WXK_WINDOWS_MENU :
self . show_menu ( widgetUtils . MENU , pos = self . buffer . list . list . GetPosition ( ) )
2014-11-12 20:41:29 -06:00
def get_tweet ( self ) :
2021-01-04 11:16:56 -06:00
if hasattr ( self . session . db [ self . name ] [ self . buffer . list . get_selected ( ) ] , " retweeted_status " ) :
tweet = self . session . db [ self . name ] [ self . buffer . list . get_selected ( ) ] . retweeted_status
2014-11-12 20:41:29 -06:00
else :
tweet = self . session . db [ self . name ] [ self . buffer . list . get_selected ( ) ]
return tweet
2015-01-02 09:38:44 -06:00
def get_right_tweet ( self ) :
tweet = self . session . db [ self . name ] [ self . buffer . list . get_selected ( ) ]
return tweet
2015-02-07 10:43:37 -06:00
@_tweets_exist
2015-01-05 06:05:31 -06:00
def reply ( self , * args , * * kwargs ) :
2015-01-02 09:38:44 -06:00
tweet = self . get_right_tweet ( )
2021-01-04 11:16:56 -06:00
screen_name = tweet . user [ " screen_name " ]
id = tweet . id
twishort_enabled = getattr ( tweet , " twishort " )
2016-12-09 10:15:39 -06:00
users = utils . get_all_mentioned ( tweet , self . session . db , field = " screen_name " )
ids = utils . get_all_mentioned ( tweet , self . session . db , field = " id_str " )
2017-07-07 17:39:09 -05:00
# Build the window title
if len ( users ) < 1 :
2017-07-08 13:54:32 +02:00
title = _ ( " Reply to {arg0} " ) . format ( arg0 = screen_name )
2017-07-07 17:39:09 -05:00
else :
title = _ ( " Reply " )
2017-11-08 12:09:53 -06:00
message = messages . reply ( self . session , title , _ ( u " Reply to %s " ) % ( screen_name , ) , " " , users = users , ids = ids )
2015-01-02 09:38:44 -06:00
if message . message . get_response ( ) == widgetUtils . OK :
2018-02-06 17:37:49 -06:00
if config . app [ " app-settings " ] [ " remember_mention_and_longtweet " ] :
config . app [ " app-settings " ] [ " longtweet " ] = message . message . long_tweet . GetValue ( )
2018-07-13 17:29:54 -05:00
if len ( users ) > 0 :
config . app [ " app-settings " ] [ " mention_all " ] = message . message . mentionAll . GetValue ( )
2018-02-06 17:37:49 -06:00
config . app . write ( )
2018-08-22 17:11:15 -05:00
params = { " _sound " : " reply_send.ogg " , " in_reply_to_status_id " : id , " tweet_mode " : " extended " }
2015-07-13 04:45:06 -05:00
text = message . message . get_text ( )
2017-01-03 20:35:53 -06:00
if twishort_enabled == False :
2016-12-19 11:43:32 -06:00
excluded_ids = message . get_ids ( )
params [ " exclude_reply_user_ids " ] = excluded_ids
params [ " auto_populate_reply_metadata " ] = True
else :
mentioned_people = message . get_people ( )
text = " @ " + screen_name + " " + mentioned_people + u " " + text
2017-11-08 12:09:53 -06:00
if len ( text ) > 280 and message . message . get ( " long_tweet " ) == True :
2015-07-13 04:45:06 -05:00
if message . image == None :
text = twishort . create_tweet ( self . session . settings [ " twitter " ] [ " user_key " ] , self . session . settings [ " twitter " ] [ " user_secret " ] , text )
else :
text = twishort . create_tweet ( self . session . settings [ " twitter " ] [ " user_key " ] , self . session . settings [ " twitter " ] [ " user_secret " ] , text , 1 )
2016-12-19 11:43:32 -06:00
params [ " status " ] = text
2015-01-02 09:38:44 -06:00
if message . image == None :
2016-12-19 11:43:32 -06:00
params [ " call_name " ] = " update_status "
2015-01-02 09:38:44 -06:00
else :
2016-12-19 11:43:32 -06:00
params [ " call_name " ] = " update_status_with_media "
params [ " media " ] = message . file
2018-08-16 11:17:15 -05:00
item = self . session . api_call ( * * params )
if item != None :
pub . sendMessage ( " sent-tweet " , data = item , user = self . session . db [ " user_name " ] )
2015-04-03 16:57:08 -06:00
if hasattr ( message . message , " destroy " ) : message . message . destroy ( )
2017-01-14 06:11:41 -06:00
self . session . settings . write ( )
2015-01-02 09:38:44 -06:00
2015-02-07 10:43:37 -06:00
@_tweets_exist
2018-09-22 21:55:19 -05:00
def send_message ( self , * args , * * kwargs ) :
2015-03-11 16:36:22 -06:00
tweet = self . get_right_tweet ( )
2015-01-02 09:38:44 -06:00
if self . type == " dm " :
2021-01-04 11:16:56 -06:00
screen_name = self . session . get_user ( tweet . message_create [ " sender_id " ] ) [ " screen_name " ]
2018-07-18 09:30:03 -05:00
users = [ screen_name ]
2015-01-02 09:38:44 -06:00
elif self . type == " people " :
2021-01-04 11:16:56 -06:00
screen_name = tweet . screen_name
2015-01-02 09:38:44 -06:00
users = [ screen_name ]
else :
2021-01-04 11:16:56 -06:00
screen_name = tweet . user [ " screen_name " ]
2015-01-02 09:38:44 -06:00
users = utils . get_all_users ( tweet , self . session . db )
dm = messages . dm ( self . session , _ ( u " Direct message to %s " ) % ( screen_name , ) , _ ( u " New direct message " ) , users )
if dm . message . get_response ( ) == widgetUtils . OK :
2018-07-25 11:22:57 -05:00
screen_name = dm . message . get ( " cb " )
user = self . session . get_user_by_screen_name ( screen_name )
2021-01-04 11:16:56 -06:00
recipient_id = user
text = dm . message . get_text ( )
val = self . session . api_call ( call_name = " send_direct_message " , recipient_id = recipient_id , text = text )
2018-08-12 16:23:45 -05:00
if val != None :
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
self . session . db [ " sent_direct_messages " ] [ " items " ] . append ( val [ " event " ] )
else :
self . session . db [ " sent_direct_messages " ] [ " items " ] . insert ( 0 , val [ " event " ] )
pub . sendMessage ( " sent-dm " , data = val [ " event " ] , user = self . session . db [ " user_name " ] )
if hasattr ( dm . message , " destroy " ) : dm . message . destroy ( )
2015-01-02 09:38:44 -06:00
2015-02-07 10:43:37 -06:00
@_tweets_exist
2018-09-22 21:55:19 -05:00
def share_item ( self , * args , * * kwargs ) :
2015-01-02 10:53:33 -06:00
tweet = self . get_right_tweet ( )
2021-01-04 11:16:56 -06:00
id = tweet . id
2015-04-15 11:09:36 -05:00
if self . session . settings [ " general " ] [ " retweet_mode " ] == " ask " :
answer = commonMessageDialogs . retweet_question ( self . buffer )
if answer == widgetUtils . YES :
self . _retweet_with_comment ( tweet , id )
2015-04-27 16:08:02 -05:00
elif answer == widgetUtils . NO :
2015-04-15 11:09:36 -05:00
self . _direct_retweet ( id )
elif self . session . settings [ " general " ] [ " retweet_mode " ] == " direct " :
self . _direct_retweet ( id )
else :
self . _retweet_with_comment ( tweet , id )
2015-05-04 11:42:28 -04:00
def _retweet_with_comment ( self , tweet , id , comment = ' ' ) :
2018-09-22 10:18:25 -05:00
# If quoting a retweet, let's quote the original tweet instead the retweet.
2021-01-04 11:16:56 -06:00
if hasattr ( tweet , " retweeted_status " ) :
tweet = tweet . retweeted_status
if hasattr ( tweet , " full_text " ) :
comments = tweet . full_text
2016-10-02 09:11:02 -05:00
else :
2021-01-04 11:16:56 -06:00
comments = tweet . text
retweet = messages . tweet ( self . session , _ ( u " Quote " ) , _ ( u " Add your comment to the tweet " ) , u " “@ %s : %s ” " % ( tweet . user [ " screen_name " ] , comments ) , max = 256 , messageType = " retweet " )
2015-05-04 11:42:28 -04:00
if comment != ' ' :
retweet . message . set_text ( comment )
2015-04-15 11:09:36 -05:00
if retweet . message . get_response ( ) == widgetUtils . OK :
text = retweet . message . get_text ( )
2021-01-04 11:16:56 -06:00
text = text + " https://twitter.com/ {0} /status/ {1} " . format ( tweet . user [ " screen_name " ] , id )
2015-04-15 11:09:36 -05:00
if retweet . image == None :
2018-08-22 17:11:15 -05:00
item = self . session . api_call ( call_name = " update_status " , _sound = " retweet_send.ogg " , status = text , in_reply_to_status_id = id , tweet_mode = " extended " )
2018-08-16 11:17:15 -05:00
if item != None :
2021-01-04 11:16:56 -06:00
new_item = self . session . twitter . get_status ( id = item . id , include_ext_alt_text = True , tweet_mode = " extended " )
2018-11-15 04:43:16 -06:00
pub . sendMessage ( " sent-tweet " , data = new_item , user = self . session . db [ " user_name " ] )
2015-04-15 11:09:36 -05:00
else :
call_threaded ( self . session . api_call , call_name = " update_status " , _sound = " retweet_send.ogg " , status = text , media = retweet . image )
if hasattr ( retweet . message , " destroy " ) : retweet . message . destroy ( )
def _direct_retweet ( self , id ) :
2018-08-22 17:11:15 -05:00
item = self . session . api_call ( call_name = " retweet " , _sound = " retweet_send.ogg " , id = id , tweet_mode = " extended " )
2018-08-16 11:17:15 -05:00
if item != None :
2018-08-22 17:11:15 -05:00
# Retweets are returned as non-extended tweets, so let's get the object as extended
# just before sending the event message. See https://github.com/manuelcortez/TWBlue/issues/253
2021-01-04 11:16:56 -06:00
item = self . session . twitter . get_status ( id = item . id , include_ext_alt_text = True , tweet_mode = " extended " )
2018-08-16 11:17:15 -05:00
pub . sendMessage ( " sent-tweet " , data = item , user = self . session . db [ " user_name " ] )
2015-01-02 10:53:33 -06:00
2015-04-04 21:25:52 -06:00
def onFocus ( self , * args , * * kwargs ) :
2014-11-12 20:41:29 -06:00
tweet = self . get_tweet ( )
2015-04-04 21:25:52 -06:00
if platform . system ( ) == " Windows " and self . session . settings [ " general " ] [ " relative_times " ] == True :
2015-01-05 06:05:31 -06:00
# fix this:
2021-01-04 11:16:56 -06:00
original_date = arrow . get ( self . session . db [ self . name ] [ self . buffer . list . get_selected ( ) ] . created_at , locale = " en " )
2015-01-05 06:05:31 -06:00
ts = original_date . humanize ( locale = languageHandler . getLanguage ( ) )
2018-03-14 13:34:56 -06:00
self . buffer . list . list . SetItem ( self . buffer . list . get_selected ( ) , 2 , ts )
2017-01-11 15:26:36 +00:00
if self . session . settings [ ' sound ' ] [ ' indicate_audio ' ] and utils . is_audio ( tweet ) :
2015-01-20 15:40:33 -06:00
self . session . sound . play ( " audio.ogg " )
2017-01-11 15:26:36 +00:00
if self . session . settings [ ' sound ' ] [ ' indicate_geo ' ] and utils . is_geocoded ( tweet ) :
2015-02-03 05:10:01 -06:00
self . session . sound . play ( " geo.ogg " )
2017-01-11 15:26:36 +00:00
if self . session . settings [ ' sound ' ] [ ' indicate_img ' ] and utils . is_media ( tweet ) :
2017-01-07 06:58:53 -06:00
self . session . sound . play ( " image.ogg " )
2015-06-01 11:18:39 -05:00
2015-08-24 09:54:15 -05:00
def audio ( self , url = ' ' , * args , * * kwargs ) :
2018-02-20 11:47:33 -06:00
if sound . URLPlayer . player . is_playing ( ) :
2018-02-16 17:58:57 -06:00
return sound . URLPlayer . stop_audio ( )
2014-11-12 20:41:29 -06:00
tweet = self . get_tweet ( )
2015-02-07 10:43:37 -06:00
if tweet == None : return
2014-11-12 20:41:29 -06:00
urls = utils . find_urls ( tweet )
if len ( urls ) == 1 :
2015-05-12 11:30:56 -04:00
url = urls [ 0 ]
2015-03-11 16:36:22 -06:00
elif len ( urls ) > 1 :
2014-11-12 20:41:29 -06:00
urls_list = dialogs . urlList . urlList ( )
urls_list . populate_list ( urls )
if urls_list . get_response ( ) == widgetUtils . OK :
2015-05-12 11:30:56 -04:00
url = urls_list . get_string ( )
2015-04-03 16:57:08 -06:00
if hasattr ( urls_list , " destroy " ) : urls_list . destroy ( )
2015-05-12 11:30:56 -04:00
if url != ' ' :
2016-08-04 17:40:07 -05:00
# try:
sound . URLPlayer . play ( url , self . session . settings [ " sound " ] [ " volume " ] )
# except:
# log.error("Exception while executing audio method.")
2015-05-26 20:23:02 -05:00
2015-08-24 09:54:15 -05:00
# @_tweets_exist
def url ( self , url = ' ' , announce = True , * args , * * kwargs ) :
2015-05-12 11:20:50 -04:00
if url == ' ' :
tweet = self . get_tweet ( )
urls = utils . find_urls ( tweet )
if len ( urls ) == 1 :
url = urls [ 0 ]
elif len ( urls ) > 1 :
urls_list = dialogs . urlList . urlList ( )
urls_list . populate_list ( urls )
if urls_list . get_response ( ) == widgetUtils . OK :
url = urls_list . get_string ( )
if hasattr ( urls_list , " destroy " ) : urls_list . destroy ( )
if url != ' ' :
2015-05-13 17:29:58 -04:00
if announce :
output . speak ( _ ( u " Opening URL... " ) , True )
2015-05-12 11:20:50 -04:00
webbrowser . open_new_tab ( url )
2014-11-12 20:41:29 -06:00
def clear_list ( self ) :
2015-02-07 10:23:23 -06:00
dlg = commonMessageDialogs . clear_list ( )
if dlg == widgetUtils . YES :
2014-11-12 20:41:29 -06:00
self . session . db [ self . name ] = [ ]
self . buffer . list . clear ( )
2015-02-07 10:43:37 -06:00
@_tweets_exist
2015-01-05 05:33:09 -06:00
def destroy_status ( self , * args , * * kwargs ) :
index = self . buffer . list . get_selected ( )
if self . type == " events " or self . type == " people " or self . type == " empty " or self . type == " account " : return
answer = commonMessageDialogs . delete_tweet_dialog ( None )
if answer == widgetUtils . YES :
2015-02-07 10:23:23 -06:00
try :
2015-03-26 16:20:21 -06:00
if self . name == " direct_messages " or self . name == " sent_direct_messages " :
2021-01-04 11:16:56 -06:00
self . session . twitter . destroy_direct_message ( id = self . get_right_tweet ( ) . id )
2018-08-14 08:56:11 -05:00
self . session . db [ self . name ] [ " items " ] . pop ( index )
2015-02-07 10:23:23 -06:00
else :
2021-01-04 11:16:56 -06:00
self . session . twitter . destroy_status ( id = self . get_right_tweet ( ) . id )
2018-08-14 08:56:11 -05:00
self . session . db [ self . name ] . pop ( index )
2015-02-07 10:23:23 -06:00
self . buffer . list . remove_item ( index )
2021-01-05 09:34:52 -06:00
except TweepError :
2018-08-14 08:56:11 -05:00
self . session . sound . play ( " error.ogg " )
2014-11-12 20:41:29 -06:00
2015-03-08 14:18:29 -06:00
@_tweets_exist
def user_details ( self ) :
2015-03-17 03:50:49 -06:00
tweet = self . get_right_tweet ( )
2015-03-08 14:18:29 -06:00
if self . type == " dm " :
2021-01-04 11:16:56 -06:00
users = [ self . session . get_user ( tweet . message_create [ " sender_id " ] ) [ " screen_name " ] ]
2015-03-08 14:18:29 -06:00
elif self . type == " people " :
2021-01-04 11:16:56 -06:00
users = [ tweet . screen_name ]
2015-03-08 14:18:29 -06:00
else :
users = utils . get_all_users ( tweet , self . session . db )
dlg = dialogs . utils . selectUserDialog ( title = _ ( u " User details " ) , users = users )
if dlg . get_response ( ) == widgetUtils . OK :
user . profileController ( session = self . session , user = dlg . get_user ( ) )
2015-04-03 16:57:08 -06:00
if hasattr ( dlg , " destroy " ) : dlg . destroy ( )
2015-03-08 14:18:29 -06:00
2015-09-29 08:38:05 -05:00
def get_quoted_tweet ( self , tweet ) :
2021-01-04 11:16:56 -06:00
quoted_tweet = self . session . twitter . get_status ( id = tweet . id )
quoted_tweet . text = utils . find_urls_in_text ( quoted_tweet . text , quoted_tweet . entities )
2015-09-29 08:38:05 -05:00
l = tweets . is_long ( quoted_tweet )
id = tweets . get_id ( l )
2021-01-04 11:16:56 -06:00
original_tweet = self . session . twitter . get_status ( id = id )
original_tweet . text = utils . find_urls_in_text ( original_tweet . text , original_tweet . entities )
2015-09-29 08:38:05 -05:00
return compose . compose_quoted_tweet ( quoted_tweet , original_tweet , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] )
2019-02-19 17:41:34 -06:00
def open_in_browser ( self , * args , * * kwargs ) :
tweet = self . get_tweet ( )
output . speak ( _ ( u " Opening item in web browser... " ) )
2021-01-04 11:16:56 -06:00
url = " https://twitter.com/ {screen_name} /status/ {tweet_id} " . format ( screen_name = tweet . user [ " screen_name " ] , tweet_id = tweet . id )
2019-02-19 17:41:34 -06:00
webbrowser . open ( url )
2018-07-18 09:30:03 -05:00
class directMessagesController ( baseBufferController ) :
def get_more_items ( self ) :
2018-07-19 12:27:01 -05:00
try :
items = self . session . get_more_items ( self . function , dm = True , name = self . name , count = self . session . settings [ " general " ] [ " max_tweets_per_call " ] , cursor = self . session . db [ self . name ] [ " cursor " ] , * self . args , * * self . kwargs )
2021-01-05 09:34:52 -06:00
except TweepError as e :
output . speak ( e . reason , True )
2018-07-19 12:27:01 -05:00
return
2018-09-18 09:09:25 -05:00
if items == None :
return
2018-08-13 11:26:55 -05:00
sent = [ ]
2018-07-19 12:27:01 -05:00
for i in items :
2018-08-13 11:26:55 -05:00
if i [ " message_create " ] [ " sender_id " ] == self . session . db [ " user_id " ] :
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
self . session . db [ " sent_direct_messages " ] [ " items " ] . insert ( 0 , i )
else :
self . session . db [ " sent_direct_messages " ] [ " items " ] . append ( i )
sent . append ( i )
2018-07-19 12:27:01 -05:00
else :
2018-08-13 11:26:55 -05:00
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
self . session . db [ self . name ] [ " items " ] . insert ( 0 , i )
else :
self . session . db [ self . name ] [ " items " ] . append ( i )
pub . sendMessage ( " more-sent-dms " , data = sent , account = self . session . db [ " user_name " ] )
2018-07-19 12:27:01 -05:00
selected = self . buffer . list . get_selected ( )
if self . session . settings [ " general " ] [ " reverse_timelines " ] == True :
for i in items :
2018-08-13 11:26:55 -05:00
if i [ " message_create " ] [ " sender_id " ] == self . session . db [ " user_id " ] :
continue
2018-07-19 12:27:01 -05:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session )
self . buffer . list . insert_item ( True , * tweet )
self . buffer . list . select_item ( selected )
else :
for i in items :
2018-08-13 11:26:55 -05:00
if i [ " message_create " ] [ " sender_id " ] == self . session . db [ " user_id " ] :
continue
2018-07-19 12:27:01 -05:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session )
self . buffer . list . insert_item ( True , * tweet )
output . speak ( _ ( u " %s items retrieved " ) % ( len ( items ) ) , True )
2018-07-18 09:30:03 -05:00
def get_tweet ( self ) :
tweet = self . session . db [ self . name ] [ " items " ] [ self . buffer . list . get_selected ( ) ]
return tweet
get_right_tweet = get_tweet
@_tweets_exist
def reply ( self , * args , * * kwargs ) :
tweet = self . get_right_tweet ( )
2021-01-04 11:16:56 -06:00
screen_name = self . session . get_user ( tweet . message_create [ " sender_id " ] ) [ " screen_name " ]
2018-07-18 09:30:03 -05:00
message = messages . reply ( self . session , _ ( u " Mention " ) , _ ( u " Mention to %s " ) % ( screen_name , ) , " @ %s " % ( screen_name , ) , [ screen_name , ] )
if message . message . get_response ( ) == widgetUtils . OK :
if config . app [ " app-settings " ] [ " remember_mention_and_longtweet " ] :
config . app [ " app-settings " ] [ " longtweet " ] = message . message . long_tweet . GetValue ( )
config . app . write ( )
if message . image == None :
2018-08-22 17:11:15 -05:00
item = self . session . api_call ( call_name = " update_status " , _sound = " reply_send.ogg " , status = message . message . get_text ( ) , tweet_mode = " extended " )
2018-08-16 11:17:15 -05:00
if item != None :
pub . sendMessage ( " sent-tweet " , data = item , user = self . session . db [ " user_name " ] )
2018-07-18 09:30:03 -05:00
else :
call_threaded ( self . session . api_call , call_name = " update_status_with_media " , _sound = " reply_send.ogg " , status = message . message . get_text ( ) , media = message . file )
if hasattr ( message . message , " destroy " ) : message . message . destroy ( )
def onFocus ( self , * args , * * kwargs ) :
tweet = self . get_tweet ( )
if platform . system ( ) == " Windows " and self . session . settings [ " general " ] [ " relative_times " ] == True :
# fix this:
2019-12-16 09:56:59 -06:00
original_date = arrow . get ( int ( tweet [ " created_timestamp " ] [ : - 3 ] ) )
2018-07-18 09:30:03 -05:00
ts = original_date . humanize ( locale = languageHandler . getLanguage ( ) )
self . buffer . list . list . SetItem ( self . buffer . list . get_selected ( ) , 2 , ts )
if self . session . settings [ ' sound ' ] [ ' indicate_audio ' ] and utils . is_audio ( tweet ) :
self . session . sound . play ( " audio.ogg " )
if self . session . settings [ ' sound ' ] [ ' indicate_img ' ] and utils . is_media ( tweet ) :
self . session . sound . play ( " image.ogg " )
def clear_list ( self ) :
dlg = commonMessageDialogs . clear_list ( )
if dlg == widgetUtils . YES :
self . session . db [ self . name ] [ " items " ] = [ ]
self . buffer . list . clear ( )
2018-11-01 15:04:26 -06:00
def auto_read ( self , number_of_items ) :
if number_of_items == 1 and self . name in self . session . settings [ " other_buffers " ] [ " autoread_buffers " ] and self . name not in self . session . settings [ " other_buffers " ] [ " muted_buffers " ] and self . session . settings [ " sound " ] [ " session_mute " ] == False :
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
tweet = self . session . db [ self . name ] [ " items " ] [ - 1 ]
else :
tweet = self . session . db [ self . name ] [ " items " ] [ 0 ]
2018-11-13 16:33:17 -06:00
output . speak ( _ ( u " New direct message " ) )
2018-11-01 15:04:26 -06:00
output . speak ( " " . join ( self . compose_function ( tweet , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session ) ) )
elif number_of_items > 1 and self . name in self . session . settings [ " other_buffers " ] [ " autoread_buffers " ] and self . name not in self . session . settings [ " other_buffers " ] [ " muted_buffers " ] and self . session . settings [ " sound " ] [ " session_mute " ] == False :
output . speak ( _ ( u " {0} new direct messages. " ) . format ( number_of_items , ) )
2019-02-19 17:41:34 -06:00
def open_in_browser ( self , * args , * * kwargs ) :
output . speak ( _ ( u " This action is not supported in the buffer yet. " ) )
2018-08-12 16:23:45 -05:00
class sentDirectMessagesController ( directMessagesController ) :
def __init__ ( self , * args , * * kwargs ) :
super ( sentDirectMessagesController , self ) . __init__ ( * args , * * kwargs )
2018-11-22 13:35:19 -06:00
if ( " sent_direct_messages " in self . session . db ) == False :
2018-08-12 16:23:45 -05:00
self . session . db [ " sent_direct_messages " ] = { " items " : [ ] }
def get_more_items ( self ) :
output . speak ( _ ( u " Getting more items cannot be done in this buffer. Use the direct messages buffer instead. " ) )
2018-08-13 11:26:55 -05:00
def start_stream ( self , * args , * * kwargs ) :
2018-08-12 16:23:45 -05:00
pass
2018-08-13 11:26:55 -05:00
def put_more_items ( self , items ) :
if self . session . settings [ " general " ] [ " reverse_timelines " ] == True :
for i in items :
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session )
self . buffer . list . insert_item ( True , * tweet )
else :
for i in items :
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session )
self . buffer . list . insert_item ( True , * tweet )
2015-04-27 16:08:02 -05:00
class listBufferController ( baseBufferController ) :
def __init__ ( self , parent , function , name , sessionObject , account , sound = None , bufferType = None , list_id = None , * args , * * kwargs ) :
super ( listBufferController , self ) . __init__ ( parent , function , name , sessionObject , account , sound = None , bufferType = None , * args , * * kwargs )
self . users = [ ]
self . list_id = list_id
self . kwargs [ " list_id " ] = list_id
2018-11-01 15:04:26 -06:00
def start_stream ( self , mandatory = False , play_sound = True , avoid_autoreading = False ) :
2015-04-27 16:08:02 -05:00
self . get_user_ids ( )
2018-11-01 15:04:26 -06:00
super ( listBufferController , self ) . start_stream ( mandatory , play_sound , avoid_autoreading )
2015-04-27 16:08:02 -05:00
def get_user_ids ( self ) :
next_cursor = - 1
while ( next_cursor ) :
2018-08-18 23:09:08 -05:00
users = self . session . twitter . get_list_members ( list_id = self . list_id , cursor = next_cursor , include_entities = False , skip_status = True )
2015-04-27 16:08:02 -05:00
for i in users [ ' users ' ] :
2017-01-21 16:50:17 -06:00
if i [ " id " ] not in self . users :
self . users . append ( i [ " id " ] )
2015-04-27 16:08:02 -05:00
next_cursor = users [ " next_cursor " ]
2017-03-24 05:10:15 -06:00
def remove_buffer ( self , force = False ) :
if force == False :
dlg = commonMessageDialogs . remove_buffer ( )
else :
dlg = widgetUtils . YES
2015-06-11 16:09:46 -05:00
if dlg == widgetUtils . YES :
if self . name [ : - 5 ] in self . session . settings [ " other_buffers " ] [ " lists " ] :
self . session . settings [ " other_buffers " ] [ " lists " ] . remove ( self . name [ : - 5 ] )
2018-11-22 13:35:19 -06:00
if self . name in self . session . db :
2017-03-24 05:25:02 -06:00
self . session . db . pop ( self . name )
2017-01-14 06:11:41 -06:00
self . session . settings . write ( )
2015-06-11 16:09:46 -05:00
return True
elif dlg == widgetUtils . NO :
return False
2014-11-12 20:41:29 -06:00
class peopleBufferController ( baseBufferController ) :
def __init__ ( self , parent , function , name , sessionObject , account , bufferType = None , * args , * * kwargs ) :
2015-12-09 11:51:37 -06:00
super ( peopleBufferController , self ) . __init__ ( parent , function , name , sessionObject , account , bufferType = " peoplePanel " , * args , * * kwargs )
2015-01-18 17:19:39 -06:00
log . debug ( " Initializing buffer %s , account %s " % ( name , account , ) )
2014-11-12 20:41:29 -06:00
self . compose_function = compose . compose_followers_list
2015-01-19 12:15:57 -06:00
log . debug ( " Compose_function: %s " % ( self . compose_function , ) )
2015-01-02 09:38:44 -06:00
self . get_tweet = self . get_right_tweet
2015-06-01 11:18:39 -05:00
self . url = self . interact
2017-01-02 10:47:44 -06:00
if " -followers " in self . name or " -friends " in self . name :
self . finished_timeline = False
2017-01-02 11:17:47 -06:00
# Add a compatibility layer for username based timelines from config.
# ToDo: Remove this in some new versions of the client, when user ID timelines become mandatory.
try :
int ( self . kwargs [ " user_id " ] )
except ValueError :
self . is_screen_name = True
self . kwargs [ " screen_name " ] = self . kwargs [ " user_id " ]
self . kwargs . pop ( " user_id " )
2014-11-12 20:41:29 -06:00
2017-03-24 05:10:15 -06:00
def remove_buffer ( self , force = True ) :
2015-12-09 11:51:37 -06:00
if " -followers " in self . name :
2017-03-24 05:10:15 -06:00
if force == False :
dlg = commonMessageDialogs . remove_buffer ( )
else :
dlg = widgetUtils . YES
2015-12-09 11:51:37 -06:00
if dlg == widgetUtils . YES :
if self . name [ : - 10 ] in self . session . settings [ " other_buffers " ] [ " followers_timelines " ] :
self . session . settings [ " other_buffers " ] [ " followers_timelines " ] . remove ( self . name [ : - 10 ] )
2018-11-22 13:35:19 -06:00
if self . name in self . session . db :
2017-03-24 05:25:02 -06:00
self . session . db . pop ( self . name )
2017-01-14 06:11:41 -06:00
self . session . settings . write ( )
2015-12-09 11:51:37 -06:00
return True
elif dlg == widgetUtils . NO :
return False
elif " -friends " in self . name :
2017-03-24 05:10:15 -06:00
if force == False :
dlg = commonMessageDialogs . remove_buffer ( )
else :
dlg = widgetUtils . YES
2015-12-09 11:51:37 -06:00
if dlg == widgetUtils . YES :
if self . name [ : - 8 ] in self . session . settings [ " other_buffers " ] [ " friends_timelines " ] :
2015-12-29 08:31:13 -06:00
self . session . settings [ " other_buffers " ] [ " friends_timelines " ] . remove ( self . name [ : - 8 ] )
2018-11-22 13:35:19 -06:00
if self . name in self . session . db :
2017-03-24 05:25:02 -06:00
self . session . db . pop ( self . name )
2017-01-14 06:11:41 -06:00
self . session . settings . write ( )
2015-12-09 11:51:37 -06:00
return True
elif dlg == widgetUtils . NO :
return False
else :
output . speak ( _ ( u " This buffer is not a timeline; it can ' t be deleted. " ) , True )
return False
2015-02-12 12:59:56 -06:00
2014-11-12 20:41:29 -06:00
def onFocus ( self , ev ) :
pass
2015-01-05 05:33:09 -06:00
def get_message ( self ) :
2018-07-18 09:30:03 -05:00
return " " . join ( self . compose_function ( self . get_tweet ( ) , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session ) )
2015-01-05 05:33:09 -06:00
2014-11-12 20:41:29 -06:00
def delete_item ( self ) : pass
2015-02-12 12:59:56 -06:00
@_tweets_exist
def reply ( self , * args , * * kwargs ) :
tweet = self . get_right_tweet ( )
screen_name = tweet [ " screen_name " ]
message = messages . reply ( self . session , _ ( u " Mention " ) , _ ( u " Mention to %s " ) % ( screen_name , ) , " @ %s " % ( screen_name , ) , [ screen_name , ] )
if message . message . get_response ( ) == widgetUtils . OK :
2018-02-06 17:37:49 -06:00
if config . app [ " app-settings " ] [ " remember_mention_and_longtweet " ] :
config . app [ " app-settings " ] [ " longtweet " ] = message . message . long_tweet . GetValue ( )
config . app . write ( )
2015-02-12 12:59:56 -06:00
if message . image == None :
2018-08-22 17:11:15 -05:00
item = self . session . api_call ( call_name = " update_status " , _sound = " reply_send.ogg " , status = message . message . get_text ( ) , tweet_mode = " extended " )
2018-08-16 11:17:15 -05:00
if item != None :
pub . sendMessage ( " sent-tweet " , data = item , user = self . session . db [ " user_name " ] )
2015-02-12 12:59:56 -06:00
else :
call_threaded ( self . session . api_call , call_name = " update_status_with_media " , _sound = " reply_send.ogg " , status = message . message . get_text ( ) , media = message . file )
2015-04-03 16:57:08 -06:00
if hasattr ( message . message , " destroy " ) : message . message . destroy ( )
2015-02-12 12:59:56 -06:00
2018-11-01 15:04:26 -06:00
def start_stream ( self , mandatory = False , play_sound = True , avoid_autoreading = False ) :
2015-11-03 04:41:01 -06:00
# starts stream every 3 minutes.
current_time = time . time ( )
2015-12-26 09:02:08 -06:00
if self . execution_time == 0 or current_time - self . execution_time > = 180 or mandatory == True :
2015-11-03 04:41:01 -06:00
self . execution_time = current_time
log . debug ( " Starting stream for %s buffer, %s account " % ( self . name , self . account , ) )
log . debug ( " args: %s , kwargs: %s " % ( self . args , self . kwargs ) )
val = self . session . get_cursored_stream ( self . name , self . function , * self . args , * * self . kwargs )
self . put_items_on_list ( val )
2017-01-02 10:47:44 -06:00
if hasattr ( self , " finished_timeline " ) and self . finished_timeline == False :
self . username = self . session . api_call ( " show_user " , * * self . kwargs ) [ " screen_name " ]
self . finished_timeline = True
2018-08-15 11:19:31 -05:00
if val > 0 and self . sound != None and self . session . settings [ " sound " ] [ " session_mute " ] == False and self . name not in self . session . settings [ " other_buffers " ] [ " muted_buffers " ] and play_sound == True :
2018-08-15 05:04:30 -05:00
self . session . sound . play ( self . sound )
2018-11-01 15:04:26 -06:00
# Autoread settings
if avoid_autoreading == False and mandatory == True and val > 0 and self . name in self . session . settings [ " other_buffers " ] [ " autoread_buffers " ] :
self . auto_read ( val )
2015-12-26 09:02:08 -06:00
return val
2014-11-12 20:41:29 -06:00
2015-02-03 09:59:18 -06:00
def get_more_items ( self ) :
try :
2015-12-29 08:31:13 -06:00
items = self . session . get_more_items ( self . function , users = True , name = self . name , count = self . session . settings [ " general " ] [ " max_tweets_per_call " ] , cursor = self . session . db [ self . name ] [ " cursor " ] , * self . args , * * self . kwargs )
2021-01-05 09:34:52 -06:00
except TweepError as e :
output . speak ( e . reason , True )
2015-02-03 09:59:18 -06:00
return
2018-09-18 09:09:25 -05:00
if items == None :
return
2015-02-03 09:59:18 -06:00
for i in items :
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
self . session . db [ self . name ] [ " items " ] . insert ( 0 , i )
else :
self . session . db [ self . name ] [ " items " ] . append ( i )
selected = self . buffer . list . get_selected ( )
2015-03-24 03:47:16 -06:00
if self . session . settings [ " general " ] [ " reverse_timelines " ] == True :
2015-04-10 09:34:24 -05:00
for i in items :
2018-07-18 09:30:03 -05:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session )
2015-04-10 09:34:24 -05:00
self . buffer . list . insert_item ( True , * tweet )
self . buffer . list . select_item ( selected )
else :
for i in items :
2018-07-18 09:30:03 -05:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session )
2015-04-10 09:34:24 -05:00
self . buffer . list . insert_item ( True , * tweet )
output . speak ( _ ( u " %s items retrieved " ) % ( len ( items ) ) , True )
2015-02-03 09:59:18 -06:00
2014-11-12 20:41:29 -06:00
def put_items_on_list ( self , number_of_items ) :
2015-01-18 17:19:39 -06:00
log . debug ( " The list contains %d items " % ( self . buffer . list . get_count ( ) , ) )
2015-01-19 12:15:57 -06:00
# log.debug("Putting %d items on the list..." % (number_of_items,))
2014-11-12 20:41:29 -06:00
if self . buffer . list . get_count ( ) == 0 :
for i in self . session . db [ self . name ] [ " items " ] :
2018-07-18 09:30:03 -05:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session )
2014-11-12 20:41:29 -06:00
self . buffer . list . insert_item ( False , * tweet )
2015-01-22 08:54:41 -06:00
self . buffer . set_position ( self . session . settings [ " general " ] [ " reverse_timelines " ] )
2014-11-12 20:41:29 -06:00
# self.buffer.set_list_position()
elif self . buffer . list . get_count ( ) > 0 :
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
2016-06-28 10:11:56 -05:00
for i in self . session . db [ self . name ] [ " items " ] [ len ( self . session . db [ self . name ] [ " items " ] ) - number_of_items : ] :
2014-11-12 20:41:29 -06:00
tweet = self . compose_function ( i , self . session . db )
2015-02-03 09:59:18 -06:00
self . buffer . list . insert_item ( False , * tweet )
2014-11-12 20:41:29 -06:00
else :
2018-02-06 15:18:42 -06:00
items = self . session . db [ self . name ] [ " items " ] [ 0 : number_of_items ]
items . reverse ( )
for i in items :
2014-11-12 20:41:29 -06:00
tweet = self . compose_function ( i , self . session . db )
self . buffer . list . insert_item ( True , * tweet )
2015-01-18 17:19:39 -06:00
log . debug ( " now the list contains %d items " % ( self . buffer . list . get_count ( ) , ) )
2014-11-12 20:41:29 -06:00
2015-01-02 09:38:44 -06:00
def get_right_tweet ( self ) :
tweet = self . session . db [ self . name ] [ " items " ] [ self . buffer . list . get_selected ( ) ]
return tweet
2015-01-20 15:40:33 -06:00
def add_new_item ( self , item ) :
2018-07-18 09:30:03 -05:00
tweet = self . compose_function ( item , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session )
2015-01-20 15:40:33 -06:00
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
self . buffer . list . insert_item ( False , * tweet )
else :
self . buffer . list . insert_item ( True , * tweet )
2015-03-11 17:17:29 -06:00
if self . name in self . session . settings [ " other_buffers " ] [ " autoread_buffers " ] and self . name not in self . session . settings [ " other_buffers " ] [ " muted_buffers " ] and self . session . settings [ " sound " ] [ " session_mute " ] == False :
2015-02-07 10:23:23 -06:00
output . speak ( " " . join ( tweet ) )
def clear_list ( self ) :
dlg = commonMessageDialogs . clear_list ( )
if dlg == widgetUtils . YES :
self . session . db [ self . name ] [ " items " ] = [ ]
self . session . db [ self . name ] [ " cursor " ] = - 1
self . buffer . list . clear ( )
2015-01-20 15:40:33 -06:00
2015-05-12 10:47:24 -04:00
def interact ( self ) :
2015-03-08 14:18:29 -06:00
user . profileController ( self . session , user = self . get_right_tweet ( ) [ " screen_name " ] )
2015-03-06 21:37:08 -06:00
2015-08-24 09:54:15 -05:00
def show_menu ( self , ev , pos = 0 , * args , * * kwargs ) :
menu = menus . peoplePanelMenu ( )
2018-09-22 21:55:19 -05:00
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . send_message , menuitem = menu . reply )
2015-08-24 09:54:15 -05:00
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . user_actions , menuitem = menu . userActions )
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . details , menuitem = menu . details )
# widgetUtils.connect_event(menu, widgetUtils.MENU, self.lists, menuitem=menu.lists)
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . view , menuitem = menu . view )
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . copy , menuitem = menu . copy )
2019-02-19 17:41:34 -06:00
if hasattr ( menu , " openInBrowser " ) :
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . open_in_browser , menuitem = menu . openInBrowser )
2015-08-24 09:54:15 -05:00
if pos != 0 :
self . buffer . PopupMenu ( menu , pos )
else :
self . buffer . PopupMenu ( menu , ev . GetPosition ( ) )
def details ( self , * args , * * kwargs ) :
pub . sendMessage ( " execute-action " , action = " user_details " )
2018-11-01 15:04:26 -06:00
def auto_read ( self , number_of_items ) :
if number_of_items == 1 and self . name in self . session . settings [ " other_buffers " ] [ " autoread_buffers " ] and self . name not in self . session . settings [ " other_buffers " ] [ " muted_buffers " ] and self . session . settings [ " sound " ] [ " session_mute " ] == False :
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
tweet = self . session . db [ self . name ] [ " items " ] [ - 1 ]
else :
tweet = self . session . db [ self . name [ " items " ] ] [ 0 ]
output . speak ( " " . join ( self . compose_function ( tweet , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session ) ) )
elif number_of_items > 1 and self . name in self . session . settings [ " other_buffers " ] [ " autoread_buffers " ] and self . name not in self . session . settings [ " other_buffers " ] [ " muted_buffers " ] and self . session . settings [ " sound " ] [ " session_mute " ] == False :
output . speak ( _ ( u " {0} new followers. " ) . format ( number_of_items ) )
2019-02-19 17:41:34 -06:00
def open_in_browser ( self , * args , * * kwargs ) :
tweet = self . get_tweet ( )
output . speak ( _ ( u " Opening item in web browser... " ) )
url = " https://twitter.com/ {screen_name} " . format ( screen_name = tweet [ " screen_name " ] )
webbrowser . open ( url )
2014-11-12 20:41:29 -06:00
class searchBufferController ( baseBufferController ) :
2018-11-01 15:04:26 -06:00
def start_stream ( self , mandatory = False , play_sound = True , avoid_autoreading = False ) :
2015-11-03 04:41:01 -06:00
# starts stream every 3 minutes.
current_time = time . time ( )
2015-12-26 23:28:46 -06:00
if self . execution_time == 0 or current_time - self . execution_time > = 180 or mandatory == True :
2015-11-03 04:41:01 -06:00
self . execution_time = current_time
log . debug ( " Starting stream for %s buffer, %s account and %s type " % ( self . name , self . account , self . type ) )
log . debug ( " args: %s , kwargs: %s " % ( self . args , self . kwargs ) )
log . debug ( " Function: %s " % ( self . function , ) )
2015-03-24 17:07:14 -06:00
# try:
2017-06-15 09:57:45 -05:00
val = self . session . search ( self . name , count = self . session . settings [ " general " ] [ " max_tweets_per_call " ] , * self . args , * * self . kwargs )
2015-03-24 17:07:14 -06:00
# except:
# return None
2015-11-03 04:41:01 -06:00
num = self . session . order_buffer ( self . name , val )
self . put_items_on_list ( num )
2018-08-15 11:19:31 -05:00
if num > 0 and self . sound != None and self . session . settings [ " sound " ] [ " session_mute " ] == False and self . name not in self . session . settings [ " other_buffers " ] [ " muted_buffers " ] and play_sound == True :
2018-08-15 05:04:30 -05:00
self . session . sound . play ( self . sound )
2018-11-01 15:04:26 -06:00
# Autoread settings
if avoid_autoreading == False and mandatory == True and num > 0 and self . name in self . session . settings [ " other_buffers " ] [ " autoread_buffers " ] :
self . auto_read ( num )
2015-12-26 09:02:08 -06:00
return num
2014-11-12 20:41:29 -06:00
2017-03-24 05:10:15 -06:00
def remove_buffer ( self , force = False ) :
if force == False :
dlg = commonMessageDialogs . remove_buffer ( )
else :
dlg = widgetUtils . YES
2015-02-16 16:37:56 -06:00
if dlg == widgetUtils . YES :
if self . name [ : - 11 ] in self . session . settings [ " other_buffers " ] [ " tweet_searches " ] :
self . session . settings [ " other_buffers " ] [ " tweet_searches " ] . remove ( self . name [ : - 11 ] )
2017-01-14 06:11:41 -06:00
self . session . settings . write ( )
2018-11-22 13:35:19 -06:00
if self . name in self . session . db :
2017-03-24 05:25:02 -06:00
self . session . db . pop ( self . name )
2015-02-16 16:37:56 -06:00
return True
elif dlg == widgetUtils . NO :
return False
2017-06-15 09:57:45 -05:00
def get_more_items ( self ) :
elements = [ ]
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
last_id = self . session . db [ self . name ] [ 0 ] [ " id " ]
else :
last_id = self . session . db [ self . name ] [ - 1 ] [ " id " ]
try :
items = self . session . search ( self . name , count = self . session . settings [ " general " ] [ " max_tweets_per_call " ] , max_id = last_id , * self . args , * * self . kwargs )
2021-01-05 09:34:52 -06:00
except TweepError as e :
output . speak ( e . reason , True )
2018-09-18 09:09:25 -05:00
if items == None :
return
2017-06-15 09:57:45 -05:00
for i in items :
2017-11-13 20:26:15 -06:00
if utils . is_allowed ( i , self . session . settings , self . name ) == True and utils . find_item ( i [ " id " ] , self . session . db [ self . name ] ) == None :
2017-06-15 09:57:45 -05:00
i = self . session . check_quoted_status ( i )
i = self . session . check_long_tweet ( i )
elements . append ( i )
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
self . session . db [ self . name ] . insert ( 0 , i )
else :
self . session . db [ self . name ] . append ( i )
selection = self . buffer . list . get_selected ( )
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
for i in elements :
2018-07-18 09:30:03 -05:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session )
2017-06-15 09:57:45 -05:00
self . buffer . list . insert_item ( True , * tweet )
else :
for i in items :
2018-07-18 09:30:03 -05:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session . settings [ " general " ] [ " show_screen_names " ] , self . session )
2017-06-15 09:57:45 -05:00
self . buffer . list . insert_item ( False , * tweet )
# self.buffer.list.select_item(selection+elements)
# else:
self . buffer . list . select_item ( selection )
output . speak ( _ ( u " %s items retrieved " ) % ( str ( len ( elements ) ) ) , True )
2015-03-17 03:50:49 -06:00
class searchPeopleBufferController ( peopleBufferController ) :
2014-11-12 20:41:29 -06:00
def __init__ ( self , parent , function , name , sessionObject , account , bufferType = " peoplePanel " , * args , * * kwargs ) :
super ( searchPeopleBufferController , self ) . __init__ ( parent , function , name , sessionObject , account , bufferType = " peoplePanel " , * args , * * kwargs )
2015-01-18 17:19:39 -06:00
log . debug ( " Initializing buffer %s , account %s " % ( name , account , ) )
2015-03-17 03:50:49 -06:00
# self.compose_function = compose.compose_followers_list
2015-01-18 17:19:39 -06:00
log . debug ( " Compose_function: %s " % ( self . compose_function , ) )
2015-03-17 03:50:49 -06:00
self . args = args
self . kwargs = kwargs
self . function = function
2018-11-22 13:35:19 -06:00
if ( " page " in self . kwargs ) == False :
2017-06-15 09:57:45 -05:00
self . kwargs [ " page " ] = 1
2015-01-18 17:19:39 -06:00
2018-11-01 15:04:26 -06:00
def start_stream ( self , mandatory = False , play_sound = True , avoid_autoreading = True ) :
2015-11-03 04:41:01 -06:00
# starts stream every 3 minutes.
current_time = time . time ( )
2015-12-26 23:28:46 -06:00
if self . execution_time == 0 or current_time - self . execution_time > = 180 or mandatory == True :
2015-11-03 04:41:01 -06:00
self . execution_time = current_time
log . debug ( " starting stream for %s buffer, %s account and %s type " % ( self . name , self . account , self . type ) )
log . debug ( " args: %s , kwargs: %s " % ( self . args , self . kwargs ) )
log . debug ( " Function: %s " % ( self . function , ) )
2015-03-28 05:58:57 -06:00
# try:
2015-11-03 04:41:01 -06:00
val = self . session . call_paged ( self . function , * self . args , * * self . kwargs )
2015-03-28 05:58:57 -06:00
# except:
# return
2015-11-03 04:41:01 -06:00
number_of_items = self . session . order_cursored_buffer ( self . name , val )
log . debug ( " Number of items retrieved: %d " % ( number_of_items , ) )
self . put_items_on_list ( number_of_items )
2018-08-15 11:19:31 -05:00
if number_of_items > 0 and self . sound != None and self . session . settings [ " sound " ] [ " session_mute " ] == False and self . name not in self . session . settings [ " other_buffers " ] [ " muted_buffers " ] and play_sound == True :
2018-08-15 05:04:30 -05:00
self . session . sound . play ( self . sound )
2018-11-01 15:04:26 -06:00
# Autoread settings
if avoid_autoreading == False and mandatory == True and number_of_items > 0 and self . name in self . session . settings [ " other_buffers " ] [ " autoread_buffers " ] :
self . auto_read ( number_of_items )
2015-12-26 09:02:08 -06:00
return number_of_items
2015-02-01 21:13:18 -06:00
2017-06-15 09:57:45 -05:00
def get_more_items ( self , * args , * * kwargs ) :
self . kwargs [ " page " ] + = 1
try :
items = self . session . get_more_items ( self . function , users = True , name = self . name , count = self . session . settings [ " general " ] [ " max_tweets_per_call " ] , * self . args , * * self . kwargs )
2021-01-05 09:34:52 -06:00
except TweepError as e :
output . speak ( e . reason , True )
2017-06-15 09:57:45 -05:00
return
2018-09-18 09:09:25 -05:00
if items == None :
return
2017-06-15 09:57:45 -05:00
for i in items :
if self . session . settings [ " general " ] [ " reverse_timelines " ] == False :
self . session . db [ self . name ] [ " items " ] . insert ( 0 , i )
else :
self . session . db [ self . name ] [ " items " ] . append ( i )
selected = self . buffer . list . get_selected ( )
# self.put_items_on_list(len(items))
if self . session . settings [ " general " ] [ " reverse_timelines " ] == True :
for i in items :
2018-07-18 09:30:03 -05:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session )
2017-06-15 09:57:45 -05:00
self . buffer . list . insert_item ( True , * tweet )
self . buffer . list . select_item ( selected )
else :
for i in items :
2018-07-18 09:30:03 -05:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ " general " ] [ " relative_times " ] , self . session )
2017-06-15 09:57:45 -05:00
self . buffer . list . insert_item ( True , * tweet )
# self.buffer.list.select_item(selection)
# else:
# self.buffer.list.select_item(selection-elements)
output . speak ( _ ( u " %s items retrieved " ) % ( len ( items ) ) , True )
2017-03-24 05:10:15 -06:00
def remove_buffer ( self , force = False ) :
if force == False :
dlg = commonMessageDialogs . remove_buffer ( )
else :
dlg = widgetUtils . YES
2015-03-17 03:50:49 -06:00
if dlg == widgetUtils . YES :
if self . name [ : - 11 ] in self . session . settings [ " other_buffers " ] [ " tweet_searches " ] :
self . session . settings [ " other_buffers " ] [ " tweet_searches " ] . remove ( self . name [ : - 11 ] )
2017-01-14 06:11:41 -06:00
self . session . settings . write ( )
2018-11-22 13:35:19 -06:00
if self . name in self . session . db :
2017-03-24 05:25:02 -06:00
self . session . db . pop ( self . name )
2015-03-17 03:50:49 -06:00
return True
elif dlg == widgetUtils . NO :
return False
2018-09-22 21:55:19 -05:00
class trendsBufferController ( baseBuffers . buffer ) :
2015-02-01 21:13:18 -06:00
def __init__ ( self , parent , name , session , account , trendsFor , * args , * * kwargs ) :
super ( trendsBufferController , self ) . __init__ ( parent = parent , session = session )
self . trendsFor = trendsFor
self . session = session
self . account = account
self . invisible = True
self . buffer = buffers . trendsPanel ( parent , name )
self . buffer . account = account
self . type = self . buffer . type
self . bind_events ( )
self . sound = " trends_updated.ogg "
self . trends = [ ]
self . name = name
self . buffer . name = name
self . compose_function = self . compose_function_
self . get_formatted_message = self . get_message
2015-10-03 04:34:43 -05:00
self . reply = self . search_topic
2015-02-01 21:13:18 -06:00
2018-11-01 15:04:26 -06:00
def start_stream ( self , mandatory = False , play_sound = True , avoid_autoreading = False ) :
2015-11-03 04:41:01 -06:00
# starts stream every 3 minutes.
current_time = time . time ( )
2016-07-23 16:40:40 -05:00
if self . execution_time == 0 or current_time - self . execution_time > = 180 or mandatory == True :
2015-11-03 04:41:01 -06:00
self . execution_time = current_time
try :
data = self . session . call_paged ( " get_place_trends " , id = self . trendsFor )
except :
return
if not hasattr ( self , " name_ " ) :
self . name_ = data [ 0 ] [ " locations " ] [ 0 ] [ " name " ]
self . trends = data [ 0 ] [ " trends " ]
self . put_items_on_the_list ( )
2018-08-15 11:19:31 -05:00
if self . sound != None and self . session . settings [ " sound " ] [ " session_mute " ] == False and self . name not in self . session . settings [ " other_buffers " ] [ " muted_buffers " ] and play_sound == True :
2017-09-08 13:39:13 -05:00
self . session . sound . play ( self . sound )
2015-02-01 21:13:18 -06:00
def put_items_on_the_list ( self ) :
selected_item = self . buffer . list . get_selected ( )
self . buffer . list . clear ( )
for i in self . trends :
tweet = self . compose_function ( i )
self . buffer . list . insert_item ( False , * tweet )
2015-02-03 04:39:46 -06:00
self . buffer . set_position ( self . session . settings [ " general " ] [ " reverse_timelines " ] )
2015-02-01 21:13:18 -06:00
def compose_function_ ( self , trend ) :
return [ trend [ " name " ] ]
def bind_events ( self ) :
log . debug ( " Binding events... " )
self . buffer . list . list . Bind ( wx . EVT_CHAR_HOOK , self . get_event )
2015-10-03 04:34:43 -05:00
widgetUtils . connect_event ( self . buffer , widgetUtils . BUTTON_PRESSED , self . tweet_about_this_trend , self . buffer . tweetTrendBtn )
2018-09-22 21:55:19 -05:00
widgetUtils . connect_event ( self . buffer , widgetUtils . BUTTON_PRESSED , self . post_status , self . buffer . tweet )
2015-08-24 09:54:15 -05:00
widgetUtils . connect_event ( self . buffer . list . list , wx . EVT_LIST_ITEM_RIGHT_CLICK , self . show_menu )
widgetUtils . connect_event ( self . buffer . list . list , wx . EVT_LIST_KEY_DOWN , self . show_menu_by_key )
2015-10-03 04:34:43 -05:00
widgetUtils . connect_event ( self . buffer , widgetUtils . BUTTON_PRESSED , self . search_topic , self . buffer . search_topic )
2015-02-01 21:13:18 -06:00
def get_message ( self ) :
return self . compose_function ( self . trends [ self . buffer . list . get_selected ( ) ] ) [ 0 ]
2017-03-24 05:10:15 -06:00
def remove_buffer ( self , force = False ) :
if force == False :
dlg = commonMessageDialogs . remove_buffer ( )
else :
dlg = widgetUtils . YES
2015-02-12 12:59:56 -06:00
if dlg == widgetUtils . YES :
2015-02-12 13:18:24 -06:00
if self . name [ : - 3 ] in self . session . settings [ " other_buffers " ] [ " trending_topic_buffers " ] :
self . session . settings [ " other_buffers " ] [ " trending_topic_buffers " ] . remove ( self . name [ : - 3 ] )
2017-01-14 06:11:41 -06:00
self . session . settings . write ( )
2018-11-22 13:35:19 -06:00
if self . name in self . session . db :
2017-03-24 05:25:02 -06:00
self . session . db . pop ( self . name )
2015-02-12 12:59:56 -06:00
return True
elif dlg == widgetUtils . NO :
2015-03-17 12:24:29 -06:00
return False
2016-07-23 16:40:40 -05:00
def url ( self , * args , * * kwargs ) :
self . tweet_about_this_trend ( )
2015-10-03 04:34:43 -05:00
def search_topic ( self , * args , * * kwargs ) :
topic = self . trends [ self . buffer . list . get_selected ( ) ] [ " name " ]
pub . sendMessage ( " search " , term = topic )
2015-03-18 11:45:39 -06:00
2015-08-24 09:54:15 -05:00
def show_menu ( self , ev , pos = 0 , * args , * * kwargs ) :
menu = menus . trendsPanelMenu ( )
2015-10-03 04:34:43 -05:00
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . search_topic , menuitem = menu . search_topic )
2015-08-24 09:54:15 -05:00
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . tweet_about_this_trend , menuitem = menu . tweetThisTrend )
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . view , menuitem = menu . view )
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . copy , menuitem = menu . copy )
if pos != 0 :
self . buffer . PopupMenu ( menu , pos )
else :
self . buffer . PopupMenu ( menu , ev . GetPosition ( ) )
def view ( self , * args , * * kwargs ) :
pub . sendMessage ( " execute-action " , action = " view_item " )
def copy ( self , * args , * * kwargs ) :
pub . sendMessage ( " execute-action " , action = " copy_to_clipboard " )
def tweet_about_this_trend ( self , * args , * * kwargs ) :
if self . buffer . list . get_count ( ) == 0 : return
title = _ ( u " Tweet " )
caption = _ ( u " Write the tweet here " )
2017-11-08 12:09:53 -06:00
tweet = messages . tweet ( self . session , title , caption , self . get_message ( ) + " " )
2015-08-24 09:54:15 -05:00
tweet . message . set_cursor_at_end ( )
if tweet . message . get_response ( ) == widgetUtils . OK :
text = tweet . message . get_text ( )
2017-11-08 12:09:53 -06:00
if len ( text ) > 280 and tweet . message . get ( " long_tweet " ) == True :
2015-08-24 09:54:15 -05:00
if tweet . image == None :
text = twishort . create_tweet ( self . session . settings [ " twitter " ] [ " user_key " ] , self . session . settings [ " twitter " ] [ " user_secret " ] , text )
else :
text = twishort . create_tweet ( self . session . settings [ " twitter " ] [ " user_key " ] , self . session . settings [ " twitter " ] [ " user_secret " ] , text , 1 )
if tweet . image == None :
call_threaded ( self . session . api_call , call_name = " update_status " , status = text )
else :
call_threaded ( self . session . api_call , call_name = " update_status_with_media " , status = text , media = tweet . image )
if hasattr ( tweet . message , " destroy " ) : tweet . message . destroy ( )
def show_menu_by_key ( self , ev ) :
if self . buffer . list . get_count ( ) == 0 :
return
if ev . GetKeyCode ( ) == wx . WXK_WINDOWS_MENU :
self . show_menu ( widgetUtils . MENU , pos = self . buffer . list . list . GetPosition ( ) )
2019-02-19 17:41:34 -06:00
def open_in_browser ( self , * args , * * kwargs ) :
output . speak ( _ ( u " This action is not supported in the buffer, yet. " ) )
2015-03-18 11:45:39 -06:00
class conversationBufferController ( searchBufferController ) :
2018-11-01 15:04:26 -06:00
def start_stream ( self , start = False , mandatory = False , play_sound = True , avoid_autoreading = False ) :
2015-11-03 04:41:01 -06:00
# starts stream every 3 minutes.
current_time = time . time ( )
2016-07-23 16:24:06 -05:00
if self . execution_time == 0 or current_time - self . execution_time > = 180 or mandatory == True :
2015-11-03 04:41:01 -06:00
self . execution_time = current_time
if start == True :
self . statuses = [ ]
self . ids = [ ]
self . statuses . append ( self . tweet )
self . ids . append ( self . tweet [ " id " ] )
tweet = self . tweet
while tweet [ " in_reply_to_status_id " ] != None :
2016-04-01 08:55:30 -06:00
try :
2018-08-18 23:09:08 -05:00
tweet = self . session . twitter . show_status ( id = tweet [ " in_reply_to_status_id " ] , tweet_mode = " extended " )
2021-01-05 09:34:52 -06:00
except TweepError as err :
2016-04-01 08:55:30 -06:00
break
2015-11-03 04:41:01 -06:00
self . statuses . insert ( 0 , tweet )
self . ids . append ( tweet [ " id " ] )
if tweet [ " in_reply_to_status_id " ] == None :
self . kwargs [ " since_id " ] = tweet [ " id " ]
self . ids . append ( tweet [ " id " ] )
2016-09-28 17:25:03 -05:00
val2 = self . session . search ( self . name , tweet_mode = " extended " , * self . args , * * self . kwargs )
2015-11-03 04:41:01 -06:00
for i in val2 :
if i [ " in_reply_to_status_id " ] in self . ids :
self . statuses . append ( i )
self . ids . append ( i [ " id " ] )
tweet = i
number_of_items = self . session . order_buffer ( self . name , self . statuses )
log . debug ( " Number of items retrieved: %d " % ( number_of_items , ) )
self . put_items_on_list ( number_of_items )
2018-08-15 11:19:31 -05:00
if number_of_items > 0 and self . sound != None and self . session . settings [ " sound " ] [ " session_mute " ] == False and self . name not in self . session . settings [ " other_buffers " ] [ " muted_buffers " ] and play_sound == True :
2018-08-15 05:04:30 -05:00
self . session . sound . play ( self . sound )
2018-11-01 15:04:26 -06:00
# Autoread settings
if avoid_autoreading == False and mandatory == True and number_of_items > 0 and self . name in self . session . settings [ " other_buffers " ] [ " autoread_buffers " ] :
self . auto_read ( number_of_items )
2015-12-26 09:02:08 -06:00
return number_of_items
2015-11-03 04:41:01 -06:00
2017-03-24 05:10:15 -06:00
def remove_buffer ( self , force = False ) :
if force == False :
dlg = commonMessageDialogs . remove_buffer ( )
else :
dlg = widgetUtils . YES
2015-11-03 04:41:01 -06:00
if dlg == widgetUtils . YES :
2018-11-22 13:35:19 -06:00
if self . name in self . session . db :
2017-06-15 08:26:30 -05:00
self . session . db . pop ( self . name )
2015-11-03 04:41:01 -06:00
return True
2016-01-30 17:14:41 +01:00
elif dlg == widgetUtils . NO :
2015-11-03 04:41:01 -06:00
return False