ro-webgl-server/server/roserver/db/model/orm_invitation.go

276 lines
8.7 KiB
Go

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)
}