merge with built mute dict
authorvunhat_minh <vunhat_minh@dwango.co.jp>
Thu, 7 Aug 2014 03:37:18 +0000 (12:37 +0900)
committervunhat_minh <vunhat_minh@dwango.co.jp>
Thu, 7 Aug 2014 03:37:18 +0000 (12:37 +0900)
1  2 
docs/conf.py
rainbowstream/config.py
rainbowstream/rainbow.py
setup.py

diff --combined docs/conf.py
index 0d7fd1d3fda2fd573d95ceeea7941c9eebc768a7,1ba586b720acebfdfaca71bd4c71953087a9af2f..33c43e7f7db13010a622b6b1110a25fb64240c98
@@@ -48,9 -48,9 +48,9 @@@ copyright = u'2014, Vu Nhat Minh
  # built documents.
  #
  # The short X.Y version.
- version = '0.6.4'
 -version = '0.6.6'
++version = '0.6.7'
  # The full version, including alpha/beta/rc tags.
- release = '0.6.4'
 -release = '0.6.6'
++release = '0.6.7'
  
  # The language for content autogenerated by Sphinx. Refer to documentation
  # for a list of supported languages.
diff --combined rainbowstream/config.py
index e468c9c1d5725625133355d1af816ce99e426838,fddc7eee029a86cc6cfe3b3cc85afe63171d1b62..c2f2d5cd9ddba696a49e2f6bfe25c1155dbbd85a
@@@ -42,28 -42,26 +42,28 @@@ def get_all_config()
      """
      Get all config
      """
 -    path = os.path.expanduser("~") + os.sep + '.rainbow_config.json'
 -    data = load_config(path)
 -    # Hard to set from prompt
 -    data.pop('ONLY_LIST', None)
 -    data.pop('IGNORE_LIST', None)
 -    data.pop('FORMAT', None)
 -    return data
 +    try:
 +        path = os.path.expanduser("~") + os.sep + '.rainbow_config.json'
 +        data = load_config(path)
 +        # Hard to set from prompt
 +        data.pop('ONLY_LIST', None)
 +        data.pop('IGNORE_LIST', None)
 +        data.pop('FORMAT', None)
 +        return data
 +    except:
 +        return []
  
  
  def get_default_config(key):
      """
      Get default value of a config key
      """
 -    path = os.path.dirname(
 -        __file__) + '/colorset/config'
      try:
 +        path = os.path.dirname(__file__) + '/colorset/config'
          data = load_config(path)
 +        return data[key]
      except:
 -        raise Exception('No such config key.')
 -    return data[key]
 +        raise Exception('This config key does not exist in default.')
  
  
  def get_config(key):
@@@ -84,15 -82,15 +84,15 @@@ def set_config(key, value)
          value = True
      elif value.lower() == 'false':
          value = False
 -    # Fix up
 +    # Update global config
 +    c[key] = value
 +    # Load current user config
      path = os.path.expanduser("~") + os.sep + '.rainbow_config.json'
      data = {}
      try:
          data = load_config(path)
      except:
 -        pass
 -    # Update global config
 -    c[key] = value
 +        return
      # Update config file
      if key in data:
          fixup(data, key, value)
@@@ -109,10 -107,7 +109,10 @@@ def delete_config(key)
      Delete a config key
      """
      path = os.path.expanduser("~") + os.sep + '.rainbow_config.json'
 -    data = load_config(path)
 +    try: 
 +        data = load_config(path)
 +    except:
 +        raise Exception('Config file is messed up.')
      # Drop key
      if key in data and key in c:
          data.pop(key)
@@@ -133,13 -128,13 +133,13 @@@ def reload_config()
      """
      Reload config
      """
 -    rainbow_config = os.path.expanduser("~") + os.sep + '.rainbow_config.json'
 -    try:
 +    try: 
 +        rainbow_config = os.path.expanduser("~") + os.sep + '.rainbow_config.json'
          data = load_config(rainbow_config)
          for d in data:
              c[d] = data[d]
      except:
 -        print('It seems that ~/.rainbow_config.json has wrong format :(')
 +        raise Exception('Can not reload config file with wrong format.')
  
  
  def init_config():
      Init configuration
      """
      # Load the initial config
-     config = os.path.dirname(
-         __file__) + '/colorset/config'
+     config = os.path.dirname(__file__) + \
+         '/colorset/config'
      try:
          data = load_config(config)
          for d in data:
          data = load_config(rainbow_config)
          for d in data:
              c[d] = data[d]
 -    except:
 -        pass
 +    except ValueError as e:
 +        c['USER_JSON_ERROR'] = str(e)
      # Load default theme
