+
+def list_update(t):
+ """
+ Update a list
+ """
+ slug = raw_input(
+ light_magenta(
+ 'Your list that you want to update: ',
+ rl=True))
+ name = raw_input(
+ light_magenta(
+ 'Update name (leave blank to unchange): ',
+ rl=True))
+ mode = raw_input(light_magenta('Update mode (public/private): ', rl=True))
+ description = raw_input(light_magenta('Update description: ', rl=True))
+ try:
+ if name:
+ t.lists.update(
+ slug='-'.join(slug.split()),
+ owner_screen_name=g['original_name'],
+ name=name,
+ mode=mode,
+ description=description)
+ else:
+ t.lists.update(
+ slug=slug,
+ owner_screen_name=g['original_name'],
+ mode=mode,
+ description=description)
+ printNicely(green(slug + ' list is updated.'))
+ except:
+ debug_option()
+ printNicely(red('Oops something is wrong with Twitter :('))
+
+
+def list_delete(t):
+ """
+ Delete a list
+ """
+ slug = raw_input(
+ light_magenta(
+ 'Your list that you want to delete: ',
+ rl=True))
+ try:
+ t.lists.destroy(
+ slug='-'.join(slug.split()),
+ owner_screen_name=g['original_name'])
+ printNicely(green(slug + ' list is deleted.'))
+ except:
+ debug_option()
+ printNicely(red('Oops something is wrong with Twitter :('))
+
+
+def twitterlist():
+ """
+ Twitter's list
+ """
+ t = Twitter(auth=authen())
+ # List all lists or base on action
+ try:
+ g['list_action'] = g['stuff'].split()[0]
+ except:
+ show_lists(t)
+ return
+ # Sub-function
+ action_ary = {
+ 'home': list_home,
+ 'all_mem': list_members,
+ 'all_sub': list_subscribers,
+ 'add': list_add,
+ 'rm': list_remove,
+ 'sub': list_subscribe,
+ 'unsub': list_unsubscribe,
+ 'own': list_own,
+ 'new': list_new,
+ 'update': list_update,
+ 'del': list_delete,
+ }
+ try:
+ return action_ary[g['list_action']](t)
+ except:
+ printNicely(red('Please try again.'))
+
+
+def switch():
+ """
+ Switch stream
+ """
+ try:
+ target = g['stuff'].split()[0]
+ # Filter and ignore
+ args = parse_arguments()
+ try:
+ if g['stuff'].split()[-1] == '-f':
+ guide = 'To ignore an option, just hit Enter key.'
+ printNicely(light_magenta(guide))
+ only = raw_input('Only nicks [Ex: @xxx,@yy]: ')
+ ignore = raw_input('Ignore nicks [Ex: @xxx,@yy]: ')
+ args.filter = filter(None, only.split(','))
+ args.ignore = filter(None, ignore.split(','))
+ except:
+ printNicely(red('Sorry, wrong format.'))
+ return
+ # 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.'))
+
+
+def cal():
+ """
+ Unix's command `cal`
+ """
+ # Format
+ rel = os.popen('cal').read().split('\n')
+ month = rel.pop(0)
+ date = rel.pop(0)
+ show_calendar(month, date, rel)
+
+
+def theme():
+ """
+ List and change theme
+ """
+ if not g['stuff']:
+ # List themes
+ for theme in g['themes']:
+ line = light_magenta(theme)
+ if c['THEME'] == theme:
+ line = ' ' * 2 + light_yellow('* ') + line
+ else:
+ line = ' ' * 4 + line
+ printNicely(line)
+ else:
+ # Change theme
+ try:
+ # Load new theme
+ c['THEME'] = reload_theme(g['stuff'], c['THEME'])
+ # Redefine decorated_name
+ g['decorated_name'] = lambda x: color_func(
+ c['DECORATED_NAME'])(
+ '[' + x + ']: ')
+ printNicely(green('Theme changed.'))
+ except:
+ printNicely(red('No such theme exists.'))
+
+
+def config():
+ """
+ Browse and change config
+ """
+ all_config = get_all_config()
+ g['stuff'] = g['stuff'].strip()
+ # List all config
+ if not g['stuff']:
+ for k in all_config:
+ line = ' ' * 2 + \
+ green(k) + ': ' + light_yellow(str(all_config[k]))
+ printNicely(line)
+ guide = 'Detailed explanation can be found at ' + \
+ color_func(c['TWEET']['link'])(
+ 'http://rainbowstream.readthedocs.org/en/latest/#config-explanation')
+ printNicely(guide)
+ # Print specific config
+ elif len(g['stuff'].split()) == 1:
+ if g['stuff'] in all_config:
+ k = g['stuff']
+ line = ' ' * 2 + \
+ green(k) + ': ' + light_yellow(str(all_config[k]))
+ printNicely(line)
+ else:
+ printNicely(red('No such config key.'))
+ # Print specific config's default value
+ elif len(g['stuff'].split()) == 2 and g['stuff'].split()[-1] == 'default':
+ key = g['stuff'].split()[0]
+ try:
+ value = get_default_config(key)
+ line = ' ' * 2 + green(key) + ': ' + light_magenta(value)
+ printNicely(line)
+ except:
+ debug_option()
+ printNicely(red('Just can not get the default.'))
+ # Delete specific config key in config file
+ elif len(g['stuff'].split()) == 2 and g['stuff'].split()[-1] == 'drop':
+ key = g['stuff'].split()[0]
+ try:
+ delete_config(key)
+ printNicely(green('Config key is dropped.'))
+ except:
+ debug_option()
+ printNicely(red('Just can not drop the key.'))
+ # Set specific config
+ elif len(g['stuff'].split()) == 3 and g['stuff'].split()[1] == '=':
+ key = g['stuff'].split()[0]
+ value = g['stuff'].split()[-1]
+ if key == 'THEME' and not validate_theme(value):
+ printNicely(red('Invalid theme\'s value.'))
+ return
+ try:
+ set_config(key, value)
+ # Keys that needs to be apply immediately
+ if key == 'THEME':
+ c['THEME'] = reload_theme(value, c['THEME'])
+ g['decorated_name'] = lambda x: color_func(
+ c['DECORATED_NAME'])('[' + x + ']: ')
+ elif key == 'PREFIX':
+ g['PREFIX'] = u2str(emojize(format_prefix(
+ listname=g['listname'],
+ keyword=g['keyword']
+ )))
+ reload_config()
+ printNicely(green('Updated successfully.'))
+ except:
+ debug_option()
+ printNicely(red('Just can not set the key.'))
+ else:
+ printNicely(light_magenta('Sorry I can\'s understand.'))
+
+
+def help_discover():
+ """
+ Discover the world
+ """
+ s = ' ' * 2
+ # Discover the world