From 5f6ee6c40df80e488ad9f723b12cc49a8a144220 Mon Sep 17 00:00:00 2001
From: b1og3n <102593976+b1og3n@users.noreply.github.com>
Date: Wed, 15 Apr 2026 22:43:11 +0200
Subject: [PATCH] Create main.py
---
main.py | 418 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 418 insertions(+)
create mode 100644 main.py
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..1981962
--- /dev/null
+++ b/main.py
@@ -0,0 +1,418 @@
+import asyncio
+import requests
+from io import BytesIO
+from datetime import datetime, timezone
+
+from aiogram import Bot, Dispatcher
+from aiogram.types import Message
+from aiogram.filters import Command, BaseFilter
+from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
+from aiogram.types import CallbackQuery
+import json
+
+# Settings
+API_TOKEN = ""
+ADMIN_ID = 0
+ASF_URL = "http://127.0.0.1:1242/Api/ASF"
+ASF_PASSWORD = "0"
+
+bot = Bot(token=API_TOKEN)
+dp = Dispatcher()
+
+# Classes
+class AdminFilter(BaseFilter):
+ async def __call__(self, message: Message) -> bool:
+ return message.from_user.id == ADMIN_ID
+
+# Functions
+def get_currency_name(currency_id: int) -> str:
+ if currency_id == 1:
+ return "USD"
+ elif currency_id == 3:
+ return "EUR"
+ elif currency_id == 5:
+ return "RUB"
+ elif currency_id == 18:
+ return "UAH"
+ elif currency_id == 6:
+ return "PLN"
+ elif currency_id == 0:
+ return ""
+ else:
+ return "???"
+
+def format_asf(data: dict) -> str:
+ result = data.get("Result", {})
+ config = result.get("GlobalConfig", {})
+
+ lines = []
+
+ lines.append(f"Версия ASF: {result.get('Version')}")
+ can_update = result.get("CanUpdate")
+ if result.get("CanUpdate"):
+ lines.append("🔄 Доступно обновление")
+ memory_kb = result.get("MemoryUsage", 0)
+ memory_mb = memory_kb / 1024
+ lines.append(f"Используется памяти: {memory_mb:.2f} MB")
+ lines.append(f"Работает: {get_uptime(result.get('ProcessStartTime'))}")
+
+ return "\n".join(lines)
+
+def get_uptime(start_time_str: str) -> str:
+ # убираем лишнюю точность (Python не любит 7 знаков)
+ start_time_str = start_time_str[:26] + "Z"
+
+ start_time = datetime.fromisoformat(start_time_str.replace("Z", "+00:00"))
+ now = datetime.now(timezone.utc)
+
+ delta = now - start_time
+
+ days = delta.days
+ hours, remainder = divmod(delta.seconds, 3600)
+ minutes, seconds = divmod(remainder, 60)
+
+ return f"{days}д {hours}ч {minutes}м {seconds}с"
+
+def format_bot_ui(bot: dict) -> str:
+ # основные статусы
+ online = "🟢 Онлайн" if bot.get("IsConnectedAndLoggedOn") else "❌ Оффлайн"
+ now_farming = bot.get("CardsFarmer", {}).get("NowFarming")
+
+ if now_farming:
+ status_line = "🎮 Фармит: играть нельзя!"
+ else:
+ status_line = "🎮 Не фармит: можно играть!"
+
+ time = bot.get("CardsFarmer", {}).get("TimeRemaining", "00:00:00")
+ games_to_farm = len(bot.get("CardsFarmer", {}).get("GamesToFarm", []))
+
+ twofa = "есть" if bot.get("HasMobileAuthenticator") else "нет"
+
+ # баланс
+ balance_raw = bot.get("WalletBalance", 0)
+ balance = balance_raw / 100
+
+ currency_id = bot.get("WalletCurrency", 0)
+ currency = get_currency_name(currency_id)
+
+ # ключи
+ redeem = bot.get("GamesToRedeemInBackgroundCount", 0)
+
+ steam_id = bot.get("SteamID")
+ steam_trade_token = bot.get("BotConfig", {}).get("SteamTradeToken")
+
+ text = (
+ f"🤖 {bot.get('BotName')} ({bot.get('Nickname')})\n\n"
+
+ f"{online}\n"
+ f"{status_line}\n"
+ f"Steam id: {steam_id}\n"
+ f"Trade Token: {steam_trade_token}\n"
+ f"🔐 2FA: {twofa}\n\n"
+
+ f"💰 Баланс: {balance:.2f} {currency}\n"
+ )
+
+ # ключи (только если есть)
+ if redeem > 0:
+ text += f"📦 Ключей в очереди: {redeem}\n"
+
+ # если фармит → показываем время и очередь игр
+ if now_farming:
+ text += f"\n⏱ Осталось: {time}\n"
+
+ if games_to_farm > 0:
+ text += f"📚 В очереди игр: {games_to_farm}\n"
+
+ return text
+
+def get_asf_status_text():
+ response = requests.get(
+ ASF_URL,
+ headers={"Authentication": ASF_PASSWORD}
+ )
+
+ if response.status_code != 200:
+ return f"Ошибка API: {response.status_code}"
+
+ data = response.json()
+
+ if not data.get("Success"):
+ return "ASF вернул ошибку"
+
+ status_text = format_asf(data)
+ return f"Панель управления ASF\n\n{status_text}"
+
+def get_2fa_code(bot_name: str) -> str:
+ response = requests.get(
+ f"http://127.0.0.1:1242/Api/Bot/{bot_name}/TwoFactorAuthentication/Token",
+ headers={"Authentication": ASF_PASSWORD}
+ )
+
+ if response.status_code != 200:
+ return f"Ошибка HTTP {response.status_code}"
+
+ data = response.json()
+
+ if not data.get("Success"):
+ return "Ошибка ASF"
+
+ try:
+ return data["Result"][bot_name]["Result"]
+ except:
+ return "Не удалось получить код"
+
+def get_farm_summary(bots: dict) -> str:
+ total_games = 0
+ total_time_seconds = 0
+
+ for bot in bots.values():
+ farmer = bot.get("CardsFarmer", {})
+
+ # если бот фармит
+ if farmer.get("NowFarming"):
+ games = farmer.get("CurrentGamesFarming", [])
+ total_games += len(games)
+
+ # время
+ time_str = farmer.get("TimeRemaining", "00:00:00")
+ h, m, s = map(int, time_str.split(":"))
+ total_time_seconds += h * 3600 + m * 60 + s
+
+ # если ничего не фармится
+ if total_games == 0:
+ return "❌ На аккаунтах нечего не фармиться"
+
+ # перевод времени обратно
+ hours = total_time_seconds // 3600
+ minutes = (total_time_seconds % 3600) // 60
+
+ return (
+ f"🎮 Игр фармится: {total_games}\n"
+ f"⏱ Осталось времени: {hours}ч {minutes}м\n"
+ f"🃏 Карт осталось: ~{total_games * 3}" # грубая оценка
+ )
+
+def format_bot(bot_data: dict) -> str:
+ return json.dumps(bot_data, indent=2, ensure_ascii=False)
+
+def main_keyboard():
+ return InlineKeyboardMarkup(inline_keyboard=[
+ [InlineKeyboardButton(text="🔄 Обновить", callback_data="refresh")],
+ [InlineKeyboardButton(text="🤖 Боты", callback_data="bots")]
+ ])
+def back_keyboard():
+ return InlineKeyboardMarkup(inline_keyboard=[
+ [InlineKeyboardButton(text="⬅️ Назад", callback_data="back")]
+ ])
+def bots_keyboard(bots: dict):
+ keyboard = []
+
+ for name in bots.keys():
+ keyboard.append([
+ InlineKeyboardButton(
+ text=name,
+ callback_data=f"bot_{name}"
+ )
+ ])
+
+ # кнопка назад
+ keyboard.append([
+ InlineKeyboardButton(text="⬅️ Назад", callback_data="back")
+ ])
+
+ return InlineKeyboardMarkup(inline_keyboard=keyboard)
+
+# Handlers
+@dp.message(Command("start"), AdminFilter())
+async def start_handler(message: Message):
+ try:
+ await message.delete()
+ except:
+ pass
+
+ try:
+ text = get_asf_status_text()
+
+ await message.answer(
+ text,
+ reply_markup=main_keyboard()
+ )
+
+ except Exception as e:
+ await message.answer(f"Ошибка: {e}")
+
+@dp.callback_query(lambda c: c.data == "bots")
+async def bots_handler(callback: CallbackQuery):
+ 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")
+ return
+
+ data = response.json()
+
+ if not data.get("Success"):
+ await callback.message.edit_text("ASF вернул ошибку")
+ return
+
+ bots = data.get("Result", {})
+
+ count = len(bots)
+
+ summary = get_farm_summary(bots)
+
+ text = (
+ f"🤖 Ботов всего: {count}\n\n"
+ f"{summary}\n\n"
+ f"Выбери бота:"
+ )
+
+ await callback.message.edit_text(
+ text,
+ reply_markup=bots_keyboard(bots)
+ )
+
+ except Exception as e:
+ await callback.message.edit_text(f"Ошибка: {e}")
+
+@dp.callback_query(lambda c: c.data.startswith("bot_"))
+async def bot_selected(callback: CallbackQuery):
+ await callback.answer()
+
+ bot_name = callback.data.replace("bot_", "")
+
+ try:
+ response = requests.get(
+ "http://127.0.0.1:1242/Api/Bot/ASF",
+ headers={"Authentication": ASF_PASSWORD}
+ )
+
+ data = response.json()
+ bots = data.get("Result", {})
+
+ bot = bots.get(bot_name)
+
+ if not bot:
+ await callback.message.edit_text("Бот не найден")
+ return
+
+ text = format_bot_ui(bot)
+
+ await callback.message.edit_text(
+ text,
+ parse_mode="HTML",
+ reply_markup=InlineKeyboardMarkup(inline_keyboard=[
+ [InlineKeyboardButton(text="🔐 2FA", callback_data=f"2fa_{bot_name}")],
+ [InlineKeyboardButton(text="⬅️ Назад", callback_data="bots")]
+ ])
+)
+
+ except Exception as e:
+ await callback.message.edit_text(f"Ошибка: {e}")
+
+@dp.callback_query(lambda c: c.data == "back")
+async def back_button(callback: CallbackQuery):
+ await callback.answer()
+
+ try:
+ text = get_asf_status_text()
+
+ await callback.message.edit_text(
+ text,
+ reply_markup=main_keyboard()
+ )
+
+ except Exception as e:
+ await callback.message.edit_text(f"Ошибка: {e}")
+
+@dp.callback_query(lambda c: c.data == "refresh")
+async def refresh_handler(callback: CallbackQuery):
+ await callback.answer()
+
+ try:
+ text = get_asf_status_text()
+
+ await callback.message.edit_text(
+ text,
+ reply_markup=main_keyboard()
+ )
+
+ except Exception as e:
+ await callback.message.edit_text(f"Ошибка: {e}")
+
+@dp.callback_query(lambda c: c.data.startswith("2fa_") and not c.data.startswith("2fa_refresh_"))
+async def twofa_handler(callback: CallbackQuery):
+ await callback.answer()
+
+ bot_name = callback.data.replace("2fa_", "")
+
+ try:
+ code = get_2fa_code(bot_name)
+
+ text = (
+ f"🤖 {bot_name}\n\n"
+ f"{code}"
+ )
+
+ await callback.message.edit_text(
+ text,
+ parse_mode="HTML",
+ reply_markup=InlineKeyboardMarkup(inline_keyboard=[
+ [InlineKeyboardButton(text="🔄 Обновить код", callback_data=f"2fa_refresh_{bot_name}")],
+ [InlineKeyboardButton(
+ text="⬅️ Назад",
+ callback_data=f"bot_{bot_name}"
+)]
+ ])
+ )
+
+ except Exception as e:
+ await callback.message.edit_text(f"Ошибка: {e}")
+
+@dp.callback_query(lambda c: c.data.startswith("2fa_refresh_"))
+async def twofa_refresh(callback: CallbackQuery):
+ await callback.answer()
+
+ bot_name = callback.data.replace("2fa_refresh_", "")
+
+ try:
+ code = get_2fa_code(bot_name)
+
+ # 🔥 проверяем есть ли уже этот код в тексте
+ if callback.message.text and code in callback.message.text:
+ await callback.answer("Код ещё не обновился")
+ return
+
+ new_text = (
+ f"🤖 {bot_name}\n\n"
+ f"{code}"
+ )
+
+ await callback.message.edit_text(
+ new_text,
+ parse_mode="HTML",
+ reply_markup=InlineKeyboardMarkup(inline_keyboard=[
+ [InlineKeyboardButton(text="🔄 Обновить код", callback_data=f"2fa_refresh_{bot_name}")],
+ [InlineKeyboardButton(
+ text="⬅️ Назад",
+ callback_data=f"bot_{bot_name}"
+)]
+ ])
+ )
+
+ except Exception as e:
+ await callback.message.edit_text(f"Ошибка: {e}")
+
+# Start
+async def main():
+ await dp.start_polling(bot)
+
+if __name__ == "__main__":
+ asyncio.run(main())