import random import asyncio from aiogram import Router from aiogram.types import CallbackQuery from bot.api.asf import get_all_bots from bot.filters import AdminCallbackFilter from bot.logging_utils import describe_user, get_logger from bot.services.bots import is_bot_reloading, is_idle_enabled, update_idle_game from bot.services.twofa import stop_twofa_task from bot.ui.formatters import format_bot_ui, get_farm_summary from bot.ui.keyboards import bot_details_keyboard, bots_keyboard, games_keyboard router = Router() logger = get_logger(__name__) @router.callback_query(lambda c: c.data == "bot_loading", AdminCallbackFilter()) async def bot_loading_handler(callback: CallbackQuery) -> None: logger.info( "Пользователь %s нажал на еще не загруженного бота", describe_user(callback.from_user), ) await callback.answer( "Аккаунт еще загружается. Попробуйте через несколько секунд.", show_alert=True, ) @router.callback_query(lambda c: c.data == "bots", AdminCallbackFilter()) async def bots_handler(callback: CallbackQuery) -> None: logger.info( "Пользователь %s открыл список ботов", describe_user(callback.from_user), ) await stop_twofa_task(callback.message.message_id) await callback.answer() try: response = get_all_bots() if response.status_code != 200: logger.warning( "Не удалось загрузить список ботов для %s: HTTP %s", describe_user(callback.from_user), response.status_code, ) await callback.message.edit_text("Ошибка API") return data = response.json() if not data.get("Success"): logger.warning( "ASF вернул неуспешный ответ при загрузке списка ботов для %s", describe_user(callback.from_user), ) await callback.message.edit_text("ASF вернул ошибку") return bots = data.get("Result", {}) logger.info( "Список ботов для %s загружен: %s бот(ов)", describe_user(callback.from_user), len(bots), ) text = f"🤖 Ботов всего: {len(bots)}\n\n{get_farm_summary(bots)}" await callback.message.edit_text(text, reply_markup=bots_keyboard(bots)) except Exception as error: logger.exception( "Ошибка при открытии списка ботов для %s", describe_user(callback.from_user), ) await callback.message.edit_text(f"Ошибка: {error}") @router.callback_query( lambda c: c.data and c.data.startswith("bot_"), AdminCallbackFilter() ) async def bot_selected(callback: CallbackQuery) -> None: await stop_twofa_task(callback.message.message_id) if not callback.data: logger.debug( "Колбэк выбора бота пришел без data от %s", describe_user(callback.from_user), ) await callback.answer() return bot_name = callback.data.replace("bot_", "") logger.info( "Пользователь %s выбрал бота %s", describe_user(callback.from_user), bot_name, ) if is_bot_reloading(bot_name): logger.info( "Бот %s перезагружается, карточка временно не отображается для %s", bot_name, describe_user(callback.from_user), ) await callback.answer( "Аккаунт перезагружается. Попробуйте через несколько секунд.", show_alert=True, ) return try: data = get_all_bots().json() bots = data.get("Result", {}) bot = bots.get(bot_name) if not bot or not bot.get("BotName") or not bot.get("SteamID"): logger.info( "Бот %s еще не готов к отображению для %s", bot_name, describe_user(callback.from_user), ) await callback.answer( "Аккаунт еще загружается. Попробуйте через несколько секунд.", show_alert=True, ) return logger.info( "Открыта карточка бота %s для %s", bot_name, describe_user(callback.from_user), ) await callback.answer() await callback.message.edit_text( format_bot_ui(bot), disable_web_page_preview=True, reply_markup=bot_details_keyboard( bot_name, bool(bot.get("HasMobileAuthenticator")) ), ) except Exception as error: logger.exception( "Ошибка при открытии карточки бота %s для %s", bot_name, describe_user(callback.from_user), ) await callback.message.edit_text(f"Ошибка: {error}") @router.callback_query( lambda c: c.data and c.data.startswith("games_"), AdminCallbackFilter() ) async def games(callback: CallbackQuery) -> None: await callback.answer() if not callback.data: logger.debug( "Колбэк выбора игры пришел без data от %s", describe_user(callback.from_user), ) return bot_name = callback.data.replace("games_", "") idle_enabled = is_idle_enabled(bot_name, 730) logger.info( "Пользователь %s открыл меню накрутки часов для бота %s. CS2=%s", describe_user(callback.from_user), bot_name, idle_enabled, ) await callback.message.edit_text( "⌚ Выберите игру для накрутки часов", reply_markup=games_keyboard(bot_name, idle_enabled), ) @router.callback_query( lambda c: c.data and c.data.startswith("farm|"), AdminCallbackFilter() ) async def farm_game(callback: CallbackQuery) -> None: await callback.answer() if not callback.data: logger.debug( "Колбэк изменения фарма пришел без data от %s", describe_user(callback.from_user), ) return _, bot_name, app_id_value = callback.data.split("|") logger.info( "Пользователь %s меняет игру для накрутки на боте %s: app_id=%s", describe_user(callback.from_user), bot_name, app_id_value, ) success, text, enabled = await update_idle_game(bot_name, int(app_id_value)) if not success: logger.warning( "Не удалось изменить игру для накрутки на боте %s для %s: %s", bot_name, describe_user(callback.from_user), text, ) await callback.answer(text, show_alert=True) return logger.info( "Игра для накрутки на боте %s обновлена для %s. CS2=%s", bot_name, describe_user(callback.from_user), enabled, ) await callback.answer(text, show_alert=True) try: await callback.message.edit_text( text=f"⌚ Выберите игру для накрутки часов", reply_markup=games_keyboard(bot_name, enabled), ) except Exception: logger.debug( "Не удалось обновить клавиатуру игр для бота %s", bot_name, exc_info=True )