import logging from typing import Optional, Tuple from bot.services.panel_api_service import PanelApiService from config.settings import Settings async def _encrypt_raw_link(settings: Settings, raw_link: str) -> Optional[str]: """Encrypt the raw subscription URL using the panel's happ crypt4 API.""" async with PanelApiService(settings) as panel_service: encrypted_link = await panel_service.encrypt_happ_link(raw_link) if encrypted_link: return encrypted_link return None async def prepare_config_links( settings: Settings, raw_link: Optional[str] ) -> Tuple[Optional[str], Optional[str]]: """ Build the user-facing connection key and the URL for the connect button. Returns (display_link, button_link). When CRYPT4 is enabled the display link is encrypted and prefixed with happ://crypt4/ by panel API, and the button link is wrapped with CRYPT4_REDIRECT_URL if provided. """ if not raw_link: return None, None cleaned = raw_link.strip() if not cleaned: return None, None display_link = cleaned button_link = cleaned if settings.CRYPT4_ENABLED: encrypted_payload = await _encrypt_raw_link(settings, cleaned) if encrypted_payload: display_link = encrypted_payload button_link = display_link else: logging.error( "CRYPT4_ENABLED is set but encryption failed; using raw link as fallback." ) redirect_base = (settings.CRYPT4_REDIRECT_URL or "").strip() if redirect_base and settings.CRYPT4_ENABLED and display_link: button_link = f"{redirect_base}{display_link}" return display_link, button_link