from aiogram import F, Router from aiogram.fsm.context import FSMContext from aiogram.fsm.state import State, StatesGroup from aiogram.types import CallbackQuery, InlineKeyboardButton, Message from aiogram.utils.keyboard import InlineKeyboardBuilder from core.settings.web_config import WEB_CONFIG, update_web_config from database import async_session_maker from handlers.buttons import BACK from ..panel.keyboard import AdminPanelCallback, build_admin_back_btn router = Router(name="admin_settings_web") class WebSettingsState(StatesGroup): waiting_for_url = State() def build_settings_web_kb() -> InlineKeyboardBuilder: builder = InlineKeyboardBuilder() enabled = bool(WEB_CONFIG.get("WEB_ENABLED", False)) url = str(WEB_CONFIG.get("SITE_URL") or "не указан") builder.row( InlineKeyboardButton( text=f"{'✅' if enabled else '❌'} Сайт {'включён' if enabled else 'выключен'}", callback_data=AdminPanelCallback(action="settings_web_toggle").pack(), ) ) builder.row( InlineKeyboardButton( text=f"🌐 URL: {url}", callback_data=AdminPanelCallback(action="settings_web_url").pack(), ) ) builder.row(build_admin_back_btn("settings")) return builder @router.callback_query(AdminPanelCallback.filter(F.action == "settings_web")) async def open_web_settings(callback: CallbackQuery) -> None: enabled = bool(WEB_CONFIG.get("WEB_ENABLED", False)) url = str(WEB_CONFIG.get("SITE_URL") or "не указан") text = ( "🌐 Настройки веб-сайта\n\n" f"Статус: {'✅ Включён' if enabled else '❌ Выключен'}\n" f"URL: {url}\n\n" "Сайт может работать на отдельном домене и сервере.\n" "При выключении кнопка «Личный кабинет» скрывается из бота." ) await callback.message.edit_text( text=text, reply_markup=build_settings_web_kb().as_markup(), ) await callback.answer() @router.callback_query(AdminPanelCallback.filter(F.action == "settings_web_toggle")) async def toggle_web_enabled(callback: CallbackQuery) -> None: current = bool(WEB_CONFIG.get("WEB_ENABLED", False)) new_config = dict(WEB_CONFIG) new_config["WEB_ENABLED"] = not current async with async_session_maker() as session: await update_web_config(session, new_config) status = "✅ Сайт включён" if new_config["WEB_ENABLED"] else "❌ Сайт выключен" await callback.answer(status, show_alert=True) enabled = new_config["WEB_ENABLED"] url = str(new_config.get("SITE_URL") or "не указан") text = ( "🌐 Настройки веб-сайта\n\n" f"Статус: {'✅ Включён' if enabled else '❌ Выключен'}\n" f"URL: {url}\n\n" "Сайт может работать на отдельном домене и сервере.\n" "При выключении кнопка «Личный кабинет» скрывается из бота." ) await callback.message.edit_text( text=text, reply_markup=build_settings_web_kb().as_markup(), ) @router.callback_query(AdminPanelCallback.filter(F.action == "settings_web_url")) async def prompt_web_url(callback: CallbackQuery, state: FSMContext) -> None: current = str(WEB_CONFIG.get("SITE_URL") or "") text = ( "🌐 Введите URL сайта\n\n" f"Текущий: {current or 'не указан'}\n\n" "Отправьте полный URL (с https://).\n" "Пример: https://my-vpn.com\n\n" "Отправьте - чтобы очистить." ) await callback.message.edit_text(text=text) await state.set_state(WebSettingsState.waiting_for_url) await callback.answer() @router.message(WebSettingsState.waiting_for_url) async def set_web_url(message: Message, state: FSMContext) -> None: url = message.text.strip() if message.text else "" if url == "-": url = "" elif url and not url.startswith("http"): await message.answer("❌ URL должен начинаться с http:// или https://") return url = url.rstrip("/") new_config = dict(WEB_CONFIG) new_config["SITE_URL"] = url async with async_session_maker() as session: await update_web_config(session, new_config) await state.clear() enabled = new_config.get("WEB_ENABLED", False) display_url = url or "не указан" text = ( "🌐 Настройки веб-сайта\n\n" f"Статус: {'✅ Включён' if enabled else '❌ Выключен'}\n" f"URL: {display_url}\n\n" "Сайт может работать на отдельном домене и сервере.\n" "При выключении кнопка «Личный кабинет» скрывается из бота." ) await message.answer( text=text, reply_markup=build_settings_web_kb().as_markup(), )