Пример #1
0
def frontiers():
    time_start = int(time.time())
    # set bot
    bot = bot_start()
    # list from MySQL
    accounts_list_orig = mysql_select_accounts_list()
    accounts_list_extra = mysql_select_accounts_list_extra()
    accounts_list = accounts_list_orig + accounts_list_extra
    # list from node
    frontiers = rpc({
        "action": "wallet_frontiers",
        "wallet": wallet
    }, 'frontiers', True)
    frontiers_old = json.loads(mysql_select_frontiers())
    mysql_set_frontiers(json.dumps(frontiers))

    for account in accounts_list:
        try:
            frontier = frontiers[account[1]]
            frontier_old = frontiers_old[account[1]]
            if ((account[2] != frontier) and (frontier == frontier_old)):
                # update frontier
                try:
                    z = account[5]
                    account_mysql = mysql_select_by_account_extra(account[1])
                    if (account[2] == account_mysql[2]):  # no changes in MySQL
                        mysql_update_frontier_extra(account[1], frontier)
                    else:
                        account = account_mysql
                except IndexError as e:
                    account_mysql = mysql_select_by_account(account[1])
                    if (account[2] == account_mysql[2]):  # no changes in MySQL
                        mysql_update_frontier(account[1], frontier)
                    else:
                        account = account_mysql
                # check if balance changed
                balance = account_balance(account[1])
                logging.info('{0} --> {1}	{2}'.format(mrai_text(account[3]),
                                                      mrai_text(balance),
                                                      frontier))
                #print(balance)
                if (int(account[3]) < balance):
                    receive_messages(bot, account, balance)

        # no frontier. No transactions
        except KeyError as e:
            # doesn't exist
            x = 0  # do something
    time_end = int(time.time())
    total_time = time_end - time_start
    #print(total_time)
    if (total_time > 15):
        logging.warning(
            ('WARNING!!! \nMore than 15 seconds execution time!!!'))
    return total_time
Пример #2
0
def receive_messages(bot, account, balance):
    history = rpc(
        {
            "action": "account_history",
            "account": account[1],
            "count": "50"
        }, 'history')
    for item in history:
        if (item['hash'] == account[2]):
            break
        if (item['type'] == 'receive'):
            lang_id = mysql_select_language(account[0])
            sender_account = item['account']
            sender = find_sender(item, account, sender_account, balance,
                                 lang_text)
            received_amount = int(math.floor(int(item['amount']) / (10**24)))
            logging.warning(
                'NoCallback {0} Nano (XRB) received by {1}, hash: {2}'.format(
                    mrai_text(received_amount), account[0], item['hash']))
            text = lang_text('frontiers_receive',
                             lang_id).format(mrai_text(received_amount),
                                             mrai_text(balance), mrai_text(0),
                                             item['hash'], hash_url, sender)
            mysql_set_sendlist(account[0], text)
            #print(text)
            try:
                push(bot, account[0], text)
                mysql_delete_sendlist(account[0])
            except BadRequest as e:
                logging.exception('Bad request account {0}'.format(account[0]))
            time.sleep(0.25)
            if (received_amount >= large_amount_warning):
                try:
                    push(bot, account[0],
                         lang_text('frontiers_large_amount_warning', lang_id))
                except BadRequest as e:
                    logging.exception('Bad request account {0}'.format(
                        account[0]))
                time.sleep(0.25)
