from .colors import *
from .config import *
+from .db import *
g = {}
-
+db = RainbowDB()
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)
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 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']
h, w = os.popen('stty size', 'r').read().split()
-
- 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'))
+ 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():
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 print 7 tweet.
+ "view @bob" will show your friend @bob's home.
+ "t oops" will tweet "oops" immediately.
+ "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" or "help" will print this help once again.
+ "c" will clear the terminal.
+ "q" will exit.
----------------------------------------------------
Have fun and hang tight!
'''
def clear():
"""
- Exit all
+ Clear screen
"""
os.system('clear')
def process(cmd):
"""
- Process switch by start of line
+ Process switch
"""
return {
- 'tweet' : tweet,
- 's' : search,
- 'fr' : friend,
- 'fl' : follower,
- 'h' : help,
- 'c' : clear,
- 'q' : quit,
+ 'home': home,
+ 'view': view,
+ 't': tweet,
+ 'rep': reply,
+ 'del': delete,
+ 's': search,
+ 'fr': friend,
+ 'fl': follower,
+ 'h': help,
+ 'help': help,
+ 'c': clear,
+ 'q': quit,
}.get(cmd, lambda: sys.stdout.write(g['decorated_name']))
Main function
"""
get_decorated_name()
+
p = Process(target=stream)
p.start()
g['stream_pid'] = p.pid