Files
ASF-Control-Bot/bot/services/inventory.py
T

144 lines
5.2 KiB
Python

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) -> 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(bot_name, 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(bot_name, len(cs2_assets), len(steam_assets))
async def render_inventory_page(
bot_name: str, inventory_type: str, appid: int, contextid: int, page: 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(bot_name, 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, bot_name, page, total_pages
)