X-Git-Url: https://vcs.fsf.org/?p=rainbowstream.git;a=blobdiff_plain;f=rainbowstream%2Frainbow.py;h=28717b65a985489fd11bfc0e8af2aceaae4a6849;hp=2e8b1ca877fdf809508927f5104c651143ab6ec8;hb=2050bc12ebd6aa3dda869225c1d88289ab66b212;hpb=baec5f507d4eeb9ef367538a0e3a1b309bb25768 diff --git a/rainbowstream/rainbow.py b/rainbowstream/rainbow.py index 2e8b1ca..28717b6 100644 --- a/rainbowstream/rainbow.py +++ b/rainbowstream/rainbow.py @@ -157,6 +157,8 @@ def init(args): files = os.listdir(os.path.dirname(__file__) + '/colorset') themes = [f.split('.')[0] for f in files if f.split('.')[-1] == 'json'] g['themes'] = themes + # Startup cmd + g['previous_cmd'] = '' # Semaphore init c['lock'] = False c['pause'] = False @@ -165,6 +167,26 @@ def init(args): c['message_dict'] = [] # Image on term c['IMAGE_ON_TERM'] = args.image_on_term + # Dictionary of muted users key:screen name, value:name + g['mute_dict'] = {} + build_mute_dict(t) + +def build_mute_dict(t): + next_cursor = -1 + rel = {} + + while next_cursor != 0: + list = t.mutes.users.list( + screen_name=g['original_name'], + cursor=next_cursor, + skip_status=True, + include_entities=False, + ) + for u in list['users']: + rel[u['screen_name'].encode('ascii', 'ignore')] = u['name'].encode('ascii', 'ignore') + next_cursor = list['next_cursor'] + if(rel != g['mute_dict']): + g['mute_dict'] = rel def switch(): @@ -712,6 +734,7 @@ def mute(): rel = t.mutes.users.create(screen_name=screen_name[1:]) if isinstance(rel, dict): printNicely(green(screen_name + ' is muted.')) + build_mute_dict(t) else: printNicely(red(rel)) else: @@ -732,6 +755,7 @@ def unmute(): rel = t.mutes.users.destroy(screen_name=screen_name[1:]) if isinstance(rel, dict): printNicely(green(screen_name + ' is unmuted.')) + build_mute_dict(t) else: printNicely(red(rel)) else: @@ -742,26 +766,12 @@ def muting(): """ List muting user """ - t = Twitter(auth=authen()) - # Init cursor - next_cursor = -1 - rel = {} - # Cursor loop - while next_cursor != 0: - list = t.mutes.users.list( - screen_name=g['original_name'], - cursor=next_cursor, - skip_status=True, - include_entities=False, - ) - for u in list['users']: - rel[u['name']] = '@' + u['screen_name'] - next_cursor = list['next_cursor'] - # Print out result + rel = g['mute_dict'] + printNicely('All: ' + str(len(rel)) + ' people.') for name in rel: - user = ' ' + cycle_color(name) - user += color_func(c['TWEET']['nick'])(' ' + rel[name] + ' ') + user = color_func(c['TWEET']['nick'])(' ' + rel[name] + ' ') + user += cycle_color('@'+ name) printNicely(user) @@ -1443,7 +1453,7 @@ def help(): d.get( g['stuff'].strip(), lambda: printNicely(red('No such command.')) - )() + )() else: printNicely(usage) @@ -1622,6 +1632,8 @@ def listen(): line = raw_input(g['decorated_name'](c['PREFIX'])) else: line = raw_input() + # Save previous cmd in order to compare with readline buffer + g['previous_cmd'] = line.strip() try: cmd = line.split()[0] except: @@ -1659,8 +1671,8 @@ def stream(domain, args, name='Rainbow Stream'): ascii_art(art_dict[domain]) # These arguments are optional: stream_args = dict( - timeout=args.timeout, - block=False, + timeout=0.5, # To check g['stream_stop'] after each 0.5 s + block=not args.no_block, heartbeat_timeout=args.heartbeat_timeout) # Track keyword query_args = dict() @@ -1685,18 +1697,17 @@ def stream(domain, args, name='Rainbow Stream'): StreamLock.acquire() g['stream_stop'] = False for tweet in tweet_iter: - if(g['stream_stop']): - StreamLock.release() - break if tweet is None: - pass + printNicely("-- None --") elif tweet is Timeout: - printNicely("-- Timeout --") + if(g['stream_stop']): + StreamLock.release() + break elif tweet is HeartbeatTimeout: printNicely("-- Heartbeat Timeout --") elif tweet is Hangup: printNicely("-- Hangup --") - elif tweet.get('text'): + elif tweet.get('text') and (tweet['user']['screen_name'] not in g['mute_dict']): draw( t=tweet, keyword=args.track_keywords, @@ -1704,6 +1715,19 @@ def stream(domain, args, name='Rainbow Stream'): fil=args.filter, ig=args.ignore, ) + # Current readline buffer + current_buffer = readline.get_line_buffer().strip() + # There is an unexpected behaviour in MacOSX readline + Python 2: + # after completely delete a word after typing it, + # somehow readline buffer still contains + # the 1st character of that word + if current_buffer and g['previous_cmd'] != current_buffer: + sys.stdout.write( + g['decorated_name'](c['PREFIX']) + current_buffer) + sys.stdout.flush() + elif not c['HIDE_PROMPT']: + sys.stdout.write(g['decorated_name'](c['PREFIX'])) + sys.stdout.flush() elif tweet.get('direct_message'): print_message(tweet['direct_message'], check_semaphore=True) except TwitterHTTPError: @@ -1720,13 +1744,14 @@ def fly(): args = parse_arguments() try: init(args) - except TwitterHTTPError: + except TwitterHTTPError as error: printNicely('') printNicely( magenta("We have maximum connection problem with twitter'stream API right now :(")) printNicely(magenta("Let's try again later.")) save_history() - sys.exit() + print(error) + sys.exit() # Spawn stream thread th = threading.Thread( target=stream,