"""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}")