示例#1
0
def monitoring_peers():
    # set bot
    bot = bot_start()
    try:
        # list of available peers
        rpc_peers = peers_ip()
        # remote peer peers list
        remote_peers = reference_peers()
        # check in the list of available peers
        for peer in peer_list:
            if (peer not in rpc_peers and peer not in remote_peers):
                # check peers from nanocrawler.cc
                http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED',
                                           ca_certs=certifi.where())
                response = http.request('GET',
                                        peers_url,
                                        headers=header,
                                        timeout=10.0)
                json_data = json.loads(response.data)
                json_peers = json_data['peers']
                if (peer not in json_peers
                        and '::ffff:{0}'.format(peer) not in json_peers):
                    # Warning to admins
                    for user_id in admin_list:
                        push(bot, user_id,
                             'Peer *{0}* is offline'.format(peer))
    except AttributeError as e:
        for user_id in admin_list:
            push(bot, user_id, 'Peers list is empty!')
示例#2
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
示例#3
0
def frontiers_sendlist():
    bot = bot_start()
    sendlist = mysql_select_sendlist()
    for send in sendlist:
        time.sleep(5)  # if long push to user
        sendlist_new = mysql_select_sendlist()
        if (send in sendlist_new):
            try:
                push(bot, send[0], send[1].replace("_", "\_"))
                logging.warning('NoCallback From sendlist: {0} :: {1}'.format(
                    send[0], send[1]))
            except Exception as e:
                logging.warning(
                    'NoCallback From sendlist + exception: {0} :: {1}'.format(
                        send[0], send[1]))
                logging.error(e)
            mysql_delete_sendlist(send[0])
示例#4
0
def monitoring_block_count():
    # set bot
    bot = bot_start()
    count = int(rpc({"action": "block_count"}, 'count'))
    reference_count = int(reference_block_count())

    http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED',
                               ca_certs=certifi.where())
    try:
        response = http.request('GET',
                                nanocrawler_url,
                                headers=header,
                                timeout=20.0)
        json_data = json.loads(response.data)
        nanocrawler_count = int(json_data['send']) + int(
            json_data['receive']) + int(json_data['open']) + int(
                json_data['change']) + int(json_data['state'])
    except (ValueError, urllib3.exceptions.ReadTimeoutError,
            urllib3.exceptions.MaxRetryError) as e:
        nanocrawler_count = reference_count
    difference = int(math.fabs(nanocrawler_count - count))

    try:
        response = http.request('GET',
                                block_count_url,
                                headers=header,
                                timeout=20.0)
        raiwallet_count = int(response.data)
    except (urllib3.exceptions.ReadTimeoutError,
            urllib3.exceptions.MaxRetryError) as e:
        raiwallet_count = reference_count

    if (difference > block_count_difference_threshold * 3):
        # Warning admins
        for user_id in admin_list:
            push(
                bot, user_id,
                'Block count: {0}\nnanocrawler.cc: {1}\nDifference: *{2}*\nReference: {3}\nraiwallet.info: {4}'
                .format(count, nanocrawler_count, difference, reference_count,
                        raiwallet_count))
        # trying to fix
        bootstrap_multi()
    elif (difference > block_count_difference_threshold):
        # trying to fix
        bootstrap_multi()
示例#5
0
def price_check():
    bot = bot_start()
    price = mysql_select_price()

    # check if higher
    users_high = mysql_select_price_high()
    price_high_mercatox = max(int(price[0][0]), int(price[0][4]))
    price_high_kucoin = max(int(price[3][0]), int(price[3][4]))
    price_high_binance = max(int(price[5][0]), int(price[5][4]))
    for user in users_high:
        if ((price_high_mercatox >= int(user[1]))
                and ((int(user[2]) == 0) or (int(user[2]) == 2))):
            prices_above_below(bot, user[0], price_high_mercatox,
                               "Mercatox.com", 1)
        elif ((price_high_kucoin >= int(user[1]))
              and ((int(user[2]) == 0) or (int(user[2]) == 3))):
            prices_above_below(bot, user[0], price_high_kucoin, "Kucoin.com",
                               1)
        elif ((price_high_binance >= int(user[1]))
              and ((int(user[2]) == 0) or (int(user[2]) == 4))):
            prices_above_below(bot, user[0], price_high_binance, "Binance.com",
                               1)

    # check if lower
    users_low = mysql_select_price_low()
    price_low_mercatox = min(int(price[0][0]), int(price[0][3]))
    price_low_kucoin = min(int(price[3][0]), int(price[3][3]))
    price_low_binance = min(int(price[5][0]), int(price[5][3]))
    for user in users_low:
        if ((price_low_mercatox <= int(user[1]))
                and ((int(user[2]) == 0) or (int(user[2]) == 2))):
            prices_above_below(bot, user[0], price_low_mercatox,
                               "Mercatox.com", 0)
        elif ((price_low_kucoin <= int(user[1]))
              and ((int(user[2]) == 0) or (int(user[2]) == 3))):
            prices_above_below(bot, user[0], price_low_kucoin, "Kucoin.com", 0)
        elif ((price_low_binance <= int(user[1]))
              and ((int(user[2]) == 0) or (int(user[2]) == 4))):
            prices_above_below(bot, user[0], price_low_binance, "Binance.com",
                               0)
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