| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- //
- // JCMessage.swift
- // JChat
- //
- // Created by deng on 10/04/2017.
- // Copyright © 2017 HXHG. All rights reserved.
- //
- import UIKit
- import JMessage
- open class JCMessage: NSObject, JCMessageType {
- init(content: JCMessageContentType) {
- self.content = content
- self.options = JCMessageOptions(with: content)
- super.init()
- }
-
- public let identifier: UUID = .init()
- open var msgId = ""
- open var name: String = "UserName"
- open var date: Date = .init()
- open var sender: JMSGUser?
- open var senderAvator: UIImage?
- open var receiver: JMSGUser?
- open var content: JCMessageContentType
- public let options: JCMessageOptions
- open var updateSizeIfNeeded: Bool = false
- open var unreadCount: Int = 0
- open var targetType: MessageTargetType = .single
- }
- extension JMSGMessage {
- typealias Callback = (JMSGMessage, Data) -> Void
- func parseMessage(_ delegate: JCMessageDelegate, _ updateMediaMessage: Callback? = nil) -> JCMessage {
- var msg: JCMessage!
- let currentUser = JMSGUser.myInfo()
- let isCurrent = fromUser.isEqual(to: currentUser)
- let state = self.ex.state
- let isGroup = targetType == .group
- switch(contentType) {
- case .text:
- if ex.isBusinessCard {
- let businessCardContent = JCBusinessCardContent()
- businessCardContent.delegate = delegate
- businessCardContent.appKey = ex.businessCardAppKey
- businessCardContent.userName = ex.businessCardName
- msg = JCMessage(content: businessCardContent)
- } else {
- let content = self.content as! JMSGTextContent
- msg = JCMessage(content: JCMessageTextContent(text: content.text))
- }
- case .image:
- let content = self.content as! JMSGImageContent
- let imageContent = JCMessageImageContent()
- imageContent.imageSize = content.imageSize
- if ex.isLargeEmoticon {
- imageContent.imageSize = CGSize(width: content.imageSize.width / 3, height: content.imageSize.height / 3)
- }
- if state == .sending {
- content.uploadHandler = { (percent:Float, msgId:(String?)) -> Void in
- imageContent.upload?(percent)
- }
- }
- imageContent.delegate = delegate
- msg = JCMessage(content: imageContent)
- if let path = content.thumbImageLocalPath {
- let image = UIImage(contentsOfFile: path)
- imageContent.image = image
- msg.content = imageContent
- } else {
- content.thumbImageData({ (data, id, error) in
- if let data = data {
- if let updateMediaMessage = updateMediaMessage {
- updateMediaMessage(self, data)
- }
- }
- })
- }
- case .eventNotification:
- let content = self.content as! JMSGEventContent
- let noticeContent = JCMessageNoticeContent(text: content.showEventNotification())
- msg = JCMessage(content: noticeContent)
- msg.options.showsTips = false
- case .voice:
- let content = self.content as! JMSGVoiceContent
- let voiceContent = JCMessageVoiceContent()
- voiceContent.duration = TimeInterval(content.duration.intValue)
- voiceContent.delegate = delegate
- msg = JCMessage(content: voiceContent)
- content.voiceData({ (data, id, error) in
- if let data = data {
- voiceContent.data = data
- }
- })
- case .file:
- let content = self.content as! JMSGFileContent
- if ex.isShortVideo {
- let videoContent = JCMessageVideoContent()
- videoContent.delegate = delegate
- msg = JCMessage(content: videoContent)
- if let path = content.originMediaLocalPath {
- let url = URL(fileURLWithPath: path)
- videoContent.data = try! Data(contentsOf: url)
- } else {
- content.fileData({ (data, id, error) in
- if let data = data {
- if let updateMediaMessage = updateMediaMessage {
- updateMediaMessage(self, data)
- }
- }
- })
- }
- videoContent.fileContent = content
- } else {
- let fileContent = JCMessageFileContent()
- fileContent.delegate = delegate
- fileContent.fileName = content.fileName
- fileContent.fileType = ex.fileType
- fileContent.fileSize = ex.fileSize
- if let path = content.originMediaLocalPath {
- let url = URL(fileURLWithPath: path)
- fileContent.data = try! Data(contentsOf: url)
- }
- msg = JCMessage(content: fileContent)
- }
- case .location:
- let content = self.content as! JMSGLocationContent
- let locationContent = JCMessageLocationContent()
- locationContent.address = content.address
- locationContent.lat = content.latitude.doubleValue
- locationContent.lon = content.longitude.doubleValue
- locationContent.delegate = delegate
- msg = JCMessage(content: locationContent)
- case .prompt:
- let content = self.content as! JMSGPromptContent
- let noticeContent = JCMessageNoticeContent(text: content.promptText)
- msg = JCMessage(content: noticeContent)
- msg.options.showsTips = false
- default:
- msg = JCMessage(content: JCMessageNoticeContent.unsupport)
- }
- if msg.options.alignment != .center {
- msg.options.alignment = isCurrent ? .right : .left
- if isGroup {
- msg.options.showsCard = !isCurrent
- }
- }
- if isGroup {
- msg.targetType = .group
- } else {
- msg.targetType = .single
- }
- msg.msgId = self.msgId
- msg.options.state = state
- if isCurrent {
- msg.senderAvator = UIImage.getMyAvator()
- }
- msg.sender = fromUser
- msg.name = fromUser.displayName()
- msg.unreadCount = getUnreadCount()
- return msg
- }
- }
|