ChatData.lua 22 KB

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