Есть кусок кода ТГ такси-бота, изначально был написан 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)