X-Git-Url: https://jfr.im/git/z_archive/twitter.git/blobdiff_plain/098660ce6ca34597e97f074b3af48f64dcf3ea03..a6a7f7632ec022aceebb4a23fadcdc698029f581:/twitter/cmdline.py diff --git a/twitter/cmdline.py b/twitter/cmdline.py index a167c14..8353df3 100644 --- a/twitter/cmdline.py +++ b/twitter/cmdline.py @@ -22,6 +22,7 @@ ACTIONS: search search twitter (Beware: octothorpe, escape it) set set your twitter status shell login to the twitter shell + rate get your current rate limit status (remaining API reqs) OPTIONS: @@ -72,6 +73,9 @@ from getopt import gnu_getopt as getopt, GetoptError from getpass import getpass import re import os.path +import locale +import string + try: from ConfigParser import SafeConfigParser except ImportError: @@ -110,6 +114,8 @@ def parse_args(args, options): 'datestamp', 'no-ssl'] short_opts = "e:p:f:h?rR:c:l:td" opts, extra_args = getopt(args, short_opts, long_opts) + extra_args = [arg.decode(locale.getpreferredencoding()) + for arg in extra_args] for opt, arg in opts: if opt in ('-f', '--format'): @@ -458,7 +464,33 @@ class SetStatusAction(Action): statusTxt = (" ".join(options['extra_args']) if options['extra_args'] else str(input("message: "))) - twitter.statuses.update(status=statusTxt) + replies = [] + ptr = re.compile("@[\w_]+") + while statusTxt: + s = ptr.match(statusTxt) + if s and s.start() == 0: + replies.append(statusTxt[s.start():s.end()]) + statusTxt = statusTxt[s.end()+1:] + else: + break + replies = " ".join(replies) + if len(replies) >= 140: + # just go back + statusTxt = replies + replies = "" + + splitted = [] + while statusTxt: + limit = 140 - len(replies) + if len(statusTxt) > limit: + end = string.rfind(statusTxt, ' ', 0, limit) + else: + end = limit + splitted.append(" ".join((replies,statusTxt[:end]))) + statusTxt = statusTxt[end:] + + for status in splitted: + twitter.statuses.update(status=status) class TwitterShell(Action): @@ -523,6 +555,13 @@ class DoNothingAction(Action): def __call__(self, twitter, options): pass +class RateLimitStatus(Action): + def __call__(self, twitter, options): + rate = twitter.account.rate_limit_status() + print("Remaining API requests: %s / %s (hourly limit)" % (rate['remaining_hits'], rate['hourly_limit'])) + print("Next reset in %ss (%s)" % (int(rate['reset_time_in_seconds']-time.time()), + time.asctime(time.localtime(rate['reset_time_in_seconds'])))) + actions = { 'authorize' : DoNothingAction, 'follow' : FollowAction, @@ -537,6 +576,7 @@ actions = { 'search' : SearchAction, 'set' : SetStatusAction, 'shell' : TwitterShell, + 'rate' : RateLimitStatus, } def loadConfig(filename):