210 lines
6.8 KiB
Python
210 lines
6.8 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from yuxi.channel.extensions.feishu.client import get_client, get_chat_info, get_chat_members, get_user_info
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
FEISHU_CHAT_TOOLS = [
|
|
{
|
|
"name": "feishu_chat_info",
|
|
"description": "获取飞书群聊信息",
|
|
"parameters": {"chat_id": "群聊 ID"},
|
|
},
|
|
{
|
|
"name": "feishu_chat_members",
|
|
"description": "获取飞书群聊成员列表",
|
|
"parameters": {"chat_id": "群聊 ID"},
|
|
},
|
|
{
|
|
"name": "feishu_chat_member_info",
|
|
"description": "获取飞书用户详细信息",
|
|
"parameters": {"user_id": "用户 open_id"},
|
|
},
|
|
{
|
|
"name": "feishu_create_group",
|
|
"description": "创建飞书群组",
|
|
"parameters": {"name": "群名称", "user_ids": "初始成员 ID 列表(可选)", "description": "群描述(可选)"},
|
|
},
|
|
{
|
|
"name": "feishu_update_group",
|
|
"description": "更新群组信息(名称/描述)",
|
|
"parameters": {"chat_id": "群聊 ID", "name": "新名称(可选)", "description": "新描述(可选)"},
|
|
},
|
|
{
|
|
"name": "feishu_delete_group",
|
|
"description": "解散群组",
|
|
"parameters": {"chat_id": "群聊 ID"},
|
|
},
|
|
{
|
|
"name": "feishu_add_group_members",
|
|
"description": "添加群成员",
|
|
"parameters": {"chat_id": "群聊 ID", "member_ids": "成员 open_id 列表"},
|
|
},
|
|
{
|
|
"name": "feishu_remove_group_members",
|
|
"description": "移除群成员",
|
|
"parameters": {"chat_id": "群聊 ID", "member_ids": "成员 open_id 列表"},
|
|
},
|
|
]
|
|
|
|
|
|
async def get_chat_tool_info(
|
|
app_id: str,
|
|
app_secret: str,
|
|
domain: str,
|
|
chat_id: str,
|
|
http_timeout_ms: int = 30000,
|
|
) -> dict:
|
|
try:
|
|
client = get_client(app_id, app_secret, domain, http_timeout_ms)
|
|
result = await get_chat_info(client, chat_id)
|
|
if result:
|
|
return {"success": True, **result}
|
|
return {"success": False, "error": "Chat not found"}
|
|
except Exception:
|
|
logger.exception("Feishu get_chat_tool_info error")
|
|
return {"success": False, "error": "Internal error"}
|
|
|
|
|
|
async def get_chat_tool_members(
|
|
app_id: str,
|
|
app_secret: str,
|
|
domain: str,
|
|
chat_id: str,
|
|
http_timeout_ms: int = 30000,
|
|
) -> dict:
|
|
try:
|
|
client = get_client(app_id, app_secret, domain, http_timeout_ms)
|
|
return await get_chat_members(client, chat_id)
|
|
except Exception:
|
|
logger.exception("Feishu get_chat_tool_members error")
|
|
return {"success": False, "error": "Internal error", "members": []}
|
|
|
|
|
|
async def get_chat_tool_member_info(
|
|
app_id: str,
|
|
app_secret: str,
|
|
domain: str,
|
|
chat_id: str,
|
|
member_id: str,
|
|
http_timeout_ms: int = 30000,
|
|
) -> dict:
|
|
try:
|
|
client = get_client(app_id, app_secret, domain, http_timeout_ms)
|
|
|
|
from yuxi.channel.extensions.feishu.client import get_chat_members as _get_members
|
|
members_result = await _get_members(client, chat_id)
|
|
if not members_result.get("success"):
|
|
return {"success": False, "error": "Unable to fetch chat members"}
|
|
|
|
members = members_result.get("members", [])
|
|
target = next((m for m in members if m.get("open_id") == member_id), None)
|
|
if target:
|
|
return {"success": True, "member": target}
|
|
return {"success": False, "error": "Member not found"}
|
|
except Exception:
|
|
logger.exception("Feishu get_chat_tool_member_info error")
|
|
return {"success": False, "error": "Internal error"}
|
|
|
|
|
|
async def create_group_chat(
|
|
app_id: str,
|
|
app_secret: str,
|
|
domain: str,
|
|
name: str,
|
|
user_ids: list[str] | None = None,
|
|
description: str = "",
|
|
http_timeout_ms: int = 30000,
|
|
) -> dict:
|
|
try:
|
|
client = get_client(app_id, app_secret, domain, http_timeout_ms)
|
|
|
|
from yuxi.channel.extensions.feishu.client import create_chat as _create_chat
|
|
return await _create_chat(client, name, description, user_ids, "group")
|
|
except ImportError:
|
|
return {"success": False, "error": "lark-oapi SDK not installed"}
|
|
except Exception:
|
|
logger.exception("Feishu create_group_chat error")
|
|
return {"success": False, "error": "Internal error"}
|
|
|
|
|
|
async def update_group_chat(
|
|
app_id: str,
|
|
app_secret: str,
|
|
domain: str,
|
|
chat_id: str,
|
|
name: str = "",
|
|
description: str = "",
|
|
http_timeout_ms: int = 30000,
|
|
) -> dict:
|
|
try:
|
|
client = get_client(app_id, app_secret, domain, http_timeout_ms)
|
|
|
|
from yuxi.channel.extensions.feishu.client import update_chat as _update_chat
|
|
return await _update_chat(client, chat_id, name, description)
|
|
except ImportError:
|
|
return {"success": False, "error": "lark-oapi SDK not installed"}
|
|
except Exception:
|
|
logger.exception("Feishu update_group_chat error")
|
|
return {"success": False, "error": "Internal error"}
|
|
|
|
|
|
async def delete_group_chat(
|
|
app_id: str,
|
|
app_secret: str,
|
|
domain: str,
|
|
chat_id: str,
|
|
http_timeout_ms: int = 30000,
|
|
) -> dict:
|
|
try:
|
|
client = get_client(app_id, app_secret, domain, http_timeout_ms)
|
|
|
|
from yuxi.channel.extensions.feishu.client import delete_chat as _delete_chat
|
|
return await _delete_chat(client, chat_id)
|
|
except ImportError:
|
|
return {"success": False, "error": "lark-oapi SDK not installed"}
|
|
except Exception:
|
|
logger.exception("Feishu delete_group_chat error")
|
|
return {"success": False, "error": "Internal error"}
|
|
|
|
|
|
async def add_group_members(
|
|
app_id: str,
|
|
app_secret: str,
|
|
domain: str,
|
|
chat_id: str,
|
|
member_ids: list[str],
|
|
http_timeout_ms: int = 30000,
|
|
) -> dict:
|
|
try:
|
|
client = get_client(app_id, app_secret, domain, http_timeout_ms)
|
|
|
|
from yuxi.channel.extensions.feishu.client import add_chat_members as _add
|
|
return await _add(client, chat_id, member_ids)
|
|
except ImportError:
|
|
return {"success": False, "error": "lark-oapi SDK not installed"}
|
|
except Exception:
|
|
logger.exception("Feishu add_group_members error")
|
|
return {"success": False, "error": "Internal error"}
|
|
|
|
|
|
async def remove_group_members(
|
|
app_id: str,
|
|
app_secret: str,
|
|
domain: str,
|
|
chat_id: str,
|
|
member_ids: list[str],
|
|
http_timeout_ms: int = 30000,
|
|
) -> dict:
|
|
try:
|
|
client = get_client(app_id, app_secret, domain, http_timeout_ms)
|
|
|
|
from yuxi.channel.extensions.feishu.client import remove_chat_members as _remove
|
|
return await _remove(client, chat_id, member_ids)
|
|
except ImportError:
|
|
return {"success": False, "error": "lark-oapi SDK not installed"}
|
|
except Exception:
|
|
logger.exception("Feishu remove_group_members error")
|
|
return {"success": False, "error": "Internal error"} |