def tweets( self, limit = 20, network = True ): tweets = reduce( lambda x, y: x + y, self.timelines, [] ) ids = [ x.id for x in tweets ] new_tweets = [] for tl in self.timelines: tl.load_timeline( limit = limit, network = network ) new_tweets += [ x for x in tl if x.id not in ids ] if len( new_tweets ): print '\n'.join( [ tweet_as_text( tweet ) for tweet in new_tweets ] ) tweets += new_tweets tweets.sort( key = lambda x: x.created_at, reverse = True ) if not db.get_param( 'show_retweets' ): tweets = [ tweet for tweet in tweets if not hasattr( tweet, 'retweeted_status' ) ] tweet_count = db.get_param( 'tweet_count' ) if tweet_count > 0 and len( tweets ) > tweet_count: tweets = tweets[:( tweet_count - 1 )] tweet_age = db.get_param( 'tweet_age' ) if tweet_age > 0: tweet_age *= 3600 tweets = [ tweet for tweet in tweets if ( ( time.mktime( time.gmtime() ) - time.mktime( tweet.created_at.timetuple() ) ) < tweet_age ) ] if NOTIFICATION and db.get_param( 'new_tweet_notify', True ): for tweet in sorted( new_tweets, key = lambda x: x.created_at, reverse = False ): url, filename = tweet_image_filename( tweet ) uri = None if os.path.exists( filename ): uri = 'file://%s' % filename n = pynotify.Notification( tweet.author.screen_name, tweet.text, uri ) n.show() return tweets
def setup_text(self,): self.list.set_wrap_mode(w.WRAP_WORD) if db.get_param("show_icon"): self.list.set_left_margin(55) else: self.list.set_left_margin(0) self.list.set_editable(False)
def setup_text(self, ): self.list.set_wrap_mode(w.WRAP_WORD) if db.get_param('show_icon'): self.list.set_left_margin(55) else: self.list.set_left_margin(0) self.list.set_editable(False)
def __init__(self, key, label=None, use_underline=True): super(PCheckButton, self).__init__(label, use_underline) self.db_key = key self.set_active(db.get_param(self.db_key, False)) self.connect('toggled', self.toggle_event)
def __init__( self, key, label = None, use_underline = True ): super( PCheckButton, self ).__init__( label, use_underline ) self.db_key = key self.set_active( db.get_param( self.db_key, False ) ) self.connect( 'toggled', self.toggle_event )
def tweets(self, limit=20, network=True): tweets = reduce(lambda x, y: x + y, self.timelines, []) ids = [x.id for x in tweets] new_tweets = [] for tl in self.timelines: tl.load_timeline(limit=limit, network=network) new_tweets += [x for x in tl if x.id not in ids] if len(new_tweets): print '\n'.join([tweet_as_text(tweet) for tweet in new_tweets]) tweets += new_tweets tweets.sort(key=lambda x: x.created_at, reverse=True) if not db.get_param('show_retweets'): tweets = [ tweet for tweet in tweets if not hasattr(tweet, 'retweeted_status') ] tweet_count = db.get_param('tweet_count') if tweet_count > 0 and len(tweets) > tweet_count: tweets = tweets[:(tweet_count - 1)] tweet_age = db.get_param('tweet_age') if tweet_age > 0: tweet_age *= 3600 tweets = [ tweet for tweet in tweets if ((time.mktime(time.gmtime()) - time.mktime(tweet.created_at.timetuple())) < tweet_age) ] if NOTIFICATION and db.get_param('new_tweet_notify', True): for tweet in sorted(new_tweets, key=lambda x: x.created_at, reverse=False): url, filename = tweet_image_filename(tweet) uri = None if os.path.exists(filename): uri = 'file://%s' % filename n = pynotify.Notification(tweet.author.screen_name, tweet.text, uri) n.show() return tweets
def tweet_as_dict(tweet): ending_hashtag_re = re.compile(r'\s+(?P<hashtags>(#\w+\s*)+)\s*$') response_re = re.compile(r'^\s*(?P<username>@\w+)\b') retweet_re = re.compile( r'^\s*(?:RT|via)[:]?\s+' + r'@(?P<username>\w+)\b( *[:-]+ *)?', re.IGNORECASE) ret = { 'id': tweet.id, 'text': tweet.text, 'author': '@' + tweet.author.screen_name, 'full_name': tweet.author.name, 'double_name': '%s (@%s)' % (tweet.author.name, tweet.author.screen_name), 'username': tweet.author.screen_name, 'ago': ago(time.mktime(tweet.created_at.timetuple())), 'client': tweet.source, 'client_url': tweet.source_url, } chosen_name = 'author' if db.get_param('show_name', True): chosen_name = 'double_name' originally_from = None response_to = None currently_from = None match = retweet_re.search(tweet.text) if hasattr(tweet, 'retweeted_status') and tweet.retweeted_status: originally_from = tweet.retweeted_status.author.screen_name currently_from = chosen_name text = tweet.retweeted_status.text elif match: originally_from = match.group('username') currently_from = chosen_name text = tweet.text[match.end():] else: match = response_re.search(tweet.text) if match: response_to = match.group('username') currently_from = chosen_name text = tweet.text[match.end():] else: currently_from = chosen_name text = tweet.text hashtags = None match = ending_hashtag_re.search(text) if match: text = text[:match.start()] hashtags = match.group('hashtags') ret['text'] = text ret['from'] = ret[currently_from] ret['originally from'] = originally_from ret['response to'] = response_to return ret
def __init__(self, key, type=WINDOW_TOPLEVEL): super(PWindow, self).__init__(type) self.db_key = key width, height = self.get_size() x, y = self.get_position() width = db.get_param(self.db_key + ':width', width) height = db.get_param(self.db_key + ':height', height) x = db.get_param(self.db_key + ':xpos', x) y = db.get_param(self.db_key + ':ypos', y) self.set_default_size(width, height) self.move(x, y) self.connect('delete-event', self.destroy_event) self.connect('destroy-event', self.destroy_event)
def __init__( self, key, type = WINDOW_TOPLEVEL ): super( PWindow, self ).__init__( type ) self.db_key = key width, height = self.get_size() x, y = self.get_position() width = db.get_param( self.db_key + ':width', width ) height = db.get_param( self.db_key + ':height', height ) x = db.get_param( self.db_key + ':xpos', x ) y = db.get_param( self.db_key + ':ypos', y ) self.set_default_size( width, height ) self.move( x, y ) self.connect( 'delete-event', self.destroy_event ) self.connect( 'destroy-event', self.destroy_event )
def tweet_as_dict( tweet ): ending_hashtag_re = re.compile( r'\s+(?P<hashtags>(#\w+\s*)+)\s*$' ) response_re = re.compile( r'^\s*(?P<username>@\w+)\b' ) retweet_re = re.compile( r'^\s*(?:RT|via)[:]?\s+' + r'@(?P<username>\w+)\b( *[:-]+ *)?', re.IGNORECASE ) ret = { 'id' : tweet.id, 'text' : tweet.text, 'author' : '@' + tweet.author.screen_name, 'full_name' : tweet.author.name, 'double_name' : '%s (@%s)' % ( tweet.author.name, tweet.author.screen_name ), 'username' : tweet.author.screen_name, 'ago' : ago( time.mktime( tweet.created_at.timetuple() ) ), 'client' : tweet.source, 'client_url' : tweet.source_url, } chosen_name = 'author' if db.get_param( 'show_name', True ): chosen_name = 'double_name' originally_from = None response_to = None currently_from = None match = retweet_re.search( tweet.text ) if hasattr( tweet, 'retweeted_status' ) and tweet.retweeted_status: originally_from = tweet.retweeted_status.author.screen_name currently_from = chosen_name text = tweet.retweeted_status.text elif match: originally_from = match.group( 'username' ) currently_from = chosen_name text = tweet.text[ match.end(): ] else: match = response_re.search( tweet.text ) if match: response_to = match.group( 'username') currently_from = chosen_name text = tweet.text[ match.end(): ] else: currently_from = chosen_name text = tweet.text hashtags = None match = ending_hashtag_re.search( text ) if match: text = text[:match.start()] hashtags = match.group( 'hashtags' ) ret[ 'text' ] = text ret[ 'from' ] = ret[ currently_from ] ret[ 'originally from' ] = originally_from ret[ 'response to' ] = response_to return ret
def update(self, new_buffer, images): self.buffer = new_buffer if self.buffer.parent: for child in self.buffer.parent.get_children(): self.buffer.parent.remove(child) self.notify_listeners('timeline buffer updated') if db.get_param('show_icon'): gobject.idle_add(self.buffer.insert_images, images)
def update( self, new_buffer, images ): self.buffer = new_buffer if self.buffer.parent: for child in self.buffer.parent.get_children(): self.buffer.parent.remove( child ) self.notify_listeners( 'timeline buffer updated' ) if db.get_param( 'show_icon' ): gobject.idle_add( self.buffer.insert_images, images )
def restore_value( self ): model = self.get_model() row = model.get_iter_first() while row: value = model.get_value( row, self.data_column ) if value == db.get_param( self.db_key ): break row = model.iter_next( row ) if not row: return self.set_active_iter( row )
def restore_value(self): model = self.get_model() row = model.get_iter_first() while row: value = model.get_value(row, self.data_column) if value == db.get_param(self.db_key): break row = model.iter_next(row) if not row: return self.set_active_iter(row)
def run(self): limit = self.limit if self.first_run: limit = None for (timelines, account) in [(v['timelines'], v['account']) for v in self.main_window.tab_items.values()]: gobject.idle_add(self.start_spinner, account) timelines.refresh(limit=limit, network=self.network) gobject.idle_add(self.stop_spinner, account) self.first_run = False delay = db.get_param('delay', 15) if self.loop and delay > 0: delay *= 60.0 time.sleep(delay) self.run()
def run( self ): limit = self.limit if self.first_run: limit = None for ( timelines, account ) in [ ( v[ 'timelines' ], v[ 'account' ] ) for v in self.main_window.tab_items.values() ]: gobject.idle_add( self.start_spinner, account ) timelines.refresh( limit = limit, network = self.network ) gobject.idle_add( self.stop_spinner, account ) self.first_run = False delay = db.get_param( 'delay', 15 ) if self.loop and delay > 0: delay *= 60.0 time.sleep( delay ) self.run()
def tweet_as_tag_list(tweet): td = tweet_as_dict(tweet) replace_re = re.compile(r'#!#(?P<key>.*)#!#') hashtag_re = re.compile(r'#(?P<hashtag>\S+)\b') ref_re = re.compile(r'@(?P<username>\w+)\b') url_re = re.compile( unicode( r'(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))', 'utf-8')) header = [] # header = [ ('From ', 'start') ] if td['originally from']: header += [(res.get_pixbuf('retweet'), ['pixbuf']), ('#!#originally from#!#', 'username'), (' via ', None), ('#!#from#!#', 'username')] elif td['response to']: header += [('#!#from#!#', 'username'), (' in response to ', None), ('#!#response to#!#', 'username')] else: header += [('#!#from#!#', 'username')] header.append((': ', None)) ret = [] for text, tag in header: if type(tag) not in (list, ): tag = [tag] tag.append('header') ret.append((text, tag)) tmp = [(td['text'], None)] def tag_blob(regex, use_tag): tmp2 = [] for text, tag in tmp: match = regex.search(text) while match: tmp2.append((text[:match.start()], tag)) tmp2.append((match.group(0), use_tag)) text = text[match.end():] match = regex.search(text) tmp2.append((text, tag)) return tmp2 tmp = tag_blob(url_re, 'url') tmp = tag_blob(ref_re, 'username') tmp = tag_blob(hashtag_re, 'hashtag') tmp2 = [] for text, tag in tmp: tmp2.append((text, [tag, 'tweet'])) ret += tmp2 if db.get_param('show_client'): ret += [ ('\nPosted ', 'time'), ('#!#ago#!#', 'time'), (' via ', 'client'), ('#!#client#!#', 'client'), ('.', 'client'), ] else: ret += [('\n', None), ('Posted ', 'time'), ('#!#ago#!#', 'time'), ('.', 'time')] for index in xrange(len(ret)): text, tag = ret[index] if type(text) not in ( str, unicode, ): continue match = replace_re.match(text) if match: text = td[match.group('key')] if type(tag) != list: tag = [tag] tag.append(custom_tag('from', td['username'].lower())) tag.append(custom_tag('id', str(td['id']))) tag.append('full_tweet') ret[index] = (text, tag) return tweet, ret
def restore_tab(self): self.set_current_page( db.get_param(self.db_key + ':current_tab', self.get_current_page())) self.restored = True
def restore_tab( self ): self.set_current_page( db.get_param( self.db_key + ':current_tab', self.get_current_page() ) ) self.restored = True
def tweet_as_tag_list( tweet ): td = tweet_as_dict( tweet ) replace_re = re.compile( r'#!#(?P<key>.*)#!#' ) hashtag_re = re.compile( r'#(?P<hashtag>\S+)\b' ) ref_re = re.compile( r'@(?P<username>\w+)\b' ) url_re = re.compile( unicode( r'(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))', 'utf-8' ) ) header = [] # header = [ ('From ', 'start') ] if td[ 'originally from' ]: header += [ (res.get_pixbuf( 'retweet' ), ['pixbuf']), ('#!#originally from#!#', 'username'), (' via ', None), ('#!#from#!#', 'username') ] elif td[ 'response to' ]: header += [ ('#!#from#!#', 'username'), (' in response to ', None), ('#!#response to#!#', 'username') ] else: header += [ ('#!#from#!#', 'username') ] header.append( (': ', None) ) ret = [] for text, tag in header: if type( tag ) not in (list,): tag = [ tag ] tag.append( 'header' ) ret.append( (text, tag) ) tmp = [(td[ 'text' ], None)] def tag_blob( regex, use_tag ): tmp2 = [] for text, tag in tmp: match = regex.search( text ) while match: tmp2.append( (text[ :match.start() ], tag) ) tmp2.append( (match.group( 0 ), use_tag) ) text = text[ match.end(): ] match = regex.search( text ) tmp2.append( (text, tag) ) return tmp2 tmp = tag_blob( url_re, 'url' ) tmp = tag_blob( ref_re, 'username' ) tmp = tag_blob( hashtag_re, 'hashtag' ) tmp2 = [] for text, tag in tmp: tmp2.append( (text, [tag, 'tweet']) ) ret += tmp2 if db.get_param( 'show_client' ): ret += [ ('\nPosted ', 'time'), ('#!#ago#!#', 'time'), (' via ', 'client' ), ('#!#client#!#', 'client'), ('.', 'client'), ] else: ret += [ ('\n', None), ('Posted ', 'time'), ('#!#ago#!#', 'time'), ('.', 'time') ] for index in xrange( len( ret ) ): text, tag = ret[ index ] if type( text ) not in (str, unicode,): continue match = replace_re.match( text ) if match: text = td[ match.group( 'key' ) ] if type( tag ) != list: tag = [ tag ] tag.append( custom_tag( 'from', td[ 'username' ].lower() ) ) tag.append( custom_tag( 'id', str( td[ 'id' ] ) ) ) tag.append( 'full_tweet' ) ret[ index ] = (text, tag) return tweet, ret