Пример #3
0
	def do_POST(self):
		post_string = self.rfile.read(int(self.headers['Content-Length']))
		post = json.loads(post_string)
		#print(post)
		self.send_response(200)
		self.send_header('Content-Type','application/json')
		self.end_headers()
		# Return empty JSON
		self.wfile.write('{}\n')
		
		xrb_account = post['account']
		account = mysql_select_by_account(xrb_account)
		if (account is False):
			account = mysql_select_by_account_extra(xrb_account)
		if (account is not False):
			block = json.loads(post['block'])
			if ((block['type'] == 'receive') or (block['type'] == 'open')):
				bot = Bot(api_key)
				raw_received = int(post['amount'])
				received_amount = int(math.floor(raw_received / (10 ** 24)))
				balance = account_balance(xrb_account)
				frontier = post['hash']
				# FEELESS
				if ((account[0] in LIST_OF_FEELESS) or (mysql_select_send_time(account[0]) is not False)):
					final_fee_amount = 0
				else:
					final_fee_amount = fee_amount
				# FEELESS
				max_send = balance - final_fee_amount
				if (max_send < 0):
					max_send = 0
				try:
					z = account[4]
					mysql_update_frontier_extra(account[1], frontier)
				except IndexError as e:
					mysql_update_frontier(account[1], frontier)
				logging.info('{0} --> {1}	{2}'.format(mrai_text(account[3]), mrai_text(balance), frontier))
				# retrieve sender
				send_source = block['source']
				block_account = rpc({"action":"block_account","hash":send_source}, 'account')
				lang_id = mysql_select_language(account[0])
				sender = lang_text('frontiers_sender_account', lang_id).format(block_account)
				# Sender info
				if (block_account == faucet_account):
					sender = lang_text('frontiers_sender_faucet', lang_id)
				elif ((block_account == fee_account) or (block_account == welcome_account)):
					sender = lang_text('frontiers_sender_bot', lang_id)
				elif (block_account == account[1]):
					sender = lang_text('frontiers_sender_self', lang_id)
				else:
					accounts_list = mysql_select_accounts_list()
					for sender_account in accounts_list:
						if (sender_account[1] == block_account):
							if ((sender_account[4] is not None) and (sender_account[4])):
								sender = lang_text('frontiers_sender_username', lang_id).format(sender_account[4])
							else:
								sender = lang_text('frontiers_sender_users', lang_id).format(block_account)
					accounts_list_extra = mysql_select_accounts_list_extra()
					for sender_account in accounts_list_extra:
							if (sender_account[1] == block_account):
								user_sender = mysql_select_user(sender_account[0])
								if ((user_sender[8] is not None) and (user_sender[8]) and (account[0] != sender_account[0])):
									sender = lang_text('frontiers_sender_username', lang_id).format(user_sender[8])
								elif (account[0] != sender_account[0]):
									sender = lang_text('frontiers_sender_users', lang_id).format(block_account)
				try:
					z = account[4]
					sender = lang_text('frontiers_sender_by', lang_id).format(sender, account[1].replace("_", "\_"))
					mysql_update_balance_extra(account[1], balance)
				except IndexError as e:
					mysql_update_balance(account[1], balance)
				logging.info(sender)
				logging.info(block_account)
				logging.info('{0} Mrai (XRB) received by {1}, hash: {2}'.format(mrai_text(received_amount), account[0], frontier))
				text = lang_text('frontiers_receive', lang_id).format(mrai_text(received_amount), mrai_text(balance), mrai_text(max_send), frontier, hash_url, sender)
				mysql_set_sendlist(account[0], text.encode("utf8"))
				#print(text)
				push(bot, account[0], text)
				mysql_delete_sendlist(account[0])
		return
