bumped veresion
[rainbowstream.git] / rainbowstream / rainbow.py
index 55e062cb5b0a5c38243dabbe54048cb6513c1c42..102b1e4b4d293fd0925e25e95c38c7f23a01ad1b 100644 (file)
@@ -137,15 +137,19 @@ def authen():
         CONSUMER_SECRET)
 
 
-def init():
+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']
@@ -153,6 +157,8 @@ def init():
     db.theme_store(c['THEME'])
     # Semaphore init
     db.semaphore_store(False)
+    # Image on term
+    c['IMAGE_ON_TERM'] = args.image_on_term
 
 
 def switch():
@@ -165,8 +171,10 @@ def switch():
         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':
@@ -259,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('')
 
 
@@ -275,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 \'@\''))
@@ -290,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('')
 
 
@@ -366,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('')
 
 
@@ -383,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('')
 
 
@@ -432,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('')
 
 
@@ -447,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:
@@ -650,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:
@@ -1102,19 +1109,40 @@ def config():
                 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] == '=':
         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)
+            # 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.'))
@@ -1137,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.'))
@@ -1393,12 +1403,15 @@ def help():
         light_green('config ASCII_ART') + ' will output current value of ' +\
         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 CUSTOM_CONFIG drop') + ' will drop ' + \
+        light_yellow('CUSTOM_CONFIG') + ' 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 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')
@@ -1554,7 +1567,7 @@ def listen():
             ],  # list
             [],  # cal
             [key for key in dict(get_all_config())],  # config
-            g['themes'] + ['current_as_default'],  # theme
+            g['themes'],  # theme
             [
                 'discover',
                 'tweets',
@@ -1572,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:
@@ -1646,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(
@@ -1665,7 +1679,7 @@ def fly():
     # Initial
     args = parse_arguments()
     try:
-        init()
+        init(args)
     except TwitterHTTPError:
         printNicely('')
         printNicely(
@@ -1688,5 +1702,4 @@ def fly():
     g['reset'] = True
     g['prefix'] = True
     g['stream_pid'] = p.pid
-    g['iot'] = args.image_on_term
     listen()