コード例 #1
0
    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
コード例 #2
0
ファイル: flutterby.py プロジェクト: kearsley/flutterby
 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)
コード例 #3
0
ファイル: flutterby.py プロジェクト: kearsley/flutterby
 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)
コード例 #4
0
    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)
コード例 #5
0
    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 )
コード例 #6
0
    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
コード例 #7
0
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
コード例 #8
0
    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)
コード例 #9
0
    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 )
コード例 #10
0
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
コード例 #11
0
    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)
コード例 #12
0
    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 )
コード例 #13
0
    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 )
コード例 #14
0
    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)
コード例 #15
0
    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()
コード例 #16
0
    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()
コード例 #17
0
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
コード例 #18
0
 def restore_tab(self):
     self.set_current_page(
         db.get_param(self.db_key + ':current_tab',
                      self.get_current_page()))
     self.restored = True
コード例 #19
0
 def restore_tab( self ):
     self.set_current_page( db.get_param( self.db_key + ':current_tab',
                                          self.get_current_page() ) )
     self.restored = True
コード例 #20
0
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