from __future__ import annotations import logging from typing import Any logger = logging.getLogger(__name__) async def fetch_app_owner_open_id(client: Any) -> str | None: try: resp = await client.bot.v3.info() if not resp.success(): logger.warning("[FeishuAppOwner] Failed to fetch bot info: %s", resp.msg) return None bot_info = resp.data if hasattr(resp, "data") else {} app_owner_open_id = getattr(bot_info, "app_owner_open_id", "") or bot_info.get("app_owner_open_id", "") if app_owner_open_id: logger.info("[FeishuAppOwner] App owner open_id: %s...", app_owner_open_id[:8]) return app_owner_open_id logger.warning("[FeishuAppOwner] No app_owner_open_id in bot info response") return None except Exception as e: logger.warning("[FeishuAppOwner] fetch_app_owner_open_id failed: %s", e) return None async def resolve_app_owner_open_id(client: Any, config: dict[str, Any]) -> str: explicit = config.get("docOwnerOpenId", "") or config.get("app_owner_open_id", "") if explicit: return explicit fetched = await fetch_app_owner_open_id(client) if fetched: return fetched logger.warning("[FeishuAppOwner] Could not resolve app owner open_id, using bot_open_id fallback") return config.get("bot_open_id", "")