@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, '>>>>>!!!')


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

Вопрос:
Как завершить слушать первый декоратор или саму функцию что бы он перешел ко второй и начал слушать ввод на ней?
  • Вопрос задан
  • 436 просмотров
Решения вопроса 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())
#Хватает и одной строки

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

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

Войти через центр авторизации
Похожие вопросы
07 мая 2024, в 14:11
4000 руб./за проект
07 мая 2024, в 14:10
10000 руб./за проект
07 мая 2024, в 14:04
1300 руб./за проект