Files
Solo_bot/handlers/profile.py
T
2026-02-08 22:30:05 +03:00

158 lines
5.0 KiB
Python

import asyncio
import os
from aiogram import F, Router
from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery, InlineKeyboardButton, Message
from aiogram.utils.keyboard import InlineKeyboardBuilder
from config import (
BALANCE_BUTTON,
GIFT_BUTTON,
INSTRUCTIONS_BUTTON,
NEWS_MESSAGE,
REFERRAL_BUTTON,
SHOW_START_MENU_ONCE,
TRIAL_TIME_DISABLE,
)
from core.bootstrap import BUTTONS_CONFIG, MODES_CONFIG
from database import get_balance, get_key_count, get_trial
from handlers.buttons import (
ABOUT_VPN,
ADD_SUB,
BACK,
BALANCE,
GIFTS,
INSTRUCTIONS,
INVITE,
MY_SUB,
MY_SUBS,
TRIAL_SUB,
ADMIN_BTN,
)
from handlers.payments.currency_rates import format_for_user
from handlers.texts import ADD_SUBSCRIPTION_HINT
from hooks.hook_buttons import insert_hook_buttons
from hooks.hooks import run_hooks
from .admin.panel.keyboard import AdminPanelCallback
from .texts import profile_message_send
from .utils import edit_or_send_message, get_username
router = Router()
@router.callback_query(F.data == "profile")
@router.message(F.text == "/profile")
async def process_callback_view_profile(
callback_query_or_message: Message | CallbackQuery,
state: FSMContext,
admin: bool,
session,
):
if isinstance(callback_query_or_message, CallbackQuery):
chat = callback_query_or_message.message.chat
user = callback_query_or_message.from_user
message = callback_query_or_message.message
else:
chat = callback_query_or_message.chat
user = callback_query_or_message.from_user
message = callback_query_or_message
chat_id = chat.id
username = get_username(user or chat)
key_count, balance_rub, trial_status = await asyncio.gather(
get_key_count(session, chat_id),
get_balance(session, chat_id),
get_trial(session, chat_id),
)
balance_rub = balance_rub or 0
balance_text_task = asyncio.create_task(
format_for_user(
session,
chat_id,
balance_rub,
getattr(user, "language_code", None),
)
)
profile_menu_buttons_task = asyncio.create_task(
run_hooks("profile_menu", chat_id=chat_id, admin=admin, session=session)
)
profile_text_hooks_task = asyncio.create_task(
run_hooks(
"profile_text",
username=username,
chat_id=chat_id,
balance=int(balance_rub),
key_count=key_count,
session=session,
)
)
balance_text = await balance_text_task
profile_message = profile_message_send(username, chat_id, balance_text, key_count)
if key_count == 0:
profile_message += ADD_SUBSCRIPTION_HINT
else:
profile_message += f"\n<blockquote><i>{NEWS_MESSAGE}</i></blockquote>"
text_hooks = await profile_text_hooks_task
if text_hooks:
profile_message = text_hooks[0]
builder = InlineKeyboardBuilder()
trial_time_disabled = bool(MODES_CONFIG.get("TRIAL_TIME_DISABLED", TRIAL_TIME_DISABLE))
if key_count > 0:
subscriptions_button_text = MY_SUB if key_count == 1 else MY_SUBS
builder.row(InlineKeyboardButton(text=subscriptions_button_text, callback_data="view_keys"))
elif trial_status == 0 and not trial_time_disabled:
builder.row(InlineKeyboardButton(text=TRIAL_SUB, callback_data="create_key"))
else:
builder.row(InlineKeyboardButton(text=ADD_SUB, callback_data="create_key"))
if BUTTONS_CONFIG.get("BALANCE_BUTTON_ENABLE", BALANCE_BUTTON):
builder.row(InlineKeyboardButton(text=BALANCE, callback_data="balance"))
extra_buttons = []
if BUTTONS_CONFIG.get("REFERRAL_BUTTON_ENABLE", REFERRAL_BUTTON):
extra_buttons.append(InlineKeyboardButton(text=INVITE, callback_data="invite"))
if BUTTONS_CONFIG.get("GIFT_BUTTON_ENABLE", GIFT_BUTTON):
extra_buttons.append(InlineKeyboardButton(text=GIFTS, callback_data="gifts"))
if extra_buttons:
builder.row(*extra_buttons)
profile_menu_buttons = await profile_menu_buttons_task
builder = insert_hook_buttons(builder, profile_menu_buttons)
if BUTTONS_CONFIG.get("INSTRUCTIONS_BUTTON_ENABLE", INSTRUCTIONS_BUTTON):
builder.row(InlineKeyboardButton(text=INSTRUCTIONS, callback_data="instructions"))
if admin:
builder.row(
InlineKeyboardButton(
text=ADMIN_BTN,
callback_data=AdminPanelCallback(action="admin").pack(),
)
)
show_start_menu_once = bool(MODES_CONFIG.get("SHOW_START_MENU_ONLY_ONCE", SHOW_START_MENU_ONCE))
if show_start_menu_once:
builder.row(InlineKeyboardButton(text=ABOUT_VPN, callback_data="about_vpn"))
else:
builder.row(InlineKeyboardButton(text=BACK, callback_data="start"))
await edit_or_send_message(
target_message=message,
text=profile_message,
reply_markup=builder.as_markup(),
media_path=os.path.join("img", "profile.jpg"),
disable_web_page_preview=False,
force_text=True,
)