from aiogram import F, Router 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 middlewares import maintenance from ..panel.keyboard import build_admin_back_kb from .keyboard import AdminPanelCallback, build_management_kb router = Router() class AdminManagementStates(StatesGroup): waiting_for_new_domain = State() @router.callback_query( AdminPanelCallback.filter(F.action == "management"), IsAdminFilter() ) async def handle_management(callback_query: CallbackQuery): await callback_query.message.edit_text( text="πŸ€– Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±ΠΎΡ‚ΠΎΠΌ", reply_markup=build_management_kb(), ) @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 ): """ΠžΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ‚ Π΄ΠΎΠΌΠ΅Π½ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ keys.""" new_domain = message.text.strip() logger.info( f"[DomainChange] Новый Π΄ΠΎΠΌΠ΅Π½, Π²Π²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ администратором: '{new_domain}'" ) if not new_domain or " " in new_domain or not new_domain.replace(".", "").isalnum(): logger.warning("[DomainChange] НСкоррСктный Π΄ΠΎΠΌΠ΅Π½") await message.answer( "🚫 НСкоррСктный Π΄ΠΎΠΌΠ΅Π½! Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Π΄ΠΎΠΌΠ΅Π½ Π±Π΅Π· http:// ΠΈ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ².", reply_markup=build_admin_back_kb("admin"), ) return new_domain_url = f"https://{new_domain}" logger.info(f"[DomainChange] Новый Π΄ΠΎΠΌΠ΅Π½ с ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ: '{new_domain_url}'") try: stmt = ( update(Key) .where(~Key.key.startswith(new_domain_url)) .values(key=func.regexp_replace(Key.key, r"^https://[^/]+", 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).limit(1)) example = sample.scalar() 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() @router.callback_query(AdminPanelCallback.filter(F.action == "toggle_maintenance")) async def toggle_maintenance_mode(callback: CallbackQuery): maintenance.maintenance_mode = not maintenance.maintenance_mode new_status = "Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½" if maintenance.maintenance_mode else "Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½" await callback.answer(f"πŸ› οΈ Π Π΅ΠΆΠΈΠΌ обслуТивания {new_status}.", show_alert=True) await callback.message.edit_reply_markup(reply_markup=build_management_kb())