orm_invitation.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. package model
  2. import (
  3. "rocommon/service"
  4. "rocommon/util"
  5. "roserver/baseserver/model"
  6. "roserver/serverproto"
  7. "strconv"
  8. "strings"
  9. )
  10. ///invitation
  11. const (
  12. Invitation_Member_Max_Num = 30
  13. )
  14. //生成邀请码
  15. func InvitationGenNumber(uid uint64, bGenNumber bool, checkMasterUid uint64) (uint64, uint64) {
  16. var genNumber int64 = 0
  17. if bGenNumber {
  18. genNumber = service.GetRedis().Incr(InvitationNumberPrefix).Val()
  19. genNumber = 100000 + genNumber
  20. filedStr := strconv.FormatUint(uint64(genNumber), 10)
  21. service.GetRedis().HSet(RoleInvitationNumberPrefix, filedStr, uid)
  22. }
  23. //判断maseter是否合理
  24. if checkMasterUid > 0 {
  25. masterUidStr := strconv.FormatUint(checkMasterUid, 10)
  26. masterKeyStr := RoleInvitationPrefix + masterUidStr
  27. memberStr := "m:" + strconv.FormatUint(uid, 10)
  28. bExist := service.GetRedis().HExists(masterKeyStr, memberStr).Val()
  29. if !bExist {
  30. checkMasterUid = 0
  31. }
  32. }
  33. return uint64(genNumber), checkMasterUid
  34. }
  35. //根据邀请码查询玩家信息
  36. func InvitationGetUserInfoByNumber(uid uint64, number uint64, ackMsg *serverproto.SSInvitationNumberUserInfoAck) {
  37. filedStr := strconv.FormatUint(uint64(number), 10)
  38. masterUidStr, err := service.GetRedis().HGet(RoleInvitationNumberPrefix, filedStr).Result()
  39. if err != nil && err != service.NIL {
  40. util.InfoF("uid=%v InvitationGetUserInfoByNumber number=%v err=%v", uid, number, err)
  41. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_INVITATION_NUMBER_INVALID)
  42. return
  43. }
  44. masterUid, err := model.Str2NumU64(masterUidStr)
  45. if err != nil {
  46. util.InfoF("uid=%v InvitationGetUserInfoByNumber uidstr=%v convert uid err=%v", uid, masterUidStr, err)
  47. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_INVITATION_NUMBER_INVALID)
  48. return
  49. }
  50. err, masterBfInfo := GetPlayerBriefInfo(masterUid)
  51. if err != nil {
  52. util.InfoF("uid=%v InvitationGetUserInfoByNumber master br nil err=%v", uid, masterUidStr, err)
  53. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_INVITATION_NUMBER_INVALID)
  54. return
  55. }
  56. masterKeyStr := RoleInvitationPrefix + masterUidStr
  57. masterMemberNumStr := service.GetRedis().HGet(masterKeyStr, "mnum").Val()
  58. masterMemberNum, _ := model.Str2Num(masterMemberNumStr)
  59. ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
  60. ackMsg.Brief = masterBfInfo
  61. ackMsg.Number = number
  62. ackMsg.MemberNum = int32(masterMemberNum)
  63. }
  64. //玩家成为导师成员
  65. func InvitationBeToBeMember(masterNumber, masterUid uint64, selfUid *serverproto.InvitationMemberValData) serverproto.ErrorCode {
  66. masterUidStr := strconv.FormatUint(masterUid, 10)
  67. masterKeyStr := RoleInvitationPrefix + masterUidStr
  68. masterMemberNumStr := service.GetRedis().HGet(masterKeyStr, "mnum").Val()
  69. masterMemberNum, _ := model.Str2Num(masterMemberNumStr)
  70. if masterMemberNum >= Invitation_Member_Max_Num {
  71. return serverproto.ErrorCode_ERROR_INVITATION_NUM_LIMIT
  72. }
  73. memberStr := "m:" + strconv.FormatUint(selfUid.Uid, 10)
  74. bExist := service.GetRedis().HExists(masterKeyStr, memberStr).Val()
  75. if bExist {
  76. return serverproto.ErrorCode_ERROR_INVITATION_IS_MEMBER
  77. }
  78. //add member
  79. err, msgData := model.GetEncodeMessage(selfUid)
  80. if err == nil {
  81. masterMemberNum++
  82. service.GetRedis().HSet(masterKeyStr, "mnum", masterMemberNum)
  83. service.GetRedis().HSet(masterKeyStr, memberStr, msgData)
  84. }
  85. return serverproto.ErrorCode_ERROR_OK
  86. }
  87. //
  88. var MaxInvitationLogCount int64 = 50
  89. /*
  90. hkey
  91. base
  92. task:id
  93. mnum
  94. m:uid
  95. lkey
  96. */
  97. func SetInvitationDataToRedis(uid uint64, msg *serverproto.SSInvitationSaveNtf) {
  98. uidStr := strconv.FormatUint(uid, 10)
  99. keyStr := RoleInvitationPrefix + uidStr
  100. if msg.BaseSave {
  101. roleInvitation := &serverproto.RoleInvitation{
  102. ClickNum: msg.ClickNum,
  103. SelfInvitationNumber: msg.SelfInvitationNumber,
  104. MasterUid: msg.MasterUid,
  105. MasterEndTime: msg.MasterEndTime,
  106. ClickMemberList: msg.ClickMemberList,
  107. ClickReplayMasterList: msg.ClickReplayMasterList,
  108. }
  109. fieldStr := "base"
  110. _, msgData := model.GetEncodeMessage(roleInvitation)
  111. service.GetRedis().HSet(keyStr, fieldStr, msgData)
  112. }
  113. //task list
  114. for idx := 0; idx < len(msg.TaskList); idx++ {
  115. fieldStr := "task:" + strconv.Itoa(int(msg.TaskList[idx].TaskId))
  116. _, msgData := model.GetEncodeMessage(msg.TaskList[idx])
  117. service.GetRedis().HSet(keyStr, fieldStr, msgData)
  118. }
  119. //member list
  120. service.GetRedis().HSet(keyStr, "mnum", msg.MemberNum) //总人数
  121. for idx := 0; idx < len(msg.AddMemberUidList); idx++ {
  122. memberData := msg.AddMemberUidList[idx]
  123. uidStr := strconv.FormatUint(memberData.Uid, 10)
  124. fieldStr := "m:" + uidStr
  125. _, msgData := model.GetEncodeMessage(memberData)
  126. service.GetRedis().HSet(keyStr, fieldStr, msgData)
  127. }
  128. for idx := 0; idx < len(msg.DelMemberUidList); idx++ {
  129. memberInfo := &serverproto.InvitationMemberValData{}
  130. fieldStr := "m:" + strconv.FormatUint(msg.DelMemberUidList[idx], 10)
  131. msgStr, err := service.GetRedis().HGet(keyStr, fieldStr).Result()
  132. if err != nil {
  133. continue
  134. }
  135. err = model.GetDecodeMessage(memberInfo, msgStr)
  136. if err != nil {
  137. continue
  138. }
  139. //该玩家没有提供过初心值,删除时不做保留
  140. if memberInfo.ResVal <= 0 {
  141. service.GetRedis().HDel(keyStr, fieldStr)
  142. } else {
  143. memberInfo.State = true //表示已经被删除
  144. err, msgData := model.GetEncodeMessage(memberInfo)
  145. if err == nil {
  146. service.GetRedis().HSet(keyStr, fieldStr, msgData)
  147. }
  148. }
  149. }
  150. //log
  151. logKeyStr := RoleInvitationLogPrefix + uidStr
  152. for idx := 0; idx < len(msg.AddLogList); idx++ {
  153. _, msgData := model.GetEncodeMessage(msg.AddLogList[idx])
  154. ret, err := service.GetRedis().LPush(logKeyStr, msgData).Result()
  155. if err == nil && ret > MaxInvitationLogCount {
  156. service.GetRedis().LTrim(logKeyStr, 0, MaxInvitationLogCount-1)
  157. }
  158. }
  159. }
  160. func GetRoleInvitationFromRedis(uid uint64, msg *serverproto.RoleInvitation) {
  161. uidStr := strconv.FormatUint(uid, 10)
  162. keyStr := RoleInvitationPrefix + uidStr
  163. valList, err := service.GetRedis().HGetAll(keyStr).Result()
  164. if err != nil && err != service.NIL {
  165. util.InfoF("GetRoleInvitationFromRedis get key=%v err=%v uid=%v", keyStr, err, uid)
  166. return
  167. }
  168. for key, val := range valList {
  169. if key == "base" {
  170. tmpInfo := &serverproto.RoleInvitation{}
  171. err := model.GetDecodeMessage(tmpInfo, val)
  172. if err == nil {
  173. msg.ClickNum = tmpInfo.ClickNum
  174. msg.SelfInvitationNumber = tmpInfo.SelfInvitationNumber
  175. msg.MasterUid = tmpInfo.MasterUid
  176. msg.MasterEndTime = tmpInfo.MasterEndTime
  177. msg.ClickMemberList = tmpInfo.ClickMemberList
  178. msg.ClickReplayMasterList = tmpInfo.ClickReplayMasterList
  179. }
  180. } else if strings.Contains(key, "task:") {
  181. taskInfo := &serverproto.InvitationTaskData{}
  182. err := model.GetDecodeMessage(taskInfo, val)
  183. if err == nil {
  184. msg.TaskList = append(msg.TaskList, taskInfo)
  185. }
  186. } else if strings.Contains(key, "m:") {
  187. memberInfo := &serverproto.InvitationMemberValData{}
  188. err := model.GetDecodeMessage(memberInfo, val)
  189. if err == nil {
  190. msg.MemberUidList = append(msg.MemberUidList, memberInfo)
  191. }
  192. }
  193. }
  194. //log
  195. logKeyStr := RoleInvitationLogPrefix + uidStr
  196. logList, err := service.GetRedis().LRange(logKeyStr, 0, -1).Result()
  197. if err == nil {
  198. for idx := 0; idx < len(logList); idx++ {
  199. logInfo := &serverproto.InvitationLogData{}
  200. err := model.GetDecodeMessage(logInfo, logList[idx])
  201. if err == nil {
  202. msg.LogList = append(msg.LogList, logInfo)
  203. }
  204. }
  205. }
  206. }
  207. //等级,充值等数据变更时通知导师(导师不在线保存到数据库)
  208. func InvitationMemberDataChangeNotice(selfUid, masterUid uint64, param *serverproto.KeyValueType) {
  209. masterUidStr := strconv.FormatUint(masterUid, 10)
  210. selfUidStr := strconv.FormatUint(selfUid, 10)
  211. masterKeyStr := RoleInvitationPrefix + masterUidStr
  212. memberStr := "m:" + selfUidStr
  213. bExist := service.GetRedis().HExists(masterKeyStr, memberStr).Val()
  214. if !bExist {
  215. util.ErrorF("InvitationMemberDataChangeNotice not member master=%v self=%v param=%v", masterUid, selfUid, *param)
  216. return
  217. }
  218. //get member info
  219. msgStr, err := service.GetRedis().HGet(masterKeyStr, memberStr).Result()
  220. if err != nil {
  221. return
  222. }
  223. memberInfo := &serverproto.InvitationMemberValData{}
  224. err = model.GetDecodeMessage(memberInfo, msgStr)
  225. if err != nil {
  226. return
  227. }
  228. //已经被导师删除
  229. if memberInfo.State {
  230. util.ErrorF("InvitationMemberDataChangeNotice not member[del] master=%v self=%v param=%v", masterUid, selfUid, *param)
  231. return
  232. }
  233. if param.Key == int32(serverproto.TaskType_Invitation_Base_Level_Num) {
  234. //base level
  235. memberInfo.Level = param.Value
  236. } else if param.Key == int32(serverproto.TaskType_Invitation_Recharge_Num) {
  237. //total recharge
  238. memberInfo.TotalRecharge = float32(param.Value)
  239. }
  240. err, msgData := model.GetEncodeMessage(memberInfo)
  241. if err == nil {
  242. service.GetRedis().HSet(masterKeyStr, memberStr, msgData)
  243. }
  244. util.InfoF("InvitationMemberDataChangeNotice ok master=%v self=%v param=%v", masterUid, selfUid, *param)
  245. }