Commit 24fe5a3a authored by Alex朱枝文's avatar Alex朱枝文

直播间环信消息调整

parent f78b3ed6
...@@ -12,7 +12,7 @@ import UIKit ...@@ -12,7 +12,7 @@ import UIKit
class YHLivePlayerViewController: YHBasePlayerViewController { class YHLivePlayerViewController: YHBasePlayerViewController {
// MARK: - Properties // MARK: - Properties
//private var roomInfo: YHLiveRoomInfo private let messageQueue = DispatchQueue(label: "com.livePlayerRoom.messageQueue")
private var listMaxWidth: CGFloat { private var listMaxWidth: CGFloat {
return KScreenWidth * 248.0 / 375.0 return KScreenWidth * 248.0 / 375.0
...@@ -35,7 +35,35 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -35,7 +35,35 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
// //
} }
ctl.inputCallback = { [weak self] controller, text in ctl.inputCallback = { [weak self] controller, text in
// guard let self = self else {
return
}
if !checkLogin() { return }
guard let roomId = self.viewModel.liveDetailModel?.roomId else {
return
}
YHIMHelper.shared.sendMessage(roomID: roomId, sendText: text) { [weak self] message, error in
guard let self = self else {
return
}
guard let message = message else {
if let error = error {
// 被拉黑
if error.code == .moderationFailed {
YHHUD.flash(message: "发送了敏感信息")
} else if error.code == .userPermissionDenied {
YHHUD.flash(message: "您已被拉黑")
} else {
YHHUD.flash(message: "发送失败")
}
}
return
}
controller.updateText("")
controller.closeKeyboard(nil)
self.appendHistoryMessages([message])
}
} }
return ctl return ctl
}() }()
...@@ -67,7 +95,7 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -67,7 +95,7 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
} }
deinit { deinit {
// NotificationCenter.default.removeObserver(self)
} }
/// 是否可以返回,包括点击返回和手势返回,默认YES /// 是否可以返回,包括点击返回和手势返回,默认YES
...@@ -125,8 +153,15 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -125,8 +153,15 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
printLog("joinChatRoom: \(error)") printLog("joinChatRoom: \(error)")
} else { } else {
printLog("joinChatRoom: success") printLog("joinChatRoom: success")
YHIMHelper.shared.fetchHistoryMessage(roomID: liveDetail.roomId) { list, error in YHIMHelper.shared.fetchHistoryMessage(roomID: liveDetail.roomId) { [weak self] list, error in
// guard let self = self else {
return
}
guard let list = list else {
return
}
self.messageListView.clearMessages()
self.appendHistoryMessages(list)
} }
} }
} }
...@@ -135,8 +170,20 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -135,8 +170,20 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
private func setupNoti() { private func setupNoti() {
NotificationCenter.default.addObserver(self, selector: #selector(didChatManagerReceiveMessages(_:)), name: YHIMHelper.didChatManagerReceiveMessages, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(didChatManagerReceiveMessages(_:)), name: YHIMHelper.didChatManagerReceiveMessages, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(didLoginEaseIMSuccess), name: YHIMHelper.didLoginEaseIMSuccess, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(didLogOutEaseIM), name: YHIMHelper.didLogOutEaseIM, object: nil)
} }
private func checkLogin()->Bool {
if YHLoginManager.shared.isLogin() == false {
YHOneKeyLoginManager.shared.oneKeyLogin()
return false
}
return true
}
// MARK: - IM Action
private func quitChatRoom() { private func quitChatRoom() {
guard let roomId = self.viewModel.liveDetailModel?.roomId else { guard let roomId = self.viewModel.liveDetailModel?.roomId else {
return return
...@@ -151,6 +198,44 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -151,6 +198,44 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
} }
} }
private func appendHistoryMessages(_ newMessages: [EMChatMessage]) {
messageQueue.async {
let filterMessages = newMessages.filter { message in
if let body = message.body as? EMTextMessageBody, body.type == .text {
return true
}
return false
}
DispatchQueue.main.async {
self.messageListView.addMessages(filterMessages)
}
}
}
@objc private func didChatManagerReceiveMessages(_ note: Notification) {
guard let messages = note.object as? [EMChatMessage], let message = messages.first, message.conversationId == viewModel.liveDetailModel?.roomId else {
return
}
appendHistoryMessages(messages)
}
@objc private func didLoginEaseIMSuccess() {
guard let roomId = self.viewModel.liveDetailModel?.roomId else {
return
}
YHIMHelper.shared.joinChatRoom(roomID: roomId, leaveOtherRooms: true) { [weak self] error in
guard let self = self else {
return
}
}
}
@objc private func didLogOutEaseIM() {
quitChatRoom()
}
}
extension YHLivePlayerViewController {
// MARK: - Player Control // MARK: - Player Control
private func play(with url: String) { private func play(with url: String) {
let mediaSource = AgoraMediaSource() let mediaSource = AgoraMediaSource()
...@@ -162,13 +247,6 @@ class YHLivePlayerViewController: YHBasePlayerViewController { ...@@ -162,13 +247,6 @@ class YHLivePlayerViewController: YHBasePlayerViewController {
showAlert(message: "播放失败,错误码:\(result)") showAlert(message: "播放失败,错误码:\(result)")
} }
} }
@objc private func didChatManagerReceiveMessages(_ note: Notification) {
guard let messages = note.object as? [EMChatMessage], let message = messages.first, message.conversationId == viewModel.liveDetailModel?.roomId else {
return
}
printLog("")
}
} }
extension YHLivePlayerViewController { extension YHLivePlayerViewController {
......
...@@ -11,9 +11,10 @@ import IQKeyboardManagerSwift ...@@ -11,9 +11,10 @@ import IQKeyboardManagerSwift
class YHMessageInputViewController: UIViewController { class YHMessageInputViewController: UIViewController {
private let maxCount = 40 private let maxCount = 40
private let overMaxCountTips = "评论字数限制40字以下" private var overMaxCountTips: String {
return "评论字数限制\(maxCount)字以下"
}
private let nullInputTips = "请输入内容" private let nullInputTips = "请输入内容"
private let failTips = "发送失败"
private var keyboardHeight = 0.0 private var keyboardHeight = 0.0
private let textContainerToTop = 8.0 private let textContainerToTop = 8.0
private var lastMessage: String = "" private var lastMessage: String = ""
...@@ -167,7 +168,7 @@ extension YHMessageInputViewController { ...@@ -167,7 +168,7 @@ extension YHMessageInputViewController {
let text = textView.text ?? "" let text = textView.text ?? ""
let currentText = text.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) let currentText = text.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
guard currentText.count > 0 else { guard currentText.count > 0 else {
// nullInputTips YHHUD.flash(message: nullInputTips)
return return
} }
inputCallback?(self, currentText) inputCallback?(self, currentText)
...@@ -275,7 +276,7 @@ extension YHMessageInputViewController: UITextViewDelegate { ...@@ -275,7 +276,7 @@ extension YHMessageInputViewController: UITextViewDelegate {
} }
let count = (textView.text?.utf16.count ?? 0) - range.length + text.utf16.count let count = (textView.text?.utf16.count ?? 0) - range.length + text.utf16.count
if count > maxCount { if count > maxCount {
// overMaxCountTips YHHUD.flash(message: overMaxCountTips)
return false return false
} }
return true return true
......
...@@ -179,6 +179,7 @@ extension YHIMHelper { ...@@ -179,6 +179,7 @@ extension YHIMHelper {
/// 获取聊天室历史消息 /// 获取聊天室历史消息
func fetchHistoryMessage(roomID: String, completion: @escaping ([EMChatMessage]?, EMError?) -> Void) { func fetchHistoryMessage(roomID: String, completion: @escaping ([EMChatMessage]?, EMError?) -> Void) {
let option = EMFetchServerMessagesOption() let option = EMFetchServerMessagesOption()
option.direction = .up // 时间戳逆序的消息因为要倒置表格
EMClient.shared().chatManager?.fetchMessagesFromServer(by: roomID, conversationType: .chatRoom, cursor: nil, pageSize: 50, option: option, completion: { result, err in EMClient.shared().chatManager?.fetchMessagesFromServer(by: roomID, conversationType: .chatRoom, cursor: nil, pageSize: 50, option: option, completion: { result, err in
DispatchQueue.main.async { DispatchQueue.main.async {
if let err = err { if let err = err {
...@@ -231,20 +232,20 @@ extension YHIMHelper { ...@@ -231,20 +232,20 @@ extension YHIMHelper {
} }
/// 发送消息 /// 发送消息
func sendMessage(roomID: String, nickname: String, sendText: String, completion: @escaping (EMError?) -> Void) { func sendMessage(roomID: String, sendText: String, completion: @escaping (EMChatMessage?, EMError?) -> Void) {
let textMessageBody = EMTextMessageBody(text: sendText) let textMessageBody = EMTextMessageBody(text: sendText)
// 消息接收方,单聊为对端用户的 ID,群聊为群组 ID,聊天室为聊天室 ID。 // 消息接收方,单聊为对端用户的 ID,群聊为群组 ID,聊天室为聊天室 ID。
let message = EMChatMessage(conversationID: roomID, body: textMessageBody, ext: ["fromNickName": nickname]) let message = EMChatMessage(conversationID: roomID, body: textMessageBody, ext: ["fromNickName": currentNickname])
// 会话类型,单聊为 `EMChatTypeChat`,群聊为 `EMChatTypeGroupChat`,聊天室为 `EMChatTypeChatRoom`,默认为单聊。 // 会话类型,单聊为 `EMChatTypeChat`,群聊为 `EMChatTypeGroupChat`,聊天室为 `EMChatTypeChatRoom`,默认为单聊。
message.chatType = .chatRoom message.chatType = .chatRoom
EMClient.shared().chatManager?.send(message, progress: nil, completion: { _, error in EMClient.shared().chatManager?.send(message, progress: nil, completion: { message, error in
DispatchQueue.main.async { DispatchQueue.main.async {
if let err = error { if let err = error {
printLog(err.errorDescription) printLog(err.errorDescription)
} else { } else {
printLog("消息发送-成功") printLog("消息发送-成功")
} }
completion(error) completion(message, error)
} }
}) })
} }
......
...@@ -6,12 +6,14 @@ ...@@ -6,12 +6,14 @@
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved. // Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
// //
import HyphenateChat
import UIKit import UIKit
class YHLiveMessageListView: UIView { class YHLiveMessageListView: UIView {
private var messages: [YHLiveMessage] = [] private var messages: [EMChatMessage] = []
// MARK: - UI Components // MARK: - UI Components
private lazy var topFadeView: YHFadeView = { private lazy var topFadeView: YHFadeView = {
let view = YHFadeView() let view = YHFadeView()
view.backgroundColor = .clear.withAlphaComponent(0.1) view.backgroundColor = .clear.withAlphaComponent(0.1)
...@@ -36,25 +38,11 @@ class YHLiveMessageListView: UIView { ...@@ -36,25 +38,11 @@ class YHLiveMessageListView: UIView {
override init(frame: CGRect) { override init(frame: CGRect) {
super.init(frame: frame) super.init(frame: frame)
setupUI() setupUI()
setupData()
} }
required init?(coder: NSCoder) { required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented") fatalError("init(coder:) has not been implemented")
} }
private func setupData() {
let message6 = YHLiveMessage.init(type: .normal, sender: YHLiveUser.init(userId: "1233", nickname: "MAKESIBIB", level: 0, isAdmin: false), content: "优才今年政策", timestamp: Date())
let message5 = YHLiveMessage.init(type: .normal, sender: YHLiveUser.init(userId: "1233", nickname: "MAKESIBIB", level: 0, isAdmin: false), content: "😊", timestamp: Date())
let message4 = YHLiveMessage.init(type: .normal, sender: YHLiveUser.init(userId: "1233", nickname: "姑息可", level: 0, isAdmin: false), content: "优才申请时间有什么限制吗", timestamp: Date())
let message3 = YHLiveMessage.init(type: .normal, sender: YHLiveUser.init(userId: "1233", nickname: "侯米儿", level: 0, isAdmin: false), content: "我来了", timestamp: Date())
let message2 = YHLiveMessage.init(type: .normal, sender: YHLiveUser.init(userId: "1233", nickname: "奇思幻想牛先生", level: 0, isAdmin: false), content: "可以帮忙介绍一下香港优秀人才计划吗?", timestamp: Date())
let message1 = YHLiveMessage.init(type: .normal, sender: YHLiveUser.init(userId: "1233", nickname: "侯米儿", level: 0, isAdmin: false), content: "我工作5年,香港高才怎么申请更快获批啊", timestamp: Date())
let message0 = YHLiveMessage.init(type: .normal, sender: YHLiveUser.init(userId: "1233", nickname: "谷溪", level: 0, isAdmin: false), content: "想了解香港教育有什么优势", timestamp: Date())
messages = [message0, message1, message2, message3, message4, message5, message6]
// messages = [message6]
tableView.reloadData()
}
private func setupUI() { private func setupUI() {
backgroundColor = .clear backgroundColor = .clear
...@@ -74,10 +62,12 @@ class YHLiveMessageListView: UIView { ...@@ -74,10 +62,12 @@ class YHLiveMessageListView: UIView {
// MARK: - Public Methods // MARK: - Public Methods
func addMessage(_ message: YHLiveMessage) { func addMessages(_ msgs: [EMChatMessage]) {
messages.insert(message, at: 0) messages.insert(contentsOf: msgs, at: 0)
let indexPath = IndexPath(row: 0, section: 0) let indexPaths = (0 ..< msgs.count).map {
tableView.insertRows(at: [indexPath], with: .bottom) IndexPath(row: $0, section: 0)
}
tableView.insertRows(at: indexPaths, with: .bottom)
} }
func clearMessages() { func clearMessages() {
...@@ -92,7 +82,7 @@ extension YHLiveMessageListView: UITableViewDelegate, UITableViewDataSource { ...@@ -92,7 +82,7 @@ extension YHLiveMessageListView: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension return UITableView.automaticDimension
} }
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return messages.count return messages.count
} }
...@@ -108,7 +98,17 @@ extension YHLiveMessageListView: UITableViewDelegate, UITableViewDataSource { ...@@ -108,7 +98,17 @@ extension YHLiveMessageListView: UITableViewDelegate, UITableViewDataSource {
let message = messages[indexPath.row] let message = messages[indexPath.row]
// cell 也需要旋转 // cell 也需要旋转
cell.contentView.transform = CGAffineTransform(rotationAngle: .pi) cell.contentView.transform = CGAffineTransform(rotationAngle: .pi)
cell.configureNormalMessage(message.sender.nickname, message.content) var nickName: String = ""
var content: String = ""
if let ext = message.ext {
nickName = ext["fromNickName"] as? String ?? "YinHe"
}
if let body = message.body as? EMTextMessageBody, body.type == .text {
printLog(body.text)
printLog("\(nickName) : \(body.text)")
content = body.text
}
cell.configureNormalMessage(nickName, content)
return cell return cell
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment