ForcePilot/backend/package/yuxi/channels/adapters/zalo_user/reaction.py
Kris 9285da5c55 feat(zalo-user): 实现完整的Zalo用户频道适配器
新增了Zalo用户频道的完整适配器实现,包括:
- 基础的适配器初始化与导出结构
- 群组同步与成员获取功能
- 请求限流与退避重试机制
- 健康检查与状态探针
- 消息反应/表情处理工具
- 贴纸缓存与消息去重功能
- 消息ID格式化与追踪
- TTS语音合成支持
- 消息发送权限校验
- 长文本分块发送
- 操作审批流程
- 常量配置与国际化支持
- 图像视觉分析功能
- 贴纸消息处理
- 登录与配置向导
- 群组上下文缓存
- 网关连接管理
- 配置Schema校验
- 状态问题与安全审计
- 内联按钮与交互组件
- 交互式回调分发
- 联系人与群组目录管理
- 富媒体卡片消息支持
2026-05-12 00:53:13 +08:00

48 lines
1.1 KiB
Python

from __future__ import annotations
from .constants import REACTION_ALIAS_MAP, ZALO_REACTION_EMOJIS
REACTION_DELETE_ICON = ""
def normalize_reaction_icon(emoji: str) -> str:
if not emoji:
return REACTION_DELETE_ICON
normalized = emoji.strip()
if normalized.lower() in REACTION_ALIAS_MAP:
return REACTION_ALIAS_MAP[normalized.lower()]
if normalized in ZALO_REACTION_EMOJIS:
return normalized
return normalized
def is_valid_reaction(emoji: str) -> bool:
normalized = emoji.strip()
if normalized.lower() in REACTION_ALIAS_MAP:
return True
if normalized in ZALO_REACTION_EMOJIS:
return True
return False
def is_delete_reaction(emoji: str) -> bool:
return not emoji or emoji.strip() == REACTION_DELETE_ICON
def resolve_message_ids_for_reaction(msg_id: str) -> tuple[str, str | None]:
if ":" in msg_id:
parts = msg_id.split(":", 1)
return parts[0], parts[1]
return msg_id, None
def list_supported_reactions() -> list[str]:
return sorted(ZALO_REACTION_EMOJIS)
def list_reaction_aliases() -> dict[str, str]:
return dict(REACTION_ALIAS_MAP)