reminder-bot/bot/handlers/common.py

112 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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