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)
Пример #2
0
    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)
Пример #3
0
    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)
Пример #4
0
    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)
Пример #5
0
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")
Пример #6
0
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))
Пример #8
0
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)