X-Git-Url: https://vcs.fsf.org/?p=rainbowstream.git;a=blobdiff_plain;f=rainbowstream%2Frainbow.py;h=5241f0d70a05b030d6756e6026ca896db3803154;hp=a5824a6382650984abeb11fc8baf0ed269b8bba3;hb=04610460050d47adec2e7b9c8a354b6ee99a6317;hpb=ba6c09d1585318207fa3ddf47b374b5ebcc3a22c diff --git a/rainbowstream/rainbow.py b/rainbowstream/rainbow.py index a5824a6..5241f0d 100644 --- a/rainbowstream/rainbow.py +++ b/rainbowstream/rainbow.py @@ -41,6 +41,11 @@ def parse_arguments(): Parse the arguments """ parser = argparse.ArgumentParser(description=__doc__ or "") + parser.add_argument( + '-s', + '--stream', + default="mine", + help='Default stream after program start. (Default: mine)') parser.add_argument( '-to', '--timeout', @@ -319,7 +324,11 @@ def whois(): Show profile of a specific user """ t = Twitter(auth=authen()) - screen_name = g['stuff'].split()[0] + try: + screen_name = g['stuff'].split()[0] + except: + printNicely(red('Sorry I can\'t understand.')) + return if screen_name.startswith('@'): try: user = t.users.show( @@ -338,7 +347,11 @@ def view(): Friend view """ t = Twitter(auth=authen()) - user = g['stuff'].split()[0] + try: + user = g['stuff'].split()[0] + except: + printNicely(red('Sorry I can\'t understand.')) + return if user[0] == '@': try: num = int(g['stuff'].split()[1]) @@ -359,6 +372,9 @@ def search(): t = Twitter(auth=authen()) # Setup query query = g['stuff'].strip() + if not query: + printNicely(red('Sorry I can\'t understand.')) + return type = c['SEARCH_TYPE'] if type not in ['mixed', 'recent', 'popular']: type = 'mixed' @@ -775,6 +791,7 @@ def ls(): target = g['stuff'].split()[0] except: printNicely(red('Omg some syntax is wrong.')) + return # Init cursor d = {'fl': 'followers', 'fr': 'friends'} next_cursor = -1 @@ -956,6 +973,22 @@ def get_slug(): raise Exception('Wrong list name') +def check_slug(list_name): + """ + Check slug + """ + # Get list name and owner + try: + owner, slug = list_name.split('/') + if slug.startswith('@'): + slug = slug[1:] + return owner, slug + except: + printNicely( + light_magenta('List name should follow "@owner/list_name" format.')) + raise Exception('Wrong list name') + + def show_lists(t): """ List list @@ -1254,91 +1287,19 @@ def switch(): except: printNicely(red('Sorry, wrong format.')) return - # Public stream - if target == 'public': - keyword = g['stuff'].split()[1] - if keyword[0] == '#': - keyword = keyword[1:] - # Kill old thread - g['stream_stop'] = True - args.track_keywords = keyword - # Set the variable to tracked keyword - # and reset the listname - g['keyword'] = keyword - g['listname'] = '' - # Reset prefix - g['PREFIX'] = u2str(emojize(format_prefix(keyword=g['keyword']))) - # Start new thread - th = threading.Thread( - target=stream, - args=( - c['PUBLIC_DOMAIN'], - args)) - th.daemon = True - th.start() - # Personal stream - elif target == 'mine': - # Kill old thread - g['stream_stop'] = True - # Reset the tracked keyword and listname - g['keyword'] = g['listname'] = '' - # Reset prefix - g['PREFIX'] = u2str(emojize(format_prefix())) - # Start new thread - th = threading.Thread( - target=stream, - args=( - c['USER_DOMAIN'], - args, - g['original_name'])) - th.daemon = True - th.start() - # Stream base on list - elif target == 'list': - owner, slug = get_slug() - # Force python 2 not redraw readline buffer - listname = '/'.join([owner, slug]) - # Set the listname variable - # and reset tracked keyword - g['listname'] = listname - g['keyword'] = '' - g['PREFIX'] = g['cmd'] = u2str(emojize(format_prefix( - listname=g['listname'] - ))) - printNicely(light_yellow('getting list members ...')) - # Get members - t = Twitter(auth=authen()) - members = [] - next_cursor = -1 - while next_cursor != 0: - m = t.lists.members( - slug=slug, - owner_screen_name=owner, - cursor=next_cursor, - include_entities=False) - for u in m['users']: - members.append('@' + u['screen_name']) - next_cursor = m['next_cursor'] - printNicely(light_yellow('... done.')) - # Build thread filter array - args.filter = members - # Kill old thread - g['stream_stop'] = True - # Start new thread - th = threading.Thread( - target=stream, - args=( - c['USER_DOMAIN'], - args, - slug)) - th.daemon = True - th.start() - printNicely('') - if args.filter: - printNicely(cyan('Include: ' + str(len(args.filter)) + ' people.')) - if args.ignore: - printNicely(red('Ignore: ' + str(len(args.ignore)) + ' people.')) - printNicely('') + # Kill old thread + g['stream_stop'] = True + try: + stuff = g['stuff'].split()[1] + except: + stuff = None + # Spawn new thread + spawn_dict = { + 'public': spawn_public_stream, + 'list': spawn_list_stream, + 'mine': spawn_personal_stream, + } + spawn_dict.get(target)(args, stuff) except: debug_option() printNicely(red('Sorry I can\'t understand.')) @@ -2016,11 +1977,11 @@ def stream(domain, args, name='Rainbow Stream'): # The Logo art_dict = { c['USER_DOMAIN']: name, - c['PUBLIC_DOMAIN']: args.track_keywords, + c['PUBLIC_DOMAIN']: args.track_keywords or 'Global', c['SITE_DOMAIN']: name, } if c['ASCII_ART']: - ascii_art(art_dict[domain]) + ascii_art(art_dict.get(domain, name)) # These arguments are optional: stream_args = dict( timeout=0.5, # To check g['stream_stop'] after each 0.5 s @@ -2123,6 +2084,101 @@ def stream(domain, args, name='Rainbow Stream'): sys.exit() +def spawn_public_stream(args, keyword=None): + """ + Spawn a new public stream + """ + # Only set keyword if specified + if keyword: + if keyword[0] == '#': + keyword = keyword[1:] + args.track_keywords = keyword + g['keyword'] = keyword + else: + g['keyword'] = 'Global' + g['PREFIX'] = u2str(emojize(format_prefix(keyword=g['keyword']))) + g['listname'] = '' + # Start new thread + th = threading.Thread( + target=stream, + args=( + c['PUBLIC_DOMAIN'], + args)) + th.daemon = True + th.start() + + +def spawn_list_stream(args, stuff=None): + """ + Spawn a new list stream + """ + try: + owner, slug = check_slug(stuff) + except: + owner, slug = get_slug() + + # Force python 2 not redraw readline buffer + listname = '/'.join([owner, slug]) + # Set the listname variable + # and reset tracked keyword + g['listname'] = listname + g['keyword'] = '' + g['PREFIX'] = g['cmd'] = u2str(emojize(format_prefix( + listname=g['listname'] + ))) + printNicely(light_yellow('getting list members ...')) + # Get members + t = Twitter(auth=authen()) + members = [] + next_cursor = -1 + while next_cursor != 0: + m = t.lists.members( + slug=slug, + owner_screen_name=owner, + cursor=next_cursor, + include_entities=False) + for u in m['users']: + members.append('@' + u['screen_name']) + next_cursor = m['next_cursor'] + printNicely(light_yellow('... done.')) + # Build thread filter array + args.filter = members + # Start new thread + th = threading.Thread( + target=stream, + args=( + c['USER_DOMAIN'], + args, + slug)) + th.daemon = True + th.start() + printNicely('') + if args.filter: + printNicely(cyan('Include: ' + str(len(args.filter)) + ' people.')) + if args.ignore: + printNicely(red('Ignore: ' + str(len(args.ignore)) + ' people.')) + printNicely('') + + +def spawn_personal_stream(args, stuff=None): + """ + Spawn a new personal stream + """ + # Reset the tracked keyword and listname + g['keyword'] = g['listname'] = '' + # Reset prefix + g['PREFIX'] = u2str(emojize(format_prefix())) + # Start new thread + th = threading.Thread( + target=stream, + args=( + c['USER_DOMAIN'], + args, + g['original_name'])) + th.daemon = True + th.start() + + def fly(): """ Main function @@ -2150,14 +2206,20 @@ def fly(): sys.exit() # Spawn stream thread - th = threading.Thread( - target=stream, - args=( - c['USER_DOMAIN'], - args, - g['original_name'])) - th.daemon = True - th.start() + target = args.stream.split()[0] + if target == 'mine' : + spawn_personal_stream(args) + else: + try: + stuff = args.stream.split()[1] + except: + stuff = None + spawn_dict = { + 'public': spawn_public_stream, + 'list': spawn_list_stream, + } + spawn_dict.get(target)(args, stuff) + # Start listen process time.sleep(0.5) g['reset'] = True