X-Git-Url: https://vcs.fsf.org/?p=rainbowstream.git;a=blobdiff_plain;f=rainbowstream%2Frainbow.py;h=9e94fb8be49c3df5dfdcd941f4118ebecf1ff6db;hp=d51ca91b1d30bc5cde4c755c2028384639238712;hb=4824b181ebf9aa8de4e93c8ce0563cc69f6e2e6d;hpb=31c665de26db30ae9e1b21e086957c520cf619ef diff --git a/rainbowstream/rainbow.py b/rainbowstream/rainbow.py index d51ca91..9e94fb8 100644 --- a/rainbowstream/rainbow.py +++ b/rainbowstream/rainbow.py @@ -1,8 +1,6 @@ """ Colorful user's timeline stream """ -from multiprocessing import Process - import os import os.path import sys @@ -24,18 +22,13 @@ from .colors import * from .config import * from .consumer import * from .interactive import * -from .db import * from .c_image import * from .py3patch import * # Global values g = {} -# Database -db = RainbowDB() - # Lock for streams - StreamLock = threading.Lock() # Commands @@ -164,9 +157,15 @@ 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 - db.theme_store(c['THEME']) + # Startup cmd + g['OSX_readline_bug'] = False + g['previous_cmd'] = '' # Semaphore init - db.semaphore_store(False, False) + c['lock'] = False + c['pause'] = False + # Init tweet dict and message dict + c['tweet_dict'] = [] + c['message_dict'] = [] # Image on term c['IMAGE_ON_TERM'] = args.image_on_term @@ -202,7 +201,11 @@ def switch(): g['stream_stop'] = True args.track_keywords = keyword # Start new thread - th = threading.Thread(target=stream, args=(c['PUBLIC_DOMAIN'], args)) + th = threading.Thread( + target=stream, + args=( + c['PUBLIC_DOMAIN'], + args)) th.daemon = True th.start() # Personal stream @@ -210,7 +213,12 @@ def switch(): # Kill old thread g['stream_stop'] = True # Start new thread - th = threading.Thread(target=stream, args=(c['USER_DOMAIN'], args, g['original_name'])) + th = threading.Thread( + target=stream, + args=( + c['USER_DOMAIN'], + args, + g['original_name'])) th.daemon = True th.start() printNicely('') @@ -219,7 +227,7 @@ def switch(): if args.ignore: printNicely(red('Ignore: ' + str(args.ignore))) printNicely('') - except Exception: + except: printNicely(red('Sorry I can\'t understand.')) @@ -321,7 +329,7 @@ def retweet(): except: printNicely(red('Sorry I can\'t understand.')) return - tid = db.rainbow_to_tweet_query(id)[0].tweet_id + tid = c['tweet_dict'][id] t.statuses.retweet(id=tid, include_entities=False, trim_user=True) @@ -335,7 +343,7 @@ def quote(): except: printNicely(red('Sorry I can\'t understand.')) return - tid = db.rainbow_to_tweet_query(id)[0].tweet_id + tid = c['tweet_dict'][id] tweet = t.statuses.show(id=tid) screen_name = tweet['user']['screen_name'] text = tweet['text'] @@ -363,7 +371,7 @@ def allretweet(): except: printNicely(red('Sorry I can\'t understand.')) return - tid = db.rainbow_to_tweet_query(id)[0].tweet_id + tid = c['tweet_dict'][id] # Get display num if exist try: num = int(g['stuff'].split()[1]) @@ -389,7 +397,7 @@ def favorite(): except: printNicely(red('Sorry I can\'t understand.')) return - tid = db.rainbow_to_tweet_query(id)[0].tweet_id + tid = c['tweet_dict'][id] t.favorites.create(_id=tid, include_entities=False) printNicely(green('Favorited.')) draw(t.statuses.show(id=tid)) @@ -406,7 +414,7 @@ def reply(): except: printNicely(red('Sorry I can\'t understand.')) return - tid = db.rainbow_to_tweet_query(id)[0].tweet_id + tid = c['tweet_dict'][id] user = t.statuses.show(id=tid)['user']['screen_name'] status = ' '.join(g['stuff'].split()[1:]) status = '@' + user + ' ' + status.decode('utf-8') @@ -419,11 +427,11 @@ def delete(): """ t = Twitter(auth=authen()) try: - rid = int(g['stuff'].split()[0]) + id = int(g['stuff'].split()[0]) except: printNicely(red('Sorry I can\'t understand.')) return - tid = db.rainbow_to_tweet_query(rid)[0].tweet_id + tid = c['tweet_dict'][id] t.statuses.destroy(id=tid) printNicely(green('Okay it\'s gone.')) @@ -438,7 +446,7 @@ def unfavorite(): except: printNicely(red('Sorry I can\'t understand.')) return - tid = db.rainbow_to_tweet_query(id)[0].tweet_id + tid = c['tweet_dict'][id] t.favorites.destroy(_id=tid) printNicely(green('Okay it\'s unfavorited.')) draw(t.statuses.show(id=tid)) @@ -492,7 +500,7 @@ def show(): if target != 'image': return id = int(g['stuff'].split()[1]) - tid = db.rainbow_to_tweet_query(id)[0].tweet_id + tid = c['tweet_dict'][id] tweet = t.statuses.show(id=tid) media = tweet['entities']['media'] for m in media: @@ -511,7 +519,7 @@ def urlopen(): try: if not g['stuff'].isdigit(): return - tid = db.rainbow_to_tweet_query(g['stuff'])[0].tweet_id + tid = c['tweet_dict'][int(g['stuff'])] tweet = t.statuses.show(id=tid) link_ary = [ u for u in tweet['text'].split() if u.startswith('http://')] @@ -639,10 +647,10 @@ def trash(): """ t = Twitter(auth=authen()) try: - rid = int(g['stuff'].split()[0]) + id = int(g['stuff'].split()[0]) except: printNicely(red('Sorry I can\'t understand.')) - mid = db.rainbow_to_message_query(rid)[0].message_id + mid = c['message_dict'][id] t.direct_messages.destroy(id=mid) printNicely(green('Message deleted.')) @@ -1140,7 +1148,7 @@ def config(): set_config(key, value) # Apply theme immediately if key == 'THEME': - reload_theme(value) + c['THEME'] = reload_theme(value, c['THEME']) g['decorated_name'] = lambda x: color_func( c['DECORATED_NAME'])( '[' + x + ']: ') @@ -1170,7 +1178,7 @@ def theme(): # Change theme try: # Load new theme - reload_theme(g['stuff']) + c['THEME'] = reload_theme(g['stuff'], c['THEME']) # Redefine decorated_name g['decorated_name'] = lambda x: color_func( c['DECORATED_NAME'])( @@ -1435,7 +1443,10 @@ def help(): 'stream': help_stream, } if g['stuff']: - d[g['stuff'].strip()]() + d.get( + g['stuff'].strip(), + lambda: printNicely(red('No such command.')) + )() else: printNicely(usage) @@ -1444,7 +1455,7 @@ def pause(): """ Pause stream display """ - db.semaphore_update_pause(True) + c['pause'] = True printNicely(green('Stream is paused')) @@ -1452,7 +1463,7 @@ def replay(): """ Replay stream """ - db.semaphore_update_pause(False) + c['pause'] = False printNicely(green('Stream is running back now')) @@ -1469,7 +1480,6 @@ def quit(): """ try: save_history() - os.system('rm -rf rainbow.db') printNicely(green('See you next time :)')) except: pass @@ -1610,30 +1620,36 @@ def listen(): read_history() reset() while True: + # raw_input if g['prefix']: line = raw_input(g['decorated_name'](c['PREFIX'])) else: - print('prefix is false') line = raw_input() + # Save previous cmd in order to compare with readline buffer + g['previous_cmd'] = line.strip() try: cmd = line.split()[0] except: cmd = '' + # MacOSX readline bug (see "stream" function) + if g['OSX_readline_bug']: + cmd = cmd[1:] + g['OSX_readline_bug'] = False g['cmd'] = cmd try: # Lock the semaphore - db.semaphore_update_lock(True) + c['lock'] = True # Save cmd to global variable and call process g['stuff'] = ' '.join(line.split()[1:]) # Process the command process(cmd)() # Not re-display - if cmd in ['t', 'rt', 'rep']: + if cmd in ['switch', 't', 'rt', 'rep']: g['prefix'] = False else: g['prefix'] = True # Release the semaphore lock - db.semaphore_update_lock(False) + c['lock'] = False except Exception: printNicely(red('OMG something is wrong with Twitter right now.')) @@ -1678,7 +1694,7 @@ def stream(domain, args, name='Rainbow Stream'): StreamLock.acquire() g['stream_stop'] = False for tweet in tweet_iter: - if(g['stream_stop'] == True): + if(g['stream_stop']): StreamLock.release() break if tweet is None: @@ -1697,8 +1713,17 @@ def stream(domain, args, name='Rainbow Stream'): fil=args.filter, ig=args.ignore, ) - sys.stdout.write(g['decorated_name'](c['PREFIX']) + readline.get_line_buffer()) - sys.stdout.flush() + # Current readline buffer + current_buffer = readline.get_line_buffer().strip() + # There is an unexpected behaviour in MacOSX readline + # After completely delete a word after typing it + # somehow readline buffer still contains the 1st character of that word + if g['previous_cmd'] != current_buffer: + if len(current_buffer) == 1: + current_buffer = '' + g['OSX_readline_bug'] = True + sys.stdout.write(g['decorated_name'](c['PREFIX']) + current_buffer) + sys.stdout.flush() elif tweet.get('direct_message'): print_message(tweet['direct_message'], check_semaphore=True) except TwitterHTTPError: @@ -1721,10 +1746,14 @@ def fly(): magenta("We have maximum connection problem with twitter'stream API right now :(")) printNicely(magenta("Let's try again later.")) save_history() - os.system('rm -rf rainbow.db') sys.exit() # Spawn stream thread - th = threading.Thread(target=stream, args=(c['USER_DOMAIN'], args, g['original_name'])) + th = threading.Thread( + target=stream, + args=( + c['USER_DOMAIN'], + args, + g['original_name'])) th.daemon = True th.start() # Start listen process