+
+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 AdminAction(Action):
+ def __call__(self, twitter, options):
+ if not options['extra_args'][0]:
+ raise TwitterError("You need to specify a user (screen name)")
+ af = get_admin_formatter(options)
+ try:
+ user = self.getUser(twitter, options['extra_args'][0])
+ except TwitterError, e:
+ print "There was a problem following or leaving the specified user."
+ print " You may be trying to follow a user you are already following;"
+ print " Leaving a user you are not currently following;"
+ print " Or the user may not exist."
+ print " Sorry."
+ print
+ print e
+ else:
+ print af(options['action'], user).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 RepliesAction(StatusAction):
+ def getStatuses(self, twitter):
+ return reversed(twitter.statuses.replies())
+
+class FollowAction(AdminAction):
+ def getUser(self, twitter, user):
+ return twitter.notifications.follow(id=user)
+
+class LeaveAction(AdminAction):
+ def getUser(self, twitter, user):
+ return twitter.notifications.leave(id=user)
+
+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)
+
+class HelpAction(Action):
+ def __call__(self, twitter, options):
+ print __doc__
+
+actions = {
+ 'follow': FollowAction,
+ 'friends': FriendsAction,
+ 'help': HelpAction,
+ 'leave': LeaveAction,
+ 'public': PublicAction,
+ 'replies': RepliesAction,
+ '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):
+ try:
+ parse_args(args, options)
+ except GetoptError, e:
+ print >> sys.stderr, "I can't do that, %s." %(e)
+ print >> sys.stderr
+ sys.exit(1)
+
+ 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'] not in (
+ 'friends', 'public', 'replies'):
+ print >> sys.stderr, "You can only refresh the friends, public, or replies actions."
+ 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'], agent=AGENT_STR)
+ action = actions.get(options['action'], NoSuchAction)()
+
+ try:
+ doAction = lambda : action(twitter, options)
+
+ if (options['refresh'] and isinstance(action, StatusAction)):
+ 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
+