Files
yinmeng-ios-store/yinmeng-ios/yinmeng-ios/Swift/MewRoomPlay/MewView/MewSubView/MewRoomMicSeatView.swift
2024-06-06 16:45:09 +08:00

475 lines
19 KiB
Swift

//
// MewRoomMicSeatView.swift
// yinmeng-ios
//
// Created by duoban on 2024/1/16.
//
import UIKit
typealias MewSetMicDownSucceed = (_ down:String,_ next:String?)-> Void
class MewRoomMicSeatView: UIView {
@objc public var mewViewList:[MewRoomMicSeatImageView] = []
var succeedDownBlock:MewSetMicDownSucceed?
var mewMicList:[String:MewMicListModel] = {
var _mewMicList = [:] as [String:MewMicListModel]
for i in 0 ..< 7 {
let micNum = "\(i-1)"
let mewMicModel = MewMicListModel()
mewMicModel.userInfo = nil
mewMicModel.microState?.position = Int32(i-1)
mewMicModel.microState = MewSeatMicStateModel()
_mewMicList[micNum] = mewMicModel
}
return _mewMicList
}()
var chooseView:MewRoomMicSeatImageView?
var mewRoomData:MewRoomPlayModel?
var mewUserData:MewPersonInfoModel?
var isGetListSuccess = false
var isUpMicSeat = false
@objc public var mewChooseUid:String?
override init(frame: CGRect) {
super.init(frame: frame)
mewSetUI()
TRTCCloud.sharedInstance().enableAudioVolumeEvaluation(900, enable_vad: true)
TRTCCloud.setConsoleEnabled(false)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func mewSetUI(){
for i in 0 ..< 7 {
let imageView = MewRoomMicSeatImageView()
mewViewList.append(imageView)
addSubview(imageView)
imageView.layer.masksToBounds = true
imageView.layer.borderWidth = 0
let tap = UITapGestureRecognizer.init(target: self, action: #selector(mewClickMicSeat(sender:)))
imageView.addGestureRecognizer(tap)
imageView.layer.borderColor = R.color.mewRoomMicSeatColor()?.cgColor
imageView.tag = i - 1
if i == 1{
imageView.mewImage = R.image.mew_room_position_empty()!
imageView.layer.cornerRadius = 35
imageView.snp.makeConstraints { make in
make.width.height.equalTo(70)
make.left.equalTo(32)
make.top.equalTo(172)
}
}else if i == 2{
imageView.mewImage = R.image.mew_room_position_empty()!
imageView.layer.cornerRadius = 35
imageView.snp.makeConstraints { make in
make.width.height.equalTo(70)
make.centerX.equalTo(self)
make.top.equalTo(172)
}
}else if i == 3{
imageView.mewImage = R.image.mew_room_position_empty()!
imageView.layer.cornerRadius = 35
imageView.snp.makeConstraints { make in
make.width.height.equalTo(70)
make.right.equalTo(-32)
make.top.equalTo(172)
}
}else if i == 4{
imageView.mewImage = R.image.mew_room_position_empty()!
imageView.layer.cornerRadius = 35
imageView.snp.makeConstraints { make in
make.width.height.equalTo(70)
make.left.equalTo(32)
make.top.equalTo(256)
}
}else if i == 5{
imageView.mewImage = R.image.mew_room_position_empty()!
imageView.layer.cornerRadius = 35
imageView.snp.makeConstraints { make in
make.width.height.equalTo(70)
make.centerX.equalTo(self)
make.top.equalTo(256)
}
}else if i == 6{
imageView.mewImage = R.image.mew_room_position_empty()!
imageView.layer.cornerRadius = 35
imageView.snp.makeConstraints { make in
make.width.height.equalTo(70)
make.right.equalTo(-32)
make.top.equalTo(256)
}
}else{
imageView.layer.cornerRadius = 10
imageView.snp.makeConstraints { make in
make.width.equalTo(130)
make.height.equalTo(148)
make.left.equalTo(32)
make.top.equalTo(0)
}
imageView.mewImage = R.image.mew_room_position_first_empty()!
}
}
}
func mewGetChooseView(uid:String){
for subView in self.mewViewList{
if let u = subView.mewMicInfo?.userInfo {
let curUid = "\(u.uid)"
if(uid == curUid){
self.chooseView = subView
break
}
}
}
}
func mewDownMic(down:String,next:String?){
if let roomId = self.mewRoomData?.roomId {
let mewRequest = NIMChatroomQueueRemoveRequest()
mewRequest.key = down
mewRequest.roomId = String(format: "%ld", roomId)
NIMSDK.shared().chatroomManager.removeChatroomQueueObject(mewRequest) { error, dataInfo in
if error == nil, let curNext = next{
if(self.isGetListSuccess == false){return}
let micData = self.mewMicList[curNext]
if micData?.userInfo != nil{
MewHUDTool.showError(withMessage: "该麦位已经有人了哦~")
return
}
if let mewUser = self.mewUserData, let roomId = self.mewRoomData?.roomId{
let mewRequest = NIMChatroomQueueUpdateRequest()
mewRequest.key = curNext
let extData = MewMicExtDataModel()
extData.avatar = mewUser.avatar
extData.uid = mewUser.uid
extData.nick = mewUser.nick
let dic = extData.mj_keyValues().copy() as! NSDictionary
mewRequest.value = dic.mj_JSONString()
mewRequest.roomId = String(format: "%ld", roomId)
mewRequest.transient = true
NIMSDK.shared().chatroomManager.updateChatroomQueueObject(mewRequest) { error in
self.isGetListSuccess = false
}
}
}else{
self.isUpMicSeat = false
}
}
}
}
@objc func mewClickMicSeat(sender:UITapGestureRecognizer){
guard let index = sender.view?.tag else { return }
let view = sender.view as! MewRoomMicSeatImageView
if view.mewMicInfo?.userInfo != nil{
for subView in self.mewViewList{
if subView == view{
if subView.layer.borderWidth == 2{
subView.layer.borderWidth = 0
}else{
if let uid = view.mewMicInfo?.userInfo?.uid{
let getUid = "\(uid)"
if getUid == MewSaveBaseUserModel.share().mewGetUserId(){
mewDownMic(down: String(index), next: nil)
}else{
subView.layer.borderWidth = 2
}
}
}
}else{
subView.layer.borderWidth = 0
self.mewChooseUid = nil
}
}
return
}
if let roomId = self.mewRoomData?.roomId,let uid = self.mewRoomData?.uid{
let mewRequest = NIMChatroomMembersByIdsRequest()
mewRequest.roomId = String(format: "%ld", roomId)
mewRequest.userIds = ["\(uid)"]
NIMSDK.shared().chatroomManager.fetchChatroomMembers(byIds: mewRequest) { error, dataList in
if (dataList?.first) != nil{
let getNum = String(index)
if(self.isGetListSuccess == false){return}
let micData = self.mewMicList[getNum]
if micData?.userInfo != nil{
MewHUDTool.showError(withMessage: "该麦位已经有人了哦~")
return
}
if let mewUser = self.mewUserData, let roomId = self.mewRoomData?.roomId{
let mewRequest = NIMChatroomQueueUpdateRequest()
mewRequest.key = getNum
let extData = MewMicExtDataModel()
extData.avatar = mewUser.avatar
extData.uid = mewUser.uid
extData.nick = mewUser.nick
let dic = extData.mj_keyValues().copy() as! NSDictionary
mewRequest.value = dic.mj_JSONString()
mewRequest.roomId = String(format: "%ld", roomId)
mewRequest.transient = true
NIMSDK.shared().chatroomManager.updateChatroomQueueObject(mewRequest) { error in
}
}
}
}
}
}
public func mewDealWitMicData(msg:NIMMessage){
var isChanged = false
var isTRTCChanged = false
if let mewMsgObj = msg.messageObject as? NIMNotificationObject,let mewContent = mewMsgObj.content as? NIMChatroomNotificationContent{
switch mewContent.eventType {
case NIMChatroomEventType.infoUpdated:
if let mewdata = mewContent.notifyExt?.mj_JSONObject() as? NSDictionary, let type = mewdata["type"] as? Int{
var stateList:[MewSeatMicStateModel] = []
switch type {
case 2:
if let micData = mewdata["micInfo"] as? NSDictionary {
if let micModel = MewSeatMicStateModel.mj_object(withKeyValues: micData){
stateList = [micModel]
}
}
break
case 3:
if let micData = mewdata["micInfo"] as? NSDictionary {
let micModel = MewSeatMicStateModel.mj_objectArray(withKeyValuesArray: micData)
stateList = micModel as! [MewSeatMicStateModel]
}
break
default:
break
}
for obj in stateList{
let num = obj.position
let micQ = self.mewMicList["\(num)"]
micQ?.microState = obj
}
isChanged = true
}
break
case NIMChatroomEventType.queueChange:
if let mewData = mewContent.ext as? NSDictionary , let userDic = mewData[NIMChatroomEventInfoQueueChangeItemValueKey] as? String,let type = mewData[NIMChatroomEventInfoQueueChangeTypeKey] as? Int{
let num = mewData[NIMChatroomEventInfoQueueChangeItemKey] as! String
if let user = MewPersonInfoModel.mj_object(withKeyValues: userDic ){
if("\(user.uid)" == MewSaveBaseUserModel.share().mewGetUserId() ){
isTRTCChanged = true
}
for obj in self.mewMicList.values{
if obj.userInfo?.uid == user.uid{
obj.userInfo = nil
}
}
if type == 1 {
let micInfo = self.mewMicList[num]
micInfo?.userInfo = user
if "\(micInfo?.userInfo?.uid ?? 0)" == MewSaveBaseUserModel.share().mewGetUserId(){
TRTCCloud.sharedInstance().muteLocalAudio(false)
}
}
isChanged = true
}
}
break
default:
break
}
}
if isChanged == true{
mewUpdatedMic(isHaveRTRC: isTRTCChanged)
}
}
@objc public func mewEnterRoom(_ roomData:MewRoomPlayModel,_ user:MewPersonInfoModel){
self.mewRoomData = roomData
self.mewUserData = user
self.mewSetTRTC()
mewSetMicList()
}
func mewSetTRTC(){
if let roomId = self.mewRoomData?.roomId,let uid = self.mewRoomData?.uid{
let curRoomId = roomId > INT_MAX ? uid : roomId
TRTCCloud.sharedInstance().enableAudioVolumeEvaluation(900, enable_vad: true)
let mewParams = TRTCParams()
if let mewTRTCKey = UserDefaults.standard.value(forKey: MewEncryptManager.mewAESDecryptText("o1/PeEYsNHSpIJ8pkmQkRA==")) as? String{
if mewTRTCKey.isEmpty{
let curKey = MewEncryptManager.mewAESDecryptText("KuvNPAVFOJuCIn4wjVeOMw==")
mewParams.sdkAppId = UInt32(curKey) ?? 0
}else{
mewParams.sdkAppId = UInt32(mewTRTCKey) ?? 0
}
mewParams.roomId = UInt32(curRoomId)
mewParams.userId = MewSaveBaseUserModel.share().mewGetUserId()
let sign = self.mewRoomData?.trtcSig ?? ""
mewParams.userSig = sign
mewParams.role = TRTCRoleType.audience
TRTCCloud.sharedInstance().enterRoom(mewParams, appScene: TRTCAppScene.LIVE)
TRTCCloud.sharedInstance().muteAllRemoteAudio(false)
TRTCCloud.sharedInstance().muteLocalAudio(false)
}
}
}
func mewSetMicList(){
mewGetMicState()
isGetListSuccess = false
if let roomId = self.mewRoomData?.roomId{
NIMSDK.shared().chatroomManager.fetchChatroomQueue(String(format: "%ld", roomId)) { error, dataList in
if error != nil{return}
var isRTCChange = false
for obj in dataList ?? []{
if let userData = MewPersonInfoModel.mj_object(withKeyValues: obj.values.first ?? ""){
if let num = obj.keys.first{
let model = self.mewMicList[num]
model?.userInfo = userData
let myUid = Int(MewSaveBaseUserModel.share().mewGetUserId())
if userData.uid == myUid{
isRTCChange = true
}
}
}
}
self.mewUpdatedMic(isHaveRTRC: isRTCChange)
self.isGetListSuccess = true
}
}
}
func mewUpdatedMic(isHaveRTRC:Bool){
var mewIsNeedBroadcast = false
if let uid = self.mewRoomData?.uid{
for i in 0 ..< 7 {
let mewView = mewViewList[i]
mewView.layer.borderWidth = 0
let micNum = "\(i-1)"
let mewModel = self.mewMicList[micNum]
mewView.mewMicInfo = mewModel
if uid == mewModel?.userInfo?.uid{
mewIsNeedBroadcast = mewModel?.microState?.micState == .Open
}
if(mewModel?.microState?.micState == .Close){
TRTCCloud.sharedInstance().muteLocalAudio(true)
}
}
}
if(isHaveRTRC == false){
return
}
mewSetBroadcast(isOn: mewIsNeedBroadcast)
}
func mewSetBroadcast(isOn:Bool){
TRTCCloud.sharedInstance().switch(isOn ? TRTCRoleType.anchor : TRTCRoleType.audience)
if(isOn == true){
let tetx = "{\"api\":\"setAudioQualityEx\",\"params\":{\"sampleRate\":48000,\"channel\":2,\"bitrate\":192,\"encodeMode\":1,\"systemVolumeType\":1}}"
TRTCCloud.sharedInstance().callExperimentalAPI(tetx)
let aecText = "{\"api\":\"enableAudioAEC\",\"params\":{\"enable\":1,\"level\":100}}"
TRTCCloud.sharedInstance().callExperimentalAPI(aecText)
TRTCCloud.sharedInstance().startLocalAudio(TRTCAudioQuality.music)
}else{
TRTCCloud.sharedInstance().stopLocalAudio()
}
}
func mewGetMicState(){
if let roomId = self.mewRoomData?.roomId{
NIMSDK.shared().chatroomManager .fetchChatroomInfo(String(format: "%ld", roomId)) { error, chatData in
if error == nil{
if let data = chatData?.ext?.mj_JSONObject() as? [String:Any],let stateData = data["micQueue"] as? NSDictionary,let state = stateData.mj_JSONObject() as? NSDictionary {
for index in state.allKeys{
if let getIndxe = index as? String{
if let curStrate = MewSeatMicStateModel.mj_object(withKeyValues: state[index] ?? ""){
let model:MewMicListModel? = self.mewMicList[getIndxe] ?? nil
model?.microState = curStrate
}
}
}
}
self.mewUpdatedMic(isHaveRTRC: false)
}
}
}
}
}