From f2eb4e59327da4eabe875b077f8b311c6ac7251e Mon Sep 17 00:00:00 2001 From: Tolmachev Igor Date: Mon, 23 Mar 2026 20:11:51 +0300 Subject: Add add_user command --- handlers/admin/add_user.py | 99 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 handlers/admin/add_user.py (limited to 'handlers/admin/add_user.py') diff --git a/handlers/admin/add_user.py b/handlers/admin/add_user.py new file mode 100644 index 0000000..b9b8604 --- /dev/null +++ b/handlers/admin/add_user.py @@ -0,0 +1,99 @@ +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() -- cgit v1.3