import asyncio from aiogram import Router from aiogram.types import CallbackQuery from bot.api.asf import get_plugins, restart_asf as restart_asf_request from bot.filters import AdminCallbackFilter from bot.services.twofa import stop_twofa_task from bot.state import ( bot_redeem_messages, bot_redeem_users, console_users, redeem_messages, redeem_users, ) from bot.ui.formatters import get_asf_status_text from bot.ui.keyboards import back_keyboard, confirm_action_keyboard, main_keyboard router = Router() def clear_user_state(user_id: int) -> None: redeem_users.discard(user_id) redeem_messages.pop(user_id, None) console_users.discard(user_id) bot_redeem_users.pop(user_id, None) bot_redeem_messages.pop(user_id, None) @router.callback_query(lambda c: c.data == "back", AdminCallbackFilter()) async def back_button(callback: CallbackQuery) -> None: clear_user_state(callback.from_user.id) await stop_twofa_task(callback.message.message_id) # type: ignore[union-attr] await callback.answer() try: await callback.message.edit_text(get_asf_status_text(), reply_markup=main_keyboard()) # type: ignore[union-attr] except Exception as error: await callback.message.edit_text(f"Ошибка: {error}") # type: ignore[union-attr] @router.callback_query(lambda c: c.data == "refresh", AdminCallbackFilter()) async def refresh_handler(callback: CallbackQuery) -> None: await callback.answer() try: await callback.message.edit_text(get_asf_status_text(), reply_markup=main_keyboard()) # type: ignore[union-attr] except Exception as error: await callback.message.edit_text(f"Ошибка: {error}") # type: ignore[union-attr] @router.callback_query(lambda c: c.data == "delete_msg", AdminCallbackFilter()) async def delete_message(callback: CallbackQuery) -> None: await callback.answer() try: await callback.message.delete() # type: ignore[union-attr] except Exception: pass @router.callback_query(lambda c: c.data == "restart_asf_confirm", AdminCallbackFilter()) async def restart_asf_confirm(callback: CallbackQuery) -> None: await callback.answer() await callback.message.edit_text( # type: ignore[union-attr] "♻ Точно перезапустить ASF?\n\nВо время перезапуска IPC будет недоступен несколько секунд.", reply_markup=confirm_action_keyboard("restart_asf", "back"), ) @router.callback_query(lambda c: c.data == "restart_asf", AdminCallbackFilter()) async def restart_asf(callback: CallbackQuery) -> None: await callback.answer() try: await callback.message.edit_text("♻ ASF перезапускается...") # type: ignore[union-attr] response = restart_asf_request() if response.status_code != 200: await callback.message.edit_text( # type: ignore[union-attr] f"Ошибка HTTP {response.status_code}", reply_markup=main_keyboard(), ) return await asyncio.sleep(6) await callback.message.edit_text( # type: ignore[union-attr] f"ASF успешно перезапущен\n\n{get_asf_status_text()}", reply_markup=main_keyboard(), ) except Exception as error: await callback.message.edit_text( # type: ignore[union-attr] f"Ошибка: {error}", reply_markup=main_keyboard(), ) @router.callback_query(lambda c: c.data == "plugins", AdminCallbackFilter()) async def plugins_handler(callback: CallbackQuery) -> None: await stop_twofa_task(callback.message.message_id) # type: ignore[union-attr] await callback.answer() try: response = get_plugins() if response.status_code != 200: await callback.message.edit_text("Ошибка API") # type: ignore[union-attr] return data = response.json() if not data.get("Success"): await callback.message.edit_text("ASF вернул ошибку") # type: ignore[union-attr] return plugins = data.get("Result", []) if not plugins: text = "Плагины не установлены" else: text = "📁 Плагины ASF:\n\n" for plugin in plugins: text += f"{plugin.get('Name', '???')} ({plugin.get('Version', '???')})\n" await callback.message.edit_text(text.strip(), reply_markup=back_keyboard()) # type: ignore[union-attr] except Exception as error: await callback.message.edit_text(f"Ошибка: {error}") # type: ignore[union-attr]