Python Telebot Messagehandlers

18 Views Asked by At

When I change BTC state it works properly, but when I try to change ETH it changes the BTC state. I think that the problem is in handlers, so it calls only the first handler(BT) and doesn't see the second one(ETH). It doesn't even print 'ETH CHANGEEEEED'. Maybe sth is wrong not with handlers?

I want to make it work properly. Code:

class Exchange:
    def __init__(self):
        self.db_user_obj = user.User()
        self.prices_obj = prices_main.Prices_main()
        self.__CURR_USER_ID = ''

    def change_user_wallet_data(self, bal, cur, amount, new_cur_state):
        final_sum_usdt = str(float(bal) - float(amount))
        prev_wallet_state = self.db_user_obj.get_user_wallet_data(self.__CURR_USER_ID)
        # Change USDT state
        self.db_user_obj.set_cur_state('USDT', self.__CURR_USER_ID, final_sum_usdt)

        if cur == 'BTC':
            updated_cur_state = float(prev_wallet_state[14]) + float(new_cur_state)
            self.db_user_obj.set_cur_state('BTC', str(self.__CURR_USER_ID), updated_cur_state)
        elif cur == 'ETH':
            updated_cur_state = float(prev_wallet_state[13]) + float(new_cur_state)
            self.db_user_obj.set_cur_state('ETH', self.__CURR_USER_ID, updated_cur_state)

    def isFloat(self, num):
        try:
            float(num)
            return True
        except ValueError:
            return False

    def main(self, bot, message, currency, user_obj):
        markup = types.InlineKeyboardMarkup()

        markup.add(types.InlineKeyboardButton('< Назад', callback_data='sell'))
        self.__CURR_USER_ID = user_obj.get_user_data()[0]
        self.__USER_BAL_USDT = self.db_user_obj.get_user_wallet_data(self.__CURR_USER_ID)[15]
        if currency == 'BTC':
            bot.send_message(message.chat.id,
                             '<b> USDT / BTC </b>' + '\n\n'
                            f'<b><i>Доступно для покупки: </i></b> {self.__USER_BAL_USDT} USDT' + '\n\n'
                             '<b><i>Введите сууму для покупки BTC в USDT</i></b>',
                             reply_markup=markup, parse_mode='html')

            @bot.message_handler(func=lambda message: True)
            def handle_messagerr_btc(message):
                msg = str(message.text)
                avlbl_to_buy_btc = float(msg) / self.prices_obj.get_price('BTC')
                if self.isFloat(msg):
                    if float(msg) <= float(self.__USER_BAL_USDT):
                        # Extract USDT from user's wallet in DB:
                        self.change_user_wallet_data(self.__USER_BAL_USDT, 'BTC', float(msg), avlbl_to_buy_btc)
                        bot.reply_to(message, '<b><i>Обмен прошёл успешно. ' + '\n\n'
                                               f'Ваш баланс пополнен на </i></b>{avlbl_to_buy_btc} <b><i>BTC.</i></b>',
                                     reply_markup=markup, parse_mode='html')
                        markup.add(types.InlineKeyboardButton('< Назад', callback_data='sell'))
                    else:
                        bot.reply_to(message, "<b>Недостаточно средств</b>",
                                     parse_mode='html')
                        self.main(bot, message, 'BTC', user_obj)
                else:
                    bot.reply_to(message, "<b>Некоректная сумма</b>",
                                 parse_mode='html')
                    self.main(bot, message, 'BTC', user_obj)

        elif currency == 'ETH':
            bot.send_message(message.chat.id,
                             '<b> USDT / ETH </b>' + '\n\n'
                            f'<b><i>Доступно для покупки: </i></b> {self.__USER_BAL_USDT} USDT' + '\n\n'
                             '<b><i>Введите сууму для покупки ETH</i></b>',
                             reply_markup=markup, parse_mode='html')

            @bot.message_handler(func=lambda message: True)
            def handle_messagerr_eth(message):
                print('ETH CHANGEEEEEEEED')
                msg = str(message.text)
                avlbl_to_buy_eth = float(msg) / self.prices_obj.get_price('ETH')
                if self.isFloat(msg):
                    if float(msg) <= float(self.__USER_BAL_USDT):
                        # Extract USDT from user's wallet in DB:
                        self.change_user_wallet_data(self.__USER_BAL_USDT, 'ETH', float(msg), avlbl_to_buy_eth)
                        bot.reply_to(message, '<b><i>Обмен прошёл успешно. ' + '\n\n'
                                                                               f'Ваш баланс пополнен на </i></b>{avlbl_to_buy_eth} <b><i>ETH.</i></b>',
                                     reply_markup=markup, parse_mode='html')
                        markup.add(types.InlineKeyboardButton('< Назад', callback_data='sell'))
                    else:
                        bot.reply_to(message, "<b>Недостаточно средств</b>",
                                     parse_mode='html')
                        self.main(bot, message, 'ETH', user_obj)
                else:
                    bot.reply_to(message, "<b>Некоректная сумма</b>",
                                 parse_mode='html')
                    self.main(bot, message, 'ETH', user_obj)
0

There are 0 best solutions below