Reminder/bot/handlers/users.py

82 lines
3.9 KiB
Python
Raw Normal View History

2024-10-24 19:19:30 +00:00
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.types import Message
from loguru import logger
from datetime import datetime
from bot.auth.auth import get_token_from_api
from database.db_main import User, session # Модель и сессия базы данных
from aiogram import F, Router
from database.db_main import UserManager
router = Router(name=__name__)
user_manager = UserManager()
# Определяем состояния для машины состояний
class AuthState(StatesGroup):
waiting_for_login = State()
waiting_for_password = State()
# Команда /start для запуска регистрации
@router.message(Command(commands=["start"]))
async def start_command(message: Message, state: FSMContext):
user = user_manager.get_user_by_telegram_id(message.from_user.id)
if not user:
# Если пользователь не зарегистрирован, запускаем процесс регистрации
prompt_message = await message.answer("Введите почту:")
# Сохраняем ID сообщения-подсказки в состоянии
await state.update_data(prompt_message_id=prompt_message.message_id)
await state.set_state(AuthState.waiting_for_login) # Устанавливаем состояние ожидания логина
else:
await message.answer("Вы уже зарегистрированы.")
# Обработка ввода логина
@router.message(AuthState.waiting_for_login)
async def process_login(message: Message, state: FSMContext):
await state.update_data(login=message.text) # Сохраняем логин в состоянии
await message.delete() # Удаляем сообщение с логином
# Удаляем сообщение с подсказкой
data = await state.get_data()
prompt_message_id = data.get("prompt_message_id")
if prompt_message_id:
await message.bot.delete_message(message.chat.id, prompt_message_id)
# Отправляем новое сообщение с просьбой ввести пароль и сохраняем его ID
password_prompt_message = await message.answer("Введите пароль:")
await state.update_data(password_prompt_message_id=password_prompt_message.message_id) # Сохраняем ID нового сообщения
await state.set_state(AuthState.waiting_for_password) # Переход в состояние ожидания пароля
# Обработка ввода пароля
@router.message(AuthState.waiting_for_password)
async def process_password(message: Message, state: FSMContext):
user_data = await state.get_data() # Получаем данные из состояния
login = user_data['login']
password = message.text
await message.delete() # Удаляем сообщение с паролем
# Удаляем сообщение с подсказкой для ввода пароля
password_prompt_message_id = user_data.get("password_prompt_message_id")
if password_prompt_message_id:
await message.bot.delete_message(message.chat.id, password_prompt_message_id)
# Отправляем запрос на получение токена
token_response = await get_token_from_api(login, password)
if token_response:
user_manager.save_user(
telegram_id=message.from_user.id,
login=login,
token_response=token_response,
password=password
)
await message.answer("Вы успешно зарегистрированы и токен сохранен!")
else:
await message.answer("Не удалось получить токен. Проверьте логин и пароль.")
await state.clear()