@Aibot92

Как прекратить «слушать» bot.*_handler?

Всем доброго дня!
Скажу заранее перерыл весь Гугл и не смог найти ответа.
Пишу своего первого телеграм-бота с помощью pyTelegrambotAPI
Столкнулся с такой проблемой:
- Допустим есть декоратор случающий клавиатуру в одном месте
@bot.message_handler(commands=['rename'])
def rename (massage):
    bot.send_message(massage.from_user.id, f'Привет , твое имя в телеграмм: {massage.from_user.first_name} \n'
                                           f'На какое хотите заменить?')
    bot.register_next_step_handler(massage,save_name)
def save_name (massage):
    global user_name
    user_name = massage.text
    quest = f'хорош, тепеь я буду называть Вас {user_name}, сохраняем?'
    keybord = keybord_yes_or_no()
    bot.send_message(massage.from_user.id, text= quest, reply_markup=keybord)
@bot.callback_query_handler(func=lambda call: True )
def rename_seve(call):
    if call.data == 'yes':
        global users
        users = ({
            'id': call.from_user.id,
            'name': user_name
        })
        bot.send_message(call.message.chat.id, f"Теперь для Вашего id {users['id']} будет сохранено имя {users['name']}")
    elif call.data == 'no':
        bot.send_message(call.from_user.id, 'Ок ничего не сохраняю')


и допустим я вызываю клавиатуру в другом месте :
@bot.message_handler(func=lambda message: sp.spelled(message.text.lower()) == "привет")
def hi (massage):
    bot.send_message(massage.chat.id, f"Привет ")
    keybord_1 = keybord_yes_or_no()
    q= '>>>>>>'
    bot.send_message(massage.chat.id,text=q, reply_markup=keybord_1)
@bot.callback_query_handler(func=lambda call: True)
def requset(call):
    if call.data == 'yes':
        bot.send_message(call.from_user.id, '>>>>????')
    elif call.data == 'no':
        bot.send_message(call.chat.id, '>>>>>!!!')


И естественно он "слушает" первый декоратор

Вопрос:
Как завершить слушать первый декоратор или саму функцию что бы он перешел ко второй и начал слушать ввод на ней?
  • Вопрос задан
  • 424 просмотра
Решения вопроса 1
@Alexa2007
В данном варианте думаю вместо декораторов, следует использовать знакомый тебе метод bot.register_next_step_handler(massage,save_name). В примере с гитхаба видно как задается вопрос какой пол? и добавляется две кнопки м и ж, а в том сообщении куда они передаются, удаляются, а ответ обрабатывается как текст.
def process_age_step(message):
    try:
        chat_id = message.chat.id
        age = message.text
        if not age.isdigit():
            msg = bot.reply_to(message, 'Age should be a number. How old are you?')
            bot.register_next_step_handler(msg, process_age_step)
            return
        user = user_dict[chat_id]
        user.age = age
        markup = types.ReplyKeyboardMarkup(one_time_keyboard=True)
        markup.add('Male', 'Female')
        msg = bot.reply_to(message, 'What is your gender', reply_markup=markup)
        bot.register_next_step_handler(msg, process_sex_step)
    except Exception as e:
        bot.reply_to(message, 'oooops')


def process_sex_step(message):
    try:
        chat_id = message.chat.id
        sex = message.text


Еще хотел бы предложить внести изменения в код, в таких случаях:
keybord = keybord_yes_or_no()
    bot.send_message(massage.from_user.id, text= quest, reply_markup=keybord)


Если генерировать кнопки таким способом, будет на одну строчку меньше:
def day_btns():
  days = types.InlineKeyboardMarkup(row_width=7)
  days.add(*[types.InlineKeyboardButton(text='Day '+str(i),callback_data='call'+str(i)) for i in range(1,8)])
  return days

#Пример использования
bot.send_message(message.chat.id,'Days of week',reply_markup=day_btns())
#Хватает и одной строки

Так же если интересно вот полный образец моего тестового бота
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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