String+JChat.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. //
  2. // JCString+JChat.swift
  3. // JChat
  4. //
  5. // Created by deng on 2017/2/16.
  6. // Copyright © 2017年 HXHG. All rights reserved.
  7. //
  8. import UIKit
  9. public enum JCFileFormat: Int {
  10. case document
  11. case video
  12. case voice
  13. case photo
  14. case other
  15. }
  16. extension String {
  17. static func getTodayYesterdayString(_ theDate:Date) -> String {
  18. let formatter = DateFormatter()
  19. let locale:Locale = Locale(identifier: "zh")
  20. formatter.locale = locale
  21. formatter.dateStyle = .short
  22. formatter.timeStyle = .none
  23. formatter.doesRelativeDateFormatting = true
  24. return formatter.string(from: theDate)
  25. }
  26. static func getPastDateString(_ theDate:Date) -> String {
  27. let formatter = DateFormatter()
  28. let locale:Locale = Locale(identifier: "zh")
  29. formatter.locale = locale
  30. formatter.dateStyle = .long
  31. formatter.timeStyle = .none
  32. formatter.doesRelativeDateFormatting = true
  33. return formatter.string(from: theDate)
  34. }
  35. static func getFriendlyDateString(_ timeInterval:TimeInterval, forConversation isShort:Bool) -> String {
  36. let theDate:Date = Date(timeIntervalSince1970: timeInterval)
  37. var output = ""
  38. let theDiff = -theDate.timeIntervalSinceNow
  39. switch theDiff {
  40. case theDiff where theDiff < 60.0:
  41. output = "刚刚"
  42. break
  43. case theDiff where theDiff < 60 * 60:
  44. let minute:Int = Int(theDiff/60)
  45. output = "\(minute)分钟前"
  46. break
  47. default:
  48. let formatter:DateFormatter = DateFormatter()
  49. let locale:Locale = Locale(identifier: "zh")
  50. formatter.locale = locale
  51. var isTodayYesterday = false
  52. var isPastLong = false
  53. if theDate.isToday() {
  54. formatter.dateFormat = FORMAT_TODAY
  55. } else if theDate.isYesterday() {
  56. formatter.dateFormat = FORMAT_YESTERDAY
  57. isTodayYesterday = true
  58. } else if theDate.isThisWeek() {
  59. if isShort {
  60. formatter.dateFormat = FORMAT_THIS_WEEK_SHORT
  61. } else {
  62. formatter.dateFormat = FORMAT_THIS_WEEK
  63. }
  64. } else {
  65. if isShort {
  66. formatter.dateFormat = FORMAT_PAST_SHORT
  67. } else {
  68. formatter.dateFormat = FORMAT_PAST_TIME
  69. isPastLong = true
  70. }
  71. }
  72. if isTodayYesterday {
  73. let todayYesterday = String.getTodayYesterdayString(theDate)
  74. if isShort {
  75. output = todayYesterday
  76. } else {
  77. output = formatter.string(from: theDate)
  78. output = "\(todayYesterday) \(output)"
  79. }
  80. } else {
  81. output = formatter.string(from: theDate)
  82. if isPastLong {
  83. let thePastDate = String.getPastDateString(theDate)
  84. output = "\(thePastDate) \(output)"
  85. }
  86. }
  87. break
  88. }
  89. return output
  90. }
  91. static func conversationIdWithConversation(_ conversation:JMSGConversation) -> String {
  92. var conversationId = ""
  93. if !conversation.ex.isGroup {
  94. let user = conversation.target as! JMSGUser
  95. conversationId = "\(user.username)_0"
  96. } else {
  97. let group = conversation.target as! JMSGGroup
  98. conversationId = "\(group.gid)_1"
  99. }
  100. return conversationId
  101. }
  102. }
  103. extension String {
  104. static func errorAlert(_ error: NSError) -> String {
  105. var errorAlert: String = ""
  106. if error.code > 860000 {
  107. let errorcode = JMSGSDKErrorCode(rawValue: Int(error.code))
  108. switch errorcode! as JMSGSDKErrorCode{
  109. case .jmsgErrorSDKNetworkDownloadFailed:
  110. errorAlert = "下载失败"
  111. break
  112. case .jmsgErrorSDKNetworkUploadFailed:
  113. errorAlert = "上传资源文件失败"
  114. break
  115. case .jmsgErrorSDKNetworkUploadTokenVerifyFailed:
  116. errorAlert = "上传资源文件Token验证失败"
  117. break
  118. case .jmsgErrorSDKNetworkUploadTokenGetFailed:
  119. errorAlert = "获取服务器Token失败"
  120. break
  121. case .jmsgErrorSDKDBDeleteFailed:
  122. errorAlert = "数据库删除失败"
  123. break
  124. case .jmsgErrorSDKDBUpdateFailed:
  125. errorAlert = "数据库更新失败"
  126. break
  127. case .jmsgErrorSDKDBSelectFailed:
  128. errorAlert = "数据库查询失败"
  129. break
  130. case .jmsgErrorSDKDBInsertFailed:
  131. errorAlert = "数据库插入失败"
  132. break
  133. case .jmsgErrorSDKParamAppkeyInvalid:
  134. errorAlert = "appkey不合法"
  135. break
  136. case .jmsgErrorSDKParamUsernameInvalid:
  137. errorAlert = "用户名不合法"
  138. break
  139. case .jmsgErrorSDKParamPasswordInvalid:
  140. errorAlert = "用户密码不合法"
  141. break
  142. case .jmsgErrorSDKUserNotLogin:
  143. errorAlert = "用户没有登录"
  144. break
  145. case .jmsgErrorSDKNotMediaMessage:
  146. errorAlert = "这不是一条媒体消息"
  147. break
  148. case .jmsgErrorSDKMediaResourceMissing:
  149. errorAlert = "下载媒体资源路径或者数据意外丢失"
  150. break
  151. case .jmsgErrorSDKMediaCrcCodeIllegal:
  152. errorAlert = "媒体CRC码无效"
  153. break
  154. case .jmsgErrorSDKMediaCrcVerifyFailed:
  155. errorAlert = "媒体CRC校验失败"
  156. break
  157. case .jmsgErrorSDKMediaUploadEmptyFile:
  158. errorAlert = "上传媒体文件时, 发现文件不存在"
  159. break
  160. case .jmsgErrorSDKParamContentInvalid:
  161. errorAlert = "无效的消息内容"
  162. break
  163. case .jmsgErrorSDKParamMessageNil:
  164. errorAlert = "空消息"
  165. break
  166. case .jmsgErrorSDKMessageNotPrepared:
  167. errorAlert = "消息不符合发送的基本条件检查"
  168. break
  169. case .jmsgErrorSDKParamConversationTypeUnknown:
  170. errorAlert = "未知的会话类型"
  171. break
  172. case .jmsgErrorSDKParamConversationUsernameInvalid:
  173. errorAlert = "会话 username 无效"
  174. break
  175. case .jmsgErrorSDKParamConversationGroupIdInvalid:
  176. errorAlert = "会话 groupId 无效"
  177. break
  178. case .jmsgErrorSDKParamGroupGroupIdInvalid:
  179. errorAlert = "groupId 无效"
  180. break
  181. case .jmsgErrorSDKParamGroupGroupInfoInvalid:
  182. errorAlert = "group 相关字段无效"
  183. break
  184. case .jmsgErrorSDKMessageNotInGroup:
  185. errorAlert = "你已不在该群,无法发送消息"
  186. break
  187. // case 810009:
  188. // errorAlert = "超出群上限"
  189. // break
  190. default:
  191. break
  192. }
  193. }
  194. if error.code > 800000 && error.code < 820000 {
  195. let errorcode = JMSGTcpErrorCode(rawValue: UInt(error.code))
  196. switch errorcode! {
  197. case .errorTcpUserNotRegistered:
  198. errorAlert = "用户名不存在"
  199. break
  200. case .errorTcpUserPasswordError:
  201. errorAlert = "用户名或密码错误"
  202. break
  203. default:
  204. break
  205. }
  206. if error.code == 809002 || error.code == 812002 {
  207. errorAlert = "你已不在该群"
  208. }
  209. }
  210. if error.code < 600 {
  211. let errorcode = JMSGHttpErrorCode(rawValue: UInt(error.code))
  212. switch errorcode! {
  213. case .errorHttpServerInternal:
  214. errorAlert = "服务器端内部错误"
  215. break
  216. case .errorHttpUserExist:
  217. errorAlert = "用户已经存在"
  218. break
  219. case .errorHttpUserNotExist:
  220. errorAlert = "用户不存在"
  221. break
  222. case .errorHttpPrameterInvalid:
  223. errorAlert = "参数无效"
  224. break
  225. case .errorHttpPasswordError:
  226. errorAlert = "密码错误"
  227. break
  228. case .errorHttpUidInvalid:
  229. errorAlert = "内部UID 无效"
  230. break
  231. case .errorHttpMissingAuthenInfo:
  232. errorAlert = "Http 请求没有验证信息"
  233. break
  234. case .errorHttpAuthenticationFailed:
  235. errorAlert = "Http 请求验证失败"
  236. break
  237. case .errorHttpAppkeyNotExist:
  238. errorAlert = "Appkey 不存在"
  239. break
  240. case .errorHttpTokenExpired:
  241. errorAlert = "Http 请求 token 过期"
  242. break
  243. case .errorHttpServerResponseTimeout:
  244. errorAlert = "服务器端响应超时"
  245. break
  246. default:
  247. break
  248. }
  249. }
  250. if error.code == 869999 {
  251. errorAlert = "网络连接错误"
  252. }
  253. if error.code == 898001 {
  254. errorAlert = "用户名已存在"
  255. }
  256. if error.code == 801006 {
  257. errorAlert = "账号已被禁用"
  258. }
  259. if errorAlert == "" {
  260. errorAlert = "未知错误"
  261. }
  262. return errorAlert
  263. }
  264. }
  265. extension String {
  266. var length: Int {
  267. return self.count
  268. }
  269. var isContainsChinese: Bool {
  270. let chineseRegex = "^(.*)[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+(.*)$"
  271. let chinesePredicate = NSPredicate(format: "SELF MATCHES %@", chineseRegex)
  272. if chinesePredicate.evaluate(with: self) {
  273. return true
  274. }
  275. return false
  276. }
  277. var isExpectations: Bool {
  278. let regularExpression = "^([a-zA-Z0-9])[a-zA-Z0-9@_\\-\\.]+$"
  279. let predicate = NSPredicate(format: "SELF MATCHES %@", regularExpression)
  280. if predicate.evaluate(with: self) {
  281. return true
  282. }
  283. return false
  284. }
  285. public func trim(trimNewline: Bool = false) ->String {
  286. if trimNewline {
  287. return self.trimmingCharacters(in: .whitespacesAndNewlines)
  288. }
  289. return self.trimmingCharacters(in: .whitespaces)
  290. }
  291. public func py() -> String {
  292. let mutableString = NSMutableString(string: self)
  293. //把汉字转为拼音
  294. CFStringTransform(mutableString, nil, kCFStringTransformToLatin, false)
  295. //去掉拼音的音标
  296. CFStringTransform(mutableString, nil, kCFStringTransformStripDiacritics, false)
  297. let py = String(mutableString)
  298. return py
  299. }
  300. public func firstCharacter() -> String {
  301. let firstCharacter = String(describing: self.first!)
  302. if firstCharacter.isLetterOrNum() {
  303. return firstCharacter.uppercased()
  304. }
  305. let py = String(describing: firstCharacter.py().first!)
  306. return py.uppercased()
  307. }
  308. public func isLetterOrNum() -> Bool {
  309. if let value = UnicodeScalar(self)?.value {
  310. if value >= 65 && value <= 90 {
  311. return true
  312. }
  313. }
  314. return false
  315. }
  316. static func getRecorderPath() -> String {
  317. var recorderPath:String? = nil
  318. let now:Date = Date()
  319. let dateFormatter = DateFormatter()
  320. dateFormatter.dateFormat = "yy-MMMM-dd"
  321. recorderPath = "\(NSHomeDirectory())/Documents/"
  322. dateFormatter.dateFormat = "yyyy-MM-dd-hh-mm-ss"
  323. recorderPath?.append("\(dateFormatter.string(from: now))-MySound.ilbc")
  324. return recorderPath!
  325. }
  326. func fileFormat() -> JCFileFormat {
  327. let docFormat = ["ppt", "pptx", "doc", "docx", "pdf", "xls", "xlsx", "txt", "wps"]
  328. let videoFormat = ["mp4", "mov", "rm", "rmvb", "wmv", "avi", "3gp", "mkv"]
  329. let voiceFormat = ["wav", "mp3", "wma", "midi"]
  330. let photoFormat = ["jpg", "jpeg", "png", "bmp", "gif"]
  331. if docFormat.contains(self) {
  332. return .document
  333. }
  334. if videoFormat.contains(self) {
  335. return .video
  336. }
  337. if voiceFormat.contains(self) {
  338. return .voice
  339. }
  340. if photoFormat.contains(self) {
  341. return .photo
  342. }
  343. return .other
  344. }
  345. }