orm_helper.go 86 KB

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