import re from aiogram import F from aiogram.fsm.context import FSMContext from aiogram.fsm.state import State, StatesGroup from aiogram.types import CallbackQuery, Message from sqlalchemy import func, select, update from sqlalchemy.ext.asyncio import AsyncSession from database.models import Key from filters.admin import IsAdminFilter from logger import logger from ..panel.keyboard import build_admin_back_kb from . import router from .keyboard import AdminPanelCallback class AdminManagementStates(StatesGroup): waiting_for_new_domain = State() @router.callback_query(AdminPanelCallback.filter(F.action == "change_domain"), IsAdminFilter()) async def request_new_domain(callback_query: CallbackQuery, state: FSMContext): await state.set_state(AdminManagementStates.waiting_for_new_domain) await callback_query.message.edit_text( text="🌐 Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½ (Π±Π΅Π· https://):\nΠŸΡ€ΠΈΠΌΠ΅Ρ€: solobotdomen.ru", ) @router.message(AdminManagementStates.waiting_for_new_domain) async def process_new_domain(message: Message, state: FSMContext, session: AsyncSession): new_domain = message.text.strip() if not re.fullmatch(r"[a-zA-Z0-9.-]+", new_domain) or " " in new_domain: logger.warning("[DomainChange] НСкоррСктный Π΄ΠΎΠΌΠ΅Π½") await message.answer( "🚫 НСкоррСктный Π΄ΠΎΠΌΠ΅Π½! Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Π΄ΠΎΠΌΠ΅Π½ Π±Π΅Π· http:// ΠΈ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ².", reply_markup=build_admin_back_kb("admin"), ) return new_domain_url = f"https://{new_domain}" try: stmt = ( update(Key) .values( key=func.regexp_replace(Key.key, r"^https://[^/]+", new_domain_url), remnawave_link=func.regexp_replace(Key.remnawave_link, r"^https://[^/]+", new_domain_url), ) .where( (Key.key.startswith("https://") & ~Key.key.startswith(new_domain_url)) | (Key.remnawave_link.startswith("https://") & ~Key.remnawave_link.startswith(new_domain_url)) ) ) await session.execute(stmt) await session.commit() logger.info("[DomainChange] Запрос Π½Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΌΠ΅Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.") except Exception as e: logger.error(f"[DomainChange] Ошибка ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ запроса: {e}") await message.answer( f"❌ Ошибка ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Π΄ΠΎΠΌΠ΅Π½Π°: {e}", reply_markup=build_admin_back_kb("admin"), ) return try: sample = await session.execute(select(Key.key, Key.remnawave_link).limit(1)) example = sample.fetchone() logger.info(f"[DomainChange] ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ записи: {example}") except Exception as e: logger.error(f"[DomainChange] Ошибка ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ записи: {e}") await message.answer( f"βœ… Π”ΠΎΠΌΠ΅Π½ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π½Π° {new_domain}!", reply_markup=build_admin_back_kb("admin"), ) await state.clear()