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

Почему не работает диалог с телеграм-ботом?

Есть кусок кода ТГ такси-бота, изначально был написан chatGPT , но потом частично переработан вручную, что то может быть лишним. В функции start_command проверяется есть ли в базе уже Имя и Телефон, если нет - переход к этапу ввода имени ENTER_NAME, если есть то задается вопрос "Использовать эти контактные данные?" и идет переход к этапу CONFIRM: если нажатие на Да - переход к этапу ENTER_DESTINATION (функция в примере не указана), если нажатие на Нет - переход к этапу ENTER_NAME.

Проблема: В случае отсутствия начальных данных после появления 'Добро пожаловать! Давайте начнем процесс заказа такси.' ничего не происходит. В случае наличия данных и нажатия на Да или Нет тоже ничего не происходит.

Как правильно организовать переходы к этапам?

# services.py
from telegram import Update, ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove
from telegram.ext import ContextTypes, ConversationHandler
from database import add_user_to_db, add_order_to_db, get_last_user_data

ENTER_NAME, ENTER_PHONE, ENTER_DESTINATION, ENTER_PASSENGERS, ENTER_LUGGAGE, CONFIRM, CONFIRM_ORDER, MODIFY_SELECTION = range(8)


_______________________________________________________________________________________________________


async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
    # Очищаем данные пользователя
    context.user_data.clear()

 
    await update.message.reply_text(
        'Добро пожаловать! Давайте начнем процесс заказа такси.',
        reply_markup=ReplyKeyboardRemove()
    )

    # Проверяем, есть ли уже данные пользователя в БД
    user_id = update.effective_user.id
    name, phone = get_last_user_data(user_id)

    if name and phone:
        # Если данные есть, предлагаем использовать их
        context.user_data['name'] = name
        context.user_data['phone'] = phone

        keyboard = [[KeyboardButton('Да'), KeyboardButton('Нет')]]
        reply_markup = ReplyKeyboardMarkup(keyboard, resize_keyboard=True)

        await update.message.reply_text(
            f'Использовать эти контактные данные?\n\nИмя: {name}\nТелефон: {phone}',
            reply_markup=reply_markup
        )

        return CONFIRM

    else:
        # Если данных нет, начинаем процесс регистрации
        return ENTER_NAME

__________________________________________________________________________________________________________

async def confirm_contact(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
    text = update.message.text

    if text == 'Да':
        return ENTER_DESTINATION  # Переход к следующему этапу
    elif text == 'Нет':
        return ENTER_NAME  # Переход к этапу ENTER_NAME для ввода имени


____________________________________________________________________________________________________________

async def enter_name(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:

    await update.message.reply_text('Пожалуйста, введите ваше имя.',)

    text = update.message.text

    # Сохранение имени и переход к следующему шагу
    context.user_data['name'] = text
    return ENTER_PHONE


ConversationHandler - находится в другом файле и тоже приведен не с полным перечнем этапов.

def register_handlers(app: Application):
    # Обработчик для команды /start, запускающий процесс регистрации и заказа
    start_conv = ConversationHandler(
        entry_points=[CommandHandler('start', start_command)],
        states={
            CONFIRM: [MessageHandler(filters.TEXT & ~filters.COMMAND, confirm_contact)],
            ENTER_NAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, enter_name)],
},
        fallbacks=[],
    )

    # Добавляем обработчик для процесса оформления на команду "Старт"
    app.add_handler(start_conv)
  • Вопрос задан
  • 212 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 1
Братец, у тебя отсутствует обработка состояния ENTER_PHONE после сохранения имени пользователя.
Попробуй добавить ENTER_PHONE и ENTER_DESTINATION после ENTER_NAME
Ответ написан
Ваш ответ на вопрос

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

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