diff options
| author | Tolmachev Igor <me@igorek.dev> | 2026-03-23 20:11:51 +0300 |
|---|---|---|
| committer | Tolmachev Igor <me@igorek.dev> | 2026-03-23 20:11:51 +0300 |
| commit | f2eb4e59327da4eabe875b077f8b311c6ac7251e (patch) | |
| tree | ea1e9bd0589bd93d49ee2ed552a0787487741a1d /handlers/admin/add_user.py | |
| parent | d5994e732d7b1dfa469cf400132ba49c8f75315e (diff) | |
| download | vpn_manager_bot-f2eb4e59327da4eabe875b077f8b311c6ac7251e.tar.gz vpn_manager_bot-f2eb4e59327da4eabe875b077f8b311c6ac7251e.zip | |
Add add_user command
Diffstat (limited to 'handlers/admin/add_user.py')
| -rw-r--r-- | handlers/admin/add_user.py | 99 |
1 files changed, 99 insertions, 0 deletions
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 @@ | |||
| 1 | from datetime import UTC, datetime | ||
| 2 | |||
| 3 | from aiogram import F, Router | ||
| 4 | from aiogram.enums.button_style import ButtonStyle | ||
| 5 | from aiogram.filters import Command | ||
| 6 | from aiogram.fsm.context import FSMContext | ||
| 7 | from aiogram.fsm.state import State, StatesGroup | ||
| 8 | from aiogram.types import ( | ||
| 9 | KeyboardButton, | ||
| 10 | KeyboardButtonRequestUsers, | ||
| 11 | Message, | ||
| 12 | ReplyKeyboardMarkup, | ||
| 13 | ReplyKeyboardRemove, | ||
| 14 | ) | ||
| 15 | from pydantic import BaseModel | ||
| 16 | from sqlalchemy.ext.asyncio import AsyncSession | ||
| 17 | |||
| 18 | from libs.fsm import edit_data, get_data, set_data | ||
| 19 | from models import User | ||
| 20 | |||
| 21 | router = Router(name="add_user") | ||
| 22 | |||
| 23 | |||
| 24 | class AddUserStates(StatesGroup): | ||
| 25 | user_id = State() | ||
| 26 | vpn_link = State() | ||
| 27 | |||
| 28 | |||
| 29 | class AddUserData(BaseModel): | ||
| 30 | user_id: int | None = None | ||
| 31 | |||
| 32 | |||
| 33 | CANCEL_BUTTON = "Отменить добавление" | ||
| 34 | |||
| 35 | |||
| 36 | @router.message(Command("add_user")) | ||
| 37 | async def add_user_command(msg: Message, state: FSMContext) -> None: | ||
| 38 | await msg.answer( | ||
| 39 | "Выберете пользователя которого хотите добавить.", | ||
| 40 | reply_markup=ReplyKeyboardMarkup( | ||
| 41 | keyboard=[ | ||
| 42 | [ | ||
| 43 | KeyboardButton( | ||
| 44 | text="Выбрать пользователя", | ||
| 45 | style=ButtonStyle.PRIMARY, | ||
| 46 | request_users=KeyboardButtonRequestUsers(request_id=0), | ||
| 47 | ), | ||
| 48 | ], | ||
| 49 | [ | ||
| 50 | KeyboardButton(text=CANCEL_BUTTON, style=ButtonStyle.DANGER), | ||
| 51 | ], | ||
| 52 | ], | ||
| 53 | resize_keyboard=True, | ||
| 54 | ), | ||
| 55 | ) | ||
| 56 | await set_data(state, AddUserData(user_id=None)) | ||
| 57 | await state.set_state(AddUserStates.user_id) | ||
| 58 | |||
| 59 | |||
| 60 | @router.message(AddUserStates(), F.text == CANCEL_BUTTON) | ||
| 61 | async def add_user_cancel(msg: Message, state: FSMContext) -> None: | ||
| 62 | await msg.answer( | ||
| 63 | "Добавление пользователей отменено", | ||
| 64 | reply_markup=ReplyKeyboardRemove(), | ||
| 65 | ) | ||
| 66 | await state.clear() | ||
| 67 | |||
| 68 | |||
| 69 | @router.message(AddUserStates.user_id) | ||
| 70 | async def add_user_user_id(msg: Message, state: FSMContext) -> None: | ||
| 71 | if msg.users_shared is None: | ||
| 72 | await msg.answer("Вы должны воспользоваться кнопкой ниже.") | ||
| 73 | return | ||
| 74 | |||
| 75 | async with edit_data(state, AddUserData) as data: | ||
| 76 | data.user_id = msg.users_shared.users[0].user_id | ||
| 77 | |||
| 78 | await msg.answer("Укажите ссылку для доступа к VPN") | ||
| 79 | await state.set_state(AddUserStates.vpn_link) | ||
| 80 | |||
| 81 | |||
| 82 | @router.message(AddUserStates.vpn_link) | ||
| 83 | async def add_user_vpn_link( | ||
| 84 | msg: Message, | ||
| 85 | state: FSMContext, | ||
| 86 | session: AsyncSession, | ||
| 87 | ) -> None: | ||
| 88 | if msg.text is None: | ||
| 89 | await msg.answer("Вы должны указать ссылку отправив текстовое сообщение.") | ||
| 90 | return | ||
| 91 | |||
| 92 | data = await get_data(state, AddUserData) | ||
| 93 | assert data.user_id is not None | ||
| 94 | |||
| 95 | session.add(User(id=data.user_id, vpn_link=msg.text, datetime=datetime.now(UTC))) | ||
| 96 | await session.flush() | ||
| 97 | |||
| 98 | await msg.answer("Пользователь добавлен.") | ||
| 99 | await state.clear() | ||
