2014-11-12 20:41:29 -06: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
2015-04-03 16:57:08 -06:00
import user
elif platform . system () == "Linux" :
from gi.repository import Gtk
from gtkUI import buffers , dialogs , commonMessageDialogs
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
2015-01-05 06:05:31 -06:00
from twitter import compose , utils
2015-01-02 09:38:44 -06:00
from mysc.thread_utils import call_threaded
2015-01-05 05:33:09 -06:00
from twython import TwythonError
2015-02-26 15:21:26 -06:00
from pubsub import pub
2015-06-01 17:52:23 -05:00
from 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_
2014-11-12 20:41:29 -06:00
class bufferController ( object ):
def __init__ ( self , parent = None , function = None , session = None , * args , ** kwargs ):
super ( bufferController , self ) . __init__ ()
self . function = function
self . compose_function = None
self . args = args
self . kwargs = kwargs
self . buffer = None
self . account = ""
2014-12-31 00:07:27 -06:00
self . needs_init = True
2015-01-19 12:15:57 -06:00
self . invisible = False # False if the buffer will be ignored on the invisible interface.
2015-11-03 04:41:01 -06:00
self . execution_time = 0
2014-11-12 20:41:29 -06:00
2015-02-07 10:23:23 -06:00
def clear_list ( self ): pass
2015-05-13 21:59:46 -04:00
2014-11-12 20:41:29 -06:00
def get_event ( self , ev ):
2016-06-25 19:48:21 -05:00
""" Catches key presses in the WX interface and generate the corresponding event names."""
2015-07-03 17:23:25 -05:00
if ev . GetKeyCode () == wx . WXK_RETURN and ev . ControlDown (): event = "audio"
2015-06-12 12:26:14 -05:00
elif ev . GetKeyCode () == wx . WXK_RETURN : event = "url"
2014-11-12 20:41:29 -06:00
elif ev . GetKeyCode () == wx . WXK_F5 : event = "volume_down"
elif ev . GetKeyCode () == wx . WXK_F6 : event = "volume_up"
elif ev . GetKeyCode () == wx . WXK_DELETE and ev . ShiftDown (): event = "clear_list"
2015-01-05 05:33:09 -06:00
elif ev . GetKeyCode () == wx . WXK_DELETE : event = "destroy_status"
2014-11-12 20:41:29 -06:00
else :
event = None
ev . Skip ()
if event != None :
2015-03-17 12:24:29 -06:00
try :
getattr ( self , event )()
except AttributeError :
pass
2014-11-12 20:41:29 -06:00
def volume_down ( self ):
2015-01-20 15:40:33 -06:00
if self . session . settings [ "sound" ][ "volume" ] > 0.0 :
if self . session . settings [ "sound" ][ "volume" ] <= 0.05 :
self . session . settings [ "sound" ][ "volume" ] = 0.0
2014-11-12 20:41:29 -06:00
else :
2015-01-20 15:40:33 -06:00
self . session . settings [ "sound" ][ "volume" ] -= 0.05
2015-01-20 22:07:13 -06:00
if hasattr ( sound . URLPlayer , "stream" ):
sound . URLPlayer . stream . volume = self . session . settings [ "sound" ][ "volume" ]
2015-01-20 15:40:33 -06:00
self . session . sound . play ( "volume_changed.ogg" )
2017-01-14 06:11:41 -06:00
self . session . settings . write ()
2014-11-12 20:41:29 -06:00
def volume_up ( self ):
2015-01-20 15:40:33 -06:00
if self . session . settings [ "sound" ][ "volume" ] < 1.0 :
if self . session . settings [ "sound" ][ "volume" ] >= 0.95 :
self . session . settings [ "sound" ][ "volume" ] = 1.0
2014-11-12 20:41:29 -06:00
else :
2015-01-20 15:40:33 -06:00
self . session . settings [ "sound" ][ "volume" ] += 0.05
2015-01-20 22:07:13 -06:00
if hasattr ( sound . URLPlayer , "stream" ):
sound . URLPlayer . stream . volume = self . session . settings [ "sound" ][ "volume" ]
2015-01-22 08:54:41 -06:00
self . session . sound . play ( "volume_changed.ogg" )
2017-01-14 06:11:41 -06:00
self . session . settings . write ()
2014-11-12 20:41:29 -06:00
2015-12-26 09:02:08 -06:00
def start_stream ( self , mandatory = False ):
if mandatory == True :
output . speak ( _ ( u "Unable to update this buffer." ))
2014-11-12 20:41:29 -06:00
pass
2015-02-03 09:59:18 -06:00
def get_more_items ( self ):
2015-04-10 09:34:24 -05:00
output . speak ( _ ( u "This action is not supported for this buffer" ), True )
2015-02-03 09:59:18 -06:00
2014-11-12 20:41:29 -06:00
def put_items_on_list ( self , items ):
pass
def remove_buffer ( self ):
2015-02-25 08:39:06 -06:00
return False
2014-11-12 20:41:29 -06:00
def remove_item ( self , item ):
2016-07-27 11:56:38 -05:00
f = self . buffer . list . get_selected ()
2014-11-12 20:41:29 -06:00
self . buffer . list . remove_item ( item )
2016-07-27 11:56:38 -05:00
self . buffer . list . select_item ( f )
2014-11-12 20:41:29 -06:00
def bind_events ( self ):
pass
def get_object ( self ):
return self . buffer
2015-01-05 05:33:09 -06:00
def get_message ( self ):
pass
2014-11-12 20:41:29 -06:00
def set_list_position ( self , reversed = False ):
if reversed == False :
self . buffer . list . select_item ( - 1 )
else :
self . buffer . list . select_item ( 0 )
2015-01-02 09:38:44 -06:00
def reply ( self ):
pass
def direct_message ( self ):
pass
2015-01-02 10:53:33 -06:00
def retweet ( self ):
pass
2015-01-05 05:33:09 -06:00
def destroy_status ( self ):
pass
2015-01-05 06:05:31 -06:00
def post_tweet ( self , * args , ** kwargs ):
title = _ ( u "Tweet" )
caption = _ ( u "Write the tweet here" )
2015-07-29 14:47:14 -05:00
tweet = messages . tweet ( self . session , title , caption , "" , twishort_enabled = self . session . settings [ "mysc" ][ "twishort_enabled" ])
2015-01-05 06:05:31 -06:00
if tweet . message . get_response () == widgetUtils . OK :
2015-07-29 14:47:14 -05:00
self . session . settings [ "mysc" ][ "twishort_enabled" ] = tweet . message . long_tweet . GetValue ()
2015-01-05 06:05:31 -06:00
text = tweet . message . get_text ()
2015-07-13 04:45:06 -05:00
if len ( text ) > 140 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 :
2015-01-08 08:01:45 -06:00
call_threaded ( self . session . api_call , call_name = "update_status" , status = text )
2015-01-05 06:05:31 -06:00
else :
2016-07-15 12:29:48 -05:00
call_threaded ( self . post_with_media , text = text , attachments = tweet . attachments )
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
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" )
img = self . session . twitter . twitter . upload_media ( media = photo )
self . session . twitter . twitter . set_description ( media_id = img [ "media_id" ], alt_text = dict ( text = i [ "description" ]))
media_ids . append ( img [ "media_id" ])
self . session . twitter . twitter . update_status ( status = text , media_ids = media_ids )
2016-03-29 16:09:44 -06:00
2015-08-25 13:37:31 -05:00
def save_positions ( self ):
try :
self . session . db [ self . name + "_pos" ] = self . buffer . list . get_selected ()
except AttributeError :
pass
2014-11-12 20:41:29 -06:00
class accountPanel ( bufferController ):
2015-02-26 15:21:26 -06:00
def __init__ ( self , parent , name , account , account_id ):
2014-11-12 20:41:29 -06:00
super ( accountPanel , self ) . __init__ ( parent , None , name )
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 . buffer = buffers . accountPanel ( parent , name )
self . type = self . buffer . type
self . compose_function = None
2014-12-31 00:07:27 -06:00
self . session = None
self . needs_init = False
2014-11-12 20:41:29 -06:00
self . account = account
self . buffer . account = account
self . name = name
2015-02-26 15:21:26 -06:00
self . account_id = account_id
def setup_account ( self ):
widgetUtils . connect_event ( self . buffer , widgetUtils . CHECKBOX , self . autostart , menuitem = self . buffer . autostart_account )
2015-04-08 13:34:50 -05:00
if self . account_id in config . app [ "sessions" ][ "ignored_sessions" ]:
2015-02-26 15:21:26 -06:00
self . buffer . change_autostart ( False )
2015-04-08 13:34:50 -05:00
else :
self . buffer . change_autostart ( True )
2015-02-26 15:21:26 -06:00
if not hasattr ( self , "logged" ):
self . buffer . change_login ( login = False )
widgetUtils . connect_event ( self . buffer . login , widgetUtils . BUTTON_PRESSED , self . logout )
else :
2015-03-12 17:55:54 -06:00
self . buffer . change_login ( login = True )
2015-02-26 15:21:26 -06:00
widgetUtils . connect_event ( self . buffer . login , widgetUtils . BUTTON_PRESSED , self . login )
2015-04-03 16:57:08 -06:00
2015-02-26 15:21:26 -06:00
def login ( self , * args , ** kwargs ):
del self . logged
self . setup_account ()
pub . sendMessage ( "login" , session_id = self . account_id )
def logout ( self , * args , ** kwargs ):
self . logged = False
self . setup_account ()
pub . sendMessage ( "logout" , session_id = self . account_id )
def autostart ( self , * args , ** kwargs ):
if self . account_id in config . app [ "sessions" ][ "ignored_sessions" ]:
self . buffer . change_autostart ( True )
config . app [ "sessions" ][ "ignored_sessions" ] . remove ( self . account_id )
else :
self . buffer . change_autostart ( False )
config . app [ "sessions" ][ "ignored_sessions" ] . append ( self . account_id )
2017-01-14 06:11:41 -06:00
config . app . write ()
2014-11-12 20:41:29 -06:00
class emptyPanel ( bufferController ):
def __init__ ( self , parent , name , account ):
2016-04-16 13:31:37 -05:00
super ( emptyPanel , self ) . __init__ ( parent = parent )
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 . buffer = buffers . emptyPanel ( parent , name )
self . type = self . buffer . type
self . compose_function = None
self . account = account
self . buffer . account = account
self . name = name
2014-12-31 00:07:27 -06:00
self . session = None
self . needs_init = True
2015-01-02 09:38:44 -06:00
2014-11-12 20:41:29 -06:00
class baseBufferController ( bufferController ):
2016-09-28 17:25:03 -05:00
def __init__ ( self , parent , function , name , sessionObject , account , sound = None , bufferType = None , compose_func = "compose_tweet" , * args , ** kwargs ):
2014-11-12 20:41:29 -06:00
super ( baseBufferController , self ) . __init__ ( parent , function , * 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
if bufferType != None :
self . buffer = getattr ( buffers , bufferType )( parent , name )
else :
self . buffer = buffers . basePanel ( parent , name )
2015-01-19 12:15:57 -06:00
self . invisible = True
2014-11-12 20:41:29 -06:00
self . name = name
self . type = self . buffer . type
self . session = sessionObject
2016-09-28 17:25:03 -05:00
self . compose_function = getattr ( compose , compose_func )
2015-01-18 17:19:39 -06:00
log . debug ( "Compose_function: %s " % ( self . compose_function ,))
2014-11-12 20:41:29 -06:00
self . account = account
self . buffer . account = account
self . bind_events ()
2015-01-27 17:09:28 -06:00
self . sound = sound
2017-01-02 10:47:44 -06:00
if "-timeline" in self . name or "-favorite" 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
2015-01-25 02:38:17 -06:00
def get_formatted_message ( self ):
2017-01-02 13:19:16 -06:00
if self . type == "dm" or self . name == "sent_tweets" or self . name == "sent_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" ])[ 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 ()
2017-01-02 13:19:16 -06:00
return " " . join ( self . compose_function ( tweet , self . session . db , self . session . settings [ "general" ][ "relative_times" ], self . session . settings [ "general" ][ "show_screen_names" ]))
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 = []
tweet_id = tweet [ "id" ]
2016-06-25 19:48:21 -05:00
message = None
if tweet . has_key ( "message" ):
message = tweet [ "message" ]
2015-06-13 07:35:04 -05:00
try :
2016-09-28 17:25:03 -05:00
tweet = self . session . twitter . twitter . show_status ( id = tweet_id , include_ext_alt_text = True , tweet_mode = "extended" )
urls = utils . find_urls_in_text ( tweet [ "full_text" ])
2015-08-20 17:57:06 -05:00
for url in range ( 0 , len ( urls )):
2016-09-28 17:25:03 -05:00
try : tweet [ "full_text" ] = tweet [ "full_text" ] . replace ( urls [ url ], tweet [ "entities" ][ "urls" ][ url ][ "expanded_url" ])
2015-08-20 17:57:06 -05:00
except IndexError : pass
2015-06-13 07:35:04 -05:00
except TwythonError as e :
utils . twitter_error ( e )
return
2016-06-25 19:48:21 -05:00
if message != None :
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 :
2016-09-28 17:25:03 -05:00
tweet = self . session . twitter . twitter . show_status ( id = l , include_ext_alt_text = True , tweet_mode = "extended" )
urls = utils . find_urls_in_text ( tweet [ "full_text" ])
2015-08-20 17:57:06 -05:00
for url in range ( 0 , len ( urls )):
2016-09-28 17:25:03 -05:00
try : tweet [ "full_text" ] = tweet [ "full_text" ] . replace ( urls [ url ], tweet [ "entities" ][ "urls" ][ url ][ "expanded_url" ])
2015-08-20 17:57:06 -05:00
except IndexError : pass
2015-06-13 07:35:04 -05:00
except TwythonError as e :
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 )
2015-12-26 09:02:08 -06:00
def start_stream ( self , mandatory = 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 ))
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 ,))
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 :
self . username = val [ 0 ][ "user" ][ "screen_name" ]
elif "-favorite" in self . name :
self . username = self . session . api_call ( "show_user" , ** self . kwargs )[ "screen_name" ]
self . finished_timeline = True
pub . sendMessage ( "buffer-title-changed" , buffer = self )
2015-12-26 09:02:08 -06:00
if number_of_items > 0 and self . name != "sent_tweets" and self . name != "sent_direct_messages" and self . sound != None :
2015-11-03 04:41:01 -06:00
self . session . sound . play ( self . sound )
2015-12-26 09:02:08 -06:00
return number_of_items
2014-11-12 20:41:29 -06: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 )
except TwythonError as e :
2015-04-10 09:34:24 -05:00
output . speak ( e . message , True )
2015-02-03 09:59:18 -06:00
for i in items :
2016-04-28 13:54:06 -05:00
if utils . is_allowed ( i , self . session . settings [ "twitter" ][ "ignored_clients" ]) == True and utils . find_item ( i [ "id" ], self . session . db [ self . name ]) == None :
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 :
2017-01-02 13:19:16 -06:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ "general" ][ "relative_times" ], self . session . settings [ "general" ][ "show_screen_names" ])
2015-04-10 09:34:24 -05:00
self . buffer . list . insert_item ( True , * tweet )
else :
for i in items :
2017-01-02 13:19:16 -06:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ "general" ][ "relative_times" ], self . session . settings [ "general" ][ "show_screen_names" ])
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
2015-02-11 16:14:25 -06:00
def remove_buffer ( self ):
2015-03-19 05:34:18 -06:00
if "-timeline" in self . name :
2015-02-11 16:14:25 -06:00
dlg = commonMessageDialogs . remove_buffer ()
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 ()
2016-04-02 02:59:59 -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 :
dlg = commonMessageDialogs . remove_buffer ()
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 ])
2016-04-02 02:59:59 -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
for i in xrange ( 0 , len ( self . session . db [ self . name ])):
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 ):
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 :
for i in self . session . db [ self . name ]:
2017-01-02 13:19:16 -06:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ "general" ][ "relative_times" ], self . session . settings [ "general" ][ "show_screen_names" ])
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 :
2016-06-28 10:11:56 -05:00
items = self . session . db [ self . name ][ len ( self . session . db [ self . name ]) - number_of_items :]
for i in items :
2017-01-02 13:19:16 -06:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ "general" ][ "relative_times" ], self . session . settings [ "general" ][ "show_screen_names" ])
2014-11-12 20:41:29 -06:00
self . buffer . list . insert_item ( False , * tweet )
else :
2016-07-20 04:47:39 -05:00
items = self . session . db [ self . name ][ 0 : number_of_items ]
items . reverse ()
for i in items :
2017-01-02 13:19:16 -06:00
tweet = self . compose_function ( i , self . session . db , self . session . settings [ "general" ][ "relative_times" ], self . session . settings [ "general" ][ "show_screen_names" ])
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 ):
2017-01-02 13:19:16 -06:00
tweet = self . compose_function ( item , self . session . db , self . session . settings [ "general" ][ "relative_times" ], self . session . settings [ "general" ][ "show_screen_names" ])
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 :
2015-02-07 10:23:23 -06:00
output . speak ( " " . join ( tweet [: 2 ]))
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 )
2015-01-05 06:05:31 -06:00
widgetUtils . connect_event ( self . buffer , widgetUtils . BUTTON_PRESSED , self . post_tweet , self . buffer . tweet )
# if self.type == "baseBuffer":
widgetUtils . connect_event ( self . buffer , widgetUtils . BUTTON_PRESSED , self . retweet , self . buffer . retweet )
widgetUtils . connect_event ( self . buffer , widgetUtils . BUTTON_PRESSED , self . direct_message , self . buffer . dm )
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
if self . name == "sent_tweets" or self . name == "sent_direct_messages" :
menu = menus . sentPanelMenu ()
elif self . name == "direct_messages" :
menu = menus . dmPanelMenu ()
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . direct_message , menuitem = menu . reply )
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 )
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . retweet , menuitem = menu . retweet )
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 )
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 ):
if self . session . db [ self . name ][ self . buffer . list . get_selected ()] . has_key ( "retweeted_status" ):
tweet = self . session . db [ self . name ][ self . buffer . list . get_selected ()][ "retweeted_status" ]
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 ()
screen_name = tweet [ "user" ][ "screen_name" ]
id = tweet [ "id" ]
2017-01-03 20:35:53 -06:00
twishort_enabled = tweet . has_key ( "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" )
message = messages . reply ( self . session , _ ( u "Reply" ), _ ( u "Reply to %s " ) % ( screen_name ,), "" , twishort_enabled = self . session . settings [ "mysc" ][ "twishort_enabled" ], users = users , ids = ids )
2015-01-02 09:38:44 -06:00
if message . message . get_response () == widgetUtils . OK :
2016-12-19 11:43:32 -06:00
params = { "_sound" : "reply_send.ogg" , "in_reply_to_status_id" : id ,}
2015-07-29 14:47:14 -05:00
self . session . settings [ "mysc" ][ "twishort_enabled" ] = message . message . long_tweet . GetValue ()
2016-10-04 03:55:36 -05:00
self . session . settings [ "mysc" ][ "mention_all" ] = message . message . mentionAll . GetValue ()
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
2015-07-13 04:45:06 -05:00
if len ( text ) > 140 and message . message . get ( "long_tweet" ) == True :
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
call_threaded ( self . session . api_call , ** params )
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
2015-01-05 06:05:31 -06:00
def direct_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" :
screen_name = tweet [ "sender" ][ "screen_name" ]
users = utils . get_all_users ( tweet , self . session . db )
elif self . type == "people" :
screen_name = tweet [ "screen_name" ]
users = [ screen_name ]
else :
screen_name = tweet [ "user" ][ "screen_name" ]
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 :
2015-12-26 09:02:08 -06:00
val = self . session . api_call ( call_name = "send_direct_message" , text = dm . message . get_text (), screen_name = dm . message . get ( "cb" ))
if val != None :
if self . session . settings [ "general" ][ "reverse_timelines" ] == False :
self . session . db [ "sent_direct_messages" ] . append ( val )
else :
self . session . db [ "sent_direct_messages" ] . insert ( 0 , val )
pub . sendMessage ( "sent-dm" , data = val , user = self . session . db [ "user_name" ])
2015-04-03 16:57:08 -06:00
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
2015-01-05 06:05:31 -06:00
def retweet ( self , * args , ** kwargs ):
2015-01-02 10:53:33 -06:00
tweet = self . get_right_tweet ()
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 = '' ):
2016-10-02 09:11:02 -05:00
if tweet . has_key ( "full_text" ):
comments = tweet [ "full_text" ]
else :
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 = 116 , messageType = "retweet" , twishort_enabled = self . session . settings [ "mysc" ][ "twishort_enabled" ])
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 ()
2016-10-02 09:11:02 -05: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 :
call_threaded ( self . session . api_call , call_name = "update_status" , _sound = "retweet_send.ogg" , status = text , in_reply_to_status_id = id )
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 ):
call_threaded ( self . session . api_call , call_name = "retweet" , _sound = "retweet_send.ogg" , id = id )
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:
2015-01-19 12:15:57 -06:00
original_date = arrow . get ( self . session . db [ self . name ][ self . buffer . list . get_selected ()][ "created_at" ], "ddd MMM D H:m:s Z YYYY" , locale = "en" )
2015-01-05 06:05:31 -06:00
ts = original_date . humanize ( locale = languageHandler . getLanguage ())
2014-11-12 20:41:29 -06:00
self . buffer . list . list . SetStringItem ( 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
# @_tweets_exist
def audio ( self , url = '' , * args , ** kwargs ):
2015-10-31 20:57:21 -06:00
if hasattr ( sound . URLPlayer , 'stream' ) and sound . URLPlayer . stream . is_playing == True :
2015-05-16 14:25:38 -04:00
return sound . URLPlayer . stop_audio ( delete = True )
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" :
2015-02-07 10:23:23 -06:00
self . session . twitter . twitter . destroy_direct_message ( id = self . get_right_tweet ()[ "id" ])
else :
self . session . twitter . twitter . destroy_status ( id = self . get_right_tweet ()[ "id" ])
self . session . db [ self . name ] . pop ( index )
self . buffer . list . remove_item ( index )
# if index > 0:
except TwythonError :
2015-05-14 10:09:31 -04:00
self . session . sound . play ( "error" )
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" :
users = utils . get_all_users ( tweet , self . session . db )
elif self . type == "people" :
users = [ tweet [ "screen_name" ]]
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 ):
# try:
quoted_tweet = self . session . twitter . twitter . show_status ( id = tweet [ "id" ])
urls = utils . find_urls_in_text ( quoted_tweet [ "text" ])
for url in range ( 0 , len ( urls )):
try : quoted_tweet [ "text" ] = quoted_tweet [ "text" ] . replace ( urls [ url ], quoted_tweet [ "entities" ][ "urls" ][ url ][ "expanded_url" ])
except IndexError : pass
# except TwythonError as e:
# utils.twitter_error(e)
# return
l = tweets . is_long ( quoted_tweet )
id = tweets . get_id ( l )
# try:
original_tweet = self . session . twitter . twitter . show_status ( id = id )
urls = utils . find_urls_in_text ( original_tweet [ "text" ])
for url in range ( 0 , len ( urls )):
try : original_tweet [ "text" ] = original_tweet [ "text" ] . replace ( urls [ url ], original_tweet [ "entities" ][ "urls" ][ url ][ "expanded_url" ])
except IndexError : pass
return compose . compose_quoted_tweet ( quoted_tweet , original_tweet , self . session . db , self . session . settings [ "general" ][ "relative_times" ])
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
2015-12-26 09:02:08 -06:00
def start_stream ( self , mandatory = False ):
2015-04-27 16:08:02 -05:00
self . get_user_ids ()
2015-12-26 09:02:08 -06:00
super ( listBufferController , self ) . start_stream ( mandatory )
2015-04-27 16:08:02 -05:00
def get_user_ids ( self ):
next_cursor = - 1
while ( next_cursor ):
users = self . session . twitter . twitter . get_list_members ( list_id = self . list_id , cursor = next_cursor , include_entities = False , skip_status = True )
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" ]
2015-06-11 16:09:46 -05:00
def remove_buffer ( self ):
dlg = commonMessageDialogs . remove_buffer ()
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 ])
2016-04-02 02:59:59 -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 eventsBufferController ( bufferController ):
def __init__ ( self , parent , name , session , account , * args , ** kwargs ):
super ( eventsBufferController , self ) . __init__ ( parent , * args , ** kwargs )
2015-01-18 17:19:39 -06:00
log . debug ( "Initializing buffer %s , account %s " % ( name , account ,))
2015-01-19 12:15:57 -06:00
self . invisible = True
2014-11-12 20:41:29 -06:00
self . buffer = buffers . eventsPanel ( parent , name )
self . name = name
self . account = account
2015-01-02 09:38:44 -06:00
self . buffer . account = self . account
2014-11-12 20:41:29 -06:00
self . compose_function = compose . compose_event
self . session = session
2015-01-05 05:33:09 -06:00
self . type = self . buffer . type
2015-01-25 02:38:17 -06:00
self . get_formatted_message = self . get_message
2015-01-05 05:33:09 -06:00
def get_message ( self ):
2015-01-19 12:15:57 -06:00
if self . buffer . list . get_count () == 0 : return _ ( u "Empty" )
2015-01-05 05:33:09 -06:00
# fix this:
2015-01-19 12:15:57 -06:00
return " %s . %s " % ( self . buffer . list . list . GetItemText ( self . buffer . list . get_selected ()), self . buffer . list . list . GetItemText ( self . buffer . list . get_selected (), 1 ))
2014-11-12 20:41:29 -06:00
def add_new_item ( self , item ):
2017-01-02 13:19:16 -06:00
tweet = self . compose_function ( item , self . session . db [ "user_name" ], self . session . settings [ "general" ][ "show_screen_names" ])
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 :
2015-02-07 10:23:23 -06:00
output . speak ( " " . join ( tweet ))
2015-04-15 11:09:36 -05:00
if self . buffer . list . get_count () == 1 :
self . buffer . list . select_item ( 0 )
2015-02-07 10:23:23 -06:00
def clear_list ( self ):
dlg = commonMessageDialogs . clear_list ()
if dlg == widgetUtils . YES :
self . buffer . list . clear ()
2014-11-12 20:41:29 -06:00
2015-08-24 09:54:15 -05:00
def show_menu ( self , ev , pos = 0 , * args , ** kwargs ):
if self . buffer . list . get_count () == 0 : return
menu = menus . eventsPanelMenu ()
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 )
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" )
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
2015-02-12 12:59:56 -06:00
def remove_buffer ( self ):
2015-12-09 11:51:37 -06:00
if "-followers" in self . name :
dlg = commonMessageDialogs . remove_buffer ()
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 ])
2016-04-02 02:59:59 -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 :
dlg = commonMessageDialogs . remove_buffer ()
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 ])
2016-04-02 02:59:59 -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 ):
2017-01-02 13:19:16 -06: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" ]))
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 :
if message . image == None :
call_threaded ( self . session . api_call , call_name = "update_status" , _sound = "reply_send.ogg" , status = message . message . get_text ())
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
2015-12-26 09:02:08 -06:00
def start_stream ( self , mandatory = 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
pub . sendMessage ( "buffer-title-changed" , buffer = self )
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 )
2015-02-03 09:59:18 -06:00
except TwythonError as e :
2015-04-10 09:34:24 -05:00
output . speak ( e . message , True )
2015-02-03 09:59:18 -06:00
return
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-04-10 09:34:24 -05:00
# self.put_items_on_list(len(items))
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 :
tweet = self . compose_function ( i , self . session . db , self . session . settings [ "general" ][ "relative_times" ])
self . buffer . list . insert_item ( True , * tweet )
self . buffer . list . select_item ( selected )
else :
for i in items :
tweet = self . compose_function ( i , self . session . db , self . session . settings [ "general" ][ "relative_times" ])
self . buffer . list . insert_item ( True , * tweet )
# self.buffer.list.select_item(selection)
2015-03-24 03:47:16 -06:00
# else:
# self.buffer.list.select_item(selection-elements)
2015-04-10 09:34:24 -05:00
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" ]:
tweet = self . compose_function ( i , self . session . db , self . session . settings [ "general" ][ "relative_times" ])
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 :
for i in self . session . db [ self . name ][ "items" ][ 0 : number_of_items ]:
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 ):
tweet = self . compose_function ( item , self . session . db , self . session . settings [ "general" ][ "relative_times" ])
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 ()
widgetUtils . connect_event ( menu , widgetUtils . MENU , self . direct_message , menuitem = menu . reply )
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 )
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" )
2014-11-12 20:41:29 -06:00
class searchBufferController ( baseBufferController ):
2015-12-26 23:28:46 -06:00
def start_stream ( self , mandatory = 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:
2015-11-03 04:41:01 -06:00
val = self . session . search ( self . name , * 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 )
if num > 0 :
self . session . sound . play ( "search_updated.ogg" )
2015-12-26 09:02:08 -06:00
return num
2014-11-12 20:41:29 -06:00
2015-02-16 16:37:56 -06:00
def remove_buffer ( self ):
dlg = commonMessageDialogs . remove_buffer ()
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 ()
2015-03-12 11:45:53 -06:00
self . timer . cancel ()
2016-04-02 02:59:59 -06:00
self . session . db . pop ( self . name )
2015-02-16 16:37:56 -06:00
return True
elif dlg == widgetUtils . NO :
return False
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
2015-01-18 17:19:39 -06:00
2015-12-26 23:28:46 -06:00
def start_stream ( self , mandatory = 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-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 )
if number_of_items > 0 :
self . session . sound . play ( "search_updated.ogg" )
2015-12-26 09:02:08 -06:00
return number_of_items
2015-02-01 21:13:18 -06:00
2015-03-17 03:50:49 -06:00
def remove_buffer ( self ):
dlg = commonMessageDialogs . remove_buffer ()
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 ()
2015-03-17 03:50:49 -06:00
self . timer . cancel ()
2016-04-02 02:59:59 -06:00
self . session . db . pop ( self . name )
2015-03-17 03:50:49 -06:00
return True
elif dlg == widgetUtils . NO :
return False
2015-02-01 21:13:18 -06:00
class trendsBufferController ( bufferController ):
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
2016-07-23 16:40:40 -05:00
def start_stream ( self , mandatory = 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 ()
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 )
widgetUtils . connect_event ( self . buffer , widgetUtils . BUTTON_PRESSED , self . post_tweet , 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 ]
2015-02-12 12:59:56 -06:00
def remove_buffer ( self ):
dlg = commonMessageDialogs . remove_buffer ()
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 ()
2015-03-12 11:45:53 -06:00
self . timer . cancel ()
2016-04-02 02:59:59 -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" )
tweet = messages . tweet ( self . session , title , caption , self . get_message () + " " , twishort_enabled = self . session . settings [ "mysc" ][ "twishort_enabled" ])
tweet . message . set_cursor_at_end ()
if tweet . message . get_response () == widgetUtils . OK :
self . session . settings [ "mysc" ][ "twishort_enabled" ] = tweet . message . long_tweet . GetValue ()
text = tweet . message . get_text ()
if len ( text ) > 140 and tweet . message . get ( "long_tweet" ) == True :
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 ())
2015-03-18 11:45:39 -06:00
class conversationBufferController ( searchBufferController ):
2016-07-23 16:24:06 -05:00
def start_stream ( self , start = False , mandatory = 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 :
2016-09-28 17:25:03 -05:00
tweet = self . session . twitter . twitter . show_status ( id = tweet [ "in_reply_to_status_id" ], tweet_mode = "extended" )
2016-04-01 08:55:30 -06:00
except TwythonError as err :
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 )
if number_of_items > 0 :
self . session . sound . play ( "search_updated.ogg" )
2015-12-26 09:02:08 -06:00
return number_of_items
2015-11-03 04:41:01 -06:00
def remove_buffer ( self ):
dlg = commonMessageDialogs . remove_buffer ()
if dlg == widgetUtils . YES :
self . timer . cancel ()
return True
2016-01-30 17:14:41 +01:00
elif dlg == widgetUtils . NO :
2015-11-03 04:41:01 -06:00
return False