From ff9b3cc8ef737de530b062f03e0d2fe7478c5138 Mon Sep 17 00:00:00 2001 From: b1og3n <102593976+b1og3n@users.noreply.github.com> Date: Fri, 24 Jul 2026 21:53:39 +0200 Subject: [PATCH] Update main.py --- main.py | 212 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 123 insertions(+), 89 deletions(-) diff --git a/main.py b/main.py index cacbb86..917633e 100644 --- a/main.py +++ b/main.py @@ -12,6 +12,7 @@ API_TOKEN = os.getenv("API_TOKEN") ADMIN_ID = int(os.getenv("ADMIN_ID")) # type: ignore ASF_URL = os.getenv("ASF_URL") ASF_PASSWORD = os.getenv("ASF_PASSWORD") +HEADERS = {"Authentication": ASF_PASSWORD} PAGE_SIZE = 40 GAMES = {730: "CS2", 440: "TF2", 570: "Dota 2"} @@ -30,9 +31,27 @@ class AdminFilter(BaseFilter): class AdminCallbackFilter(BaseFilter): async def __call__(self, callback: CallbackQuery) -> bool: return callback.from_user.id == ADMIN_ID - + def asf_get(path: str): - return requests.get(f"http://127.0.0.1:1242{path}", headers={"Authentication": ASF_PASSWORD}) + return requests.get(f"http://127.0.0.1:1242{path}", headers=HEADERS) + +def asf_json(path: str): + response = asf_get(path) + if response.status_code != 200: + return None + data = response.json() + if not data.get("Success"): + return None + return data["Result"] + +def asf_post(path: str, payload: dict): + response = requests.post(f"http://127.0.0.1:1242{path}", headers=HEADERS, json=payload) + if response.status_code != 200: + return None + data = response.json() + if not data.get("Success"): + return None + return data.get("Result") def get_currency_name(currency_id: int) -> str: if currency_id == 1: @@ -103,7 +122,15 @@ def get_uptime(start_time_str: str) -> str: days = delta.days hours, remainder = divmod(delta.seconds, 3600) minutes, seconds = divmod(remainder, 60) - return f"{days}д {hours}ч {minutes}м {seconds}с" + parts = [] + if days: + parts.append(f"{days}д") + if hours: + parts.append(f"{hours}ч") + if minutes: + parts.append(f"{minutes}м") + parts.append(f"{seconds}с") + return " ".join(parts) def get_bot_status_icon(bot: dict) -> str: online = bot.get("IsConnectedAndLoggedOn", False) @@ -145,7 +172,7 @@ def format_bot_ui(bot: dict) -> str: if idle_games: names = [GAMES.get(g, str(g)) for g in idle_games] if bot.get("IsConnectedAndLoggedOn"): - idle_text = f"⌚ Накрутка часов: включена ({', '.join(names)})" + idle_text = f"⌚ Накрутка часов: {', '.join(names)}" else: idle_text = f"⌚ Накрутка часов: включена ({', '.join(names)}) применится после запуска" text += f"{idle_text}\n" @@ -153,7 +180,7 @@ def format_bot_ui(bot: dict) -> str: text += "⌚ Накрутка часов: выключена\n" text += ( f"🆔 : {steam_id}\n" - f"🔐 2FA: {twofa}\n\n" + f"🔐 Steam Guard: {twofa}\n\n" f"💰 Баланс: {balance:.2f} {currency}\n") if redeem > 0: text += f"\nКлючей в очереди: {redeem}\n" @@ -164,7 +191,7 @@ def format_bot_ui(bot: dict) -> str: return text def get_asf_status_text(): - response = requests.get(ASF_URL, headers={"Authentication": ASF_PASSWORD}) # type: ignore + response = requests.get(ASF_URL, headers=HEADERS) # type: ignore if response.status_code != 200: return f"Ошибка API: {response.status_code}" data = response.json() @@ -200,22 +227,10 @@ def main_keyboard(): return InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="🆙 Обновить", callback_data="refresh")], [InlineKeyboardButton(text="🤖 Боты", callback_data="bots")], - [InlineKeyboardButton(text="🔑 Активация ключей на всех аккаунтах", callback_data="redeem_keys")], - [InlineKeyboardButton(text="📁 Плагины", callback_data="plugins")], - [InlineKeyboardButton(text="💻 Консоль", callback_data="console")], - [InlineKeyboardButton(text="♻ Перезапустить ASF", callback_data="restart_asf_confirm")]]) + [InlineKeyboardButton(text="⚙️ Управление ASF", callback_data="asf_management")]]) -def back_keyboard(): - return InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="🔙 Назад", callback_data="back")]]) - -def games_keyboard(bot_name, is_enabled): - if is_enabled: - text = "Остановить накрутку CS2" - else: - text = "⌚ Накрутить часы CS2" - return InlineKeyboardMarkup(inline_keyboard=[ - [InlineKeyboardButton(text=text, callback_data=f"farm|{bot_name}|730")], - [InlineKeyboardButton(text="🔙 Назад", callback_data=f"bot_{bot_name}")]]) +def back_keyboard(callback_data: str = "back"): + return InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="🔙 Назад", callback_data=callback_data)]]) def bots_keyboard(bots: dict): keyboard = [] @@ -227,9 +242,36 @@ def bots_keyboard(bots: dict): else: callback_data = f"bot_{name}" keyboard.append([InlineKeyboardButton(text=f"{status} {name}", callback_data=callback_data)]) + keyboard.append([InlineKeyboardButton(text="🔑 Активация ключей на всех аккаунтах", callback_data="redeem_keys")]) keyboard.append([InlineKeyboardButton(text="🔙 Назад", callback_data="back")]) return InlineKeyboardMarkup(inline_keyboard=keyboard) +def bot_keyboard(bot_name: str, has_2fa: bool): + keyboard = [] + if has_2fa: + keyboard.append([InlineKeyboardButton(text="🔐 Steam Guard",callback_data=f"2fa_{bot_name}")]) + keyboard.append([InlineKeyboardButton(text="⌚ Накрутка часов", callback_data=f"games_{bot_name}")]) + keyboard.append([InlineKeyboardButton(text="🔑 Активировать ключ", callback_data=f"redeem_bot_{bot_name}")]) + keyboard.append([InlineKeyboardButton(text="📦 Инвентарь", callback_data=f"inventory_{bot_name}")]) + keyboard.append([InlineKeyboardButton(text="🔙 Назад", callback_data="bots")]) + return InlineKeyboardMarkup(inline_keyboard=keyboard) + +def games_keyboard(bot_name, is_enabled): + if is_enabled: + text = "🔴 Остановить накрутку CS2" + else: + text = "⌚ Накрутить часы CS2" + return InlineKeyboardMarkup(inline_keyboard=[ + [InlineKeyboardButton(text=text, callback_data=f"farm|{bot_name}|730")], + [InlineKeyboardButton(text="🔙 Назад", callback_data=f"bot_{bot_name}")]]) + +def asf_management_keyboard(): + return InlineKeyboardMarkup(inline_keyboard=[ + [InlineKeyboardButton(text="📁 Плагины", callback_data="plugins")], + [InlineKeyboardButton(text="💻 Консоль", callback_data="console")], + [InlineKeyboardButton(text="♻ Перезапустить ASF", callback_data="restart_asf_confirm")], + [InlineKeyboardButton(text="🔙 Назад", callback_data="back")],]) + def is_bot_playing(bot_name: str) -> bool: response = asf_get("/Api/Bot/ASF") if response.status_code != 200: @@ -239,7 +281,7 @@ def is_bot_playing(bot_name: str) -> bool: return bool(bot.get("PlayingBlocked", False)) or bool(bot.get("CurrentGamesPlayed", [])) def is_idle_enabled(bot_name: str, app_id: int) -> bool: - response = requests.get(f"http://127.0.0.1:1242/Api/Bot/{bot_name}", headers={"Authentication": ASF_PASSWORD}) + response = requests.get(f"http://127.0.0.1:1242/Api/Bot/{bot_name}", headers=HEADERS) if response.status_code != 200: return False data = response.json() @@ -249,7 +291,7 @@ def is_idle_enabled(bot_name: str, app_id: int) -> bool: async def get_2fa_code(bot_name: str) -> str: async with aiohttp.ClientSession() as session: - async with session.get(f"http://127.0.0.1:1242/Api/Bot/{bot_name}/TwoFactorAuthentication/Token", headers={"Authentication": ASF_PASSWORD}) as response: # type: ignore + async with session.get(f"http://127.0.0.1:1242/Api/Bot/{bot_name}/TwoFactorAuthentication/Token", headers=HEADERS) as response: # type: ignore if response.status != 200: return f"Ошибка HTTP {response.status}" data = await response.json() @@ -262,7 +304,7 @@ async def get_2fa_code(bot_name: str) -> str: async def get_confirmations(bot_name: str): async with aiohttp.ClientSession() as session: - async with session.get(f"http://127.0.0.1:1242/Api/Bot/{bot_name}/TwoFactorAuthentication/Confirmations", headers={"Authentication": ASF_PASSWORD}) as response: # type: ignore + async with session.get(f"http://127.0.0.1:1242/Api/Bot/{bot_name}/TwoFactorAuthentication/Confirmations", headers=HEADERS) as response: # type: ignore if response.status != 200: return [] data = await response.json() @@ -276,7 +318,7 @@ async def get_confirmations(bot_name: str): async def get_inventory(bot_name: str, appid: int, contextid: int = 2): url = (f"http://127.0.0.1:1242/Api/Bot/{bot_name}/Inventory/{appid}/{contextid}") async with aiohttp.ClientSession() as session: - async with session.get(url, headers={"Authentication": ASF_PASSWORD}) as response: # type: ignore + async with session.get(url, headers=HEADERS) as response: # type: ignore if response.status != 200: return None data = await response.json() @@ -288,7 +330,7 @@ async def get_inventory(bot_name: str, appid: int, contextid: int = 2): return None async def render_inventory_page(callback: CallbackQuery, bot_name: str, inventory_type: str, appid: int, contextid: int, page: int): - await callback.message.edit_text("Загрузка inventory...") # type: ignore + await callback.message.edit_text("Загрузка инвентаря...") # type: ignore inventory = await get_inventory(bot_name, appid, contextid) if not inventory: await callback.message.edit_text("Не удалось загрузить inventory") # type: ignore @@ -297,7 +339,7 @@ async def render_inventory_page(callback: CallbackQuery, bot_name: str, inventor assets = bot_inventory.get("Assets", []) descriptions = bot_inventory.get("Descriptions", []) if not assets: - await callback.message.edit_text("Инвентарь пуст", reply_markup=InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="🔙 Назад", callback_data=f"inventory_{bot_name}")]])) # type: ignore + await callback.message.edit_text("Инвентарь пуст", reply_markup=InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="🔙 Назад", callback_data=f"inventory_{bot_name}")]])) # type: ignore return desc_map = {} for desc in descriptions: @@ -337,17 +379,17 @@ async def render_inventory_page(callback: CallbackQuery, bot_name: str, inventor lines.append(f"{icon} {tradable}{marketable} {name} x{amount}") inv_name = ("CS2" if appid == 730 else "Steam") stats = ( - f"📦 Items: {len(assets)}\n" + f"📦 Предметы: {len(assets)}\n" f"💰 Marketable: {marketable_count}\n" f"🔄 Tradable: {tradable_count}") if appid == 753: stats += ( - f"\n🃏 Cards: {cards_count}" - f"\n😀 Emotes: {emotes_count}" - f"\n🖼 Backgrounds: {backgrounds_count}" - f"\n💎 Gems: {gems_count}") + f"\n🃏 Карточки: {cards_count}" + f"\n😀 Емоджи: {emotes_count}" + f"\n🖼 Фонов: {backgrounds_count}" + f"\n💎 Гемов: {gems_count}") text = ( - f"📦 {inv_name} Inventory {bot_name}\n" + f"📦 {inv_name} инвентарь {bot_name}\n" f"📄 Страница {page + 1}/{total_pages}\n\n" f"{stats}\n\n" + "\n".join(lines)) @@ -364,7 +406,7 @@ async def render_inventory_page(callback: CallbackQuery, bot_name: str, inventor async def reload_bot(bot_name: str): try: - requests.post("http://127.0.0.1:1242/Api/Command", headers={"Authentication": ASF_PASSWORD}, json={"Command": f"!reload {bot_name}"}) + requests.post("http://127.0.0.1:1242/Api/Command", headers=HEADERS, json={"Command": f"!reload {bot_name}"}) except: pass @@ -379,7 +421,7 @@ async def stop_twofa_task(message_id: int): async def redeem_key(bot_name: str, key: str): async with aiohttp.ClientSession() as session: - async with session.post("http://127.0.0.1:1242/Api/Command", headers={"Authentication": ASF_PASSWORD}, json={"Command": f"!redeem {bot_name} {key}"}) as response: # type: ignore + async with session.post("http://127.0.0.1:1242/Api/Command", headers=HEADERS, json={"Command": f"!redeem {bot_name} {key}"}) as response: # type: ignore if response.status != 200: return False, f"HTTP_ERROR_{response.status}" data = await response.json() @@ -404,8 +446,8 @@ async def auto_update_2fa(message, bot_name): keyboard.append([InlineKeyboardButton(text="Подтверждения", callback_data=f"confirm_list_{bot_name}")]) keyboard.append([InlineKeyboardButton(text="🔙 Назад", callback_data=f"bot_{bot_name}")]) text = ( - f"🔐 {bot_name}\n\n" - f"{code}") + f"🔐 Steam Guard аккаунта {bot_name}\n\n" + f"Код: {code}") try: await message.edit_text(text, reply_markup=InlineKeyboardMarkup(inline_keyboard=keyboard)) last_code = code @@ -415,7 +457,7 @@ async def auto_update_2fa(message, bot_name): except asyncio.CancelledError: pass except Exception as e: - print(f"2FA updater error: {e}") + print(f"Steam Guard updater error: {e}") finally: twofa_tasks.pop(message_id, None) @@ -435,14 +477,13 @@ async def start_handler(message: Message): async def console_enter(callback: CallbackQuery): await callback.answer() console_users.add(callback.from_user.id) - await callback.message.edit_text("💻 Консоль ASF\n\nОтправь команду (без !)", reply_markup=InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="🔙 Назад", callback_data="console_exit")]])) # type: ignore + await callback.message.edit_text("💻 Консоль ASF\nОтправь команду (без !)", reply_markup=back_keyboard("console_exit")) # type: ignore @dp.callback_query(lambda c: c.data == "console_exit", AdminCallbackFilter()) async def console_exit(callback: CallbackQuery): await callback.answer() console_users.discard(callback.from_user.id) - text = get_asf_status_text() - await callback.message.edit_text(text, reply_markup=main_keyboard()) # type: ignore + await callback.message.edit_text("⚙️ Управление ASF", reply_markup=asf_management_keyboard()) @dp.callback_query(lambda c: c.data == "delete_msg", AdminCallbackFilter()) async def delete_message(callback: CallbackQuery): @@ -457,15 +498,18 @@ async def bots_handler(callback: CallbackQuery): await stop_twofa_task(callback.message.message_id) # type: ignore await callback.answer() try: - response = requests.get("http://127.0.0.1:1242/Api/Bot/ASF", headers={"Authentication": ASF_PASSWORD}) - if response.status_code != 200: - await callback.message.edit_text("Ошибка API") # type: ignore + bots = asf_json("/Api/Bot/ASF") + if bots is None: + await callback.message.edit_text("Ошибка API") return - data = response.json() - if not data.get("Success"): - await callback.message.edit_text("ASF вернул ошибку") # type: ignore + not_loaded = [name for name, bot in bots.items() if not bot.get("BotName") or not bot.get("SteamID")] + if not_loaded: + await callback.message.edit_text( + "⏳ Аккаунты еще загружаются.\n\n" + f"Осталось загрузить: {len(not_loaded)} из {len(bots)}.\n" + "Подождите еще несколько секунд.", + reply_markup=back_keyboard()) return - bots = data.get("Result", {}) count = len(bots) summary = get_farm_summary(bots) text = ( @@ -483,9 +527,10 @@ async def bot_selected(callback: CallbackQuery): return bot_name = callback.data.replace("bot_", "") try: - response = asf_get("/Api/Bot/ASF") - data = response.json() - bots = data.get("Result", {}) + bots = asf_json("/Api/Bot/ASF") + if bots is None: + await callback.message.edit_text("Ошибка API") + return bot = bots.get(bot_name) if not bot or not bot.get("BotName") or not bot.get("SteamID"): await callback.answer("Аккаунт ещё загружается. Попробуйте через несколько секунд.", show_alert=True) @@ -494,15 +539,7 @@ async def bot_selected(callback: CallbackQuery): await callback.message.edit_text("Бот не найден") # type: ignore return text = format_bot_ui(bot) - keyboard = [] - if bot.get("HasMobileAuthenticator"): - keyboard.append([InlineKeyboardButton(text="🔐 2FA", callback_data=f"2fa_{bot_name}")]) - keyboard.append([InlineKeyboardButton(text="⌚ Накрутка часов", callback_data=f"games_{bot_name}")]) - keyboard.append([InlineKeyboardButton(text="🔑 Активировать ключ", callback_data=f"redeem_bot_{bot_name}")]) - keyboard.append([InlineKeyboardButton(text="📦 Инвентарь", callback_data=f"inventory_{bot_name}")]) - keyboard.append([InlineKeyboardButton(text="🔙 Назад", callback_data="bots")]) - - await callback.message.edit_text(text, disable_web_page_preview=True, reply_markup=InlineKeyboardMarkup(inline_keyboard=keyboard)) # type: ignore + await callback.message.edit_text(text, disable_web_page_preview=True, reply_markup=bot_keyboard(bot_name, bot.get("HasMobileAuthenticator", False))) except Exception as e: await callback.message.edit_text(f"Ошибка: {e}") # type: ignore @@ -543,19 +580,19 @@ async def refresh_handler(callback: CallbackQuery): async def restart_asf_confirm(callback: CallbackQuery): await callback.answer() await callback.message.edit_text( # type: ignore - "♻ Точно перезапустить ASF?\n\n" + "♻ Точно перезапустить ASF?\n\n" "Во время перезапуска IPC будет недоступен несколько секунд.", reply_markup=InlineKeyboardMarkup( inline_keyboard=[ [InlineKeyboardButton(text="Да", callback_data="restart_asf")], - [InlineKeyboardButton(text="Нет", callback_data="back")]])) + [InlineKeyboardButton(text="Нет", callback_data="asf_management")]])) @dp.callback_query(lambda c: c.data == "restart_asf", AdminCallbackFilter()) async def restart_asf(callback: CallbackQuery): await callback.answer() try: await callback.message.edit_text("♻ ASF перезапускается...") # type: ignore - response = requests.post("http://127.0.0.1:1242/Api/Command", headers={"Authentication": ASF_PASSWORD}, json={"Command": "!restart"}) + response = requests.post("http://127.0.0.1:1242/Api/Command", headers=HEADERS, json={"Command": "!restart"}) if response.status_code != 200: await callback.message.edit_text(f"Ошибка HTTP {response.status_code}", reply_markup=main_keyboard()) # type: ignore return @@ -580,7 +617,7 @@ async def twofa_handler(callback: CallbackQuery): except: pass await callback.message.edit_text( # type: ignore - f"🔐 {bot_name}\n\nЗагрузка 2FA...", + f"🔐 Steam Guard аккаунта {bot_name}\n\n" "⏳ Загрузка кода...", reply_markup=InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="🔙 Назад", callback_data=f"bot_{bot_name}")]])) task = asyncio.create_task(auto_update_2fa(callback.message, bot_name)) twofa_tasks[message_id] = task @@ -590,7 +627,7 @@ async def confirm_trades(callback: CallbackQuery): await callback.answer() bot_name = callback.data.replace("confirm_", "") # type: ignore try: - response = requests.post(f"http://127.0.0.1:1242/Api/Bot/{bot_name}/TwoFactorAuthentication/Confirmations/Accept", headers={"Authentication": ASF_PASSWORD}) + response = requests.post(f"http://127.0.0.1:1242/Api/Bot/{bot_name}/TwoFactorAuthentication/Confirmations/Accept", headers=HEADERS) if response.status_code != 200: await callback.answer("Ошибка HTTP", show_alert=True) return @@ -604,15 +641,10 @@ async def plugins_handler(callback: CallbackQuery): await stop_twofa_task(callback.message.message_id) # type: ignore await callback.answer() try: - response = requests.get("http://127.0.0.1:1242/Api/Plugins", headers={"Authentication": ASF_PASSWORD}) - if response.status_code != 200: - await callback.message.edit_text("Ошибка API") # type: ignore + plugins = asf_json("/Api/Plugins") + if plugins is None: + await callback.message.edit_text("Ошибка API") return - data = response.json() - if not data.get("Success"): - await callback.message.edit_text("ASF вернул ошибку") # type: ignore - return - plugins = data.get("Result", []) if not plugins: text = "Плагины не установлены" else: @@ -621,7 +653,7 @@ async def plugins_handler(callback: CallbackQuery): name = plugin.get("Name", "???") version = plugin.get("Version", "???") text += f"{name} ({version})\n" - await callback.message.edit_text(text.strip(), reply_markup=InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="🔙 Назад", callback_data="back")]])) # type: ignore + await callback.message.edit_text(text.strip(), reply_markup=back_keyboard("asf_management")) except Exception as e: await callback.message.edit_text(f"Ошибка: {e}") # type: ignore @@ -657,7 +689,7 @@ async def confirm_all(callback: CallbackQuery): return bot_name = callback.data.replace("confirm_all_", "") try: - response = requests.post(f"http://127.0.0.1:1242/Api/Bot/{bot_name}/TwoFactorAuthentication/Confirmations/Accept", headers={"Authentication": ASF_PASSWORD}) + response = requests.post(f"http://127.0.0.1:1242/Api/Bot/{bot_name}/TwoFactorAuthentication/Confirmations/Accept", headers=HEADERS) if response.status_code != 200: await callback.answer("Ошибка HTTP", show_alert=True) return @@ -689,7 +721,7 @@ async def farm_game(callback: CallbackQuery): app_id = int(app_id) try: # получаем текущий конфиг - response = requests.get(f"http://127.0.0.1:1242/Api/Bot/{bot_name}", headers={"Authentication": ASF_PASSWORD}) + response = requests.get(f"http://127.0.0.1:1242/Api/Bot/{bot_name}", headers=HEADERS) data = response.json() bot_data = data.get("Result", {}).get(bot_name, {}) config = bot_data.get("BotConfig", {}) @@ -702,7 +734,7 @@ async def farm_game(callback: CallbackQuery): action = "Idle включен" config["GamesPlayedWhileIdle"] = idle_games save = requests.post( - f"http://127.0.0.1:1242/Api/Bot/{bot_name}", headers={"Authentication": ASF_PASSWORD}, json={"BotConfig": config}) + f"http://127.0.0.1:1242/Api/Bot/{bot_name}", headers=HEADERS, json={"BotConfig": config}) if save.status_code != 200: await callback.answer("Ошибка сохранения", show_alert=True) return @@ -719,7 +751,7 @@ async def farm_game(callback: CallbackQuery): async def inventory_menu(callback: CallbackQuery): await callback.answer() bot_name = callback.data.replace("inventory_", "") # type: ignore - await callback.message.edit_text("Проверка inventory...") # type: ignore + await callback.message.edit_text("Проверка инвентаря...") # type: ignore cs2_inventory = await get_inventory(bot_name, 730, 2) steam_inventory = await get_inventory(bot_name, 753, 6) cs2_assets = [] @@ -733,7 +765,7 @@ async def inventory_menu(callback: CallbackQuery): except: pass if not cs2_assets and not steam_assets: - await callback.message.edit_text(f"📦 Инвентарь {bot_name} пуст", reply_markup=InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="🔙 Назад", callback_data=f"bot_{bot_name}")]])) # type: ignore + await callback.message.edit_text(f"📦 Инвентарь {bot_name} пуст", reply_markup=back_keyboard(f"bot_{bot_name}")) # type: ignore return keyboard = [] if cs2_assets: @@ -743,14 +775,11 @@ async def inventory_menu(callback: CallbackQuery): keyboard.append([InlineKeyboardButton(text="🔙 Назад", callback_data=f"bot_{bot_name}")]) await callback.message.edit_text( # type: ignore ( - f"📦 Инвентарь {bot_name}\n\n" + f"📦 Инвентарь {bot_name}\n\n" "🔄 — можно трейдить\n" "💰 — можно продавать\n" "🔒 — нельзя продавать\n" - "❌ — нельзя трейдить" - ), - reply_markup=InlineKeyboardMarkup(inline_keyboard=keyboard) - ) + "❌ — нельзя трейдить"), reply_markup=InlineKeyboardMarkup(inline_keyboard=keyboard)) @dp.callback_query(lambda c: c.data and c.data.startswith("inv_cs2_"), AdminCallbackFilter()) async def cs2_inventory(callback: CallbackQuery): @@ -784,7 +813,7 @@ async def redeem_keys_menu(callback: CallbackQuery): "Можно отправить сразу несколько ключей.\n\n" "Пример:\n" "AAAAA-BBBBB-CCCCC\nDDDDD-EEEEE-FFFFF", - reply_markup=InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="🔙 Назад", callback_data="back")]])) + reply_markup=back_keyboard("bots")) @dp.callback_query(lambda c: c.data and c.data.startswith("redeem_bot_"), AdminCallbackFilter()) async def redeem_bot_menu(callback: CallbackQuery): @@ -796,7 +825,7 @@ async def redeem_bot_menu(callback: CallbackQuery): f"Отправьте ключ Steam для активации на аккаунте:\n" f"{bot_name}\n\n" f"Можно отправить сразу несколько ключей.", - reply_markup=InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="🔙 Назад", callback_data=f"bot_{bot_name}")]])) + reply_markup=back_keyboard(f"bot_{bot_name}")) @dp.message(AdminFilter()) async def text_router(message: Message): @@ -808,7 +837,7 @@ async def text_router(message: Message): except: pass try: - response = requests.post("http://127.0.0.1:1242/Api/Command", headers={"Authentication": ASF_PASSWORD}, json={"Command": f"!{command}"}) + response = requests.post("http://127.0.0.1:1242/Api/Command", headers=HEADERS, json={"Command": f"!{command}"}) if response.status_code != 200: text = f"Ошибка HTTP {response.status_code}" else: @@ -831,7 +860,7 @@ async def text_router(message: Message): menu_message = bot_redeem_messages.pop(message.from_user.id, None) # type: ignore if menu_message: try: - response = requests.get("http://127.0.0.1:1242/Api/Bot/ASF",headers={"Authentication": ASF_PASSWORD}) + response = requests.get("http://127.0.0.1:1242/Api/Bot/ASF",headers=HEADERS) data = response.json() bot_data = data.get("Result", {}).get(bot_name) if bot_data: @@ -840,7 +869,7 @@ async def text_router(message: Message): disable_web_page_preview=True, reply_markup=InlineKeyboardMarkup( inline_keyboard=[ - [InlineKeyboardButton(text="🔐 2FA", callback_data=f"2fa_{bot_name}")] + [InlineKeyboardButton(text="🔐 Steam Guard", callback_data=f"2fa_{bot_name}")] if bot_data.get("HasMobileAuthenticator") else [], [InlineKeyboardButton(text="⌚ Накрутка часов", callback_data=f"games_{bot_name}")], [InlineKeyboardButton(text="🔑 Активировать ключ", callback_data=f"redeem_bot_{bot_name}")], @@ -988,6 +1017,11 @@ async def text_router(message: Message): await checking.edit_text(f"Ошибка: {e}") return +@dp.callback_query(lambda c: c.data == "asf_management", AdminCallbackFilter()) +async def asf_management(callback: CallbackQuery): + await callback.answer() + await callback.message.edit_text("⚙️ Управление ASF", reply_markup=asf_management_keyboard()) + async def main(): await dp.start_polling(bot)