orm_helper.go 88 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807
  1. package model
  2. import (
  3. "encoding/base64"
  4. "errors"
  5. "math/rand"
  6. "rocommon"
  7. "rocommon/service"
  8. "rocommon/util"
  9. "roserver/baseserver/model"
  10. "roserver/baseserver/set"
  11. "roserver/serverproto"
  12. "runtime/debug"
  13. "strconv"
  14. "strings"
  15. )
  16. const (
  17. //角色列表信息前缀
  18. AccountPrefix = "account_" //[key-value]
  19. //玩家基础信息数据库前缀
  20. RoleBasePrefix = "role_" //[key-value]
  21. //玩家伙伴信息数据库前缀
  22. RoleHeroDataPrefix = "role_hero_" //field为hero的动态id [hmap]
  23. //装备前缀
  24. RoleEquipDataPrefix = "role_equip_" //暂时作为一个整体存放
  25. //神器前缀
  26. RoleSkillEquipDataPrefix = "role_skill_equip_" //暂时作为一个整体存放
  27. RoleSkillEquipDataPrefix_base = "base"
  28. RoleSkillEquipDataPrefix_list = "skill_equip"
  29. //背包前缀
  30. RoleBagDataPrefix = "role_bag_"
  31. //伙伴碎片前缀
  32. RoleChipDataPrefix = "role_chip_"
  33. //角色AOI地图前缀
  34. RoleMapDataPrefix = "role_map_"
  35. //卡片数据
  36. RoleCardDataPrefix = "role_card_"
  37. //时装数据
  38. RoleFashionDataPrefix = "role_fashion_"
  39. //战斗数据
  40. RoleBattleDataPrefix = "role_battle_"
  41. //任务
  42. RoleTaskDataPrefix = "role_task_"
  43. //困难模式任务
  44. RoleTaskDataHardPrefix = "role_task_hard"
  45. //困难模式任务
  46. RoleTaskDataHard2Prefix = "role_task_hard2"
  47. //竞技场数据
  48. RoleArenaDataPrefix = "role_arena_"
  49. //小红点
  50. RoleRedDataPrefix = "role_red_"
  51. //邮件
  52. RoleMailDataPrefix = "role_mail_"
  53. //competition赛季玩法数据
  54. RoleCompetitionDataPrefix = "role_comp_"
  55. //商店数据
  56. RoleShopDataPrefix = "role_shop_"
  57. //活动
  58. RoleActivityDataPrefix = "role_activity_"
  59. //爬塔
  60. RoleTowerDataPrefix = "role_tower_"
  61. //公会
  62. RoleGuildDataPrefix = "role_guild_"
  63. //重名处理
  64. RoleNickNamePrefix = "role_nickname_"
  65. //玩家简介信息
  66. RolePlayerBriefPrefix = "role_Brief_"
  67. //离线缓存消息
  68. RoleChatOfflineMsgPrefix = "chat:offline" //self_target
  69. //玩家抽卡信息
  70. RoleDrawDataPrefix = "role_draw_"
  71. //卢恩商店信息
  72. RoleRuneDataPrefix = "role_rune_"
  73. //统计数据
  74. RoleStatisticDataPrefix = "role_Statistic_"
  75. //信物
  76. RoleKeepSakeDataPrefix = "role_keepsake_"
  77. //上阵玩家/宠物属性
  78. RoleBattleAttrPrefix = "role_bttle_attr_"
  79. //冲榜数据
  80. RoleRushDataPrefix = "role_rush_"
  81. //跨服数据
  82. //远航试炼
  83. RoleCrossPrefix = "role_cross_"
  84. //称号数据
  85. RoleHeadDataPrefix = "role_head_"
  86. //称号数据
  87. RoleWishBoxDataPrefix = "role_WishBox_"
  88. //social
  89. //用来存储搜索默认名字的列表,提高效率
  90. RoleNameSearchListPrefix = "namesearch_"
  91. //关注列表
  92. RoleSocialFriendSubListPrefix = "role_fsublist_" //list
  93. //粉丝列表
  94. RoleSocialFriendFansListPrefix = "role_ffanslist_" //list
  95. //黑名单列表
  96. RoleSocialFriendBlackListPrefix = "role_fblacklist_" //list
  97. //激活码
  98. RoleActiveCodeUsedListPrefix = "role_activecode_"
  99. //获取全局邮件(后台发送邮件时玩家不在线, 通过上线后进行获取)
  100. RoleGlobalMailListPrefix = "gmail_list_"
  101. RoleGlobalMailPrefix = "gmail_"
  102. PlatformOpenIdConnectInfoPrefix = "pp_conn_" //openid对应的连接信息
  103. //pet
  104. RolePetDataPrefix = "role_pet_"
  105. RolePetDataFieldPrefix_base = "base"
  106. RolePetDataFieldPrefix_petlist = "pet"
  107. RolePetDataFieldPrefix_bond = "bond"
  108. RolePetAssistDataPrefix = "role_pet_ass_"
  109. //最早收集到宠物最高进阶等级获取
  110. RolePetAchievementPrefix = "gpet_achive" //
  111. //invitation
  112. RoleInvitationNumberPrefix = "role_invi_num_" //邀请码对应的玩家,用于快速查询
  113. InvitationNumberPrefix = "invi_num_" //生成邀请码的key
  114. RoleInvitationPrefix = "role_invi_" //个人数据
  115. RoleInvitationLogPrefix = "role_invi_log_"
  116. //bt
  117. RoleBTDataPrefix = "role_bt_"
  118. RoleBTBoliDataPrefix = "btboli"
  119. RoleBTBaseDataPrefix = "base"
  120. CdkNormal = "cdk_normal" //非通码cdk
  121. )
  122. func ConfigInit() {
  123. defer func() {
  124. if err := recover(); err != nil {
  125. util.InfoF("Stack---::%v\n%s\n", err, string(debug.Stack()))
  126. panic(nil)
  127. }
  128. }()
  129. sConfig := service.GetServiceConfig()
  130. model.BaseConfigInit(sConfig)
  131. }
  132. func DelUserConnInfo(connInfo *serverproto.UserConnectInfo, openId, platform string) {
  133. // 区分不同平台
  134. openId = model.ConvertPlatform(openId, platform)
  135. err := model.SetMessageToRedis(PlatformOpenIdConnectInfoPrefix, openId, connInfo)
  136. if err != nil {
  137. util.WarnF("[initUserConnInfo] del userConnectionInfo err=%v", err)
  138. }
  139. }
  140. // 赛季数据保存
  141. func ServerCompetitionGet(ssAckMsg *serverproto.SSGetServerCompetitionAck) {
  142. retList, err := service.GetRedis().HGetAll(model.ServerCompetitionPrefix).Result()
  143. if err != nil {
  144. return
  145. }
  146. for k, v := range retList {
  147. if k == "roundEndTime" {
  148. err = model.GetDecodeMessage(ssAckMsg.RounInfo, v)
  149. if err != nil {
  150. continue
  151. }
  152. continue
  153. }
  154. if k == "towerRound" {
  155. err = model.GetDecodeMessage(ssAckMsg.TowerInfo, v)
  156. if err != nil {
  157. continue
  158. }
  159. continue
  160. }
  161. infoData := &serverproto.ServerCompetitionInfo{}
  162. err = model.GetDecodeMessage(infoData, v)
  163. if err != nil {
  164. continue
  165. }
  166. ssAckMsg.CompetitionDataList = append(ssAckMsg.CompetitionDataList, infoData)
  167. }
  168. }
  169. func ServerCompetitionSave(ntfMsg *serverproto.SSServerCompetitionInfoSaveNtf) {
  170. if ntfMsg.CompetitionData != nil {
  171. fieldStr := strconv.Itoa(int(ntfMsg.CompetitionData.CompetitionId))
  172. err, msgStr := model.GetEncodeMessage(ntfMsg.CompetitionData)
  173. if err != nil {
  174. return
  175. }
  176. _, err = service.GetRedis().HSet(model.ServerCompetitionPrefix, fieldStr, msgStr).Result()
  177. if err != nil {
  178. util.WarnF("ServerCompetitionSave err=%v msg=%v", err, *ntfMsg)
  179. }
  180. }
  181. if ntfMsg.RoundInfo != nil {
  182. err, msgStr := model.GetEncodeMessage(ntfMsg.RoundInfo)
  183. if err != nil {
  184. return
  185. }
  186. _, err = service.GetRedis().HSet(model.ServerCompetitionPrefix, "roundEndTime", msgStr).Result()
  187. if err != nil {
  188. util.WarnF("ServerCompetitionSave round end time err=%v msg=%v", err, *ntfMsg)
  189. }
  190. }
  191. if ntfMsg.TowerInfo != nil {
  192. err, msgStr := model.GetEncodeMessage(ntfMsg.TowerInfo)
  193. if err != nil {
  194. return
  195. }
  196. _, err = service.GetRedis().HSet(model.ServerCompetitionPrefix, "towerRound", msgStr).Result()
  197. if err != nil {
  198. util.WarnF("ServerCompetitionSave round end time err=%v msg=%v", err, *ntfMsg)
  199. }
  200. }
  201. }
  202. // 获取角色信息列表
  203. func GetRoleListFromRedis(openId string, zone int32, msg interface{}) error {
  204. return model.GetMessageFromRedis(AccountPrefix, strconv.Itoa(int(zone))+"_"+openId, msg)
  205. }
  206. // 获取是否关闭注册
  207. func IsServerCloseRegister() bool {
  208. closeState, err := service.GetRedis().HGet(model.ServerPrefix, "registerclose").Result()
  209. if err == nil && closeState == "1" {
  210. return true
  211. }
  212. return false
  213. }
  214. func SetRoleListToRedis(openId string, zone int32, msg interface{}) error {
  215. return model.SetMessageToRedis(AccountPrefix, strconv.Itoa(int(zone))+"_"+openId, msg)
  216. }
  217. func GetRoleFromRedis(uid uint64, ack *serverproto.SSGetRoleAck, RoleRegisterTime uint64) error {
  218. if uid <= 0 {
  219. return errors.New("uid invalid")
  220. }
  221. value := strconv.FormatUint(uid, 10)
  222. ack.Role = &serverproto.Role{}
  223. ack.Role.RoleBase = &serverproto.RoleBase{}
  224. err := model.GetMessageFromRedis(RoleBasePrefix, value, ack.Role.RoleBase)
  225. if err != nil && err != service.NIL {
  226. return err
  227. }
  228. //其他各种玩家系统信息获取
  229. //伙伴数据
  230. ack.Role.RoleHero = &serverproto.RoleHero{}
  231. err = GetRoleHeroDataFromRedis(uid, ack.Role.RoleHero)
  232. if err != nil && err != service.NIL {
  233. util.InfoF("GetRoleFromRedis RoleHero err=%v uid=%v", err, uid)
  234. return err
  235. }
  236. //msgData, _, _ := rpcc.EncodeMessage(ack)
  237. //oldLen := len(msgData)
  238. //util.InfoF("msgDatalen1=%v basehero", oldLen)
  239. //装备数据
  240. ack.Role.RoleEquip = &serverproto.RoleEquip{}
  241. err = GetSystemDataFromRedis(RoleEquipDataPrefix, uid, ack.Role.RoleEquip)
  242. if err != nil && err != service.NIL {
  243. util.InfoF("[GetRoleFromRedis] RoleEquip err:%v", err)
  244. return err
  245. }
  246. //msgData, _, _ = rpcc.EncodeMessage(ack)
  247. //newLen := len(msgData)
  248. //util.InfoF("msgDatalen1=%v equip", newLen-oldLen)
  249. //oldLen = newLen
  250. //神器数据
  251. ack.Role.RoleSkillEquip = &serverproto.RoleSkillEquip{}
  252. GetRoleSkillEquipDataFromRedis(uid, ack.Role.RoleSkillEquip)
  253. //msgData, _, _ = rpcc.EncodeMessage(ack)
  254. //newLen = len(msgData)
  255. //util.InfoF("msgDatalen1=%v skillequip", newLen-oldLen)
  256. //oldLen = newLen
  257. //背包数据
  258. ack.Role.RoleBag = &serverproto.RoleBag{}
  259. err = GetSystemDataFromRedis(RoleBagDataPrefix, uid, ack.Role.RoleBag)
  260. if err != nil && err != service.NIL {
  261. util.InfoF("[GetRoleFromRedis] RoleBag err:%v", err)
  262. return err
  263. }
  264. if err == service.NIL {
  265. ack.Role.RoleBag = nil
  266. }
  267. //msgData, _, _ = rpcc.EncodeMessage(ack)
  268. //newLen = len(msgData)
  269. //util.InfoF("msgDatalen1=%v bag", newLen-oldLen)
  270. //oldLen = newLen
  271. //伙伴碎片数据
  272. ack.Role.RoleChip = &serverproto.RoleChip{}
  273. err = GetSystemDataFromRedis(RoleChipDataPrefix, uid, ack.Role.RoleChip)
  274. if err != nil && err != service.NIL {
  275. util.InfoF("[GetRoleFromRedis] RoleChip err:%v", err)
  276. return err
  277. }
  278. //msgData, _, _ = rpcc.EncodeMessage(ack)
  279. //newLen = len(msgData)
  280. //util.InfoF("msgDatalen1=%v chip", newLen-oldLen)
  281. //oldLen = newLen
  282. //AOI地图相关
  283. ack.Role.RoleMap = &serverproto.RoleMap{}
  284. err = GetSystemDataFromRedis(RoleMapDataPrefix, uid, ack.Role.RoleMap)
  285. if err != nil && err != service.NIL {
  286. util.InfoF("[GetRoleFromRedis] RoleMap err:%v", err)
  287. return err
  288. }
  289. //msgData, _, _ = rpcc.EncodeMessage(ack)
  290. //newLen = len(msgData)
  291. //util.InfoF("msgDatalen1=%v map", newLen-oldLen)
  292. //oldLen = newLen
  293. //卡片数据
  294. ack.Role.RoleCard = &serverproto.RoleCard{}
  295. err = GetSystemDataFromRedis(RoleCardDataPrefix, uid, ack.Role.RoleCard)
  296. if err != nil && err != service.NIL {
  297. util.InfoF("[GetRoleFromRedis] RoleCard err:%v", err)
  298. return err
  299. }
  300. //msgData, _, _ = rpcc.EncodeMessage(ack)
  301. //newLen = len(msgData)
  302. //util.InfoF("msgDatalen1=%v card", newLen-oldLen)
  303. //oldLen = newLen
  304. //时装数据
  305. ack.Role.RoleFashion = &serverproto.RoleFashion{}
  306. err = GetSystemDataFromRedis(RoleFashionDataPrefix, uid, ack.Role.RoleFashion)
  307. if err != nil && err != service.NIL {
  308. util.InfoF("[GetRoleFromRedis] RoleFashion err:%v", err)
  309. return err
  310. }
  311. //msgData, _, _ = rpcc.EncodeMessage(ack)
  312. //newLen = len(msgData)
  313. //util.InfoF("msgDatalen1=%v fashion", newLen-oldLen)
  314. //oldLen = newLen
  315. //战斗数据
  316. ack.Role.RoleBattle = &serverproto.RoleBattle{}
  317. err = GetSystemDataFromRedis(RoleBattleDataPrefix, uid, ack.Role.RoleBattle)
  318. if err != nil && err != service.NIL {
  319. util.InfoF("[GetRoleFromRedis] RoleBattle err:%v", err)
  320. return err
  321. }
  322. ack.Role.RoleBattle.MapChallengeNumList = ack.Role.RoleBattle.MapChallengeNumList[:0]
  323. //msgData, _, _ = rpcc.EncodeMessage(ack)
  324. //util.InfoF("msgDatalen1=%v", len(msgData))
  325. //邮件数据(邮件数据预先加载先于需要加载发送邮件的操作)
  326. ack.Role.RoleMail = &serverproto.RoleMail{}
  327. GetRoleMailDataFromRedis(uid, ack.Role.RoleMail, RoleRegisterTime)
  328. //msgData, _, _ = rpcc.EncodeMessage(ack)
  329. //newLen = len(msgData)
  330. //util.InfoF("msgDatalen1=%v battle", newLen-oldLen)
  331. //oldLen = newLen
  332. //任务数据
  333. ack.Role.RoleTask = &serverproto.RoleTask{}
  334. GetRoleTaskFromRedis(uid, ack.Role.RoleTask)
  335. util.InfoF("get role task:%v", ack.Role.RoleTask)
  336. //msgData, _, _ = rpcc.EncodeMessage(ack)
  337. //newLen = len(msgData)
  338. //util.InfoF("msgDatalen1=%v task", newLen-oldLen)
  339. //oldLen = newLen
  340. //聊天离线数据(小红点处理)
  341. ack.Role.RoleChat = &serverproto.RoleChat{}
  342. err = GetChatOfflinePlayerList(uid, ack.Role.RoleChat)
  343. if err != nil && err != service.NIL {
  344. util.InfoF("[GetRoleFromRedis] RoleChat err:%v", err)
  345. return err
  346. }
  347. //小红点数据
  348. ack.Role.RoleRed = &serverproto.RoleRed{}
  349. err = GetSystemDataFromRedis(RoleRedDataPrefix, uid, ack.Role.RoleRed)
  350. if err != nil && err != service.NIL {
  351. util.InfoF("[GetRoleFromRedis] RoleRed err:%v", err)
  352. return err
  353. }
  354. //赛季玩法数据
  355. ack.Role.RoleCompetition = &serverproto.RoleCompetition{}
  356. err = GetSystemDataFromRedis(RoleCompetitionDataPrefix, uid, ack.Role.RoleCompetition)
  357. if err != nil && err != service.NIL {
  358. util.InfoF("[GetRoleFromRedis] RoleCompetition err:%v", err)
  359. return err
  360. }
  361. //msgData, _, _ = rpcc.EncodeMessage(ack)
  362. //newLen = len(msgData)
  363. //util.InfoF("msgDatalen1=%v chat read comp", newLen-oldLen)
  364. //oldLen = newLen
  365. //商店
  366. ack.Role.RoleShop = &serverproto.RoleShop{}
  367. err = GetSystemDataFromRedis(RoleShopDataPrefix, uid, ack.Role.RoleShop)
  368. if err != nil && err != service.NIL {
  369. util.InfoF("[GetRoleFromRedis] RoleShop err:%v", err)
  370. return err
  371. }
  372. //msgData, _, _ = rpcc.EncodeMessage(ack)
  373. //newLen = len(msgData)
  374. //util.InfoF("msgDatalen1=%v shop", newLen-oldLen)
  375. //oldLen = newLen
  376. //活动
  377. ack.Role.RoleActivity = &serverproto.RoleActivity{}
  378. GetRoleActivityDataFromRedis(uid, ack.Role.RoleActivity)
  379. //msgData, _, _ = rpcc.EncodeMessage(ack)
  380. //newLen = len(msgData)
  381. //util.InfoF("msgDatalen1=%v activity", newLen-oldLen)
  382. //oldLen = newLen
  383. //爬塔
  384. ack.Role.RoleTower = &serverproto.RoleTower{}
  385. err = GetSystemDataFromRedis(RoleTowerDataPrefix, uid, ack.Role.RoleTower)
  386. if err != nil && err != service.NIL {
  387. util.InfoF("[GetRoleFromRedis] RoleTower err:%v", err)
  388. return err
  389. }
  390. //公会
  391. ack.Role.RoleGuild = &serverproto.RoleGuild{}
  392. err = GetSystemDataFromRedis(RoleGuildDataPrefix, uid, ack.Role.RoleGuild)
  393. if err != nil && err != service.NIL {
  394. util.InfoF("[GetRoleFromRedis] RoleGuild err:%v", err)
  395. return err
  396. }
  397. //抽卡
  398. ack.Role.RoleDraw = &serverproto.RoleDraw{}
  399. err = GetSystemDataFromRedis(RoleDrawDataPrefix, uid, ack.Role.RoleDraw)
  400. if err != nil && err != service.NIL {
  401. util.InfoF("[GetRoleFromRedis] RoleDraw err:%v", err)
  402. return err
  403. }
  404. //msgData, _, _ = rpcc.EncodeMessage(ack)
  405. //newLen = len(msgData)
  406. //util.InfoF("msgDatalen1=%v tower guild draw", newLen-oldLen)
  407. //oldLen = newLen
  408. //卢恩商会
  409. ack.Role.RoleRune = &serverproto.RoleRune{}
  410. err = GetRoleRuneDataFromRedis(uid, ack.Role.RoleRune)
  411. if err != nil && err != service.NIL {
  412. util.InfoF("GetRoleFromRedis RoleRune err=%v uid=%v", err, uid)
  413. return err
  414. }
  415. //msgData, _, _ = rpcc.EncodeMessage(ack)
  416. //newLen = len(msgData)
  417. //util.InfoF("msgDatalen1=%v rune", newLen-oldLen)
  418. //oldLen = newLen
  419. //百人道场玩家基础数据
  420. ack.Role.RoleDaochang100 = &serverproto.RoleDaoChang100{}
  421. GetRoleDaoChang100FromRedis(uid, ack.Role.RoleDaochang100)
  422. //统计数据
  423. ack.Role.RoleStatistic = &serverproto.RoleStatistic{}
  424. err = GetSystemDataFromRedis(RoleStatisticDataPrefix, uid, ack.Role.RoleStatistic)
  425. if err != nil && err != service.NIL {
  426. util.InfoF("GetRoleFromRedis RoleStatistic err=%v uid=%v", err, uid)
  427. return err
  428. }
  429. //msgData, _, _ = rpcc.EncodeMessage(ack)
  430. //newLen = len(msgData)
  431. //util.InfoF("msgDatalen1=%v daochang stat", newLen-oldLen)
  432. //oldLen = newLen
  433. //信物
  434. ack.Role.RoleKeepSake = &serverproto.RoleKeepSake{}
  435. err = GetSystemDataFromRedis(RoleKeepSakeDataPrefix, uid, ack.Role.RoleKeepSake)
  436. if err != nil && err != service.NIL {
  437. util.InfoF("GetRoleFromRedis RoleKeepSake err=%v uid=%v", err, uid)
  438. return err
  439. }
  440. //msgData, _, _ = rpcc.EncodeMessage(ack)
  441. //newLen = len(msgData)
  442. //util.InfoF("msgDatalen1=%v sake", newLen-oldLen)
  443. //oldLen = newLen
  444. //跨服个人数据
  445. //ack.Role.RoleCross = &serverproto.RoleCross{}
  446. //err = GetSystemDataFromRedis(RoleCrossPrefix, uid, ack.Role.RoleCross)
  447. //if err != nil && err != service.NIL {
  448. // util.InfoF("GetRoleFromRedis RoleStatistic err=%v uid=%v", err, uid)
  449. // return err
  450. //}
  451. //if ack.Role.RoleCross.Yuanhangtrial != nil && len(ack.Role.RoleCross.Yuanhangtrial.LogList) > 50 {
  452. // tmpIdx := len(ack.Role.RoleCross.Yuanhangtrial.LogList) - 50
  453. // ack.Role.RoleCross.Yuanhangtrial.LogList = ack.Role.RoleCross.Yuanhangtrial.LogList[tmpIdx:]
  454. //}
  455. //msgData, _, _ = rpcc.EncodeMessage(ack)
  456. //newLen = len(msgData)
  457. //util.InfoF("msgDatalen1=%v cross", newLen-oldLen)
  458. //oldLen = newLen
  459. //冲榜
  460. ack.Role.RoleRush = &serverproto.RoleRush{}
  461. err = GetSystemDataFromRedis(RoleRushDataPrefix, uid, ack.Role.RoleRush)
  462. if err != nil && err != service.NIL {
  463. util.InfoF("[GetRoleFromRedis] RoleRush err:%v", err)
  464. return err
  465. }
  466. //msgData, _, _ = rpcc.EncodeMessage(ack)
  467. //newLen = len(msgData)
  468. //util.InfoF("msgDatalen1=%v rush", newLen-oldLen)
  469. //oldLen = newLen
  470. //称号数据
  471. ack.Role.RoleHead = &serverproto.RoleHead{}
  472. err = GetSystemDataFromRedis(RoleHeadDataPrefix, uid, ack.Role.RoleHead)
  473. if err != nil && err != service.NIL {
  474. util.InfoF("[GetRoleFromRedis] RoleHead err:%v", err)
  475. return err
  476. }
  477. ack.Role.RoleWish = &serverproto.RoleWish{}
  478. err = GetSystemDataFromRedis(RoleWishBoxDataPrefix, uid, ack.Role.RoleWish)
  479. if err != nil && err != service.NIL {
  480. util.InfoF("[GetRoleFromRedis] RoleWish err:%v", err)
  481. return err
  482. }
  483. //msgData, _, _ = rpcc.EncodeMessage(ack)
  484. //newLen = len(msgData)
  485. //util.InfoF("msgDatalen1=%v head", newLen-oldLen)
  486. //oldLen = newLen
  487. //BT 数据
  488. ack.Role.RoleBt = &serverproto.RoleBT{}
  489. GetBTDataFromRedis(uid, ack.Role.RoleBt)
  490. return nil
  491. }
  492. // 其他系统数据加载
  493. // 获取Role其他系统信息,不直接走SSGetRoleAck,避免后续数据包过大
  494. func GetRoleOtherInfoFromRedis(uid uint64, ev rocommon.ProcEvent) {
  495. //获取竞技场数据
  496. loadNtfMsg := &serverproto.SSLoadArenaNtf{
  497. RoleArena: &serverproto.RoleArena{},
  498. }
  499. err := GetSystemDataFromRedis(RoleArenaDataPrefix, uid, loadNtfMsg.RoleArena)
  500. if err != nil && err != service.NIL {
  501. util.InfoF("[GetRoleFromRedis] RoleArena err:%v", err)
  502. return
  503. }
  504. if err == service.NIL {
  505. loadNtfMsg.RoleArena.Arena = nil
  506. }
  507. model.ServiceReplay(ev, loadNtfMsg)
  508. //获取好友系统数据
  509. friendLoadNtfMsg := &serverproto.SSLoadFriendDataNtf{
  510. Friend: &serverproto.RoleFriend{},
  511. }
  512. GetRoleFriendDataFromRedis(uid, friendLoadNtfMsg.Friend)
  513. model.ServiceReplay(ev, friendLoadNtfMsg)
  514. //获取宠物数据
  515. GetRolePetDataFromRedis(uid, ev)
  516. //获取招募(拉新)数据 invitation
  517. invitationLoadNtfMsg := &serverproto.SSLoadInvitationDataNtf{
  518. InvitationInfo: &serverproto.RoleInvitation{},
  519. }
  520. GetRoleInvitationFromRedis(uid, invitationLoadNtfMsg.InvitationInfo)
  521. model.ServiceReplay(ev, invitationLoadNtfMsg)
  522. //获取跨服数据
  523. //cross
  524. GetRoleCrossDataFromRedis(uid, ev)
  525. }
  526. func GetRoleCrossDataFromRedis(uid uint64, ev rocommon.ProcEvent) {
  527. loadData := &serverproto.RoleCross{}
  528. err := GetSystemDataFromRedis(RoleCrossPrefix, uid, loadData)
  529. if err != nil && err != service.NIL {
  530. util.InfoF("GetRoleCrossDataFromRedis err=%v uid=%v", err, uid)
  531. return
  532. }
  533. if loadData.Yuanhangtrial != nil && len(loadData.Yuanhangtrial.LogList) > 50 {
  534. tmpIdx := len(loadData.Yuanhangtrial.LogList) - 50
  535. loadData.Yuanhangtrial.LogList = loadData.Yuanhangtrial.LogList[tmpIdx:]
  536. }
  537. if loadData.Crosstoptower != nil {
  538. for idx := 0; idx < len(loadData.Crosstoptower.FightList); idx++ {
  539. tmpInfo := loadData.Crosstoptower.FightList[idx].FightInfo
  540. if tmpInfo == nil {
  541. continue
  542. }
  543. for k := 0; k < len(tmpInfo.HeroDataList); k++ {
  544. tmpInfo.HeroDataList[k].BattleAttrListOld = tmpInfo.HeroDataList[k].BattleAttrListOld[:0]
  545. }
  546. for k := 0; k < len(tmpInfo.BattlePetList); k++ {
  547. tmpInfo.BattlePetList[k].BattleAttrListOld = tmpInfo.BattlePetList[k].BattleAttrListOld[:0]
  548. }
  549. }
  550. }
  551. //Yuanhangtrial
  552. ntfMsg := &serverproto.SSLoadCrossDataNtf{
  553. LoadData: &serverproto.RoleCross{},
  554. }
  555. ntfMsg.LoadData.Yuanhangtrial = loadData.Yuanhangtrial
  556. model.ServiceReplay(ev, ntfMsg)
  557. //TopTower
  558. if loadData.Crosstoptower != nil {
  559. ntfNum := 0
  560. for idx := 0; idx < len(loadData.Crosstoptower.FightList); idx++ {
  561. if ntfNum <= 0 {
  562. ntfMsg = &serverproto.SSLoadCrossDataNtf{
  563. LoadData: &serverproto.RoleCross{},
  564. }
  565. ntfMsg.LoadData.Crosstoptower = &serverproto.RoleCrossTopTower{}
  566. ntfMsg.LoadData.Crosstoptower.ValidEndTime = loadData.Crosstoptower.ValidEndTime
  567. }
  568. ntfMsg.LoadData.Crosstoptower.FightList = append(ntfMsg.LoadData.Crosstoptower.FightList,
  569. loadData.Crosstoptower.FightList[idx])
  570. ntfNum++
  571. if ntfNum >= 2 {
  572. ntfNum = 0
  573. model.ServiceReplay(ev, ntfMsg)
  574. }
  575. }
  576. if ntfNum > 0 {
  577. model.ServiceReplay(ev, ntfMsg)
  578. }
  579. }
  580. }
  581. func SetRoleToRedis(uid uint64, msg *serverproto.RoleBase) error {
  582. if uid <= 0 {
  583. return errors.New("uid<=0 invalid")
  584. }
  585. value := strconv.FormatUint(uid, 10)
  586. return model.SetMessageToRedis(RoleBasePrefix, value, msg)
  587. }
  588. func GetRoleBaseFromRedis(uid uint64, msg *serverproto.RoleBase) bool {
  589. if uid <= 0 {
  590. return false
  591. }
  592. value := strconv.FormatUint(uid, 10)
  593. err := model.GetMessageFromRedis(RoleBasePrefix, value, msg)
  594. if err == nil && err != service.NIL {
  595. return true
  596. }
  597. return false
  598. }
  599. func GetRoleHeroDataFromRedis(uid uint64, data *serverproto.RoleHero) error {
  600. if uid <= 0 {
  601. return errors.New("uid<=0 invalid")
  602. }
  603. value := strconv.FormatUint(uid, 10)
  604. keyStr := RoleHeroDataPrefix + value
  605. valueStr, err := service.GetRedis().HGetAll(keyStr).Result()
  606. if err != nil {
  607. util.InfoF("getRoleHeroDataFromRedis get key=%v err=%v uid=%v", keyStr, err, uid)
  608. return err
  609. }
  610. for heroKey, heroValue := range valueStr {
  611. msgStr, err := base64.StdEncoding.DecodeString(heroValue)
  612. if err != nil {
  613. util.InfoF("getRoleHeroDataFromRedis key=%v err=%v uid=%v", heroKey, err, uid)
  614. continue
  615. }
  616. heroData := &serverproto.HeroData{}
  617. err = rocommon.GetCodec().Unmarshal(msgStr, heroData)
  618. if err == nil {
  619. heroData.BattleAttrListOld = heroData.BattleAttrListOld[:0]
  620. data.HeroData = append(data.HeroData, heroData)
  621. } else {
  622. return err
  623. }
  624. }
  625. return nil
  626. }
  627. func SetRoleHeroDataToRedis(uid uint64, data *serverproto.RoleHero) error {
  628. if uid <= 0 {
  629. return errors.New("uid invalid")
  630. }
  631. value := strconv.FormatUint(uid, 10)
  632. keyStr := RoleHeroDataPrefix + value
  633. for _, heroData := range data.HeroData {
  634. fieldStr := strconv.Itoa(int(heroData.Id))
  635. msgData, err := rocommon.GetCodec().Marshal(heroData)
  636. if err != nil {
  637. util.InfoF("[SetRoleHeroDataToRedis] Marshal err:%v %v", err, fieldStr)
  638. continue
  639. }
  640. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  641. ret, err := service.GetRedis().HSet(keyStr, fieldStr, msgStr).Result()
  642. if err != nil {
  643. util.InfoF("[SetRoleHeroDataToRedis] err:%v %v", err, ret)
  644. continue
  645. }
  646. }
  647. return nil
  648. }
  649. // 卢恩商店
  650. func GetRoleRuneDataFromRedis(uid uint64, data *serverproto.RoleRune) error {
  651. if uid <= 0 {
  652. return errors.New("uid invalid")
  653. }
  654. value := strconv.FormatUint(uid, 10)
  655. keyStr := RoleRuneDataPrefix + value
  656. valueStr, err := service.GetRedis().HGetAll(keyStr).Result()
  657. if err != nil {
  658. util.InfoF("GetRoleRuneDataFromRedis get key=%v err=%v uid=%v", keyStr, err, uid)
  659. return err
  660. }
  661. for shopKey, shopValue := range valueStr {
  662. msgStr, err := base64.StdEncoding.DecodeString(shopValue)
  663. if err != nil {
  664. util.InfoF("GetRoleRuneDataFromRedis key=%v err=%v uid=%v", shopKey, err, uid)
  665. continue
  666. }
  667. if shopKey == "runeExplore" {
  668. data.RuneExplore = &serverproto.RuneExplore{}
  669. err = rocommon.GetCodec().Unmarshal(msgStr, data.RuneExplore)
  670. if err != nil {
  671. return err
  672. }
  673. } else if shopKey == "runeBase" {
  674. data.RuneBase = &serverproto.RuneBaseData{}
  675. err = rocommon.GetCodec().Unmarshal(msgStr, data.RuneBase)
  676. if err != nil {
  677. return err
  678. }
  679. } else {
  680. shopData := &serverproto.RuneShop{}
  681. err = rocommon.GetCodec().Unmarshal(msgStr, shopData)
  682. if err == nil {
  683. data.ShopList = append(data.ShopList, shopData)
  684. } else {
  685. return err
  686. }
  687. }
  688. }
  689. return nil
  690. }
  691. func SetRoleRuneDataToRedis(uid uint64, data *serverproto.RoleRune) error {
  692. if uid <= 0 {
  693. return errors.New("uid invalid")
  694. }
  695. value := strconv.FormatUint(uid, 10)
  696. keyStr := RoleRuneDataPrefix + value
  697. for _, shop := range data.ShopList {
  698. fieldStr := strconv.Itoa(int(shop.ShopId*100 + shop.SubShopId))
  699. msgData, err := rocommon.GetCodec().Marshal(shop)
  700. if err != nil {
  701. util.InfoF("[SetRoleRuneDataToRedis] Marshal err:%v %v", err, fieldStr)
  702. continue
  703. }
  704. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  705. ret, err := service.GetRedis().HSet(keyStr, fieldStr, msgStr).Result()
  706. if err != nil {
  707. util.InfoF("[SetRoleRuneDataToRedis] err:%v %v", err, ret)
  708. continue
  709. }
  710. }
  711. runeBase, err := rocommon.GetCodec().Marshal(data.RuneBase)
  712. if err == nil {
  713. msgStr := base64.StdEncoding.EncodeToString(runeBase.([]byte))
  714. ret, err := service.GetRedis().HSet(keyStr, "runeBase", msgStr).Result()
  715. if err != nil {
  716. util.InfoF("[SetRoleRuneDataToRedis] err:%v %v", err, ret)
  717. }
  718. } else {
  719. util.InfoF("[SetRoleRuneDataToRedis] Marshal err:%v %v", err, "runeData")
  720. }
  721. runeData, err := rocommon.GetCodec().Marshal(data.RuneExplore)
  722. if err != nil {
  723. util.InfoF("[SetRoleRuneDataToRedis] Marshal err:%v %v", err, "runeData")
  724. return err
  725. }
  726. msgStr := base64.StdEncoding.EncodeToString(runeData.([]byte))
  727. ret, err := service.GetRedis().HSet(keyStr, "runeExplore", msgStr).Result()
  728. if err != nil {
  729. util.InfoF("[SetRoleRuneDataToRedis] err:%v %v", err, ret)
  730. return err
  731. }
  732. return nil
  733. }
  734. func SetSystemDataToRedis(prefix string, uid uint64, msg interface{}) error {
  735. if uid <= 0 {
  736. return errors.New("uid invalid")
  737. }
  738. value := strconv.FormatUint(uid, 10)
  739. return model.SetMessageToRedis(prefix, value, msg)
  740. }
  741. func GetSystemDataFromRedis(prefix string, uid uint64, msg interface{}) error {
  742. if uid <= 0 {
  743. return errors.New("uid invalid")
  744. }
  745. value := strconv.FormatUint(uid, 10)
  746. return model.GetMessageFromRedis(prefix, value, msg)
  747. }
  748. const MaxChatOffLineMsgCount int64 = 50
  749. func AddChatOfflineMsg(fromId *serverproto.ChatPlayerBriefInfo, target uint64, msg *serverproto.ChatMessageInfo) {
  750. formIdStr := strconv.FormatUint(fromId.Uid, 10)
  751. targetIdStr := strconv.FormatUint(target, 10)
  752. keyStr := RoleChatOfflineMsgPrefix + targetIdStr + ":" + formIdStr + "_"
  753. err, msgStr := model.GetEncodeMessage(msg)
  754. if err == nil {
  755. ret, err1 := service.GetRedis().LPush(keyStr, msgStr).Result()
  756. if err1 == nil && ret > MaxChatOffLineMsgCount {
  757. service.GetRedis().LTrim(keyStr, 0, MaxChatOffLineMsgCount-1)
  758. }
  759. err1, msgStr1 := model.GetEncodeMessage(fromId)
  760. mapKeyStr := RoleChatOfflineMsgPrefix + targetIdStr + "_"
  761. service.GetRedis().HSet(mapKeyStr, formIdStr, msgStr1)
  762. }
  763. }
  764. // 获取离线私聊消息人员列表
  765. func GetChatOfflinePlayerList(uid uint64, chatData *serverproto.RoleChat) error {
  766. if uid <= 0 {
  767. return errors.New("uid invalid")
  768. }
  769. uidStr := strconv.FormatUint(uid, 10)
  770. mapKeyStr := RoleChatOfflineMsgPrefix + uidStr + "_"
  771. //注意效率问题 数据量大需要用HScan
  772. ret, err := service.GetRedis().HGetAll(mapKeyStr).Result()
  773. //ret,err := service.GetRedis().HKeys(mapKeyStr).Result()
  774. if err != nil {
  775. return err
  776. }
  777. for _, data := range ret {
  778. tempInfo := &serverproto.ChatPlayerBriefInfo{}
  779. model.GetDecodeMessage(tempInfo, data)
  780. chatData.OfflineMsgPlayerList = append(chatData.OfflineMsgPlayerList, tempInfo)
  781. }
  782. return nil
  783. }
  784. // 获取离线私聊消息
  785. func GetChatOfflineMsgFromRedis(selfId, targetId uint64, ackMsg *serverproto.SCChatOfflineMsgAck) error {
  786. if selfId <= 0 || targetId <= 0 {
  787. return errors.New("uid invalid")
  788. }
  789. selfIdStr := strconv.FormatUint(selfId, 10)
  790. targetIdStr := strconv.FormatUint(targetId, 10)
  791. mapKeyStr := RoleChatOfflineMsgPrefix + selfIdStr + "_"
  792. ret, err := service.GetRedis().HGet(mapKeyStr, targetIdStr).Result()
  793. if err == nil {
  794. ackMsg.TargetPlayer = &serverproto.ChatPlayerBriefInfo{}
  795. model.GetDecodeMessage(ackMsg.TargetPlayer, ret)
  796. service.GetRedis().HDel(mapKeyStr, targetIdStr)
  797. keyStr := RoleChatOfflineMsgPrefix + selfIdStr + ":" + targetIdStr + "_"
  798. msgList, err1 := service.GetRedis().LRange(keyStr, 0, MaxChatOffLineMsgCount-1).Result()
  799. if err1 == nil && len(msgList) > 0 {
  800. for idx := range msgList {
  801. chatMsg := &serverproto.ChatMessageInfo{}
  802. model.GetDecodeMessage(chatMsg, msgList[idx])
  803. ackMsg.MsgList = append(ackMsg.MsgList, chatMsg)
  804. }
  805. service.GetRedis().LTrim(keyStr, 0, -1)
  806. }
  807. } else {
  808. return err
  809. }
  810. return nil
  811. }
  812. // 设置玩家简介信息
  813. const NameSearchListLimitNum = 20
  814. func UpdatePlayerBriefInfo(uid uint64, briefInfo *serverproto.CommonPlayerBriefInfo, bCreate bool, activeCode, openId, subPlatform string) {
  815. err := SetSystemDataToRedis(RolePlayerBriefPrefix, uid, briefInfo)
  816. if err != nil {
  817. util.InfoF("[SSRoleBriefInfoSaveReq] save err:%v", err)
  818. } else {
  819. //更新到mysql数据库中
  820. UpdatePlayerBriefInfo2Mysql(uid, briefInfo, bCreate, activeCode, openId, subPlatform)
  821. //缓存简介信息
  822. info, ok := PlayerInfoCacheList[uid]
  823. if !ok {
  824. info = &PlayerInfoCache{
  825. fightInfo: &serverproto.FightRoleInfo{
  826. BriefInfo: &serverproto.CommonPlayerBriefInfo{},
  827. },
  828. }
  829. }
  830. info.fightInfo.BriefInfo = briefInfo
  831. info.refreshTime = util.GetTimeMilliseconds()
  832. //创建时使用的是默认名字则加入到,默认名字的搜索列表中,提高搜索的效率(不用去遍历数据库)
  833. if briefInfo.NickName == "" {
  834. service.GetRedis().LRem(RoleNameSearchListPrefix, 1, briefInfo.Uid)
  835. ret, err1 := service.GetRedis().LPush(RoleNameSearchListPrefix, briefInfo.Uid).Result()
  836. if err1 != nil {
  837. util.InfoF("[SSRoleBriefInfoSaveReq] searchList Push err:%v", err1)
  838. return
  839. }
  840. if ret > NameSearchListLimitNum {
  841. service.GetRedis().LTrim(RoleNameSearchListPrefix, 0, NameSearchListLimitNum-1)
  842. }
  843. } else {
  844. service.GetRedis().LRem(RoleNameSearchListPrefix, 1, briefInfo.Uid)
  845. }
  846. }
  847. }
  848. func GetPlayerBriefInfo(uid uint64) (error, *serverproto.CommonPlayerBriefInfo) {
  849. nowTime := util.GetTimeMilliseconds()
  850. cacheInfo, ok := PlayerInfoCacheList[uid]
  851. if !ok {
  852. cacheInfo = &PlayerInfoCache{
  853. fightInfo: &serverproto.FightRoleInfo{
  854. BriefInfo: &serverproto.CommonPlayerBriefInfo{
  855. Uid: uid},
  856. },
  857. }
  858. cacheInfo.refreshTime = nowTime + uint64(BriefInfoRefreshTime+rand.Int31n(BriefInfoRefreshTime))
  859. err := GetSystemDataFromRedis(RolePlayerBriefPrefix, uid, cacheInfo.fightInfo.BriefInfo)
  860. if err != nil && err != service.NIL {
  861. return err, nil
  862. }
  863. } else {
  864. if cacheInfo.refreshTime < nowTime {
  865. rand.Seed(int64(util.GetTimeMilliseconds()))
  866. cacheInfo.refreshTime = nowTime + uint64(BriefInfoRefreshTime+rand.Int31n(BriefInfoRefreshTime))
  867. //BriefInfo
  868. GetSystemDataFromRedis(RolePlayerBriefPrefix, uid, cacheInfo.fightInfo.BriefInfo)
  869. }
  870. }
  871. return nil, cacheInfo.fightInfo.BriefInfo
  872. }
  873. func GetPlayerBriefInfoWithoutCache(uid uint64) *serverproto.CommonPlayerBriefInfo {
  874. info := &serverproto.CommonPlayerBriefInfo{Uid: uid}
  875. err := GetSystemDataFromRedis(RolePlayerBriefPrefix, uid, info)
  876. if err != nil {
  877. return nil
  878. }
  879. //获取道场口号
  880. uidStr := strconv.FormatUint(uid, 10)
  881. keyStr := model.RoleDaoChang100Prefix + uidStr
  882. baseStr, err := service.GetRedis().HGet(keyStr, "base").Result()
  883. if err == nil {
  884. daochang100Info := &serverproto.RoleDaoChang100{}
  885. err = model.GetDecodeMessage(daochang100Info, baseStr)
  886. if err == nil {
  887. info.Daochang100Tips = daochang100Info.TipsDesc
  888. }
  889. }
  890. return info
  891. }
  892. // 获取默认名字Uid列表,值获得前10个
  893. func GetNameSearchList(searchName string, exceptUid uint64, zone int32, msg *serverproto.SSGetUidByRoleNameAck) {
  894. //默认名字查找
  895. if searchName == "" {
  896. retList, err := service.GetRedis().LRange(RoleNameSearchListPrefix, 0, 9).Result()
  897. if err != nil {
  898. util.InfoF("[GetNameSearchList] searchList err:%v", err, searchName)
  899. return
  900. }
  901. if len(retList) > 0 {
  902. for idx := 0; idx < len(retList); idx++ {
  903. tmpUid, _ := model.Str2NumU64(retList[idx])
  904. if tmpUid == exceptUid || tmpUid == 0 {
  905. continue
  906. }
  907. err, bInfo := GetPlayerBriefInfo(tmpUid)
  908. if err == nil {
  909. msg.BriefInfoList = append(msg.BriefInfoList, bInfo)
  910. }
  911. }
  912. }
  913. } else {
  914. //名字匹配查找
  915. msgStr := base64.StdEncoding.EncodeToString([]byte(searchName))
  916. //keyStr := RoleNickNamePrefix + strconv.Itoa(int(zone)) + "_" + msgStr
  917. keyMatchStr := RoleNickNamePrefix + "*_" + msgStr
  918. matchStrList, err := service.GetRedis().Keys(keyMatchStr).Result()
  919. if err != nil {
  920. util.InfoF("[GetNameSearchList] searchList err:%v %v", err, searchName)
  921. return
  922. }
  923. for idx := 0; idx < len(matchStrList); idx++ {
  924. uidStr, err := service.GetRedis().Get(matchStrList[idx]).Result()
  925. if err != nil {
  926. util.InfoF("[GetNameSearchList] searchList err:%v %v", err, searchName)
  927. continue
  928. }
  929. searchUid, _ := model.Str2NumU64(uidStr)
  930. if searchUid == 0 {
  931. continue
  932. }
  933. err, bInfo := GetPlayerBriefInfo(searchUid)
  934. if err == nil {
  935. msg.BriefInfoList = append(msg.BriefInfoList, bInfo)
  936. }
  937. }
  938. }
  939. }
  940. func GetRoleMailDataFromRedis(uid uint64, roleMail *serverproto.RoleMail, RoleRegisterTime uint64) bool {
  941. if RoleRegisterTime <= 0 {
  942. return false
  943. }
  944. bRet := false
  945. uidStr := strconv.FormatUint(uid, 10)
  946. keyStr := RoleMailDataPrefix + uidStr
  947. //0位置表示目前邮件最大id
  948. valueStrList, err := service.GetRedis().HGetAll(keyStr).Result()
  949. if err != nil && err != service.NIL {
  950. util.InfoF("uid=%v GetRoleMailDataFromRedis err=%v", uid, err)
  951. return bRet
  952. }
  953. bRet = true
  954. var delFieldList []string // 过期已删除的邮件
  955. cutMs := util.GetTimeMilliseconds()
  956. for key, value := range valueStrList {
  957. if key == "maxId" {
  958. val, _ := model.Str2Num(value)
  959. roleMail.MaxMailId = int32(val)
  960. continue
  961. } else if key == "gMaxId" {
  962. val, _ := model.Str2Num(value)
  963. roleMail.CurrGlobalMailId = int32(val)
  964. continue
  965. }
  966. mailData := &serverproto.MailContent{}
  967. err = model.GetDecodeMessage(mailData, value)
  968. if err != nil {
  969. util.InfoF("uid=%v GetRoleMailDataFromRedis key=%v err=%v", uid, key, err)
  970. continue
  971. } else {
  972. if mailData.State&4 > 0 { // 删除邮件 不返回, 并删除超过30天的邮件
  973. if util.GetDurationDay1(mailData.BeginTime, cutMs) > 30 {
  974. delFieldList = append(delFieldList, key)
  975. }
  976. continue
  977. }
  978. roleMail.MailList = append(roleMail.MailList, mailData)
  979. if roleMail.MaxMailId < mailData.Id {
  980. roleMail.MaxMailId = mailData.Id
  981. }
  982. }
  983. }
  984. if len(delFieldList) > 0 {
  985. ret, err := service.GetRedis().HDel(keyStr, delFieldList...).Result()
  986. if err != nil {
  987. util.InfoF("[SetMailDataChangToRedis][%v] del past mail err5:%v %v", uid, err, ret)
  988. }
  989. }
  990. //查看全局邮件里是否有可领取邮件
  991. //全局邮件多了后需要做优化,暂时进行整体获取
  992. globalMaiList, err := service.GetRedis().LRange(RoleGlobalMailListPrefix, 0, -1).Result()
  993. if err != nil {
  994. return bRet
  995. }
  996. //修正玩家生成全局邮件不正常数据
  997. var gMailMaxId int32 = 0
  998. for idx := 0; idx < len(globalMaiList); idx++ {
  999. gmId, _ := model.Str2Num(globalMaiList[idx])
  1000. if gmId <= 0 {
  1001. service.GetRedis().LRem(RoleGlobalMailListPrefix, 0, gmId)
  1002. continue
  1003. }
  1004. if gMailMaxId < int32(gmId) {
  1005. gMailMaxId = int32(gmId)
  1006. }
  1007. }
  1008. if roleMail.CurrGlobalMailId > gMailMaxId {
  1009. //出错时确保最后一封邮件能收到
  1010. roleMail.CurrGlobalMailId = gMailMaxId - 1
  1011. }
  1012. var expireDayTimeMs uint64 = 24 * 3600 * 1000 * 14 //2周=14天
  1013. for idx := 0; idx < len(globalMaiList); idx++ {
  1014. gmId, _ := model.Str2Num(globalMaiList[idx])
  1015. if gmId <= 0 {
  1016. service.GetRedis().LRem(RoleGlobalMailListPrefix, 0, gmId)
  1017. continue
  1018. }
  1019. if int32(gmId) <= roleMail.CurrGlobalMailId {
  1020. continue
  1021. }
  1022. gmIdKey := RoleGlobalMailPrefix + globalMaiList[idx]
  1023. //过期后需要把邮件对应的id从列表中移除
  1024. gMailInfoStr, err := service.GetRedis().Get(gmIdKey).Result()
  1025. if err != nil {
  1026. service.GetRedis().LRem(RoleGlobalMailListPrefix, 0, gmId)
  1027. continue
  1028. }
  1029. gMailInfo := &serverproto.WebUpdateMailItem{}
  1030. err = model.GetDecodeMessage(gMailInfo, gMailInfoStr)
  1031. if err != nil {
  1032. util.InfoF("uid=%v GetRoleMailDataFromRedis global mail decode err=%v", uid, err)
  1033. }
  1034. if gMailInfo.SendDate < RoleRegisterTime {
  1035. //roleMail.CurrGlobalMailId = int32(gmId)
  1036. util.InfoF("uid=%v GetRoleMailDataFromRedis global mail create after sendData gmId=%v", uid, gmId)
  1037. continue
  1038. }
  1039. //超过2周的补偿没后获取到直接失效,反之上线时获取到太多的未领取邮件
  1040. if gMailInfo.SendDate+expireDayTimeMs <= cutMs {
  1041. util.InfoF("uid=%v GetRoleMailDataFromRedis global mail expired 2 weeks[time=%v] gmId=%v", uid, gMailInfo.SendDate, gmId)
  1042. continue
  1043. }
  1044. mailData := &serverproto.MailContent{
  1045. Id: gMailInfo.Id,
  1046. Type: int32(serverproto.MailType_MailType_GM),
  1047. RewardList: gMailInfo.RewardList,
  1048. Title: gMailInfo.Title,
  1049. Content: gMailInfo.Content,
  1050. }
  1051. roleMail.MailList = append(roleMail.MailList, mailData)
  1052. }
  1053. roleMail.CurrGlobalMailId = gMailMaxId
  1054. return bRet
  1055. }
  1056. // 邮件数据变更保存
  1057. func SetMailDataChangToRedis(uid uint64, mailStateList []*serverproto.MailContent, delMailList []int32,
  1058. addMailList []*serverproto.MailContent, maxMailId int32, curGlobalMailId int32) {
  1059. uidStr := strconv.FormatUint(uid, 10)
  1060. keyStr := RoleMailDataPrefix + uidStr
  1061. maxIdFieldStr := strconv.Itoa(int(maxMailId))
  1062. service.GetRedis().HSet(keyStr, "maxId", maxIdFieldStr)
  1063. curGlobalMailIdStr := strconv.Itoa(int(curGlobalMailId))
  1064. service.GetRedis().HSet(keyStr, "gMaxId", curGlobalMailIdStr)
  1065. //mailStateList
  1066. if len(mailStateList) > 0 {
  1067. var stateFieldList = map[string]interface{}{}
  1068. for _, mail := range mailStateList {
  1069. fieldStr := strconv.Itoa(int(mail.Id))
  1070. msgData, err := rocommon.GetCodec().Marshal(mail)
  1071. if err != nil {
  1072. util.InfoF("[SetMailDataChangToRedis][%v] Marshal err1:%v %v", uid, err, fieldStr)
  1073. continue
  1074. }
  1075. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  1076. stateFieldList[fieldStr] = msgStr
  1077. }
  1078. ret, err := service.GetRedis().HMSet(keyStr, stateFieldList).Result()
  1079. if err != nil {
  1080. util.InfoF("[SetMailDataChangToRedis][%v] err2:%v %v", uid, err, ret)
  1081. }
  1082. }
  1083. //addMailList
  1084. if len(addMailList) > 0 {
  1085. var addFieldList = map[string]interface{}{}
  1086. for _, mail := range addMailList {
  1087. fieldStr := strconv.Itoa(int(mail.Id))
  1088. msgData, err := rocommon.GetCodec().Marshal(mail)
  1089. if err != nil {
  1090. util.InfoF("[SetMailDataChangToRedis][%v] Marshal err3:%v %v", uid, err, fieldStr)
  1091. continue
  1092. }
  1093. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  1094. addFieldList[fieldStr] = msgStr
  1095. }
  1096. ret, err := service.GetRedis().HMSet(keyStr, addFieldList).Result()
  1097. if err != nil {
  1098. util.InfoF("[SetMailDataChangToRedis][%v] err4:%v %v", uid, err, ret)
  1099. }
  1100. }
  1101. //delMailList
  1102. if len(delMailList) > 0 {
  1103. var stateMail = map[string]interface{}{}
  1104. for idx := range delMailList {
  1105. fieldStr := strconv.Itoa(int(delMailList[idx]))
  1106. if mailData, err := service.GetRedis().HGet(keyStr, fieldStr).Result(); err == nil {
  1107. mail := &serverproto.MailContent{}
  1108. err = model.GetDecodeMessage(mail, mailData)
  1109. if err != nil {
  1110. continue
  1111. }
  1112. mail.State |= 4 // 标识邮件已删除
  1113. msgData, err := rocommon.GetCodec().Marshal(mail)
  1114. if err != nil {
  1115. util.InfoF("[SetMailDataChangToRedis][%v] del mail Marshal err3:%v %v", uid, err, fieldStr)
  1116. continue
  1117. }
  1118. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  1119. stateMail[fieldStr] = msgStr
  1120. }
  1121. }
  1122. ret, err := service.GetRedis().HMSet(keyStr, stateMail).Result()
  1123. if err != nil {
  1124. util.InfoF("[SetMailDataChangToRedis] del Mail state Save [%v] err4:%v %v", uid, err, ret)
  1125. }
  1126. //// ----------------------------------存儲三天内刪除的邮件-----------------------------
  1127. //delMail := &serverproto.DelMail{}
  1128. //delRet, err := service.GetRedis().HGet(keyStr, "DelMail").Result()
  1129. //if err == nil{
  1130. // model.GetDecodeMessage(delMail, delRet)
  1131. //}
  1132. //curMs := util.GetTimeMilliseconds()
  1133. //var delFieldList []string
  1134. //for idx := range delMailList {
  1135. // fieldStr := strconv.Itoa(int(delMailList[idx]))
  1136. // delFieldList = append(delFieldList, fieldStr)
  1137. // if mailData, err := service.GetRedis().HGet(keyStr, fieldStr).Result(); err == nil{
  1138. // mail := &serverproto.MailContent{}
  1139. // err = model.GetDecodeMessage(mail, mailData)
  1140. // if err != nil {
  1141. // continue
  1142. // }
  1143. // mail.State |= 4 // 标识邮件已删除
  1144. // mail.ExpireTime = curMs // 删除的邮件结束时间改为删除时间
  1145. // delMail.DelMail = append(delMail.DelMail, mail)
  1146. // }
  1147. //}
  1148. //curTime := util.GetCurrentTimeNow()
  1149. //endT := uint64(curTime.AddDate(0,0,-3).Unix() * 1000)
  1150. //for i := 0; i < len(delMail.DelMail); {
  1151. // if endT > delMail.DelMail[i].ExpireTime{delMail.DelMail = append(delMail.DelMail[:i], delMail.DelMail[i+1:]...); continue}
  1152. // i++
  1153. //}
  1154. //msgData, err := rocommon.GetCodec().Marshal(delMail)
  1155. //if err != nil {
  1156. // util.InfoF("[SetMailDataChangToRedis][%v] Marshal err3:%v %v", uid, err, msgData)
  1157. //}
  1158. //msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  1159. //setDelret, err := service.GetRedis().HSet(keyStr, "DelMail", msgStr).Result()
  1160. //if err != nil {
  1161. // util.InfoF("[SetMailDataChangToRedis][%v] %v err4:%v %v", uid, "DelMail", err, setDelret)
  1162. //}
  1163. /////----------------------------------end--------------------------------------------------
  1164. //ret, err := service.GetRedis().HDel(keyStr, delFieldList...).Result()
  1165. //if err != nil {
  1166. // util.InfoF("[SetMailDataChangToRedis][%v] err5:%v %v", uid, err, ret)
  1167. //}
  1168. }
  1169. }
  1170. // 添加邮件(离线方式添加到db中,在线添加在SSMailSaveNtf中)
  1171. func AddMailToRedis(uid uint64, mail *serverproto.MailContent) bool {
  1172. uidStr := strconv.FormatUint(uid, 10)
  1173. keyStr := RoleMailDataPrefix + uidStr
  1174. //mail.BeginTime <= 0表示离线方式添加,后续在玩家上线时做处理
  1175. maxMailIdStr, err := service.GetRedis().HGet(keyStr, "maxId").Result()
  1176. if err != nil && err != service.NIL {
  1177. util.InfoF("uid=%v AddMailToRedis maxMailId err=%v maxId=%v", uid, err, "maxId")
  1178. return false
  1179. }
  1180. maxMailId, _ := model.Str2Num(maxMailIdStr)
  1181. maxMailId++
  1182. mail.Id = int32(maxMailId)
  1183. //设置最大邮件ID
  1184. service.GetRedis().HSet(keyStr, "maxId", strconv.Itoa(int(maxMailId)))
  1185. //添加邮件
  1186. fieldStr := strconv.Itoa(int(mail.Id))
  1187. msgData, err := rocommon.GetCodec().Marshal(mail)
  1188. if err != nil {
  1189. util.InfoF("uid=%v addMailToRedis Marshal err=%v mailId=%v", uid, err, fieldStr)
  1190. return false
  1191. }
  1192. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  1193. ret, err := service.GetRedis().HSet(keyStr, fieldStr, msgStr).Result()
  1194. if err != nil {
  1195. util.InfoF("uid=%v addMailToRedis err=%v ret=%v", uid, err, ret)
  1196. return false
  1197. }
  1198. //小红点处理
  1199. roleRed := &serverproto.RoleRed{}
  1200. err = GetSystemDataFromRedis(RoleRedDataPrefix, uid, roleRed)
  1201. if err != nil && err != service.NIL {
  1202. util.InfoF("[AddMailToRedis][%v] RoleRed err:%v", uid, err)
  1203. return false
  1204. }
  1205. if !roleRed.IsUnreadMail {
  1206. roleRed.IsUnreadMail = true
  1207. err := SetSystemDataToRedis(RoleRedDataPrefix, uid, roleRed)
  1208. if err != nil {
  1209. util.InfoF("[AddMailToRedis][%v] save rolRed err:%v", uid, err)
  1210. return false
  1211. }
  1212. }
  1213. return true
  1214. }
  1215. func SetUserRankScore(uid uint64) {
  1216. //uidStr := strconv.FormatUint(uid, 10)
  1217. loadData := &serverproto.RoleCross{}
  1218. err := GetSystemDataFromRedis(RoleCrossPrefix, uid, loadData)
  1219. if err != nil && err != service.NIL {
  1220. util.InfoF("GetRoleCrossDataFromRedis err=%v uid=%v", err, uid)
  1221. return
  1222. }
  1223. loadData.Yuanhangtrial.TrialScore = 0
  1224. err = SetSystemDataToRedis(RoleCrossPrefix, uid, loadData)
  1225. if err != nil {
  1226. util.InfoF("uid=%v SetRoleCrossYuanHangLogToRedis save err=%v", uid, err)
  1227. }
  1228. }
  1229. func GetOtherViewInfo(uid uint64, info *serverproto.ViewRoleInfo) int32 {
  1230. value := strconv.FormatUint(uid, 10)
  1231. roleBase := &serverproto.RoleBase{}
  1232. errBase := model.GetMessageFromRedis(RoleBasePrefix, value, roleBase)
  1233. if errBase != nil {
  1234. return int32(serverproto.ErrorCode_ERROR_ROLE_NOT_FOUND)
  1235. }
  1236. roleHero := &serverproto.RoleHero{}
  1237. errHero := GetRoleHeroDataFromRedis(uid, roleHero)
  1238. if errHero != nil && errHero != service.NIL {
  1239. util.InfoF("[GetRoleFromRedis] RoleHero err=%v uid=%v", errHero, uid)
  1240. return int32(serverproto.ErrorCode_ERROR_ROLE_NOT_FOUND)
  1241. }
  1242. roleFashion := &serverproto.RoleFashion{}
  1243. errFashion := GetSystemDataFromRedis(RoleFashionDataPrefix, uid, roleFashion)
  1244. if errFashion != nil && errFashion != service.NIL {
  1245. util.InfoF("[GetRoleFromRedis] RoleFashion err=%v uid=%v", errFashion, uid)
  1246. return int32(serverproto.ErrorCode_ERROR_ROLE_NOT_FOUND)
  1247. }
  1248. roleArena := &serverproto.RoleArena{}
  1249. err := GetSystemDataFromRedis(RoleArenaDataPrefix, uid, roleArena)
  1250. if err != nil && err != service.NIL {
  1251. util.InfoF("[GetRoleFromRedis] RoleArena err:%v", err)
  1252. return int32(serverproto.ErrorCode_ERROR_ROLE_NOT_FOUND)
  1253. }
  1254. headData := &serverproto.RoleHead{}
  1255. err = GetSystemDataFromRedis(RoleHeadDataPrefix, uid, headData)
  1256. if err != nil && err != service.NIL {
  1257. util.InfoF("[GetRoleFromRedis] RoleHead err:%v", err)
  1258. return int32(serverproto.ErrorCode_ERROR_ROLE_NOT_FOUND)
  1259. }
  1260. var headId int32 = 0
  1261. for _, data := range headData.Heads {
  1262. if data.State != int32(2) {
  1263. continue
  1264. }
  1265. headId = data.HeadId
  1266. break
  1267. }
  1268. info.Id = uid
  1269. info.Brief = &serverproto.CommonPlayerBriefInfo{
  1270. Uid: uid,
  1271. NickName: roleBase.NickName,
  1272. Gender: roleBase.Sex,
  1273. ImgId: roleBase.RoleData.HeadId,
  1274. HeadFrameId: roleBase.RoleData.HeadFrameId,
  1275. ConfigId: roleBase.RoleData.HeroData.ConfigId,
  1276. FightPower: int32(roleBase.RoleData.FightPower),
  1277. VipLevel: roleBase.VipLevel,
  1278. HeadId: headId,
  1279. }
  1280. // info.JobLevel = this.GetJobLevel()
  1281. // info.AttrList = append(roleBase.RoleData.AttrList)
  1282. info.FashionData = roleBase.FashionData
  1283. if roleArena.Arena != nil {
  1284. info.DanScore = roleArena.Arena.Score
  1285. }
  1286. info.Fashion = &serverproto.RoleFashion{}
  1287. for _, data := range roleFashion.FashionList {
  1288. info.Fashion.FashionList = append(info.Fashion.FashionList, data)
  1289. }
  1290. //世界boss,只上阵主角
  1291. info.RoleHero = roleBase.RoleData.HeroData
  1292. info.Hero = &serverproto.RoleHero{}
  1293. for _, data := range roleHero.HeroData {
  1294. info.Hero.HeroData = append(info.Hero.HeroData, data)
  1295. }
  1296. baseStr := model.GuildRoleToGuildPrefix
  1297. fieldStr := strconv.FormatUint(uint64(uid), 10)
  1298. guildStr, guildErr := service.GetRedis().HGet(baseStr, fieldStr).Result()
  1299. if guildErr == nil {
  1300. guildIndex := &serverproto.GuildIdex{}
  1301. err := model.GetDecodeMessage(guildIndex, guildStr)
  1302. //找到公会索引//公会ID 不为零的话
  1303. if err == nil {
  1304. if guildIndex.GuildId != 0 {
  1305. fieldStr := strconv.FormatUint(uint64(guildIndex.GuildId), 10)
  1306. baseStr, baseErr := service.GetRedis().HGet(model.GuildBasePrefix, fieldStr).Result()
  1307. if baseErr == nil {
  1308. recordBase := &serverproto.GuildBase{}
  1309. deErr := model.GetDecodeMessage(recordBase, baseStr)
  1310. if deErr == nil {
  1311. info.GuildName = recordBase.GuildBrief.GuildName
  1312. }
  1313. }
  1314. }
  1315. } else {
  1316. util.InfoF("[GetRoleToGuild] get guild index not found")
  1317. }
  1318. }
  1319. GetViewRolePetData(uid, info)
  1320. return int32(serverproto.ErrorCode_ERROR_OK)
  1321. }
  1322. func GetViewRolePetData(uid uint64, info *serverproto.ViewRoleInfo) {
  1323. if info == nil {
  1324. return
  1325. }
  1326. uidStr := strconv.FormatUint(uid, 10)
  1327. keyStr := RolePetDataPrefix + uidStr
  1328. if !model.ExistKey(keyStr) {
  1329. return
  1330. }
  1331. if info.RoleHero.BattlePetId != 0 {
  1332. fieldStr := RolePetDataFieldPrefix_petlist + strconv.Itoa(int(info.RoleHero.BattlePetId))
  1333. petStr, petErr := service.GetRedis().HGet(keyStr, fieldStr).Result()
  1334. if petErr == nil && petErr != service.NIL {
  1335. petData := &serverproto.PetData{}
  1336. err := model.GetDecodeMessage(petData, petStr)
  1337. if err == nil {
  1338. info.PetList = append(info.PetList, petData)
  1339. }
  1340. }
  1341. }
  1342. for _, hero := range info.Hero.HeroData {
  1343. if hero.BattlePetId != 0 {
  1344. fieldStr := RolePetDataFieldPrefix_petlist + strconv.Itoa(int(hero.BattlePetId))
  1345. petStr, petErr := service.GetRedis().HGet(keyStr, fieldStr).Result()
  1346. if petErr == nil && petErr != service.NIL {
  1347. petData := &serverproto.PetData{}
  1348. err := model.GetDecodeMessage(petData, petStr)
  1349. if err == nil {
  1350. info.PetList = append(info.PetList, petData)
  1351. }
  1352. }
  1353. }
  1354. }
  1355. }
  1356. func GetPlayerGuildName(uid uint64) string {
  1357. retStr := ""
  1358. baseStr := model.GuildRoleToGuildPrefix
  1359. fieldStr := strconv.FormatUint(uint64(uid), 10)
  1360. guildStr, guildErr := service.GetRedis().HGet(baseStr, fieldStr).Result()
  1361. if guildErr == nil {
  1362. guildIndex := &serverproto.GuildIdex{}
  1363. err := model.GetDecodeMessage(guildIndex, guildStr)
  1364. //找到公会索引//公会ID 不为零的话
  1365. if err == nil {
  1366. if guildIndex.GuildId != 0 {
  1367. fieldStr := strconv.FormatUint(uint64(guildIndex.GuildId), 10)
  1368. baseStr, baseErr := service.GetRedis().HGet(model.GuildBasePrefix, fieldStr).Result()
  1369. if baseErr == nil {
  1370. recordBase := &serverproto.GuildBase{}
  1371. deErr := model.GetDecodeMessage(recordBase, baseStr)
  1372. if deErr == nil {
  1373. retStr = recordBase.GuildBrief.GuildName
  1374. }
  1375. }
  1376. }
  1377. } else {
  1378. util.InfoF("[GetRoleToGuild] get guild index not found")
  1379. }
  1380. }
  1381. return retStr
  1382. }
  1383. func GetPlayerGuildIdAndName(uid uint64) (uint64, string) {
  1384. retStr := ""
  1385. baseStr := model.GuildRoleToGuildPrefix
  1386. fieldStr := strconv.FormatUint(uint64(uid), 10)
  1387. guildStr, guildErr := service.GetRedis().HGet(baseStr, fieldStr).Result()
  1388. if guildErr == nil {
  1389. guildIndex := &serverproto.GuildIdex{}
  1390. err := model.GetDecodeMessage(guildIndex, guildStr)
  1391. //找到公会索引//公会ID 不为零的话
  1392. if err == nil {
  1393. if guildIndex.GuildId != 0 {
  1394. fieldStr := strconv.FormatUint(uint64(guildIndex.GuildId), 10)
  1395. baseStr, baseErr := service.GetRedis().HGet(model.GuildBasePrefix, fieldStr).Result()
  1396. if baseErr == nil {
  1397. recordBase := &serverproto.GuildBase{}
  1398. deErr := model.GetDecodeMessage(recordBase, baseStr)
  1399. if deErr == nil {
  1400. return uint64(guildIndex.GuildId), recordBase.GuildBrief.GuildName
  1401. }
  1402. }
  1403. }
  1404. } else {
  1405. util.InfoF("[GetRoleToGuild] get guild index not found")
  1406. }
  1407. }
  1408. return 0, retStr
  1409. }
  1410. func ExistActiveCode(activeCode string) serverproto.ErrorCode {
  1411. keyStr := RoleActiveCodeUsedListPrefix
  1412. valueStr, err := service.GetRedis().HGet(keyStr, activeCode).Result()
  1413. if err != nil && err != service.NIL {
  1414. return serverproto.ErrorCode_ERROR_FAIL
  1415. }
  1416. if err == service.NIL || len(valueStr) <= 0 {
  1417. return serverproto.ErrorCode_ERROR_OK
  1418. }
  1419. return serverproto.ErrorCode_ERROR_ROLE_ACTIVECODE_USED
  1420. }
  1421. func SetActiveCode(activeCode string, uid uint64) bool {
  1422. keyStr := RoleActiveCodeUsedListPrefix
  1423. _, err := service.GetRedis().HSet(keyStr, activeCode, uid).Result()
  1424. if err != nil {
  1425. return false
  1426. }
  1427. return true
  1428. }
  1429. // task
  1430. const TASK_REWARD_STATE_REWARD_DB = 2
  1431. const TASK_REWARD_STATE_DELETE = 3
  1432. func SetRoleTaskToRedis(uid uint64, roleTask *serverproto.RoleTask) {
  1433. uidStr := strconv.FormatUint(uid, 10)
  1434. keyStr := RoleTaskDataPrefix + uidStr
  1435. KeyHardStr := RoleTaskDataHardPrefix + uidStr
  1436. KeyHard2Str := RoleTaskDataHard2Prefix + uidStr
  1437. for idx := range roleTask.TaskList {
  1438. taskInfo := roleTask.TaskList[idx]
  1439. fieldStr := strconv.Itoa(int(taskInfo.TaskId))
  1440. if taskInfo.TaskType == model.TASK_TYPE_HARD || taskInfo.TaskType == model.TASK_TYPE_HARD_GROUP {
  1441. //困难模式任务删除
  1442. if taskInfo.HardState == TASK_REWARD_STATE_DELETE {
  1443. service.GetRedis().HDel(KeyHardStr, fieldStr)
  1444. continue
  1445. }
  1446. msgData, err := rocommon.GetCodec().Marshal(taskInfo)
  1447. if err != nil {
  1448. util.ErrorF("SetRoleTaskToRedis uid=%v Marshal err=%v field=%v", uid, err, fieldStr)
  1449. continue
  1450. }
  1451. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  1452. _, err = service.GetRedis().HSet(KeyHardStr, fieldStr, msgStr).Result()
  1453. if err != nil {
  1454. util.ErrorF("SetRoleTaskToRedis uid=%v err=%v %v", uid, err)
  1455. }
  1456. } else if taskInfo.TaskType == model.TASK_TYPE_HARD2 || taskInfo.TaskType == model.TASK_TYPE_HARD2_GROUP {
  1457. //困难模式任务删除
  1458. if taskInfo.HardState == TASK_REWARD_STATE_DELETE {
  1459. service.GetRedis().HDel(KeyHard2Str, fieldStr)
  1460. continue
  1461. }
  1462. msgData, err := rocommon.GetCodec().Marshal(taskInfo)
  1463. if err != nil {
  1464. util.ErrorF("SetRoleTaskToRedis uid=%v Marshal err=%v field=%v", uid, err, fieldStr)
  1465. continue
  1466. }
  1467. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  1468. _, err = service.GetRedis().HSet(KeyHard2Str, fieldStr, msgStr).Result()
  1469. if err != nil {
  1470. util.ErrorF("SetRoleTaskToRedis uid=%v err=%v %v", uid, err)
  1471. }
  1472. } else {
  1473. //主线完成的任务直接删除
  1474. if taskInfo.State == TASK_REWARD_STATE_REWARD_DB && len(taskInfo.Progress) <= 0 {
  1475. service.GetRedis().HDel(keyStr, fieldStr)
  1476. continue
  1477. }
  1478. msgData, err := rocommon.GetCodec().Marshal(taskInfo)
  1479. if err != nil {
  1480. util.ErrorF("SetRoleTaskToRedis uid=%v Marshal err=%v field=%v", uid, err, fieldStr)
  1481. continue
  1482. }
  1483. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  1484. _, err = service.GetRedis().HSet(keyStr, fieldStr, msgStr).Result()
  1485. if err != nil {
  1486. util.ErrorF("SetRoleTaskToRedis uid=%v err=%v %v", uid, err)
  1487. }
  1488. }
  1489. }
  1490. //base
  1491. roleTask.TaskList = roleTask.TaskList[:0]
  1492. msgData, err := rocommon.GetCodec().Marshal(roleTask)
  1493. if err != nil {
  1494. util.ErrorF("SetRoleTaskToRedis uid=%v Marshal roleTask err=%v", uid, err)
  1495. return
  1496. }
  1497. msgStr := base64.StdEncoding.EncodeToString(msgData.([]byte))
  1498. _, err = service.GetRedis().HSet(keyStr, "base", msgStr).Result()
  1499. if err != nil {
  1500. util.ErrorF("SetRoleTaskToRedis base uid=%v err=%v", uid, err)
  1501. }
  1502. }
  1503. func GetRoleTaskFromRedis(uid uint64, roleTask *serverproto.RoleTask) bool {
  1504. uidStr := strconv.FormatUint(uid, 10)
  1505. keyStr := RoleTaskDataPrefix + uidStr
  1506. KeyHardStr := RoleTaskDataHardPrefix + uidStr
  1507. KeyHard2Str := RoleTaskDataHard2Prefix + uidStr
  1508. msgStrList, err := service.GetRedis().HGetAll(keyStr).Result()
  1509. if err != nil {
  1510. util.ErrorF("GetRoleTaskFromRedis uid=%v err=%v", uid, err)
  1511. return false
  1512. }
  1513. msgStrHardList, er := service.GetRedis().HGetAll(KeyHardStr).Result()
  1514. if er != nil {
  1515. util.ErrorF("GetRoleTaskFromRedis uid=%v err=%v", uid, err)
  1516. return false
  1517. }
  1518. msgStrHard2List, er := service.GetRedis().HGetAll(KeyHard2Str).Result()
  1519. if er != nil {
  1520. util.ErrorF("GetRoleTaskFromRedis uid=%v err=%v", uid, err)
  1521. return false
  1522. }
  1523. var tmpTaskList []*serverproto.TaskData
  1524. for key, val := range msgStrList {
  1525. if key == "base" {
  1526. msgData, err1 := base64.StdEncoding.DecodeString(val)
  1527. if err1 != nil {
  1528. util.ErrorF("GetRoleTaskFromRedis Base DecodeString uid=%v err=%v", uid, err1)
  1529. continue
  1530. }
  1531. err = rocommon.GetCodec().Unmarshal(msgData, roleTask)
  1532. if err != nil {
  1533. util.ErrorF("GetRoleTaskFromRedis Base Unmarshal uid=%v err=%v", uid, err)
  1534. continue
  1535. }
  1536. } else { // task
  1537. msgData, err1 := base64.StdEncoding.DecodeString(val)
  1538. if err1 != nil {
  1539. util.ErrorF("GetRoleTaskFromRedis Task DecodeString uid=%v err=%v", uid, err1)
  1540. continue
  1541. }
  1542. taskInfo := &serverproto.TaskData{}
  1543. err = rocommon.GetCodec().Unmarshal(msgData, taskInfo)
  1544. if err != nil {
  1545. util.ErrorF("GetRoleTaskFromRedis Task Unmarshal uid=%v err=%v", uid, err)
  1546. continue
  1547. }
  1548. tmpTaskList = append(tmpTaskList, taskInfo)
  1549. }
  1550. }
  1551. for _, val := range msgStrHardList {
  1552. msgData, err1 := base64.StdEncoding.DecodeString(val)
  1553. if err1 != nil {
  1554. util.ErrorF("GetRoleTaskFromRedis Task DecodeString uid=%v err=%v", uid, err1)
  1555. continue
  1556. }
  1557. taskInfo := &serverproto.TaskData{}
  1558. err = rocommon.GetCodec().Unmarshal(msgData, taskInfo)
  1559. if err != nil {
  1560. util.ErrorF("GetRoleTaskFromRedis Task Unmarshal uid=%v err=%v", uid, err)
  1561. continue
  1562. }
  1563. tmpTaskList = append(tmpTaskList, taskInfo)
  1564. }
  1565. for _, val := range msgStrHard2List {
  1566. msgData, err1 := base64.StdEncoding.DecodeString(val)
  1567. if err1 != nil {
  1568. util.ErrorF("GetRoleTaskFromRedis Task DecodeString uid=%v err=%v", uid, err1)
  1569. continue
  1570. }
  1571. taskInfo := &serverproto.TaskData{}
  1572. err = rocommon.GetCodec().Unmarshal(msgData, taskInfo)
  1573. if err != nil {
  1574. util.ErrorF("GetRoleTaskFromRedis Task Unmarshal uid=%v err=%v", uid, err)
  1575. continue
  1576. }
  1577. tmpTaskList = append(tmpTaskList, taskInfo)
  1578. }
  1579. roleTask.TaskList = append(roleTask.TaskList, tmpTaskList...)
  1580. return true
  1581. }
  1582. // //pet
  1583. func GetRolePetDataFromRedis(uid uint64, ev rocommon.ProcEvent) bool {
  1584. uidStr := strconv.FormatUint(uid, 10)
  1585. keyStr := RolePetDataPrefix + uidStr
  1586. if !model.ExistKey(keyStr) {
  1587. return false
  1588. }
  1589. //base
  1590. baseStr, err := service.GetRedis().HGetAll(keyStr).Result()
  1591. if err != nil {
  1592. util.ErrorF("GetRolePetDataFromRedis uid=%v err=%v", uid, err)
  1593. return false
  1594. }
  1595. util.InfoF("uid=%v GetRolePetDataFromRedis len=%v", uid, len(baseStr))
  1596. var tmpPetList []*serverproto.PetData
  1597. var tmpPetBondList []*serverproto.PetBondData
  1598. dataCount := 0
  1599. for key, val := range baseStr {
  1600. if key == RolePetDataFieldPrefix_base {
  1601. msg := &serverproto.SSLoadPetNtf{}
  1602. msg.Pet = &serverproto.RolePet{}
  1603. err = model.GetDecodeMessage(msg.Pet, val)
  1604. if err != nil {
  1605. util.ErrorF("GetRolePetDataFromRedis Base Unmarshal uid=%v err=%v", uid, err)
  1606. continue
  1607. }
  1608. model.ServiceReplay(ev, msg)
  1609. } else if strings.Contains(key, RolePetDataFieldPrefix_petlist) {
  1610. tmpPetData := &serverproto.PetData{}
  1611. err = model.GetDecodeMessage(tmpPetData, val)
  1612. if err != nil {
  1613. util.ErrorF("GetRolePetDataFromRedis PetData Unmarshal uid=%v err=%v", uid, err)
  1614. continue
  1615. }
  1616. tmpPetData.BattleAttrListOld = tmpPetData.BattleAttrListOld[:0]
  1617. tmpPetList = append(tmpPetList, tmpPetData)
  1618. dataCount++
  1619. } else if strings.Contains(key, RolePetDataFieldPrefix_bond) {
  1620. tmpBondData := &serverproto.PetBondData{}
  1621. err = model.GetDecodeMessage(tmpBondData, val)
  1622. if err != nil {
  1623. util.ErrorF("GetRolePetDataFromRedis BondData Unmarshal uid=%v err=%v", uid, err)
  1624. continue
  1625. }
  1626. tmpPetBondList = append(tmpPetBondList, tmpBondData)
  1627. dataCount++
  1628. }
  1629. if dataCount >= 100 {
  1630. msg := &serverproto.SSLoadPetNtf{}
  1631. msg.Pet = &serverproto.RolePet{}
  1632. msg.Pet.PetList = append(msg.Pet.PetList, tmpPetList...)
  1633. msg.Pet.BondList = append(msg.Pet.BondList, tmpPetBondList...)
  1634. model.ServiceReplay(ev, msg)
  1635. tmpPetList = tmpPetList[:0]
  1636. tmpPetBondList = tmpPetBondList[:0]
  1637. dataCount = 0
  1638. }
  1639. }
  1640. if dataCount > 0 {
  1641. msg := &serverproto.SSLoadPetNtf{}
  1642. msg.Pet = &serverproto.RolePet{}
  1643. msg.Pet.PetList = append(msg.Pet.PetList, tmpPetList...)
  1644. msg.Pet.BondList = append(msg.Pet.BondList, tmpPetBondList...)
  1645. model.ServiceReplay(ev, msg)
  1646. tmpPetList = tmpPetList[:0]
  1647. tmpPetBondList = tmpPetBondList[:0]
  1648. dataCount = 0
  1649. }
  1650. return true
  1651. }
  1652. // //skill equip
  1653. func GetRoleSkillEquipDataFromRedis(uid uint64, roleSkillEquip *serverproto.RoleSkillEquip) bool {
  1654. uidStr := strconv.FormatUint(uid, 10)
  1655. keyStr := RoleSkillEquipDataPrefix + uidStr
  1656. if !model.ExistKey(keyStr) {
  1657. return false
  1658. }
  1659. if roleSkillEquip == nil {
  1660. return false
  1661. }
  1662. //base
  1663. baseStr, err := service.GetRedis().HGetAll(keyStr).Result()
  1664. if err != nil {
  1665. util.ErrorF("GetRoleSkillEquipDataFromRedis uid=%v err=%v", uid, err)
  1666. return false
  1667. }
  1668. util.InfoF("uid=%v GetRoleSkillEquipDataFromRedis len=%v", uid, len(baseStr))
  1669. //var tmpSkillEquipList []*serverproto.SkillEquipData
  1670. //dataCount := 0
  1671. for key, val := range baseStr {
  1672. if key == RoleSkillEquipDataPrefix_base {
  1673. //msg := &serverproto.SSLoadSkillEquipNtf{}
  1674. //msg.SkillEquip = &serverproto.RoleSkillEquip{}
  1675. tempSkillEquip := &serverproto.RoleSkillEquip{}
  1676. err = model.GetDecodeMessage(tempSkillEquip, val)
  1677. if err != nil {
  1678. util.ErrorF("GetRoleSkillEquipDataFromRedis Base Unmarshal uid=%v err=%v", uid, err)
  1679. continue
  1680. }
  1681. //model.ServiceReplay(ev, msg)
  1682. roleSkillEquip.MaxSkillEquipId = tempSkillEquip.MaxSkillEquipId
  1683. } else if strings.Contains(key, RoleSkillEquipDataPrefix_list) {
  1684. tmpEquipData := &serverproto.SkillEquipData{}
  1685. err = model.GetDecodeMessage(tmpEquipData, val)
  1686. if err != nil {
  1687. util.ErrorF("GetRoleSkillEquipDataFromRedis PetData Unmarshal uid=%v err=%v", uid, err)
  1688. continue
  1689. }
  1690. roleSkillEquip.SkillEquipList = append(roleSkillEquip.SkillEquipList, tmpEquipData)
  1691. //dataCount++
  1692. }
  1693. //if dataCount >= 100 {
  1694. // msg := &serverproto.SSLoadSkillEquipNtf{}
  1695. // msg.SkillEquip = &serverproto.RoleSkillEquip{}
  1696. // msg.SkillEquip.SkillEquipList = append(msg.SkillEquip.SkillEquipList, tmpSkillEquipList...)
  1697. // model.ServiceReplay(ev, msg)
  1698. //
  1699. // tmpSkillEquipList = tmpSkillEquipList[:0]
  1700. // dataCount = 0
  1701. //}
  1702. }
  1703. //if dataCount > 0 {
  1704. // msg := &serverproto.SSLoadSkillEquipNtf{}
  1705. // msg.SkillEquip = &serverproto.RoleSkillEquip{}
  1706. // msg.SkillEquip.SkillEquipList = append(msg.SkillEquip.SkillEquipList, tmpSkillEquipList...)
  1707. // model.ServiceReplay(ev, msg)
  1708. // tmpSkillEquipList = tmpSkillEquipList[:0]
  1709. // dataCount = 0
  1710. //}
  1711. return true
  1712. }
  1713. func SetSkillEquipDataToRedis(uid uint64, msg *serverproto.SSSkillEquipDataSaveReq) {
  1714. uidStr := strconv.FormatUint(uid, 10)
  1715. keyStr := RoleSkillEquipDataPrefix + uidStr
  1716. // base info
  1717. baseStr, err := service.GetRedis().HGet(keyStr, RoleSkillEquipDataPrefix_base).Result()
  1718. if err != nil && err != service.NIL {
  1719. util.ErrorF("SetSkillEquipDataToRedis Base uid=%v err=%v", uid, err)
  1720. return
  1721. }
  1722. roleSkillEquip := &serverproto.RoleSkillEquip{}
  1723. if err == service.NIL {
  1724. msg.SkillEquipDelList = []uint32{}
  1725. } else {
  1726. err = model.GetDecodeMessage(roleSkillEquip, baseStr)
  1727. if err != nil {
  1728. util.ErrorF("SetSkillEquipDataToRedis base Unmarshal uid=%v err=%v", uid, err)
  1729. return
  1730. }
  1731. }
  1732. if msg.SkillEquip.MaxSkillEquipId > roleSkillEquip.MaxSkillEquipId {
  1733. roleSkillEquip.MaxSkillEquipId = msg.SkillEquip.MaxSkillEquipId
  1734. err, msgData := model.GetEncodeMessage(roleSkillEquip)
  1735. if err != nil {
  1736. util.ErrorF("SetSkillEquipDataToRedis uid=%v Marshal err=%v field=base", uid, err)
  1737. return
  1738. }
  1739. service.GetRedis().HSet(keyStr, RoleSkillEquipDataPrefix_base, msgData)
  1740. }
  1741. //skill equip add
  1742. for idx := 0; idx < len(msg.SkillEquip.SkillEquipList); idx++ {
  1743. skillEquip := msg.SkillEquip.SkillEquipList[idx]
  1744. if skillEquip == nil {
  1745. continue
  1746. }
  1747. err, msgData := model.GetEncodeMessage(skillEquip)
  1748. if err != nil {
  1749. continue
  1750. }
  1751. fieldStr := RoleSkillEquipDataPrefix_list + strconv.Itoa(int(skillEquip.Id))
  1752. service.GetRedis().HSet(keyStr, fieldStr, msgData)
  1753. }
  1754. //skill equip remove
  1755. for idx := 0; idx < len(msg.SkillEquipDelList); idx++ {
  1756. if msg.SkillEquipDelList[idx] <= 0 {
  1757. continue
  1758. }
  1759. fieldStr := RoleSkillEquipDataPrefix_list + strconv.Itoa(int(msg.SkillEquipDelList[idx]))
  1760. service.GetRedis().HDel(keyStr, fieldStr)
  1761. }
  1762. }
  1763. func SetRolePetDataToRedis(uid uint64, msg *serverproto.SSPetDataSaveReq) {
  1764. uidStr := strconv.FormatUint(uid, 10)
  1765. keyStr := RolePetDataPrefix + uidStr
  1766. baseStr, err := service.GetRedis().HGet(keyStr, RolePetDataFieldPrefix_base).Result()
  1767. if err != nil && err != service.NIL {
  1768. util.ErrorF("SetRolePetDataToRedis Base uid=%v err=%v", uid, err)
  1769. return
  1770. }
  1771. //base
  1772. rolePet := &serverproto.RolePet{}
  1773. if err == service.NIL {
  1774. rolePet.PetManualRewardList = msg.RolePet.PetManualRewardList
  1775. msg.PetDelList = []uint32{}
  1776. msg.BondDelList = []int32{}
  1777. } else {
  1778. err = model.GetDecodeMessage(rolePet, baseStr)
  1779. if err != nil {
  1780. util.ErrorF("SetRolePetDataToRedis base Unmarshal uid=%v err=%v", uid, err)
  1781. return
  1782. }
  1783. if msg.RolePet.PetManualRewardList != nil {
  1784. rolePet.PetManualRewardList = msg.RolePet.PetManualRewardList
  1785. }
  1786. }
  1787. if msg.RolePet.MaxPetId > rolePet.MaxPetId {
  1788. rolePet.MaxPetId = msg.RolePet.MaxPetId
  1789. }
  1790. rolePet.PetManualList = rolePet.PetManualList[:0]
  1791. rolePet.AssistList = msg.RolePet.AssistList
  1792. rolePet.RushPet = msg.RolePet.RushPet
  1793. rolePet.PetEquipList = msg.RolePet.PetEquipList
  1794. err, msgData := model.GetEncodeMessage(rolePet)
  1795. if err != nil {
  1796. util.ErrorF("SetRolePetDataToRedis uid=%v Marshal err=%v field=base", uid, err)
  1797. return
  1798. }
  1799. service.GetRedis().HSet(keyStr, RolePetDataFieldPrefix_base, msgData)
  1800. //pet
  1801. for idx := 0; idx < len(msg.RolePet.PetList); idx++ {
  1802. petData := msg.RolePet.PetList[idx]
  1803. if petData == nil {
  1804. continue
  1805. }
  1806. err, msgData := model.GetEncodeMessage(petData)
  1807. if err != nil {
  1808. continue
  1809. }
  1810. fieldStr := RolePetDataFieldPrefix_petlist + strconv.Itoa(int(petData.Id))
  1811. service.GetRedis().HSet(keyStr, fieldStr, msgData)
  1812. }
  1813. for idx := 0; idx < len(msg.PetDelList); idx++ {
  1814. if msg.PetDelList[idx] <= 0 {
  1815. continue
  1816. }
  1817. fieldStr := RolePetDataFieldPrefix_petlist + strconv.Itoa(int(msg.PetDelList[idx]))
  1818. service.GetRedis().HDel(keyStr, fieldStr)
  1819. }
  1820. //bond
  1821. for idx := 0; idx < len(msg.RolePet.BondList); idx++ {
  1822. bondData := msg.RolePet.BondList[idx]
  1823. if bondData == nil {
  1824. continue
  1825. }
  1826. err, msgData := model.GetEncodeMessage(bondData)
  1827. if err != nil {
  1828. continue
  1829. }
  1830. fieldStr := RolePetDataFieldPrefix_bond + strconv.Itoa(int(bondData.BondCfgId))
  1831. service.GetRedis().HSet(keyStr, fieldStr, msgData)
  1832. }
  1833. for idx := 0; idx < len(msg.BondDelList); idx++ {
  1834. if msg.BondDelList[idx] <= 0 {
  1835. continue
  1836. }
  1837. fieldStr := RolePetDataFieldPrefix_bond + strconv.Itoa(int(msg.BondDelList[idx]))
  1838. service.GetRedis().HDel(keyStr, fieldStr)
  1839. }
  1840. }
  1841. func SetRolePetAssistDataToRedis(uid uint64, msg *serverproto.SSPetSetAssistNtf) {
  1842. uidStr := strconv.FormatUint(uid, 10)
  1843. err, msgData := model.GetEncodeMessage(msg)
  1844. if err != nil {
  1845. return
  1846. }
  1847. service.GetRedis().HSet(RolePetAssistDataPrefix, uidStr, msgData)
  1848. }
  1849. func getBattlePetInfo(uid uint64, petId uint32) *serverproto.PetData {
  1850. uidStr := strconv.FormatUint(uid, 10)
  1851. keyStr := RolePetDataPrefix + uidStr
  1852. fieldStr := RolePetDataFieldPrefix_petlist + strconv.Itoa(int(petId))
  1853. //base
  1854. petStr, err := service.GetRedis().HGet(keyStr, fieldStr).Result()
  1855. if err != nil {
  1856. util.ErrorF("getBattlePetInfo uid=%v err=%v", uid, err)
  1857. return nil
  1858. }
  1859. tmpPetData := &serverproto.PetData{}
  1860. err = model.GetDecodeMessage(tmpPetData, petStr)
  1861. if err != nil {
  1862. util.ErrorF("GetRolePetDataFromRedis PetData Unmarshal uid=%v err=%v", uid, err)
  1863. return nil
  1864. }
  1865. return tmpPetData
  1866. }
  1867. func getRolePetAssistDataFromRedis(uid uint64, roleAssistList map[uint32]*serverproto.AssistSaveData) {
  1868. uidStr := strconv.FormatUint(uid, 10)
  1869. msgStr, err := service.GetRedis().HGet(RolePetAssistDataPrefix, uidStr).Result()
  1870. if err != nil {
  1871. return
  1872. }
  1873. tmpMsg := &serverproto.SSPetSetAssistNtf{}
  1874. err = model.GetDecodeMessage(tmpMsg, msgStr)
  1875. if err != nil {
  1876. return
  1877. }
  1878. for idx := 0; idx < len(tmpMsg.AssistList); idx++ {
  1879. roleAssistList[tmpMsg.AssistList[idx].PetId] = tmpMsg.AssistList[idx]
  1880. }
  1881. }
  1882. // 获取其他援助玩家的宠物信息(羁绊信息,已经设置在玩家的羁绊列表中,检查合法性)
  1883. func RolePetQueryAssistInfo(uid uint64, msg *serverproto.SSPetQueryAssistInfoReq, ackMsg *serverproto.SSPetQueryAssistInfoAck) {
  1884. tmpList := set.New(set.NonThreadSafe)
  1885. for idx := 0; idx < len(msg.UidList); idx++ {
  1886. tmpList.Add(msg.UidList[idx])
  1887. }
  1888. //获取公会成员列表
  1889. var guildUidList []uint64
  1890. getGuildMemberLis(msg.GuildId, &guildUidList)
  1891. for idx := 0; idx < len(guildUidList); idx++ {
  1892. if !tmpList.Has(guildUidList[idx]) && guildUidList[idx] != uid {
  1893. tmpList.Add(guildUidList[idx])
  1894. }
  1895. }
  1896. for idx := 0; idx < len(msg.QueryAssistList); idx++ {
  1897. assistData := msg.QueryAssistList[idx]
  1898. //判断是否是好友,或者公会成员
  1899. if !tmpList.Has(assistData.OwnerUid) {
  1900. ackMsg.QueryAssistList = append(ackMsg.QueryAssistList, assistData)
  1901. continue
  1902. }
  1903. AssistCache := getAssistCache(assistData.OwnerUid)
  1904. if AssistCache == nil {
  1905. ackMsg.QueryAssistList = append(ackMsg.QueryAssistList, assistData)
  1906. continue
  1907. }
  1908. roleAssistList := getAssistCache(assistData.OwnerUid).assistData
  1909. bFind := false
  1910. for i := 0; i < len(assistData.PetInfoList); i++ {
  1911. tmpData := assistData.PetInfoList[i]
  1912. if val, ok := roleAssistList[tmpData.Id]; ok {
  1913. tmpData.AdvanceLevel = val.AdvLevel
  1914. tmpData.ConfigId = val.PetCfgId
  1915. tmpData.Id = val.PetId
  1916. tmpData.Param = 1 //表示当前找到对应ID的宠物
  1917. bFind = true
  1918. }
  1919. }
  1920. //目前uid对应玩家,羁绊列表中用到了援助玩家宠物
  1921. if bFind {
  1922. assistData.OwnerNickName = AssistCache.nickName
  1923. }
  1924. ackMsg.QueryAssistList = append(ackMsg.QueryAssistList, assistData)
  1925. }
  1926. }
  1927. // 获取激活羁绊所需的宠物列表(援助列表)
  1928. type AssistCacheDetailInfo struct {
  1929. quality int32
  1930. nature int32
  1931. }
  1932. type RolePetAssistCacheInfo struct {
  1933. uid uint64
  1934. assistData map[uint32]*serverproto.AssistSaveData
  1935. assistCfgData map[uint32]*AssistCacheDetailInfo
  1936. nickName string
  1937. refreshTime uint64
  1938. tempAssistData map[uint32]*serverproto.AssistSaveData
  1939. }
  1940. func (this *RolePetAssistCacheInfo) getAssistInfoByType(assistType serverproto.EPetAssistType,
  1941. assistTypeVal int32) []*serverproto.AssistSaveData {
  1942. //if assistType == serverproto.EPetAssistType_EPetAssistType_Num {
  1943. // return nil
  1944. //}
  1945. //
  1946. //var retList []*serverproto.AssistSaveData
  1947. //for key, val := range this.tempAssistData {
  1948. // if assistType == serverproto.EPetAssistType_EPetAssistType_Quality {
  1949. // if this.assistCfgData[key].quality >= assistTypeVal {
  1950. // retList = append(retList, val)
  1951. // delete(this.tempAssistData, key)
  1952. // }
  1953. // } else if assistType == serverproto.EPetAssistType_EPetAssistType_AdvLevel {
  1954. // if val.AdvLevel >= uint32(assistTypeVal) {
  1955. // retList = append(retList, val)
  1956. // delete(this.tempAssistData, key)
  1957. // }
  1958. // } else if assistType == serverproto.EPetAssistType_EPetAssistType_Nature {
  1959. // if this.assistCfgData[key].nature == assistTypeVal {
  1960. // retList = append(retList, val)
  1961. // delete(this.tempAssistData, key)
  1962. // }
  1963. // }
  1964. //}
  1965. //return retList
  1966. //相同宠物配置ID,进阶等级>=assistTypeVal
  1967. var retList []*serverproto.AssistSaveData
  1968. for key, val := range this.tempAssistData {
  1969. if val.PetCfgId == int32(assistType) && val.AdvLevel >= uint32(assistTypeVal) {
  1970. retList = append(retList, val)
  1971. delete(this.tempAssistData, key)
  1972. }
  1973. }
  1974. return retList
  1975. }
  1976. func (this *RolePetAssistCacheInfo) CopyAssistData() {
  1977. this.tempAssistData = map[uint32]*serverproto.AssistSaveData{}
  1978. for key, val := range this.assistData {
  1979. this.tempAssistData[key] = val
  1980. }
  1981. }
  1982. var RolePetAssistListCache = map[uint64]*RolePetAssistCacheInfo{}
  1983. const AssistInfoInvalidTime = 7 * 24 * 60 * 60 * 1000
  1984. func getAssistCache(uid uint64) *RolePetAssistCacheInfo {
  1985. nowTime := util.GetTimeMilliseconds()
  1986. cacheInfo, ok := RolePetAssistListCache[uid]
  1987. if !ok {
  1988. _, bfInfo := GetPlayerBriefInfo(uid)
  1989. if bfInfo == nil {
  1990. return nil
  1991. }
  1992. if bfInfo.OnlineTime > 0 && bfInfo.OnlineTime+uint64(AssistInfoInvalidTime) <= nowTime {
  1993. return nil
  1994. }
  1995. cacheInfo = &RolePetAssistCacheInfo{
  1996. uid: uid,
  1997. assistData: map[uint32]*serverproto.AssistSaveData{},
  1998. assistCfgData: map[uint32]*AssistCacheDetailInfo{},
  1999. nickName: bfInfo.NickName,
  2000. }
  2001. cacheInfo.refreshTime = nowTime + uint64(BriefInfoRefreshTime+rand.Int31n(BriefInfoRefreshTime))
  2002. getRolePetAssistDataFromRedis(uid, cacheInfo.assistData)
  2003. for key, val := range cacheInfo.assistData {
  2004. petCfgData, ok1 := serverproto.PetCfgLoader[val.PetCfgId]
  2005. if !ok1 {
  2006. continue
  2007. }
  2008. cacheInfo.assistCfgData[key] = &AssistCacheDetailInfo{
  2009. quality: petCfgData.Quality,
  2010. nature: petCfgData.NatureType,
  2011. }
  2012. }
  2013. } else {
  2014. _, bfInfo := GetPlayerBriefInfo(uid)
  2015. if bfInfo == nil {
  2016. delete(RolePetAssistListCache, uid)
  2017. return nil
  2018. }
  2019. if bfInfo.OnlineTime > 0 && bfInfo.OnlineTime+uint64(AssistInfoInvalidTime) <= nowTime {
  2020. delete(RolePetAssistListCache, uid)
  2021. return nil
  2022. }
  2023. if cacheInfo.refreshTime < nowTime {
  2024. cacheInfo.refreshTime = nowTime + uint64(BriefInfoRefreshTime+rand.Int31n(BriefInfoRefreshTime))
  2025. //assistDataInfo
  2026. cacheInfo.assistData = map[uint32]*serverproto.AssistSaveData{}
  2027. cacheInfo.assistCfgData = map[uint32]*AssistCacheDetailInfo{}
  2028. cacheInfo.nickName = bfInfo.NickName
  2029. getRolePetAssistDataFromRedis(uid, cacheInfo.assistData)
  2030. for key, val := range cacheInfo.assistData {
  2031. petCfgData, ok1 := serverproto.PetCfgLoader[val.PetCfgId]
  2032. if !ok1 {
  2033. continue
  2034. }
  2035. cacheInfo.assistCfgData[key] = &AssistCacheDetailInfo{
  2036. quality: petCfgData.Quality,
  2037. nature: petCfgData.NatureType,
  2038. }
  2039. }
  2040. }
  2041. }
  2042. return cacheInfo
  2043. }
  2044. // 获取公会成员列表
  2045. func getGuildMemberLis(guildId uint64, guildMemberList *[]uint64) {
  2046. if guildId <= 0 {
  2047. return
  2048. }
  2049. keyStr := model.GuildMemberPrefix
  2050. filedStr := strconv.FormatUint(guildId, 10)
  2051. retStr, err := service.GetRedis().HGet(keyStr, filedStr).Result()
  2052. if err != nil {
  2053. return
  2054. }
  2055. guildMember := &serverproto.MemberData{}
  2056. err = model.GetDecodeMessage(guildMember, retStr)
  2057. if err != nil {
  2058. return
  2059. }
  2060. for idx := 0; idx < len(guildMember.MemberInfo); idx++ {
  2061. *guildMemberList = append(*guildMemberList, guildMember.MemberInfo[idx].MemberId)
  2062. }
  2063. }
  2064. func RolePetBondAssistListGet(uid uint64, msg *serverproto.SSPetBondAssistListReq, ack *serverproto.SSPetBondAssistListAck) {
  2065. //每个位置最多放置N个宠物,总数不够时再进行填充
  2066. tmpList := set.New(set.NonThreadSafe)
  2067. for idx := 0; idx < len(msg.UidList); idx++ {
  2068. tmpList.Add(msg.UidList[idx])
  2069. }
  2070. //获取公会成员列表
  2071. var guildUidList []uint64
  2072. getGuildMemberLis(msg.GuildId, &guildUidList)
  2073. for idx := 0; idx < len(guildUidList); idx++ {
  2074. if !tmpList.Has(guildUidList[idx]) && guildUidList[idx] != uid {
  2075. tmpList.Add(guildUidList[idx])
  2076. }
  2077. }
  2078. var conditionSelectPetOtherList = map[uint64][]*serverproto.AssistSaveData{}
  2079. var conditionSelectPetList = map[uint64][]*serverproto.AssistSaveData{}
  2080. //var conditionSelectPetNeedList = map[int32]int32{} //位置对应的数量
  2081. var uidNameList = map[uint64]string{}
  2082. var retNumList = map[int]int32{}
  2083. totalNum := 0
  2084. uidList := tmpList.List()
  2085. for idx := 0; idx < len(uidList); idx++ {
  2086. findUid := uidList[idx].(uint64)
  2087. cacheInfo := getAssistCache(findUid)
  2088. if cacheInfo == nil {
  2089. continue
  2090. }
  2091. uidNameList[findUid] = cacheInfo.nickName
  2092. cacheInfo.CopyAssistData()
  2093. //key类型,v1类型数值 v2类型数量
  2094. //1品质 2进阶等级 3特殊属性 4数量个数
  2095. //Condition3List
  2096. totalNum += BondAssistListGetByCondition(findUid, 3, msg.Condition3List, cacheInfo,
  2097. conditionSelectPetOtherList, conditionSelectPetList, retNumList)
  2098. //Condition2List
  2099. totalNum += BondAssistListGetByCondition(findUid, 3, msg.Condition2List, cacheInfo,
  2100. conditionSelectPetOtherList, conditionSelectPetList, retNumList)
  2101. //Condition1List
  2102. totalNum += BondAssistListGetByCondition(findUid, 3, msg.Condition1List, cacheInfo,
  2103. conditionSelectPetOtherList, conditionSelectPetList, retNumList)
  2104. if totalNum >= 45 {
  2105. break
  2106. }
  2107. }
  2108. //todo...
  2109. // 总数不够需要进行填充
  2110. totalNum = 0
  2111. var ackAssistList []*serverproto.AssistData
  2112. for key, valList := range conditionSelectPetList {
  2113. assistData := &serverproto.AssistData{
  2114. OwnerNickName: uidNameList[key],
  2115. OwnerUid: key,
  2116. }
  2117. for idx := 0; idx < len(valList); idx++ {
  2118. petData := &serverproto.PetData{
  2119. Id: valList[idx].PetId,
  2120. ConfigId: valList[idx].PetCfgId,
  2121. AdvanceLevel: valList[idx].AdvLevel,
  2122. Param: 1,
  2123. }
  2124. assistData.PetInfoList = append(assistData.PetInfoList, petData)
  2125. totalNum++
  2126. }
  2127. ackAssistList = append(ackAssistList, assistData)
  2128. }
  2129. for key, valList := range conditionSelectPetOtherList {
  2130. var assistData *serverproto.AssistData = nil
  2131. for idx := 0; idx < len(ackAssistList); idx++ {
  2132. if ackAssistList[idx].OwnerUid == key {
  2133. assistData = ackAssistList[idx]
  2134. break
  2135. }
  2136. }
  2137. if assistData == nil {
  2138. assistData = &serverproto.AssistData{
  2139. OwnerNickName: uidNameList[key],
  2140. OwnerUid: key,
  2141. }
  2142. ackAssistList = append(ackAssistList, assistData)
  2143. }
  2144. for idx := 0; idx < len(valList); idx++ {
  2145. petData := &serverproto.PetData{
  2146. Id: valList[idx].PetId,
  2147. ConfigId: valList[idx].PetCfgId,
  2148. AdvanceLevel: valList[idx].AdvLevel,
  2149. Param: 1,
  2150. }
  2151. assistData.PetInfoList = append(assistData.PetInfoList, petData)
  2152. totalNum++
  2153. if totalNum >= 45 {
  2154. break
  2155. }
  2156. }
  2157. if totalNum >= 45 {
  2158. break
  2159. }
  2160. }
  2161. ack.AssistList = append(ack.AssistList, ackAssistList...)
  2162. }
  2163. func BondAssistListGetByCondition(findUid uint64, conditionIdx int, conList []*serverproto.KeyValueType, cacheInfo *RolePetAssistCacheInfo,
  2164. otherList map[uint64][]*serverproto.AssistSaveData, needList map[uint64][]*serverproto.AssistSaveData, retNumList map[int]int32) int {
  2165. totalNum := 0
  2166. //key类型,v1类型数值 v2类型数量
  2167. //1品质 2进阶等级 3特殊属性 4数量个数
  2168. for k := 0; k < len(conList); k++ {
  2169. retList := cacheInfo.getAssistInfoByType((serverproto.EPetAssistType)(conList[k].Key), conList[k].Value)
  2170. if len(retList) <= 0 {
  2171. continue
  2172. }
  2173. retNumIdx := conditionIdx*10 + (k + 1)
  2174. if retNumList[retNumIdx] >= 5 {
  2175. otherList[findUid] = append(otherList[findUid], retList...)
  2176. } else {
  2177. i := retNumList[retNumIdx]
  2178. j := 0
  2179. for ; i < 5; i++ {
  2180. needList[findUid] = append(needList[findUid], retList[j])
  2181. j++
  2182. totalNum++
  2183. retNumList[retNumIdx]++
  2184. if j >= len(retList) {
  2185. break
  2186. }
  2187. }
  2188. //剩余的放到other列表中,当总数不足时进行填充
  2189. if j < len(retList) {
  2190. for ii := j; ii < len(retList); ii++ {
  2191. otherList[findUid] = append(otherList[findUid], retList[ii])
  2192. }
  2193. }
  2194. }
  2195. }
  2196. return totalNum
  2197. }
  2198. func PetAdvAchievementGet(petCfgId int32, ackMsg *serverproto.SSPetAdvAchievementAck) {
  2199. fieldStr := strconv.Itoa(int(petCfgId))
  2200. msgData, err := service.GetRedis().HGet(RolePetAchievementPrefix, fieldStr).Result()
  2201. if err != nil {
  2202. return
  2203. }
  2204. advData := &serverproto.PetAdvAchievementData{}
  2205. err = model.GetDecodeMessage(advData, msgData)
  2206. if err != nil {
  2207. return
  2208. }
  2209. _, bf := GetPlayerBriefInfo(advData.Uid)
  2210. if bf != nil {
  2211. ackMsg.Brief = bf
  2212. ackMsg.PetCfgId = petCfgId
  2213. ackMsg.AchievementTime = advData.AchievementTime
  2214. }
  2215. }
  2216. func PetAdvAchievementSet(uid uint64, petCfgId int32, advLevel int32) {
  2217. fieldStr := strconv.Itoa(int(petCfgId))
  2218. msgData, err := service.GetRedis().HGet(RolePetAchievementPrefix, fieldStr).Result()
  2219. if err != nil && err != service.NIL {
  2220. return
  2221. }
  2222. advData := &serverproto.PetAdvAchievementData{}
  2223. err = model.GetDecodeMessage(advData, msgData)
  2224. if err != nil && err != service.NIL {
  2225. return
  2226. }
  2227. if advData.Uid != 0 {
  2228. //update
  2229. if advData.AdvLevel < advLevel {
  2230. advData.AdvLevel = advLevel
  2231. advData.Uid = uid
  2232. advData.AchievementTime = util.GetTimeMilliseconds()
  2233. err, msgData = model.GetEncodeMessage(advData)
  2234. if err != nil {
  2235. return
  2236. }
  2237. service.GetRedis().HSet(RolePetAchievementPrefix, fieldStr, msgData)
  2238. }
  2239. } else {
  2240. advData.AdvLevel = advLevel
  2241. advData.Uid = uid
  2242. advData.AchievementTime = util.GetTimeMilliseconds()
  2243. err, msgData = model.GetEncodeMessage(advData)
  2244. if err != nil {
  2245. return
  2246. }
  2247. service.GetRedis().HSet(RolePetAchievementPrefix, fieldStr, msgData)
  2248. }
  2249. }
  2250. // //expedition
  2251. // 救助发起求助的玩家 FromUid发起救助操作的玩家 BeHelpedUid发起求助的放玩家
  2252. func ExpeditionHelp(fromUid, beHelpedUid uint64) serverproto.ErrorCode {
  2253. //uidStr := strconv.FormatUint(beHelpedUid, 10)
  2254. //战斗数据
  2255. beHelpedRoleBattle := &serverproto.RoleBattle{}
  2256. err := GetSystemDataFromRedis(RoleBattleDataPrefix, beHelpedUid, beHelpedRoleBattle)
  2257. if err != nil {
  2258. util.InfoF("uid=%v ExpeditionHelp beHelpedUid=%v err=%v", fromUid, beHelpedUid, err)
  2259. return serverproto.ErrorCode_ERROR_FAIL
  2260. }
  2261. tmpExpeditionInfo := beHelpedRoleBattle.ExpeditionInfo
  2262. if tmpExpeditionInfo.BeAssistNum != nil {
  2263. //该玩家被救助的次数达到上限,无法救助
  2264. if tmpExpeditionInfo.BeAssistNum.Key <= tmpExpeditionInfo.BeAssistNum.Value {
  2265. return serverproto.ErrorCode_ERROR_EXPEDITION_HELP_CALLFORHELP_LIMIT
  2266. }
  2267. }
  2268. //之前过期的救助消息
  2269. if tmpExpeditionInfo.AssistTimeStamp == 0 {
  2270. return serverproto.ErrorCode_ERROR_EXPEDITION_HELP_MSG_EXPIRED
  2271. }
  2272. //已经救助过该玩家,无法再次救助
  2273. bFind := false
  2274. idx := 0
  2275. for idx = 0; idx < len(tmpExpeditionInfo.BeAssistUidList); idx++ {
  2276. tmpUidData := tmpExpeditionInfo.BeAssistUidList[idx]
  2277. //判断是否是同一天救助
  2278. bNotSameDay := model.IsDailyResetHour5(uint64(tmpUidData.Value) * 1000)
  2279. if tmpUidData.Key == fromUid {
  2280. if !bNotSameDay {
  2281. return serverproto.ErrorCode_ERROR_EXPEDITION_HELP_CALLFORHELP_HAS
  2282. }
  2283. bFind = true
  2284. break
  2285. }
  2286. }
  2287. //判断是否需要救助(英雄是否有死亡)
  2288. canBeHelp := false
  2289. for idx := 0; idx < len(tmpExpeditionInfo.BattleHeroHpList); idx++ {
  2290. if tmpExpeditionInfo.BattleHeroHpList[idx].Hp <= 0 {
  2291. canBeHelp = true
  2292. break
  2293. }
  2294. }
  2295. if !canBeHelp {
  2296. return serverproto.ErrorCode_ERROR_EXPEDITION_BE_HELPED
  2297. }
  2298. //增加beHelpedUid玩家被救助次数
  2299. if tmpExpeditionInfo.BeAssistNum == nil {
  2300. tmpExpeditionInfo.BeAssistNum = &serverproto.KeyValueType{
  2301. Key: model.GlobalExpeditionGuildBeHelpedNum,
  2302. }
  2303. }
  2304. //增加被救助次数
  2305. tmpExpeditionInfo.BeAssistNum.Value += 1
  2306. tmpExpeditionInfo.AssistState = false
  2307. tmpExpeditionInfo.AssistTimeStamp = 0
  2308. //回复所有英雄hp,sp
  2309. tmpExpeditionInfo.BattleHeroHpList = tmpExpeditionInfo.BattleHeroHpList[:0]
  2310. //加入救助列表
  2311. if bFind {
  2312. tmpExpeditionInfo.BeAssistUidList[idx].Value = int32(util.GetTimeSeconds())
  2313. } else {
  2314. tmpExpeditionInfo.BeAssistUidList = append(tmpExpeditionInfo.BeAssistUidList,
  2315. &serverproto.KeyValueType64{Key: fromUid, Value: int32(util.GetTimeSeconds())})
  2316. }
  2317. err = SetSystemDataToRedis(RoleBattleDataPrefix, beHelpedUid, beHelpedRoleBattle)
  2318. if err != nil {
  2319. return serverproto.ErrorCode_ERROR_FAIL
  2320. }
  2321. return serverproto.ErrorCode_ERROR_OK
  2322. }
  2323. // //pay支付
  2324. func SetPayOrderInfoToRedis(uid uint64, payOrderInfo *serverproto.PayOrderSaveInfo) serverproto.ErrorCode {
  2325. uidStr := strconv.FormatUint(uid, 10)
  2326. switch payOrderInfo.OrderState {
  2327. case int32(serverproto.PayOrderState_EPayOrderState_Gen): //订单生成并保持
  2328. fallthrough
  2329. case int32(serverproto.PayOrderState_EPayOrderState_PayFailed):
  2330. orderStr := strconv.FormatUint(payOrderInfo.CpOrderId, 10)
  2331. err, msgData := model.GetEncodeMessage(payOrderInfo)
  2332. if err != nil {
  2333. return serverproto.ErrorCode_ERROR_FAIL
  2334. }
  2335. err = service.GetRedis().HSet(model.PayOrderPrefix, orderStr, msgData).Err()
  2336. if err != nil {
  2337. return serverproto.ErrorCode_ERROR_FAIL
  2338. }
  2339. case int32(serverproto.PayOrderState_EPayOrderState_PayOk): //添加到成功但是没有获取奖励的订单id
  2340. okListKeyStr := model.PayOrderOKIdListPrefix + uidStr
  2341. orderStr := strconv.FormatUint(payOrderInfo.CpOrderId, 10)
  2342. //是否已经在完成订单id列表中
  2343. if service.GetRedis().SIsMember(okListKeyStr, payOrderInfo.CpOrderId).Val() {
  2344. util.InfoF("uid=%v SetPayOrderInfoToRedis order has been set ok for reward orderid=%v", uid, payOrderInfo.CpOrderId)
  2345. return serverproto.ErrorCode_ERROR_FAIL
  2346. }
  2347. msgStr, err := service.GetRedis().HGet(model.PayOrderPrefix, orderStr).Result()
  2348. if err != nil {
  2349. return serverproto.ErrorCode_ERROR_FAIL
  2350. }
  2351. oldPayOrderInfo := &serverproto.PayOrderSaveInfo{}
  2352. err = model.GetDecodeMessage(oldPayOrderInfo, msgStr)
  2353. if err != nil {
  2354. return serverproto.ErrorCode_ERROR_FAIL
  2355. }
  2356. if oldPayOrderInfo.OrderState == int32(serverproto.PayOrderState_EPayOrderState_Gen) {
  2357. oldPayOrderInfo.OrderState = int32(serverproto.PayOrderState_EPayOrderState_PayOk)
  2358. oldPayOrderInfo.OrderProcessTime = util.GetTimeMilliseconds()
  2359. err, msgData := model.GetEncodeMessage(oldPayOrderInfo)
  2360. if err != nil {
  2361. return serverproto.ErrorCode_ERROR_FAIL
  2362. }
  2363. service.GetRedis().HSet(model.PayOrderPrefix, orderStr, msgData)
  2364. //完成订单id列表
  2365. okListKeyStr := model.PayOrderOKIdListPrefix + uidStr
  2366. service.GetRedis().SAdd(okListKeyStr, payOrderInfo.CpOrderId)
  2367. }
  2368. case int32(serverproto.PayOrderState_EPayOrderState_PayOkReward):
  2369. orderStr := strconv.FormatUint(payOrderInfo.CpOrderId, 10)
  2370. payOrderInfo.OrderProcessTime = util.GetTimeMilliseconds()
  2371. err, msgData := model.GetEncodeMessage(payOrderInfo)
  2372. if err != nil {
  2373. return serverproto.ErrorCode_ERROR_FAIL
  2374. }
  2375. err = service.GetRedis().HSet(model.PayOrderPrefix, orderStr, msgData).Err()
  2376. if err != nil {
  2377. return serverproto.ErrorCode_ERROR_FAIL
  2378. }
  2379. //移除成订单id列表
  2380. okListKeyStr := model.PayOrderOKIdListPrefix + uidStr
  2381. service.GetRedis().SRem(okListKeyStr, payOrderInfo.CpOrderId)
  2382. default:
  2383. return serverproto.ErrorCode_ERROR_FAIL
  2384. }
  2385. return serverproto.ErrorCode_ERROR_OK
  2386. }
  2387. func GetPayOrderOkListFromRedis(uid uint64, ackMsg *serverproto.SSPayInfoOrderOkListGetAck) {
  2388. uidStr := strconv.FormatUint(uid, 10)
  2389. okListKeyStr := model.PayOrderOKIdListPrefix + uidStr
  2390. listStr, err := service.GetRedis().SMembers(okListKeyStr).Result()
  2391. if err != nil {
  2392. return
  2393. }
  2394. for idx := 0; idx < len(listStr); idx++ {
  2395. msgStr, err := service.GetRedis().HGet(model.PayOrderPrefix, listStr[idx]).Result()
  2396. if err != nil {
  2397. service.GetRedis().HDel(model.PayOrderPrefix, listStr[idx])
  2398. util.ErrorF("uid=%v GetPayOrderOkListFromRedis ok order not exist orderId=%v err=%v", uid, listStr[idx], err)
  2399. continue
  2400. }
  2401. payInfo := &serverproto.PayOrderSaveInfo{}
  2402. err = model.GetDecodeMessage(payInfo, msgStr)
  2403. if err != nil {
  2404. util.ErrorF("uid=%v GetPayOrderOkListFromRedis decode order=%v err=%v", uid, listStr[idx], err)
  2405. continue
  2406. }
  2407. if payInfo.OrderState == int32(serverproto.PayOrderState_EPayOrderState_PayOk) {
  2408. ackMsg.PayOrderOkList = append(ackMsg.PayOrderOkList, payInfo)
  2409. } else {
  2410. //pay money not equal with order money
  2411. service.GetRedis().HDel(model.PayOrderPrefix, listStr[idx])
  2412. util.ErrorF("uid=%v GetPayOrderOkListFromRedis order state error", uid, listStr[idx])
  2413. }
  2414. }
  2415. }
  2416. // //百人道场
  2417. func SetRoleDaoChang100ToRedis(uid uint64, info *serverproto.RoleDaoChang100) bool {
  2418. uidStr := strconv.FormatUint(uid, 10)
  2419. keyStr := model.RoleDaoChang100Prefix + uidStr
  2420. if info.LogState {
  2421. service.GetRedis().HSet(keyStr, "log", 1)
  2422. } else {
  2423. service.GetRedis().HSet(keyStr, "log", 0)
  2424. }
  2425. service.GetRedis().HSet(keyStr, "lastattackuid", info.LastAttackUid)
  2426. info.LogState = false
  2427. err, msgStr := model.GetEncodeMessage(info)
  2428. if err != nil {
  2429. util.ErrorF("SetRoleDaoChang100ToRedis uid=%v err=%v", uid, err)
  2430. return false
  2431. }
  2432. service.GetRedis().HSet(keyStr, "base", msgStr)
  2433. return true
  2434. }
  2435. func GetRoleDaoChang100FromRedis(uid uint64, info *serverproto.RoleDaoChang100) bool {
  2436. uidStr := strconv.FormatUint(uid, 10)
  2437. keyStr := model.RoleDaoChang100Prefix + uidStr
  2438. baseStr, err := service.GetRedis().HGet(keyStr, "base").Result()
  2439. if err != nil {
  2440. if err != service.NIL {
  2441. util.ErrorF("GetRoleDaoChang100FromRedis uid=%v err=%v", uid, err)
  2442. }
  2443. return false
  2444. }
  2445. err = model.GetDecodeMessage(info, baseStr)
  2446. if err != nil {
  2447. util.ErrorF("GetRoleDaoChang100FromRedis uid=%v err=%v GetDecodeMessage", uid, err)
  2448. return false
  2449. }
  2450. //log state
  2451. logStr, err := service.GetRedis().HGet(keyStr, "log").Result()
  2452. if err != nil {
  2453. util.ErrorF("GetRoleDaoChang100FromRedis uid=%v err=%v", uid, err)
  2454. return false
  2455. }
  2456. logState, err := model.Str2Num(logStr)
  2457. if err != nil {
  2458. util.ErrorF("GetRoleDaoChang100FromRedis uid=%v err=%v", uid, err)
  2459. }
  2460. if logState > 0 {
  2461. info.LogState = true
  2462. }
  2463. //lastattackuid
  2464. lastAttackUidStr, err := service.GetRedis().HGet(keyStr, "lastattackuid").Result()
  2465. if err != nil {
  2466. util.ErrorF("GetRoleDaoChang100FromRedis uid=%v err=%v", uid, err)
  2467. return false
  2468. }
  2469. lastAttackUid, err := model.Str2NumU64(lastAttackUidStr)
  2470. if err != nil {
  2471. util.ErrorF("GetRoleDaoChang100FromRedis uid=%v err=%v", uid, err)
  2472. }
  2473. info.LastAttackUid = lastAttackUid
  2474. return true
  2475. }
  2476. const MaxDaoChang100WheelLogCount int64 = 20
  2477. func GetRoleDaoChang100WheelLogListFromRedis(ssAckMsg *serverproto.SCDaoChang100WheelLogAck) {
  2478. keyStr := model.RoleDaoChang100WheeLogPrefix
  2479. msgList, err := service.GetRedis().LRange(keyStr, 0, MaxDaoChang100WheelLogCount-1).Result()
  2480. if err != nil {
  2481. return
  2482. }
  2483. for idx := 0; idx < len(msgList); idx++ {
  2484. logData := &serverproto.WheelLogData{}
  2485. err := model.GetDecodeMessage(logData, msgList[idx])
  2486. if err != nil {
  2487. continue
  2488. }
  2489. ssAckMsg.LogList = append(ssAckMsg.LogList, logData)
  2490. }
  2491. }
  2492. func SetRoleDaoChang100WheelLogToRedis(uid uint64, msg *serverproto.SSDaoChang100WheelLogAddNtf) {
  2493. keyStr := model.RoleDaoChang100WheeLogPrefix
  2494. for idx := 0; idx < len(msg.LogList); idx++ {
  2495. err, logMsg := model.GetEncodeMessage(msg.LogList[idx])
  2496. if err != nil {
  2497. continue
  2498. }
  2499. retNum, err := service.GetRedis().LPush(keyStr, logMsg).Result()
  2500. if err == nil && retNum > MaxDaoChang100WheelLogCount {
  2501. service.GetRedis().LTrim(keyStr, 0, MaxDaoChang100WheelLogCount-1)
  2502. }
  2503. }
  2504. }
  2505. // 远航被挑战日志保存
  2506. func SetRoleCrossYuanHangLogToRedis(msg *serverproto.SSCrossYuanHangTrialLogNtf) {
  2507. uid := msg.NtfUid
  2508. roleCross := &serverproto.RoleCross{}
  2509. err := GetSystemDataFromRedis(RoleCrossPrefix, uid, roleCross)
  2510. if err != nil && err != service.NIL {
  2511. util.InfoF("GetRoleFromRedis SetRoleCrossYuanHangLogToRedis err=%v uid=%v", err, uid)
  2512. return
  2513. }
  2514. if roleCross.Yuanhangtrial != nil {
  2515. roleCross.Yuanhangtrial.LogList = append(roleCross.Yuanhangtrial.LogList, msg.LogData)
  2516. err = SetSystemDataToRedis(RoleCrossPrefix, uid, roleCross)
  2517. if err != nil {
  2518. util.InfoF("uid=%v SetRoleCrossYuanHangLogToRedis save err=%v", uid, err)
  2519. }
  2520. }
  2521. }
  2522. // bt
  2523. // bt服务版本数据保存
  2524. func SetBTDataToRedis(uid uint64, msg *serverproto.SSBTDataSaveNtf) {
  2525. uidStr := strconv.FormatUint(uid, 10)
  2526. keyStr := RoleBTDataPrefix + uidStr
  2527. if msg.BtBoliData != nil {
  2528. err, msgData := model.GetEncodeMessage(msg.BtBoliData)
  2529. if err != nil {
  2530. return
  2531. }
  2532. _, err1 := service.GetRedis().HSet(keyStr, RoleBTBoliDataPrefix, msgData).Result()
  2533. if err1 != nil {
  2534. util.WarnF("uid=%v SetBTDataToRedis-BtBoliData fieldStr=%v err=%v", uid, RoleBTBoliDataPrefix, err1)
  2535. }
  2536. }
  2537. if msg.BaseData != nil {
  2538. err, msgData := model.GetEncodeMessage(msg.BaseData)
  2539. if err != nil {
  2540. return
  2541. }
  2542. _, err1 := service.GetRedis().HSet(keyStr, RoleBTBaseDataPrefix, msgData).Result()
  2543. if err1 != nil {
  2544. util.WarnF("uid=%v SetBTDataToRedis-BTBaseData fieldStr=%v err=%v", uid, RoleBTBaseDataPrefix, err1)
  2545. }
  2546. }
  2547. }
  2548. func GetBTDataFromRedis(uid uint64, msg *serverproto.RoleBT) {
  2549. uidStr := strconv.FormatUint(uid, 10)
  2550. keyStr := RoleBTDataPrefix + uidStr
  2551. msgStr, err := service.GetRedis().HGet(keyStr, RoleBTBoliDataPrefix).Result()
  2552. if err == nil {
  2553. msg.BoliData = &serverproto.BTBoliData{}
  2554. err = model.GetDecodeMessage(msg.BoliData, msgStr)
  2555. if err != nil {
  2556. util.ErrorF("uid=%v GetBTDataFromRedis error=%v", uid, err)
  2557. }
  2558. }
  2559. msgStr, err = service.GetRedis().HGet(keyStr, RoleBTBaseDataPrefix).Result()
  2560. if err == nil {
  2561. msg.BaseData = &serverproto.BTBaseData{}
  2562. err = model.GetDecodeMessage(msg.BaseData, msgStr)
  2563. if err != nil {
  2564. util.ErrorF("uid=%v GetBTDataFromRedis error=%v", uid, err)
  2565. }
  2566. }
  2567. }