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