aboutsummaryrefslogtreecommitdiff
path: root/handlers/admin/add_user.py
blob: 1d19834873ec1ce7f6837fef5326326aa0623591 (plain)
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 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 cancel(msg: Message, state: FSMContext) -> None:
    await msg.answer(
        "Добавление пользователей отменено",
        reply_markup=ReplyKeyboardRemove(),
    )
    await state.clear()


@router.message(AddUserStates.user_id)
async def set_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 set_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("Пользователь добавлен.", reply_markup=ReplyKeyboardRemove())
    await state.clear()