JCMessage.swift 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. //
  2. // JCMessage.swift
  3. // JChat
  4. //
  5. // Created by deng on 10/04/2017.
  6. // Copyright © 2017 HXHG. All rights reserved.
  7. //
  8. import UIKit
  9. import JMessage
  10. open class JCMessage: NSObject, JCMessageType {
  11. init(content: JCMessageContentType) {
  12. self.content = content
  13. self.options = JCMessageOptions(with: content)
  14. super.init()
  15. }
  16. public let identifier: UUID = .init()
  17. open var msgId = ""
  18. open var name: String = "UserName"
  19. open var date: Date = .init()
  20. open var sender: JMSGUser?
  21. open var senderAvator: UIImage?
  22. open var receiver: JMSGUser?
  23. open var content: JCMessageContentType
  24. public let options: JCMessageOptions
  25. open var updateSizeIfNeeded: Bool = false
  26. open var unreadCount: Int = 0
  27. open var targetType: MessageTargetType = .single
  28. }
  29. extension JMSGMessage {
  30. typealias Callback = (JMSGMessage, Data) -> Void
  31. func parseMessage(_ delegate: JCMessageDelegate, _ updateMediaMessage: Callback? = nil) -> JCMessage {
  32. var msg: JCMessage!
  33. let currentUser = JMSGUser.myInfo()
  34. let isCurrent = fromUser.isEqual(to: currentUser)
  35. let state = self.ex.state
  36. let isGroup = targetType == .group
  37. switch(contentType) {
  38. case .text:
  39. if ex.isBusinessCard {
  40. let businessCardContent = JCBusinessCardContent()
  41. businessCardContent.delegate = delegate
  42. businessCardContent.appKey = ex.businessCardAppKey
  43. businessCardContent.userName = ex.businessCardName
  44. msg = JCMessage(content: businessCardContent)
  45. } else {
  46. let content = self.content as! JMSGTextContent
  47. msg = JCMessage(content: JCMessageTextContent(text: content.text))
  48. }
  49. case .image:
  50. let content = self.content as! JMSGImageContent
  51. let imageContent = JCMessageImageContent()
  52. imageContent.imageSize = content.imageSize
  53. if ex.isLargeEmoticon {
  54. imageContent.imageSize = CGSize(width: content.imageSize.width / 3, height: content.imageSize.height / 3)
  55. }
  56. if state == .sending {
  57. content.uploadHandler = { (percent:Float, msgId:(String?)) -> Void in
  58. imageContent.upload?(percent)
  59. }
  60. }
  61. imageContent.delegate = delegate
  62. msg = JCMessage(content: imageContent)
  63. if let path = content.thumbImageLocalPath {
  64. let image = UIImage(contentsOfFile: path)
  65. imageContent.image = image
  66. msg.content = imageContent
  67. } else {
  68. content.thumbImageData({ (data, id, error) in
  69. if let data = data {
  70. if let updateMediaMessage = updateMediaMessage {
  71. updateMediaMessage(self, data)
  72. }
  73. }
  74. })
  75. }
  76. case .eventNotification:
  77. let content = self.content as! JMSGEventContent
  78. let noticeContent = JCMessageNoticeContent(text: content.showEventNotification())
  79. msg = JCMessage(content: noticeContent)
  80. msg.options.showsTips = false
  81. case .voice:
  82. let content = self.content as! JMSGVoiceContent
  83. let voiceContent = JCMessageVoiceContent()
  84. voiceContent.duration = TimeInterval(content.duration.intValue)
  85. voiceContent.delegate = delegate
  86. msg = JCMessage(content: voiceContent)
  87. content.voiceData({ (data, id, error) in
  88. if let data = data {
  89. voiceContent.data = data
  90. }
  91. })
  92. case .file:
  93. let content = self.content as! JMSGFileContent
  94. if ex.isShortVideo {
  95. let videoContent = JCMessageVideoContent()
  96. videoContent.delegate = delegate
  97. msg = JCMessage(content: videoContent)
  98. if let path = content.originMediaLocalPath {
  99. let url = URL(fileURLWithPath: path)
  100. videoContent.data = try! Data(contentsOf: url)
  101. } else {
  102. content.fileData({ (data, id, error) in
  103. if let data = data {
  104. if let updateMediaMessage = updateMediaMessage {
  105. updateMediaMessage(self, data)
  106. }
  107. }
  108. })
  109. }
  110. videoContent.fileContent = content
  111. } else {
  112. let fileContent = JCMessageFileContent()
  113. fileContent.delegate = delegate
  114. fileContent.fileName = content.fileName
  115. fileContent.fileType = ex.fileType
  116. fileContent.fileSize = ex.fileSize
  117. if let path = content.originMediaLocalPath {
  118. let url = URL(fileURLWithPath: path)
  119. fileContent.data = try! Data(contentsOf: url)
  120. }
  121. msg = JCMessage(content: fileContent)
  122. }
  123. case .location:
  124. let content = self.content as! JMSGLocationContent
  125. let locationContent = JCMessageLocationContent()
  126. locationContent.address = content.address
  127. locationContent.lat = content.latitude.doubleValue
  128. locationContent.lon = content.longitude.doubleValue
  129. locationContent.delegate = delegate
  130. msg = JCMessage(content: locationContent)
  131. case .prompt:
  132. let content = self.content as! JMSGPromptContent
  133. let noticeContent = JCMessageNoticeContent(text: content.promptText)
  134. msg = JCMessage(content: noticeContent)
  135. msg.options.showsTips = false
  136. default:
  137. msg = JCMessage(content: JCMessageNoticeContent.unsupport)
  138. }
  139. if msg.options.alignment != .center {
  140. msg.options.alignment = isCurrent ? .right : .left
  141. if isGroup {
  142. msg.options.showsCard = !isCurrent
  143. }
  144. }
  145. if isGroup {
  146. msg.targetType = .group
  147. } else {
  148. msg.targetType = .single
  149. }
  150. msg.msgId = self.msgId
  151. msg.options.state = state
  152. if isCurrent {
  153. msg.senderAvator = UIImage.getMyAvator()
  154. }
  155. msg.sender = fromUser
  156. msg.name = fromUser.displayName()
  157. msg.unreadCount = getUnreadCount()
  158. return msg
  159. }
  160. }