X-Git-Url: https://vcs.fsf.org/?p=rainbowstream.git;a=blobdiff_plain;f=rainbowstream%2Frainbow.py;h=f489c3f67a4a3b097baf3e4f2f4ebd1ebe21c3c5;hp=cdddef2c6979c829772a0c0edd645bd7693acca2;hb=f405a7d0c54ab0657af3bab77f6eb28a98f8921e;hpb=8c840a8396f7d42453bad34cb31ab1c3b5c7466f diff --git a/rainbowstream/rainbow.py b/rainbowstream/rainbow.py index cdddef2..f489c3f 100644 --- a/rainbowstream/rainbow.py +++ b/rainbowstream/rainbow.py @@ -3,18 +3,21 @@ Colorful user's timeline stream """ from __future__ import print_function +from multiprocessing import Process -import os, os.path, argparse +import os, os.path, argparse, sys, time, signal from twitter.stream import TwitterStream, Timeout, HeartbeatTimeout, Hangup +from twitter.api import * from twitter.oauth import OAuth, read_token_file from twitter.oauth_dance import oauth_dance from twitter.util import printNicely -from twitter.ansi import * from dateutil import parser -from colors import * -from config import * +from .colors import * +from .config import * + +g = {} def draw(t): """ @@ -29,28 +32,30 @@ def draw(t): time = date.strftime('%Y/%m/%d %H:%M:%S') # Format info - user = cycle_color(name + ' ' + '@' + screen_name + ' ') - clock = grey('['+ time + ']') + user = cycle_color(name) + grey(' ' + '@' + screen_name + ' ') + clock = grey('[' + time + ']') tweet = text.split() - tweet = map(lambda x: grey(x) if x=='RT' else x, tweet) - tweet = map(lambda x: cycle_color(x) if x[0]=='@' else x, tweet) - tweet = map(lambda x: cyan(x) if x[0:7]=='http://' else x, tweet) + tweet = map(lambda x: grey(x) if x == 'RT' else x, tweet) + tweet = map(lambda x: cycle_color(x) if x[0] == '@' else x, tweet) + tweet = map(lambda x: cyan(x) if x[0:7] == 'http://' else x, tweet) tweet = ' '.join(tweet) # Draw rainbow - terminalrows, terminalcolumns = os.popen('stty size', 'r').read().split() line1 = u"{u:>{uw}}:".format( - u = user, - uw = len(user) + 2, + u=user, + uw=len(user) + 2, ) line2 = u"{c:>{cw}}".format( - c = clock, - cw = len(clock) + 2, + c=clock, + cw=len(clock) + 2, ) line3 = ' ' + tweet line4 = '\n' - return line1, line2, line3, line4 + printNicely(line1) + printNicely(line2) + printNicely(line3) + printNicely(line4) def parse_arguments(): @@ -60,29 +65,139 @@ def parse_arguments(): parser = argparse.ArgumentParser(description=__doc__ or "") - parser.add_argument('-to', '--timeout', help='Timeout for the stream (seconds).') - parser.add_argument('-ht', '--heartbeat-timeout', help='Set heartbeat timeout.', default=90) - parser.add_argument('-nb', '--no-block', action='store_true', help='Set stream to non-blocking.') - parser.add_argument('-tt', '--track-keywords', help='Search the stream for specific text.') + parser.add_argument( + '-to', + '--timeout', + help='Timeout for the stream (seconds).') + parser.add_argument( + '-ht', + '--heartbeat-timeout', + help='Set heartbeat timeout.', + default=90) + parser.add_argument( + '-nb', + '--no-block', + action='store_true', + help='Set stream to non-blocking.') + parser.add_argument( + '-tt', + '--track-keywords', + help='Search the stream for specific text.') return parser.parse_args() -def main(): - args = parse_arguments() - - # The Logo - ascii_art() - +def authen(): + """ + authenticate with Twitter OAuth + """ # When using rainbow stream you must authorize. - twitter_credential = os.environ.get('HOME', os.environ.get('USERPROFILE', '')) + os.sep + '.rainbow_oauth' + twitter_credential = os.environ.get( + 'HOME', + os.environ.get( + 'USERPROFILE', + '')) + os.sep + '.rainbow_oauth' if not os.path.exists(twitter_credential): oauth_dance("Rainbow Stream", CONSUMER_KEY, CONSUMER_SECRET, twitter_credential) oauth_token, oauth_token_secret = read_token_file(twitter_credential) - auth = OAuth(oauth_token, oauth_token_secret, CONSUMER_KEY, CONSUMER_SECRET) + return OAuth( + oauth_token, + oauth_token_secret, + CONSUMER_KEY, + CONSUMER_SECRET) + + +def get_decorated_name(): + """ + Beginning of every line + """ + t = Twitter(auth=authen()) + name = '@' + t.statuses.user_timeline()[-1]['user']['screen_name'] + g['decorated_name'] = grey('[') + grey(name) + grey(']: ') + + +def tweet(): + """ + Authen and tweet + """ + t = Twitter(auth=authen()) + t.statuses.update(status=g['stuff']) + + +def search(): + """ + Authen and search + """ + t = Twitter(auth=authen()) + rel = t.search.tweets(q='#' + g['stuff'])['statuses'] + printNicely(grey('**************************************************************************************\n')) + print('Newest ',SEARCH_MAX_RECORD, ' tweet: \n') + for i in xrange(5): + draw(t=rel[i]) + printNicely(grey('**************************************************************************************\n')) + + +def help(): + """ + Print help + """ + usage = ''' + Hi boss! I'm ready to serve you right now! + ---------------------------------------------------- + "!" at the beginning will start to tweet immediately + "/" at the beginning will search for 5 lastest twwet + "?" will print this help once again + "q" will exit + ---------------------------------------------------- + Hvae fun and hang tight! + ''' + printNicely(usage) + sys.stdout.write(g['decorated_name']) + + +def quit(): + """ + Exit all + """ + os.kill(g['stream_pid'], signal.SIGKILL) + sys.exit() + + +def process(line): + """ + Process switch by start of line + """ + return { + '!' : tweet, + '/' : search, + '?' : help, + 'q' : quit, + }.get(line[0],lambda: sys.stdout.write(g['decorated_name'])) + + +def listen(stdin): + """ + Listen to user's input + """ + for line in iter(stdin.readline, ''): + # Save cmd to global variable and call process + g['stuff'] = line[1:] + process(line)() + stdin.close() + +def stream(): + """ + Track the stream + """ + args = parse_arguments() + + # The Logo + ascii_art() + print("Tip: Press ENTER and type a '?' to see what command mode can do for you") + print('\n') # These arguments are optional: stream_args = dict( timeout=args.timeout, @@ -95,7 +210,10 @@ def main(): query_args['track'] = args.track_keywords # Get stream - stream = TwitterStream(auth=auth, domain='userstream.twitter.com', **stream_args) + stream = TwitterStream( + auth = authen(), + domain = 'userstream.twitter.com', + **stream_args) tweet_iter = stream.user(**query_args) # Iterate over the sample stream. @@ -109,11 +227,16 @@ def main(): elif tweet is Hangup: printNicely("-- Hangup --") elif tweet.get('text'): - line1, line2, line3, line4 = draw(t = tweet) - printNicely(line1) - printNicely(line2) - printNicely(line3) - printNicely(line4) - -if __name__ == '__main__': - main() + draw(t=tweet) + + +def fly(): + """ + Main function + """ + get_decorated_name() + p = Process(target = stream) + p.start() + g['stream_pid'] = p.pid + listen(sys.stdin) +