X-Git-Url: https://vcs.fsf.org/?p=rainbowstream.git;a=blobdiff_plain;f=rainbowstream%2Frainbow.py;h=5e240148f71e49d74f0980cde02548b07bea7de3;hp=390111188f8a77fd5be7e420e3cb45ac5a2391ed;hb=7d1fa1122f3969c2c68199562a2c50748ecc9294;hpb=1551a7d3037c1470530822380cc0159dd694816c diff --git a/rainbowstream/rainbow.py b/rainbowstream/rainbow.py index 3901111..5e24014 100644 --- a/rainbowstream/rainbow.py +++ b/rainbowstream/rainbow.py @@ -1,7 +1,6 @@ """ Colorful user's timeline stream """ -from __future__ import print_function from multiprocessing import Process from dateutil import parser @@ -43,10 +42,11 @@ cmdset = [ ] -def draw(t, keyword=None): +def draw(t, keyword=None, fil=[], ig=[]): """ Draw the rainbow """ + # Retrieve tweet tid = t['id'] text = t['text'] @@ -57,6 +57,13 @@ def draw(t, keyword=None): date = date - datetime.timedelta(seconds=time.timezone) clock = date.strftime('%Y/%m/%d %H:%M:%S') + # Filter and ignore + screen_name = '@' + screen_name + if fil and screen_name not in fil: + return + if ig and screen_name in ig: + return + res = db.tweet_query(tid) if not res: db.store(tid) @@ -64,7 +71,7 @@ def draw(t, keyword=None): rid = res[0].rainbow_id # Format info - user = cycle_color(name) + grey(' ' + '@' + screen_name + ' ') + user = cycle_color(name) + grey(' ' + screen_name + ' ') meta = grey('[' + clock + '] [id=' + str(rid) + ']') tweet = text.split() # Highlight RT @@ -123,6 +130,14 @@ def parse_arguments(): '-tt', '--track-keywords', help='Search the stream for specific text.') + parser.add_argument( + '-fil', + '--filter', + help='Filter specific screen_name.') + parser.add_argument( + '-ig', + '--ignore', + help='Ignore specific screen_name.') return parser.parse_args() @@ -166,6 +181,21 @@ def switch(): try: target = g['stuff'].split()[0] + # Filter and ignore + args = parse_arguments() + try : + if g['stuff'].split()[-1] == '-f': + only = raw_input('Only nicks: ') + ignore = raw_input('Ignore nicks: ') + args.filter = filter(None,only.split(',')) + args.ignore = filter(None,ignore.split(',')) + elif g['stuff'].split()[-1] == '-d': + args.filter = ONLY_LIST + args.ignore = IGNORE_LIST + except: + printNicely(red('Sorry, wrong format.')) + return + # Public stream if target == 'public': keyword = g['stuff'].split()[1] @@ -173,13 +203,12 @@ def switch(): keyword = keyword[1:] # Kill old process os.kill(g['stream_pid'], signal.SIGKILL) - args = parse_arguments() args.track_keywords = keyword # Start new process p = Process( - target=stream, + target=stream, args=( - PUBLIC_DOMAIN, + PUBLIC_DOMAIN, args)) p.start() g['stream_pid'] = p.pid @@ -188,7 +217,6 @@ def switch(): elif target == 'mine': # Kill old process os.kill(g['stream_pid'], signal.SIGKILL) - args = parse_arguments() # Start new process p = Process( target=stream, @@ -198,10 +226,15 @@ def switch(): g['original_name'])) p.start() g['stream_pid'] = p.pid + printNicely('') printNicely(green('Stream switched.')) + if args.filter: + printNicely(cyan('Only: ' + str(args.filter))) + if args.ignore: + printNicely(red('Ignore: ' + str(args.ignore))) + printNicely('') except: printNicely(red('Sorry I can\'t understand.')) - g['prefix'] = False def home(): @@ -241,7 +274,6 @@ def tweet(): """ t = Twitter(auth=authen()) t.statuses.update(status=g['stuff']) - g['prefix'] = False def retweet(): @@ -255,7 +287,6 @@ def retweet(): t.statuses.retweet(id=tid, include_entities=False, trim_user=True) except: printNicely(red('Sorry I can\'t retweet for you.')) - g['prefix'] = False def reply(): @@ -272,7 +303,6 @@ def reply(): t.statuses.update(status=status, in_reply_to_status_id=tid) except: printNicely(red('Sorry I can\'t understand.')) - g['prefix'] = False def delete(): @@ -317,10 +347,10 @@ def friend(): t = Twitter(auth=authen()) g['friends'] = t.friends.ids()['ids'] for i in g['friends']: - screen_name = t.users.lookup(user_id=i)[0]['screen_name'] - user = cycle_color('@' + screen_name) - print(user, end=' ') - printNicely('') + name = t.users.lookup(user_id=i)[0]['name'] + screen_name = '@' + t.users.lookup(user_id=i)[0]['screen_name'] + user = cycle_color(name) + grey(' ' + screen_name + ' ') + print user def follower(): @@ -330,10 +360,10 @@ def follower(): t = Twitter(auth=authen()) g['followers'] = t.followers.ids()['ids'] for i in g['followers']: - screen_name = t.users.lookup(user_id=i)[0]['screen_name'] - user = cycle_color('@' + screen_name) - print(user, end=' ') - printNicely('') + name = t.users.lookup(user_id=i)[0]['name'] + screen_name = '@' + t.users.lookup(user_id=i)[0]['screen_name'] + user = cycle_color(name) + grey(' ' + screen_name + ' ') + print user def help(): @@ -346,6 +376,11 @@ def help(): You are already on your personal stream: "switch public #AKB" will switch to public stream and follow "AKB" keyword. "switch mine" will switch back to your personal stream. + "switch mine -f" will prompt to enter the filter. + "Only nicks" filter will decide nicks will be INCLUDE ONLY. + "Ignore nicks" filter will decide nicks will be EXCLUDE. + "switch mine -d" will use the config's ONLY_LIST and IGNORE_LIST + (see rainbowstream/config.py). For more action: "home" will show your timeline. "home 7" will show 7 tweet. "view @bob" will show your friend @bob's home. @@ -370,7 +405,6 @@ def clear(): Clear screen """ os.system('clear') - g['prefix'] = False def quit(): @@ -388,7 +422,6 @@ def reset(): """ if g['reset']: printNicely(green('Need tips ? Type "h" and hit Enter key!')) - g['prefix'] = True g['reset'] = False @@ -420,10 +453,28 @@ def listen(): """ Listen to user's input """ - init_interactive_shell(cmdset) - first = True + d = dict(zip( + cmdset, + [ + ['public #','mine'], # switch + [], # home + ['@'], # view + [], # tweet + [], # retweet + [], # reply + [], # delete + ['#'], # search + [], # friend + [], # follower + [], # help + [], # clear + [], # quit + ] + )) + init_interactive_shell(d) + reset() while True: - if g['prefix'] and not first: + if g['prefix']: line = raw_input(g['decorated_name']) else: line = raw_input() @@ -434,13 +485,17 @@ def listen(): # Save cmd to global variable and call process g['stuff'] = ' '.join(line.split()[1:]) process(cmd)() - first = False + if cmd in ['switch','t','rt','rep']: + g['prefix'] = False + else: + g['prefix'] = True def stream(domain, args, name='Rainbow Stream'): """ Track the stream """ + # The Logo art_dict = { USER_DOMAIN: name, @@ -448,6 +503,7 @@ def stream(domain, args, name='Rainbow Stream'): SITE_DOMAIN: 'Site Stream', } ascii_art(art_dict[domain]) + # These arguments are optional: stream_args = dict( timeout=args.timeout, @@ -486,7 +542,7 @@ def stream(domain, args, name='Rainbow Stream'): elif tweet is Hangup: printNicely("-- Hangup --") elif tweet.get('text'): - draw(t=tweet, keyword=args.track_keywords) + draw(t=tweet, keyword=args.track_keywords, fil=args.filter, ig=args.ignore) def fly(): @@ -500,14 +556,9 @@ def fly(): p.start() # Start listen process - g['prefix'] = True + time.sleep(0.5) g['reset'] = True + g['prefix'] = True g['stream_pid'] = p.pid listen() - -def multiplexer(): - """ - Multiplexer - """ - os.system('screen -S rainbow fly')