+
+class NoSuchAction(Action):
+ def __call__(self, twitter, options):
+ print >> sys.stderr, "No such action: ", options['action']
+ sys.exit(1)
+
+class StatusAction(Action):
+ def __call__(self, twitter, options):
+ statuses = self.getStatuses(twitter)
+ sf = get_status_formatter(options)
+ for status in statuses:
+ statusStr = sf(status)
+ if statusStr.strip():
+ print statusStr.encode(sys.stdout.encoding, 'replace')
+
+class FriendsAction(StatusAction):
+ def getStatuses(self, twitter):
+ return reversed(twitter.statuses.friends_timeline())
+
+class PublicAction(StatusAction):
+ def getStatuses(self, twitter):
+ return reversed(twitter.statuses.public_timeline())
+
+class SetStatusAction(Action):
+ def __call__(self, twitter, options):
+ statusTxt = (u" ".join(options['extra_args'])
+ if options['extra_args']
+ else unicode(raw_input("message: ")))
+ status = (statusTxt.encode('utf8', 'replace'))
+ twitter.statuses.update(status=status)
+
+actions = {
+ 'friends': FriendsAction,
+ 'public': PublicAction,
+ 'set': SetStatusAction,
+}
+
+def loadConfig(filename):
+ email = None
+ password = None
+ if os.path.exists(filename):
+ cp = SafeConfigParser()
+ cp.read([filename])
+ email = cp.get('twitter', 'email', None)
+ password = cp.get('twitter', 'password', None)
+ return email, password
+
+def main():
+ return main_with_args(sys.argv[1:])
+
+def main_with_args(args):
+ parse_args(args, options)
+
+ email, password = loadConfig(options['config_filename'])
+ if not options['email']: options['email'] = email
+ if not options['password']: options['password'] = password
+
+ if options['refresh'] and options['action'] == 'set':
+ print >> sys.stderr, "You can't repeatedly set your status, silly"
+ print >> sys.stderr, "Use 'twitter -h' for help."
+ sys.exit(1)
+ if options['email'] and not options['password']:
+ options['password'] = getpass("Twitter password: ")
+ twitter = Twitter(options['email'], options['password'])
+ action = actions.get(options['action'], NoSuchAction)()
+ try:
+ doAction = lambda : action(twitter, options)
+ if (options['refresh']):
+ while True:
+ doAction()
+ time.sleep(options['refresh_rate'])
+ else:
+ doAction()
+ except TwitterError, e:
+ print >> sys.stderr, e.args[0]
+ print >> sys.stderr, "Use 'twitter -h' for help."
+ sys.exit(1)
+ except KeyboardInterrupt:
+ pass
+