+#!/usr/bin/env python
+# encoding: utf-8
"""
USAGE:
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
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"
- 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'):
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):
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'])
}
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 __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:
# 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']])
- 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)
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"]))
'authorize' : DoNothingAction,
'follow' : FollowAction,
'friends' : FriendsAction,
+ 'list' : ListsAction,
'help' : HelpAction,
'leave' : LeaveAction,
'public' : PublicAction,
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),