112 lines
3.9 KiB
Python
112 lines
3.9 KiB
Python
"""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 = (
|
||
"📖 <b>Инструкция по использованию бота</b>\n\n"
|
||
"<b>Как создать напоминание:</b>\n"
|
||
"1. Нажми кнопку «➕ Новое напоминание»\n"
|
||
"2. Введи текст напоминания\n"
|
||
"3. Выбери, как часто напоминать (каждые N дней)\n"
|
||
"4. Укажи время (формат ЧЧ:ММ)\n"
|
||
"5. Подтверди создание\n\n"
|
||
"<b>Управление напоминаниями:</b>\n"
|
||
"• «📋 Мои напоминания» — посмотреть все напоминания\n"
|
||
"• В списке можно выбрать напоминание для просмотра деталей\n"
|
||
"• Доступные действия: изменить, поставить на паузу, удалить\n\n"
|
||
"<b>При получении напоминания:</b>\n"
|
||
"• «✅ Выполнено» — отметить как выполненное\n"
|
||
"• «🔁 Напомнить позже» — отложить на 1-3 часа\n"
|
||
"• «⏸ Пауза» — приостановить напоминание\n"
|
||
"• «🗑 Удалить» — удалить напоминание\n\n"
|
||
"<b>Команды:</b>\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}")
|