Reminder/bot/handlers/users.py
2024-10-24 22:19:30 +03:00

82 lines
3.9 KiB
Python
Raw Permalink 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.

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()