ChatData.lua 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. local ChatData = class("ChatData", require("DataBase"))
  2. local ProtocalDataNormal = require("ProtocalDataNormal")
  3. local maxPrivateNum = 10
  4. local maxLimit = 100
  5. local maxGuildLimit = 100
  6. local privateChatPersistentSystem
  7. local loggedin = true
  8. function ChatData:ctor()
  9. self.data = {}
  10. end
  11. function ChatData:Init()
  12. loggedin = true
  13. self.data.chatDatas = {}
  14. self.data.offlineInfos = {}
  15. self.data.chatDatas.worldChats = {}
  16. self.data.chatDatas.guildChats = {}
  17. self.data.chatDatas.privateChatMap = {}
  18. self.data.chatDatas.privateSortChats = {}
  19. self.data.systemDatas = {}
  20. self.data.channelType = nil
  21. local welcomeSystemData = {}
  22. welcomeSystemData.type = 0
  23. welcomeSystemData.isSystem = true
  24. welcomeSystemData.nickname = "ChatNotice03"
  25. welcomeSystemData.sendTime = 0
  26. table.insert(self.data.systemDatas, 1, welcomeSystemData)
  27. table.insert(self.data.chatDatas.worldChats, 1, welcomeSystemData)
  28. if Constant.OpenSystemLink then
  29. ManagerContainer.LuaTimerMgr:AddTimer(5000, 1, self, self.AddSdkLink, nil)
  30. end
  31. if not privateChatPersistentSystem then
  32. privateChatPersistentSystem = require("PrivateChatPersistentSystem"):new()
  33. end
  34. self:ResetPersistentPrivateInfos()
  35. end
  36. local function TimeSortChat(a,b)
  37. return a.message.sendTime < b.message.sendTime
  38. end
  39. local function TimeSortSystem(a,b)
  40. local sendTimeA = a.sendTime or a.message.sendTime
  41. local sendTimeB = b.sendTime or b.message.sendTime
  42. return sendTimeA < sendTimeB
  43. end
  44. local function IsInList(data, list)
  45. for k,v in pairs(list) do
  46. if v.fromData.uid == tostring(data.uid) then
  47. return true, k
  48. end
  49. end
  50. return false, nil
  51. end
  52. function ChatData:InitOfflineTalkTargetIds(roleChat)
  53. if roleChat == nil then return end
  54. local offlineDatas = roleChat.offline_msg_player_list
  55. for _,v in pairs(offlineDatas) do
  56. local result, idx = IsInList(v, self.data.chatDatas.privateSortChats)
  57. local offlineData = ProtocalDataNormal.ParseChatPlayerBriefInfo(v)
  58. if not result then
  59. self.data.offlineInfos[#self.data.offlineInfos + 1] = offlineData
  60. local data = {}
  61. data.fromData = offlineData
  62. data.chats = {}
  63. data.isNew = true
  64. table.insert(self.data.chatDatas.privateSortChats, 1, data)
  65. if self.data.chatDatas.privateChatMap[offlineData.uid] == nil then
  66. self.data.chatDatas.privateChatMap[offlineData.uid] = {}
  67. end
  68. self.data.chatDatas.privateChatMap[offlineData.uid] = data
  69. else
  70. local data = self.data.chatDatas.privateSortChats[idx]
  71. data.fromData = offlineData
  72. data.isNew = true
  73. self.data.offlineInfos[#self.data.offlineInfos + 1] = offlineData
  74. end
  75. end
  76. self:CheckHasNewPrivateChat()
  77. end
  78. function ChatData:ResetPersistentPrivateInfos()
  79. local infos = privateChatPersistentSystem:GetSortPrivateInfos()
  80. if infos == nil then return end
  81. for i = 1, #self.data.offlineInfos do
  82. local offlineData = self.data.offlineInfos[i]
  83. for k,v in pairs(infos) do
  84. if offlineData.uid == v.uid then
  85. local data = privateChatPersistentSystem:GetPrivatePersistentChatById(v.uid)
  86. if data == nil then
  87. data = {}
  88. data.fromData = v
  89. data.chats = {}
  90. end
  91. self.data.chatDatas.privateSortChats[i] = data
  92. if self.data.chatDatas.privateChatMap[v.uid] == nil then
  93. self.data.chatDatas.privateChatMap[v.uid] = {}
  94. end
  95. self.data.chatDatas.privateChatMap[v.uid] = data
  96. table.remove(infos, k)
  97. break
  98. end
  99. end
  100. end
  101. if #self.data.chatDatas.privateSortChats < maxPrivateNum then
  102. local count = #self.data.chatDatas.privateSortChats
  103. local num = maxPrivateNum - #self.data.chatDatas.privateSortChats
  104. for i = 1, num do
  105. if infos[i] == nil then
  106. break
  107. end
  108. local data = privateChatPersistentSystem:GetPrivatePersistentChatById(infos[i].uid)
  109. if data == nil then
  110. data = {}
  111. data.fromData = infos[i]
  112. data.chats = {}
  113. end
  114. self.data.chatDatas.privateSortChats[count + i] = data
  115. if self.data.chatDatas.privateChatMap[infos[i].uid] == nil then
  116. self.data.chatDatas.privateChatMap[infos[i].uid] = {}
  117. end
  118. self.data.chatDatas.privateChatMap[infos[i].uid] = data
  119. end
  120. end
  121. for _,v in pairs(self.data.chatDatas.privateSortChats) do
  122. for _,v1 in pairs(v.chats) do
  123. if v1.message.subType == Enum.ChatSubType.Expedition then
  124. local curTime = ManagerContainer.LuaTimerMgr:GetTimeSecond()
  125. local isOneDay = ManagerContainer.LuaTimerMgr:TwoTimeSecondBetweenOneDay(v1.message.sendTime, curTime)
  126. if not isOneDay then
  127. v1.message.used = true
  128. end
  129. end
  130. end
  131. end
  132. privateChatPersistentSystem:SetMapDatasAndSortDatas(self.data.chatDatas.privateChatMap, self.data.chatDatas.privateSortChats)
  133. end
  134. function ChatData:SortPrivateChatWithTime(key, newData, IsSort)
  135. local oldKey, oldData
  136. for k, v in pairs(self.data.chatDatas.privateSortChats) do
  137. if v.fromData.uid == key then
  138. oldData = v
  139. oldKey = k
  140. break
  141. end
  142. end
  143. if oldData ~= nil then
  144. table.remove(self.data.chatDatas.privateSortChats, oldKey)
  145. if not IsSort then
  146. table.insert(self.data.chatDatas.privateSortChats, 1, newData)
  147. else
  148. table.insert(self.data.chatDatas.privateSortChats,newData)
  149. end
  150. else
  151. table.insert(self.data.chatDatas.privateSortChats,newData)
  152. end
  153. end
  154. function ChatData:AddNewChatData(data)
  155. local chatDatas = self.data.chatDatas
  156. if data.type == Enum.ChatDataType.World then
  157. --世界聊天
  158. local chatData = ProtocalDataNormal.ParseChatData(data)
  159. self:AddOneWorldChatData(chatData)
  160. elseif data.type == Enum.ChatDataType.Guild then
  161. --公会聊天
  162. local chatData = ProtocalDataNormal.ParseChatData(data)
  163. self:AddOneWorldChatData(chatData)
  164. self:AddOneGuildChatData(chatData)
  165. elseif data.type == Enum.ChatDataType.Private then
  166. --私聊
  167. if chatDatas.privateChatMap == nil then
  168. chatDatas.privateChatMap = {}
  169. end
  170. local chat = ProtocalDataNormal.ParseChatData(data)
  171. if chatDatas.privateChatMap[chat.fromData.uid] == nil then
  172. chatDatas.privateChatMap[chat.fromData.uid] = {}
  173. end
  174. local privateDatas = chatDatas.privateChatMap[chat.fromData.uid]
  175. privateDatas.isNew = true
  176. privateDatas.fromData = chat.fromData
  177. if privateDatas.chats == nil then
  178. privateDatas.chats = {}
  179. end
  180. table.insert(privateDatas.chats, chat)
  181. if #privateDatas.chats > 1 then
  182. table.sort(privateDatas.chats, TimeSortChat)
  183. end
  184. self:SortPrivateChatWithTime(chat.fromData.uid, chatDatas.privateChatMap[chat.fromData.uid],true)
  185. self:CheckChatCountLimit(privateDatas.chats)
  186. self:CheckPrivateChatsLimit()
  187. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_PRIVATE_CHAT, 1, chat.fromData.uid)
  188. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.PrivateChat, true)
  189. end
  190. end
  191. function ChatData:ExpeditionHelpAck(targetUid, msgType)
  192. if msgType == Enum.ExpeditionHelpSource.Private then
  193. self:SendPrivateChat(I18N.T("ExpeditionHelp3"), targetUid)
  194. else
  195. local chatDatas = self.data.chatDatas
  196. if chatDatas.guildChats == nil then
  197. chatDatas.guildChats = {}
  198. end
  199. local nickname = ""
  200. for _,v in pairs(chatDatas.guildChats) do
  201. if v.type == Enum.ChatDataType.Guild and v.fromData.uid == tostring(targetUid) then
  202. nickname = v.fromData.nickname
  203. break
  204. end
  205. end
  206. local content = I18N.SetLanguageValue("ExpeditionHelp5", CommonUtil.GetVaildNickName(nickname))
  207. self:SendChatReq(content, Enum.ChatDataType.Guild)
  208. end
  209. end
  210. function ChatData:AddOneWorldChatData(chatData)
  211. if not chatData then return end
  212. local chatDatas = self.data.chatDatas
  213. if chatDatas.worldChats == nil then
  214. chatDatas.worldChats = {}
  215. end
  216. table.insert(chatDatas.worldChats, chatData)
  217. self:CheckTableCountLimit(chatDatas.worldChats, maxLimit)
  218. self.data.worldDirty = true
  219. end
  220. function ChatData:AddOneGuildChatData(chatData)
  221. if not chatData then return end
  222. local chatDatas = self.data.chatDatas
  223. if chatDatas.guildChats == nil then
  224. chatDatas.guildChats = {}
  225. end
  226. table.insert(chatDatas.guildChats, chatData)
  227. self:CheckTableCountLimit(chatDatas.guildChats, maxGuildLimit)
  228. self.data.guildDirty = true
  229. end
  230. function ChatData:ClearGuildChatData()
  231. local guildChats = self.data.chatDatas.guildChats
  232. if not guildChats then
  233. return
  234. end
  235. local worldChats = self.data.chatDatas.worldChats
  236. if worldChats then
  237. local offset = #worldChats
  238. for i = #guildChats, 1, -1 do
  239. local guildChat = guildChats[i]
  240. if guildChat then
  241. for j = offset, 1, -1 do
  242. if guildChat == worldChats[j] then
  243. table.remove(worldChats, j)
  244. self.data.worldDirty = true
  245. offset = j - 1
  246. break
  247. end
  248. end
  249. end
  250. end
  251. end
  252. self.data.chatDatas.guildChats = nil
  253. self.data.guildDirty = true
  254. self:SendEvents()
  255. end
  256. function ChatData:SendEvents()
  257. if self.data.worldDirty then
  258. self.data.worldDirty = false
  259. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_WOLRD_CHAT, Enum.ChatChannel.World)
  260. end
  261. if self.data.guildDirty then
  262. self.data.guildDirty = false
  263. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_WOLRD_CHAT, Enum.ChatChannel.Guild)
  264. end
  265. if self.data.systemDirty then
  266. self.data.systemDirty = false
  267. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_WOLRD_CHAT, Enum.ChatChannel.System)
  268. end
  269. end
  270. function ChatData:CheckHasNewPrivateChat()
  271. local result = false
  272. for _,v in pairs(self.data.chatDatas.privateChatMap) do
  273. if v.isNew then
  274. result = true
  275. break
  276. end
  277. end
  278. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.PrivateChat, result)
  279. end
  280. function ChatData:NeedQueryOfflinePrivateInfo(fromData)
  281. for k,v in pairs(self.data.offlineInfos) do
  282. if v.uid == fromData.uid then
  283. self.data.offlineInfos[k] = nil
  284. return true
  285. end
  286. end
  287. return false
  288. end
  289. function ChatData:GetWorldChatDatas()
  290. return self.data.chatDatas.worldChats
  291. end
  292. function ChatData:GetGuildChatDatas()
  293. return self.data.chatDatas.guildChats
  294. end
  295. function ChatData:GetPrivateSortChatDatas()
  296. return self.data.chatDatas.privateSortChats
  297. end
  298. function ChatData:RemovePrivateChatData(idx)
  299. local data = table.remove(self.data.chatDatas.privateSortChats, idx)
  300. if data then
  301. self.data.chatDatas.privateChatMap[data.fromData.uid] = nil
  302. privateChatPersistentSystem:RemovePrivateBriefInfo(data.fromData)
  303. end
  304. end
  305. function ChatData:GetPrivateChatDataMap()
  306. return self.data.chatDatas.privateChatMap
  307. end
  308. function ChatData:GetTargetIdxInSortedDatas(fromData)
  309. for k,v in pairs(self.data.chatDatas.privateSortChats) do
  310. if v.fromData.uid == fromData.uid then
  311. v.fromData.imgId = fromData.imgId
  312. v.fromData.nickname = fromData.nickname
  313. v.fromData.headFrameId = fromData.headFrameId
  314. v.fromData.jobId = fromData.jobId
  315. v.fromData.level = fromData.level
  316. v.fromData.sex = fromData.sex
  317. return k
  318. end
  319. end
  320. local data = privateChatPersistentSystem:GetPrivatePersistentChatById(fromData.uid)
  321. if data == nil then
  322. data = {}
  323. data.isNew = false
  324. data.fromData = fromData
  325. data.chats = {}
  326. end
  327. table.insert(self.data.chatDatas.privateSortChats, 1, data)
  328. self.data.chatDatas.privateChatMap[fromData.uid] = data
  329. self:CheckChatCountLimit(data.chats)
  330. self:CheckPrivateChatsLimit()
  331. return 1
  332. end
  333. function ChatData:CheckPrivateChatsLimit()
  334. if #self.data.chatDatas.privateSortChats > maxPrivateNum then
  335. for i = #self.data.chatDatas.privateSortChats, 11 do
  336. self:RemovePrivateChatData(i)
  337. end
  338. end
  339. end
  340. function ChatData:CheckChatCountLimit(chats)
  341. if #chats > maxLimit then
  342. local num = #chats - maxLimit
  343. for i = 1, num do
  344. table.remove(chats, 1)
  345. end
  346. end
  347. end
  348. function ChatData:CheckTableCountLimit(ls, limit)
  349. if #ls > limit then
  350. local num = #ls - limit
  351. for i = 1, num do
  352. table.remove(ls, 1)
  353. end
  354. end
  355. end
  356. function ChatData:AddOfflinePrivateChat(data)
  357. local targetData = ProtocalDataNormal.ParseChatPlayerBriefInfo(data.target_player)
  358. local datas = self.data.chatDatas.privateChatMap[targetData.uid]
  359. if datas == nil then
  360. datas = {}
  361. end
  362. datas.fromData = targetData
  363. if datas.chats == nil then
  364. datas.chats = {}
  365. end
  366. for _, v in pairs(data.msg_list) do
  367. local data1 = {}
  368. data1.fromData = targetData
  369. data1.message = ProtocalDataNormal.ParseChatMessageInfo(v)
  370. data1.type = 1
  371. datas.chats[#datas.chats + 1] = data1
  372. end
  373. if #datas.chats > 1 then
  374. table.sort(datas.chats, TimeSortChat)
  375. end
  376. local key = 1
  377. for k, v in pairs(self.data.chatDatas.privateSortChats) do
  378. if v.fromData.uid == targetData.uid then
  379. self.data.chatDatas.privateSortChats[k] = datas
  380. key = k
  381. break
  382. end
  383. end
  384. self:CheckChatCountLimit(datas.chats)
  385. self:CheckPrivateChatsLimit()
  386. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_PRIVATE_CHAT, key)
  387. end
  388. function ChatData:AddPrivateChatBack(data)
  389. local targetUid = tostring(data.target_id)
  390. local chat = {}
  391. chat.fromData = {}
  392. chat.fromData.uid = tostring(ManagerContainer.DataMgr.UserData:GetUserId())
  393. chat.fromData.nickname = ManagerContainer.DataMgr.UserData:GetUserNickname()
  394. chat.fromData.imgId = ManagerContainer.DataMgr.UserData:GetUserHeadIcon()
  395. chat.fromData.sex = ManagerContainer.DataMgr.UserData:GetSex()
  396. chat.type = 1
  397. chat.message = ProtocalDataNormal.ParseChatMessageInfo(data.message)
  398. local datas = self.data.chatDatas.privateChatMap[targetUid]
  399. if datas == nil then
  400. datas = {}
  401. self.data.chatDatas.privateChatMap[targetUid] = datas
  402. end
  403. if datas.chats == nil then
  404. datas.chats = {}
  405. end
  406. table.insert(datas.chats, chat)
  407. if not datas.fromData then
  408. datas.fromData = {}
  409. datas.fromData.uid = targetUid
  410. end
  411. if #datas.chats > 1 then
  412. table.sort(datas.chats, TimeSortChat)
  413. end
  414. self:SortPrivateChatWithTime(datas.fromData.uid, self.data.chatDatas.privateChatMap[datas.fromData.uid])
  415. local key = 1
  416. if #self.data.chatDatas.privateSortChats == 0 then
  417. self.data.chatDatas.privateSortChats[1] = datas
  418. else
  419. for k, v in pairs(self.data.chatDatas.privateSortChats) do
  420. if v.fromData.uid == targetUid then
  421. self.data.chatDatas.privateSortChats[k] = datas
  422. key = k
  423. break
  424. end
  425. end
  426. end
  427. self:CheckChatCountLimit(datas.chats)
  428. self:CheckPrivateChatsLimit()
  429. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_PRIVATE_CHAT, key)
  430. end
  431. function ChatData:AddNewSystemData(datas, needSort)
  432. if datas == nil then return end
  433. if self.data.systemDatas == nil then
  434. self.data.systemDatas = {}
  435. end
  436. for _, v in pairs(datas) do
  437. local systemData = ProtocalDataNormal.ParseSystemMessageData(v)
  438. local needSkip = false
  439. local type = systemData.type
  440. if type == Enum.ChatSystemType.Item and systemData.paramIds then
  441. local sourceType = systemData.paramIds[3]
  442. local sourceItemId = systemData.paramIds[4]
  443. if not sourceType or (sourceType == Enum.DropSource.Gift and sourceItemId ~= 514) then
  444. needSkip = true
  445. end
  446. elseif type == Enum.ChatSystemType.Competition and systemData.paramIds then
  447. local score = systemData.paramIds[1] or 0
  448. if score >= 101 and score < 401 then
  449. needSkip = true
  450. end
  451. end
  452. if not needSkip then
  453. systemData.isSystem = true
  454. if systemData.type == Enum.ChatSystemType.Guild then
  455. self:AddOneGuildChatData(systemData)
  456. else
  457. self.data.systemDatas[#self.data.systemDatas + 1] = systemData
  458. self.data.systemDirty = true
  459. self:AddOneWorldChatData(systemData)
  460. end
  461. end
  462. end
  463. if needSort then
  464. if #self.data.systemDatas > 1 then
  465. table.sort(self.data.systemDatas, TimeSortSystem)
  466. end
  467. end
  468. end
  469. function ChatData:AddLocalNewSystemData(content)
  470. if self.data.systemDatas == nil then
  471. self.data.systemDatas = {}
  472. end
  473. local systemData = {}
  474. systemData.type = 0
  475. systemData.isSystem = true
  476. systemData.nickname = content
  477. local time = ManagerContainer.LuaTimerMgr:GetTimeSecond()
  478. systemData.sendTime = time
  479. self.data.systemDatas[#self.data.systemDatas + 1] = systemData
  480. self.data.systemDirty = true
  481. self:AddOneWorldChatData(systemData)
  482. self:SendEvents()
  483. end
  484. function ChatData:GetSystemDatas()
  485. return self.data.systemDatas
  486. end
  487. function ChatData:RefreshChatTargetBriefInfo(briefInfos)
  488. for k, v in pairs(self.data.chatDatas.privateSortChats) do
  489. for _,v1 in pairs(briefInfos) do
  490. if v.fromData.uid == tostring(v1.uid) then
  491. v.fromData.nickname = v1.nick_name
  492. v.fromData.imgId = CommonUtil.GetPlayerHeadIcon(v1)
  493. v.fromData.headFrameId = v1.head_frame_id
  494. v.fromData.jobId = v1.config_id
  495. v.fromData.level = v1.level
  496. v.fromData.onlineState = v1.online_state
  497. v.fromData.sex = v1.gender
  498. end
  499. end
  500. end
  501. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_PRIVATE_BRIEFINFO)
  502. end
  503. function ChatData:SendChatReq(content, chatDataType)
  504. content = StringUtil.TrimEdgeSpace(content)
  505. local data = {type = chatDataType, message = {message = content}}
  506. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_CHAT_MESSAGE_REQ, data)
  507. end
  508. function ChatData:SendPrivateChat(content, targetId)
  509. content = StringUtil.TrimEdgeSpace(content)
  510. local data = {type = 1, message = {message = content}, target_id = int64.new(targetId)}
  511. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_CHAT_MESSAGE_REQ, data)
  512. end
  513. function ChatData:RegisterNetEvents()
  514. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_CHAT_OFFLINE_PLAYER_NTF, function(data)
  515. self:InitOfflineTalkTargetIds(data.offline_player_list)
  516. end)
  517. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_CHAT_MESSAGE_NTF, function(data)
  518. for _,v in pairs(data.msg_list) do
  519. self:AddNewChatData(v)
  520. end
  521. self:AddNewSystemData(data.s_msg_list)
  522. if loggedin then
  523. loggedin = false
  524. self:SortWorldChats()
  525. if self.data.systemDatas and #self.data.systemDatas > 1 then
  526. table.sort(self.data.systemDatas, TimeSortSystem)
  527. end
  528. --for k,v in pairs(self.data.chatDatas.worldChats) do
  529. -- local sendTimeA = v.sendTime or v.message.sendTime
  530. -- v.time = os.date('%yyyy-%m-%d %H:%M:%S', tostring(sendTimeA))
  531. --end
  532. --LogHRWarning(Inspect(self.data.chatDatas.worldChats))
  533. end
  534. self:SendEvents()
  535. end)
  536. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_SYSTEM_MESSAGE_NTF, function(data)
  537. self:AddNewSystemData(data.sys_msg, true)
  538. self:SendEvents()
  539. end)
  540. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_CHAT_MESSAGE_ACK, function(data)
  541. if data.error == Enum.NetErrorCode.ERROR_OK or data.error == Enum.NetErrorCode.ERROR_CHAT_WORLD_TARGET_OFFLINE then
  542. if data.type == 1 then
  543. --自己 的私聊返回
  544. self:AddPrivateChatBack(data)
  545. end
  546. end
  547. end)
  548. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_CHAT_OFFLINE_MSG_ACK, function(data)
  549. if data.error == Enum.NetErrorCode.ERROR_OK then
  550. self:AddOfflinePrivateChat(data)
  551. end
  552. end)
  553. end
  554. function ChatData:SortWorldChats()
  555. if self.data.chatDatas.worldChats and #self.data.chatDatas.worldChats > 1 then
  556. table.sort(self.data.chatDatas.worldChats, TimeSortSystem)
  557. end
  558. end
  559. function ChatData:SavePrivateDatas()
  560. if privateChatPersistentSystem then
  561. privateChatPersistentSystem:SavePrivateChats()
  562. end
  563. end
  564. function ChatData:Save()
  565. if privateChatPersistentSystem ~= nil then
  566. privateChatPersistentSystem:Dispose()
  567. privateChatPersistentSystem = nil
  568. end
  569. end
  570. function ChatData:Clear()
  571. self:Save()
  572. self.data = {}
  573. end
  574. function ChatData:Destroy()
  575. self.data = {}
  576. self:UnRegisterNetEvents()
  577. end
  578. function ChatData:UnRegisterNetEvents()
  579. end
  580. function ChatData:SetChatChannelType(type)
  581. self.data.channelType = type
  582. end
  583. function ChatData:GetChatChannelType()
  584. return self.data.channelType or Enum.ChatChannel.World
  585. end
  586. function ChatData:AddSdkLink()
  587. local SdkLinkSystemData = {}
  588. SdkLinkSystemData.type = Enum.ChatSystemType.SdkLink
  589. SdkLinkSystemData.isSystem = true
  590. SdkLinkSystemData.nickname = "SdkLinkTxt"
  591. SdkLinkSystemData.sendTime = 0
  592. --if #self.data.systemDatas >1 then
  593. -- local lastData = self.data.systemDatas[#self.data.systemDatas]
  594. --SdkLinkSystemData.sendTime = lastData.sendTime + 1
  595. --end
  596. table.insert(self.data.systemDatas, #self.data.systemDatas + 1, SdkLinkSystemData)
  597. table.insert(self.data.chatDatas.worldChats, #self.data.chatDatas.worldChats + 1, SdkLinkSystemData)
  598. end
  599. return ChatData