From a8191616a3c100f5c73c3a122a0390d0d277a9c6 Mon Sep 17 00:00:00 2001 From: max Date: Fri, 5 Jul 2024 16:59:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E7=A7=81=E8=81=8A=E3=80=81=E5=85=AC?= =?UTF-8?q?=E8=81=8A=E3=80=81=E6=88=BF=E9=97=B4=E3=80=81=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=9E=83=E5=9C=BE=E5=AD=97=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chwl/app/ui/im/MessageListPanelEx.java | 17 ++++---- .../app/ui/im/chat/MsgViewHolderChatHint.java | 39 +------------------ .../app/ui/im/fragment/MessageFragment.java | 1 - .../PublicChatRoomMessageListPanel.java | 13 +++++-- .../chwl/core/manager/IMMessageManager.java | 8 +++- .../chwl/core/manager/IMNetEaseManager.java | 15 +++---- core/src/main/res/values-ar/strings.xml | 2 +- core/src/main/res/values/strings.xml | 2 +- .../chatroom/module/ChatRoomMsgListPanel.java | 4 ++ .../module/list/MessageListPanelEx.java | 4 ++ .../nim/uikit/common/util/AntiSpamUtil.java | 25 +++++++++++- 11 files changed, 64 insertions(+), 66 deletions(-) diff --git a/app/src/main/java/com/chwl/app/ui/im/MessageListPanelEx.java b/app/src/main/java/com/chwl/app/ui/im/MessageListPanelEx.java index bfe273d76..566631e08 100644 --- a/app/src/main/java/com/chwl/app/ui/im/MessageListPanelEx.java +++ b/app/src/main/java/com/chwl/app/ui/im/MessageListPanelEx.java @@ -41,6 +41,7 @@ import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseFetchLoadAdapter import com.netease.nim.uikit.common.ui.recyclerview.adapter.IRecyclerView; import com.netease.nim.uikit.common.ui.recyclerview.listener.OnItemClickListener; import com.netease.nim.uikit.common.ui.recyclerview.loadmore.MsgListFetchLoadMoreView; +import com.netease.nim.uikit.common.util.AntiSpamUtil; import com.netease.nim.uikit.common.util.media.BitmapDecoder; import com.netease.nim.uikit.common.util.sys.ClipboardUtil; import com.netease.nim.uikit.common.util.sys.NetworkUtil; @@ -449,19 +450,12 @@ public class MessageListPanelEx { int index = getItemIndex(message.getUuid()); if (index >= 0 && index < items.size()) { IMMessage item = items.get(index); - String antiSpamRes = message.getYidunAntiSpamRes(); - if (!TextUtils.isEmpty(antiSpamRes)) { - JSONObject jsonObject = JSON.parseObject(antiSpamRes); - if (jsonObject.getIntValue("suggestion") == 2) { - item.setStatus(MsgStatusEnum.fail); - NIMClient.getService(MsgService.class).updateIMMessageStatus(item); - } else { - item.setStatus(message.getStatus()); - } + if (AntiSpamUtil.isAntiSpam(message)) { + item.setStatus(MsgStatusEnum.fail); + NIMClient.getService(MsgService.class).updateIMMessageStatus(item); } else { item.setStatus(message.getStatus()); } - item.setAttachStatus(message.getAttachStatus()); // 处理语音、音视频通话 @@ -1052,6 +1046,9 @@ public class MessageListPanelEx { if (message.getDirect() == MsgDirectionEnum.Out) { // 发出的消息,如果是发送失败,直接重发,否则有可能是漫游到的多媒体消息,但文件下载 if (message.getStatus() == MsgStatusEnum.fail) { + if (AntiSpamUtil.isAntiSpam(message)) { + return; + } resendMessage(message); // 重发 } else { if (message.getAttachment() instanceof FileAttachment) { diff --git a/app/src/main/java/com/chwl/app/ui/im/chat/MsgViewHolderChatHint.java b/app/src/main/java/com/chwl/app/ui/im/chat/MsgViewHolderChatHint.java index 13fc1938e..6fdffe389 100644 --- a/app/src/main/java/com/chwl/app/ui/im/chat/MsgViewHolderChatHint.java +++ b/app/src/main/java/com/chwl/app/ui/im/chat/MsgViewHolderChatHint.java @@ -1,24 +1,10 @@ package com.chwl.app.ui.im.chat; -import android.graphics.Color; -import android.text.SpannableString; -import android.text.Spanned; -import android.text.TextUtils; -import android.text.method.LinkMovementMethod; -import android.text.style.ForegroundColorSpan; -import android.view.View; import android.widget.TextView; - -import androidx.annotation.NonNull; - import com.netease.nim.uikit.business.session.viewholder.MsgViewHolderBase; import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter; import com.chwl.app.R; -import com.chwl.app.common.widget.OriginalDrawStatusClickSpan; -import com.chwl.app.ui.webview.SimpleWebViewActivity; -import com.chwl.core.UriProvider; import com.chwl.core.im.custom.bean.ChatHintAttachment; -import com.chwl.library.utils.ResUtil; public class MsgViewHolderChatHint extends MsgViewHolderBase { @@ -58,30 +44,7 @@ public class MsgViewHolderChatHint extends MsgViewHolderBase { ChatHintAttachment attachment = (ChatHintAttachment) message.getAttachment(); if (attachment != null) { String content = attachment.getContent(); - String restoreTitle = ResUtil.getString(R.string.im_chat_msgviewholderchathint_01); - if (TextUtils.isEmpty(content) || !content.contains(restoreTitle)) { - tvContent.setText(content); - } else { - SpannableString ss = new SpannableString(content); - int restoreTitleIndex = content.indexOf(restoreTitle); - ss.setSpan( - new ForegroundColorSpan(Color.parseColor("#FB486A")), - restoreTitleIndex, - restoreTitleIndex + restoreTitle.length(), - Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - ss.setSpan( - new OriginalDrawStatusClickSpan() { - @Override - public void onClick(@NonNull View widget) { - SimpleWebViewActivity.start(context, UriProvider.getLiveAgreement()); - } - }, - restoreTitleIndex, - restoreTitleIndex + restoreTitle.length(), - Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - tvContent.setText(ss); - tvContent.setMovementMethod(new LinkMovementMethod()); - } + tvContent.setText(content); } } diff --git a/app/src/main/java/com/chwl/app/ui/im/fragment/MessageFragment.java b/app/src/main/java/com/chwl/app/ui/im/fragment/MessageFragment.java index 8a62b3a82..13c125b06 100644 --- a/app/src/main/java/com/chwl/app/ui/im/fragment/MessageFragment.java +++ b/app/src/main/java/com/chwl/app/ui/im/fragment/MessageFragment.java @@ -29,7 +29,6 @@ import com.netease.nim.uikit.business.session.constant.Extras; import com.netease.nim.uikit.business.session.module.Container; import com.netease.nim.uikit.business.session.module.ModuleProxy; import com.netease.nim.uikit.business.session.module.input.InputPanel; -import com.netease.nim.uikit.business.session.module.input.NimAudioChatEvent; import com.netease.nim.uikit.business.session.module.input.NimImageActionEvent; import com.netease.nim.uikit.common.fragment.TFragment; import com.netease.nim.uikit.impl.NimUIKitImpl; diff --git a/app/src/module_public_chat/java/com/chwl/app/public_chat/ui/message/PublicChatRoomMessageListPanel.java b/app/src/module_public_chat/java/com/chwl/app/public_chat/ui/message/PublicChatRoomMessageListPanel.java index 668f014e1..9e49a0f4a 100644 --- a/app/src/module_public_chat/java/com/chwl/app/public_chat/ui/message/PublicChatRoomMessageListPanel.java +++ b/app/src/module_public_chat/java/com/chwl/app/public_chat/ui/message/PublicChatRoomMessageListPanel.java @@ -5,12 +5,10 @@ import android.content.Intent; import android.net.Uri; import android.os.Handler; import android.text.TextUtils; -import android.util.Log; import android.view.View; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; - import com.chwl.app.R; import com.chwl.app.public_chat.core.ChatRoomClientManager; import com.chwl.app.public_chat.core.ChatRoomMessageAdapter; @@ -34,6 +32,7 @@ import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseFetchLoadAdapter import com.netease.nim.uikit.common.ui.recyclerview.adapter.IRecyclerView; import com.netease.nim.uikit.common.ui.recyclerview.listener.OnItemClickListener; import com.netease.nim.uikit.common.ui.recyclerview.loadmore.MsgListFetchLoadMoreView; +import com.netease.nim.uikit.common.util.AntiSpamUtil; import com.netease.nim.uikit.common.util.sys.ClipboardUtil; import com.netease.nim.uikit.impl.NimUIKitImpl; import com.netease.nimlib.sdk.NIMClient; @@ -335,7 +334,12 @@ public class PublicChatRoomMessageListPanel { int index = getItemIndex(message.getUuid()); if (index >= 0 && index < items.size()) { ChatRoomMessage item = items.get(index); - item.setStatus(message.getStatus()); + if (AntiSpamUtil.isAntiSpam(message)) { + item.setStatus(MsgStatusEnum.fail); + NIMClient.getService(MsgService.class).updateIMMessageStatus(item); + } else { + item.setStatus(message.getStatus()); + } item.setAttachStatus(message.getAttachStatus()); // 处理语音、音视频通话 @@ -622,6 +626,9 @@ public class PublicChatRoomMessageListPanel { if (message.getDirect() == MsgDirectionEnum.Out) { // 发出的消息,如果是发送失败,直接重发,否则有可能是漫游到的多媒体消息,但文件下载 if (message.getStatus() == MsgStatusEnum.fail) { + if (AntiSpamUtil.isAntiSpam(message)) { + return; + } resendMessage(message); // 重发 } else { if (message.getAttachment() instanceof FileAttachment) { diff --git a/core/src/main/java/com/chwl/core/manager/IMMessageManager.java b/core/src/main/java/com/chwl/core/manager/IMMessageManager.java index 7b37b55e2..5290b339c 100644 --- a/core/src/main/java/com/chwl/core/manager/IMMessageManager.java +++ b/core/src/main/java/com/chwl/core/manager/IMMessageManager.java @@ -12,6 +12,10 @@ import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_HALL_ import android.util.Log; +import com.chwl.core.R; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; +import com.netease.nim.uikit.common.util.AntiSpamUtil; import com.netease.nimlib.sdk.InvocationFuture; import com.netease.nimlib.sdk.NIMClient; import com.netease.nimlib.sdk.Observer; @@ -85,7 +89,9 @@ public class IMMessageManager { private void registerMsgStatusObserver() { Observer msgStatusObserver = (Observer) imMessages -> { if (imMessages != null) { - + if (String.valueOf(AuthModel.get().getCurrentUid()).equals(imMessages.getFromAccount()) && AntiSpamUtil.isAntiSpam(imMessages)) { + SingleToastUtil.showToast(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_05)); + } } }; NIMClient.getService(MsgServiceObserve.class).observeMsgStatus( diff --git a/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java b/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java index 267b968a9..488ffdd46 100644 --- a/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java +++ b/core/src/main/java/com/chwl/core/manager/IMNetEaseManager.java @@ -488,14 +488,9 @@ public final class IMNetEaseManager { private void registerMsgStatusObserver() { Observer msgStatusObserver = (Observer) message -> { if (message != null) { - String antiSpamRes = message.getYidunAntiSpamRes(); - if (!TextUtils.isEmpty(antiSpamRes) && String.valueOf(AuthModel.get().getCurrentUid()).equals(message.getFromAccount())) { - JSONObject jsonObject = JSON.parseObject(antiSpamRes); - if (jsonObject.getIntValue("suggestion") == 2) { - SingleToastUtil.showToast(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_05)); - } + if (String.valueOf(AuthModel.get().getCurrentUid()).equals(message.getFromAccount()) && AntiSpamUtil.isAntiSpam(message)) { + SingleToastUtil.showToast(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_05)); } - } }; NIMClient.getService(ChatRoomServiceObserver.class).observeMsgStatus( @@ -2119,9 +2114,9 @@ public final class IMNetEaseManager { chatRoomMessage.setLocalExtension(atProxy.getAtExtensionMap()); atProxy.reset(); } - NIMAntiSpamOption antiSpamOption = new NIMAntiSpamOption(); - antiSpamOption.antiSpamConfigId = XConstants.CHAT_ROOM_ANTI_SPAM_CONFIG_ID; - chatRoomMessage.setNIMAntiSpamOption(antiSpamOption); +// NIMAntiSpamOption antiSpamOption = new NIMAntiSpamOption(); +// antiSpamOption.antiSpamConfigId = XConstants.CHAT_ROOM_ANTI_SPAM_CONFIG_ID; +// chatRoomMessage.setNIMAntiSpamOption(antiSpamOption); if (AntiSpamUtil.checkLocalAntiSpam(chatRoomMessage)) { EventBus.getDefault().post(new AntiSpamEvent()); return Single.error(new AntiSpamHitException("檢測到敏感詞,需要過濾,不能發送")); diff --git a/core/src/main/res/values-ar/strings.xml b/core/src/main/res/values-ar/strings.xml index aa0ee4c8a..14f1e4583 100644 --- a/core/src/main/res/values-ar/strings.xml +++ b/core/src/main/res/values-ar/strings.xml @@ -73,7 +73,7 @@ حقل معلومات المستخدم فارغ غير موجود في الغرفة أو معلومات الغرفة فارغة تم استقبال معلومات الطرد - قد تحتوي الرسالة على محتوى ممنوع، يرجى التوقف عن إرسال رسائل مماثلة! + قد تحتوي الرسالة على معلومات غير قانونية، يرجى التوقف عن إرسال معلومات مماثلة مثل ذلك! جاري الاتصال... حالة غير طبيعية في غرفة الدردشة! حالة الاتصال بغرفة الدردشة تصبح غير متصلة! diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 251e7887a..53dce5c17 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -71,7 +71,7 @@ User information field is empty Not in the room or room information is empty Received kick-out information - The message may contain prohibited content, please stop sending similar messages! + The message may contain illegal information, please stop sending similar information like that! Connecting... Chat room status abnormal! Chat room online status becomes UNLOGIN! diff --git a/nim_uikit/src/com/netease/nim/uikit/business/chatroom/module/ChatRoomMsgListPanel.java b/nim_uikit/src/com/netease/nim/uikit/business/chatroom/module/ChatRoomMsgListPanel.java index f7263717d..da6799eca 100644 --- a/nim_uikit/src/com/netease/nim/uikit/business/chatroom/module/ChatRoomMsgListPanel.java +++ b/nim_uikit/src/com/netease/nim/uikit/business/chatroom/module/ChatRoomMsgListPanel.java @@ -25,6 +25,7 @@ import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseFetchLoadAdapter import com.netease.nim.uikit.common.ui.recyclerview.adapter.IRecyclerView; import com.netease.nim.uikit.common.ui.recyclerview.listener.OnItemClickListener; import com.netease.nim.uikit.common.ui.recyclerview.loadmore.MsgListFetchLoadMoreView; +import com.netease.nim.uikit.common.util.AntiSpamUtil; import com.netease.nimlib.sdk.NIMClient; import com.netease.nimlib.sdk.Observer; import com.netease.nimlib.sdk.RequestCallback; @@ -408,6 +409,9 @@ public class ChatRoomMsgListPanel { if (message.getDirect() == MsgDirectionEnum.Out) { // 发出的消息,如果是发送失败,直接重发,否则有可能是漫游到的多媒体消息,但文件下载 if (message.getStatus() == MsgStatusEnum.fail) { + if (AntiSpamUtil.isAntiSpam(message)) { + return; + } resendMessage(message); // 重发 } else { if (message.getAttachment() instanceof FileAttachment) { diff --git a/nim_uikit/src/com/netease/nim/uikit/business/session/module/list/MessageListPanelEx.java b/nim_uikit/src/com/netease/nim/uikit/business/session/module/list/MessageListPanelEx.java index d3e654069..daee85e56 100644 --- a/nim_uikit/src/com/netease/nim/uikit/business/session/module/list/MessageListPanelEx.java +++ b/nim_uikit/src/com/netease/nim/uikit/business/session/module/list/MessageListPanelEx.java @@ -33,6 +33,7 @@ import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseFetchLoadAdapter import com.netease.nim.uikit.common.ui.recyclerview.adapter.IRecyclerView; import com.netease.nim.uikit.common.ui.recyclerview.listener.OnItemClickListener; import com.netease.nim.uikit.common.ui.recyclerview.loadmore.MsgListFetchLoadMoreView; +import com.netease.nim.uikit.common.util.AntiSpamUtil; import com.netease.nim.uikit.common.util.media.BitmapDecoder; import com.netease.nim.uikit.common.util.sys.ClipboardUtil; import com.netease.nim.uikit.common.util.sys.NetworkUtil; @@ -723,6 +724,9 @@ public class MessageListPanelEx { if (message.getDirect() == MsgDirectionEnum.Out) { // 发出的消息,如果是发送失败,直接重发,否则有可能是漫游到的多媒体消息,但文件下载 if (message.getStatus() == MsgStatusEnum.fail) { + if (AntiSpamUtil.isAntiSpam(message)) { + return; + } resendMessage(message); // 重发 } else { if (message.getAttachment() instanceof FileAttachment) { diff --git a/nim_uikit/src/com/netease/nim/uikit/common/util/AntiSpamUtil.java b/nim_uikit/src/com/netease/nim/uikit/common/util/AntiSpamUtil.java index 363486ee2..9bfc3d403 100644 --- a/nim_uikit/src/com/netease/nim/uikit/common/util/AntiSpamUtil.java +++ b/nim_uikit/src/com/netease/nim/uikit/common/util/AntiSpamUtil.java @@ -1,12 +1,35 @@ package com.netease.nim.uikit.common.util; +import android.text.TextUtils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.netease.nimlib.sdk.NIMClient; import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.constant.MsgStatusEnum; import com.netease.nimlib.sdk.msg.model.IMMessage; import com.netease.nimlib.sdk.msg.model.LocalAntiSpamResult; public class AntiSpamUtil { + public static boolean isAntiSpam(IMMessage message) { + try { + if (message == null) { + return false; + } + String antiSpamRes = message.getYidunAntiSpamRes(); + if (!TextUtils.isEmpty(antiSpamRes)) { + JSONObject jsonObject = JSON.parseObject(antiSpamRes); + if (jsonObject.getIntValue("suggestion") == 2) { + return true; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + /** * 云信检验本地反垃圾词库 * @@ -17,7 +40,7 @@ public class AntiSpamUtil { String text = message.getContent(); LocalAntiSpamResult result = NIMClient.getService(MsgService.class) .checkLocalAntiSpam(text, "***"); - message.setContent(result.getContent()==null?"":result.getContent()); + message.setContent(result.getContent() == null ? "" : result.getContent()); if (result.getOperator() != 0) { //Map map = message.getRemoteExtension();