import html from aiogram import Router from aiogram.types import Message from bot.api.asf import get_all_bots, send_command from bot.filters import AdminFilter from bot.services.redeem import extract_keys, redeem_all_bots_keys, redeem_single_bot_keys from bot.state import ( bot_redeem_messages, bot_redeem_users, console_users, redeem_messages, redeem_users, ) from bot.ui.formatters import format_bot_ui, get_asf_status_text from bot.ui.keyboards import bot_details_keyboard, delete_message_keyboard, main_keyboard router = Router() async def handle_console_message(message: Message) -> bool: if message.from_user.id not in console_users: # type: ignore[union-attr] return False command = message.text.strip() # type: ignore[union-attr] try: await message.delete() except Exception: pass try: response = send_command(f"!{command}") if response.status_code != 200: text = f"Ошибка HTTP {response.status_code}" else: data = response.json() if not data.get("Success"): text = "Ошибка ASF" else: result = html.escape(str(data.get("Result", "Нет ответа"))) text = f"Команда: {command}\n\nОтвет:\n{result}" await message.answer(text, reply_markup=delete_message_keyboard()) except Exception as error: await message.answer(f"Ошибка: {error}") return True async def handle_single_bot_redeem(message: Message) -> bool: if message.from_user.id not in bot_redeem_users: # type: ignore[union-attr] return False bot_name = bot_redeem_users.pop(message.from_user.id) # type: ignore[union-attr] menu_message = bot_redeem_messages.pop(message.from_user.id, None) # type: ignore[union-attr] if menu_message: try: response = get_all_bots() bot_data = response.json().get("Result", {}).get(bot_name) if bot_data: await menu_message.edit_text( format_bot_ui(bot_data), disable_web_page_preview=True, reply_markup=bot_details_keyboard( bot_name, bool(bot_data.get("HasMobileAuthenticator")) ), ) except Exception: pass try: await message.bot.delete_message(chat_id=message.chat.id, message_id=message.message_id) except Exception: pass keys = extract_keys(message.text or "") if not keys: await message.answer("Ключи не найдены") return True checking = await message.answer( f"Аккаунт: {bot_name}\nНайдено ключей: {len(keys)}\nНачинаю активацию..." ) await checking.edit_text(await redeem_single_bot_keys(bot_name, keys)) return True async def handle_all_bots_redeem(message: Message) -> bool: if message.from_user.id not in redeem_users: # type: ignore[union-attr] return False redeem_users.discard(message.from_user.id) # type: ignore[union-attr] menu_message = redeem_messages.pop(message.from_user.id, None) # type: ignore[union-attr] if menu_message: try: await menu_message.edit_text(get_asf_status_text(), reply_markup=main_keyboard()) except Exception: pass try: await message.bot.delete_message(chat_id=message.chat.id, message_id=message.message_id) except Exception: pass keys = extract_keys(message.text or "") if not keys: await message.answer("Ключи не найдены") return True checking = await message.answer(f"Найдено ключей: {len(keys)}\nНачинаю активацию...") try: await checking.edit_text(await redeem_all_bots_keys(keys)) except Exception as error: await checking.edit_text(f"Ошибка: {error}") return True @router.message(AdminFilter()) async def text_router(message: Message) -> None: if await handle_console_message(message): return if await handle_single_bot_redeem(message): return await handle_all_bots_redeem(message)