Avoid 'Rate limit exceeded' error on 'ls' command
[rainbowstream.git] / rainbowstream / rainbow.py
index 93f711a5da202630d50fcfee1e41d17c460d1a5f..e0668c32522506195414415a551030659f1a56fb 100644 (file)
@@ -465,7 +465,8 @@ def pocket():
     Add new link to Pocket along with tweet id
     """
     if not c['POCKET_SUPPORT']:
-        printNicely(red('Pocket isn\'t enabled.'))
+        printNicely(yellow('Pocket isn\'t enabled.'))
+        printNicely(yellow('You need to "config POCKET_SUPPORT = true"'))
         return
 
     # Get tweet infos
@@ -902,24 +903,40 @@ def ls():
     d = {'fl': 'followers', 'fr': 'friends'}
     next_cursor = -1
     rel = {}
+
+    printNicely('All ' + d[target] + ':')
+
     # Cursor loop
+    number_of_users = 0
     while next_cursor != 0:
+
         list = getattr(t, d[target]).list(
             screen_name=name,
             cursor=next_cursor,
             skip_status=True,
             include_entities=False,
         )
+
         for u in list['users']:
-            rel[u['name']] = '@' + u['screen_name']
+
+            number_of_users += 1
+
+            # Print out result
+            printNicely(   '  '                                               \
+                         + cycle_color( u['name'] )                           \
+                         + color_func(c['TWEET']['nick'])(    ' @'            \
+                                                           + u['screen_name'] \
+                                                           + ' ' ) )
+
         next_cursor = list['next_cursor']
-    # Print out result
-    printNicely('All: ' + str(len(rel)) + ' ' + d[target] + '.')
-    for name in rel:
-        user = '  ' + cycle_color(name)
-        user += color_func(c['TWEET']['nick'])(' ' + rel[name] + ' ')
-        printNicely(user)
 
+        # 300 users means 15 calls to the related API. The rate limit is 15
+        # calls per 15mn periods (see Twitter documentation).
+        if ( number_of_users % 300 == 0 ):
+            printNicely( '(waiting 16mn for rate limits reasons...)' )
+            time.sleep(16*60)
+
+    printNicely('All: ' + str(number_of_users) + ' ' + d[target] + '.')
 
 def follow():
     """
@@ -1388,8 +1405,8 @@ def switch():
                 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(','))
+                args.filter = list(filter(None, only.split(',')))
+                args.ignore = list(filter(None, ignore.split(',')))
         except:
             printNicely(red('Sorry, wrong format.'))
             return