]> jfr.im git - z_archive/twitter.git/blobdiff - twitter/cmdline.py
adding list action
[z_archive/twitter.git] / twitter / cmdline.py
index 780837d8dd777b47de168e0f6027d8ca1b479b17..59113de35c26ae928da52803b2a2a171fb547895 100644 (file)
@@ -1,3 +1,5 @@
+#!/usr/bin/env python
+# encoding: utf-8
 """
 USAGE:
 
 """
 USAGE:
 
@@ -11,6 +13,7 @@ ACTIONS:
  help           print this help text that you are currently reading
  leave          remove the specified user from your following list
  public         get latest public tweets
  help           print this help text that you are currently reading
  leave          remove the specified user from your following list
  public         get latest public tweets
+ list           get list of user lists
  replies        get latest replies
  search         search twitter (Beware: octothorpe, escape it)
  set            set your twitter status
  replies        get latest replies
  search         search twitter (Beware: octothorpe, escape it)
  set            set your twitter status
@@ -90,10 +93,10 @@ OPTIONS = {
 
 def parse_args(args, options):
     long_opts = ['help', 'format=', 'refresh', 'oauth=',
 
 def parse_args(args, options):
     long_opts = ['help', 'format=', 'refresh', 'oauth=',
-                 'refresh-rate=', 'config=', 'length=', 'timestamp', 
+                 'refresh-rate=', 'config=', 'length=', 'timestamp',
                  'datestamp', 'no-ssl']
     short_opts = "e:p:f:h?rR:c:l:td"
                  'datestamp', 'no-ssl']
     short_opts = "e:p:f:h?rR:c:l:td"
-    opts, extra_args = getopt(args, short_opts, long_opts)        
+    opts, extra_args = getopt(args, short_opts, long_opts)
 
     for opt, arg in opts:
         if opt in ('-f', '--format'):
 
     for opt, arg in opts:
         if opt in ('-f', '--format'):
@@ -137,7 +140,7 @@ def get_time_string(status, options, format="%a %b %d %H:%M:%S +0000 %Y"):
         return time.strftime("%H:%M:%S ", t)
     elif datestamp:
         return time.strftime("%Y-%m-%d ", t)
         return time.strftime("%H:%M:%S ", t)
     elif datestamp:
         return time.strftime("%Y-%m-%d ", t)
-    return ""                             
+    return ""
 
 class StatusFormatter(object):
     def __call__(self, status, options):
 
 class StatusFormatter(object):
     def __call__(self, status, options):
@@ -170,6 +173,30 @@ class URLStatusFormatter(object):
         urls = self.urlmatch.findall(status['text'])
         return u'\n'.join(urls) if urls else ""
 
         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'])
 class AdminFormatter(object):
     def __call__(self, action, user):
         user_str = u"%s (%s)" %(user['screen_name'], user['name'])
@@ -248,6 +275,14 @@ search_formatters = {
 }
 formatters['search'] = 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):
 def get_formatter(action_type, options):
     formatters_dict = formatters.get(action_type)
     if (not formatters_dict):
@@ -311,7 +346,7 @@ class NoSuchAction(Action):
     def __call__(self, twitter, options):
         raise NoSuchActionError("No such action: %s" %(options['action']))
 
     def __call__(self, twitter, options):
         raise NoSuchActionError("No such action: %s" %(options['action']))
 
-def printNicely(string):        
+def printNicely(string):
     if sys.stdout.encoding:
         print string.encode(sys.stdout.encoding, 'replace')
     else:
     if sys.stdout.encoding:
         print string.encode(sys.stdout.encoding, 'replace')
     else:
@@ -331,15 +366,14 @@ class SearchAction(Action):
         # We need to be pointing at search.twitter.com to work, and it is less
         # tangly to do it here than in the main()
         twitter.domain="search.twitter.com"
         # We need to be pointing at search.twitter.com to work, and it is less
         # tangly to do it here than in the main()
         twitter.domain="search.twitter.com"
-        twitter.uri=""
+        twitter.uriparts=()
         # 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()))
              for term in options['extra_args']])
         # 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()))
              for term in options['extra_args']])
-        twitter.encoded_args = "q=%s" %(query_string)
 
 
-        results = twitter.search()['results']
+        results = twitter.search(q=query_string)['results']
         f = get_formatter('search', options)
         for result in results:
             resultStr = f(result, options)
         f = get_formatter('search', options)
         for result in results:
             resultStr = f(result, options)
@@ -364,6 +398,16 @@ class AdminAction(Action):
         else:
             printNicely(af(options['action'], user))
 
         else:
             printNicely(af(options['action'], user))
 
+class ListsAction(StatusAction):
+    def getStatuses(self, twitter, options):
+        screen_name = twitter.account.verify_credentials()['screen_name']
+        if not (options['extra_args'] and options['extra_args'][0]):
+            for list in twitter.user.lists(user=screen_name)['lists']:
+                lf = get_formatter('lists', options)
+                printNicely(lf(list))
+            raise SystemExit(0)
+        return reversed(twitter.user.lists.list.statuses(user=screen_name, list=options['extra_args'][0]))
+
 class FriendsAction(StatusAction):
     def getStatuses(self, twitter, options):
         return reversed(twitter.statuses.friends_timeline(count=options["length"]))
 class FriendsAction(StatusAction):
     def getStatuses(self, twitter, options):
         return reversed(twitter.statuses.friends_timeline(count=options["length"]))
@@ -451,6 +495,7 @@ actions = {
     'authorize' : DoNothingAction,
     'follow'    : FollowAction,
     'friends'   : FriendsAction,
     'authorize' : DoNothingAction,
     'follow'    : FollowAction,
     'friends'   : FriendsAction,
+    'list'      : ListsAction,
     'help'      : HelpAction,
     'leave'     : LeaveAction,
     'public'    : PublicAction,
     'help'      : HelpAction,
     'leave'     : LeaveAction,
     'public'    : PublicAction,
@@ -506,7 +551,7 @@ def main(args=sys.argv[1:]):
             options['oauth_filename'])
 
     oauth_token, oauth_token_secret = read_token_file(oauth_filename)
             options['oauth_filename'])
 
     oauth_token, oauth_token_secret = read_token_file(oauth_filename)
-    
+
     twitter = Twitter(
         auth=OAuth(
             oauth_token, oauth_token_secret, CONSUMER_KEY, CONSUMER_SECRET),
     twitter = Twitter(
         auth=OAuth(
             oauth_token, oauth_token_secret, CONSUMER_KEY, CONSUMER_SECRET),