Edit on GitHub

src.handlers.account

Действия с аккаунтом пользователя

  1"""Действия с аккаунтом пользователя"""
  2
  3import logging
  4from contextlib import suppress
  5from typing import Union
  6
  7from aiogram import F, Router
  8from aiogram.exceptions import TelegramBadRequest
  9from aiogram.filters.command import Command
 10from aiogram.fsm.context import FSMContext
 11from aiogram.types import CallbackQuery, Message
 12
 13import text
 14from core import exceptions as exc
 15from core.err import bot_except
 16from core.metric import async_speed_metric
 17from db import utils
 18from db.models import UserData
 19from handlers.utils import find_user
 20from kb import get_account_keyboard, static_start_button
 21from messages import INTRO
 22from wg.utils import WgServerTools
 23
 24logger = logging.getLogger()
 25router = Router()
 26
 27router.message.filter(F.chat.type == "private")
 28
 29
 30@router.message(Command("start"))
 31@router.message(F.text == "Перезагрузка")
 32@router.callback_query(F.data == "start_app")
 33@async_speed_metric
 34@bot_except
 35async def start_bot(trigger: Union[Message, CallbackQuery], state: FSMContext):
 36    """Обрабатывает команду запуска бота и приветствует пользователя.
 37    (Очищает весь кеш пользователя)
 38
 39    Args:
 40        trigger (Union[Message, CallbackQuery]): Сообщение или обратный вызов, инициирующий команду.
 41        state (FSMContext): Контекст состояния для управления состоянием бота.
 42    """
 43    await state.clear()
 44    await state.set_state()
 45
 46    await getattr(trigger, "message", trigger).answer(
 47        f"Добро пожаловать, {trigger.from_user.full_name}!"
 48        "\nЯ бот для управления VPN сервисом DanVPN.",
 49        reply_markup=static_start_button,
 50    )
 51
 52    if INTRO:
 53        await getattr(trigger, "message", trigger).answer(INTRO)
 54
 55    try:
 56        await utils.clear_cash(trigger.from_user.id)
 57        user_data = await utils.get_user(trigger.from_user.id)
 58    except exc.DatabaseError:
 59        await getattr(trigger, "message", trigger).answer(text.DB_ERROR)
 60    else:
 61        await account_actions(trigger, user_data)
 62
 63
 64@router.message(Command("account"))
 65@router.message(Command("app"))
 66@router.message(F.text == "Статус")
 67@async_speed_metric
 68@bot_except
 69async def account_actions(
 70    trigger: Union[Message, CallbackQuery],
 71    user_data: UserData = None,
 72    usr_id: int = None,
 73):
 74    """Обрабатывает команды, связанные с аккаунтом пользователя.
 75
 76    Args:
 77        trigger (Union[Message, CallbackQuery]): Сообщение или обратный вызов, инициирующий команду.
 78        user_data (UserData, optional): Данные пользователя. По умолчанию None.
 79        usr_id (int, optional): Идентификатор пользователя. По умолчанию None.
 80    """
 81    if user_data is None:
 82        try:
 83            user_data = await utils.get_user(usr_id if usr_id else trigger.from_user.id)
 84        except exc.DatabaseError:
 85            await getattr(trigger, "message", trigger).answer(text.DB_ERROR)
 86            return
 87
 88    account_kb = get_account_keyboard(user_data)
 89
 90    server_status = await WgServerTools().get_server_status()
 91
 92    if user_data is None:
 93        await getattr(trigger, "message", trigger).answer(
 94            "Не вижу вас в базе данных. Хотите зарегистрироваться?",
 95            reply_markup=account_kb,
 96        )
 97    else:
 98        account_status = text.get_account_status(user_data)
 99        sub_status, rate = text.get_sub_status(user_data)
100        account_data = "\n".join(
101            (
102                f"Сервер:              <b>{server_status.capitalize()}</b>",
103                f"Аккаунт:             <b>{account_status}</b>",
104                f"Уведомления:  <b>{'Вкл' if not user_data.mute else 'Выкл'}</b>",
105                f"Подписка:         <b>{sub_status}</b>" if sub_status else "",
106                f"Тариф:                <b>{rate}</b>" if rate else "",
107            )
108        )
109
110        await getattr(trigger, "message", trigger).answer(
111            account_data, reply_markup=account_kb
112        )
113
114
115@router.callback_query(F.data.startswith("extra_function_"))
116@bot_except
117async def get_extra_menu(callback: CallbackQuery):
118    """Раскрывает и закрывает панель инструментов в меню.
119
120    Args:
121        callback (CallbackQuery): Обратный вызов, содержащий информацию о функции.
122    """
123    *_, mode = callback.data.split("_")
124
125    user_data: UserData = await find_user(callback)
126    if not user_data:
127        return
128
129    if mode == "open":
130        account_kb = get_account_keyboard(user_data, extended=True)
131    else:
132        account_kb = get_account_keyboard(user_data, extended=False)
133
134    with suppress(TelegramBadRequest):
135        await callback.message.edit_text(callback.message.text, reply_markup=account_kb)
logger = <RootLogger root (DEBUG)>
router = <Router '0x7f23daf25340'>
@router.message(Command('start'))
@router.message(F.text == 'Перезагрузка')
@router.callback_query(F.data == 'start_app')
@async_speed_metric
@bot_except
async def start_bot( trigger: Union[aiogram.types.message.Message, aiogram.types.callback_query.CallbackQuery], state: aiogram.fsm.context.FSMContext):
31@router.message(Command("start"))
32@router.message(F.text == "Перезагрузка")
33@router.callback_query(F.data == "start_app")
34@async_speed_metric
35@bot_except
36async def start_bot(trigger: Union[Message, CallbackQuery], state: FSMContext):
37    """Обрабатывает команду запуска бота и приветствует пользователя.
38    (Очищает весь кеш пользователя)
39
40    Args:
41        trigger (Union[Message, CallbackQuery]): Сообщение или обратный вызов, инициирующий команду.
42        state (FSMContext): Контекст состояния для управления состоянием бота.
43    """
44    await state.clear()
45    await state.set_state()
46
47    await getattr(trigger, "message", trigger).answer(
48        f"Добро пожаловать, {trigger.from_user.full_name}!"
49        "\nЯ бот для управления VPN сервисом DanVPN.",
50        reply_markup=static_start_button,
51    )
52
53    if INTRO:
54        await getattr(trigger, "message", trigger).answer(INTRO)
55
56    try:
57        await utils.clear_cash(trigger.from_user.id)
58        user_data = await utils.get_user(trigger.from_user.id)
59    except exc.DatabaseError:
60        await getattr(trigger, "message", trigger).answer(text.DB_ERROR)
61    else:
62        await account_actions(trigger, user_data)

