orm_helper.go 84 KB

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