from __future__ import print_function
from multiprocessing import Process
-import os, os.path, argparse, sys, time, signal
+import os
+import os.path
+import argparse
+import sys
+import signal
from twitter.stream import TwitterStream, Timeout, HeartbeatTimeout, Hangup
from twitter.api import *
from .colors import *
from .config import *
+from .db import *
g = {}
+db = RainbowDB()
-def draw(t,keyword=None):
+def draw(t, keyword=None):
"""
Draw the rainbow
"""
# Retrieve tweet
+ tid = t['id']
text = t['text']
screen_name = t['user']['screen_name']
name = t['user']['name']
date = parser.parse(created_at)
time = date.strftime('%Y/%m/%d %H:%M:%S')
+ res = db.tweet_query(tid)
+ if not res:
+ db.store(tid)
+ res = db.tweet_query(tid)
+ rid = res[0].rainbow_id
+
# Format info
user = cycle_color(name) + grey(' ' + '@' + screen_name + ' ')
- clock = grey('[' + time + ']')
+ meta = grey('[' + time + '] [id=' + str(rid) + ']')
tweet = text.split()
# Highlight RT
tweet = map(lambda x: grey(x) if x == 'RT' else x, tweet)
tweet = map(lambda x: cyan(x) if x[0:7] == 'http://' else x, tweet)
# Highlight search keyword
if keyword:
- tweet = map(lambda x: on_yellow(x) if ''.join(c for c in x if c.isalnum()).lower() == keyword.lower() else x, tweet)
+ tweet = map(
+ lambda x: on_yellow(x) if
+ ''.join(c for c in x if c.isalnum()).lower() == keyword.lower()
+ else x,
+ tweet
+ )
tweet = ' '.join(tweet)
# Draw rainbow
uw=len(user) + 2,
)
line2 = u"{c:>{cw}}".format(
- c=clock,
- cw=len(clock) + 2,
+ c=meta,
+ cw=len(meta) + 2,
)
line3 = ' ' + tweet
- line4 = '\n'
printNicely(line1)
printNicely(line2)
printNicely(line3)
- printNicely(line4)
+ printNicely('')
def parse_arguments():
def authen():
"""
- authenticate with Twitter OAuth
+ Authenticate with Twitter OAuth
"""
# When using rainbow stream you must authorize.
twitter_credential = os.environ.get(
g['decorated_name'] = grey('[') + grey(name) + grey(']: ')
+def home():
+ """
+ Home
+ """
+ t = Twitter(auth=authen())
+ count = HOME_TWEET_NUM
+ if g['stuff'].isdigit():
+ count = g['stuff']
+ for tweet in reversed(t.statuses.home_timeline(count=count)):
+ draw(t=tweet)
+
+
+def view():
+ """
+ Friend view
+ """
+ t = Twitter(auth=authen())
+ user = g['stuff'].split()[0]
+ if user[0] == '@':
+ try:
+ count = int(g['stuff'].split()[1])
+ except:
+ count = HOME_TWEET_NUM
+ for tweet in reversed(t.statuses.user_timeline(count=count, screen_name=user[1:])):
+ draw(t=tweet)
+ else:
+ print(red('A name should begin with a \'@\''))
+ sys.stdout.write(g['decorated_name'])
+
+
def tweet():
"""
- Authen and tweet
+ Tweet
"""
t = Twitter(auth=authen())
t.statuses.update(status=g['stuff'])
+def retweet():
+ """
+ ReTweet
+ """
+ t = Twitter(auth=authen())
+ try:
+ id = int(g['stuff'].split()[0])
+ tid = db.rainbow_query(id)[0].tweet_id
+ t.statuses.retweet(id=tid,include_entities=False,trim_user=True)
+ except:
+ print(red('Sorry I can\'t retweet for you.'))
+ sys.stdout.write(g['decorated_name'])
+
+
+def reply():
+ """
+ Reply
+ """
+ t = Twitter(auth=authen())
+ try:
+ id = int(g['stuff'].split()[0])
+ tid = db.rainbow_query(id)[0].tweet_id
+ user = t.statuses.show(id=tid)['user']['screen_name']
+ status = ' '.join(g['stuff'].split()[1:])
+ status = '@' + user + ' ' + status.decode('utf-8')
+ t.statuses.update(status=status, in_reply_to_status_id=tid)
+ except:
+ print(red('Sorry I can\'t understand.'))
+ sys.stdout.write(g['decorated_name'])
+
+
+def delete():
+ """
+ Delete
+ """
+ t = Twitter(auth=authen())
+ try:
+ id = int(g['stuff'].split()[0])
+ tid = db.rainbow_query(id)[0].tweet_id
+ t.statuses.destroy(id=tid)
+ print(green('Okay it\'s gone.'))
+ except:
+ print(red('Sorry I can\'t delete this tweet for you.'))
+ sys.stdout.write(g['decorated_name'])
+
+
def search():
"""
- Authen and search
+ 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],keyword=g['stuff'].strip())
- printNicely(grey('**************************************************************************************\n'))
+ h, w = os.popen('stty size', 'r').read().split()
+ if g['stuff'][0] == '#':
+ rel = t.search.tweets(q=g['stuff'])['statuses']
+ printNicely(grey('*' * int(w) + '\n'))
+ print('Newest', SEARCH_MAX_RECORD, 'tweet: \n')
+ for i in xrange(5):
+ draw(t=rel[i], keyword=g['stuff'].strip())
+ printNicely(grey('*' * int(w) + '\n'))
+ else:
+ print(red('A keyword should be a hashtag (like \'#AKB48\')'))
+ sys.stdout.write(g['decorated_name'])
def friend():
g['friends'] = t.friends.ids()['ids']
for i in g['friends']:
screen_name = t.users.lookup(user_id=i)[0]['screen_name']
- user = cycle_color('@'+screen_name)
+ user = cycle_color('@' + screen_name)
print(user, end=' ')
- print('\n');
+ print('\n')
def follower():
g['followers'] = t.followers.ids()['ids']
for i in g['followers']:
screen_name = t.users.lookup(user_id=i)[0]['screen_name']
- user = cycle_color('@'+screen_name)
+ user = cycle_color('@' + screen_name)
print(user, end=' ')
- print('\n');
+ print('\n')
def help():
"""
- Print help
+ Help
"""
usage = '''
Hi boss! I'm ready to serve you right now!
----------------------------------------------------
- "tweet" at the beginning will tweet immediately
- "s" and follow by any word will search and return 5 newest tweet
- "fr" will list out your following people
- "fl" will list out your followers
- "h" will print this help once again
- "c" will clear the terminal
- "q" will exit
+ "home" will show your timeline. "home 7" will show 7 tweet.
+ "view @bob" will show your friend @bob's home.
+ "t oops" will tweet "oops" immediately.
+ "rt 12345" will retweet to tweet with id "12345".
+ "rep 12345 oops" will reply "oops" to tweet with id "12345".
+ "del 12345" will delete tweet with id "12345".
+ "s #AKB48" will search for "AKB48" and return 5 newest tweet.
+ "fr" will list out your following people.
+ "fl" will list out your followers.
+ "h" will show this help again.
+ "c" will clear the terminal.
+ "q" will exit.
----------------------------------------------------
Have fun and hang tight!
'''
def clear():
"""
- Exit all
+ Clear screen
"""
os.system('clear')
"""
Exit all
"""
+ db.truncate()
os.kill(g['stream_pid'], signal.SIGKILL)
sys.exit()
def process(cmd):
"""
- Process switch by start of line
+ Process switch
"""
return {
- 'tweet' : tweet,
+ 'home' : home,
+ 'view' : view,
+ 't' : tweet,
+ 'rt' : retweet,
+ 'rep' : reply,
+ 'del' : delete,
's' : search,
'fr' : friend,
'fl' : follower,
'h' : help,
'c' : clear,
'q' : quit,
- }.get(cmd,lambda: sys.stdout.write(g['decorated_name']))
+ }.get(cmd, lambda: sys.stdout.write(g['decorated_name']))
def listen(stdin):
# The Logo
ascii_art()
+ g['stuff'] = '1'
+ home()
# These arguments are optional:
stream_args = dict(
timeout=args.timeout,
# Get stream
stream = TwitterStream(
- auth = authen(),
- domain = 'userstream.twitter.com',
+ auth=authen(),
+ domain=DOMAIN,
**stream_args)
tweet_iter = stream.user(**query_args)
Main function
"""
get_decorated_name()
- p = Process(target = stream)
+
+ p = Process(target=stream)
p.start()
g['stream_pid'] = p.pid
listen(sys.stdin)
-