Пример #4
0
def frontiers():
    time_start = int(time.time())
    # set bot
    bot = Bot(api_key)
    # list from MySQL
    accounts_list_orig = mysql_select_accounts_list()
    accounts_list_extra = mysql_select_accounts_list_extra()
    accounts_list = accounts_list_orig + accounts_list_extra
    # list from node
    frontiers = rpc({
        "action": "wallet_frontiers",
        "wallet": wallet
    }, 'frontiers')
    frontiers_old = json.loads(mysql_select_frontiers())
    mysql_set_frontiers(json.dumps(frontiers))

    for account in accounts_list:
        try:
            frontier = frontiers[account[1]]
            frontier_old = frontiers_old[account[1]]
            if ((account[2] != frontier) and (frontier == frontier_old)):
                # update frontier
                try:
                    z = account[5]
                    account_mysql = mysql_select_by_account_extra(account[1])
                    if (account[2] == account_mysql[2]):  # no changes in MySQL
                        mysql_update_frontier_extra(account[1], frontier)
                    else:
                        account = account_mysql
                except IndexError as e:
                    account_mysql = mysql_select_by_account(account[1])
                    if (account[2] == account_mysql[2]):  # no changes in MySQL
                        mysql_update_frontier(account[1], frontier)
                    else:
                        account = account_mysql
                # check if balance changed
                balance = account_balance(account[1])
                logging.info('{0} --> {1}	{2}'.format(mrai_text(account[3]),
                                                      mrai_text(balance),
                                                      frontier))
                #print(balance)
                if (int(account[3]) < balance):
                    received_amount = balance - int(account[3])
                    # FEELESS
                    if ((account[0] in LIST_OF_FEELESS) or
                        (mysql_select_send_time(account[0]) is not False)):
                        final_fee_amount = 0
                    else:
                        final_fee_amount = fee_amount
                    # FEELESS
                    max_send = balance - final_fee_amount
                    if (max_send < 0):
                        max_send = 0
                    # retrieve sender
                    send_tx = json.loads(
                        rpc({
                            "action": "block",
                            "hash": frontier
                        }, 'contents'))
                    send_source = send_tx['source']
                    block_account = rpc(
                        {
                            "action": "block_account",
                            "hash": send_source
                        }, 'account')
                    lang_id = mysql_select_language(account[0])
                    sender = lang_text('frontiers_sender_account',
                                       lang_id).format(block_account)
                    # Sender info
                    if (block_account == faucet_account):
                        sender = lang_text('frontiers_sender_faucet', lang_id)
                    elif ((block_account == fee_account)
                          or (block_account == welcome_account)):
                        sender = lang_text('frontiers_sender_bot', lang_id)
                    elif (block_account == account[1]):
                        sender = lang_text('frontiers_sender_self', lang_id)
                    else:
                        for sender_account in accounts_list_orig:
                            if (sender_account[1] == block_account):
                                if ((sender_account[4] is not None)
                                        and (sender_account[4])):
                                    sender = lang_text(
                                        'frontiers_sender_username',
                                        lang_id).format(sender_account[4])
                                else:
                                    sender = lang_text(
                                        'frontiers_sender_users',
                                        lang_id).format(block_account)
                        for sender_account in accounts_list_extra:
                            if (sender_account[1] == block_account):
                                user_sender = mysql_select_user(
                                    sender_account[0])
                                if ((user_sender[8] is not None)
                                        and (user_sender[8])
                                        and (account[0] != sender_account[0])):
                                    sender = lang_text(
                                        'frontiers_sender_username',
                                        lang_id).format(user_sender[8])
                                elif (account[0] != sender_account[0]):
                                    sender = lang_text(
                                        'frontiers_sender_users',
                                        lang_id).format(block_account)
                    try:
                        z = account[5]
                        sender = lang_text('frontiers_sender_by',
                                           lang_id).format(
                                               sender,
                                               account[1].replace("_", "\_"))
                        mysql_update_balance_extra(account[1], balance)
                    except IndexError as e:
                        mysql_update_balance(account[1], balance)
                    logging.info(sender)
                    logging.info(block_account)
                    logging.warning(
                        'NoCallback {0} Mrai (XRB) received by {1}, hash: {2}'.
                        format(mrai_text(received_amount), account[0],
                               frontier))
                    text = lang_text('frontiers_receive', lang_id).format(
                        mrai_text(received_amount), mrai_text(balance),
                        mrai_text(max_send), frontier, hash_url, sender)
                    mysql_set_sendlist(account[0], text.encode("utf8"))
                    #print(text)
                    push(bot, account[0], text)
                    mysql_delete_sendlist(account[0])
                    time.sleep(0.25)
        # no frontier. No transactions
        except KeyError:
            # doesn't exist
            x = 0  # do something
    time_end = int(time.time())
    total_time = time_end - time_start
    #print(total_time)
    if (total_time > 15):
        logging.warning(
            ('WARNING!!! \nMore than 15 seconds execution time!!!'))
    return total_time
