orm_helper.go 88 KB

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