import webbrowser
import traceback
import pkg_resources
+import socks
+import socket
+from io import BytesIO
from twitter.stream import TwitterStream, Timeout, HeartbeatTimeout, Hangup
from twitter.api import *
from twitter.oauth import OAuth, read_token_file
from .c_image import *
from .py3patch import *
from .emoji import *
+from .util import printTwitterErrors
# Global values
g = {}
'--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()
+def proxy_connect(args):
+ """
+ Connect to specified proxy
+ """
+ if args.proxy_host:
+ # Setup proxy by monkeypatching the standard lib
+ 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
+
+
def authen():
"""
Authenticate with Twitter OAuth
notice += light_magenta('You should upgrade with ')
notice += light_green('pip install -U rainbowstream')
printNicely(notice)
+ else:
+ notice = light_yellow('You are running latest version (')
+ notice += light_green(current)
+ notice += light_yellow(')')
+ printNicely(notice)
except:
pass
# Kill old thread
g['stream_stop'] = True
args.track_keywords = keyword
- # Set prefix to origin name with public
- g['PREFIX'] = '@' + g['original_name'] + '/public'
+ # Reset prefix
+ g['PREFIX'] = u2str(emojize(c['PREFIX']))
# Start new thread
th = threading.Thread(
target=stream,
elif target == 'mine':
# Kill old thread
g['stream_stop'] = True
- # Set prefix to origin name
- g['PREFIX'] = '@' + g['original_name']
+ # Reset prefix
+ g['PREFIX'] = u2str(emojize(c['PREFIX']))
# Start new thread
th = threading.Thread(
target=stream,
usage += s * 2 + light_green('p') + ' will pause the stream.\n'
usage += s * 2 + light_green('r') + ' will unpause the stream.\n'
usage += s * 2 + light_green('c') + ' will clear the screen.\n'
+ usage += s * 2 + light_green('v') + ' will show version info.\n'
usage += s * 2 + light_green('q') + ' will quit.\n'
# End
usage += '\n'
'p',
'r',
'c',
- 'q'
+ 'v',
+ 'q',
]
# Handle function set
pause,
replay,
clear,
- quit
+ upgrade_center,
+ quit,
]
[], # pause
[], # reconnect
[], # clear
+ [], # version
[], # quit
]
))
# Block new stream until other one exits
StreamLock.acquire()
g['stream_stop'] = False
+ last_tweet_time = time.time()
for tweet in tweet_iter:
if tweet is None:
printNicely("-- None --")
StreamLock.release()
break
elif tweet.get('text'):
+ # Slow down the stream by STREAM_DELAY config key
+ if time.time() - last_tweet_time < c['STREAM_DELAY']:
+ continue
+ last_tweet_time = time.time()
# Check the semaphore pause and lock (stream process only)
if g['pause']:
continue
elif tweet.get('event'):
c['events'].append(tweet)
print_event(tweet)
- except TwitterHTTPError:
+ except TwitterHTTPError as e:
printNicely('')
printNicely(
magenta("We have maximum connection problem with twitter'stream API right now :("))
+ printTwitterErrors(e)
def fly():
# Initial
args = parse_arguments()
try:
+ proxy_connect(args)
init(args)
- except TwitterHTTPError:
+ # Twitter API connection problem
+ except TwitterHTTPError as e:
printNicely('')
printNicely(
magenta("We have connection problem with twitter'stream API right now :("))
+ printTwitterErrors(e)
printNicely(magenta("Let's try again later."))
save_history()
sys.exit()
+ # Proxy connection problem
+ except (socks.ProxyConnectionError, 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,