arrow
[rainbowstream.git] / rainbowstream / rainbow.py
index 3d154cabbf94feee8c50b12e8a73570211e95704..df32fb7dbbfca11cdf622a32a24c76128056c6f8 100644 (file)
@@ -31,49 +31,6 @@ g = {}
 # Lock for streams
 StreamLock = threading.Lock()
 
-# Commands
-cmdset = [
-    'switch',
-    'trend',
-    'home',
-    'view',
-    'mentions',
-    't',
-    'rt',
-    'quote',
-    'allrt',
-    'fav',
-    'rep',
-    'del',
-    'ufav',
-    's',
-    'mes',
-    'show',
-    'open',
-    'ls',
-    'inbox',
-    'sent',
-    'trash',
-    'whois',
-    'fl',
-    'ufl',
-    'mute',
-    'unmute',
-    'muting',
-    'block',
-    'unblock',
-    'report',
-    'list',
-    'cal',
-    'config',
-    'theme',
-    'h',
-    'p',
-    'r',
-    'c',
-    'q'
-]
-
 
 def parse_arguments():
     """
@@ -84,16 +41,6 @@ def parse_arguments():
         '-to',
         '--timeout',
         help='Timeout for the stream (seconds).')
-    parser.add_argument(
-        '-ht',
-        '--heartbeat-timeout',
-        help='Set heartbeat timeout.',
-        default=90)
-    parser.add_argument(
-        '-nb',
-        '--no-block',
-        action='store_true',
-        help='Set stream to non-blocking.')
     parser.add_argument(
         '-tt',
         '--track-keywords',
@@ -184,7 +131,7 @@ def init(args):
     themes = [f.split('.')[0] for f in files if f.split('.')[-1] == 'json']
     g['themes'] = themes
     # Startup cmd
-    g['previous_cmd'] = ''
+    g['cmd'] = ''
     # Semaphore init
     c['lock'] = False
     c['pause'] = False
@@ -365,6 +312,7 @@ def quote():
     """
     Quote a tweet
     """
+    # Get tweet
     t = Twitter(auth=authen())
     try:
         id = int(g['stuff'].split()[0])
@@ -373,17 +321,16 @@ def quote():
         return
     tid = c['tweet_dict'][id]
     tweet = t.statuses.show(id=tid)
-    screen_name = tweet['user']['screen_name']
-    text = tweet['text']
-    quote = '\"@' + screen_name + ': ' + text + '\"'
-    quote = quote.encode('utf8')
-    notice = light_magenta('Compose mode ')
-    notice += light_yellow('(Enter nothing will cancel the quote)')
-    notice += light_magenta(':')
-    printNicely(notice)
-    extra = raw_input(quote)
-    if extra:
-        t.statuses.update(status=quote + extra)
+    # Get formater
+    formater = format_quote(tweet)
+    if not formater:
+        return
+    # Get comment
+    prefix = light_magenta('Compose your ') + light_green('#comment: ')
+    comment = raw_input(prefix)
+    if comment:
+        quote = comment.join(formater.split('#comment'))
+        t.statuses.update(status=quote)
     else:
         printNicely(light_magenta('No text added.'))
 
@@ -445,7 +392,7 @@ def reply():
     tid = c['tweet_dict'][id]
     user = t.statuses.show(id=tid)['user']['screen_name']
     status = ' '.join(g['stuff'].split()[1:])
-    status = '@' + user + ' ' + unc(status)
+    status = '@' + user + ' ' + str2u(status)
     t.statuses.update(status=status, in_reply_to_status_id=tid)
 
 
@@ -1067,7 +1014,7 @@ def list_delete(t):
     """
     Delete a list
     """
-    slug = raw_input(light_magenta('Your list that you want to update: '))
+    slug = raw_input(light_magenta('Your list that you want to delete: '))
     try:
         t.lists.destroy(
             slug='-'.join(slug.split()),
@@ -1520,59 +1467,103 @@ def reset():
         printNicely(magenta('Need tips ? Type "h" and hit Enter key!'))
     g['reset'] = False
     try:
-        printNicely(str(eval('%s %s' % (g['cmd'], g['stuff']))))
+        printNicely(str(eval(g['cmd'])))
     except Exception:
         pass
 
 
+# Command set
+cmdset = [
+    'switch',
+    'trend',
+    'home',
+    'view',
+    'mentions',
+    't',
+    'rt',
+    'quote',
+    'allrt',
+    'fav',
+    'rep',
+    'del',
+    'ufav',
+    's',
+    'mes',
+    'show',
+    'open',
+    'ls',
+    'inbox',
+    'sent',
+    'trash',
+    'whois',
+    'fl',
+    'ufl',
+    'mute',
+    'unmute',
+    'muting',
+    'block',
+    'unblock',
+    'report',
+    'list',
+    'cal',
+    'config',
+    'theme',
+    'h',
+    'p',
+    'r',
+    'c',
+    'q'
+]
+
+# Handle function set
+funcset = [
+    switch,
+    trend,
+    home,
+    view,
+    mentions,
+    tweet,
+    retweet,
+    quote,
+    allretweet,
+    favorite,
+    reply,
+    delete,
+    unfavorite,
+    search,
+    message,
+    show,
+    urlopen,
+    ls,
+    inbox,
+    sent,
+    trash,
+    whois,
+    follow,
+    unfollow,
+    mute,
+    unmute,
+    muting,
+    block,
+    unblock,
+    report,
+    twitterlist,
+    cal,
+    config,
+    theme,
+    help,
+    pause,
+    replay,
+    clear,
+    quit
+]
+
+
 def process(cmd):
     """
     Process switch
     """
-    return dict(zip(
-        cmdset,
-        [
-            switch,
-            trend,
-            home,
-            view,
-            mentions,
-            tweet,
-            retweet,
-            quote,
-            allretweet,
-            favorite,
-            reply,
-            delete,
-            unfavorite,
-            search,
-            message,
-            show,
-            urlopen,
-            ls,
-            inbox,
-            sent,
-            trash,
-            whois,
-            follow,
-            unfollow,
-            mute,
-            unmute,
-            muting,
-            block,
-            unblock,
-            report,
-            twitterlist,
-            cal,
-            config,
-            theme,
-            help,
-            pause,
-            replay,
-            clear,
-            quit
-        ]
-    )).get(cmd, reset)
+    return dict(zip(cmdset, funcset)).get(cmd, reset)
 
 
 def listen():
@@ -1651,13 +1642,13 @@ 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()
+        # Save cmd to compare with readline buffer
+        g['cmd'] = line.strip()
+        # Get short cmd to pass to handle function
         try:
             cmd = line.split()[0]
         except:
             cmd = ''
-        g['cmd'] = cmd
         try:
             # Lock the semaphore
             c['lock'] = True
@@ -1691,8 +1682,8 @@ def stream(domain, args, name='Rainbow Stream'):
     # These arguments are optional:
     stream_args = dict(
         timeout=0.5,  # To check g['stream_stop'] after each 0.5 s
-        block=not args.no_block,
-        heartbeat_timeout=args.heartbeat_timeout)
+        block=True,
+        heartbeat_timeout=c['HEARTBEAT_TIMEOUT'] * 60)
     # Track keyword
     query_args = dict()
     if args.track_keywords:
@@ -1724,12 +1715,24 @@ def stream(domain, args, name='Rainbow Stream'):
                     break
             elif tweet is HeartbeatTimeout:
                 printNicely("-- Heartbeat Timeout --")
+                guide = light_magenta("You can use ") + \
+                    light_green("switch") + \
+                    light_magenta(" command to return to your stream.\n")
+                guide += light_magenta("Type ") + \
+                    light_green("h stream") + \
+                    light_magenta(" for more details.")
+                printNicely(guide)
+                sys.stdout.write(g['decorated_name'](c['PREFIX']))
+                sys.stdout.flush()
+                StreamLock.release()
+                break
             elif tweet is Hangup:
                 printNicely("-- Hangup --")
             elif tweet.get('text'):
                 draw(
                     t=tweet,
                     keyword=args.track_keywords,
+                    humanize=False,
                     check_semaphore=True,
                     fil=args.filter,
                     ig=args.ignore,
@@ -1740,9 +1743,9 @@ def stream(domain, args, name='Rainbow Stream'):
                 # 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:
+                if current_buffer and g['cmd'] != current_buffer:
                     sys.stdout.write(
-                        g['decorated_name'](c['PREFIX']) + unc(current_buffer))
+                        g['decorated_name'](c['PREFIX']) + str2u(current_buffer))
                     sys.stdout.flush()
                 elif not c['HIDE_PROMPT']:
                     sys.stdout.write(g['decorated_name'](c['PREFIX']))