From 80f248770a1e56f35ec76a872393af91bb6059ec Mon Sep 17 00:00:00 2001 From: "mamonov.ep" Date: Thu, 4 Dec 2025 16:00:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B5=D0=B4=D0=BE=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=8E=D1=89=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Изменения: - Исправлена логика определения нового пользователя (проверка до создания) - Добавлены все команды в приветственное сообщение (включая /import, /reminder, /level_test) - Обновлена справка /help с добавлением /level_test - Улучшено сообщение для существующих пользователей - Добавлены переменные окружения postgres_* в settings.py для Docker - Добавлен greenlet==3.1.1 в requirements.txt для работы SQLAlchemy async Теперь новые пользователи правильно получают предложение пройти тест уровня при первом запуске. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- bot/handlers/start.py | 63 +++++++++++++++++++++++++------------------ config/settings.py | 4 +++ requirements.txt | 1 + 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/bot/handlers/start.py b/bot/handlers/start.py index 5975188..f8ab611 100644 --- a/bot/handlers/start.py +++ b/bot/handlers/start.py @@ -13,14 +13,19 @@ router = Router() async def cmd_start(message: Message, state: FSMContext): """Обработчик команды /start""" async with async_session_maker() as session: + # Проверяем, существует ли пользователь + existing_user = await UserService.get_user_by_telegram_id(session, message.from_user.id) + is_new_user = existing_user is None + + # Создаём или получаем пользователя user = await UserService.get_or_create_user( session, telegram_id=message.from_user.id, username=message.from_user.username ) - if user.created_at.timestamp() > (message.date.timestamp() - 60): - # Новый пользователь (создан менее минуты назад) + if is_new_user: + # Новый пользователь await message.answer( f"👋 Привет, {message.from_user.first_name}!\n\n" f"Я бот для изучения английского языка. Помогу тебе:\n" @@ -28,15 +33,17 @@ async def cmd_start(message: Message, state: FSMContext): f"✍️ Выполнять интерактивные задания\n" f"💬 Практиковать язык в диалоге с AI\n" f"📊 Отслеживать свой прогресс\n\n" - f"Основные команды:\n" - f"/add [слово] - добавить слово в словарь\n" - f"/words [тема] - тематическая подборка\n" - f"/vocabulary - мой словарь\n" - f"/task - получить задание\n" - f"/practice - диалог с AI\n" - f"/stats - статистика\n" - f"/settings - настройки\n" - f"/help - справка\n\n" + f"Команды:\n" + f"• /add [слово] - добавить слово\n" + f"• /words [тема] - тематическая подборка\n" + f"• /import - импорт из текста\n" + f"• /vocabulary - мой словарь\n" + f"• /task - задания\n" + f"• /practice - диалог с AI\n" + f"• /stats - статистика\n" + f"• /settings - настройки\n" + f"• /reminder - напоминания\n" + f"• /help - полная справка" ) # Предлагаем пройти тест уровня @@ -56,11 +63,14 @@ async def cmd_start(message: Message, state: FSMContext): # Существующий пользователь await message.answer( f"С возвращением, {message.from_user.first_name}! 👋\n\n" - f"Готов продолжить обучение?\n" - f"/vocabulary - посмотреть словарь\n" - f"/task - получить задание\n" - f"/practice - практика диалога\n" - f"/stats - статистика" + f"Готов продолжить обучение?\n\n" + f"Быстрый доступ:\n" + f"• /vocabulary - посмотреть словарь\n" + f"• /task - получить задание\n" + f"• /practice - практика диалога\n" + f"• /words [тема] - тематическая подборка\n" + f"• /stats - статистика\n" + f"• /help - все команды" ) @@ -70,19 +80,20 @@ async def cmd_help(message: Message): await message.answer( "📖 Справка по командам:\n\n" "Управление словарём:\n" - "/add [слово] - добавить слово в словарь\n" - "/vocabulary - просмотр словаря\n" - "/words [тема] - тематическая подборка слов\n" - "/import - импортировать слова из текста\n\n" + "• /add [слово] - добавить слово в словарь\n" + "• /vocabulary - просмотр словаря\n" + "• /words [тема] - тематическая подборка слов\n" + "• /import - импортировать слова из текста\n\n" "Обучение:\n" - "/task - получить задание (перевод, заполнение пропусков)\n" - "/practice - диалоговая практика с ИИ (6 сценариев)\n\n" + "• /task - задание (перевод, заполнение пропусков)\n" + "• /practice - диалог с ИИ (6 сценариев)\n" + "• /level_test - тест определения уровня\n\n" "Статистика:\n" - "/stats - твой прогресс\n\n" + "• /stats - твой прогресс\n\n" "Настройки:\n" - "/settings - настройки бота\n" - "/reminder - ежедневные напоминания\n\n" - "Ты также можешь просто отправить мне слово, и я предложу добавить его в словарь!" + "• /settings - уровень и язык\n" + "• /reminder - ежедневные напоминания\n\n" + "💡 Ты также можешь просто отправить мне слово, и я предложу добавить его в словарь!" ) diff --git a/config/settings.py b/config/settings.py index 73881d9..1102dc1 100644 --- a/config/settings.py +++ b/config/settings.py @@ -16,6 +16,10 @@ class Settings(BaseSettings): # Database database_url: str + postgres_user: str = "botuser" + postgres_password: str = "botpassword" + postgres_db: str = "language_bot" + db_port: str = "15433" # App settings debug: bool = False diff --git a/requirements.txt b/requirements.txt index d645cd2..7d24786 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,3 +7,4 @@ openai==1.57.3 pydantic>=2.4.1,<2.10 pydantic-settings==2.6.1 apscheduler==3.10.4 +greenlet==3.1.1