-     theme_file = os.path.dirname(
-         __file__) + '/colorset/' + c['THEME'] + '.json'
+     theme_file = os.path.dirname(__file__) + \
+         '/colorset/' + c['THEME'] + '.json'
      try:
          data = load_config(theme_file)
          for d in data:
diff --combined rainbowstream/rainbow.py
index 598d367b70dafdea73be36b1eae16555f3080c08,8760e7830a228d81b221074f2e0fccf07e272318..d2caee3ac2a2a67de3faaaf41b943ff4e6e8970f
@@@ -137,6 -137,33 +137,33 @@@ def authen()
          CONSUMER_SECRET)
  
  
+ def build_mute_dict(dict_data=False):
+     """
+     Build muting list
+     """
+     t = Twitter(auth=authen())
+     # Init cursor
+     next_cursor = -1
+     screen_name_list = []
+     name_list = []
+     # Cursor loop
+     while next_cursor != 0:
+         list = t.mutes.users.list(
+             screen_name=g['original_name'],
+             cursor=next_cursor,
+             skip_status=True,
+             include_entities=False,
+         )
+         screen_name_list += ['@' + u['screen_name'] for u in list['users']]
+         name_list += [u['name'] for u in list['users']]
+         next_cursor = list['next_cursor']
+     # Return dict or list
+     if dict_data:
+         return dict(zip(screen_name_list, name_list))
+     else:
+         return screen_name_list
  def init(args):
      """
      Init function
          set_config('PREFIX', name)
      g['original_name'] = name[1:]
      g['decorated_name'] = lambda x: color_func(
 -        c['DECORATED_NAME'])(
 -        '[' + x + ']: ')
 +        c['DECORATED_NAME'])('[' + x + ']: ')
      # Theme init
      files = os.listdir(os.path.dirname(__file__) + '/colorset')
      themes = [f.split('.')[0] for f in files if f.split('.')[-1] == 'json']
      c['message_dict'] = []
      # Image on term
      c['IMAGE_ON_TERM'] = args.image_on_term
 +    set_config('IMAGE_ON_TERM',str(c['IMAGE_ON_TERM']))
+     # Mute dict
+     c['IGNORE_LIST'] += build_mute_dict()
  
  
  def switch():
@@@ -416,7 -445,7 +445,7 @@@ def reply()
      tid = c['tweet_dict'][id]
      user = t.statuses.show(id=tid)['user']['screen_name']
      status = ' '.join(g['stuff'].split()[1:])
-     status = '@' + user + ' ' + status.decode('utf-8')
+     status = '@' + user + ' ' + unc(status)
      t.statuses.update(status=status, in_reply_to_status_id=tid)
  
  
@@@ -711,11 -740,16 +740,16 @@@ def mute()
          printNicely(red('A name should be specified. '))
          return
      if screen_name.startswith('@'):
-         rel = t.mutes.users.create(screen_name=screen_name[1:])
-         if isinstance(rel, dict):
-             printNicely(green(screen_name + ' is muted.'))
-         else:
-             printNicely(red(rel))
+         try:
+             rel = t.mutes.users.create(screen_name=screen_name[1:])
+             if isinstance(rel, dict):
+                 printNicely(green(screen_name + ' is muted.'))
+                 c['IGNORE_LIST'] += [unc(screen_name)]
+                 c['IGNORE_LIST'] = list(set(c['IGNORE_LIST']))
+             else:
+                 printNicely(red(rel))
+         except:
+             printNicely(red('Something is wrong, can not mute now :('))
      else:
          printNicely(red('A name should begin with a \'@\''))
  
@@@ -731,11 -765,15 +765,15 @@@ def unmute()
          printNicely(red('A name should be specified. '))
          return
      if screen_name.startswith('@'):
-         rel = t.mutes.users.destroy(screen_name=screen_name[1:])
-         if isinstance(rel, dict):
-             printNicely(green(screen_name + ' is unmuted.'))
-         else:
-             printNicely(red(rel))
+         try:
+             rel = t.mutes.users.destroy(screen_name=screen_name[1:])
+             if isinstance(rel, dict):
+                 printNicely(green(screen_name + ' is unmuted.'))
+                 c['IGNORE_LIST'].remove(screen_name)
+             else:
+                 printNicely(red(rel))
+         except:
+             printNicely(red('Maybe you are not muting this person ?'))
      else:
          printNicely(red('A name should begin with a \'@\''))
  
@@@ -744,27 -782,15 +782,15 @@@ def muting()
      """
      List muting user
      """
-     t = Twitter(auth=authen())
-     # Init cursor
-     next_cursor = -1
-     rel = {}
-     # Cursor loop
-     while next_cursor != 0:
-         list = t.mutes.users.list(
-             screen_name=g['original_name'],
-             cursor=next_cursor,
-             skip_status=True,
-             include_entities=False,
-         )
-         for u in list['users']:
-             rel[u['name']] = '@' + u['screen_name']
-         next_cursor = list['next_cursor']
-     # Print out result
-     printNicely('All: ' + str(len(rel)) + ' people.')
-     for name in rel:
-         user = '  ' + cycle_color(name)
-         user += color_func(c['TWEET']['nick'])(' ' + rel[name] + ' ')
+     # Get dict of muting users
+     md = build_mute_dict(dict_data=True)
+     printNicely('All: ' + str(len(md)) + ' people.')
+     for name in md:
+         user = '  ' + cycle_color(md[name])
+         user += color_func(c['TWEET']['nick'])(' ' + name + ' ')
          printNicely(user)
+     # Update from Twitter
+     c['IGNORE_LIST'] = [n for n in md]
  
  
  def block():
@@@ -1051,7 -1077,7 +1077,7 @@@ def list_delete(t)
          printNicely(red('Oops something is wrong with Twitter :('))
  
  
- def list():
+ def twitterlist():
      """
      Twitter's list
      """
@@@ -1125,16 -1151,17 +1151,16 @@@ def config()
              value = get_default_config(key)
              line = ' ' * 2 + green(key) + ': ' + light_magenta(value)
              printNicely(line)
 -        except:
 -            printNicely(
 -                light_magenta('This config key does not exist in default.'))
 +        except Exception as e:
 +            printNicely(red(e))
      # 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:
 -            printNicely(red('No such config key.'))
 +        except Exception as e:
 +            printNicely(red(e))
      # Set specific config
      elif len(g['stuff'].split()) == 3 and g['stuff'].split()[1] == '=':
          key = g['stuff'].split()[0]
              if key == 'THEME':
                  c['THEME'] = reload_theme(value, c['THEME'])
                  g['decorated_name'] = lambda x: color_func(
 -                    c['DECORATED_NAME'])(
 -                    '[' + x + ']: ')
 +                    c['DECORATED_NAME'])('[' + x + ']: ')
 +            reload_config()
              printNicely(green('Updated successfully.'))
 -        except:
 -            printNicely(light_magenta('Not valid value.'))
 -            return
 -        reload_config()
 +        except Exception as e:
 +            printNicely(red(e))
      else:
          printNicely(light_magenta('Sorry I can\'s understand.'))
  
@@@ -1487,10 -1516,6 +1513,10 @@@ def reset()
      Reset prefix of line
      """
      if g['reset']:
 +        if c.get('USER_JSON_ERROR'):
 +            printNicely(red('Your ~/.rainbow_config.json is messed up:'))
 +            printNicely(red('>>> ' + c['USER_JSON_ERROR']))
 +            printNicely('')
          printNicely(magenta('Need tips ? Type "h" and hit Enter key!'))
      g['reset'] = False
      try:
