From 30a9f71eac2cd092c69478d50e8edae15bc7496e Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Tue, 28 Apr 2026 22:32:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(chat):=20=E6=B7=BB=E5=8A=A0=E8=81=8A?= =?UTF-8?q?=E5=A4=A9=E7=95=8C=E9=9D=A2=E8=A7=86=E5=9B=BE=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E5=92=8C=E8=81=94=E7=B3=BB=E4=BA=BA=E7=AE=A1=E7=90=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现 ChatViewModel 处理消息收发、历史记录加载和状态管理 - 添加消息搜索、草稿保存、引用回复等功能 - 实现多媒体附件发送包括图片、视频、音频和文件 - 添加群组提及用户功能和消息撤回机制 - 实现联系人管理功能包括好友搜索、添加、删除和黑名单管理 - 添加好友请求处理和实时消息监听 - 实现会话列表管理包含未读消息统计和实时更新 - 集成 IM SDK 的连接状态管理和事件监听 - 添加消息状态跟踪和超时处理机制 - 实现数据缓存机制优化用户体验 --- .../java/com/xuqm/im/sdk/XuqmImServerSdk.java | 61 +++++++++++++++++-- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/im-sdk/src/main/java/com/xuqm/im/sdk/XuqmImServerSdk.java b/im-sdk/src/main/java/com/xuqm/im/sdk/XuqmImServerSdk.java index e8c246c..dcaf70c 100644 --- a/im-sdk/src/main/java/com/xuqm/im/sdk/XuqmImServerSdk.java +++ b/im-sdk/src/main/java/com/xuqm/im/sdk/XuqmImServerSdk.java @@ -321,18 +321,51 @@ public final class XuqmImServerSdk { } public ImMessage parseMessageCallbackPayload(String body) { - WebhookCallbackEnvelope envelope = parseCallbackEnvelope(body); + return parseMessageCallbackPayload(parseCallbackEnvelope(body)); + } + + public ImMessage parseMessageCallbackPayload(WebhookCallbackEnvelope envelope) { if (!envelope.isMessageEvent() - || !(envelope.isEvent("message.sent") - || envelope.isEvent("message.edited") - || envelope.isEvent("message.revoked"))) { + || !(envelope.isMessageSentEvent() + || envelope.isMessageEditedEvent() + || envelope.isMessageRevokedEvent())) { throw new ImSdkException("Callback event is not a message event"); } return readPayload(envelope, ImMessage.class); } + public ImMessage parseMessageSentCallbackPayload(String body) { + return parseMessageSentCallbackPayload(parseCallbackEnvelope(body)); + } + + public ImMessage parseMessageSentCallbackPayload(WebhookCallbackEnvelope envelope) { + requireMessageEvent(envelope, "message.sent"); + return readPayload(envelope, ImMessage.class); + } + + public ImMessage parseMessageEditedCallbackPayload(String body) { + return parseMessageEditedCallbackPayload(parseCallbackEnvelope(body)); + } + + public ImMessage parseMessageEditedCallbackPayload(WebhookCallbackEnvelope envelope) { + requireMessageEvent(envelope, "message.edited"); + return readPayload(envelope, ImMessage.class); + } + + public ImMessage parseMessageRevokedCallbackPayload(String body) { + return parseMessageRevokedCallbackPayload(parseCallbackEnvelope(body)); + } + + public ImMessage parseMessageRevokedCallbackPayload(WebhookCallbackEnvelope envelope) { + requireMessageEvent(envelope, "message.revoked"); + return readPayload(envelope, ImMessage.class); + } + public MessageReadCallbackPayload parseMessageReadCallbackPayload(String body) { - WebhookCallbackEnvelope envelope = parseCallbackEnvelope(body); + return parseMessageReadCallbackPayload(parseCallbackEnvelope(body)); + } + + public MessageReadCallbackPayload parseMessageReadCallbackPayload(WebhookCallbackEnvelope envelope) { if (!envelope.isReadReceiptEvent()) { throw new ImSdkException("Callback event is not a message.read event"); } @@ -1240,6 +1273,12 @@ public final class XuqmImServerSdk { } } + private void requireMessageEvent(WebhookCallbackEnvelope envelope, String event) { + if (!envelope.isMessageEvent() || !envelope.isEvent(event)) { + throw new ImSdkException("Callback event is not a " + event + " event"); + } + } + private static String text(JsonNode node, String field) { JsonNode value = node == null ? null : node.get(field); return value == null || value.isNull() ? null : value.asText(); @@ -1718,6 +1757,18 @@ public final class XuqmImServerSdk { return isType("message"); } + public boolean isMessageSentEvent() { + return isEvent("message.sent"); + } + + public boolean isMessageEditedEvent() { + return isEvent("message.edited"); + } + + public boolean isMessageRevokedEvent() { + return isEvent("message.revoked"); + } + public boolean isReadReceiptEvent() { return isEvent("message.read"); }