新增 Google Chat 对接的全套工具模块,包括: - 会话线程管理、消息解析与格式化 - Pub/Sub 消息解码、提及和命令识别 - 权限审批、目录管理和审计日志 - 消息缓存、媒体上传下载和 SSFR 防护 - 策略配置、卡片构建和流式回复支持
61 lines
1.7 KiB
Python
61 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
if TYPE_CHECKING:
|
|
from googleapiclient.discovery import Resource
|
|
|
|
from yuxi.utils.logging_config import logger
|
|
|
|
|
|
async def check_space_membership(
|
|
chat_service: Resource,
|
|
space_name: str,
|
|
user_name: str,
|
|
) -> bool:
|
|
try:
|
|
membership = chat_service.spaces().members().get(name=f"{space_name}/members/{user_name}").execute()
|
|
return membership is not None
|
|
except Exception as e:
|
|
_log_audit_error("check_space_membership", space_name, e)
|
|
return False
|
|
|
|
|
|
async def list_space_members(
|
|
chat_service: Resource,
|
|
space_name: str,
|
|
) -> list[dict]:
|
|
try:
|
|
result = chat_service.spaces().members().list(parent=space_name).execute()
|
|
return result.get("memberships", [])
|
|
except Exception as e:
|
|
_log_audit_error("list_space_members", space_name, e)
|
|
return []
|
|
|
|
|
|
async def get_member_role(
|
|
chat_service: Resource,
|
|
space_name: str,
|
|
user_name: str,
|
|
) -> str | None:
|
|
try:
|
|
membership = chat_service.spaces().members().get(name=f"{space_name}/members/{user_name}").execute()
|
|
return membership.get("role")
|
|
except Exception as e:
|
|
_log_audit_error("get_member_role", space_name, e)
|
|
return None
|
|
|
|
|
|
def _log_audit_error(operation: str, space_name: str, error: Exception) -> None:
|
|
try:
|
|
from googleapiclient.errors import HttpError
|
|
|
|
if isinstance(error, HttpError):
|
|
logger.warning(
|
|
f"Audit operation '{operation}' failed for {space_name}: HTTP {error.resp.status} {error.resp.reason}"
|
|
)
|
|
return
|
|
except ImportError:
|
|
pass
|
|
logger.warning(f"Audit operation '{operation}' failed for {space_name}: {error}")
|