1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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()
|