566 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Swift
		
	
	
	
		
		
			
		
	
	
			566 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Swift
		
	
	
	
|  | // | |||
|  | //  SessionUtil.swift | |||
|  | //  LegendTeam | |||
|  | // | |||
|  | //  Created by 梁博 on 20/12/21. | |||
|  | // | |||
|  | 
 | |||
|  | import Foundation | |||
|  | import NIMSDK | |||
|  | class SessionUtil { | |||
|  |      | |||
|  |     var topViewHeight: CGFloat = 0 | |||
|  |     let mssagePageSize = 50 | |||
|  |     //var session: NIMSession! | |||
|  |     //var conversation: V2NIMConversation! | |||
|  |     var conversationId : String! | |||
|  |      | |||
|  |     let showTimeInterval: TimeInterval = 180 | |||
|  |      | |||
|  |     var cellModels: [SessionBaseModel]! = [SessionBaseModel]() | |||
|  |     /// Key: messageClientId。 ⚠️不能用messageServerId,因为消息可能是在发送中,导致没有messageServerId | |||
|  |     var msgIdDict: [String: SessionBaseModel]! = [String: SessionBaseModel]() | |||
|  |      | |||
|  |     func getLastMessageModel() -> SessionBaseModel? { | |||
|  |         var lastModel: SessionBaseModel? | |||
|  |         for model in cellModels { | |||
|  |             if let messageServerId = model.v2msg?.messageServerId, messageServerId.count > 0{ | |||
|  |                 lastModel = model | |||
|  |             } | |||
|  |         } | |||
|  |         return lastModel | |||
|  |     } | |||
|  | } | |||
|  | 
 | |||
|  | // private | |||
|  | extension SessionUtil { | |||
|  |     /// 最晚的时间, 也是排在最前面的时间 | |||
|  |     func firtTimeStamp() -> TimeInterval { | |||
|  |         guard let model = cellModels.first else { | |||
|  |             return 0 | |||
|  |         } | |||
|  |         return model.timeStamp | |||
|  |     } | |||
|  |      | |||
|  |     /// 最后一条消息的时候,也是离现在最近的时间 | |||
|  |     func lastTimeInterval() -> TimeInterval { | |||
|  |         return cellModels.last?.timeStamp ?? 0 | |||
|  |     } | |||
|  |      | |||
|  |     /// 是否能追加时间显示 | |||
|  |     func shouldAppendTimestamp(model: SessionBaseModel) -> Bool { | |||
|  |         if model.cellType == .aiLoading{ | |||
|  |             return false | |||
|  |         } | |||
|  |         return model.timeStamp - lastTimeInterval() > showTimeInterval | |||
|  |     } | |||
|  |      | |||
|  |     /// 是否能插入时间显示 | |||
|  |     func shouldInsertTimestamp(model: SessionBaseModel) -> Bool { | |||
|  |         return firtTimeStamp() - model.timeStamp > showTimeInterval | |||
|  |     } | |||
|  |      | |||
|  |     /// 是否需要忽略本条消息,不创建model,不显示 | |||
|  |     func ignore(info: IMBaseRemoteInfo) -> Bool{ | |||
|  |         var ignore = false | |||
|  |         if let customAttachment = info.customAttachment{ | |||
|  |             if let type = customAttachment.type{ | |||
|  |                 if type == .HEARTBEAT_LEVEL_DOWN || | |||
|  |                     type == .HEARTBEAT_LEVEL_UP || | |||
|  |                     type == .INSUFFICIENT_BALANCE || | |||
|  |                     type == .VOICE_CHAT_CONTENT | |||
|  |                 { | |||
|  |                     ignore = true | |||
|  |                 } | |||
|  |             }else{ | |||
|  |                 // 没有type的自定义消息 | |||
|  |                 ignore = true | |||
|  |             } | |||
|  |         } | |||
|  |          | |||
|  |         return ignore | |||
|  |     } | |||
|  |      | |||
|  |     /// 是否需要追加一个model显示,判断一条消息显示两个model的情况 | |||
|  |     func needDeriveModel(message: V2NIMMessage) -> Bool { | |||
|  |         if message.messageType == .MESSAGE_TYPE_CUSTOM{ | |||
|  |             if let attachment = message.attachment?.raw, attachment.count > 0 { | |||
|  |                 let model = CodableHelper.decode(IMCustomAttachment.self, from: attachment) | |||
|  |                 if let type = model?.type, type.rawValue.uppercased() == CLCustomAttchType.IMAGE.rawValue{ | |||
|  |                     return true | |||
|  |                 } | |||
|  |             } | |||
|  |              | |||
|  |         } | |||
|  |          | |||
|  |         if message.serverExtension == nil { | |||
|  |             return false | |||
|  |         } | |||
|  |         let info = IMRemoteUtil.dealRemoteInfo(message: message) | |||
|  |         if info.cellType == .keyword | |||
|  |             || info.cellType == .gift | |||
|  |         { | |||
|  |             return true | |||
|  |         } | |||
|  |         return false | |||
|  |     } | |||
|  |      | |||
|  |     func needDecriveModel(with: IMBaseRemoteInfo) -> Bool{ | |||
|  |         if let customAttachment = with.customAttachment, let type = customAttachment.type{ | |||
|  |             if type == .IMAGE{ | |||
|  |                 return true | |||
|  |             } | |||
|  |         } | |||
|  |          | |||
|  |         if with.cellType == .keyword || with.cellType == .gift{ | |||
|  |             return true | |||
|  |         } | |||
|  |         return false | |||
|  |     } | |||
|  |      | |||
|  |     /// 将model存在字典中 | |||
|  |     func setIdIdctObject(model: SessionBaseModel) { | |||
|  |         if model.isDeriveModel { | |||
|  |             return | |||
|  |         } | |||
|  | 
 | |||
|  |         guard let messageID = model.v2msg?.messageClientId else { return } | |||
|  |         msgIdDict[messageID] = model | |||
|  |     } | |||
|  |      | |||
|  |     /// message是否已经存在model | |||
|  |     func modelIsExist(model: SessionBaseModel) -> Bool { | |||
|  |         guard let messageID = model.v2msg?.messageClientId else { return false } | |||
|  |         return msgIdDict[messageID] != nil | |||
|  |     } | |||
|  |      | |||
|  |     func logAllCellModels(){ | |||
|  |         if APIConfig.environment == .test{ | |||
|  |             var string = "☁️cellModels(\(cellModels.count):\n" | |||
|  |             for per in cellModels { | |||
|  |                 string += "\(per)\n" | |||
|  |             } | |||
|  |             dlog(string) | |||
|  |         } | |||
|  |     } | |||
|  | } | |||
|  | 
 | |||
