feat(bot): add bot account ownership and balance

This commit is contained in:
2026-07-24 10:44:48 +05:00
parent 87385228ea
commit 8bd5c80693
22 changed files with 1008 additions and 393 deletions
+36 -77
View File
@@ -1,102 +1,61 @@
from aiogram import Router
from aiogram.types import CallbackQuery
from bot.filters import AdminCallbackFilter
from bot.logging_utils import describe_user, get_logger
from bot.services.bot_accounts import get_owned_bot
from bot.services.inventory import build_inventory_menu, render_inventory_page
from bot.ui.keyboards import back_keyboard
router = Router()
logger = get_logger(__name__)
@router.callback_query(
lambda c: c.data and c.data.startswith("inventory_"), AdminCallbackFilter()
)
async def account_from_data(callback: CallbackQuery, prefix: str):
try:
return await get_owned_bot(callback.from_user.id, int((callback.data or "").removeprefix(prefix)))
except ValueError:
return None
@router.callback_query(lambda c: c.data and c.data.startswith("inventory_"))
async def inventory_menu(callback: CallbackQuery) -> None:
user = describe_user(callback.from_user.id)
bot_name = callback.data.replace("inventory_", "")
logger.info("Открыто меню инвентаря: %s bot=%s", user, bot_name)
account = await account_from_data(callback, "inventory_")
if account is None:
await callback.answer("Бот не найден или вам не принадлежит", show_alert=True); return
await callback.answer()
await callback.message.edit_text("Проверка инвентаря...")
text, keyboard = await build_inventory_menu(bot_name)
if "пуст" in text.lower():
logger.info("Показано пустое меню инвентаря: %s bot=%s", user, bot_name)
keyboard = back_keyboard(f"bot_{bot_name}")
text, keyboard = await build_inventory_menu(account.bot_name, account.id)
await callback.message.edit_text(text, reply_markup=keyboard)
@router.callback_query(
lambda c: c.data and c.data.startswith("inv_cs2_"), AdminCallbackFilter()
)
async def cs2_inventory(callback: CallbackQuery) -> None:
user = describe_user(callback.from_user.id)
bot_name = callback.data.replace("inv_cs2_", "")
logger.info("Открыт CS2-инвентарь: %s bot=%s", user, bot_name)
@router.callback_query(lambda c: c.data and c.data.startswith("inv_cs2_"))
async def inventory_cs2(callback: CallbackQuery) -> None:
account = await account_from_data(callback, "inv_cs2_")
if account is None:
await callback.answer("Бот не найден или вам не принадлежит", show_alert=True); return
await callback.answer()
await callback.message.edit_text("Загрузка инвентаря...")
text, keyboard = await render_inventory_page(bot_name, "cs2", 730, 2, 0)
if text is None:
logger.warning("Не удалось загрузить CS2-инвентарь: %s bot=%s", user, bot_name)
await callback.message.edit_text("Не удалось загрузить инвентарь")
return
text, keyboard = await render_inventory_page(account.bot_name, "cs2", 730, 2, 0, account.id)
await callback.message.edit_text(text, reply_markup=keyboard)
@router.callback_query(
lambda c: c.data and c.data.startswith("inv_steam_"), AdminCallbackFilter()
)
async def steam_inventory(callback: CallbackQuery) -> None:
user = describe_user(callback.from_user.id)
bot_name = callback.data.replace("inv_steam_", "")
logger.info("Открыт Steam-инвентарь: %s bot=%s", user, bot_name)
@router.callback_query(lambda c: c.data and c.data.startswith("inv_steam_"))
async def inventory_steam(callback: CallbackQuery) -> None:
account = await account_from_data(callback, "inv_steam_")
if account is None:
await callback.answer("Бот не найден или вам не принадлежит", show_alert=True); return
await callback.answer()
await callback.message.edit_text("Загрузка инвентаря...")
text, keyboard = await render_inventory_page(bot_name, "steam", 753, 6, 0)
if text is None:
logger.warning(
"Не удалось загрузить Steam-инвентарь: %s bot=%s", user, bot_name
)
await callback.message.edit_text("Не удалось загрузить инвентарь")
return
text, keyboard = await render_inventory_page(account.bot_name, "steam", 753, 6, 0, account.id)
await callback.message.edit_text(text, reply_markup=keyboard)
@router.callback_query(
lambda c: c.data and c.data.startswith("invpage|"), AdminCallbackFilter()
)
@router.callback_query(lambda c: c.data and c.data.startswith("invpage|"))
async def inventory_page(callback: CallbackQuery) -> None:
user = describe_user(callback.from_user.id)
_, inv_type, bot_name, page_value = callback.data.split("|")
logger.info(
"Открыта страница инвентаря: %s bot=%s type=%s page=%s",
user,
bot_name,
inv_type,
page_value,
)
try:
_, inv_type, account_id, page = (callback.data or "").split("|")
account = await get_owned_bot(callback.from_user.id, int(account_id))
page = int(page)
except (ValueError, TypeError):
account = None
if account is None or inv_type not in {"cs2", "steam"}:
await callback.answer("Бот не найден или вам не принадлежит", show_alert=True); return
appid, contextid = (730, 2) if inv_type == "cs2" else (753, 6)
await callback.answer()
app_id, context_id = (730, 2) if inv_type == "cs2" else (753, 6)
text, keyboard = await render_inventory_page(
bot_name, inv_type, app_id, context_id, int(page_value)
)
if text is None:
logger.warning(
"Не удалось загрузить страницу инвентаря: %s bot=%s type=%s page=%s",
user,
bot_name,
inv_type,
page_value,
)
await callback.message.edit_text("Не удалось загрузить инвентарь")
return
text, keyboard = await render_inventory_page(account.bot_name, inv_type, appid, contextid, page, account.id)
await callback.message.edit_text(text, reply_markup=keyboard)