aboutsummaryrefslogtreecommitdiff
path: root/handlers/admin/add_user.py
diff options
context:
space:
mode:
authorTolmachev Igor <me@igorek.dev>2026-03-23 20:11:51 +0300
committerTolmachev Igor <me@igorek.dev>2026-03-23 20:11:51 +0300
commitf2eb4e59327da4eabe875b077f8b311c6ac7251e (patch)
treeea1e9bd0589bd93d49ee2ed552a0787487741a1d /handlers/admin/add_user.py
parentd5994e732d7b1dfa469cf400132ba49c8f75315e (diff)
downloadvpn_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.py99
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 @@
1from datetime import UTC, datetime
2
3from aiogram import F, Router
4from aiogram.enums.button_style import ButtonStyle
5from aiogram.filters import Command
6from aiogram.fsm.context import FSMContext
7from aiogram.fsm.state import State, StatesGroup
8from aiogram.types import (
9 KeyboardButton,
10 KeyboardButtonRequestUsers,
11 Message,
12 ReplyKeyboardMarkup,
13 ReplyKeyboardRemove,
14)
15from pydantic import BaseModel
16from sqlalchemy.ext.asyncio import AsyncSession
17
18from libs.fsm import edit_data, get_data, set_data
19from models import User
20
21router = Router(name="add_user")
22
23
24class AddUserStates(StatesGroup):
25 user_id = State()
26 vpn_link = State()
27
28
29class AddUserData(BaseModel):
30 user_id: int | None = None
31
32
33CANCEL_BUTTON = "Отменить добавление"
34
35
36@router.message(Command("add_user"))
37async 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)
61async 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)
70async 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)
83async 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()