Default proxy type setting corrected
[rainbowstream.git] / rainbowstream / rainbow.py
index 742c4e9cf2b85e3d76ac227d3c2560c8a4fef0c6..c1563a3d24765d7a1e7586380e307068869aa6a1 100644 (file)
@@ -9,6 +9,8 @@ import requests
 import webbrowser
 import traceback
 import pkg_resources
+import socks
+import socket
 
 from twitter.stream import TwitterStream, Timeout, HeartbeatTimeout, Hangup
 from twitter.api import *
@@ -16,6 +18,8 @@ from twitter.oauth import OAuth, read_token_file
 from twitter.oauth_dance import oauth_dance
 from twitter.util import printNicely
 
+from urllib import error
+
 from .draw import *
 from .colors import *
 from .config import *
@@ -58,6 +62,20 @@ def parse_arguments():
         '--image-on-term',
         action='store_true',
         help='Display all image on terminal.')
+    parser.add_argument(
+        '-ph',
+        '--proxy-host',
+        help='Use HTTP/SOCKS proxy for network connections.')
+    parser.add_argument(
+        '-pp',
+        '--proxy-port',
+        default=8080,
+        help='HTTP/SOCKS proxy port (Default: 8080).')
+    parser.add_argument(
+        '-pt',
+        '--proxy-type',
+        default='SOCKS5',
+        help='Proxy type (HTTP, SOCKS4, SOCKS5; Default: SOCKS5).')
     return parser.parse_args()
 
 
@@ -1195,6 +1213,8 @@ def switch():
             # Kill old thread
             g['stream_stop'] = True
             args.track_keywords = keyword
+            # Reset prefix
+            g['PREFIX'] = u2str(emojize(c['PREFIX']))
             # Start new thread
             th = threading.Thread(
                 target=stream,
@@ -1207,6 +1227,8 @@ def switch():
         elif target == 'mine':
             # Kill old thread
             g['stream_stop'] = True
+            # Reset prefix
+            g['PREFIX'] = u2str(emojize(c['PREFIX']))
             # Start new thread
             th = threading.Thread(
                 target=stream,
@@ -1220,7 +1242,7 @@ def switch():
         elif target == 'list':
             owner, slug = get_slug()
             # Force python 2 not redraw readline buffer
-            g['cmd'] = '/'.join([owner, slug])
+            g['PREFIX'] = g['cmd'] = '/'.join([owner, slug])
             printNicely(light_yellow('getting list members ...'))
             # Get members
             t = Twitter(auth=authen())
@@ -1255,7 +1277,7 @@ def switch():
         if args.ignore:
             printNicely(red('Ignore: ' + str(len(args.ignore)) + ' people.'))
         printNicely('')
-    except Exception:
+    except:
         debug_option()
         printNicely(red('Sorry I can\'t understand.'))
 
@@ -1330,16 +1352,18 @@ def config():
             value = get_default_config(key)
             line = ' ' * 2 + green(key) + ': ' + light_magenta(value)
             printNicely(line)
-        except Exception as e:
-            printNicely(red(e))
+        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 Exception as e:
-            printNicely(red(e))
+        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]
@@ -1349,15 +1373,18 @@ def config():
             return
         try:
             set_config(key, value)
-            # Apply theme immediately
+            # 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(c['PREFIX']))
             reload_config()
             printNicely(green('Updated successfully.'))
-        except Exception as e:
-            printNicely(red(e))
+        except:
+            debug_option()
+            printNicely(red('Just can not set the key.'))
     else:
         printNicely(light_magenta('Sorry I can\'s understand.'))
 
@@ -2015,6 +2042,20 @@ def fly():
     # Initial
     args = parse_arguments()
     try:
+        if args.proxy_host:
+            # Setup proxy by monkeypatching the standard lib
+            # You might want to check https://github.com/Anorov/PySocks for further
+            # further info.
+            if args.proxy_type.lower() == "socks5" or not args.proxy_type:
+                socks.set_default_proxy(socks.SOCKS5, args.proxy_host, int(args.proxy_port))
+            elif args.proxy_type.lower() == "http":
+                socks.set_default_proxy(socks.HTTP, args.proxy_host, int(args.proxy_port))
+            elif args.proxy_type.lower() == "socks4":
+                socks.set_default_proxy(socks.SOCKS4, args.proxy_host, int(args.proxy_port))
+            else:
+                printNicely(magenta("Sorry, wrong proxy type specified! Aborting..."))
+                sys.exit()
+            socket.socket = socks.socksocket
         init(args)
     except TwitterHTTPError:
         printNicely('')
@@ -2023,6 +2064,14 @@ def fly():
         printNicely(magenta("Let's try again later."))
         save_history()
         sys.exit()
+    except (ConnectionRefusedError, socks.ProxyConnectionError, error.URLError):
+        printNicely(
+            magenta("There seems to be a connection problem."))
+        printNicely(
+            magenta("You might want to check your proxy settings (host, port and type)!"))
+        save_history()
+        sys.exit()
+
     # Spawn stream thread
     th = threading.Thread(
         target=stream,