import logging from datetime import datetime from aiogram.types import CallbackQuery from aiogram_dialog import DialogManager from aiogram_dialog.widgets.kbd import Select from sqlalchemy import select from sqlalchemy.exc import SQLAlchemyError from shopbot.bot.database.db import async_session from shopbot.bot.database.models import Account, UserModel from shopbot.bot.states import PurchaseAccountsSG ACCOUNT_INFO_TEMPLATE = ( "Подробная информация об аккаунте:\n\n" "💰 Цена: {price:.2f}₽\n\n" "🔑 Логин: {login}\n" "🔒 Пароль: {password}\n\n" "🌍 Регион: {region}\n" "🎮 Ранг: {current_rank}\n" "🔪 Количество ножей: {knife_count}\n" "🛡️ Количество агентов: {agent_count}\n" "🖌️ Скины: {skin_count}\n" "🗡️ Стоимость инвентаря: {inventory_value}VP\n" "📈 Последний ранг: {last_rank}\n" "🏅 Уровень: {level}\n" ) async def _format_account_info(account: Account) -> str: return ACCOUNT_INFO_TEMPLATE.format( price=account.price, login=account.login, password=account.password, region=account.region, current_rank=account.current_rank, knife_count=account.knife_count, agent_count=account.agent_count, skin_count=account.skin_count, inventory_value=account.inventory_value, last_rank=account.last_rank, level=account.level, ) async def on_account_selected( callback: CallbackQuery, select: Select, manager: DialogManager, item_id: int ): manager.current_context().dialog_data["selected_account_id"] = int(item_id) await manager.next() async def on_buy_button_click( callback: CallbackQuery, button, dialog_manager: DialogManager, **kwargs ): account_id = dialog_manager.current_context().dialog_data.get("selected_account_id") user_tg_id = callback.from_user.id if not account_id: await callback.message.answer("Ошибка: не выбран аккаунт для покупки.") return try: async with async_session() as session: async with session.begin(): account = await session.scalar( select(Account).where( Account.id == account_id, Account.is_sold == False, # noqa: E712 ) ) if not account: await callback.message.answer("Аккаунт не найден!") return user = await session.scalar( select(UserModel).where(UserModel.tg_id == user_tg_id) ) if not user: await callback.message.answer("Ваш профиль не найден в системе!") return if user.balance < account.price: difference = account.price - user.balance await callback.message.answer( f"Недостаточно средств для покупки аккаунта.\n" f"Пополните баланс на {difference:.2f}₽." ) return user.balance -= account.price user.purchased += 1 account.is_sold = True account.buyer = user.tg_id account.date_purchase = datetime.utcnow() await session.commit() dialog_manager.current_context().dialog_data[ "account_info" ] = await _format_account_info(account) await dialog_manager.switch_to(PurchaseAccountsSG.purchase_completed) except SQLAlchemyError as e: logging.error(f"Database error: {e}", exc_info=True) except Exception as e: logging.error(f"An unexpected error occurred: {e}", exc_info=True)