@@@ -1536,7 -1561,7 +1562,7 @@@ def process(cmd)
              block,
              unblock,
              report,
-             list,
+             twitterlist,
              cal,
              config,
              theme,
@@@ -1664,7 -1689,7 +1690,7 @@@ def stream(domain, args, name='Rainbow 
          ascii_art(art_dict[domain])
      # These arguments are optional:
      stream_args = dict(
-         timeout=0.5, # To check g['stream_stop'] after each 0.5 s
+         timeout=0.5,  # To check g['stream_stop'] after each 0.5 s
          block=not args.no_block,
          heartbeat_timeout=args.heartbeat_timeout)
      # Track keyword
@@@ -1740,7 -1765,7 +1766,7 @@@ def fly()
      except TwitterHTTPError:
          printNicely('')
          printNicely(
-             magenta("We have maximum connection problem with twitter'stream API right now :("))
+             magenta("We have connection problem with twitter'stream API right now :("))
          printNicely(magenta("Let's try again later."))
          save_history()
          sys.exit()
diff --combined setup.py
index d95c41177ee7ef83cb6ccc8335efa95283e90182,642440e349dfb16a05f7135712d02f1c59c6578e..636e6aae18c5ba84e02ae953eaf941465c767921
+++ b/setup.py
@@@ -3,7 -3,7 +3,7 @@@ import o
  import os.path
  
  # Bumped version
- version = '0.6.4'
 -version = '0.6.6'
++version = '0.6.7'
  
  # Require
  install_requires = [