"""Common handlers for /start, /help, /cancel commands.""" from aiogram import Router from aiogram.filters import CommandStart, Command from aiogram.types import Message from aiogram.fsm.context import FSMContext from sqlalchemy.ext.asyncio import AsyncSession from bot.keyboards.main_menu import get_main_menu_keyboard from bot.services.user_service import UserService from bot.logging_config import get_logger logger = get_logger(__name__) router = Router(name="common") @router.message(CommandStart()) async def cmd_start( message: Message, session: AsyncSession, state: FSMContext, ) -> None: """ Handle /start command. Args: message: Telegram message session: Database session state: FSM state context """ # Clear any active state await state.clear() # Ensure user exists in database user = await UserService.ensure_user_exists(session, message.from_user) logger.info(f"User {user.tg_user_id} started the bot") # Send welcome message welcome_text = ( f"Привет, {message.from_user.first_name}! 👋\n\n" "Я бот для создания повторяющихся напоминаний.\n\n" "Выбери действие из меню ниже:" ) await message.answer( text=welcome_text, reply_markup=get_main_menu_keyboard(), ) @router.message(Command("help")) async def cmd_help(message: Message) -> None: """ Handle /help command. Args: message: Telegram message """ help_text = ( "📖 Инструкция по использованию бота\n\n" "Как создать напоминание:\n" "1. Нажми кнопку «➕ Новое напоминание»\n" "2. Введи текст напоминания\n" "3. Выбери, как часто напоминать (каждые N дней)\n" "4. Укажи время (формат ЧЧ:ММ)\n" "5. Подтверди создание\n\n" "Управление напоминаниями:\n" "• «📋 Мои напоминания» — посмотреть все напоминания\n" "• В списке можно выбрать напоминание для просмотра деталей\n" "• Доступные действия: изменить, поставить на паузу, удалить\n\n" "При получении напоминания:\n" "• «✅ Выполнено» — отметить как выполненное\n" "• «🔁 Напомнить позже» — отложить на 1-3 часа\n" "• «⏸ Пауза» — приостановить напоминание\n" "• «🗑 Удалить» — удалить напоминание\n\n" "Команды:\n" "/start — главное меню\n" "/help — показать эту инструкцию\n" "/cancel — отменить текущее действие\n" ) await message.answer(text=help_text, parse_mode="HTML") @router.message(Command("cancel")) async def cmd_cancel(message: Message, state: FSMContext) -> None: """ Handle /cancel command. Args: message: Telegram message state: FSM state context """ current_state = await state.get_state() if current_state is None: await message.answer( "Нечего отменять. Выбери действие из меню.", reply_markup=get_main_menu_keyboard(), ) return await state.clear() await message.answer( "Действие отменено. Возвращаемся в главное меню.", reply_markup=get_main_menu_keyboard(), ) logger.debug(f"User {message.from_user.id} cancelled state: {current_state}")