Skip to content

Commit e4b0b38

Browse files
authored
v10.9.0 (#445)
1 parent c8b40fc commit e4b0b38

53 files changed

Lines changed: 374 additions & 132 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

NEChatUIKit/NEChatUIKit/Assets/en.lproj/Localizable.strings

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,3 +331,15 @@
331331
"filter_mono" = "Mono";
332332
"filter_noir" = "Noir";
333333
"filter_tonal" = "Tonal";
334+
335+
"failed_message_reson" = "The content may involve %@. Please adjust and send.";
336+
"failed_message_reson_ornography" = "Pornography";
337+
"failed_message_reson_advertising" = "Advertising";
338+
"failed_message_reson_advertising_law" = "Advertising Law";
339+
"failed_message_reson_violence_and_terrorism" = "Violence and terrorism";
340+
"failed_message_reson_prohibited" = "Prohibited";
341+
"failed_message_reson_political_related" = "Political-related";
342+
"failed_message_reson_abuse" = "Abuse";
343+
"failed_message_reson_waterlogging" = "waterlogging";
344+
"failed_message_reson_others" = "Others";
345+
"failed_message_reson_value_related" = "value-related";

NEChatUIKit/NEChatUIKit/Assets/zh-Hans.lproj/Localizable.strings

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,3 +328,15 @@
328328
"filter_mono" = "单色";
329329
"filter_noir" = "暗黑";
330330
"filter_tonal" = "调性";
331+
332+
"failed_message_reson" = "内容可能涉及%@, 请调整后发送";
333+
"failed_message_reson_ornography" = "色情";
334+
"failed_message_reson_advertising" = "广告";
335+
"failed_message_reson_advertising_law" = "广告法";
336+
"failed_message_reson_violence_and_terrorism" = "暴恐";
337+
"failed_message_reson_prohibited" = "违禁";
338+
"failed_message_reson_political_related" = "涉政";
339+
"failed_message_reson_abuse" = "谩骂";
340+
"failed_message_reson_waterlogging" = "灌水";
341+
"failed_message_reson_others" = "其他";
342+
"failed_message_reson_value_related" = "涉价值观";

NEChatUIKit/NEChatUIKit/Classes/Chat/Controller/ChatViewController.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2284,9 +2284,8 @@ open class ChatViewController: NEChatBaseViewController, UINavigationControllerD
22842284
if let toast = defaultToast {
22852285
showToast(toast)
22862286
} else {
2287-
showToast(err.localizedDescription)
2287+
NEALog.errorLog(ModuleName + className(), desc: "\(#function) failed, error: \(err.localizedDescription)")
22882288
}
2289-
print(err.localizedDescription)
22902289
}
22912290
}
22922291
}

NEChatUIKit/NEChatUIKit/Classes/Chat/Model/MessageContentModel.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,15 @@ open class MessageContentModel: NSObject, MessageModel {
121121

122122
public required init(message: V2NIMMessage?) {
123123
self.message = message
124+
messageTextFont = UIFont.systemFont(ofSize: message?.isSelf == true ? ChatUIConfig.shared.messageProperties.selfMessageTextSize : ChatUIConfig.shared.messageProperties.receiveMessageTextSize)
125+
messageTextColor = message?.isSelf == true ? ChatUIConfig.shared.messageProperties.selfMessageTextColor : ChatUIConfig.shared.messageProperties.receiveMessageTextColor
126+
124127
if message?.conversationType == .CONVERSATION_TYPE_TEAM,
125128
let senderId = ChatMessageHelper.getSenderId(message),
126129
!IMKitClient.instance.isMe(senderId) {
127130
fullNameHeight = ChatUIConfig.shared.messageProperties.showTeamMessageNick ? 20 : 0
128131
}
132+
129133
height = contentSize.height + chat_content_margin * 2 + fullNameHeight + chat_pin_height
130-
messageTextFont = UIFont.systemFont(ofSize: message?.isSelf == true ? ChatUIConfig.shared.messageProperties.selfMessageTextSize : ChatUIConfig.shared.messageProperties.receiveMessageTextSize)
131-
messageTextColor = message?.isSelf == true ? ChatUIConfig.shared.messageProperties.selfMessageTextColor : ChatUIConfig.shared.messageProperties.receiveMessageTextColor
132134
}
133135
}

