f543b35e417ae67912bb3d7b28dbc80300ed5d1a
[rainbowstream.git] / rainbowstream / rainbow.py
1 """
2 Colorful user's timeline stream
3 """
4 from multiprocessing import Process
5
6 import os
7 import os.path
8 import sys
9 import signal
10 import argparse
11 import time
12 import requests
13 import webbrowser
14 import json
15
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
21
22 from .draw import *
23 from .colors import *
24 from .config import *
25 from .consumer import *
26 from .interactive import *
27 from .db import *
28 from .c_image import *
29 from .py3patch import *
30
31
32 g = {}
33 db = RainbowDB()
34 cmdset = [
35 'switch',
36 'trend',
37 'home',
38 'view',
39 'mentions',
40 't',
41 'rt',
42 'quote',
43 'allrt',
44 'fav',
45 'rep',
46 'del',
47 'ufav',
48 's',
49 'mes',
50 'show',
51 'open',
52 'ls',
53 'inbox',
54 'sent',
55 'trash',
56 'whois',
57 'fl',
58 'ufl',
59 'mute',
60 'unmute',
61 'muting',
62 'block',
63 'unblock',
64 'report',
65 'list',
66 'cal',
67 'theme',
68 'h',
69 'c',
70 'q'
71 ]
72
73
74 def parse_arguments():
75 """
76 Parse the arguments
77 """
78 parser = argparse.ArgumentParser(description=__doc__ or "")
79 parser.add_argument(
80 '-to',
81 '--timeout',
82 help='Timeout for the stream (seconds).')
83 parser.add_argument(
84 '-ht',
85 '--heartbeat-timeout',
86 help='Set heartbeat timeout.',
87 default=90)
88 parser.add_argument(
89 '-nb',
90 '--no-block',
91 action='store_true',
92 help='Set stream to non-blocking.')
93 parser.add_argument(
94 '-tt',
95 '--track-keywords',
96 help='Search the stream for specific text.')
97 parser.add_argument(
98 '-fil',
99 '--filter',
100 help='Filter specific screen_name.')
101 parser.add_argument(
102 '-ig',
103 '--ignore',
104 help='Ignore specific screen_name.')
105 parser.add_argument(
106 '-iot',
107 '--image-on-term',
108 action='store_true',
109 help='Display all image on terminal.')
110 return parser.parse_args()
111
112
113 def authen():
114 """
115 Authenticate with Twitter OAuth
116 """
117 # When using rainbow stream you must authorize.
118 twitter_credential = os.environ.get(
119 'HOME',
120 os.environ.get(
121 'USERPROFILE',
122 '')) + os.sep + '.rainbow_oauth'
123 if not os.path.exists(twitter_credential):
124 oauth_dance("Rainbow Stream",
125 CONSUMER_KEY,
126 CONSUMER_SECRET,
127 twitter_credential)
128 oauth_token, oauth_token_secret = read_token_file(twitter_credential)
129 return OAuth(
130 oauth_token,
131 oauth_token_secret,
132 CONSUMER_KEY,
133 CONSUMER_SECRET)
134
135
136 def get_decorated_name():
137 """
138 Beginning of every line
139 """
140 t = Twitter(auth=authen())
141 name = '@' + t.account.verify_credentials()['screen_name']
142 g['original_name'] = name[1:]
143 g['decorated_name'] = color_func(c['DECORATED_NAME'])('[' + name + ']: ')
144
145 files = os.listdir(os.path.dirname(__file__) + '/colorset')
146 themes = [f.split('.')[0] for f in files if f.split('.')[-1] == 'json']
147 g['themes'] = themes
148 db.theme_store(c['THEME'])
149
150
151 def switch():
152 """
153 Switch stream
154 """
155 try:
156 target = g['stuff'].split()[0]
157
158 # Filter and ignore
159 args = parse_arguments()
160 try:
161 if g['stuff'].split()[-1] == '-f':
162 only = raw_input('Only nicks: ')
163 ignore = raw_input('Ignore nicks: ')
164 args.filter = filter(None, only.split(','))
165 args.ignore = filter(None, ignore.split(','))
166 elif g['stuff'].split()[-1] == '-d':
167 args.filter = c['ONLY_LIST']
168 args.ignore = c['IGNORE_LIST']
169 except:
170 printNicely(red('Sorry, wrong format.'))
171 return
172
173 # Public stream
174 if target == 'public':
175 keyword = g['stuff'].split()[1]
176 if keyword[0] == '#':
177 keyword = keyword[1:]
178 # Kill old process
179 os.kill(g['stream_pid'], signal.SIGKILL)
180 args.track_keywords = keyword
181 # Start new process
182 p = Process(
183 target=stream,
184 args=(
185 c['PUBLIC_DOMAIN'],
186 args))
187 p.start()
188 g['stream_pid'] = p.pid
189
190 # Personal stream
191 elif target == 'mine':
192 # Kill old process
193 os.kill(g['stream_pid'], signal.SIGKILL)
194 # Start new process
195 p = Process(
196 target=stream,
197 args=(
198 c['USER_DOMAIN'],
199 args,
200 g['original_name']))
201 p.start()
202 g['stream_pid'] = p.pid
203 printNicely('')
204 if args.filter:
205 printNicely(cyan('Only: ' + str(args.filter)))
206 if args.ignore:
207 printNicely(red('Ignore: ' + str(args.ignore)))
208 printNicely('')
209 except:
210 printNicely(red('Sorry I can\'t understand.'))
211
212
213 def trend():
214 """
215 Trend
216 """
217 t = Twitter(auth=authen())
218 # Get country and town
219 try:
220 country = g['stuff'].split()[0]
221 except:
222 country = ''
223 try:
224 town = g['stuff'].split()[1]
225 except:
226 town = ''
227
228 avail = t.trends.available()
229 # World wide
230 if not country:
231 trends = t.trends.place(_id=1)[0]['trends']
232 print_trends(trends)
233 else:
234 for location in avail:
235 # Search for country and Town
236 if town:
237 if location['countryCode'] == country \
238 and location['placeType']['name'] == 'Town' \
239 and location['name'] == town:
240 trends = t.trends.place(_id=location['woeid'])[0]['trends']
241 print_trends(trends)
242 # Search for country only
243 else:
244 if location['countryCode'] == country \
245 and location['placeType']['name'] == 'Country':
246 trends = t.trends.place(_id=location['woeid'])[0]['trends']
247 print_trends(trends)
248
249
250 def home():
251 """
252 Home
253 """
254 t = Twitter(auth=authen())
255 num = c['HOME_TWEET_NUM']
256 if g['stuff'].isdigit():
257 num = int(g['stuff'])
258 for tweet in reversed(t.statuses.home_timeline(count=num)):
259 draw(t=tweet, iot=g['iot'])
260 printNicely('')
261
262
263 def view():
264 """
265 Friend view
266 """
267 t = Twitter(auth=authen())
268 user = g['stuff'].split()[0]
269 if user[0] == '@':
270 try:
271 num = int(g['stuff'].split()[1])
272 except:
273 num = c['HOME_TWEET_NUM']
274 for tweet in reversed(t.statuses.user_timeline(count=num, screen_name=user[1:])):
275 draw(t=tweet, iot=g['iot'])
276 printNicely('')
277 else:
278 printNicely(red('A name should begin with a \'@\''))
279
280
281 def mentions():
282 """
283 Mentions timeline
284 """
285 t = Twitter(auth=authen())
286 num = c['HOME_TWEET_NUM']
287 if g['stuff'].isdigit():
288 num = int(g['stuff'])
289 for tweet in reversed(t.statuses.mentions_timeline(count=num)):
290 draw(t=tweet, iot=g['iot'])
291 printNicely('')
292
293
294 def tweet():
295 """
296 Tweet
297 """
298 t = Twitter(auth=authen())
299 t.statuses.update(status=g['stuff'])
300
301
302 def retweet():
303 """
304 ReTweet
305 """
306 t = Twitter(auth=authen())
307 try:
308 id = int(g['stuff'].split()[0])
309 except:
310 printNicely(red('Sorry I can\'t understand.'))
311 return
312 tid = db.rainbow_to_tweet_query(id)[0].tweet_id
313 t.statuses.retweet(id=tid, include_entities=False, trim_user=True)
314
315
316 def quote():
317 """
318 Quote a tweet
319 """
320 t = Twitter(auth=authen())
321 try:
322 id = int(g['stuff'].split()[0])
323 except:
324 printNicely(red('Sorry I can\'t understand.'))
325 return
326 tid = db.rainbow_to_tweet_query(id)[0].tweet_id
327 tweet = t.statuses.show(id=tid)
328 screen_name = tweet['user']['screen_name']
329 text = tweet['text']
330 quote = '\"@' + screen_name + ': ' + text + '\"'
331 quote = quote.encode('utf8')
332 notice = light_magenta('Compose mode ')
333 notice += light_yellow('(Enter nothing will cancel the quote)')
334 notice += light_magenta(':')
335 printNicely(notice)
336 extra = raw_input(quote)
337 if extra:
338 t.statuses.update(status=quote + extra)
339 else:
340 printNicely(light_magenta('No text added.'))
341
342
343 def allretweet():
344 """
345 List all retweet
346 """
347 t = Twitter(auth=authen())
348 # Get rainbow id
349 try:
350 id = int(g['stuff'].split()[0])
351 except:
352 printNicely(red('Sorry I can\'t understand.'))
353 return
354 tid = db.rainbow_to_tweet_query(id)[0].tweet_id
355 # Get display num if exist
356 try:
357 num = int(g['stuff'].split()[1])
358 except:
359 num = c['RETWEETS_SHOW_NUM']
360 # Get result and display
361 rt_ary = t.statuses.retweets(id=tid, count=num)
362 if not rt_ary:
363 printNicely(magenta('This tweet has no retweet.'))
364 return
365 for tweet in reversed(rt_ary):
366 draw(t=tweet, iot=g['iot'])
367 printNicely('')
368
369
370 def favorite():
371 """
372 Favorite
373 """
374 t = Twitter(auth=authen())
375 try:
376 id = int(g['stuff'].split()[0])
377 except:
378 printNicely(red('Sorry I can\'t understand.'))
379 return
380 tid = db.rainbow_to_tweet_query(id)[0].tweet_id
381 t.favorites.create(_id=tid, include_entities=False)
382 printNicely(green('Favorited.'))
383 draw(t.statuses.show(id=tid), iot=g['iot'])
384 printNicely('')
385
386
387 def reply():
388 """
389 Reply
390 """
391 t = Twitter(auth=authen())
392 try:
393 id = int(g['stuff'].split()[0])
394 except:
395 printNicely(red('Sorry I can\'t understand.'))
396 return
397 tid = db.rainbow_to_tweet_query(id)[0].tweet_id
398 user = t.statuses.show(id=tid)['user']['screen_name']
399 status = ' '.join(g['stuff'].split()[1:])
400 status = '@' + user + ' ' + status.decode('utf-8')
401 t.statuses.update(status=status, in_reply_to_status_id=tid)
402
403
404 def delete():
405 """
406 Delete
407 """
408 t = Twitter(auth=authen())
409 try:
410 rid = int(g['stuff'].split()[0])
411 except:
412 printNicely(red('Sorry I can\'t understand.'))
413 return
414 tid = db.rainbow_to_tweet_query(rid)[0].tweet_id
415 t.statuses.destroy(id=tid)
416 printNicely(green('Okay it\'s gone.'))
417
418
419 def unfavorite():
420 """
421 Unfavorite
422 """
423 t = Twitter(auth=authen())
424 try:
425 id = int(g['stuff'].split()[0])
426 except:
427 printNicely(red('Sorry I can\'t understand.'))
428 return
429 tid = db.rainbow_to_tweet_query(id)[0].tweet_id
430 t.favorites.destroy(_id=tid)
431 printNicely(green('Okay it\'s unfavorited.'))
432 draw(t.statuses.show(id=tid), iot=g['iot'])
433 printNicely('')
434
435
436 def search():
437 """
438 Search
439 """
440 t = Twitter(auth=authen())
441 if g['stuff'].startswith('#'):
442 rel = t.search.tweets(q=g['stuff'])['statuses']
443 if rel:
444 printNicely('Newest tweets:')
445 for i in reversed(xrange(c['SEARCH_MAX_RECORD'])):
446 draw(t=rel[i],
447 iot=g['iot'],
448 keyword=g['stuff'].strip()[1:])
449 printNicely('')
450 else:
451 printNicely(magenta('I\'m afraid there is no result'))
452 else:
453 printNicely(red('A keyword should be a hashtag (like \'#AKB48\')'))
454
455
456 def message():
457 """
458 Send a direct message
459 """
460 t = Twitter(auth=authen())
461 user = g['stuff'].split()[0]
462 if user[0].startswith('@'):
463 try:
464 content = g['stuff'].split()[1]
465 except:
466 printNicely(red('Sorry I can\'t understand.'))
467 t.direct_messages.new(
468 screen_name=user[1:],
469 text=content
470 )
471 printNicely(green('Message sent.'))
472 else:
473 printNicely(red('A name should begin with a \'@\''))
474
475
476 def show():
477 """
478 Show image
479 """
480 t = Twitter(auth=authen())
481 try:
482 target = g['stuff'].split()[0]
483 if target != 'image':
484 return
485 id = int(g['stuff'].split()[1])
486 tid = db.rainbow_to_tweet_query(id)[0].tweet_id
487 tweet = t.statuses.show(id=tid)
488 media = tweet['entities']['media']
489 for m in media:
490 res = requests.get(m['media_url'])
491 img = Image.open(BytesIO(res.content))
492 img.show()
493 except:
494 printNicely(red('Sorry I can\'t show this image.'))
495
496
497 def urlopen():
498 """
499 Open url
500 """
501 t = Twitter(auth=authen())
502 try:
503 if not g['stuff'].isdigit():
504 return
505 tid = db.rainbow_to_tweet_query(g['stuff'])[0].tweet_id
506 tweet = t.statuses.show(id=tid)
507 link_ary = [
508 u for u in tweet['text'].split() if u.startswith('http://')]
509 if not link_ary:
510 printNicely(light_magenta('No url here @.@!'))
511 return
512 for link in link_ary:
513 webbrowser.open(link)
514 except:
515 printNicely(red('Sorry I can\'t open url in this tweet.'))
516
517
518 def ls():
519 """
520 List friends for followers
521 """
522 t = Twitter(auth=authen())
523 # Get name
524 try:
525 name = g['stuff'].split()[1]
526 if name.startswith('@'):
527 name = name[1:]
528 else:
529 printNicely(red('A name should begin with a \'@\''))
530 raise Exception('Invalid name')
531 except:
532 name = g['original_name']
533 # Get list followers or friends
534 try:
535 target = g['stuff'].split()[0]
536 except:
537 printNicely(red('Omg some syntax is wrong.'))
538 # Init cursor
539 d = {'fl': 'followers', 'fr': 'friends'}
540 next_cursor = -1
541 rel = {}
542 # Cursor loop
543 while next_cursor != 0:
544 list = getattr(t, d[target]).list(
545 screen_name=name,
546 cursor=next_cursor,
547 skip_status=True,
548 include_entities=False,
549 )
550 for u in list['users']:
551 rel[u['name']] = '@' + u['screen_name']
552 next_cursor = list['next_cursor']
553 # Print out result
554 printNicely('All: ' + str(len(rel)) + ' ' + d[target] + '.')
555 for name in rel:
556 user = ' ' + cycle_color(name)
557 user += color_func(c['TWEET']['nick'])(' ' + rel[name] + ' ')
558 printNicely(user)
559
560
561 def inbox():
562 """
563 Inbox direct messages
564 """
565 t = Twitter(auth=authen())
566 num = c['MESSAGES_DISPLAY']
567 rel = []
568 if g['stuff'].isdigit():
569 num = g['stuff']
570 cur_page = 1
571 # Max message per page is 20 so we have to loop
572 while num > 20:
573 rel = rel + t.direct_messages(
574 count=20,
575 page=cur_page,
576 include_entities=False,
577 skip_status=False
578 )
579 num -= 20
580 cur_page += 1
581 rel = rel + t.direct_messages(
582 count=num,
583 page=cur_page,
584 include_entities=False,
585 skip_status=False
586 )
587 # Display
588 printNicely('Inbox: newest ' + str(len(rel)) + ' messages.')
589 for m in reversed(rel):
590 print_message(m)
591 printNicely('')
592
593
594 def sent():
595 """
596 Sent direct messages
597 """
598 t = Twitter(auth=authen())
599 num = c['MESSAGES_DISPLAY']
600 rel = []
601 if g['stuff'].isdigit():
602 num = int(g['stuff'])
603 cur_page = 1
604 # Max message per page is 20 so we have to loop
605 while num > 20:
606 rel = rel + t.direct_messages.sent(
607 count=20,
608 page=cur_page,
609 include_entities=False,
610 skip_status=False
611 )
612 num -= 20
613 cur_page += 1
614 rel = rel + t.direct_messages.sent(
615 count=num,
616 page=cur_page,
617 include_entities=False,
618 skip_status=False
619 )
620 # Display
621 printNicely('Sent: newest ' + str(len(rel)) + ' messages.')
622 for m in reversed(rel):
623 print_message(m)
624 printNicely('')
625
626
627 def trash():
628 """
629 Remove message
630 """
631 t = Twitter(auth=authen())
632 try:
633 rid = int(g['stuff'].split()[0])
634 except:
635 printNicely(red('Sorry I can\'t understand.'))
636 mid = db.rainbow_to_message_query(rid)[0].message_id
637 t.direct_messages.destroy(id=mid)
638 printNicely(green('Message deleted.'))
639
640
641 def whois():
642 """
643 Show profile of a specific user
644 """
645 t = Twitter(auth=authen())
646 screen_name = g['stuff'].split()[0]
647 if screen_name.startswith('@'):
648 try:
649 user = t.users.show(
650 screen_name=screen_name[1:],
651 include_entities=False)
652 show_profile(user, g['iot'])
653 except:
654 printNicely(red('Omg no user.'))
655 else:
656 printNicely(red('A name should begin with a \'@\''))
657
658
659 def follow():
660 """
661 Follow a user
662 """
663 t = Twitter(auth=authen())
664 screen_name = g['stuff'].split()[0]
665 if screen_name.startswith('@'):
666 t.friendships.create(screen_name=screen_name[1:], follow=True)
667 printNicely(green('You are following ' + screen_name + ' now!'))
668 else:
669 printNicely(red('A name should begin with a \'@\''))
670
671
672 def unfollow():
673 """
674 Unfollow a user
675 """
676 t = Twitter(auth=authen())
677 screen_name = g['stuff'].split()[0]
678 if screen_name.startswith('@'):
679 t.friendships.destroy(
680 screen_name=screen_name[1:],
681 include_entities=False)
682 printNicely(green('Unfollow ' + screen_name + ' success!'))
683 else:
684 printNicely(red('A name should begin with a \'@\''))
685
686
687 def mute():
688 """
689 Mute a user
690 """
691 t = Twitter(auth=authen())
692 try:
693 screen_name = g['stuff'].split()[0]
694 except:
695 printNicely(red('A name should be specified. '))
696 return
697 if screen_name.startswith('@'):
698 rel = t.mutes.users.create(screen_name=screen_name[1:])
699 if isinstance(rel, dict):
700 printNicely(green(screen_name + ' is muted.'))
701 else:
702 printNicely(red(rel))
703 else:
704 printNicely(red('A name should begin with a \'@\''))
705
706
707 def unmute():
708 """
709 Unmute a user
710 """
711 t = Twitter(auth=authen())
712 try:
713 screen_name = g['stuff'].split()[0]
714 except:
715 printNicely(red('A name should be specified. '))
716 return
717 if screen_name.startswith('@'):
718 rel = t.mutes.users.destroy(screen_name=screen_name[1:])
719 if isinstance(rel, dict):
720 printNicely(green(screen_name + ' is unmuted.'))
721 else:
722 printNicely(red(rel))
723 else:
724 printNicely(red('A name should begin with a \'@\''))
725
726
727 def muting():
728 """
729 List muting user
730 """
731 t = Twitter(auth=authen())
732 # Init cursor
733 next_cursor = -1
734 rel = {}
735 # Cursor loop
736 while next_cursor != 0:
737 list = t.mutes.users.list(
738 screen_name=g['original_name'],
739 cursor=next_cursor,
740 skip_status=True,
741 include_entities=False,
742 )
743 for u in list['users']:
744 rel[u['name']] = '@' + u['screen_name']
745 next_cursor = list['next_cursor']
746 # Print out result
747 printNicely('All: ' + str(len(rel)) + ' people.')
748 for name in rel:
749 user = ' ' + cycle_color(name)
750 user += color_func(c['TWEET']['nick'])(' ' + rel[name] + ' ')
751 printNicely(user)
752
753
754 def block():
755 """
756 Block a user
757 """
758 t = Twitter(auth=authen())
759 screen_name = g['stuff'].split()[0]
760 if screen_name.startswith('@'):
761 t.blocks.create(
762 screen_name=screen_name[1:],
763 include_entities=False,
764 skip_status=True)
765 printNicely(green('You blocked ' + screen_name + '.'))
766 else:
767 printNicely(red('A name should begin with a \'@\''))
768
769
770 def unblock():
771 """
772 Unblock a user
773 """
774 t = Twitter(auth=authen())
775 screen_name = g['stuff'].split()[0]
776 if screen_name.startswith('@'):
777 t.blocks.destroy(
778 screen_name=screen_name[1:],
779 include_entities=False,
780 skip_status=True)
781 printNicely(green('Unblock ' + screen_name + ' success!'))
782 else:
783 printNicely(red('A name should begin with a \'@\''))
784
785
786 def report():
787 """
788 Report a user as a spam account
789 """
790 t = Twitter(auth=authen())
791 screen_name = g['stuff'].split()[0]
792 if screen_name.startswith('@'):
793 t.users.report_spam(
794 screen_name=screen_name[1:])
795 printNicely(green('You reported ' + screen_name + '.'))
796 else:
797 printNicely(red('Sorry I can\'t understand.'))
798
799
800 def show_lists(t):
801 """
802 List list
803 """
804 rel = t.lists.list(screen_name=g['original_name'])
805 if rel:
806 print_list(rel)
807 else:
808 printNicely(light_magenta('You belong to no lists :)'))
809
810
811 def list_home(t):
812 """
813 List home
814 """
815 # Get list name
816 list_name = raw_input(light_magenta('Give me the list\'s name: '))
817 # Get list name and owner
818 try:
819 owner, slug = list_name.split('/')
820 if slug.startswith('@'):
821 slug = slug[1:]
822 except:
823 printNicely(light_magenta('Please follow "@owner/list_name" format.'))
824 return
825 res = t.lists.statuses(
826 slug=slug,
827 owner_screen_name=owner,
828 count=c['LIST_MAX'],
829 include_entities=False)
830 for tweet in res:
831 draw(t=tweet)
832 printNicely('')
833
834
835 def list_members(t):
836 """
837 List members
838 """
839 # Get list name
840 list_name = raw_input(light_magenta('Give me the list\'s name: '))
841 # Get list name and owner
842 try:
843 owner, slug = list_name.split('/')
844 if slug.startswith('@'):
845 slug = slug[1:]
846 except:
847 printNicely(light_magenta('Please follow "@owner/list_name" format.'))
848 return
849 # Get members
850 rel = {}
851 next_cursor = -1
852 while next_cursor != 0:
853 m = t.lists.members(
854 slug=slug,
855 owner_screen_name=owner,
856 cursor=next_cursor,
857 include_entities=False)
858 for u in m['users']:
859 rel[u['name']] = '@' + u['screen_name']
860 next_cursor = m['next_cursor']
861 printNicely('All: ' + str(len(rel)) + ' members.')
862 for name in rel:
863 user = ' ' + cycle_color(name)
864 user += color_func(c['TWEET']['nick'])(' ' + rel[name] + ' ')
865 printNicely(user)
866
867
868 def list_subscribers(t):
869 """
870 List subscribers
871 """
872 # Get list name
873 list_name = raw_input(light_magenta('Give me the list\'s name: '))
874 # Get list name and owner
875 try:
876 owner, slug = list_name.split('/')
877 if slug.startswith('@'):
878 slug = slug[1:]
879 except:
880 printNicely(light_magenta('Please follow "@owner/list_name" format.'))
881 return
882 # Get subscribers
883 rel = {}
884 next_cursor = -1
885 while next_cursor != 0:
886 m = t.lists.subscribers(
887 slug=slug,
888 owner_screen_name=owner,
889 cursor=next_cursor,
890 include_entities=False)
891 for u in m['users']:
892 rel[u['name']] = '@' + u['screen_name']
893 next_cursor = m['next_cursor']
894 printNicely('All: ' + str(len(rel)) + ' subscribers.')
895 for name in rel:
896 user = ' ' + cycle_color(name)
897 user += color_func(c['TWEET']['nick'])(' ' + rel[name] + ' ')
898 printNicely(user)
899
900
901 def list_add(t):
902 """
903 Add specific user to a list
904 """
905 # Get list name
906 list_name = raw_input(light_magenta('Give me the list\'s name: '))
907 # Get list name and owner
908 try:
909 owner, slug = list_name.split('/')
910 if slug.startswith('@'):
911 slug = slug[1:]
912 except:
913 printNicely(light_magenta('Please follow "@owner/list_name" format.'))
914 return
915 # Add
916 user_name = raw_input(light_magenta('Give me name of the newbie: '))
917 if user_name.startswith('@'):
918 user_name = user_name[1:]
919 try:
920 t.lists.members.create(
921 slug=slug,
922 owner_screen_name=owner,
923 screen_name=user_name)
924 printNicely(light_green('Added.'))
925 except:
926 printNicely(light_magenta('I\'m sorry we can not add him/her.'))
927
928
929 def list_remove(t):
930 """
931 Remove specific user from a list
932 """
933 # Get list name
934 list_name = raw_input(light_magenta('Give me the list\'s name: '))
935 # Get list name and owner
936 try:
937 owner, slug = list_name.split('/')
938 if slug.startswith('@'):
939 slug = slug[1:]
940 except:
941 printNicely(light_magenta('Please follow "@owner/list_name" format.'))
942 return
943 # Remove
944 user_name = raw_input(light_magenta('Give me name of the unlucky one: '))
945 if user_name.startswith('@'):
946 user_name = user_name[1:]
947 try:
948 t.lists.members.destroy(
949 slug=slug,
950 owner_screen_name=owner,
951 screen_name=user_name)
952 printNicely(light_green('Gone.'))
953 except:
954 printNicely(light_magenta('I\'m sorry we can not remove him/her.'))
955
956
957 def list_subscribe(t):
958 """
959 Subscribe to a list
960 """
961 # Get list name
962 list_name = raw_input(light_magenta('Give me the list\'s name: '))
963 # Get list name and owner
964 try:
965 owner, slug = list_name.split('/')
966 if slug.startswith('@'):
967 slug = slug[1:]
968 except:
969 printNicely(light_magenta('Please follow "@owner/list_name" format.'))
970 return
971 # Subscribe
972 try:
973 t.lists.subscribers.create(
974 slug=slug,
975 owner_screen_name=owner)
976 printNicely(light_green('Done.'))
977 except:
978 printNicely(
979 light_magenta('I\'m sorry you can not subscribe to this list.'))
980
981
982 def list_unsubscribe(t):
983 """
984 Unsubscribe a list
985 """
986 # Get list name
987 list_name = raw_input(light_magenta('Give me the list\'s name: '))
988 # Get list name and owner
989 try:
990 owner, slug = list_name.split('/')
991 if slug.startswith('@'):
992 slug = slug[1:]
993 except:
994 printNicely(light_magenta('Please follow "@owner/list_name" format.'))
995 return
996 # Subscribe
997 try:
998 t.lists.subscribers.destroy(
999 slug=slug,
1000 owner_screen_name=owner)
1001 printNicely(light_green('Done.'))
1002 except:
1003 printNicely(
1004 light_magenta('I\'m sorry you can not unsubscribe to this list.'))
1005
1006
1007 def list_own(t):
1008 """
1009 List own
1010 """
1011 rel = []
1012 next_cursor = -1
1013 while next_cursor != 0:
1014 res = t.lists.ownerships(
1015 screen_name=g['original_name'],
1016 cursor=next_cursor)
1017 rel += res['lists']
1018 next_cursor = res['next_cursor']
1019 if rel:
1020 print_list(rel)
1021 else:
1022 printNicely(light_magenta('You own no lists :)'))
1023
1024
1025 def list_new(t):
1026 """
1027 Create a new list
1028 """
1029 name = raw_input(light_magenta('New list\'s name: '))
1030 mode = raw_input(light_magenta('New list\'s mode (public/private): '))
1031 description = raw_input(light_magenta('New list\'s description: '))
1032 try:
1033 t.lists.create(
1034 name=name,
1035 mode=mode,
1036 description=description)
1037 printNicely(light_green(name + ' list is created.'))
1038 except:
1039 printNicely(red('Oops something is wrong with Twitter :('))
1040
1041
1042 def list_update(t):
1043 """
1044 Update a list
1045 """
1046 slug = raw_input(light_magenta('Your list that you want to update: '))
1047 name = raw_input(light_magenta('Update name (leave blank to unchange): '))
1048 mode = raw_input(light_magenta('Update mode (public/private): '))
1049 description = raw_input(light_magenta('Update description: '))
1050 try:
1051 if name:
1052 t.lists.update(
1053 slug='-'.join(slug.split()),
1054 owner_screen_name=g['original_name'],
1055 name=name,
1056 mode=mode,
1057 description=description)
1058 else:
1059 t.lists.update(
1060 slug=slug,
1061 owner_screen_name=g['original_name'],
1062 mode=mode,
1063 description=description)
1064 printNicely(light_green(slug + ' list is updated.'))
1065 except:
1066 printNicely(red('Oops something is wrong with Twitter :('))
1067
1068
1069 def list_delete(t):
1070 """
1071 Delete a list
1072 """
1073 slug = raw_input(light_magenta('Your list that you want to update: '))
1074 try:
1075 t.lists.destroy(
1076 slug='-'.join(slug.split()),
1077 owner_screen_name=g['original_name'])
1078 printNicely(light_green(slug + ' list is deleted.'))
1079 except:
1080 printNicely(red('Oops something is wrong with Twitter :('))
1081
1082
1083 def list():
1084 """
1085 Twitter's list
1086 """
1087 t = Twitter(auth=authen())
1088 # List all lists or base on action
1089 try:
1090 g['list_action'] = g['stuff'].split()[0]
1091 except:
1092 show_lists(t)
1093 return
1094 # Sub-function
1095 action_ary = {
1096 'home': list_home,
1097 'all_mem': list_members,
1098 'all_sub': list_subscribers,
1099 'add': list_add,
1100 'rm': list_remove,
1101 'sub': list_subscribe,
1102 'unsub': list_unsubscribe,
1103 'own': list_own,
1104 'new': list_new,
1105 'update': list_update,
1106 'del': list_delete,
1107 }
1108 try:
1109 return action_ary[g['list_action']](t)
1110 except:
1111 printNicely(red('Sorry I can\'t understand.'))
1112
1113
1114 def cal():
1115 """
1116 Unix's command `cal`
1117 """
1118 # Format
1119 rel = os.popen('cal').read().split('\n')
1120 month = rel.pop(0)
1121 date = rel.pop(0)
1122 show_calendar(month, date, rel)
1123
1124
1125 def theme():
1126 """
1127 List and change theme
1128 """
1129 if not g['stuff']:
1130 # List themes
1131 for theme in g['themes']:
1132 line = light_magenta(theme)
1133 if c['THEME'] == theme:
1134 line = ' ' * 2 + light_yellow('* ') + line
1135 else:
1136 line = ' ' * 4 + line
1137 printNicely(line)
1138 elif g['stuff'] == 'current_as_default':
1139 # Set as default
1140 def fixup(adict, k, v):
1141 for key in adict.keys():
1142 if key == k:
1143 adict[key] = v
1144 elif type(adict[key]) is dict:
1145 fixup(adict[key], k, v)
1146 # Modify
1147 path = os.environ.get(
1148 'HOME',
1149 os.environ.get(
1150 'USERPROFILE',
1151 '')) + os.sep + '.rainbow_config.json'
1152 data = load_config(rainbow_config)
1153 fixup(data, 'THEME', c['THEME'])
1154 # Save
1155 with open(path, 'w') as out:
1156 json.dump(data, out, indent = 4)
1157 os.system('chmod 777 ' + path)
1158 printNicely(light_green('Okay it will be applied from next time :)'))
1159 else:
1160 # Change theme
1161 try:
1162 # Load new config
1163 if g['stuff'] != 'custom':
1164 new_config = os.path.dirname(
1165 __file__) + '/colorset/' + g['stuff'] + '.json'
1166 else:
1167 new_config = os.environ.get(
1168 'HOME', os.environ.get(
1169 'USERPROFILE',
1170 '')) + os.sep + '.rainbow_config.json'
1171 new_config = load_config(new_config)
1172 if new_config:
1173 for nc in new_config:
1174 c[nc] = new_config[nc]
1175 # Update db and reset colors
1176 db.theme_update(g['stuff'])
1177 c['THEME'] = g['stuff']
1178 reset_cycle()
1179 g['decorated_name'] = color_func(
1180 c['DECORATED_NAME'])(
1181 '[@' + g['original_name'] + ']: ')
1182 printNicely(green('Theme changed.'))
1183 except:
1184 printNicely(red('No such theme exists.'))
1185
1186
1187 def help_discover():
1188 """
1189 Discover the world
1190 """
1191 s = ' ' * 2
1192 # Discover the world
1193 usage = '\n'
1194 usage += s + grey(u'\u266A' + ' Discover the world \n')
1195 usage += s * 2 + light_green('trend') + ' will show global trending topics. ' + \
1196 'You can try ' + light_green('trend US') + ' or ' + \
1197 light_green('trend JP Tokyo') + '.\n'
1198 usage += s * 2 + light_green('home') + ' will show your timeline. ' + \
1199 light_green('home 7') + ' will show 7 tweets.\n'
1200 usage += s * 2 + light_green('mentions') + ' will show mentions timeline. ' + \
1201 light_green('mentions 7') + ' will show 7 mention tweets.\n'
1202 usage += s * 2 + light_green('whois @mdo') + ' will show profile of ' + \
1203 magenta('@mdo') + '.\n'
1204 usage += s * 2 + light_green('view @mdo') + \
1205 ' will show ' + magenta('@mdo') + '\'s home.\n'
1206 usage += s * 2 + light_green('s #AKB48') + ' will search for "' + \
1207 light_yellow('AKB48') + '" and return 5 newest tweet.\n'
1208 printNicely(usage)
1209
1210
1211 def help_tweets():
1212 """
1213 Tweets
1214 """
1215 s = ' ' * 2
1216 # Tweet
1217 usage = '\n'
1218 usage += s + grey(u'\u266A' + ' Tweets \n')
1219 usage += s * 2 + light_green('t oops ') + \
1220 'will tweet "' + light_yellow('oops') + '" immediately.\n'
1221 usage += s * 2 + \
1222 light_green('rt 12 ') + ' will retweet to tweet with ' + \
1223 light_yellow('[id=12]') + '.\n'
1224 usage += s * 2 + \
1225 light_green('quote 12 ') + ' will quote the tweet with ' + \
1226 light_yellow('[id=12]') + '. If no extra text is added, ' + \
1227 'the quote will be canceled.\n'
1228 usage += s * 2 + \
1229 light_green('allrt 12 20 ') + ' will list 20 newest retweet of the tweet with ' + \
1230 light_yellow('[id=12]') + '.\n'
1231 usage += s * 2 + light_green('rep 12 oops') + ' will reply "' + \
1232 light_yellow('oops') + '" to tweet with ' + \
1233 light_yellow('[id=12]') + '.\n'
1234 usage += s * 2 + \
1235 light_green('fav 12 ') + ' will favorite the tweet with ' + \
1236 light_yellow('[id=12]') + '.\n'
1237 usage += s * 2 + \
1238 light_green('ufav 12 ') + ' will unfavorite tweet with ' + \
1239 light_yellow('[id=12]') + '.\n'
1240 usage += s * 2 + \
1241 light_green('del 12 ') + ' will delete tweet with ' + \
1242 light_yellow('[id=12]') + '.\n'
1243 usage += s * 2 + light_green('show image 12') + ' will show image in tweet with ' + \
1244 light_yellow('[id=12]') + ' in your OS\'s image viewer.\n'
1245 usage += s * 2 + light_green('open 12') + ' will open url in tweet with ' + \
1246 light_yellow('[id=12]') + ' in your OS\'s default browser.\n'
1247 printNicely(usage)
1248
1249
1250 def help_messages():
1251 """
1252 Messages
1253 """
1254 s = ' ' * 2
1255 # Direct message
1256 usage = '\n'
1257 usage += s + grey(u'\u266A' + ' Direct messages \n')
1258 usage += s * 2 + light_green('inbox') + ' will show inbox messages. ' + \
1259 light_green('inbox 7') + ' will show newest 7 messages.\n'
1260 usage += s * 2 + light_green('sent') + ' will show sent messages. ' + \
1261 light_green('sent 7') + ' will show newest 7 messages.\n'
1262 usage += s * 2 + light_green('mes @dtvd88 hi') + ' will send a "hi" messege to ' + \
1263 magenta('@dtvd88') + '.\n'
1264 usage += s * 2 + light_green('trash 5') + ' will remove message with ' + \
1265 light_yellow('[message_id=5]') + '.\n'
1266 printNicely(usage)
1267
1268
1269 def help_friends_and_followers():
1270 """
1271 Friends and Followers
1272 """
1273 s = ' ' * 2
1274 # Follower and following
1275 usage = '\n'
1276 usage += s + grey(u'\u266A' + ' Friends and followers \n')
1277 usage += s * 2 + \
1278 light_green('ls fl') + \
1279 ' will list all followers (people who are following you).\n'
1280 usage += s * 2 + \
1281 light_green('ls fr') + \
1282 ' will list all friends (people who you are following).\n'
1283 usage += s * 2 + light_green('fl @dtvd88') + ' will follow ' + \
1284 magenta('@dtvd88') + '.\n'
1285 usage += s * 2 + light_green('ufl @dtvd88') + ' will unfollow ' + \
1286 magenta('@dtvd88') + '.\n'
1287 usage += s * 2 + light_green('mute @dtvd88') + ' will mute ' + \
1288 magenta('@dtvd88') + '.\n'
1289 usage += s * 2 + light_green('unmute @dtvd88') + ' will unmute ' + \
1290 magenta('@dtvd88') + '.\n'
1291 usage += s * 2 + light_green('muting') + ' will list muting users.\n'
1292 usage += s * 2 + light_green('block @dtvd88') + ' will block ' + \
1293 magenta('@dtvd88') + '.\n'
1294 usage += s * 2 + light_green('unblock @dtvd88') + ' will unblock ' + \
1295 magenta('@dtvd88') + '.\n'
1296 usage += s * 2 + light_green('report @dtvd88') + ' will report ' + \
1297 magenta('@dtvd88') + ' as a spam account.\n'
1298 printNicely(usage)
1299
1300
1301 def help_list():
1302 """
1303 Lists
1304 """
1305 s = ' ' * 2
1306 # Twitter list
1307 usage = '\n'
1308 usage += s + grey(u'\u266A' + ' Twitter list\n')
1309 usage += s * 2 + light_green('list') + \
1310 ' will show all lists you are belong to.\n'
1311 usage += s * 2 + light_green('list home') + \
1312 ' will show timeline of list. You will be asked for list\'s name.\n'
1313 usage += s * 2 + light_green('list all_mem') + \
1314 ' will show list\'s all members.\n'
1315 usage += s * 2 + light_green('list all_sub') + \
1316 ' will show list\'s all subscribers.\n'
1317 usage += s * 2 + light_green('list add') + \
1318 ' will add specific person to a list owned by you.' + \
1319 ' You will be asked for list\'s name and person\'s name.\n'
1320 usage += s * 2 + light_green('list rm') + \
1321 ' will remove specific person from a list owned by you.' + \
1322 ' You will be asked for list\'s name and person\'s name.\n'
1323 usage += s * 2 + light_green('list sub') + \
1324 ' will subscribe you to a specific list.\n'
1325 usage += s * 2 + light_green('list unsub') + \
1326 ' will unsubscribe you from a specific list.\n'
1327 usage += s * 2 + light_green('list own') + \
1328 ' will show all list owned by you.\n'
1329 usage += s * 2 + light_green('list new') + \
1330 ' will create a new list.\n'
1331 usage += s * 2 + light_green('list update') + \
1332 ' will update a list owned by you.\n'
1333 usage += s * 2 + light_green('list del') + \
1334 ' will delete a list owned by you.\n'
1335 printNicely(usage)
1336
1337
1338 def help_stream():
1339 """
1340 Stream switch
1341 """
1342 s = ' ' * 2
1343 # Switch
1344 usage = '\n'
1345 usage += s + grey(u'\u266A' + ' Switching streams \n')
1346 usage += s * 2 + light_green('switch public #AKB') + \
1347 ' will switch to public stream and follow "' + \
1348 light_yellow('AKB') + '" keyword.\n'
1349 usage += s * 2 + light_green('switch mine') + \
1350 ' will switch to your personal stream.\n'
1351 usage += s * 2 + light_green('switch mine -f ') + \
1352 ' will prompt to enter the filter.\n'
1353 usage += s * 3 + light_yellow('Only nicks') + \
1354 ' filter will decide nicks will be INCLUDE ONLY.\n'
1355 usage += s * 3 + light_yellow('Ignore nicks') + \
1356 ' filter will decide nicks will be EXCLUDE.\n'
1357 usage += s * 2 + light_green('switch mine -d') + \
1358 ' will use the config\'s ONLY_LIST and IGNORE_LIST.\n'
1359 printNicely(usage)
1360
1361
1362 def help():
1363 """
1364 Help
1365 """
1366 s = ' ' * 2
1367 h, w = os.popen('stty size', 'r').read().split()
1368
1369 # Start
1370 usage = '\n'
1371 usage += s + 'Hi boss! I\'m ready to serve you right now!\n'
1372 usage += s + '-' * (int(w) - 4) + '\n'
1373 usage += s + 'You are ' + \
1374 light_yellow('already') + ' on your personal stream.\n'
1375 usage += s + 'Any update from Twitter will show up ' + \
1376 light_yellow('immediately') + '.\n'
1377 usage += s + 'In addtion, following commands are available right now:\n'
1378
1379 # Twitter help section
1380 usage += '\n'
1381 usage += s + grey(u'\u266A' + ' Twitter help\n')
1382 usage += s * 2 + light_green('h discover') + \
1383 ' will show help for discover commands.\n'
1384 usage += s * 2 + light_green('h tweets') + \
1385 ' will show help for tweets commands.\n'
1386 usage += s * 2 + light_green('h messages') + \
1387 ' will show help for messages commands.\n'
1388 usage += s * 2 + light_green('h friends_and_followers') + \
1389 ' will show help for friends and followers commands.\n'
1390 usage += s * 2 + light_green('h list') + \
1391 ' will show help for list commands.\n'
1392 usage += s * 2 + light_green('h stream') + \
1393 ' will show help for stream commands.\n'
1394
1395 # Smart shell
1396 usage += '\n'
1397 usage += s + grey(u'\u266A' + ' Smart shell\n')
1398 usage += s * 2 + light_green('111111 * 9 / 7') + ' or any math expression ' + \
1399 'will be evaluate by Python interpreter.\n'
1400 usage += s * 2 + 'Even ' + light_green('cal') + ' will show the calendar' + \
1401 ' for current month.\n'
1402
1403 # Screening
1404 usage += '\n'
1405 usage += s + grey(u'\u266A' + ' Screening \n')
1406 usage += s * 2 + light_green('theme') + ' will list available theme.' + \
1407 light_green('theme monokai') + ' will apply ' + light_yellow('monokai') + \
1408 ' theme immediately.\n'
1409 usage += s * 2 + light_green('h') + ' will show this help again.\n'
1410 usage += s * 2 + light_green('c') + ' will clear the screen.\n'
1411 usage += s * 2 + light_green('q') + ' will quit.\n'
1412
1413 # End
1414 usage += '\n'
1415 usage += s + '-' * (int(w) - 4) + '\n'
1416 usage += s + 'Have fun and hang tight! \n'
1417
1418 # Show help
1419 d = {
1420 'discover': help_discover,
1421 'tweets': help_tweets,
1422 'messages': help_messages,
1423 'friends_and_followers': help_friends_and_followers,
1424 'list': help_list,
1425 'stream': help_stream,
1426 }
1427 if g['stuff']:
1428 d[g['stuff'].strip()]()
1429 else:
1430 printNicely(usage)
1431
1432
1433 def clear():
1434 """
1435 Clear screen
1436 """
1437 os.system('clear')
1438
1439
1440 def quit():
1441 """
1442 Exit all
1443 """
1444 save_history()
1445 os.system('rm -rf rainbow.db')
1446 os.kill(g['stream_pid'], signal.SIGKILL)
1447 sys.exit()
1448
1449
1450 def reset():
1451 """
1452 Reset prefix of line
1453 """
1454 if g['reset']:
1455 printNicely(magenta('Need tips ? Type "h" and hit Enter key!'))
1456 g['reset'] = False
1457 try:
1458 printNicely(str(eval(g['cmd'])))
1459 except Exception:
1460 pass
1461
1462
1463 def process(cmd):
1464 """
1465 Process switch
1466 """
1467 return dict(zip(
1468 cmdset,
1469 [
1470 switch,
1471 trend,
1472 home,
1473 view,
1474 mentions,
1475 tweet,
1476 retweet,
1477 quote,
1478 allretweet,
1479 favorite,
1480 reply,
1481 delete,
1482 unfavorite,
1483 search,
1484 message,
1485 show,
1486 urlopen,
1487 ls,
1488 inbox,
1489 sent,
1490 trash,
1491 whois,
1492 follow,
1493 unfollow,
1494 mute,
1495 unmute,
1496 muting,
1497 block,
1498 unblock,
1499 report,
1500 list,
1501 cal,
1502 theme,
1503 help,
1504 clear,
1505 quit
1506 ]
1507 )).get(cmd, reset)
1508
1509
1510 def listen():
1511 """
1512 Listen to user's input
1513 """
1514 d = dict(zip(
1515 cmdset,
1516 [
1517 ['public', 'mine'], # switch
1518 [], # trend
1519 [], # home
1520 ['@'], # view
1521 [], # mentions
1522 [], # tweet
1523 [], # retweet
1524 [], # quote
1525 [], # allretweet
1526 [], # favorite
1527 [], # reply
1528 [], # delete
1529 [], # unfavorite
1530 ['#'], # search
1531 ['@'], # message
1532 ['image'], # show image
1533 [''], # open url
1534 ['fl', 'fr'], # list
1535 [], # inbox
1536 [], # sent
1537 [], # trash
1538 ['@'], # whois
1539 ['@'], # follow
1540 ['@'], # unfollow
1541 ['@'], # mute
1542 ['@'], # unmute
1543 ['@'], # muting
1544 ['@'], # block
1545 ['@'], # unblock
1546 ['@'], # report
1547 [
1548 'home',
1549 'all_mem',
1550 'all_sub',
1551 'add',
1552 'rm',
1553 'sub',
1554 'unsub',
1555 'own',
1556 'new',
1557 'update',
1558 'del'
1559 ], # list
1560 [], # cal
1561 g['themes'] + ['current_as_default'], # theme
1562 [
1563 'discover',
1564 'tweets',
1565 'messages',
1566 'friends_and_followers',
1567 'list',
1568 'stream'
1569 ], # help
1570 [], # clear
1571 [], # quit
1572 ]
1573 ))
1574 init_interactive_shell(d)
1575 read_history()
1576 reset()
1577 while True:
1578 if g['prefix']:
1579 line = raw_input(g['decorated_name'])
1580 else:
1581 line = raw_input()
1582 try:
1583 cmd = line.split()[0]
1584 except:
1585 cmd = ''
1586 g['cmd'] = cmd
1587 # Save cmd to global variable and call process
1588 try:
1589 g['stuff'] = ' '.join(line.split()[1:])
1590 process(cmd)()
1591 except Exception:
1592 printNicely(red('OMG something is wrong with Twitter right now.'))
1593 # Not redisplay prefix
1594 if cmd in ['switch', 't', 'rt', 'rep']:
1595 g['prefix'] = False
1596 else:
1597 g['prefix'] = True
1598
1599
1600 def stream(domain, args, name='Rainbow Stream'):
1601 """
1602 Track the stream
1603 """
1604
1605 # The Logo
1606 art_dict = {
1607 c['USER_DOMAIN']: name,
1608 c['PUBLIC_DOMAIN']: args.track_keywords,
1609 c['SITE_DOMAIN']: name,
1610 }
1611 if c['ASCII_ART']:
1612 ascii_art(art_dict[domain])
1613
1614 # These arguments are optional:
1615 stream_args = dict(
1616 timeout=args.timeout,
1617 block=not args.no_block,
1618 heartbeat_timeout=args.heartbeat_timeout)
1619
1620 # Track keyword
1621 query_args = dict()
1622 if args.track_keywords:
1623 query_args['track'] = args.track_keywords
1624
1625 # Get stream
1626 stream = TwitterStream(
1627 auth=authen(),
1628 domain=domain,
1629 **stream_args)
1630
1631 try:
1632 if domain == c['USER_DOMAIN']:
1633 tweet_iter = stream.user(**query_args)
1634 elif domain == c['SITE_DOMAIN']:
1635 tweet_iter = stream.site(**query_args)
1636 else:
1637 if args.track_keywords:
1638 tweet_iter = stream.statuses.filter(**query_args)
1639 else:
1640 tweet_iter = stream.statuses.sample()
1641
1642 # Iterate over the stream.
1643 for tweet in tweet_iter:
1644 if tweet is None:
1645 printNicely("-- None --")
1646 elif tweet is Timeout:
1647 printNicely("-- Timeout --")
1648 elif tweet is HeartbeatTimeout:
1649 printNicely("-- Heartbeat Timeout --")
1650 elif tweet is Hangup:
1651 printNicely("-- Hangup --")
1652 elif tweet.get('text'):
1653 draw(
1654 t=tweet,
1655 iot=args.image_on_term,
1656 keyword=args.track_keywords,
1657 fil=args.filter,
1658 ig=args.ignore,
1659 )
1660 except TwitterHTTPError:
1661 printNicely('')
1662 printNicely(
1663 magenta("We have maximum connection problem with twitter'stream API right now :("))
1664
1665
1666 def fly():
1667 """
1668 Main function
1669 """
1670 # Spawn stream process
1671 args = parse_arguments()
1672 try:
1673 get_decorated_name()
1674
1675 except TwitterHTTPError:
1676 printNicely('')
1677 printNicely(
1678 magenta("Something wrong with Twitter Oauth right now :("))
1679 printNicely(
1680 magenta("Please delete ~/.rainbow_oauth and try again."))
1681 save_history()
1682 os.system('rm -rf rainbow.db')
1683 sys.exit()
1684
1685 p = Process(
1686 target=stream,
1687 args=(
1688 c['USER_DOMAIN'],
1689 args,
1690 g['original_name']))
1691 p.start()
1692
1693 # Start listen process
1694 time.sleep(0.5)
1695 g['reset'] = True
1696 g['prefix'] = True
1697 g['stream_pid'] = p.pid
1698 g['iot'] = args.image_on_term
1699 listen()