from datetime import UTC, datetime from aiogram import F, Router from aiogram.enums.button_style import ButtonStyle from aiogram.filters import Command from aiogram.fsm.context import FSMContext from aiogram.fsm.state import State, StatesGroup from aiogram.types import ( KeyboardButton, KeyboardButtonRequestUsers, Message, ReplyKeyboardMarkup, ReplyKeyboardRemove, ) from pydantic import BaseModel from sqlalchemy.ext.asyncio import AsyncSession from libs.fsm import edit_data, get_data, set_data from models import User router = Router(name="add_user") class AddUserStates(StatesGroup): user_id = State() vpn_link = State() class AddUserData(BaseModel): user_id: int | None = None CANCEL_BUTTON = "Отменить добавление" @router.message(Command("add_user")) async def add_user_command(msg: Message, state: FSMContext) -> None: await msg.answer( "Выберете пользователя которого хотите добавить.", reply_markup=ReplyKeyboardMarkup( keyboard=[ [ KeyboardButton( text="Выбрать пользователя", style=ButtonStyle.PRIMARY, request_users=KeyboardButtonRequestUsers(request_id=0), ), ], [ KeyboardButton(text=CANCEL_BUTTON, style=ButtonStyle.DANGER), ], ], resize_keyboard=True, ), ) await set_data(state, AddUserData(user_id=None)) await state.set_state(AddUserStates.user_id) @router.message(AddUserStates(), F.text == CANCEL_BUTTON) async def add_user_cancel(msg: Message, state: FSMContext) -> None: await msg.answer( "Добавление пользователей отменено", reply_markup=ReplyKeyboardRemove(), ) await state.clear() @router.message(AddUserStates.user_id) async def add_user_user_id(msg: Message, state: FSMContext) -> None: if msg.users_shared is None: await msg.answer("Вы должны воспользоваться кнопкой ниже.") return async with edit_data(state, AddUserData) as data: data.user_id = msg.users_shared.users[0].user_id await msg.answer("Укажите ссылку для доступа к VPN") await state.set_state(AddUserStates.vpn_link) @router.message(AddUserStates.vpn_link) async def add_user_vpn_link( msg: Message, state: FSMContext, session: AsyncSession, ) -> None: if msg.text is None: await msg.answer("Вы должны указать ссылку отправив текстовое сообщение.") return data = await get_data(state, AddUserData) assert data.user_id is not None session.add(User(id=data.user_id, vpn_link=msg.text, datetime=datetime.now(UTC))) await session.flush() await msg.answer("Пользователь добавлен.") await state.clear()