from bot.api.asf import get_bot_inventory from bot.constants import PAGE_SIZE from bot.logging_utils import get_logger from bot.ui.formatters import get_inventory_icon from bot.ui.keyboards import inventory_menu_keyboard, inventory_page_keyboard logger = get_logger(__name__) async def build_inventory_menu(bot_name: str, account_id: int) -> tuple[str, object]: logger.info("Формирование меню инвентаря: bot=%s", bot_name) cs2_inventory = await get_bot_inventory(bot_name, 730, 2) steam_inventory = await get_bot_inventory(bot_name, 753, 6) cs2_assets = [] steam_assets = [] try: cs2_assets = cs2_inventory.get(bot_name, {}).get("Assets", []) except Exception: logger.exception("Ошибка чтения CS2-инвентаря: bot=%s", bot_name) try: steam_assets = steam_inventory.get(bot_name, {}).get("Assets", []) except Exception: logger.exception("Ошибка чтения Steam-инвентаря: bot=%s", bot_name) if not cs2_assets and not steam_assets: logger.info("Инвентарь пуст: bot=%s", bot_name) return ( f"📦 Инвентарь {bot_name} пуст", inventory_menu_keyboard(account_id, 0, 0), ) logger.info( "Меню инвентаря сформировано: bot=%s cs2_items=%s steam_items=%s", bot_name, len(cs2_assets), len(steam_assets), ) text = ( f"📦 Инвентарь {bot_name}\n\n" "🔄 — можно трейдить\n" "💰 — можно продавать\n" "🔒 — нельзя продавать\n" "❌ — нельзя трейдить" ) return text, inventory_menu_keyboard(account_id, len(cs2_assets), len(steam_assets)) async def render_inventory_page( bot_name: str, inventory_type: str, appid: int, contextid: int, page: int, account_id: int ) -> tuple[str, object] | tuple[None, None]: logger.info( "Формирование страницы инвентаря: bot=%s type=%s appid=%s contextid=%s page=%s", bot_name, inventory_type, appid, contextid, page, ) inventory = await get_bot_inventory(bot_name, appid, contextid) if not inventory: logger.warning( "Не удалось получить данные для страницы инвентаря: bot=%s type=%s page=%s", bot_name, inventory_type, page, ) return None, None bot_inventory = inventory.get(bot_name, {}) assets = bot_inventory.get("Assets", []) descriptions = bot_inventory.get("Descriptions", []) if not assets: logger.info( "Инвентарь выбранного типа пуст: bot=%s type=%s", bot_name, inventory_type ) return f"Инвентарь {bot_name} пуст", inventory_menu_keyboard(account_id, 0, 0) desc_map = {} for desc in descriptions: key = (str(desc.get("classid")), str(desc.get("instanceid"))) desc_map[key] = desc total_pages = (len(assets) + PAGE_SIZE - 1) // PAGE_SIZE start = page * PAGE_SIZE end = start + PAGE_SIZE page_assets = assets[start:end] lines = [] marketable_count = 0 tradable_count = 0 cards_count = 0 emotes_count = 0 backgrounds_count = 0 gems_count = 0 for asset in page_assets: key = (str(asset.get("classid")), str(asset.get("instanceid"))) desc = desc_map.get(key, {}) name = desc.get("market_name", "Неизвестно") amount = asset.get("amount", 1) tradable = "🔄" if desc.get("tradable") else "❌" marketable = "💰" if desc.get("marketable") else "🔒" icon = get_inventory_icon(desc) if desc.get("marketable"): marketable_count += 1 if desc.get("tradable"): tradable_count += 1 if icon == "🎏": cards_count += amount elif icon == "😀": emotes_count += amount elif icon == "🖼": backgrounds_count += amount elif icon == "💎": gems_count += amount lines.append(f"{icon} {tradable}{marketable} {name} x{amount}") inv_name = "CS2" if appid == 730 else "Steam" stats = ( f"📦 Предметов: {len(assets)}\n" f"💰 Можно продать: {marketable_count}\n" f"🔄 Можно трейдить: {tradable_count}" ) if appid == 753: stats += ( f"\n🎏 Карточек: {cards_count}" f"\n😀 Смайлов: {emotes_count}" f"\n🖼 Фонов: {backgrounds_count}" f"\n💎 Самоцветов: {gems_count}" ) text = ( f"📦 Инвентарь {inv_name} {bot_name}\n" f"📄 Страница {page + 1}/{total_pages}\n\n" f"{stats}\n\n" + "\n".join(lines) ) logger.info( "Страница инвентаря сформирована: bot=%s type=%s page=%s total_pages=%s items_on_page=%s", bot_name, inventory_type, page, total_pages, len(page_assets), ) return text[:4000], inventory_page_keyboard( inventory_type, account_id, page, total_pages )