Merge pull request #209 from Lertsenem/pr-lsratelimit
authorOrakaro <DTVD@users.noreply.github.com>
Sun, 11 Dec 2016 13:25:58 +0000 (22:25 +0900)
committerGitHub <noreply@github.com>
Sun, 11 Dec 2016 13:25:58 +0000 (22:25 +0900)
Avoid 'Rate limit exceeded' error on 'ls' command

1  2 
rainbowstream/rainbow.py

diff --combined rainbowstream/rainbow.py
@@@ -618,12 -618,7 +618,12 @@@ def reply()
      tid = c['tweet_dict'][id]
      user = t.statuses.show(id=tid)['user']['screen_name']
      status = ' '.join(g['stuff'].split()[1:])
 -    status = '@' + user + ' ' + str2u(status)
 +    # don't include own username for tweet chains
 +    # for details see issue https://github.com/DTVD/rainbowstream/issues/163
 +    if user == g['original_name']:
 +        status = str2u(status)
 +    else:
 +        status = '@' + user + ' ' + str2u(status)
      t.statuses.update(status=status, in_reply_to_status_id=tid)
  
  
@@@ -908,24 -903,40 +908,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():
      """