ForcePilot/backend/package/yuxi/channels/adapters/googlechat/audit.py
Kris ca07c593a8 feat(googlechat): 实现 Google Chat 适配器完整功能集
新增 Google Chat 对接的全套工具模块,包括:
- 会话线程管理、消息解析与格式化
- Pub/Sub 消息解码、提及和命令识别
- 权限审批、目录管理和审计日志
- 消息缓存、媒体上传下载和 SSFR 防护
- 策略配置、卡片构建和流式回复支持
2026-05-12 00:44:18 +08:00

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}")