from __future__ import annotations import logging from typing import Any from yuxi.channels.models import DeliveryResult logger = logging.getLogger(__name__) try: import lark_oapi HAS_LARK_SDK = True except ImportError: HAS_LARK_SDK = False lark_oapi = None # type: ignore async def create_pin(client: Any, message_id: str) -> DeliveryResult: if not HAS_LARK_SDK: return DeliveryResult(success=False, error="lark-oapi SDK not available") try: request = ( lark_oapi.api.im.v1.CreatePinRequest.builder() .request_body(lark_oapi.api.im.v1.CreatePinRequestBody.builder().message_id(message_id).build()) .build() ) resp = await client.im.v1.pin.create(request) if resp.success(): return DeliveryResult(success=True, message_id=message_id) return DeliveryResult(success=False, error=resp.msg) except Exception as e: logger.error(f"[Feishu] create_pin failed: {e}") return DeliveryResult(success=False, error=str(e)) async def remove_pin(client: Any, message_id: str) -> DeliveryResult: if not HAS_LARK_SDK: return DeliveryResult(success=False, error="lark-oapi SDK not available") try: request = lark_oapi.api.im.v1.DeletePinRequest.builder().message_id(message_id).build() resp = await client.im.v1.pin.delete(request) if resp.success(): return DeliveryResult(success=True) return DeliveryResult(success=False, error=resp.msg) except Exception as e: logger.error(f"[Feishu] remove_pin failed: {e}") return DeliveryResult(success=False, error=str(e)) async def list_pins( client: Any, chat_id: str, *, start_time: str | None = None, end_time: str | None = None, page_size: int = 20, page_token: str | None = None, ) -> dict[str, Any]: if not HAS_LARK_SDK: return {"pins": [], "total": 0} try: request = lark_oapi.api.im.v1.ListPinRequest.builder().chat_id(chat_id).page_size(page_size).build() if page_token: request.page_token(page_token) if start_time: request.start_time(start_time) if end_time: request.end_time(end_time) resp = await client.im.v1.pin.list(request) if resp.success(): items = resp.data.get("items", []) return { "pins": [ { "message_id": item.get("message_id", ""), "chat_id": item.get("chat_id", ""), "create_time": item.get("create_time", ""), "operator_id": item.get("operator_id", ""), } for item in items ], "total": resp.data.get("total", 0), "page_token": resp.data.get("page_token", ""), "has_more": resp.data.get("has_more", False), } return {"pins": [], "total": 0, "error": resp.msg} except Exception as e: logger.error(f"[Feishu] list_pins failed: {e}") return {"pins": [], "total": 0, "error": str(e)}