dc714e6f016db4f6c80008af60cdfd1e7a8d06cc
2 Colorful user's timeline stream
4 from __future__
import print_function
5 from multiprocessing
import Process
6 from dateutil
import parser
16 from twitter
.stream
import TwitterStream
, Timeout
, HeartbeatTimeout
, Hangup
17 from twitter
.api
import *
18 from twitter
.oauth
import OAuth
, read_token_file
19 from twitter
.oauth_dance
import oauth_dance
20 from twitter
.util
import printNicely
24 from .interactive
import *
45 def draw(t
, keyword
=None):
52 screen_name
= t
['user']['screen_name']
53 name
= t
['user']['name']
54 created_at
= t
['created_at']
55 date
= parser
.parse(created_at
)
56 date
= date
- datetime
.timedelta(seconds
=time
.timezone
)
57 clock
= date
.strftime('%Y/%m/%d %H:%M:%S')
59 res
= db
.tweet_query(tid
)
62 res
= db
.tweet_query(tid
)
63 rid
= res
[0].rainbow_id
66 user
= cycle_color(name
) + grey(' ' + '@' + screen_name
+ ' ')
67 meta
= grey('[' + clock
+ '] [id=' + str(rid
) + ']')
70 tweet
= map(lambda x
: grey(x
) if x
== 'RT' else x
, tweet
)
71 # Highlight screen_name
72 tweet
= map(lambda x
: cycle_color(x
) if x
[0] == '@' else x
, tweet
)
74 tweet
= map(lambda x
: cyan(x
) if x
[0:7] == 'http://' else x
, tweet
)
75 # Highlight search keyword
78 lambda x
: on_yellow(x
) if
79 ''.join(c
for c
in x
if c
.isalnum()).lower() == keyword
.lower()
83 tweet
= ' '.join(tweet
)
86 line1
= u
"{u:>{uw}}:".format(
90 line2
= u
"{c:>{cw}}".format(
102 def parse_arguments():
106 parser
= argparse
.ArgumentParser(description
=__doc__
or "")
110 help='Timeout for the stream (seconds).')
113 '--heartbeat-timeout',
114 help='Set heartbeat timeout.',
120 help='Set stream to non-blocking.')
124 help='Search the stream for specific text.')
125 return parser
.parse_args()
130 Authenticate with Twitter OAuth
132 # When using rainbow stream you must authorize.
133 twitter_credential
= os
.environ
.get(
137 '')) + os
.sep
+ '.rainbow_oauth'
138 if not os
.path
.exists(twitter_credential
):
139 oauth_dance("Rainbow Stream",
143 oauth_token
, oauth_token_secret
= read_token_file(twitter_credential
)
151 def get_decorated_name():
153 Beginning of every line
155 t
= Twitter(auth
=authen())
156 name
= '@' + t
.account
.verify_credentials()['screen_name']
157 g
['decorated_name'] = grey('[') + grey(name
) + grey(']: ')
164 t
= Twitter(auth
=authen())
166 if g
['stuff'].isdigit():
168 for tweet
in reversed(t
.statuses
.home_timeline(count
=num
)):
177 t
= Twitter(auth
=authen())
178 user
= g
['stuff'].split()[0]
181 num
= int(g
['stuff'].split()[1])
184 for tweet
in reversed(t
.statuses
.user_timeline(count
=num
, screen_name
=user
[1:])):
188 print(red('A name should begin with a \'@\''))
195 t
= Twitter(auth
=authen())
196 t
.statuses
.update(status
=g
['stuff'])
204 t
= Twitter(auth
=authen())
206 id = int(g
['stuff'].split()[0])
207 tid
= db
.rainbow_query(id)[0].tweet_id
208 t
.statuses
.retweet(id=tid
, include_entities
=False, trim_user
=True)
210 print(red('Sorry I can\'t retweet for you.'))
218 t
= Twitter(auth
=authen())
220 id = int(g
['stuff'].split()[0])
221 tid
= db
.rainbow_query(id)[0].tweet_id
222 user
= t
.statuses
.show(id=tid
)['user']['screen_name']
223 status
= ' '.join(g
['stuff'].split()[1:])
224 status
= '@' + user
+ ' ' + status
.decode('utf-8')
225 t
.statuses
.update(status
=status
, in_reply_to_status_id
=tid
)
227 print(red('Sorry I can\'t understand.'))
235 t
= Twitter(auth
=authen())
237 id = int(g
['stuff'].split()[0])
238 tid
= db
.rainbow_query(id)[0].tweet_id
239 t
.statuses
.destroy(id=tid
)
240 print(green('Okay it\'s gone.'))
242 print(red('Sorry I can\'t delete this tweet for you.'))
249 t
= Twitter(auth
=authen())
251 if g
['stuff'][0] == '#':
252 rel
= t
.search
.tweets(q
=g
['stuff'])['statuses']
253 print('Newest', SEARCH_MAX_RECORD
, 'tweet:')
254 for i
in xrange(SEARCH_MAX_RECORD
):
255 draw(t
=rel
[i
], keyword
=g
['stuff'].strip()[1:])
258 print(red('A keyword should be a hashtag (like \'#AKB48\')'))
260 print(red('Sorry I can\'t understand.'))
265 List of friend (following)
267 t
= Twitter(auth
=authen())
268 g
['friends'] = t
.friends
.ids()['ids']
269 for i
in g
['friends']:
270 screen_name
= t
.users
.lookup(user_id
=i
)[0]['screen_name']
271 user
= cycle_color('@' + screen_name
)
280 t
= Twitter(auth
=authen())
281 g
['followers'] = t
.followers
.ids()['ids']
282 for i
in g
['followers']:
283 screen_name
= t
.users
.lookup(user_id
=i
)[0]['screen_name']
284 user
= cycle_color('@' + screen_name
)
294 Hi boss! I'm ready to serve you right now!
295 -------------------------------------------------------------
296 "home" will show your timeline. "home 7" will show 7 tweet.
297 "view @bob" will show your friend @bob's home.
298 "t oops" will tweet "oops" immediately.
299 "rt 12345" will retweet to tweet with id "12345".
300 "rep 12345 oops" will reply "oops" to tweet with id "12345".
301 "del 12345" will delete tweet with id "12345".
302 "s #AKB48" will search for "AKB48" and return 5 newest tweet.
303 "fr" will list out your following people.
304 "fl" will list out your followers.
305 "h" will show this help again.
306 "c" will clear the terminal.
308 -------------------------------------------------------------
309 Have fun and hang tight!
325 os
.system('rm -rf rainbow.db')
326 os
.kill(g
['stream_pid'], signal
.SIGKILL
)
361 init_interactive_shell(cmdset
)
364 if g
['prefix'] and not first
:
365 line
= raw_input(g
['decorated_name'])
369 cmd
= line
.split()[0]
372 # Save cmd to global variable and call process
373 g
['stuff'] = ' '.join(line
.split()[1:])
382 args
= parse_arguments()
386 # These arguments are optional:
388 timeout
=args
.timeout
,
389 block
=not args
.no_block
,
390 heartbeat_timeout
=args
.heartbeat_timeout
)
394 if args
.track_keywords
:
395 query_args
['track'] = args
.track_keywords
398 stream
= TwitterStream(
402 tweet_iter
= stream
.user(**query_args
)
404 # Iterate over the sample stream.
405 for tweet
in tweet_iter
:
407 printNicely("-- None --")
408 elif tweet
is Timeout
:
409 printNicely("-- Timeout --")
410 elif tweet
is HeartbeatTimeout
:
411 printNicely("-- Heartbeat Timeout --")
412 elif tweet
is Hangup
:
413 printNicely("-- Hangup --")
414 elif tweet
.get('text'):
424 p
= Process(target
=stream
)
426 g
['stream_pid'] = p
.pid