]> jfr.im git - z_archive/twitter.git/blobdiff - twitter/cmdline.py
Add a simple prompt thing to twitter cmdline.
[z_archive/twitter.git] / twitter / cmdline.py
index fcb58923de1af24f7c2e45d46d50a8172eb8324a..3162f1c489be6c1646c947b9d2817ef480793d6f 100644 (file)
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # encoding: utf-8
 """
 USAGE:
@@ -8,15 +7,19 @@ USAGE:
 
 ACTIONS:
  authorize      authorize the command-line tool to interact with Twitter
- follow         add the specified user to your follow list
+ follow         follow a user
  friends        get latest tweets from your friends (default action)
  help           print this help text that you are currently reading
- leave          remove the specified user from your following list
+ leave          stop following a user
+ list           get list of a user's lists; give a list name to get
+                    tweets from that list
+ mylist         get list of your lists; give a list name to get tweets
+                    from that list
  public         get latest public tweets
- replies        get latest replies
+ replies        get latest replies to you
  search         search twitter (Beware: octothorpe, escape it)
  set            set your twitter status
- shell          login the twitter shell
+ shell          login to the twitter shell
 
 
 OPTIONS:
@@ -30,8 +33,8 @@ OPTIONS:
  -l --length <count>        specify number of status updates shown
                             (default: 20, max: 200)
  -t --timestamp             show time before status lines
- -d --datestamp             shoe date before status lines
-    --no-ssl                use HTTP instead of more secure HTTPS
+ -d --datestamp             show date before status lines
+    --no-ssl                use less-secure HTTP instead of HTTPS
     --oauth <filename>      filename to read/store oauth credentials to
 
 FORMATS for the --format option
@@ -74,6 +77,7 @@ from api import Twitter, TwitterError
 from oauth import OAuth, write_token_file, read_token_file
 from oauth_dance import oauth_dance
 import ansi
+from util import smrt_input
 
 OPTIONS = {
     'action': 'friends',
@@ -172,6 +176,31 @@ class URLStatusFormatter(object):
         urls = self.urlmatch.findall(status['text'])
         return u'\n'.join(urls) if urls else ""
 
+
+class ListsFormatter(object):
+    def __call__(self, list):
+        if list['description']:
+            list_str = u"%-30s (%s)" % (list['name'], list['description'])
+        else:
+            list_str = u"%-30s" % (list['name'])
+        return u"%s\n" % list_str
+
+class ListsVerboseFormatter(object):
+    def __call__(self, list):
+        list_str = u"%-30s\n description: %s\n members: %s\n mode:%s\n" % (list['name'], list['description'], list['member_count'], list['mode'])
+        return list_str
+
+class AnsiListsFormatter(object):
+    def __init__(self):
+        self._colourMap = ansi.ColourMap()
+
+    def __call__(self, list):
+        colour = self._colourMap.colourFor(list['name'])
+        return (u"%s%-15s%s %s" %(
+            ansi.cmdColour(colour), list['name'],
+            ansi.cmdReset(), list['description']))
+
+
 class AdminFormatter(object):
     def __call__(self, action, user):
         user_str = u"%s (%s)" %(user['screen_name'], user['name'])
@@ -250,6 +279,14 @@ search_formatters = {
 }
 formatters['search'] = search_formatters
 
+lists_formatters = {
+    'default': ListsFormatter,
+    'verbose': ListsVerboseFormatter,
+    'urls': None,
+    'ansi': AnsiListsFormatter
+}
+formatters['lists'] = lists_formatters
+
 def get_formatter(action_type, options):
     formatters_dict = formatters.get(action_type)
     if (not formatters_dict):
@@ -365,6 +402,33 @@ class AdminAction(Action):
         else:
             printNicely(af(options['action'], user))
 
+class ListsAction(StatusAction):
+    def getStatuses(self, twitter, options):
+        if not options['extra_args']:
+            raise TwitterError("Please provide a user to query for lists")
+
+        screen_name = options['extra_args'][0]
+
+        if not options['extra_args'][1:]:
+            lists = twitter.user.lists(user=screen_name)['lists']
+            if not lists:
+                printNicely("This user has no lists.")
+            for list in lists:
+                lf = get_formatter('lists', options)
+                printNicely(lf(list))
+            return []
+        else:
+            return reversed(twitter.user.lists.list.statuses(
+                    user=screen_name, list=options['extra_args'][1]))
+
+
+class MyListsAction(ListsAction):
+    def getStatuses(self, twitter, options):
+        screen_name = twitter.account.verify_credentials()['screen_name']
+        options['extra_args'].insert(0, screen_name)
+        return ListsAction.getStatuses(self, twitter, options)
+
+
 class FriendsAction(StatusAction):
     def getStatuses(self, twitter, options):
         return reversed(twitter.statuses.friends_timeline(count=options["length"]))
@@ -440,6 +504,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__
@@ -452,9 +524,12 @@ actions = {
     'authorize' : DoNothingAction,
     'follow'    : FollowAction,
     'friends'   : FriendsAction,
+    'list'      : ListsAction,
+    'mylist'    : MyListsAction,
     'help'      : HelpAction,
     'leave'     : LeaveAction,
     'public'    : PublicAction,
+    'pyprompt'  : PythonPromptAction,
     'replies'   : RepliesAction,
     'search'    : SearchAction,
     'set'       : SetStatusAction,