async def websockets_receive():
    async with websockets.connect(ws_url) as websocket:
        bot = bot_start()

        await websocket.send(
            json.dumps(
                subscription("confirmation",
                             options={
                                 "include_election_info": "false",
                                 "include_block": "true",
                                 "all_local_accounts": "true"
                             },
                             ack=True)))
        connect = json.loads(await websocket.recv())  # ack
        print(connect)
        logging.info(connect)

        while 1:
            rec = json.loads(await websocket.recv())
            topic = rec.get("topic", None)
            if topic:
                item = rec["message"]
                if topic == "confirmation":
                    item['type'] = item['block']['subtype']
                    if (item['type'] == 'receive' or item['type'] == 'change'
                            or item['type'] == 'epoch'):
                        balance = int(
                            math.floor(
                                int(item['block']['balance']) / (10**24)))
                        account_mysql = mysql_select_by_account(
                            item['account'])
                        extra = False
                        if (account_mysql is False):
                            account_mysql = mysql_select_by_account_extra(
                                item['account'])
                            extra = True
                        if (account_mysql[2] !=
                                item['hash']):  # Compare frontiers
                            if (extra):
                                mysql_update_frontier_extra(
                                    item['account'], item['hash'])
                            else:
                                mysql_update_frontier(item['account'],
                                                      item['hash'])
                            if (item['type'] == 'receive'):  # Receive blocks
                                sender_account = rpc(
                                    {
                                        "action": "block_info",
                                        "hash": item['block']['link']
                                    }, 'block_account')
                                lang_id = mysql_select_language(
                                    account_mysql[0])
                                #logging.info('{0} --> {1}	{2}'.format(mrai_text(account_mysql[3]), mrai_text(balance), item['hash']))
                                sender = find_sender(item, account_mysql,
                                                     sender_account, balance,
                                                     lang_text)
                                received_amount = int(
                                    math.floor(int(item['amount']) / (10**24)))
                                text = lang_text(
                                    'frontiers_receive',
                                    lang_id).format(mrai_text(received_amount),
                                                    mrai_text(balance),
                                                    mrai_text(0), item['hash'],
                                                    hash_url, sender)
                                try:
                                    push(bot, account_mysql[0], text)
                                except BadRequest as e:
                                    logging.exception(
                                        'Bad request account {0}'.format(
                                            account_mysql[0]))
                                logging.info(
                                    '{0} Nano (XRB) received by {1}, hash: {2}'
                                    .format(mrai_text(received_amount),
                                            account_mysql[0], item['hash']))
                                #print(text)
                                # Large amount check
                                if (received_amount >= large_amount_warning):
                                    time.sleep(0.1)
                                    try:
                                        push(
                                            bot, account_mysql[0],
                                            lang_text(
                                                'frontiers_large_amount_warning',
                                                lang_id))
                                    except BadRequest as e:
                                        logging.exception(
                                            'Bad request account {0}'.format(
                                                account_mysql[0]))
                            elif (item['type'] == 'change'):  # Change blocks
                                logging.warning(
                                    'Change block {0} for account {1}'.format(
                                        item['hash'], item['account']))
                                if (balance != int(account_mysql[3])):
                                    logging.error(
                                        'Balance change: {0} --> {1}'.format(
                                            mrai_text(balance),
                                            mrai_text(int(account_mysql[3]))))
                            elif (item['type'] == 'epoch'):  # Epoch blocks
                                logging.warning(
                                    'Epoch block {0} for account {1}'.format(
                                        item['hash'], item['account']))
                                if (balance != int(account_mysql[3])):
                                    logging.error(
                                        'Balance change: {0} --> {1}'.format(
                                            mrai_text(balance),
                                            mrai_text(int(account_mysql[3]))))
                            # Previous block check
                            previous_zero = (
                                item['block']['previous'] ==
                                '0000000000000000000000000000000000000000000000000000000000000000'
                                and account_mysql[2] is None)
                            if ((previous_zero is False)
                                    and item['block']['previous'] !=
                                    account_mysql[2]):
                                logging.error(
                                    'Mismatch for previous block. Expected {0}, received {1}'
                                    .format(account_mysql[2],
                                            item['block']['previous']))
                                if (item['type'] == 'receive'):
                                    time.sleep(0.1)
                                    try:
                                        push(
                                            bot, account_mysql[0],
                                            'Please check received block in explorer, you can receive notification for some older block'
                                        )
                                    except BadRequest as e:
                                        logging.exception(
                                            'Bad request account {0}'.format(
                                                account_mysql[0]))
                else:
                    logging.warning(
                        'Unexpected WebSockets message: {0}'.format(
                            json.dumps(item)))
    def do_POST(self):
        post_string = self.rfile.read(int(self.headers['Content-Length']))
        post = json.loads(post_string)
        #print(post)
        self.send_response(200)
        self.send_header('Content-Type', 'application/json')
        self.end_headers()
        # Return empty JSON
        self.wfile.write('{}\n')

        xrb_account = post['account']
        account = mysql_select_by_account(xrb_account)
        if (account is False):
            account = mysql_select_by_account_extra(xrb_account)
        if (account is not False):
            block = json.loads(post['block'])
            if ((block['type'] == 'state')
                    and (block['subtype'] == 'receive')):
                bot = bot_start()
                raw_received = int(post['amount'])
                received_amount = int(math.floor(raw_received / (10**24)))

                balance = account_balance(xrb_account)
                try:
                    mysql_balance = int(account[3])
                except Exception as e:
                    mysql_balance = 0
                if (mysql_balance == balance):  # workaround
                    logging.warning(
                        'Warning receive balance change. Old: {0}, new: {1}'.
                        format(mysql_balance, balance))
                    time.sleep(1)
                    balance = account_balance(xrb_account)
                    if (mysql_balance == balance):
                        time.sleep(8)
                        balance = account_balance(xrb_account)
                # workaround
                frontier = post['hash']
                try:
                    z = account[5]
                    mysql_update_frontier_extra(account[1], frontier)
                except IndexError as e:
                    mysql_update_frontier(account[1], frontier)
                logging.info('{0} --> {1}	{2}'.format(mrai_text(account[3]),
                                                      mrai_text(balance),
                                                      frontier))
                # retrieve sender
                send_source = block['link']
                block_account = rpc(
                    {
                        "action": "block_account",
                        "hash": send_source
                    }, 'account')
                lang_id = mysql_select_language(account[0])
                sender = lang_text('frontiers_sender_account',
                                   lang_id).format(block_account)
                # Sender info
                if (block_account == faucet_account):
                    sender = lang_text('frontiers_sender_faucet', lang_id)
                elif ((block_account == fee_account)
                      or (block_account == welcome_account)):
                    sender = lang_text('frontiers_sender_bot', lang_id)
                elif (block_account == account[1]):
                    sender = lang_text('frontiers_sender_self', lang_id)
                else:
                    sender_account = mysql_select_by_account(block_account)
                    if (sender_account is not False):
                        if ((sender_account[4] is not None)
                                and (sender_account[4])):
                            sender = lang_text('frontiers_sender_username',
                                               lang_id).format(
                                                   sender_account[4])
                        else:
                            sender = lang_text('frontiers_sender_users',
                                               lang_id).format(block_account)
                    else:
                        sender_account_extra = mysql_select_by_account_extra(
                            block_account)
                        if (sender_account_extra is not False):
                            user_sender = mysql_select_user(
                                sender_account_extra[0])
                            if ((user_sender[8] is not None)
                                    and (user_sender[8]) and
                                (account[0] != sender_account_extra[0])):
                                sender = lang_text('frontiers_sender_username',
                                                   lang_id).format(
                                                       user_sender[8])
                            elif (account[0] != sender_account_extra[0]):
                                sender = lang_text(
                                    'frontiers_sender_users',
                                    lang_id).format(block_account)
                try:
                    z = account[5]
                    sender = lang_text('frontiers_sender_by', lang_id).format(
                        sender, account[1].replace("_", "\_"))
                    mysql_update_balance_extra(account[1], balance)
                except IndexError as e:
                    mysql_update_balance(account[1], balance)
                logging.info(sender)
                logging.info(block_account)
                logging.info(
                    '{0} Nano (XRB) received by {1}, hash: {2}'.format(
                        mrai_text(received_amount), account[0], frontier))
                text = lang_text('frontiers_receive',
                                 lang_id).format(mrai_text(received_amount),
                                                 mrai_text(balance),
                                                 mrai_text(0), frontier,
                                                 hash_url, sender)
                mysql_set_sendlist(account[0], text)
                #print(text)
                try:
                    push(bot, account[0], text)
                    if (received_amount >= large_amount_warning):
                        time.sleep(0.25)
                        push(
                            bot, account[0],
                            lang_text('frontiers_large_amount_warning',
                                      lang_id))
                except BadRequest as e:
                    logging.exception('Bad request account {0}'.format(
                        account[0]))
                mysql_delete_sendlist(account[0])
        return
