from aiogram import Router, F from aiogram.filters import Command from aiogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery from aiogram.fsm.context import FSMContext from aiogram.fsm.state import State, StatesGroup from database.db import async_session_maker from services.user_service import UserService router = Router() class ReminderStates(StatesGroup): """Состояния для настройки напоминаний""" waiting_for_time = State() @router.message(Command("reminder")) async def cmd_reminder(message: Message): """Обработчик команды /reminder""" async with async_session_maker() as session: user = await UserService.get_user_by_telegram_id(session, message.from_user.id) if not user: await message.answer("Сначала запусти бота командой /start") return # Формируем текст status = "✅ Включены" if user.reminders_enabled else "❌ Выключены" time_text = user.daily_task_time if user.daily_task_time else "Не установлено" text = ( f"⏰ Напоминания\n\n" f"Статус: {status}\n" f"Время: {time_text} UTC\n\n" f"Напоминания помогут не забывать о ежедневной практике.\n" f"Бот будет присылать сообщение в выбранное время каждый день." ) # Создаем кнопки keyboard = [] if user.reminders_enabled: keyboard.append([ InlineKeyboardButton(text="❌ Выключить", callback_data="reminder_disable") ]) else: keyboard.append([ InlineKeyboardButton(text="✅ Включить", callback_data="reminder_enable") ]) keyboard.append([ InlineKeyboardButton(text="⏰ Изменить время", callback_data="reminder_set_time") ]) reply_markup = InlineKeyboardMarkup(inline_keyboard=keyboard) await message.answer(text, reply_markup=reply_markup) @router.callback_query(F.data == "reminder_enable") async def enable_reminders(callback: CallbackQuery): """Включить напоминания""" async with async_session_maker() as session: user = await UserService.get_user_by_telegram_id(session, callback.from_user.id) if not user.daily_task_time: await callback.answer( "Сначала установи время напоминаний!", show_alert=True ) return user.reminders_enabled = True await session.commit() await callback.answer("✅ Напоминания включены!") await callback.message.edit_text( f"✅ Напоминания включены!\n\n" f"Время: {user.daily_task_time} UTC\n\n" f"Ты будешь получать ежедневные напоминания о практике." ) @router.callback_query(F.data == "reminder_disable") async def disable_reminders(callback: CallbackQuery): """Выключить напоминания""" async with async_session_maker() as session: user = await UserService.get_user_by_telegram_id(session, callback.from_user.id) user.reminders_enabled = False await session.commit() await callback.answer("❌ Напоминания выключены") await callback.message.edit_text( "❌ Напоминания выключены\n\n" "Используй /reminder чтобы включить их снова." ) @router.callback_query(F.data == "reminder_set_time") async def set_reminder_time_prompt(callback: CallbackQuery, state: FSMContext): """Запросить время для напоминаний""" await state.set_state(ReminderStates.waiting_for_time) await callback.message.edit_text( "⏰ Установка времени напоминаний\n\n" "Отправь время в формате HH:MM (UTC)\n\n" "Примеры:\n" "• 09:00 - 9 утра по UTC\n" "• 18:30 - 18:30 по UTC\n" "• 20:00 - 8 вечера по UTC\n\n" "💡 UTC = МСК - 3 часа\n" "(если хочешь 12:00 по МСК, введи 09:00)\n\n" "Отправь /cancel для отмены" ) await callback.answer() @router.message(Command("cancel"), ReminderStates.waiting_for_time) async def cancel_set_time(message: Message, state: FSMContext): """Отменить установку времени""" await state.clear() await message.answer("❌ Установка времени отменена") @router.message(ReminderStates.waiting_for_time) async def process_reminder_time(message: Message, state: FSMContext): """Обработать введённое время""" time_str = message.text.strip() # Валидация формата HH:MM try: parts = time_str.split(':') if len(parts) != 2: raise ValueError() hour, minute = int(parts[0]), int(parts[1]) if not (0 <= hour <= 23 and 0 <= minute <= 59): raise ValueError() # Формат OK formatted_time = f"{hour:02d}:{minute:02d}" except: await message.answer( "❌ Неверный формат времени!\n\n" "Используй формат HH:MM (например, 09:00 или 18:30)\n" "Или отправь /cancel для отмены" ) return # Сохраняем время async with async_session_maker() as session: user = await UserService.get_user_by_telegram_id(session, message.from_user.id) user.daily_task_time = formatted_time # Автоматически включаем напоминания user.reminders_enabled = True await session.commit() await state.clear() await message.answer( f"✅ Время установлено!\n\n" f"Напоминания: {formatted_time} UTC\n" f"Статус: Включены\n\n" f"Ты будешь получать ежедневные напоминания о практике.\n" f"Используй /reminder для изменения настроек." )