IdolData.lua 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. local IdolData = class("IdolData", require("DataBase"))
  2. local BitUtil = require("BitUtil")
  3. local PlayerInfoReqLimit = 10
  4. local PlayerInfoMaxLimit = 50
  5. local hotValShowLimit = 0
  6. local ProtocalDataNormal = require("ProtocalDataNormal")
  7. function IdolData:ctor()
  8. PlayerInfoMaxLimit = GlobalConfig.Instance:GetConfigIntValue(343) or 50
  9. hotValShowLimit = GlobalConfig.Instance:GetConfigIntValue(345) or 0
  10. self.feedbackRP = false
  11. self.showDataList = {}
  12. self.idolRankInfo = {}
  13. self.idolRankLength = 0
  14. self.idolFansLength = 0
  15. self.idolFansInfo = {}
  16. self.fansRewardInfo = {}
  17. self.RankInfoReqLimit = PlayerInfoMaxLimit
  18. self.FansInfoReqLimit = PlayerInfoMaxLimit
  19. self.rankListReqPage = 1
  20. self.rewardRankListReqPage = 1
  21. end
  22. function IdolData:ClearIdolRankInfos()
  23. self.idolRankInfo = nil
  24. self.rankList = nil
  25. self.rankListReqPage = 1
  26. end
  27. function IdolData:ClearIdolFansRankInfos()
  28. self.rewardRankList = nil
  29. self.fansRewardInfo = nil
  30. self.idolFansInfo = nil
  31. self.rewardRankListReqPage = 1
  32. end
  33. function IdolData:ClearTempPlayerBirefInfos()
  34. self.tempPlayerBirefInfos = nil
  35. end
  36. function IdolData:InitRewardData(data)
  37. self.showDataList = self:InitDetailData(data.detail_list,data.vote_list)
  38. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_RANK_MODEL_INFO)
  39. local rewards = data.day_reward or {}
  40. local firstState = false
  41. local secondState = false
  42. for i = 1, #rewards do
  43. if rewards[i] == 1 then
  44. firstState = true
  45. elseif rewards[i] == 2 then
  46. secondState = true
  47. end
  48. end
  49. self.TimeList = {{data.first_begin,data.first_end,firstState},{data.second_begin,data.second_end,secondState}}
  50. self.feedbackRP = data.has_box_reward
  51. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_DAYS_REWARD_INFO)
  52. end
  53. function IdolData:InitDetailData(detail_list,vote_list)
  54. local list = {}
  55. if detail_list and vote_list then
  56. local showList = {}
  57. local uids = {}
  58. for i = 1, #detail_list do
  59. if not showList[detail_list[i].uid] then
  60. showList[detail_list[i].uid] = {}
  61. end
  62. local roleBase = detail_list[i].role_base
  63. local heroData = roleBase.role_data.hero_data
  64. showList[detail_list[i].uid].roleCfgId = CommonUtil.JobIdToRoleId(heroData.config_id, roleBase.sex)
  65. showList[detail_list[i].uid].viewData = ProtocalDataNormal.FashionDataToViewData(roleBase.fashion_data)
  66. local extGoesShowData = {}
  67. if heroData.skill_equip_slot and heroData.skill_equip_slot.slot_list then
  68. local curSkillEquipData = heroData.skill_equip_slot.slot_list[1]
  69. if curSkillEquipData then
  70. extGoesShowData[Enum.HeroExtGoesShowType.God_Art] = curSkillEquipData.skill_equip_config_id
  71. end
  72. end
  73. showList[detail_list[i].uid].extGoesShowData = extGoesShowData
  74. showList[detail_list[i].uid].nickName = CommonUtil.GetVaildNickName(roleBase.nick_name)
  75. table.insert(uids,detail_list[i].uid)
  76. end
  77. local selfUid = ManagerContainer.DataMgr.UserData:GetUserId()
  78. for i = 1, #vote_list do
  79. if not showList[vote_list[i].uid] then
  80. showList[vote_list[i].uid] = {}
  81. end
  82. showList[vote_list[i].uid].vote_list = vote_list[i]
  83. if vote_list[i].uid == selfUid then
  84. ManagerContainer.DataMgr.CompetitionData:SetRankAndScore(vote_list[i])
  85. end
  86. end
  87. for k, v in pairs(showList) do
  88. table.insert(list,v)
  89. end
  90. table.sort(list,function(a, b)
  91. return a.vote_list.rank < b.vote_list.rank
  92. end)
  93. self.isCanSendInfoReq = true
  94. self:SendIdolInfoReq(Enum.FriendTogglePageType.TempPlayerBirefInfos,uids)
  95. end
  96. return list
  97. end
  98. function IdolData:OnGetPlayerVoteInfoAck(data)
  99. if data.error == 0 then
  100. if data.idol_rank_data and self.VoteInfoUid and data.idol_rank_data.uid == self.VoteInfoUid then
  101. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_SUPPORTTIPSVIEW,data.idol_rank_data)
  102. end
  103. end
  104. end
  105. function IdolData:ClearVoteInfoUid()
  106. self.VoteInfoUid = nil
  107. end
  108. function IdolData:GetVoteInfoUid()
  109. return self.VoteInfoUid
  110. end
  111. function IdolData:OnSureSupport(logicData) --确认投票
  112. local num = logicData[1]
  113. local uid = logicData[2]
  114. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_COMPETITION_ON_VOTE_REQ, { ticket_count = num,uid = uid})
  115. end
  116. function IdolData:RegisterNetEvents()
  117. ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.IDOL_GET_OTHER_PLAYER_BRIEF_INFO_ACK,self,self.OnIdolPlayerBriefInfoAck)
  118. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_COMPETITION_FANS_DAY_REWARD_ACK, self.OnDayRewardAck,self)
  119. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_COMPETITION_SELF_FANS_INFO_ACK, self.OnSelfFansInfoAck,self)
  120. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_COMPETITION_VOTE_RANK_ACK, self.OnVoteRankAck,self)
  121. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_COMPETITION_FANS_REWARD_RANK_ACK, self.OnFansRewardRankAck,self)
  122. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_COMPETITION_FANS_GET_REWARD_ACK, self.OnGetFansRewardAck,self)
  123. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_COMPETITION_ON_VOTE_ACK, self.OnVoteAck,self)
  124. ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_COMPETITION_GET_PLAYER_VOTE_RANK_ACK, self.OnGetPlayerVoteInfoAck,self)
  125. end
  126. function IdolData:UnRegisterNetEvents()
  127. ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_COMPETITION_FANS_DAY_REWARD_ACK)
  128. ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_COMPETITION_SELF_FANS_INFO_ACK)
  129. ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_COMPETITION_VOTE_RANK_ACK)
  130. ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_COMPETITION_FANS_REWARD_RANK_ACK)
  131. ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_COMPETITION_FANS_GET_REWARD_ACK)
  132. ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_COMPETITION_ON_VOTE_ACK)
  133. ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_COMPETITION_GET_PLAYER_VOTE_RANK_ACK)
  134. end
  135. function IdolData:OnVoteAck(data)
  136. if data.error == 0 then
  137. if data.detail and #data.detail > 0 and data.vote_list and #data.vote_list > 0 then
  138. self.showDataList = self:InitDetailData(data.detail,data.vote_list)
  139. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_RANK_MODEL_INFO)
  140. end
  141. local selfUid = ManagerContainer.DataMgr.UserData:GetUserId()
  142. if data.vote_target.uid == selfUid then
  143. ManagerContainer.DataMgr.CompetitionData:SetRankAndScore(data.vote_target)
  144. end
  145. if data.vote_target.rank > 0 and self.rankList then
  146. local index = nil
  147. for i = 1, #self.rankList do
  148. if self.rankList[i].uid == data.vote_target.uid then
  149. index = i
  150. break
  151. end
  152. end
  153. if index then
  154. table.remove(self.rankList,index)
  155. end
  156. if data.vote_target.rank <= #self.rankList then
  157. table.insert(self.rankList, data.vote_target.rank, data.vote_target)
  158. else
  159. table.insert(self.rankList,data.vote_target)
  160. end
  161. for i = 1, #self.rankList do
  162. self.rankList[i].rank = i
  163. if self.rankList[i].uid == selfUid then
  164. ManagerContainer.DataMgr.CompetitionData:SetRankAndScore(self.rankList[i])
  165. end
  166. end
  167. end
  168. local limti = self:GetRankInfoLimit()
  169. if self.rankList and #self.rankList > limti then
  170. for i = limti + 1, #self.rankList do
  171. table.remove(self.rankList,i)
  172. end
  173. end
  174. local rewardData = data.reward_data
  175. if self.fansRewardInfo and rewardData and #rewardData > 0 then
  176. for i = 1, #rewardData do
  177. if not self.fansRewardInfo[rewardData[i].key] then
  178. self.fansRewardInfo[rewardData[i].key] = {}
  179. end
  180. self.fansRewardInfo[rewardData[i].key].hotVal = rewardData[i].value
  181. local rewardState = {}
  182. local val = rewardData[i].value2
  183. local len = ManagerContainer.CfgMgr:GetAidouluCfgLength()
  184. for i = 1, len do
  185. rewardState[i] = BitUtil.RshiftNumBandOne(val, i - 1) == 1
  186. end
  187. self.fansRewardInfo[rewardData[i].key].rewardState = rewardState
  188. end
  189. end
  190. local currTicket = data.ticket_count
  191. if currTicket > 0 and currTicket < hotValShowLimit then
  192. ManagerContainer.LuaUIMgr:ErrorNoticeDisplay("SupportSucessTips")
  193. else
  194. ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.IdolSuccessTips)
  195. end
  196. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_VOTE_VIEW_INFO)
  197. end
  198. end
  199. function IdolData:OnVoteRankAck(data)
  200. if data.error == 0 then
  201. if not self.rankList then
  202. self.rankList = {}
  203. end
  204. local rankList = data.rank_data
  205. local uids = {}
  206. for i = 1, #rankList do
  207. table.insert(self.rankList,rankList[i])
  208. table.insert(uids,rankList[i].uid)
  209. end
  210. self.rankListReqPage = self.rankListReqPage + 1
  211. if data.is_end then
  212. self.RankInfoReqLimit = self.rankList and #self.rankList or 0
  213. if data.page == 1 then
  214. --通知排行界面改变
  215. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_IDOL_RANK_PLAYER_RANK_INFO)
  216. end
  217. end
  218. self.isCanSendInfoReq = true
  219. self:SendIdolInfoReq(Enum.FriendTogglePageType.IdolRankInfo,uids)
  220. end
  221. end
  222. function IdolData:OnFansRewardRankAck(data)
  223. if data.error == 0 then
  224. if not self.rewardRankList then
  225. self.rewardRankList = {}
  226. self.rewardRankListReqPage = 1
  227. end
  228. if data.page == 1 and data.reward_data then
  229. if not self.fansRewardInfo then
  230. self.fansRewardInfo = {}
  231. end
  232. local info = self.fansRewardInfo
  233. local rewardData = data.reward_data
  234. if rewardData and #rewardData > 0 then
  235. for i = 1, #rewardData do
  236. if not info[rewardData[i].key] then
  237. info[rewardData[i].key] = {}
  238. end
  239. info[rewardData[i].key].hotVal = rewardData[i].value
  240. local rewardState = {}
  241. local val = rewardData[i].value2
  242. local len = ManagerContainer.CfgMgr:GetAidouluCfgLength()
  243. for i = 1, len do
  244. rewardState[i] = BitUtil.RshiftNumBandOne(val, i - 1) == 1
  245. end
  246. info[rewardData[i].key].rewardState = rewardState
  247. end
  248. end
  249. end
  250. local rankList = data.data_list
  251. local uids = {}
  252. for i = 1, #rankList do
  253. table.insert(self.rewardRankList,rankList[i])
  254. table.insert(uids,rankList[i].uid)
  255. end
  256. self.rewardRankListReqPage = self.rewardRankListReqPage + 1
  257. if data.is_end then
  258. self.FansInfoReqLimit = self.rewardRankList and #self.rewardRankList or 0
  259. if data.page == 1 then
  260. --通知回馈界面改变
  261. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_IDOL_FANS_PLAYER_RANK_INFO)
  262. end
  263. end
  264. self.isCanSendInfoReq = true
  265. self:SendIdolInfoReq(Enum.FriendTogglePageType.IdolFansInfo,uids)
  266. end
  267. end
  268. function IdolData:OnGetFansRewardAck(data)
  269. if data.error == 0 then
  270. if self.fansRewardInfo then
  271. if self.fansRewardInfo[data.uid] then
  272. local rewardState = {}
  273. local val = data.reward_flag
  274. local len = ManagerContainer.CfgMgr:GetAidouluCfgLength()
  275. for i = 1, len do
  276. rewardState[i] = BitUtil.RshiftNumBandOne(val, i - 1) == 1
  277. end
  278. self.fansRewardInfo[data.uid].rewardState = rewardState
  279. if data.reward_list and #data.reward_list > 0 then
  280. local rewards = {}
  281. for key, value in pairs(data.reward_list) do
  282. table.insert(rewards,{cfgId = value.key, num = value.value})
  283. end
  284. ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIPOPGot,{rewards = rewards})
  285. end
  286. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_FASN_REWARD_INFO)
  287. end
  288. end
  289. end
  290. end
  291. --粉丝排行票数请求
  292. function IdolData:SendGetPlayerVoteRankReq(uid)
  293. self.VoteInfoUid = uid
  294. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_COMPETITION_GET_PLAYER_VOTE_RANK_REQ, {uid = uid})
  295. end
  296. --粉丝领回馈请求
  297. function IdolData:SendFansGetRewardReq(uid)
  298. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_COMPETITION_FANS_GET_REWARD_REQ, {uid = uid})
  299. end
  300. --粉丝得票排行请求
  301. function IdolData:SendGetVoteRankInfoReq()
  302. if not self.rankListReqPage then
  303. self.rankListReqPage = 1
  304. end
  305. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_COMPETITION_VOTE_RANK_REQ, {page = self.rankListReqPage})
  306. end
  307. --回馈宝箱数据请求
  308. function IdolData:SendGetGiftRankInfoReq()
  309. if not self.rewardRankListReqPage then
  310. self.rewardRankListReqPage = 1
  311. end
  312. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_COMPETITION_FANS_REWARD_RANK_REQ, {page = self.rewardRankListReqPage})
  313. end
  314. --获取自己粉丝数据请求
  315. function IdolData:SendGetSelfFansInfoReq()
  316. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_COMPETITION_SELF_FANS_INFO_REQ)
  317. end
  318. --分批请求玩家数据
  319. function IdolData:SendIdolInfoReq(type,uids)
  320. if self.isCanSendInfoReq then
  321. self.isCanSendInfoReq = false
  322. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_GET_OTHER_PLAYER_BRIEF_INFO_REQ, {type = type,player_list=uids})
  323. end
  324. end
  325. function IdolData:OnSelfFansInfoAck(data)
  326. if data.error == 0 then
  327. self.fansVoteList = data.fan_list
  328. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_IDOL_MYFANS_INFO)
  329. end
  330. end
  331. function IdolData:OnDayRewardAck(data)
  332. if data.error == 0 then
  333. if self.TimeList and self.TimeList[data.id] then
  334. self.TimeList[data.id][3] = true
  335. end
  336. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_DAYS_REWARD_INFO)
  337. end
  338. end
  339. function IdolData:OnIdolPlayerBriefInfoAck(data)
  340. self.isCanSendInfoReq = true
  341. if not data then
  342. return
  343. end
  344. if data.type == Enum.FriendTogglePageType.IdolRankInfo then
  345. if not self.idolRankInfo then
  346. self.idolRankInfo = {}
  347. self.idolRankLength = 0
  348. end
  349. local brief_info = data.brief_info
  350. if brief_info and #brief_info > 0 then
  351. local list = self.idolRankInfo
  352. for i = 1, #brief_info do
  353. local info = brief_info[i]
  354. if not list[info.uid] then
  355. self.idolRankLength = self.idolRankLength + 1
  356. end
  357. list[info.uid] = info
  358. end
  359. end
  360. --通知排行界面改变
  361. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_IDOL_RANK_PLAYER_RANK_INFO)
  362. elseif data.type == Enum.FriendTogglePageType.IdolFansInfo then
  363. if not self.idolFansInfo then
  364. self.idolFansInfo = {}
  365. self.idolFansLength = 0
  366. end
  367. local brief_info = data.brief_info
  368. if brief_info and #brief_info > 0 then
  369. local list = self.idolFansInfo
  370. for i = 1, #brief_info do
  371. local info = brief_info[i]
  372. if not list[info.uid] then
  373. self.idolFansLength = self.idolFansLength + 1
  374. end
  375. list[info.uid] = info
  376. end
  377. end
  378. --通知回馈界面改变
  379. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_IDOL_FANS_PLAYER_RANK_INFO)
  380. elseif data.type == Enum.FriendTogglePageType.TempPlayerBirefInfos then
  381. if not self.tempPlayerBirefInfos then
  382. self.tempPlayerBirefInfos = {}
  383. end
  384. local brief_info = data.brief_info
  385. if brief_info and #brief_info > 0 then
  386. local list = self.tempPlayerBirefInfos
  387. for i = 1, #brief_info do
  388. local info = brief_info[i]
  389. list[info.uid] = info
  390. end
  391. end
  392. end
  393. end
  394. function IdolData:GetRankInfoLimit()
  395. return self.RankInfoReqLimit or PlayerInfoMaxLimit
  396. end
  397. function IdolData:GetGiftInfoLimit()
  398. return self.FansInfoReqLimit or PlayerInfoMaxLimit
  399. end
  400. function IdolData:GetIdolGiftInfos()
  401. return self.rewardRankList or {}
  402. end
  403. function IdolData:GetRankInfosLength()
  404. return self.idolRankLength or 0
  405. end
  406. function IdolData:GetGiftInfosLength()
  407. return self.idolFansLength or 0
  408. end
  409. function IdolData:GetMyFansData()
  410. return self.fansVoteList or {}
  411. end
  412. function IdolData:GetRankInfoData()
  413. local tab = {}
  414. if self.rankList and #self.rankList > 0 then
  415. for i = 1, #self.rankList do
  416. table.insert(tab,self.rankList[i])
  417. end
  418. end
  419. return tab
  420. end
  421. function IdolData:GetRedState()
  422. return self.feedbackRP or false
  423. end
  424. function IdolData:SetRedState(flag)
  425. self.feedbackRP = flag
  426. end
  427. function IdolData:GetRewardsTimeList()
  428. return self.TimeList or nil
  429. end
  430. function IdolData:GetFansInfoLimit()
  431. return self.FansInfoReqLimit or 0
  432. end
  433. function IdolData:GetShowDataList()
  434. return self.showDataList or {}
  435. end
  436. function IdolData:GetFansRewardInfoByUid(uid)
  437. return self.fansRewardInfo and self.fansRewardInfo[uid]
  438. end
  439. function IdolData:GetPlayerBriefInfoByUid(uid)
  440. if self.idolRankInfo and self.idolRankInfo[uid] then
  441. return self.idolRankInfo and self.idolRankInfo[uid]
  442. end
  443. if self.idolFansInfo and self.idolFansInfo[uid] then
  444. return self.idolFansInfo and self.idolFansInfo[uid]
  445. end
  446. if self.tempPlayerBirefInfos and self.tempPlayerBirefInfos[uid] then
  447. return self.tempPlayerBirefInfos and self.tempPlayerBirefInfos[uid]
  448. end
  449. return nil
  450. end
  451. function IdolData:Clear()
  452. self.feedbackRP = nil
  453. self.showDataList = nil
  454. self.idolRankInfo = nil
  455. self.idolRankLength = nil
  456. self.idolFansLength = nil
  457. self.idolFansInfo = nil
  458. self.RankInfoReqLimit = nil
  459. self.FansInfoReqLimit = nil
  460. self.rankListReqPage = nil
  461. self.rewardRankListReqPage = nil
  462. end
  463. function IdolData:Destroy()
  464. if self.Clear then
  465. self:Clear()
  466. end
  467. self:UnRegisterNetEvents()
  468. end
  469. return IdolData