package com.tailbet.common.constant; import com.tailbet.common.enums.PlatformEnum; /** * OpenIM 协议相关常量 *

* 统一管理 Webhook 回调命令、请求字段、响应字段、消息类型等协议魔法值, * 避免散落在 Controller / Service 中。 *

* * @author socialapp团队 * @since 1.0.7 */ public final class OpenImConstants { private OpenImConstants() { } // ==================== Webhook 回调命令 ==================== /** 单聊消息发送后回调 */ public static final String CALLBACK_AFTER_SEND_SINGLE_MSG = "callbackAfterSendSingleMsgCommand"; /** 群聊消息发送后回调 */ public static final String CALLBACK_AFTER_SEND_GROUP_MSG = "callbackAfterSendGroupMsgCommand"; /** 成员进群后回调 */ public static final String CALLBACK_AFTER_MEMBER_ENTER_GROUP = "callbackAfterMemberEnterGroupCommand"; /** 成员退群后回调 */ public static final String CALLBACK_AFTER_MEMBER_QUIT_GROUP = "callbackAfterMemberQuitGroupCommand"; /** 用户上线回调 */ public static final String CALLBACK_AFTER_USER_ONLINE = "callbackAfterUserOnlineCommand"; /** 用户下线回调 */ public static final String CALLBACK_AFTER_USER_OFFLINE = "callbackAfterUserOfflineCommand"; // ==================== 请求头 / JSON 字段名 ==================== /** OpenIM Webhook 鉴权请求头名 */ public static final String HEADER_TOKEN = "token"; /** 发送方用户 ID */ public static final String FIELD_SEND_ID = "sendID"; /** 接收方用户 ID */ public static final String FIELD_RECV_ID = "recvID"; /** 群组 ID(OpenIM 群 ID) */ public static final String FIELD_GROUP_ID = "groupID"; /** 用户 ID */ public static final String FIELD_USER_ID = "userID"; /** 平台 ID */ public static final String FIELD_PLATFORM_ID = "platformID"; /** 消息内容 */ public static final String FIELD_CONTENT = "content"; /** 消息内容类型 */ public static final String FIELD_CONTENT_TYPE = "contentType"; /** 客户端消息 ID */ public static final String FIELD_CLIENT_MSG_ID = "clientMsgID"; /** 服务端消息 ID */ public static final String FIELD_SERVER_MSG_ID = "serverMsgID"; // ==================== Webhook 成功响应 ==================== /** 响应字段:动作码 */ public static final String RESP_ACTION_CODE = "actionCode"; /** 响应字段:错误码 */ public static final String RESP_ERR_CODE = "errCode"; /** 响应字段:错误信息 */ public static final String RESP_ERR_MSG = "errMsg"; /** 响应字段:错误详情 */ public static final String RESP_ERR_DLT = "errDlt"; /** 响应字段:下一动作码 */ public static final String RESP_NEXT_CODE = "nextCode"; /** OpenIM 成功码(actionCode / errCode / nextCode) */ public static final int RESP_CODE_SUCCESS = 0; /** OpenIM 成功响应空字符串字段值 */ public static final String RESP_EMPTY_MSG = ""; // ==================== Token / 鉴权错误码(OpenIM 官方) ==================== /** Token 过期 */ public static final int ERR_TOKEN_EXPIRED = 1501; /** Token 无效 */ public static final int ERR_TOKEN_INVALID = 1502; /** Token 格式错误 */ public static final int ERR_TOKEN_MALFORMED = 1503; /** Token 不存在 */ public static final int ERR_TOKEN_NOT_EXIST = 1504; /** Token 平台不一致 */ public static final int ERR_TOKEN_DIFFERENT_PLATFORM = 1505; /** Token 被踢(多端/多实例刷新 adminToken、重复 get_user_token 等) */ public static final int ERR_TOKEN_KICKED = 1506; /** Token 尚未生效 */ public static final int ERR_TOKEN_NOT_VALID_YET = 1507; /** * 服务端代操作使用的平台 ID(Web)。 * 与 App 端 iOS/Android 平台隔离,避免顶掉用户已登录 session。 */ public static final int PLATFORM_ID_SERVER_WEB = PlatformEnum.WEB.getCode(); /** App 端 iOS 平台 ID */ public static final int PLATFORM_ID_IOS = PlatformEnum.IOS.getCode(); /** App 端 Android 平台 ID */ public static final int PLATFORM_ID_ANDROID = PlatformEnum.ANDROID.getCode(); // ==================== 会话摘要 / 未读 ==================== /** 会话 lastMessage 摘要最大长度 */ public static final int CONVERSATION_CONTENT_MAX_LEN = 100; /** 未读数自增 SQL 片段 */ public static final String SQL_UNREAD_COUNT_INCREMENT = "unread_count = unread_count + 1"; /** 新建会话初始未读数(接收方) */ public static final int UNREAD_COUNT_INITIAL_RECEIVER = 1; /** 新建会话初始未读数(发送方) */ public static final int UNREAD_COUNT_INITIAL_SENDER = 0; // ==================== OpenIM contentType ==================== /** 文本 */ public static final int CONTENT_TYPE_TEXT = 101; /** 图片 */ public static final int CONTENT_TYPE_IMAGE = 102; /** 语音 */ public static final int CONTENT_TYPE_VOICE = 103; /** 视频 */ public static final int CONTENT_TYPE_VIDEO = 104; /** 文件 */ public static final int CONTENT_TYPE_FILE = 105; /** 位置 */ public static final int CONTENT_TYPE_LOCATION = 106; /** 名片 */ public static final int CONTENT_TYPE_CARD = 114; /** 自定义消息 */ public static final int CONTENT_TYPE_CUSTOM = 110; // ==================== OpenIM sessionType ==================== /** 单聊 */ public static final int SESSION_TYPE_SINGLE = 1; /** 群聊 */ public static final int SESSION_TYPE_GROUP = 3; // ==================== 离线推送 extras / 文案 ==================== /** 推送业务类型:IM 离线消息 */ public static final String PUSH_BIZ_TYPE_IM_MESSAGE = "IM_MESSAGE"; /** 推送标题 */ public static final String PUSH_TITLE_NEW_MESSAGE = "您有新消息"; /** 发送方昵称兜底 */ public static final String PUSH_DEFAULT_SENDER_NAME = "用户"; /** 系统/管理员代发时的发送方昵称兜底(如 OpenIM imAdmin) */ public static final String PUSH_DEFAULT_SYSTEM_SENDER_NAME = "系统"; /** 群名称兜底 */ public static final String PUSH_DEFAULT_GROUP_NAME = "群聊"; /** extras:会话 ID */ public static final String EXTRAS_CONVERSATION_ID = "conversationId"; /** extras:发送方 ID */ public static final String EXTRAS_SENDER_ID = "senderId"; /** extras:消息类型 */ public static final String EXTRAS_MESSAGE_TYPE = "messageType"; /** extras:会话类型 */ public static final String EXTRAS_SESSION_TYPE = "sessionType"; /** extras:本地群组 ID */ public static final String EXTRAS_GROUP_ID = "groupId"; /** 单聊 conversationId 前缀 */ public static final String CONVERSATION_ID_SINGLE_PREFIX = "si_"; /** 群聊 conversationId 前缀(业务推送 extras 约定,非 OpenIM 原生 ID) */ public static final String CONVERSATION_ID_GROUP_PREFIX = "group:"; /** * OpenIM 原生群聊 conversationID 前缀(sessionType=3 ReadGroupChat) * 形如 {@code sg_{openimGroupId}} */ public static final String OPENIM_NATIVE_GROUP_CONVERSATION_PREFIX = "sg_"; /** 单聊 conversationId 分隔符 */ public static final String CONVERSATION_ID_SEPARATOR = "_"; /** 推送正文最大长度(对齐 PushSendReq) */ public static final int PUSH_CONTENT_MAX_LEN = 200; /** 推送 bizId 最大长度(对齐 PushSendReq) */ public static final int PUSH_BIZ_ID_MAX_LEN = 64; /** 推送摘要最大长度 */ public static final int PUSH_SUMMARY_MAX_LEN = 50; /** 单次 Feign 推送批量用户数 */ public static final int PUSH_BATCH_SIZE = 500; /** 离线推送幂等 TTL(分钟) */ public static final long PUSH_DEDUP_TTL_MINUTES = 10L; /** Redis 幂等占位值 */ public static final String PUSH_DEDUP_PLACEHOLDER = "1"; /** 推送正文:昵称与摘要分隔符 */ public static final String PUSH_BODY_NAME_CONTENT_SEPARATOR = ":"; /** 推送正文:群名与发送者分隔符 */ public static final String PUSH_BODY_GROUP_SEPARATOR = " | "; /** 摘要:图片 */ public static final String SUMMARY_IMAGE = "[图片]"; /** 摘要:语音 */ public static final String SUMMARY_VOICE = "[语音]"; /** 摘要:视频 */ public static final String SUMMARY_VIDEO = "[视频]"; /** 摘要:文件 */ public static final String SUMMARY_FILE = "[文件]"; /** 摘要:位置 */ public static final String SUMMARY_LOCATION = "[位置]"; /** 摘要:名片 */ public static final String SUMMARY_CARD = "[名片]"; /** 摘要:其他消息 */ public static final String SUMMARY_DEFAULT = "[消息]"; /** JSON 对象起始字符(用于判断 content 是否为 JSON 字符串) */ public static final char JSON_OBJECT_START = '{'; /** 自定义消息 content.data / extension 字段 */ public static final String FIELD_DATA = "data"; /** 自定义消息 extension 字段 */ public static final String FIELD_EXTENSION = "extension"; /** 业务自定义类型字段 */ public static final String FIELD_CUSTOM_TYPE = "customType"; /** * 红包领取提醒:仅聊天内系统记录,禁止离线推送 / 系统通知 */ public static final String CUSTOM_TYPE_RED_ENVELOPE_CLAIM_NOTICE = "red_envelope_claim_notice"; }