82 lines
3.9 KiB
Python
82 lines
3.9 KiB
Python
|
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()
|