X-Git-Url: https://vcs.fsf.org/?p=rainbowstream.git;a=blobdiff_plain;f=rainbowstream%2Frainbow.py;h=102b1e4b4d293fd0925e25e95c38c7f23a01ad1b;hp=c424e841e779c640b60a12c6364f80e62fa776ba;hb=eadd85a88d8b1d8aeb4e8c0aff7ddddd343259a6;hpb=720123f8296e176d1af022423f5bced1fd6d5a15 diff --git a/rainbowstream/rainbow.py b/rainbowstream/rainbow.py index c424e84..102b1e4 100644 --- a/rainbowstream/rainbow.py +++ b/rainbowstream/rainbow.py @@ -11,7 +11,6 @@ import argparse import time import requests import webbrowser -import json from twitter.stream import TwitterStream, Timeout, HeartbeatTimeout, Hangup from twitter.api import * @@ -28,9 +27,13 @@ from .db import * from .c_image import * from .py3patch import * - +# Global values g = {} + +# Database db = RainbowDB() + +# Commands cmdset = [ 'switch', 'trend', @@ -134,24 +137,28 @@ def authen(): CONSUMER_SECRET) -def get_decorated_name(): +def init(args): """ Init function """ # Get name t = Twitter(auth=authen()) name = '@' + t.account.verify_credentials()['screen_name'] + if not get_config('PREFIX'): + set_config('PREFIX', name) g['original_name'] = name[1:] - g['decorated_name'] = color_func(c['DECORATED_NAME'])('[' + name + ']: ') - + g['decorated_name'] = lambda x: color_func( + c['DECORATED_NAME'])( + '[' + x + ']: ') # Theme init 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']) - # Semaphore init db.semaphore_store(False) + # Image on term + c['IMAGE_ON_TERM'] = args.image_on_term def switch(): @@ -160,13 +167,14 @@ 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: ') + guide = 'To ignore an option, just hit Enter key.' + printNicely(light_magenta(guide)) + only = raw_input('Only nicks [Ex: @xxx,@yy]: ') + ignore = raw_input('Ignore nicks [Ex: @xxx,@yy]: ') args.filter = filter(None, only.split(',')) args.ignore = filter(None, ignore.split(',')) elif g['stuff'].split()[-1] == '-d': @@ -175,7 +183,6 @@ def switch(): except: printNicely(red('Sorry, wrong format.')) return - # Public stream if target == 'public': keyword = g['stuff'].split()[1] @@ -192,7 +199,6 @@ def switch(): args)) p.start() g['stream_pid'] = p.pid - # Personal stream elif target == 'mine': # Kill old process @@ -230,7 +236,6 @@ def trend(): town = g['stuff'].split()[1] except: town = '' - avail = t.trends.available() # World wide if not country: @@ -262,7 +267,7 @@ def home(): if g['stuff'].isdigit(): num = int(g['stuff']) for tweet in reversed(t.statuses.home_timeline(count=num)): - draw(t=tweet, iot=g['iot']) + draw(t=tweet) printNicely('') @@ -278,7 +283,7 @@ def view(): except: num = c['HOME_TWEET_NUM'] for tweet in reversed(t.statuses.user_timeline(count=num, screen_name=user[1:])): - draw(t=tweet, iot=g['iot']) + draw(t=tweet) printNicely('') else: printNicely(red('A name should begin with a \'@\'')) @@ -293,7 +298,7 @@ def mentions(): if g['stuff'].isdigit(): num = int(g['stuff']) for tweet in reversed(t.statuses.mentions_timeline(count=num)): - draw(t=tweet, iot=g['iot']) + draw(t=tweet) printNicely('') @@ -369,7 +374,7 @@ def allretweet(): printNicely(magenta('This tweet has no retweet.')) return for tweet in reversed(rt_ary): - draw(t=tweet, iot=g['iot']) + draw(t=tweet) printNicely('') @@ -386,7 +391,7 @@ def favorite(): tid = db.rainbow_to_tweet_query(id)[0].tweet_id t.favorites.create(_id=tid, include_entities=False) printNicely(green('Favorited.')) - draw(t.statuses.show(id=tid), iot=g['iot']) + draw(t.statuses.show(id=tid)) printNicely('') @@ -435,7 +440,7 @@ def unfavorite(): tid = db.rainbow_to_tweet_query(id)[0].tweet_id t.favorites.destroy(_id=tid) printNicely(green('Okay it\'s unfavorited.')) - draw(t.statuses.show(id=tid), iot=g['iot']) + draw(t.statuses.show(id=tid)) printNicely('') @@ -450,7 +455,6 @@ def search(): printNicely('Newest tweets:') for i in reversed(xrange(c['SEARCH_MAX_RECORD'])): draw(t=rel[i], - iot=g['iot'], keyword=g['stuff']) printNicely('') else: @@ -653,7 +657,7 @@ def whois(): user = t.users.show( screen_name=screen_name[1:], include_entities=False) - show_profile(user, g['iot']) + show_profile(user) except: printNicely(red('Omg no user.')) else: @@ -805,7 +809,7 @@ def get_slug(): """ Get Slug Decorator """ - # Get list name + # Get list name list_name = raw_input(light_magenta('Give me the list\'s name: ')) # Get list name and owner try: @@ -814,7 +818,8 @@ def get_slug(): slug = slug[1:] return owner, slug except: - printNicely(light_magenta('List name should follow "@owner/list_name" format.')) + printNicely( + light_magenta('List name should follow "@owner/list_name" format.')) raise Exception('Wrong list name') @@ -1089,31 +1094,55 @@ def config(): # List all config if not g['stuff']: for k in all_config: - line = ' '*2 + light_green(k) + ': ' + light_yellow(str(all_config[k])) + line = ' ' * 2 + \ + light_green(k) + ': ' + light_yellow(str(all_config[k])) printNicely(line) guide = 'Detailed explanation can be found at ' + \ - color_func(c['TWEET']['link'])('http://rainbowstream.readthedocs.org/en/latest/#config-explanation') + color_func(c['TWEET']['link'])( + 'http://rainbowstream.readthedocs.org/en/latest/#config-explanation') printNicely(guide) # Print specific config elif len(g['stuff'].split()) == 1: if g['stuff'] in all_config: k = g['stuff'] - line = ' '*2 + light_green(k) + ': ' + light_yellow(str(all_config[k])) + line = ' ' * 2 + \ + light_green(k) + ': ' + light_yellow(str(all_config[k])) printNicely(line) else: - printNicely(red('No config key like this.')) + printNicely(red('No such config key.')) # Print specific config's default value elif len(g['stuff'].split()) == 2 and g['stuff'].split()[-1] == 'default': key = g['stuff'].split()[0] - value = get_default_config(key) - line = ' '*2 + light_green(key) + ': ' + light_magenta(value) - printNicely(line) + try: + value = get_default_config(key) + line = ' ' * 2 + light_green(key) + ': ' + light_magenta(value) + printNicely(line) + except: + printNicely( + light_magenta('This config key does not exist in default.')) + # Delete specific config key in config file + elif len(g['stuff'].split()) == 2 and g['stuff'].split()[-1] == 'drop': + key = g['stuff'].split()[0] + try: + delete_config(key) + printNicely(light_green('Config key is dropped.')) + except: + printNicely(red('No such config key.')) # Set specific config - elif len(g['stuff'].split()) == 3 and g['stuff'].split()[1] == '=' : + elif len(g['stuff'].split()) == 3 and g['stuff'].split()[1] == '=': key = g['stuff'].split()[0] value = g['stuff'].split()[-1] + if key == 'THEME' and not validate_theme(value): + printNicely(red('Invalid theme\'s value.')) + return try: - set_config(key,value) + set_config(key, value) + # Apply theme immediately + if key == 'THEME': + reload_theme(value) + g['decorated_name'] = lambda x: color_func( + c['DECORATED_NAME'])( + '[' + x + ']: ') printNicely(light_green('Updated successfully.')) except: printNicely(light_magenta('Not valid value.')) @@ -1136,33 +1165,15 @@ def theme(): else: line = ' ' * 4 + line printNicely(line) - elif g['stuff'] == 'current_as_default': - # Set as default - set_config('THEME',c['THEME']) - printNicely(light_green('Okay it will be applied from next time :)')) else: # Change theme try: - # Load new config - if g['stuff'] != 'custom': - new_config = os.path.dirname( - __file__) + '/colorset/' + g['stuff'] + '.json' - else: - new_config = os.environ.get( - 'HOME', os.environ.get( - 'USERPROFILE', - '')) + os.sep + '.rainbow_config.json' - new_config = load_config(new_config) - if new_config: - for nc in new_config: - c[nc] = new_config[nc] - # Update db and reset colors - db.theme_update(g['stuff']) - c['THEME'] = g['stuff'] - start_cycle() - g['decorated_name'] = color_func( + # Load new theme + reload_theme(g['stuff']) + # Redefine decorated_name + g['decorated_name'] = lambda x: color_func( c['DECORATED_NAME'])( - '[@' + g['original_name'] + ']: ') + '[' + x + ']: ') printNicely(green('Theme changed.')) except: printNicely(red('No such theme exists.')) @@ -1350,7 +1361,6 @@ def help(): """ s = ' ' * 2 h, w = os.popen('stty size', 'r').read().split() - # Start usage = '\n' usage += s + 'Hi boss! I\'m ready to serve you right now!\n' @@ -1360,7 +1370,6 @@ def help(): usage += s + 'Any update from Twitter will show up ' + \ light_yellow('immediately') + '.\n' usage += s + 'In addtion, following commands are available right now:\n' - # Twitter help section usage += '\n' usage += s + grey(u'\u266A' + ' Twitter help\n') @@ -1376,7 +1385,6 @@ def help(): ' will show help for list commands.\n' usage += s * 2 + light_green('h stream') + \ ' will show help for stream commands.\n' - # Smart shell usage += '\n' usage += s + grey(u'\u266A' + ' Smart shell\n') @@ -1384,7 +1392,6 @@ def help(): 'will be evaluate by Python interpreter.\n' usage += s * 2 + 'Even ' + light_green('cal') + ' will show the calendar' + \ ' for current month.\n' - # Config usage += '\n' usage += s + grey(u'\u266A' + ' Config \n') @@ -1394,26 +1401,27 @@ def help(): usage += s * 2 + light_green('config') + ' will list all config.\n' usage += s * 3 + \ light_green('config ASCII_ART') + ' will output current value of ' +\ - light_yellow('ASCII_ART') +' config key.\n' + light_yellow('ASCII_ART') + ' config key.\n' usage += s * 3 + \ - light_green('config ASCII_ART default') + ' will output default value of ' + \ - light_yellow('ASCII_ART') +' config key.\n' + light_green('config TREND_MAX default') + ' will output default value of ' + \ + light_yellow('TREND_MAX') + ' config key.\n' usage += s * 3 + \ - light_green('config ASCII_ART = False') + ' will set value of ' + \ - light_yellow('ASCII_ART') +' config key to ' + light_yellow('False') + '.\n' - + light_green('config CUSTOM_CONFIG drop') + ' will drop ' + \ + light_yellow('CUSTOM_CONFIG') + ' config key.\n' + usage += s * 3 + \ + light_green('config IMAGE_ON_TERM = true') + ' will set value of ' + \ + light_yellow('IMAGE_ON_TERM') + ' config key to ' + \ + light_yellow('True') + '.\n' # Screening usage += '\n' usage += s + grey(u'\u266A' + ' Screening \n') usage += s * 2 + light_green('h') + ' will show this help again.\n' usage += s * 2 + light_green('c') + ' will clear the screen.\n' usage += s * 2 + light_green('q') + ' will quit.\n' - # End usage += '\n' usage += s + '-' * (int(w) - 4) + '\n' usage += s + 'Have fun and hang tight! \n' - # Show help d = { 'discover': help_discover, @@ -1558,8 +1566,8 @@ def listen(): 'del' ], # list [], # cal - [key for key in dict(get_all_config())], # config - g['themes'] + ['current_as_default'], # theme + [key for key in dict(get_all_config())], # config + g['themes'], # theme [ 'discover', 'tweets', @@ -1577,7 +1585,7 @@ def listen(): reset() while True: if g['prefix']: - line = raw_input(g['decorated_name']) + line = raw_input(g['decorated_name'](c['PREFIX'])) else: line = raw_input() try: @@ -1607,7 +1615,6 @@ def stream(domain, args, name='Rainbow Stream'): """ Track the stream """ - # The Logo art_dict = { c['USER_DOMAIN']: name, @@ -1616,24 +1623,20 @@ def stream(domain, args, name='Rainbow Stream'): } if c['ASCII_ART']: ascii_art(art_dict[domain]) - # These arguments are optional: stream_args = dict( timeout=args.timeout, block=not args.no_block, heartbeat_timeout=args.heartbeat_timeout) - # Track keyword query_args = dict() if args.track_keywords: query_args['track'] = args.track_keywords - # Get stream stream = TwitterStream( auth=authen(), domain=domain, **stream_args) - try: if domain == c['USER_DOMAIN']: tweet_iter = stream.user(**query_args) @@ -1644,8 +1647,6 @@ def stream(domain, args, name='Rainbow Stream'): tweet_iter = stream.statuses.filter(**query_args) else: tweet_iter = stream.statuses.sample() - - # Iterate over the stream. for tweet in tweet_iter: if tweet is None: printNicely("-- None --") @@ -1658,12 +1659,13 @@ def stream(domain, args, name='Rainbow Stream'): elif tweet.get('text'): draw( t=tweet, - iot=args.image_on_term, keyword=args.track_keywords, check_semaphore=True, fil=args.filter, ig=args.ignore, ) + elif tweet.get('direct_message'): + print_message(tweet['direct_message']) except TwitterHTTPError: printNicely('') printNicely( @@ -1674,11 +1676,10 @@ def fly(): """ Main function """ - # Spawn stream process + # Initial args = parse_arguments() try: - get_decorated_name() - + init(args) except TwitterHTTPError: printNicely('') printNicely( @@ -1688,7 +1689,7 @@ def fly(): save_history() os.system('rm -rf rainbow.db') sys.exit() - + # Spawn stream process p = Process( target=stream, args=( @@ -1696,11 +1697,9 @@ def fly(): args, g['original_name'])) p.start() - # Start listen process time.sleep(0.5) g['reset'] = True g['prefix'] = True g['stream_pid'] = p.pid - g['iot'] = args.image_on_term listen()