feat:私聊、公聊、房间、支持垃圾字检测

This commit is contained in:
max
2024-07-05 16:59:34 +08:00
parent 410832690f
commit a8191616a3
11 changed files with 64 additions and 66 deletions

View File

@@ -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) {
if (AntiSpamUtil.isAntiSpam(message)) {
item.setStatus(MsgStatusEnum.fail);
NIMClient.getService(MsgService.class).updateIMMessageStatus(item);
} else {
item.setStatus(message.getStatus());
}
} 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) {

View File

@@ -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());
}
}
}

View File

@@ -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;

View File

@@ -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);
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) {

View File

@@ -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<IMMessage> msgStatusObserver = (Observer<IMMessage>) 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(

View File

@@ -488,15 +488,10 @@ public final class IMNetEaseManager {
private void registerMsgStatusObserver() {
Observer<ChatRoomMessage> msgStatusObserver = (Observer<ChatRoomMessage>) 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) {
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(
msgStatusObserver, true);
@@ -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("檢測到敏感詞,需要過濾,不能發送"));

View File

@@ -73,7 +73,7 @@
<string name="xchat_android_core_manager_imneteasemanager_02">حقل معلومات المستخدم فارغ</string>
<string name="xchat_android_core_manager_imneteasemanager_03">غير موجود في الغرفة أو معلومات الغرفة فارغة</string>
<string name="xchat_android_core_manager_imneteasemanager_04">تم استقبال معلومات الطرد</string>
<string name="xchat_android_core_manager_imneteasemanager_05">قد تحتوي الرسالة على محتوى ممنوع، يرجى التوقف عن إرسال رسائل مماثلة!</string>
<string name="xchat_android_core_manager_imneteasemanager_05">قد تحتوي الرسالة على معلومات غير قانونية، يرجى التوقف عن إرسال معلومات مماثلة مثل ذلك!</string>
<string name="xchat_android_core_manager_imneteasemanager_06">جاري الاتصال...</string>
<string name="xchat_android_core_manager_imneteasemanager_07">حالة غير طبيعية في غرفة الدردشة!</string>
<string name="xchat_android_core_manager_imneteasemanager_08">حالة الاتصال بغرفة الدردشة تصبح غير متصلة!</string>

View File

@@ -71,7 +71,7 @@
<string name="xchat_android_core_manager_imneteasemanager_02">User information field is empty</string>
<string name="xchat_android_core_manager_imneteasemanager_03">Not in the room or room information is empty</string>
<string name="xchat_android_core_manager_imneteasemanager_04">Received kick-out information</string>
<string name="xchat_android_core_manager_imneteasemanager_05">The message may contain prohibited content, please stop sending similar messages!</string>
<string name="xchat_android_core_manager_imneteasemanager_05">The message may contain illegal information, please stop sending similar information like that!</string>
<string name="xchat_android_core_manager_imneteasemanager_06">Connecting...</string>
<string name="xchat_android_core_manager_imneteasemanager_07">Chat room status abnormal!</string>
<string name="xchat_android_core_manager_imneteasemanager_08">Chat room online status becomes UNLOGIN!</string>

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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<String, Object> map = message.getRemoteExtension();