|  | // MARK: - Deal Models | |||
|  | /// Deal Models | |||
|  | extension SessionUtil { | |||
|  |     /// 根据类型创建cellModel | |||
|  |     func createCellModelWith(type: SessionCellType) -> SessionBaseModel { | |||
|  |         let model = SessionBaseModel() | |||
|  |         let configType = SessionBaseModel.getContentConfigClass(type: type) | |||
|  |         // 创建配置类 | |||
|  |         model.config = configType.init() | |||
|  |         model.cellType = type | |||
|  |          | |||
|  |         switch type { | |||
|  |         case .image: | |||
|  |             model.shouldShowBubble = false | |||
|  |         case .gift: | |||
|  |             // 卡片 | |||
|  |             model.shouldShowBubble = false | |||
|  |             model.shouldShowCardView = true | |||
|  |         case .timeStamp,.tips, .create, .keyword, .phonecall: | |||
|  |             model.shouldShowBubble = false | |||
|  |             model.shouldShowTips = true | |||
|  |         default: | |||
|  |             // 默认bubble | |||
|  |             model.shouldShowBubble = true | |||
|  |             model.shouldShowTips = false | |||
|  |             break | |||
|  |         } | |||
|  |         return model | |||
|  |     } | |||
|  |      | |||
|  |     func createCellModelWithCustom(attachment:String?) -> SessionBaseModel{ | |||
|  |         let model = SessionBaseModel() | |||
|  |          | |||
|  |         guard let raw = attachment, let data = CodableHelper.decode(IMCustomAttachment.self, from: raw) else{ | |||
|  |             return model | |||
|  |         } | |||
|  |          | |||
|  | //        switch data.type{ | |||
|  | //        case .IMAGE: break | |||
|  | //             | |||
|  | //        } | |||
|  |          | |||
|  |         //let configType = SessionBaseModel.getContentConfigClass(type: type) | |||
|  |          | |||
|  |          | |||
|  |         return model | |||
|  |     } | |||
|  | 
 | |||
|  |     /// 处理查询回来的消息 | |||
|  |     func dealMessages(messages: [V2NIMMessage]?, completion: @escaping ((_ messageDatas: [V2NIMMessage]?, _ error: Error?) -> Void)) { | |||
|  |         var tempModels = modelWithV2(datas: messages!) | |||
|  |         var tempMessages = messages ?? [V2NIMMessage]() | |||
|  |          | |||
|  | //        while tempModels.count < mssagePageSize, messages!.count > 0 { | |||
|  | //            tempMessages = NIMSDK.shared().conversationManager.messages(in: session, message: tempMessages.first, limit: mssagePageSize)! | |||
|  | //            if Array.realEmpty(array: tempMessages) { | |||
|  | //                break | |||
|  | //            } | |||
|  | //            let theModels = modelWith(messsages: tempMessages) | |||
|  | //            tempModels.insert(contentsOf: theModels, at: 0) | |||
|  | //        } | |||
|  |          | |||
|  |          | |||
|  | //        let indexs = insertMessagesWith(models: tempModels.reversed()) | |||
|  |         DispatchQueue.main.async { | |||
|  |             completion( messages, nil) | |||
|  |         } | |||
|  |     } | |||
|  |      | |||
|  |     @discardableResult | |||
|  |     func inserMessageWith(message: V2NIMMessage, atIndex: Int) -> [Int]{ | |||
|  |         let models = modelWithV2(datas: [message]) | |||
|  |         guard let model = models.first else { return [] } | |||
|  |         self.cellModels.insert(model, at: atIndex) | |||
|  |         return [atIndex] | |||
|  |     } | |||
|  |      | |||
|  |     /// 追加model到数据源 | |||
|  |     func appendWith(models: [SessionBaseModel]) -> [Int] { | |||
|  |         if Array.realEmpty(array: models) { | |||
|  |             return [] | |||
|  |         } | |||
|  |          | |||
|  |         let count = cellModels.count | |||
|  |         for model in models { | |||
|  |             if modelIsExist(model: model), !model.isDeriveModel { | |||
|  |                 continue | |||
|  |             } | |||
|  |             _ = appendWith(model: model) | |||
|  |         } | |||
|  |          | |||
|  |         var indexs = [Int]() | |||
|  |         for i in count ..< cellModels.count { | |||
|  |             indexs.append(i) | |||
|  |         } | |||
|  |         return indexs | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /// 追加model到数据源 | |||
|  |     @discardableResult | |||
|  |     func appendWith(model: SessionBaseModel) -> [Int] { | |||
|  |         var indexs = [Int]() | |||
|  |         if shouldAppendTimestamp(model: model) { | |||
|  |             addTimestamp(model: model, index: cellModels.count) | |||
|  |             indexs.append(cellModels.count) | |||
|  |         } | |||
|  |          | |||
|  |         cellModels.insert(model, at: cellModels.count) | |||
|  |         indexs.append(cellModels.count) | |||
|  |         setIdIdctObject(model: model) | |||
|  |          | |||
|  |         return indexs | |||
|  |     } | |||
|  | 
 | |||
|  |     /// 追加model到数据源 | |||
|  |     func addTimestamp(model: SessionBaseModel, index: Int) { | |||
|  |         let timeModel = createCellModelWith(type: .timeStamp) | |||
|  |         timeModel.shouldShowBubble = false | |||
|  |         timeModel.shouldShowTips = true | |||
|  |         timeModel.timeStamp = model.v2msg?.createTime ?? model.timeStamp | |||
|  |         cellModels.insert(timeModel, at: index) | |||
|  |     } | |||
|  |      | |||
|  |     /// 通过消息查找当前model | |||
|  |     func findCellModel(message: V2NIMMessage?) -> SessionBaseModel? { | |||
|  |         guard let messageID = message?.messageClientId else { return nil } | |||
|  |         // 获取字典里的model数据 | |||
|  |         let model = msgIdDict[messageID] | |||
|  |         return model | |||
|  |     } | |||
|  | 
 | |||
|  |     /// 查询model在数据源中的位置index | |||
|  |     func modelIndexWith(model: SessionBaseModel) -> Int? { | |||
|  |         for i in 0 ..< cellModels.count { | |||
|  |             let obj = cellModels[i] | |||
|  |             //if obj.isEqual(model) { | |||
|  |             if obj === model{ | |||
|  |                 return i | |||
|  |             } | |||
|  |         } | |||
|  |         return nil | |||
|  |     } | |||
|  |      | |||
|  |     /// 通过message 追加model 到数据源 | |||
|  |     @discardableResult | |||
|  |     func appendWith(messages: [V2NIMMessage]) -> [Int] { | |||
|  |         let models = modelWithV2(datas: messages) | |||
|  |         // modelWithV2 生成的是反序的 | |||
|  |         let indexs = appendWith(models: models.reversed()) | |||
|  |         return indexs | |||
|  |     } | |||
|  |      | |||
|  |     /// 通过message 更新数据源的 model | |||
|  |     func updateWith(message: V2NIMMessage) -> [Int]? { | |||
|  |         guard let model = findCellModel(message: message) else { return nil } | |||
|  |         guard let index = modelIndexWith(model: model) else { return nil } | |||
|  |          | |||
|  |         var indexs = [Int]() | |||
|  |         indexs.append(index) | |||
|  |         if needDeriveModel(message: message) { | |||
|  |             if index + 1 < cellModels.count { | |||
|  |                 indexs.append(index + 1) | |||
|  |             } | |||
|  |         } | |||
|  |          | |||
|  |         return indexs | |||
|  |     } | |||
|  |      | |||
|  |     // MARK: V2 | |||
|  |     /// [V2NIMMessage] -> [SessionBaseModel] | |||
|  |     func modelWithV2(datas:[V2NIMMessage]) -> [SessionBaseModel]{ | |||
|  |         var array = [SessionBaseModel]() | |||
|  |          | |||
|  |         for i in 0 ..< datas.count { | |||
|  |             let message = datas[i] | |||
|  |              | |||
|  |             if let messageID = message.messageClientId, msgIdDict[messageID] != nil{ | |||
|  |                 // 已经存在了 | |||
|  |                 dlog("☁️⚠️⚠️\(message)已经存在了,应该更新,而不是新创建!⚠️⚠️") | |||
|  |                 continue | |||
|  |             } | |||
|  |              | |||
|  |             if let serverExtension = message.serverExtension, serverExtension.count > 0{ | |||
|  |                 dlog("☁️message___ext___\(serverExtension)") | |||
|  |             } | |||
|  |              | |||
|  |             // Step 通过消息获取初步的cellType | |||
|  |             let info = IMRemoteUtil.dealRemoteInfo(message: message) | |||
|  |              | |||
|  |             // 需要被忽略掉的消息 | |||
|  |             guard !ignore(info: info) else { | |||
|  |                 continue | |||
|  |             } | |||
|  |              | |||
|  |             // Step 通过类型创建对应的cellModel | |||
|  |             if needDecriveModel(with: info)  { // needDeriveModel(message: message) | |||
|  |                 // 从下往上显示: | |||
|  |                 // 消息主体(显示在上面👆cell的上方)// 消息主体 | |||
|  |                 let cellModel = createCellModelWith(type: info.cellType) | |||
|  |                 cellModel.baseRemoteInfo = info | |||
|  |                 cellModel.isDeriveModel = true | |||
|  |                 cellModel.shouldShowLeft = !message.isSelf | |||
|  |                 cellModel.v2msg = message | |||
|  |                 cellModel.timeStamp = message.createTime | |||
|  |                 array.append(cellModel) | |||
|  |                  | |||
|  |                 if message.messageType == .MESSAGE_TYPE_TEXT { | |||
|  |                     if message.isSelf{ | |||
|  |                         let cellModel = createCellModelWith(type: .text) | |||
|  |                         cellModel.baseRemoteInfo = info | |||
|  |                         cellModel.shouldShowLeft = false | |||
|  |                         cellModel.v2msg = message | |||
|  |                         cellModel.timeStamp = message.createTime | |||
|  |                         array.append(cellModel) | |||
|  |                     }else{ | |||
|  |                         let cellModel = createCellModelWith(type: .aimsg) | |||
|  |                         cellModel.baseRemoteInfo = info | |||
|  |                         cellModel.shouldShowLeft = true | |||
|  |                         cellModel.v2msg = message | |||
|  |                         cellModel.timeStamp = message.createTime | |||
|  |                         array.append(cellModel) | |||
|  |                     } | |||
|  |                 } else if message.messageType == .MESSAGE_TYPE_TIP { | |||
|  |                     let cellModel = createCellModelWith(type: .tips) | |||
|  |                     cellModel.baseRemoteInfo = info | |||
|  |                     cellModel.shouldShowLeft = !message.isSelf | |||
|  |                     cellModel.v2msg = message | |||
|  |                     cellModel.timeStamp = message.createTime | |||
|  |                     array.append(cellModel) | |||
|  |                 }else if message.messageType == .MESSAGE_TYPE_CUSTOM{ | |||
|  |                     // 自定义消息,承载很多业务消息类型 | |||
|  |                     if message.isSelf{ | |||
|  |                         let cellModel = createCellModelWith(type: .text) | |||
|  |                         cellModel.baseRemoteInfo = info | |||
|  |                         cellModel.shouldShowLeft = !message.isSelf | |||
|  |                         cellModel.v2msg = message | |||
|  |                         cellModel.timeStamp = message.createTime | |||
|  |                         array.append(cellModel) | |||
|  |                     }else{ | |||
|  |                         if info.cellType != .image{ | |||
|  |                             let cellModel = createCellModelWith(type: .aimsg) | |||
|  |                             cellModel.baseRemoteInfo = info | |||
|  |                             cellModel.shouldShowLeft = !message.isSelf | |||
|  |                             cellModel.v2msg = message | |||
|  |                             cellModel.timeStamp = message.createTime | |||
|  |                             array.append(cellModel) | |||
|  |                         } | |||
|  |                     } | |||
|  |                 } | |||
|  |                  | |||
|  |                  | |||
|  |                              | |||
|  |                  | |||
|  |             } else { | |||
|  |                 // 不需要附加一个cell,正常添加 | |||
|  |                 let cellModel = createCellModelWith(type: info.cellType) | |||
|  |                 cellModel.baseRemoteInfo = info | |||
|  |                 cellModel.shouldShowLeft = !message.isSelf | |||
|  |                 cellModel.v2msg = message | |||
|  |                 cellModel.timeStamp = message.createTime | |||
|  |                 array.append(cellModel) | |||
|  |             } | |||
|  |         } | |||
|  |          | |||
|  |          | |||
|  |         return array | |||
|  |     } | |||
|  |      | |||
|  |     func createAnAILoadingModel(){ | |||
|  |         let cellModel = createCellModelWith(type: .aiLoading) | |||
|  |         cellModel.isDeriveModel = true | |||
|  |         cellModel.shouldShowLeft = true | |||
|  |         cellModel.v2msg = nil | |||
|  |         cellModel.timeStamp = TimeInterval(Date().timeStampInSeconds) | |||
|  |         appendWith(model: cellModel) | |||
|  |     } | |||
|  |      | |||
|  |     func clearAILoadingModel(){ | |||
|  |         cellModels.removeAll(where: {$0.cellType == .aiLoading}) | |||
|  |     } | |||
|  |      | |||
|  |      | |||
|  |     @discardableResult | |||
|  |     func insertMessagesWith(models: [SessionBaseModel]) -> [Int] { | |||
|  |         if Array.realEmpty(array: models) { | |||
|  |             return [] | |||
|  |         } | |||
|  |      | |||
|  |         let count = cellModels.count | |||
|  |          | |||
|  |         for i in 0 ..< models.count { | |||
|  |             let model = models[i] | |||
|  |             if modelIsExist(model: model), !model.isDeriveModel, !model.shouldShowTips { | |||
|  |                 continue | |||
|  |             } | |||
|  |             insertMessageWith(model: model, needTime: cellModels.count != count) | |||
|  |         } | |||
|  |          | |||
|  |         var indexs = [Int]() | |||
|  |         for i in 0 ..< cellModels.count - count { | |||
|  |             indexs.append(i) | |||
|  |         } | |||
|  |         return indexs | |||
|  |     } | |||
|  |      | |||
|  |     /// 插入model到数据源 | |||
|  |     func insertMessageWith(model: SessionBaseModel, needTime: Bool) { | |||
|  |         // 这条消息上面不能有时间戳,下面必须要有时间戳 | |||
|  |         let isCreateTimestampCell = (model.cellType == .create || model.cellType == .tips) | |||
|  |         if isCreateTimestampCell { | |||
|  |             if let theModel = cellModels.first, theModel.cellType != .timeStamp { | |||
|  |                 addTimestamp(model: theModel, index: 0) | |||
|  |             } | |||
|  |         } else { | |||
|  |             if !shouldInsertTimestamp(model: model), needTime { | |||
|  |                 let model = cellModels.first | |||
|  |                 if model?.cellType == .timeStamp { | |||
|  |                     cellModels.removeFirst() | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  |          | |||
|  |         cellModels.insert(model, at: 0) | |||
|  |         setIdIdctObject(model: model) | |||
|  |         if !isCreateTimestampCell { | |||
|  |             addTimestamp(model: model, index: 0) | |||
|  |         } | |||
|  |     } | |||
|  |      | |||
|  |     func loadMessages(completion: @escaping ((_ firstPage: Bool, _ messageDatas: [V2NIMMessage]?, _ error: V2NIMError?) -> Void)){ | |||
|  |         let option = V2NIMMessageListOption() | |||
|  |          | |||
|  |         var loadMoreMsgFlag = false | |||
|  |         if let v2Msg = getLastMessageModel()?.v2msg{ | |||
|  |             option.anchorMessage = v2Msg | |||
|  |             option.beginTime = v2Msg.createTime | |||
|  |             loadMoreMsgFlag = true | |||
|  |         } | |||
|  |          | |||
|  |         option.conversationId = conversationId | |||
|  |         NIMSDK.shared().v2MessageService.getMessageList(option) {[weak self] messages in | |||
|  |             if let models = self?.modelWithV2(datas: messages){ | |||
|  |                 //            self?.cellModels = models | |||
|  |                 self?.insertMessagesWith(models: models) | |||
|  |                 completion(!loadMoreMsgFlag, messages,nil) | |||
|  |             } | |||
|  |         } failure: { error in | |||
|  |             dlog("☁️Get messages error:\(error)") | |||
|  |             completion(!loadMoreMsgFlag, nil,error) | |||
|  |         } | |||
|  | 
 | |||
|  |          | |||
|  |     } | |||
|  | } | |||
|  | 
 | |||
|  | // MARK: - Messages | |||
|  | extension SessionUtil { | |||
|  |     /// 发送消息 | |||
|  |     func sendMessage(message: V2NIMMessage) { | |||
|  |         sendMessage(message: message) { error in | |||
|  |             print(error ?? "") | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /// 发送消息 | |||
|  |     func sendMessage(message: V2NIMMessage, completion: @escaping ((_ error: Error?) -> Void)) { | |||
|  |         // See more params in https://doc.yunxin.163.com/messaging2/client-apis/DAxNjk0Mzc?platform=client#V2NIMSendMessageParams | |||
|  |         let param = V2NIMSendMessageParams() | |||
|  |          | |||
|  |         NIMSDK.shared().v2MessageService.send(message, conversationId: conversationId, params: param) { result in | |||
|  |             dlog("☁️✅send message ok \(message.text ?? "")") | |||
|  |         } failure: { error in | |||
|  |             dlog("☁️❌send message failed: \(error)") | |||
|  |             if error.code == 20000{ | |||
|  |                 CLPurchase.shared.showChatModelsAndIAPEntrySheet() | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  | //        NIMSDK.shared().chatManager.send(message, to: session) { error in | |||
|  | //            completion(error) | |||
|  | //        } | |||
|  |     } | |||
|  | 
 | |||
|  |      | |||
|  | } | |||
|  | 
 | |||
|  | // MARK: - Test | |||
|  | extension SessionUtil{ | |||
|  |     func testModes(completion: @escaping (() -> Void)) { | |||
|  |         var array = [SessionBaseModel]() | |||
|  |         do{ | |||
|  |             let cellModel = createCellModelWith(type: .aimsg) | |||
|  |             cellModel.shouldShowLeft = true | |||
|  |             let msg = V2NIMMessage() | |||
|  |             msg.text = "(Watching her parents toast you respectfully, I feel very uncomfortable. After all, she has been standing on the top of the magic capital since she was a child. She has never seen her parents like this, but should I say that he is really handsome?) Are you?" | |||
|  |             cellModel.v2msg = msg | |||
|  |             cellModel.timeStamp = TimeInterval(Date().timeStamp - 1000) | |||
|  |             array.append(cellModel) | |||
|  |         } | |||
|  |         do{ | |||
|  |             let cellModel = createCellModelWith(type: .text) | |||
|  |             cellModel.shouldShowLeft = false | |||
|  |             let msg = V2NIMMessage() | |||
|  |             msg.text = "who are you" | |||
|  |             cellModel.v2msg = msg | |||
|  |             cellModel.timeStamp = TimeInterval(Date().timeStamp - 500) | |||
|  |             array.append(cellModel) | |||
|  |         } | |||
|  |          | |||
|  |         cellModels = array | |||
|  |          | |||
|  |         completion() | |||
|  |          | |||
|  |     } | |||
|  |      | |||
|  |      | |||
|  | } |