DarkWood
@DarkWood

Как в боте Telegram выдавать сообщения из списка по команде пользователя?

Здравствуйте.

Хочу написать довольно простого бота для Telegram. Использую Telebot. Столкнулся с задачей, которую пока что самостоятельно не смог решить.

Есть список с сообщениями. Бот должен выдавать их по порядку, когда пользователь нажимает на кнопку "Следующее задание". Для ожидания ответа есть понятный bot.register_next_step_handler. А вот как его обернуть в цикл? Или есть какой-то другой метод.

test_lst = ["test_" + str(i) for i in range(1, 6)]


def next_quest_gui(m):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    markup.add(*[types.KeyboardButton(name) for name in ["Следующее задание", "Выход"]])
    bot.send_message(m.chat.id, 'Выберите действие', reply_markup=markup)


def action(m):
    send = bot.send_message(m.chat.id, 'Выберите действие')
    bot.register_next_step_handler(send, cycle)


@bot.message_handler(commands=["start"])
def start(m, res=False):
    bot.send_message(m.chat.id, test_lst[0])
    next_quest_gui(m)


@bot.message_handler(content_types=["text"])
def cycle(m):
    index = 0
    if m.text == "Следующее задание":
        index += 1
        bot.send_message(m.chat.id, test_lst[index])
        action(m)
    else:
        bot.send_message(m.chat.id, 'Ваш прогресс сохранен')
  • Вопрос задан
  • 137 просмотров
Решения вопроса 1
DarkWood
@DarkWood Автор вопроса
Таки сам нашел решение: использовать итератор для списка. Мой код для примера при этом становится таким:

test_lst = ["test_" + str(i) for i in range(1, 6)]
itr = iter(test_lst)

def next_quest_gui(m):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    markup.add(*[types.KeyboardButton(name) for name in ["Следующее задание", "Выход"]])
    bot.send_message(m.chat.id, 'Выберите действие', reply_markup=markup)


def action(m):
    send = bot.send_message(m.chat.id, 'Выберите действие')
    bot.register_next_step_handler(send, cycle)


@bot.message_handler(commands=["start"])
def start(m, res=False):
    bot.send_message(m.chat.id, next(itr))
    next_quest_gui(m)


@bot.message_handler(content_types=["text"])
def cycle(m):
    if m.text == "Следующее задание":
        msg = bot.send_message(m.chat.id, next(itr))
        bot.register_next_step_handler(msg, cycle)
    else:
        bot.send_message(m.chat.id, 'Ваш прогресс сохранен')
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы