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.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): Контекст состояния для управления состоянием бота.
@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.