Не могу сохранить сообщение пользователя Telegram боту как число

@bot.message_handler(commands = ['calc'])
def text(chat_data):
    bot.send_message(chat_data.chat.id, 'В <b>Pyrocalc</b> есть множество типов калькуляторов! Чтобы использовать какой-либо из них, напишите в чат: «поиск n», «поиск i» ', parse_mode='html')
    @bot.message_handler()
    def text(chat_data):
        if chat_data.text == 'поиск n':
            bot.send_message(chat_data.chat.id, 'Пожалуйста, введите известное значение <b>i</b> в следующем сообщении.', parse_mode='html')
            Calculator.calcsave = chat_data.text
            i = Calculator.calcsave
            while i == 'поиск n':
                Calculator.calcsave = chat_data.text
                i = Calculator.calcsave
                print(i)
                if i > 0:
                    n = 2**i
                    bot.send_message(chat_data.chat.id, f'<b>N</b> = {n}', parse_mode='html')
                else:
                    bot.send_message(chat_data.chat.id, f'Ошибка! i должна быть больше нуля!')

В этом отрывке кода я пишу команду, бот на нее реагирует и просит ввести значение i, однако на этом моменте все ломается. Мне нужно чтобы сообщение сохранялось как целое число, чтобы бот мог возвести 2 в указанную мною степень. До этого у меня было много попыток сделать это, но безуспешно. Работаю с ботом в первый раз, надеюсь на помощь.


Ответы (1 шт):

Автор решения: mrBars1k
from telebot import TeleBot
from telebot.types import Message

bot = TeleBot('ТОКЕН')

class Calculator:
    calcsave = None

@bot.message_handler(commands=['calc'])
def text(message: Message):
    bot.send_message(message.chat.id, 'В <b>Pyrocalc</b> есть множество типов калькуляторов! Чтобы использовать какой-либо из них, напишите в чат: «поиск n», «поиск i» ', parse_mode='html')

@bot.message_handler(func=lambda message: message.text.lower() == 'поиск n')
def handle_search_n(message: Message):
    bot.send_message(message.chat.id, 'Пожалуйста, введите известное значение <b>i</b> в следующем сообщении.', parse_mode='html')
    Calculator.calcsave = 'поиск n'

@bot.message_handler(func=lambda message: Calculator.calcsave == 'поиск n')
def handle_i_value(message: Message):
    try:
        i = int(message.text)
        if i > 0:
            n = 2 ** i
            bot.send_message(message.chat.id, f'<b>N</b> = {n}', parse_mode='html')
        else:
            bot.send_message(message.chat.id, f'Ошибка! i должна быть больше нуля!')
    except ValueError:
        bot.send_message(message.chat.id, 'Пожалуйста, введите целое число для значения <b>i</b>.', parse_mode='html')

bot.polling(none_stop=True)

Рабочий вариант кода, который выполняет данную задачу. Возможно Вам нужно будет подкорректировать под себя.

Вместе цикла while для ожидания ответа, здесь используется @bot.message_handler(func=lambda message: True).

Также добавил ответ на случай, когда введено не число или отрицательное число.

Чтобы преобразовать переменную в число, достаточно всего лишь воспользоваться функцией int(название_переменной).

upd: Возможно вот такой вариант программы Вам подойдёт и от него будет легче отталкиваться:

import telebot

TOKEN = 'TOKEN'

bot = telebot.TeleBot(TOKEN)

@bot.message_handler(commands=['start'])
def handle_start(message):
    bot.send_message(message.chat.id, 'Привет! Для использования бота напиши команду /calc.')

@bot.message_handler(commands=['calc'])
def handle_calc(message):
    bot.send_message(message.chat.id, 'Теперь введи два числа через пробел.')

    bot.register_next_step_handler(message, get_numbers) ## переход на следующий шаг;

def get_numbers(message):
    try:
        numbers = [int(num) for num in message.text.split()] ## берём оба числа;
        result = numbers[0] ** numbers[1] ## возводим первое в степень другого;
        bot.send_message(message.chat.id, f'Результат: {result}')
    except (ValueError, IndexError): ## в случае ошибки;
        bot.send_message(message.chat.id, 'Ошибка. Введены некорректные данные. Пожалуйста, повторите попытку.')

bot.polling(none_stop=True)

Пример:

\calc
>>> Теперь введи два числа через пробел.
8 2
>>> Результат: 64.0
→ Ссылка