def handle(self): self.handler = MyHTTPHandler(WEB_ROOT) self.sio = SocketIO(self.request) try: req = Request.read_from(self.SocketIterator(self.sio)) if LOG_REQUESTS: print(('{}:{} {} {}').format( self.client_address[0], self.client_address[1], req.method, req.path), file=sys.stderr) resp = self.handler.handle_request(req) except myhttp.ParseError: resp = Response(Response.BAD_REQUEST) except self.ClientDisconnected: # nothing to do, really return except: # Try to send a valid response even if something went wrong if LOG_REQUESTS: print('500 Internal Server Error', file=sys.stderr) self.sio.write(b'HTTP/1.1 500 Internal Server Error\r\n') raise # Attach required header resp.attach_header('Connection', 'close') # send self._send_response(resp)
def _setup_sock(self, response): self.csrf = None self.user_id = None self.logged_in = False self.waiting_bet_result = False self.last_bet = None self.house_edge = 1 # % self.waiting_seed = False origin = BASE_URL self.sock = SocketIO(BASE_DOMAIN, origin, response, secure=True) self.sock.on('init', self.on_init) self.sock.on('set_hash', self.on_set_hash) self.sock.on('reload', self.on_reload) self.sock.on('result', self.on_result) self.sock.on('login_error', self.on_login_error) self.sock.on('jderror', self.on_jderror) self.sock.on('new_client_seed', self.on_new_seed) self.sock.on('invest', self.on_invest) self.sock.on('invest_error', self.on_invest_error) self.sock.on('divest_error', self.on_divest_error) self.sock.on('balance', self.on_balance) self.sock.on('chat', self.on_chat)
def _setup_sock(self, response): self.csrf = None self.user_id = None self.logged_in = False self.waiting_bet_result = False self.last_bet = None self.house_edge = 1 # % origin = BASE_URL self.sock = SocketIO(BASE_DOMAIN, origin, response, secure=True) self.sock.on('init', self.on_init) self.sock.on('set_hash', self.on_set_hash) self.sock.on('reload', self.on_reload) self.sock.on('result', self.on_result) self.sock.on('login_error', self.on_login_error)
class JustDiceSocket(object): def __init__(self, response, login, params=None): self.login = login self._setup_sock(response) def _setup_sock(self, response): self.csrf = None self.user_id = None self.logged_in = False self.waiting_bet_result = False self.last_bet = None self.house_edge = 1 # % self.waiting_seed = False origin = BASE_URL self.sock = SocketIO(BASE_DOMAIN, origin, response, secure=True) self.sock.on('init', self.on_init) self.sock.on('set_hash', self.on_set_hash) self.sock.on('reload', self.on_reload) self.sock.on('result', self.on_result) self.sock.on('login_error', self.on_login_error) self.sock.on('jderror', self.on_jderror) self.sock.on('new_client_seed', self.on_new_seed) self.sock.on('invest', self.on_invest) self.sock.on('invest_error', self.on_invest_error) self.sock.on('divest_error', self.on_divest_error) self.sock.on('balance', self.on_balance) self.sock.on('chat', self.on_chat) # Override if needed. def on_invest(self, *args): # Expected args: invest, invest_pct, profit pass def on_invest_error(self, msg): pass def on_divest_error(self, msg): pass def on_balance(self, data): pass def on_chat(self, *args): # Expected args: msg, timestamp pass # def bet(self, win_chance, amount, roll_hi): if self.waiting_bet_result: raise Exception("Still waiting for last bet result") which = 'hi' if roll_hi else 'lo' self.sock.emit( 'bet', self.csrf, { 'chance': '%s' % str(win_chance), 'bet': format(amount, '.8f'), 'which': '%s' % which }) self.waiting_bet_result = True def randomize(self, user_seed=None): # user_seed must be a string. if self.waiting_seed: return self.sock.emit('random', self.csrf) if user_seed is None: user_seed = str(random.randint(0, int('9' * 24))) self.sock.emit('seed', self.csrf, user_seed, True) self.waiting_seed = True def on_new_seed(self, o_sseed, o_sshash, o_useed, old_nonce, new_sshash): self.waiting_seed = False def on_result(self, result): if result['uid'] == self.user_id: self.last_bet = { 'win': result['win'], 'roll_high': result['high'], 'lucky_number': Decimal(result['lucky']) / 10000 } self.waiting_bet_result = False return True def on_reload(self): self.sock.emit('disconnect') response = load_justdice() self._setup_sock(response) def on_set_hash(self, new_cookie_hash): for cookie in cj: if cookie.name == 'hash': cookie.value = new_cookie_hash break def on_init(self, data): self.csrf = data[u'csrf'] self.user_id = data[u'uid'] self.house_edge = data[u'edge'] if data['username'] is None and self.login: google_2fa = self.login.get('2fa', '') self.sock.emit('login', self.csrf, self.login['user'], self.login['pwd'], google_2fa) else: self.logged_in = True def on_login_error(self, msg): msg = msg.lower() if msg.startswith('incorrect') or msg.endswith('no such user'): self.logged_in = None raise Exception("Invalid credentials") elif 'google' in msg or 'phone' in msg: self.logged_in = None raise Exception("2FA failed") elif 'wrong too many' in msg: self.logged_in = None raise Exception("Blocked by 2FA, contact just-dice") def on_jderror(self, msg): msg = msg.lower() if 'minimum allowed' in msg or 'maximum allowed' in msg: self.waiting_bet_result = None raise Exception("Invalid win chance") elif 'google-auth' in msg: self.waiting_bet_result = None raise Exception("2FA locked") elif 'can not bet' in msg: raise Exception("Could not place bet, check your balance")
class JustDiceSocket(object): def __init__(self, response, login): self.login = login self._setup_sock(response) def _setup_sock(self, response): self.csrf = None self.user_id = None self.logged_in = False self.waiting_bet_result = False self.last_bet = None self.house_edge = 1 # % self.waiting_seed = False origin = BASE_URL self.sock = SocketIO(BASE_DOMAIN, origin, response, secure=True) self.sock.on('init', self.on_init) self.sock.on('set_hash', self.on_set_hash) self.sock.on('reload', self.on_reload) self.sock.on('result', self.on_result) self.sock.on('login_error', self.on_login_error) self.sock.on('jderror', self.on_jderror) self.sock.on('new_client_seed', self.on_new_seed) self.sock.on('chat', self.on_chat) # Override if needed. def on_chat(self, msg, timestamp): pass # def bet(self, win_chance, amount, roll_hi): if self.waiting_bet_result: raise Exception("Still waiting for last bet result") which = 'hi' if roll_hi else 'lo' self.sock.emit('bet', self.csrf, {'chance': '%s' % str(win_chance), 'bet': format(amount, '.8f'), 'which': '%s' % which}) self.waiting_bet_result = True def randomize(self, user_seed=None): # user_seed must be a string. if self.waiting_seed: return self.sock.emit('random', self.csrf) if user_seed is None: user_seed = str(random.randint(0, int('9' * 24))) self.sock.emit('seed', self.csrf, user_seed, True) self.waiting_seed = True def on_new_seed(self, o_sseed, o_sshash, o_useed, old_nonce, new_sshash): self.waiting_seed = False def on_result(self, result): if result['uid'] == self.user_id: self.last_bet = { 'win': result['win'], 'roll_high': result['high'], 'lucky_number': Decimal(result['lucky']) / 10000} self.waiting_bet_result = False return True def on_reload(self): self.sock.emit('disconnect') response = load_justdice() self._setup_sock(response) def on_set_hash(self, new_cookie_hash): for cookie in cj: if cookie.name == 'hash': cookie.value = new_cookie_hash break def on_init(self, data): self.csrf = data[u'csrf'] self.user_id = data[u'uid'] self.house_edge = data[u'edge'] if data['username'] is None and self.login: google_2fa = self.login.get('2fa', '') self.sock.emit('login', self.csrf, self.login['user'], self.login['pwd'], google_2fa) else: self.logged_in = True def on_login_error(self, msg): msg = msg.lower() if msg.startswith('incorrect') or msg.endswith('no such user'): self.logged_in = None raise Exception("Invalid credentials") elif 'google' in msg or 'phone' in msg: self.logged_in = None raise Exception("2FA failed") elif 'wrong too many' in msg: self.logged_in = None raise Exception("Blocked by 2FA, contact just-dice") def on_jderror(self, msg): msg = msg.lower() if 'minimum allowed' in msg or 'maximum allowed' in msg: self.waiting_bet_result = None raise Exception("Invalid win chance") elif 'google-auth' in msg: self.waiting_bet_result = None raise Exception("2FA locked") elif 'can not bet' in msg: raise Exception("Could not place bet, check your balance")
class MyWebServer(socketserver.BaseRequestHandler): """ Web server. """ class ClientDisconnected(Exception): """ Raised when a client disconnects while the server is waiting for it to transmit. """ pass class SocketIterator: """ Decoding iterator over a SocketBuffer yielding lines. """ def __init__(self, sio): self.sio = io.TextIOWrapper( io.BufferedReader(sio), newline='\r\n') def __next__(self): """ Read a line from the socket. Returns a line of text (str), with the trailing newline removed. Raises ClientDisconnected if the socket has been disconnected from the other side. """ text = self.sio.readline() if not text: raise self.ClientDisconnected() stripped = text.rstrip('\r\n') return stripped def handle(self): self.handler = MyHTTPHandler(WEB_ROOT) self.sio = SocketIO(self.request) try: req = Request.read_from(self.SocketIterator(self.sio)) if LOG_REQUESTS: print(('{}:{} {} {}').format( self.client_address[0], self.client_address[1], req.method, req.path), file=sys.stderr) resp = self.handler.handle_request(req) except myhttp.ParseError: resp = Response(Response.BAD_REQUEST) except self.ClientDisconnected: # nothing to do, really return except: # Try to send a valid response even if something went wrong if LOG_REQUESTS: print('500 Internal Server Error', file=sys.stderr) self.sio.write(b'HTTP/1.1 500 Internal Server Error\r\n') raise # Attach required header resp.attach_header('Connection', 'close') # send self._send_response(resp) def _send_response(self, resp): """ Write an HTTP response as represented by a Response object to the socket. resp: Response """ assert isinstance(resp, Response) # Attach the current date gmt_now = time.gmtime() ftime = time.strftime('%a, %d %b %Y %H:%M:%S GMT', gmt_now) resp.attach_header('Date', ftime) # write if LOG_REQUESTS: print(' {} {}'.format( resp.code, resp.status_message()), file=sys.stderr) self.sio.write(bytes(resp))
class JustDiceSocket(object): def __init__(self, response, login): self.login = login self._setup_sock(response) def _setup_sock(self, response): self.csrf = None self.user_id = None self.logged_in = False self.waiting_bet_result = False self.last_bet = None self.house_edge = 1 # % origin = BASE_URL self.sock = SocketIO(BASE_DOMAIN, origin, response, secure=True) self.sock.on('init', self.on_init) self.sock.on('set_hash', self.on_set_hash) self.sock.on('reload', self.on_reload) self.sock.on('result', self.on_result) self.sock.on('login_error', self.on_login_error) def bet(self, win_chance, amount, roll_hi): if self.waiting_bet_result: raise Exception("Still waiting for last bet result") which = 'hi' if roll_hi else 'lo' self.sock.emit('bet', self.csrf, {'chance': '%s' % str(win_chance), 'bet': format(amount, '.8f'), 'which': '%s' % which}) self.waiting_bet_result = True def randomize(self, user_seed=None): # user_seed must be a string. self.sock.emit('random', self.csrf) if user_seed is None: user_seed = str(random.randint(0, int('9' * 24))) self.sock.emit('seed', self.csrf, user_seed, True) def on_result(self, result): if result['uid'] == self.user_id: self.last_bet = { 'win': result['win'], 'roll_high': result['high'], 'lucky_number': Decimal(result['lucky']) / 10000} self.waiting_bet_result = False def on_reload(self): self.sock.emit('disconnect') response = load_justdice() self._setup_sock(response) def on_set_hash(self, new_cookie_hash): for cookie in cj: if cookie.name == 'hash': cookie.value = new_cookie_hash break def on_init(self, data): self.csrf = data[u'csrf'] self.user_id = data[u'uid'] self.house_edge = data[u'edge'] if data['username'] is None and self.login: self.sock.emit('login', self.csrf, self.login['user'], self.login['pwd'], '') else: self.logged_in = True def on_login_error(self, msg): msg = msg.lower() if msg.startswith('incorrect') or msg.endswith('no such user'): self.logged_in = None raise Exception("Invalid credentials")
else: channel_name = 'unknown' op = m['op'] #'private' if op == 'subscribe': print "subscribed to channel",channel_name #pprint(m) elif op == 'unsubscribe': pprint(m) elif op == 'remark': pprint(m) elif op == 'private': origin = m['origin'] #'broadcast' private = m['private'] #ticker, trade, depth if private=='trade' and channel==trade: sys.stdout.write("T") ; sys.stdout.flush() #save_trade(m['trade']) elif private=='ticker' and channel==ticker: sys.stdout.write(".") ; sys.stdout.flush() #save_ticker(m['ticker']) elif private=='depth' and channel==depth: sys.stdout.write("d") ; sys.stdout.flush() #save_depth(m['depth']) sio = SocketIO('socketio.mtgox.com/socket.io', main_callback) sio.connect() #sio.thread.join() while True: time.sleep(30)