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