]> jfr.im git - z_archive/twitter.git/blobdiff - twitter/cmdline.py
- Check rate limit using the command line tool. Patch by @stalkr_
[z_archive/twitter.git] / twitter / cmdline.py
index 54a994e2ea2df5815ccd4b626ccc3ec4280c0feb..5ed95109d14da94477ad1c4a1ee0bc1b8269793c 100644 (file)
@@ -16,10 +16,13 @@ ACTIONS:
  mylist         get list of your lists; give a list name to get tweets
                     from that list
  public         get latest public tweets
+ pyprompt       start a Python prompt for interacting with the twitter
+                    object directly
  replies        get latest replies to you
  search         search twitter (Beware: octothorpe, escape it)
  set            set your twitter status
  shell          login to the twitter shell
+ rate           get your current rate limit status (remaining API reqs)
 
 
 OPTIONS:
@@ -59,6 +62,8 @@ prompt: <twitter_shell_prompt e.g. '[cyan]twitter[R]> '>
  home directory.
 """
 
+from __future__ import print_function
+
 CONSUMER_KEY='uS6hO2sV6tDKIOeVjhnFnQ'
 CONSUMER_SECRET='MEYTOS97VvlHX7K1rwHPEqVpTSqZ71HtvoK4sVuYk'
 
@@ -68,15 +73,22 @@ from getopt import gnu_getopt as getopt, GetoptError
 from getpass import getpass
 import re
 import os.path
-from configparser import SafeConfigParser
+try:
+    from ConfigParser import SafeConfigParser
+except ImportError:
+    from configparser import ConfigParser as SafeConfigParser
 import datetime
-from urllib.parse import quote
+try:
+    from urllib.parse import quote
+except ImportError:
+    from urllib2 import quote
 import webbrowser
 
 from .api import Twitter, TwitterError
 from .oauth import OAuth, write_token_file, read_token_file
 from .oauth_dance import oauth_dance
 from . import ansi
+from .util import smrt_input, printNicely
 
 OPTIONS = {
     'action': 'friends',
@@ -349,10 +361,6 @@ class NoSuchAction(Action):
     def __call__(self, twitter, options):
         raise NoSuchActionError("No such action: %s" %(options['action']))
 
-def printNicely(string):
-    sys.stdout.buffer.write(string.encode('utf8'))
-    print()
-
 class StatusAction(Action):
     def __call__(self, twitter, options):
         statuses = self.getStatuses(twitter, options)
@@ -371,7 +379,7 @@ class SearchAction(Action):
         # We need to bypass the TwitterCall parameter encoding, so we
         # don't encode the plus sign, so we have to encode it ourselves
         query_string = "+".join(
-            [quote(term.decode(get_term_encoding()))
+            [quote(term)
              for term in options['extra_args']])
 
         results = twitter.search(q=query_string)['results']
@@ -448,11 +456,10 @@ class LeaveAction(AdminAction):
 
 class SetStatusAction(Action):
     def __call__(self, twitter, options):
-        statusTxt = (" ".join(options['extra_args']).decode(get_term_encoding())
+        statusTxt = (" ".join(options['extra_args'])
                      if options['extra_args']
                      else str(input("message: ")))
-        status = (statusTxt.encode('utf8', 'replace'))
-        twitter.statuses.update(status=status)
+        twitter.statuses.update(status=statusTxt)
 
 class TwitterShell(Action):
 
@@ -501,6 +508,14 @@ class TwitterShell(Action):
                 else:
                     raise SystemExit(0)
 
+class PythonPromptAction(Action):
+    def __call__(self, twitter, options):
+        try:
+            while True:
+                smrt_input(globals(), locals())
+        except EOFError:
+            pass
+
 class HelpAction(Action):
     def __call__(self, twitter, options):
         print(__doc__)
@@ -509,6 +524,13 @@ class DoNothingAction(Action):
     def __call__(self, twitter, options):
         pass
 
+class RateLimitStatus(Action):
+    def __call__(self, twitter, options):
+        rate = twitter.account.rate_limit_status()
+        print("Remaining API requests: %s / %s (hourly limit)" % (rate['remaining_hits'], rate['hourly_limit']))
+        print("Next reset in %ss (%s)" % (int(rate['reset_time_in_seconds']-time.time()),
+                                          time.asctime(time.localtime(rate['reset_time_in_seconds']))))
+
 actions = {
     'authorize' : DoNothingAction,
     'follow'    : FollowAction,
@@ -518,10 +540,12 @@ actions = {
     'help'      : HelpAction,
     'leave'     : LeaveAction,
     'public'    : PublicAction,
+    'pyprompt'  : PythonPromptAction,
     'replies'   : RepliesAction,
     'search'    : SearchAction,
     'set'       : SetStatusAction,
     'shell'     : TwitterShell,
+    'rate'      : RateLimitStatus,
 }
 
 def loadConfig(filename):