1. 移除多个文件中的空行、冗余导入
2. 修复文件末尾缺少换行符的问题
3. 新增并补全飞书多类工具API实现:
- 多维表格:更新、删除记录,列出视图
- 文档:更新、追加、删除块
- 云文档:上传、下载文件
- 群组:创建、添加成员、更新信息、创建公告
- 目录:重构用户部门缓存逻辑
4. 优化消息发送、回复、转发等API的错误处理和逻辑
5. 新增消息列表查询、已读状态查询等功能
76 lines
2.5 KiB
Python
76 lines
2.5 KiB
Python
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", "")
|
|
|
|
|
|
async def validate_owner_permission(
|
|
client: Any,
|
|
owner_open_id: str,
|
|
resource_type: str,
|
|
resource_token: str,
|
|
) -> bool:
|
|
try:
|
|
from .tools.perm import list_file_members
|
|
|
|
members = await list_file_members(client, resource_token)
|
|
for member in members:
|
|
if member.get("member_id") == owner_open_id and member.get("perm") == "full_access":
|
|
return True
|
|
return False
|
|
except Exception as e:
|
|
logger.warning("[FeishuAppOwner] Permission validation failed: %s", e)
|
|
return False
|
|
|
|
|
|
async def ensure_owner_access(
|
|
client: Any,
|
|
owner_open_id: str,
|
|
resource_type: str,
|
|
resource_token: str,
|
|
) -> bool:
|
|
try:
|
|
from .tools.perm import add_file_permission
|
|
|
|
await add_file_permission(client, resource_token, "openid", owner_open_id, "full_access")
|
|
logger.info("[FeishuAppOwner] Granted full_access to owner %s on %s", owner_open_id[:8], resource_token[:16])
|
|
return True
|
|
except Exception as e:
|
|
logger.warning("[FeishuAppOwner] Failed to grant owner access: %s", e)
|
|
return False
|