Обрабатывает команду запуска бота и приветствует пользователя. (Очищает весь кеш пользователя)

Arguments:
  • trigger (Union[Message, CallbackQuery]): Сообщение или обратный вызов, инициирующий команду.
  • state (FSMContext): Контекст состояния для управления состоянием бота.
@router.message(Command('account'))
@router.message(Command('app'))
@router.message(F.text == 'Статус')
@async_speed_metric
@bot_except
async def account_actions( trigger: Union[aiogram.types.message.Message, aiogram.types.callback_query.CallbackQuery], user_data: db.models.userdata.UserData = None, usr_id: int = None):
 65@router.message(Command("account"))
 66@router.message(Command("app"))
 67@router.message(F.text == "Статус")
 68@async_speed_metric
 69@bot_except
 70async def account_actions(
 71    trigger: Union[Message, CallbackQuery],
 72    user_data: UserData = None,
 73    usr_id: int = None,
 74):
 75    """Обрабатывает команды, связанные с аккаунтом пользователя.
 76
 77    Args:
 78        trigger (Union[Message, CallbackQuery]): Сообщение или обратный вызов, инициирующий команду.
 79        user_data (UserData, optional): Данные пользователя. По умолчанию None.
 80        usr_id (int, optional): Идентификатор пользователя. По умолчанию None.
 81    """
 82    if user_data is None:
 83        try:
 84            user_data = await utils.get_user(usr_id if usr_id else trigger.from_user.id)
 85        except exc.DatabaseError:
 86            await getattr(trigger, "message", trigger).answer(text.DB_ERROR)
 87            return
 88
 89    account_kb = get_account_keyboard(user_data)
 90
 91    server_status = await WgServerTools().get_server_status()
 92
 93    if user_data is None:
 94        await getattr(trigger, "message", trigger).answer(
 95            "Не вижу вас в базе данных. Хотите зарегистрироваться?",
 96            reply_markup=account_kb,
 97        )
 98    else:
 99        account_status = text.get_account_status(user_data)
100        sub_status, rate = text.get_sub_status(user_data)
101        account_data = "\n".join(
102            (
103                f"Сервер:              <b>{server_status.capitalize()}</b>",
104                f"Аккаунт:             <b>{account_status}</b>",
105                f"Уведомления:  <b>{'Вкл' if not user_data.mute else 'Выкл'}</b>",
106                f"Подписка:         <b>{sub_status}</b>" if sub_status else "",
107                f"Тариф:                <b>{rate}</b>" if rate else "",
108            )
109        )
110
111        await getattr(trigger, "message", trigger).answer(
112            account_data, reply_markup=account_kb
113        )

Обрабатывает команды, связанные с аккаунтом пользователя.

Arguments:
  • trigger (Union[Message, CallbackQuery]): Сообщение или обратный вызов, инициирующий команду.
  • user_data (UserData, optional): Данные пользователя. По умолчанию None.
  • usr_id (int, optional): Идентификатор пользователя. По умолчанию None.
@router.callback_query(F.data.startswith('extra_function_'))
@bot_except
async def get_extra_menu(callback: aiogram.types.callback_query.CallbackQuery):
116@router.callback_query(F.data.startswith("extra_function_"))
117@bot_except
118async def get_extra_menu(callback: CallbackQuery):
119    """Раскрывает и закрывает панель инструментов в меню.
120
121    Args:
122        callback (CallbackQuery): Обратный вызов, содержащий информацию о функции.
123    """
124    *_, mode = callback.data.split("_")
125
126    user_data: UserData = await find_user(callback)
127    if not user_data:
128        return
129
130    if mode == "open":
131        account_kb = get_account_keyboard(user_data, extended=True)
132    else:
133        account_kb = get_account_keyboard(user_data, extended=False)
134
135    with suppress(TelegramBadRequest):
136        await callback.message.edit_text(callback.message.text, reply_markup=account_kb)

Раскрывает и закрывает панель инструментов в меню.

Arguments:
  • callback (CallbackQuery): Обратный вызов, содержащий информацию о функции.