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
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)
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
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
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)