| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- package model
- import (
- "rocommon/service"
- "rocommon/util"
- "roserver/baseserver/model"
- "roserver/serverproto"
- "strconv"
- "strings"
- )
- ///invitation
- const (
- Invitation_Member_Max_Num = 30
- )
- //生成邀请码
- func InvitationGenNumber(uid uint64, bGenNumber bool, checkMasterUid uint64) (uint64, uint64) {
- var genNumber int64 = 0
- if bGenNumber {
- genNumber = service.GetRedis().Incr(InvitationNumberPrefix).Val()
- genNumber = 100000 + genNumber
- filedStr := strconv.FormatUint(uint64(genNumber), 10)
- service.GetRedis().HSet(RoleInvitationNumberPrefix, filedStr, uid)
- }
- //判断maseter是否合理
- if checkMasterUid > 0 {
- masterUidStr := strconv.FormatUint(checkMasterUid, 10)
- masterKeyStr := RoleInvitationPrefix + masterUidStr
- memberStr := "m:" + strconv.FormatUint(uid, 10)
- bExist := service.GetRedis().HExists(masterKeyStr, memberStr).Val()
- if !bExist {
- checkMasterUid = 0
- }
- }
- return uint64(genNumber), checkMasterUid
- }
- //根据邀请码查询玩家信息
- func InvitationGetUserInfoByNumber(uid uint64, number uint64, ackMsg *serverproto.SSInvitationNumberUserInfoAck) {
- filedStr := strconv.FormatUint(uint64(number), 10)
- masterUidStr, err := service.GetRedis().HGet(RoleInvitationNumberPrefix, filedStr).Result()
- if err != nil && err != service.NIL {
- util.InfoF("uid=%v InvitationGetUserInfoByNumber number=%v err=%v", uid, number, err)
- ackMsg.Error = int32(serverproto.ErrorCode_ERROR_INVITATION_NUMBER_INVALID)
- return
- }
- masterUid, err := model.Str2NumU64(masterUidStr)
- if err != nil {
- util.InfoF("uid=%v InvitationGetUserInfoByNumber uidstr=%v convert uid err=%v", uid, masterUidStr, err)
- ackMsg.Error = int32(serverproto.ErrorCode_ERROR_INVITATION_NUMBER_INVALID)
- return
- }
- err, masterBfInfo := GetPlayerBriefInfo(masterUid)
- if err != nil {
- util.InfoF("uid=%v InvitationGetUserInfoByNumber master br nil err=%v", uid, masterUidStr, err)
- ackMsg.Error = int32(serverproto.ErrorCode_ERROR_INVITATION_NUMBER_INVALID)
- return
- }
- masterKeyStr := RoleInvitationPrefix + masterUidStr
- masterMemberNumStr := service.GetRedis().HGet(masterKeyStr, "mnum").Val()
- masterMemberNum, _ := model.Str2Num(masterMemberNumStr)
- ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
- ackMsg.Brief = masterBfInfo
- ackMsg.Number = number
- ackMsg.MemberNum = int32(masterMemberNum)
- }
- //玩家成为导师成员
- func InvitationBeToBeMember(masterNumber, masterUid uint64, selfUid *serverproto.InvitationMemberValData) serverproto.ErrorCode {
- masterUidStr := strconv.FormatUint(masterUid, 10)
- masterKeyStr := RoleInvitationPrefix + masterUidStr
- masterMemberNumStr := service.GetRedis().HGet(masterKeyStr, "mnum").Val()
- masterMemberNum, _ := model.Str2Num(masterMemberNumStr)
- if masterMemberNum >= Invitation_Member_Max_Num {
- return serverproto.ErrorCode_ERROR_INVITATION_NUM_LIMIT
- }
- memberStr := "m:" + strconv.FormatUint(selfUid.Uid, 10)
- bExist := service.GetRedis().HExists(masterKeyStr, memberStr).Val()
- if bExist {
- return serverproto.ErrorCode_ERROR_INVITATION_IS_MEMBER
- }
- //add member
- err, msgData := model.GetEncodeMessage(selfUid)
- if err == nil {
- masterMemberNum++
- service.GetRedis().HSet(masterKeyStr, "mnum", masterMemberNum)
- service.GetRedis().HSet(masterKeyStr, memberStr, msgData)
- }
- return serverproto.ErrorCode_ERROR_OK
- }
- //
- var MaxInvitationLogCount int64 = 50
- /*
- hkey
- base
- task:id
- mnum
- m:uid
- lkey
- */
- func SetInvitationDataToRedis(uid uint64, msg *serverproto.SSInvitationSaveNtf) {
- uidStr := strconv.FormatUint(uid, 10)
- keyStr := RoleInvitationPrefix + uidStr
- if msg.BaseSave {
- roleInvitation := &serverproto.RoleInvitation{
- ClickNum: msg.ClickNum,
- SelfInvitationNumber: msg.SelfInvitationNumber,
- MasterUid: msg.MasterUid,
- MasterEndTime: msg.MasterEndTime,
- ClickMemberList: msg.ClickMemberList,
- ClickReplayMasterList: msg.ClickReplayMasterList,
- }
- fieldStr := "base"
- _, msgData := model.GetEncodeMessage(roleInvitation)
- service.GetRedis().HSet(keyStr, fieldStr, msgData)
- }
- //task list
- for idx := 0; idx < len(msg.TaskList); idx++ {
- fieldStr := "task:" + strconv.Itoa(int(msg.TaskList[idx].TaskId))
- _, msgData := model.GetEncodeMessage(msg.TaskList[idx])
- service.GetRedis().HSet(keyStr, fieldStr, msgData)
- }
- //member list
- service.GetRedis().HSet(keyStr, "mnum", msg.MemberNum) //总人数
- for idx := 0; idx < len(msg.AddMemberUidList); idx++ {
- memberData := msg.AddMemberUidList[idx]
- uidStr := strconv.FormatUint(memberData.Uid, 10)
- fieldStr := "m:" + uidStr
- _, msgData := model.GetEncodeMessage(memberData)
- service.GetRedis().HSet(keyStr, fieldStr, msgData)
- }
- for idx := 0; idx < len(msg.DelMemberUidList); idx++ {
- memberInfo := &serverproto.InvitationMemberValData{}
- fieldStr := "m:" + strconv.FormatUint(msg.DelMemberUidList[idx], 10)
- msgStr, err := service.GetRedis().HGet(keyStr, fieldStr).Result()
- if err != nil {
- continue
- }
- err = model.GetDecodeMessage(memberInfo, msgStr)
- if err != nil {
- continue
- }
- //该玩家没有提供过初心值,删除时不做保留
- if memberInfo.ResVal <= 0 {
- service.GetRedis().HDel(keyStr, fieldStr)
- } else {
- memberInfo.State = true //表示已经被删除
- err, msgData := model.GetEncodeMessage(memberInfo)
- if err == nil {
- service.GetRedis().HSet(keyStr, fieldStr, msgData)
- }
- }
- }
- //log
- logKeyStr := RoleInvitationLogPrefix + uidStr
- for idx := 0; idx < len(msg.AddLogList); idx++ {
- _, msgData := model.GetEncodeMessage(msg.AddLogList[idx])
- ret, err := service.GetRedis().LPush(logKeyStr, msgData).Result()
- if err == nil && ret > MaxInvitationLogCount {
- service.GetRedis().LTrim(logKeyStr, 0, MaxInvitationLogCount-1)
- }
- }
- }
- func GetRoleInvitationFromRedis(uid uint64, msg *serverproto.RoleInvitation) {
- uidStr := strconv.FormatUint(uid, 10)
- keyStr := RoleInvitationPrefix + uidStr
- valList, err := service.GetRedis().HGetAll(keyStr).Result()
- if err != nil && err != service.NIL {
- util.InfoF("GetRoleInvitationFromRedis get key=%v err=%v uid=%v", keyStr, err, uid)
- return
- }
- for key, val := range valList {
- if key == "base" {
- tmpInfo := &serverproto.RoleInvitation{}
- err := model.GetDecodeMessage(tmpInfo, val)
- if err == nil {
- msg.ClickNum = tmpInfo.ClickNum
- msg.SelfInvitationNumber = tmpInfo.SelfInvitationNumber
- msg.MasterUid = tmpInfo.MasterUid
- msg.MasterEndTime = tmpInfo.MasterEndTime
- msg.ClickMemberList = tmpInfo.ClickMemberList
- msg.ClickReplayMasterList = tmpInfo.ClickReplayMasterList
- }
- } else if strings.Contains(key, "task:") {
- taskInfo := &serverproto.InvitationTaskData{}
- err := model.GetDecodeMessage(taskInfo, val)
- if err == nil {
- msg.TaskList = append(msg.TaskList, taskInfo)
- }
- } else if strings.Contains(key, "m:") {
- memberInfo := &serverproto.InvitationMemberValData{}
- err := model.GetDecodeMessage(memberInfo, val)
- if err == nil {
- msg.MemberUidList = append(msg.MemberUidList, memberInfo)
- }
- }
- }
- //log
- logKeyStr := RoleInvitationLogPrefix + uidStr
- logList, err := service.GetRedis().LRange(logKeyStr, 0, -1).Result()
- if err == nil {
- for idx := 0; idx < len(logList); idx++ {
- logInfo := &serverproto.InvitationLogData{}
- err := model.GetDecodeMessage(logInfo, logList[idx])
- if err == nil {
- msg.LogList = append(msg.LogList, logInfo)
- }
- }
- }
- }
- //等级,充值等数据变更时通知导师(导师不在线保存到数据库)
- func InvitationMemberDataChangeNotice(selfUid, masterUid uint64, param *serverproto.KeyValueType) {
- masterUidStr := strconv.FormatUint(masterUid, 10)
- selfUidStr := strconv.FormatUint(selfUid, 10)
- masterKeyStr := RoleInvitationPrefix + masterUidStr
- memberStr := "m:" + selfUidStr
- bExist := service.GetRedis().HExists(masterKeyStr, memberStr).Val()
- if !bExist {
- util.ErrorF("InvitationMemberDataChangeNotice not member master=%v self=%v param=%v", masterUid, selfUid, *param)
- return
- }
- //get member info
- msgStr, err := service.GetRedis().HGet(masterKeyStr, memberStr).Result()
- if err != nil {
- return
- }
- memberInfo := &serverproto.InvitationMemberValData{}
- err = model.GetDecodeMessage(memberInfo, msgStr)
- if err != nil {
- return
- }
- //已经被导师删除
- if memberInfo.State {
- util.ErrorF("InvitationMemberDataChangeNotice not member[del] master=%v self=%v param=%v", masterUid, selfUid, *param)
- return
- }
- if param.Key == int32(serverproto.TaskType_Invitation_Base_Level_Num) {
- //base level
- memberInfo.Level = param.Value
- } else if param.Key == int32(serverproto.TaskType_Invitation_Recharge_Num) {
- //total recharge
- memberInfo.TotalRecharge = float32(param.Value)
- }
- err, msgData := model.GetEncodeMessage(memberInfo)
- if err == nil {
- service.GetRedis().HSet(masterKeyStr, memberStr, msgData)
- }
- util.InfoF("InvitationMemberDataChangeNotice ok master=%v self=%v param=%v", masterUid, selfUid, *param)
- }
|