]> jfr.im git - z_archive/twitter.git/blob - twitter/cmdline.py
verbose status, bugfixes, awesomeness
[z_archive/twitter.git] / twitter / cmdline.py
1 """
2 USAGE:
3
4 twitter [action] [options]
5
6 ACTIONS:
7
8 friends get latest tweets from your friends (default action)
9 public get latest public tweets
10 set set your twitter status
11
12 OPTIONS:
13
14 -e --email <email> your email to login to twitter
15 -p --password <password> your twitter password
16 """
17
18 import sys
19 from getopt import getopt
20 from getpass import getpass
21
22 from api import Twitter, TwitterError
23
24 options = {
25 'email': None,
26 'password': None,
27 'action': 'friends',
28 'forever': False,
29 'refresh': 600,
30 'verbose': 0,
31 'extra_args': []
32 }
33
34 def parse_args(args, options):
35 long_opts = ['email', 'password', 'help', 'verbose']
36 short_opts = "e:p:vh?"
37 opts, extra_args = getopt(args, short_opts, long_opts)
38
39 for opt, arg in opts:
40 if opt in ('-e', '--email'):
41 options['email'] = arg
42 elif opt in ('-p', '--password'):
43 options['password'] = arg
44 elif opt in ('-v', '--verbose'):
45 options['verbose'] = options.get('verbose', 0) + 1
46 elif opt in ('-?', '-h', '--help'):
47 print __doc__
48 sys.exit(0)
49
50 if extra_args:
51 options['action'] = extra_args[0]
52 options['extra_args'] = extra_args[1:]
53
54 class StatusFormatter(object):
55 def __call__(self, status):
56 return (u"%s %s" %(
57 status['user']['screen_name'], status['text'])).encode(
58 sys.stdout.encoding, 'replace')
59
60 class VerboseStatusFormatter(object):
61 def __call__(self, status):
62 return (u"-- %s (%s) on %s\n%s\n" %(
63 status['user']['screen_name'],
64 status['user']['location'],
65 status['created_at'],
66 status['text'])).encode(
67 sys.stdout.encoding, 'replace')
68
69 def get_status_formatter(options):
70 if options['verbose']:
71 return VerboseStatusFormatter()
72 return StatusFormatter()
73
74 def no_action(twitter, options):
75 print >> sys.stderr, "No such action: ", options['action']
76 sys.exit(1)
77
78 def action_friends(twitter, options):
79 statuses = reversed(twitter.statuses.friends_timeline())
80 sf = get_status_formatter(options)
81 for status in statuses:
82 print sf(status)
83
84 def action_public(twitter, options):
85 statuses = reversed(twitter.statuses.public_timeline())
86 sf = get_status_formatter(options)
87 for status in statuses:
88 print sf(status)
89
90 def action_set_status(twitter, options):
91 status = (u" ".join(options['extra_args'])).encode(
92 'utf8', 'replace')
93 twitter.statuses.update(status=status)
94
95 actions = {
96 'friends': action_friends,
97 'public': action_public,
98 'set': action_set_status,
99 }
100
101
102 def main():
103 return main_with_args(sys.argv[1:])
104
105 def main_with_args(args):
106 parse_args(args, options)
107 if options['email'] and not options['password']:
108 options['password'] = getpass("Twitter password: ")
109 twitter = Twitter(options['email'], options['password'])
110 action = actions.get(options['action'], no_action)
111 try:
112 action(twitter, options)
113 except TwitterError, e:
114 print >> sys.stderr, e.message
115 print >> sys.stderr, "Use 'twitter -h' for help."
116 sys.exit(1)