Задать вопрос
@COUT_man

Почему не работает обработчик ответа пользователя в Телеграмм боте?

Добрый день! Подскажите пожалуйста где делаю ошибку.
у бота задуман функционал для регистрации пользователей а так же их удаления.

@bot.message_handler(content_types=['text'])
def  start(message):
    user = message.from_user
    if not check_user(user.id):
        markup = types.ReplyKeyboardMarkup(row_width=1)
        bot.send_message(message.chat.id, "Для начала работы с ботом зарегистрируйтесь.")
        reg = types.InlineKeyboardButton(text="Регистрация", callback_data="registration")
        markup.add(reg)
        bot.send_message(message.chat.id, 'Выберите пункт меню:', reply_markup=markup)
        if message.text == 'Регистрация':
            bot.register_next_step_handler(message, register)

@bot.message_handler(func=lambda message: message.text == 'Регистрация')
def register(message):
    user = message.from_user
    data = message.text.split(',')
    if check_user(user.id):
        bot.send_message(message.chat.id, "Вы уже зарегистрированы!.")
        return
    elif len(data) != 3 or None in data:
        bot.send_message(message.chat.id, "Для регистрации отправьте данные в формате: имя, фамилия, username через запятую.")
    else:
        bot.register_next_step_handler(user, register_user, data)
        bot.send_message(message.chat.id, "Регистрация прошла успешно.")
        button_menu(message)

def register_user(user, data):
    user_id = user.id
    print(data, 'in func reg user')
    cur.execute("INSERT INTO users (user_id, username, first_name, last_name) VALUES (?, ?, ?, ?)",
                (user_id, data[0], data[1], data[2]))
    conn.commit()


при всём этом функционал удаления работает нормально:
@bot.message_handler(func=lambda message: message.text == 'Удалить пользователя ТГ')
def delete_user(message):
    cur.execute("SELECT * FROM users")
    users = cur.fetchall()
    response = "Выберите пользователя для удаления:\n"
    for i, user in enumerate(users, start=1):
        response += f"{i}. {user[1]} ({user[2]})\n"
    bot.reply_to(message, response)
    bot.register_next_step_handler(message, delete_user_selection, users)

def delete_user_selection(message, users):
    try:
        user_id = int(message.text)
        user_to_delete = users[user_id - 1][0]
        cur.execute("DELETE FROM users WHERE user_id=?", (user_to_delete,))
        conn.commit()

        bot.reply_to(message, "Пользователь успешно удален")
    except ValueError:
        bot.reply_to(message, "Пожалуйста, введите номер пользователя для удаления")


никак не могу разобраться с принципами работы декораторов в Telebot... Где нужно указывать @bot.message_handler(func=lambda message: message=True) а где @bot.callback_query_handler(func=lambda call: True) или где можно это проигнорировать. Информации много в интернете. А вот структуру пока выстроить в голове не получилось... Помогите пожалуйста разобраться.
  • Вопрос задан
  • 72 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
А чего тут выстраивать.
Приходит событие.
Бот перебирает обработчики этого события.
Для каждого обработчика вызывается func, пока она не вернёт True.
Этот обработчик и вызывается для обработки события.
Вот и всё.

Единственный вопрос - порядок перебора обработчиков. Варианта реально два: либо в хронологическом порядке регистрации, либо в обратном хронологическом (что менее вероятно).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы