Зацикливается отправка сообщений python, pytelegrambotapi

Делаю бота с множеством функций и одна из них - отправка рандомного числа

@bot.message_handler( commands=[ 'rnd' ])
def read_o1(message):
    bot.reply_to(message, 'Введи откуда мне стоит начать')
    @bot.message_handler()
    def read_o2(message):
        bot.reply_to(message, 'Введи, где мне стоит закончить')
        o1 = int(message.text)
    @bot.message_handler()
    def kch(message):
        bot.reply_to(message, 'А сколько чисел нужно?')
        o2 = int(message.text)
    @bot.message_handler(func=lambda message: True)
    def send_r(message):
        kch = int(message.text)
        try:
            while i != kch:
                bot.reply_to(message, random.randint(o1, o2))
                i += 1
        except:
            bot.reply_to(message, 'Прости, но произошла ошибка!')

Но при тесте бота он начинает бесконечно отправлять одни и то же сообщение

Это фото диалога с ботом


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

Автор решения: Krutoy 4el

Вложенный message_handler() нормально работать не будет, нужно всё обрабатывать в одной функции, а прогресс получения информации от пользователя хранить. Например как-то так:

rnd_sessions = {}

@bot.message_handler( commands=[ 'rnd' ])
def rnd_start(message):
    rnd_sessions[message.from_user] = []
    bot.reply_to(message, 'Введи откуда мне стоит начать')


@bot.message_handler(func = lambda message: message.from_user in rnd_sessions)
def rnd_read_next(message):
    current = rnd_sessions[message.from_user]  # копируем ссылку на список
    current.append(message.text)  # добавляем число
    num = len(current)  # узнаем, сколько у нас уже есть чисел
    if num == 1:  # есть одно, просим другое
        bot.reply_to(message, 'Введи, где мне стоит закончить')
    elif num == 2:  # уже есть два, запрашиваем третее
        bot.reply_to(message, 'А сколько чисел нужно?')
    elif num == 3:  # у нас есть все нужные числа
        try:
            for i in range(int(current[2])):
                bot.reply_to(message, random.randint(int(current[0]), int(current[1])))
        except:
            bot.reply_to(message, 'Прости, но произошла ошибка!')
        del rnd_sessions[message.from_user]  # сессия завершена

На практике, к сожалению, не проверял.

→ Ссылка