NEChatUIKit/NEChatUIKit/Classes/Chat/View/Cell/NEBaseChatMessageCell.swift

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ open class NEBaseChatMessageCell: NEChatBaseCell {
149149
timeLabel.textColor = ChatUIConfig.shared.messageProperties.timeTextColor
150150
timeLabel.textAlignment = .center
151151
timeLabel.translatesAutoresizingMaskIntoConstraints = false
152-
timeLabel.accessibilityIdentifier = "id.messageTipText"
152+
timeLabel.accessibilityIdentifier = "id.messageTimeText"
153153
timeLabel.backgroundColor = .clear
154154

155155
// avatar
@@ -492,43 +492,25 @@ open class NEBaseChatMessageCell: NEChatBaseCell {
492492
}
493493
fullNameH?.constant = CGFloat(model.fullNameHeight)
494494

495-
if isSend {
496-
switch model.message?.sendingState {
497-
case .MESSAGE_SENDING_STATE_SENDING:
498-
activityView.messageStatus = .sending
499-
case .MESSAGE_SENDING_STATE_SUCCEEDED:
500-
activityView.messageStatus = .successed
501-
case .MESSAGE_SENDING_STATE_FAILED:
502-
activityView.messageStatus = .failed
503-
default:
504-
activityView.messageStatus = .sending
505-
}
506-
} else {
507-
activityView.messageStatus = .successed
508-
}
509-
510495
if isSend, model.message?.sendingState == .MESSAGE_SENDING_STATE_SUCCEEDED {
511496
if model.message?.conversationType == .CONVERSATION_TYPE_P2P {
512497
// 话单消息不显示已读未读
513-
if model.type == .rtcCallRecord {
514-
readView.isHidden = true
515-
} else {
516-
let receiptEnable = model.message?.messageConfig?.readReceiptEnabled ?? false
517-
if receiptEnable,
518-
!model.isRevoked,
519-
SettingRepo.shared.getShowReadStatus(),
520-
ChatUIConfig.shared.messageProperties.showP2pMessageStatus == true {
521-
readView.isHidden = false
522-
if model.readCount == 1, model.unreadCount == 0 {
523-
readView.progress = 1
524-
} else {
525-
readView.progress = 0
526-
}
498+
let receiptEnable = model.type != .rtcCallRecord
499+
if receiptEnable,
500+
!model.isRevoked,
501+
SettingRepo.shared.getShowReadStatus(),
502+
ChatUIConfig.shared.messageProperties.showP2pMessageStatus == true {
503+
readView.isHidden = false
504+
if model.readCount == 1, model.unreadCount == 0 {
505+
readView.progress = 1
527506
} else {
528-
readView.isHidden = true
507+
readView.progress = 0
529508
}
509+
} else {
510+
readView.isHidden = true
530511
}
531512
} else if model.message?.conversationType == .CONVERSATION_TYPE_TEAM {
513+
// readReceiptEnabled 配置只对群聊消息有效
532514
let receiptEnable = model.message?.messageConfig?.readReceiptEnabled ?? false
533515
if receiptEnable,
534516
!model.isRevoked,
@@ -560,6 +542,26 @@ open class NEBaseChatMessageCell: NEChatBaseCell {
560542
readView.isHidden = true
561543
}
562544

545+
if isSend {
546+
switch model.message?.sendingState {
547+
case .MESSAGE_SENDING_STATE_SENDING:
548+
activityView.messageStatus = .sending
549+
case .MESSAGE_SENDING_STATE_SUCCEEDED:
550+
if model.message?.messageStatus.errorCode != operationSuccess {
551+
activityView.messageStatus = .sendingFailed
552+
readView.isHidden = true
553+
} else {
554+
activityView.messageStatus = .successed
555+
}
556+
case .MESSAGE_SENDING_STATE_FAILED:
557+
activityView.messageStatus = .failed
558+
default:
559+
activityView.messageStatus = .sending
560+
}
561+
} else {
562+
activityView.messageStatus = .successed
563+
}
564+
563565
delegate?.messageWillShow?(self, model)
564566
}
565567

NEChatUIKit/NEChatUIKit/Classes/Chat/View/ChatView/ChatActivityIndicatorView.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public enum ChatSendMessageStatus: Int {
1010
case successed = 0
1111
case sending
1212
case failed
13+
case sendingFailed // 因反垃圾导致的发送失败
1314
}
1415

1516
@objcMembers
@@ -30,6 +31,14 @@ open class ChatActivityIndicatorView: UIView {
3031
isHidden = false
3132
activityView.isHidden = true
3233
failButton.isHidden = false
34+
failButton.isEnabled = true
35+
failButton.tintColor = UIColor(hexString: "#FB5A6A")
36+
case .sendingFailed:
37+
isHidden = false
38+
activityView.isHidden = true
39+
failButton.isHidden = false
40+
failButton.isEnabled = false
41+
failButton.tintColor = .gray
3342
case .successed:
3443
isHidden = true
3544
default:
@@ -42,7 +51,9 @@ open class ChatActivityIndicatorView: UIView {
4251
let button = UIButton()
4352
button.translatesAutoresizingMaskIntoConstraints = false
4453
button.contentMode = .scaleAspectFit
45-
button.setImage(UIImage.ne_imageNamed(name: "sendMessage_failed"), for: .normal)
54+
let originalImage = UIImage.ne_imageNamed(name: "sendMessage_failed")
55+
let templateImage = originalImage?.withRenderingMode(.alwaysTemplate)
56+
button.setImage(templateImage, for: .normal)
4657
button.accessibilityIdentifier = "id.sendMessageFailed"
4758
return button
4859
}()

NEChatUIKit/NEChatUIKit/Classes/Chat/ViewModel/ChatViewModel.swift

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -657,11 +657,29 @@ open class ChatViewModel: NSObject {
657657

658658
chatRepo.sendMessage(message: message,
659659
conversationId: conversationId ?? ChatRepo.conversationId,
660-
params: params) { result, error, pro in
660+
params: params) { [weak self] result, error, pro in
661+
if IMKitConfigCenter.shared.enableAntiSpamTipMessage {
662+
self?.checkAntiSpam(result: result)
663+
}
661664
completion(result?.message ?? message, error, pro)
662665
}
663666
}
664667

668+
open func checkAntiSpam(result: V2NIMSendMessageResult?) {
669+
if let antispamResult = result?.antispamResult {
670+
let pattern = "\\\\*\"label\\\\*\"\\s*:\\s*(\\d+)"
671+
if let errorCode = NECommonUtil.extractLabelsWithRegex(from: antispamResult, pattern).first,
672+
let errorCode = Int(errorCode),
673+
let tipText = antispamResultCodeDic[errorCode] {
674+
if let createTime = result?.message?.createTime {
675+
insertTipMessage(String(format: chatLocalizable("failed_message_reson"), tipText), createTime + 1)
676+
} else {
677+
insertTipMessage(String(format: chatLocalizable("failed_message_reson"), tipText))
678+
}
679+
}
680+
}
681+
}
682+
665683
/// 获取请求大模型的内容
666684
/// - Parameters:
667685
/// - text: 请求/响应的文本内容
@@ -1106,6 +1124,7 @@ open class ChatViewModel: NSObject {
11061124
/// - Parameter conversationId: 会话 id
11071125
/// - Parameter senderId: 发送者 id
11081126
open func insertTipMessage(_ text: String,
1127+
_ createTime: TimeInterval? = nil,
11091128
_ conversationId: String? = nil,
11101129
_ senderId: String? = nil) {
11111130
NEALog.infoLog(ModuleName + " " + className(), desc: #function + ", text:\(text)")
@@ -1114,7 +1133,8 @@ open class ChatViewModel: NSObject {
11141133
let tip = MessageUtils.tipMessage(text: text)
11151134
chatRepo.insertMessageToLocal(message: tip,
11161135
conversationId: cid,
1117-
senderId: senderId) { [weak self] _, error in
1136+
senderId: senderId,
1137+
createTime: createTime) { [weak self] _, error in
11181138
// 当前聊天页面插入的提示消息
11191139
if cid == ChatRepo.conversationId {
11201140
self?.modelFromMessage(message: tip) { model in
@@ -1503,15 +1523,18 @@ open class ChatViewModel: NSObject {
15031523
}
15041524

15051525
// 根据配置项移除 【标记】
1506-
if IMKitConfigCenter.shared.enablePinMessage == false {
1526+
// 反垃圾命中的消息不能【标记】
1527+
if IMKitConfigCenter.shared.enablePinMessage == false ||
1528+
model?.message?.messageStatus.errorCode != operationSuccess {
15071529
items.removeAll { item in
15081530
item.type == .pin || item.type == .removePin
15091531
}
15101532
}
15111533

15121534
// 根据配置项移除 【置顶】
15131535
// 单聊移除【置顶】
1514-
if IMKitConfigCenter.shared.enableTopMessage == false || model?.message?.conversationType == .CONVERSATION_TYPE_P2P {
1536+
if IMKitConfigCenter.shared.enableTopMessage == false ||
1537+
model?.message?.conversationType == .CONVERSATION_TYPE_P2P {
15151538
items.removeAll { item in
15161539
item.type == .top || item.type == .untop
15171540
}
@@ -2343,7 +2366,7 @@ open class ChatViewModel: NSObject {
23432366
}
23442367

23452368
DispatchQueue.main.async { [weak self] in
2346-
self?.insertTipMessage(chatLocalizable("black_list_tip"), conversationId)
2369+
self?.insertTipMessage(chatLocalizable("black_list_tip"), message.createTime + 1, conversationId)
23472370
if conversationId == ChatRepo.conversationId {
23482371
self?.sendMsgSuccess(message)
23492372
}

NEChatUIKit/NEChatUIKit/Classes/ChatConfig/ChatUIConfig.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class ChatUIConfig: NSObject {
2929
/// 文本输入框下方 tab 按钮定制
3030
public var chatInputBar: ((ChatViewController?, inout [UIButton]) -> Void)?
3131

32-
/// 【相册】 按钮点击事件,可自定义图片选择器,参数为聊天页面视图控制器、选择类型、数量限制,返回选中的图片/视频以及是否是原图
32+
/// 【相册】 按钮点击事件,可自定义图片选择器,参数为当前页面视图控制器、选择类型、数量限制,返回选中的图片/视频以及是否是原图
3333
public var chatInputPhotoClick: ((UIViewController, NEMediaType, Int, @escaping ([NEResultModel], Bool) -> Void) -> Void)?
3434

3535
/// 【更多】区域功能列表

NEChatUIKit/NEChatUIKit/Classes/Common/ChatConstant.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,20 @@ public let file_pdf_support: [String] = ["pdf", "rtf"]
8282
// 支持的超链接格式
8383
public let file_html_support: [String] = ["html"]
8484

85+
// [反垃圾错误码: 描述]
86+
public let antispamResultCodeDic = [
87+
100: chatLocalizable("failed_message_reson_ornography"),
88+
200: chatLocalizable("failed_message_reson_advertising"),
89+
260: chatLocalizable("failed_message_reson_advertising_law"),
90+
300: chatLocalizable("failed_message_reson_violence_and_terrorism"),
91+
400: chatLocalizable("failed_message_reson_prohibited"),
92+
500: chatLocalizable("failed_message_reson_political_related"),
93+
600: chatLocalizable("failed_message_reson_abuse"),
94+
700: chatLocalizable("failed_message_reson_waterlogging"),
95+
900: chatLocalizable("failed_message_reson_others"),
96+
1000: chatLocalizable("failed_message_reson_value_related"),
97+
]
98+
8599
/// 屏幕间隔
86100
public let kScreenInterval: CGFloat = 20
87101
public let NEMoreView_Section_Padding: CGFloat = 24.0

NECommonUIKit/NECommonUIKit/Classes/Vender/AnimationView/NEAnimationContext.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class NEAnimationCompletionDelegate: NSObject, CAAnimationDelegate {
6060

6161
// MARK: Public
6262

63-
func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
63+
public func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
6464
guard ignoreDelegate == false else { return }
6565
animationState = flag ? .complete : .cancelled
6666
if let animationLayer, let key = animationKey {

0 commit comments

Comments
 (0)