Пример #7
0
def receive_messages(bot, account, balance):
    history = rpc(
        {
            "action": "account_history",
            "account": account[1],
            "count": "50"
        }, 'history')
    for item in history:
        if (item['hash'] == account[2]):
            break
        if (item['type'] == 'receive'):
            received_amount = int(math.floor(int(item['amount']) / (10**24)))
            # retrieve sender
            block_account = item['account']
            lang_id = mysql_select_language(account[0])
            sender = lang_text('frontiers_sender_account',
                               lang_id).format(block_account)
            # Sender info
            if (block_account == faucet_account):
                sender = lang_text('frontiers_sender_faucet', lang_id)
            elif ((block_account == fee_account)
                  or (block_account == welcome_account)):
                sender = lang_text('frontiers_sender_bot', lang_id)
            elif (block_account == account[1]):
                sender = lang_text('frontiers_sender_self', lang_id)
            else:
                # Sender from bot
                account_mysql = mysql_select_by_account_extra(block_account)
                if (account_mysql is False):
                    # sender from users accounts
                    account_mysql = mysql_select_by_account(block_account)
                    if (account_mysql is not False):
                        if ((account_mysql[4] is not None)
                                and (account_mysql[4])):
                            sender = lang_text('frontiers_sender_username',
                                               lang_id).format(
                                                   account_mysql[4])
                        elif (block_account != account[1]):
                            sender = lang_text('frontiers_sender_users',
                                               lang_id).format(block_account)
                else:
                    # sender from extra accounts
                    user_sender = mysql_select_user(account_mysql[0])
                    if ((user_sender[8] is not None) and (user_sender[8])
                            and (account[0] != account_mysql[0])):
                        sender = lang_text('frontiers_sender_username',
                                           lang_id).format(user_sender[8])
                    elif (block_account != account[1]):
                        sender = lang_text('frontiers_sender_users',
                                           lang_id).format(block_account)
            try:
                z = account[5]
                sender = lang_text('frontiers_sender_by', lang_id).format(
                    sender, account[1].replace("_", "\_"))
                mysql_update_balance_extra(account[1], balance)
            except IndexError as e:
                mysql_update_balance(account[1], balance)
            logging.info(sender)
            logging.info(block_account)
            logging.warning(
                'NoCallback {0} Nano (XRB) received by {1}, hash: {2}'.format(
                    mrai_text(received_amount), account[0], item['hash']))
            text = lang_text('frontiers_receive',
                             lang_id).format(mrai_text(received_amount),
                                             mrai_text(balance), mrai_text(0),
                                             item['hash'], hash_url, sender)
            mysql_set_sendlist(account[0], text)
            #print(text)
            push(bot, account[0], text)
            mysql_delete_sendlist(account[0])
            time.sleep(0.25)
            if (received_amount >= large_amount_warning):
                push(bot, account[0],
                     lang_text('frontiers_large_amount_warning', lang_id))
                time.sleep(0.25)