Browse Source

feat(chat): 添加敏感词错误提示功能

- 添加敏感词错误提示状态管理集合
- 实现敏感词错误消息ID的添加和检查方法
- 在消息加载时从attributes恢复敏感词错误状态
- 在聊天页面显示敏感词错误提示信息
- 在IM管理器中处理敏感词错误码E0001
- 防止敏感词错误消息显示重发按钮
- 在直播房间中处理玫瑰不足时的充值提示
master
Jolie 3 months ago
parent
commit
268e32bf02
5 changed files with 151 additions and 7 deletions
  1. 49
      lib/controller/message/chat_controller.dart
  2. 36
      lib/im/im_manager.dart
  3. 26
      lib/pages/message/chat_page.dart
  4. 33
      lib/widget/live/live_room_notice_chat_panel.dart
  5. 14
      lib/widget/message/text_item.dart

49
lib/controller/message/chat_controller.dart

@ -45,6 +45,9 @@ class ChatController extends GetxController {
// 508ID集合
final Set<String> _roseErrorMessageIds = <String>{};
// ID集合
final Set<String> _sensitiveWordMessageIds = <String>{};
//
final NetworkService _networkService = NetworkService();
@ -58,6 +61,17 @@ class ChatController extends GetxController {
_roseErrorMessageIds.add(messageId);
update();
}
///
bool shouldShowSensitiveWordError(String messageId) {
return _sensitiveWordMessageIds.contains(messageId);
}
/// ID
void addSensitiveWordMessageId(String messageId) {
_sensitiveWordMessageIds.add(messageId);
update();
}
ChatController({
required this.userId,
@ -753,6 +767,22 @@ class ChatController extends GetxController {
.toList();
if (newMessages.isNotEmpty) {
// attributes
for (var msg in newMessages) {
if (msg.status == MessageStatus.FAIL && msg.direction == MessageDirection.SEND) {
try {
final errorCode = msg.attributes?['errorCode'] as String?;
if (errorCode == 'E0002') {
_roseErrorMessageIds.add(msg.msgId);
} else if (errorCode == 'E0001') {
_sensitiveWordMessageIds.add(msg.msgId);
}
} catch (e) {
//
}
}
}
messages.insertAll(0, newMessages);
// ID
_cursor = newMessages.first.msgId;
@ -769,8 +799,9 @@ class ChatController extends GetxController {
} else {
//
// msgId更大的
//
// attributes
_roseErrorMessageIds.clear();
_sensitiveWordMessageIds.clear();
final Map<String, EMMessage> contentToMessage = {};
@ -802,6 +833,22 @@ class ChatController extends GetxController {
//
deduplicatedMessages.sort((a, b) => a.serverTime.compareTo(b.serverTime));
// attributes
for (var msg in deduplicatedMessages) {
if (msg.status == MessageStatus.FAIL && msg.direction == MessageDirection.SEND) {
try {
final errorCode = msg.attributes?['errorCode'] as String?;
if (errorCode == 'E0002') {
_roseErrorMessageIds.add(msg.msgId);
} else if (errorCode == 'E0001') {
_sensitiveWordMessageIds.add(msg.msgId);
}
} catch (e) {
//
}
}
}
messages.assignAll(deduplicatedMessages);
// ID
if (deduplicatedMessages.isNotEmpty) {

36
lib/im/im_manager.dart

@ -286,7 +286,7 @@ class IMManager {
// 508
try {
final errorCode = err.code;
final errorCode = err.description;
// ChatController
final targetId = message.to;
@ -299,11 +299,23 @@ class IMManager {
//
controller.messages[index] = message;
// 508attributes
if (errorCode == 508) {
// attributes
message.attributes ??= {};
message.attributes!['errorCode'] = errorCode;
// 508
if (errorCode == 'E0002') {
controller.addRoseErrorMessageId(message.msgId);
if (Get.isLogEnable) {
Get.log('⚠️ [IMManager] 检测到错误码508(玫瑰不足),已添加到临时错误提示集合: msgId=${message.msgId}');
Get.log('⚠️ [IMManager] 检测到错误码E0002(玫瑰不足),已添加到临时错误提示集合: msgId=${message.msgId}');
}
}
// E0001错误
if (errorCode == 'E0001') {
controller.addSensitiveWordMessageId(message.msgId);
if (Get.isLogEnable) {
Get.log('⚠️ [IMManager] 检测到错误码E0001(敏感词拦截),已添加到临时错误提示集合: msgId=${message.msgId}');
}
}
@ -338,11 +350,23 @@ class IMManager {
final matchedMessage = controller.messages[contentIndex];
controller.messages[contentIndex] = message;
// attributes
message.attributes ??= {};
message.attributes!['errorCode'] = errorCode.toString();
// 508使ID
if (errorCode == 508) {
if (errorCode == 508 || errorCode == 'E0002') {
controller.addRoseErrorMessageId(matchedMessage.msgId);
if (Get.isLogEnable) {
Get.log('⚠️ [IMManager] 检测到错误码508(玫瑰不足),已通过内容匹配添加到临时错误提示集合: msgId=${matchedMessage.msgId}');
Get.log('⚠️ [IMManager] 检测到错误码508/E0002(玫瑰不足),已通过内容匹配添加到临时错误提示集合: msgId=${matchedMessage.msgId}');
}
}
// E0001错误
if (errorCode == 'E0001') {
controller.addSensitiveWordMessageId(matchedMessage.msgId);
if (Get.isLogEnable) {
Get.log('⚠️ [IMManager] 检测到错误码E0001(敏感词拦截),已通过内容匹配添加到临时错误提示集合: msgId=${matchedMessage.msgId}');
}
}

26
lib/pages/message/chat_page.dart

@ -252,6 +252,11 @@ class _ChatPageState extends State<ChatPage> {
message.status == MessageStatus.FAIL &&
controller.shouldShowRoseError(message.msgId);
// 使
final showSensitiveWordError = isSentByMe &&
message.status == MessageStatus.FAIL &&
controller.shouldShowSensitiveWordError(message.msgId);
// 🚀 key
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
@ -265,6 +270,8 @@ class _ChatPageState extends State<ChatPage> {
),
// 508
if (showRoseError) _buildRoseErrorHint(context),
// E0001
if (showSensitiveWordError) _buildSensitiveWordErrorHint(context),
],
);
},
@ -647,4 +654,23 @@ class _ChatPageState extends State<ChatPage> {
),
);
}
//
Widget _buildSensitiveWordErrorHint(BuildContext context) {
return Container(
margin: EdgeInsets.only(top: 8.h, bottom: 8.h),
padding: EdgeInsets.symmetric(horizontal: 16.w),
width: double.infinity,
child: Center(
child: Text(
'聊天内容包含敏感词',
style: TextStyle(
fontSize: 11.sp,
color: Color.fromRGBO(199, 199, 199, 1),
),
textAlign: TextAlign.center,
),
),
);
}
}

33
lib/widget/live/live_room_notice_chat_panel.dart

@ -3,8 +3,10 @@ import 'package:dating_touchme_app/controller/global.dart';
import 'package:dating_touchme_app/extension/ex_widget.dart';
import 'package:dating_touchme_app/generated/assets.dart';
import 'package:dating_touchme_app/widget/live/live_room_chat_item.dart';
import 'package:dating_touchme_app/widget/live/live_recharge_popup.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
class LiveRoomNoticeChatPanel extends StatefulWidget {
@ -51,6 +53,18 @@ class _LiveRoomNoticeChatPanelState extends State<LiveRoomNoticeChatPanel> {
final linkMicCard = controller.linkMicCard.value;
final cardNum = linkMicCard?.num ?? 0;
// cardNum 0"上麦20玫瑰"
if (cardNum == 0) {
return Text(
'上麦20玫瑰',
style: TextStyle(
fontSize: 9.w,
color: Colors.white.withOpacity(0.8),
),
);
}
//
return Text(
'剩余$cardNum张相亲卡',
style: TextStyle(
@ -148,6 +162,25 @@ class _LiveRoomNoticeChatPanelState extends State<LiveRoomNoticeChatPanel> {
],
),
).onTap(() async{
//
if (!controller.isLive.value) {
final userData = GlobalData().userData;
final isMale = userData?.genderCode == 0;
if (isMale) {
final linkMicCard = controller.linkMicCard.value;
final cardNum = linkMicCard?.num ?? 0;
// "上麦20玫瑰"20
if (cardNum == 0 && controller.roseCount.value < 20) {
SmartDialog.show(
alignment: Alignment.bottomCenter,
maskColor: Colors.black.withOpacity(0.5),
builder: (_) => const LiveRechargePopup(),
);
return;
}
}
}
if(controller.isLive.value){
await controller.leaveChat();
}else{

14
lib/widget/message/text_item.dart

@ -261,6 +261,20 @@ class TextItem extends StatelessWidget {
return SizedBox.shrink();
}
//
bool isSensitiveWordMessage = false;
try {
final chatController = Get.find<ChatController>();
isSensitiveWordMessage = chatController.shouldShowSensitiveWordError(message.msgId);
} catch (e) {
// ChatController
}
//
if (isSensitiveWordMessage) {
return SizedBox.shrink();
}
//
final status = message.status;

Loading…
Cancel
Save