diff --git a/service/roomrank/handle.go b/service/roomrank/handle.go index ab3e01e..c3a2795 100644 --- a/service/roomrank/handle.go +++ b/service/roomrank/handle.go @@ -30,21 +30,13 @@ func HandleInfo(req *models.ReqRoomRankInfo) (code string, rsp models.RspRoomRan playerUid := req.UID playerLevel := req.PlayerLevel - // 尝试更新配置 - config, hasConfig := confroomrank.GetCurrent(gameId, req.TopType) - if !hasConfig { - config = new(confroomrank.ActivityConfig) - code = code_msg.RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR - return - } - // 读取游戏数据 player := LoadPlayer(gameId, playerUid, req.TopType) player.Name = req.PlayerName player.Icon = req.PlayerIcon // 采用分布式锁 - lockKey := getLockKey(gameId, req.TopType, config.Id) + lockKey := getLockKey(gameId, req.TopType) opt := zredislock.GetOptionLimitRetry(RoomLockLinearBackoff, RoomLockMaxCount) lock := zredislock.Obtain(lockKey, RoomLockMillisecond, opt) if lock.Err != nil { @@ -53,18 +45,27 @@ func HandleInfo(req *models.ReqRoomRankInfo) (code string, rsp models.RspRoomRan } defer lock.Release() - activityTime := GetActivityTime(config) - + /* ----- 结算 Start -----*/ // 尝试判断结算 - hasSettleChange := TrySettle(gameId, req.TopType, player, config, activityTime) + hasSettleChange := TrySettle(gameId, req.TopType, player) if hasSettleChange { SavePlayer(gameId, player) } if player.SettleHas() { - rsp.RoomRankInfo = GetInfoFromSettle(player, config) + rsp.RoomRankInfo = GetInfoFromSettle(player) + return + } + /* ----- 结算 End -----*/ + + // 尝试更新配置 + config, hasConfig := confroomrank.GetCurrent(gameId, req.TopType) + if !hasConfig { + config = new(confroomrank.ActivityConfig) + code = code_msg.RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR return } + activityTime := GetActivityTime(config) // 判断玩家等级 if req.PlayerLevel < config.OpenLevel { @@ -78,7 +79,7 @@ func HandleInfo(req *models.ReqRoomRankInfo) (code string, rsp models.RspRoomRan SavePlayer(gameId, player) } }() - if player.ActivityId != config.Id && player.ActivityTime != activityTime { + if player.ActivityId != config.Id || player.ActivityTime != activityTime { player.ActivityId = config.Id player.ActivityTime = activityTime player.RoomUid = 0 @@ -132,21 +133,13 @@ func HandleGetSettleAward(req *models.ReqRoomRankGetSettleAward) (code string, r gameId := req.GameID playerUid := req.UID - // 尝试更新配置 - config, hasConfig := confroomrank.GetCurrent(gameId, req.TopType) - if !hasConfig { - config = new(confroomrank.ActivityConfig) - code = code_msg.RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR - return - } - // 读取游戏数据 player := LoadPlayer(gameId, playerUid, req.TopType) player.Name = req.PlayerName player.Icon = req.PlayerIcon // 采用分布式锁 - lockKey := getLockKey(gameId, req.TopType, config.Id) + lockKey := getLockKey(gameId, req.TopType) opt := zredislock.GetOptionLimitRetry(RoomLockLinearBackoff, RoomLockMaxCount) lock := zredislock.Obtain(lockKey, RoomLockMillisecond, opt) if lock.Err != nil { @@ -155,14 +148,19 @@ func HandleGetSettleAward(req *models.ReqRoomRankGetSettleAward) (code string, r } defer lock.Release() - activityTime := GetActivityTime(config) - + /* ----- 结算 Start -----*/ // 尝试判断结算 - _ = TrySettle(gameId, req.TopType, player, config, activityTime) + hasSettleChange := TrySettle(gameId, req.TopType, player) + + if hasSettleChange { + SavePlayer(gameId, player) + } if !player.SettleHas() { code = code_msg.RECODE_MERGE_ROOMRANK_NOTHASSETTLE_ERROR return } + /* ----- 结算 End -----*/ + oldActivityId := player.ActivityId // 领取奖励 @@ -171,7 +169,7 @@ func HandleGetSettleAward(req *models.ReqRoomRankGetSettleAward) (code string, r rsp.UserClass = player.SettleUserClass rsp.AwardText = player.SettleAward player.SettleAward = "" - player.ActivityId = config.Id + player.ActivityId = 0 player.ActivityTime = 0 player.RoomUid = 0 player.Score = 0 @@ -192,21 +190,13 @@ func HandleAddScore(req *models.ReqRoomRankAddScore) (code string, rsp models.Rs playerUid := req.UID playerLevel := req.PlayerLevel - // 尝试更新配置 - config, hasConfig := confroomrank.GetCurrent(gameId, req.TopType) - if !hasConfig { - config = new(confroomrank.ActivityConfig) - code = code_msg.RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR - return - } - // 读取游戏数据 player := LoadPlayer(gameId, playerUid, req.TopType) player.Name = req.PlayerName player.Icon = req.PlayerIcon // 采用分布式锁 - lockKey := getLockKey(gameId, req.TopType, config.Id) + lockKey := getLockKey(gameId, req.TopType) opt := zredislock.GetOptionLimitRetry(RoomLockLinearBackoff, RoomLockMaxCount) lock := zredislock.Obtain(lockKey, RoomLockMillisecond, opt) if lock.Err != nil { @@ -215,19 +205,27 @@ func HandleAddScore(req *models.ReqRoomRankAddScore) (code string, rsp models.Rs } defer lock.Release() - activityTime := GetActivityTime(config) - + /* ----- 结算 Start -----*/ // 尝试判断结算 - hasSettleChange := TrySettle(gameId, req.TopType, player, config, activityTime) + hasSettleChange := TrySettle(gameId, req.TopType, player) + if hasSettleChange { SavePlayer(gameId, player) } - if player.SettleHas() { - rsp.RoomRankInfo = GetInfoFromSettle(player, config) - code = code_msg.RECODE_MERGE_ROOMRANK_HASSETTLE_ERROR + rsp.RoomRankInfo = GetInfoFromSettle(player) return } + /* ----- 结算 End -----*/ + + // 尝试更新配置 + config, hasConfig := confroomrank.GetCurrent(gameId, req.TopType) + if !hasConfig { + config = new(confroomrank.ActivityConfig) + code = code_msg.RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR + return + } + activityTime := GetActivityTime(config) // 判断玩家等级 if req.PlayerLevel < config.OpenLevel { @@ -241,7 +239,7 @@ func HandleAddScore(req *models.ReqRoomRankAddScore) (code string, rsp models.Rs SavePlayer(gameId, player) } }() - if player.ActivityId != config.Id && player.ActivityTime != activityTime { + if player.ActivityId != config.Id || player.ActivityTime != activityTime { player.ActivityId = config.Id player.ActivityTime = activityTime player.RoomUid = 0 diff --git a/service/roomrank/logic.go b/service/roomrank/logic.go index 5f99faf..955caab 100644 --- a/service/roomrank/logic.go +++ b/service/roomrank/logic.go @@ -10,8 +10,8 @@ import ( "time" ) -func getLockKey(gameId string, topType int, activityId int64) string { - return fmt.Sprintf("%s:lock:roomrank:%s:%d:%d", svconst.REDIS_CACHEP_REFIX, gameId, topType, activityId) +func getLockKey(gameId string, topType int) string { + return fmt.Sprintf("%s:lock:roomrank:%s:%d", svconst.REDIS_CACHEP_REFIX, gameId, topType) } // GetActivityTime 根据当前时间获取当前次的结算时间戳 @@ -43,39 +43,26 @@ func GetTimeEnd(activityTime int64, releaseTime string) time.Time { } // TrySettle 尝试判断结算 -func TrySettle(gameId string, topType int, player *Player, config *confroomrank.ActivityConfig, activityTime int64) (hasChange bool) { +func TrySettle(gameId string, topType int, player *Player) (hasChange bool) { hasChange = false if player.ActivityId == 0 { return } - if player.SettleActivityId == config.Id && player.SettleActivityTime == activityTime { - return - } - //if player.ActivityId == config.Id && player.ActivityTime == activityTime { - // return - //} - //if player.ActivityId == 0 { - // return - //} - //if player.ActivityId == config.Id { - // return - //} - //fmt.Println(zjson.Str(player)) - // 查找玩家所在的房间 - room, hasRoom := LoadRoom(gameId, topType, player.ActivityId, player.RoomUid) - if !hasRoom { + + confActivity, hasConfActivity := confroomrank.GetConfig(gameId, player.ActivityId) + if !hasConfActivity { return } + activityTime := GetActivityTime(confActivity) - confActivity, hasConfActivity := confroomrank.GetConfig(gameId, room.ActivityId) - if !hasConfActivity { + if player.SettleActivityId == confActivity.Id && player.SettleActivityTime == activityTime { return } - if hasRoom { - if confRoom, hasConfRoom := config.Room[room.ConfigId]; hasConfRoom { - TryCloseRoom(gameId, room, config, confRoom) - } + // 查找玩家所在的房间 + room, hasRoom := TryGetRoom(gameId, topType, player, confActivity) + if !hasRoom { + return } TrySettleRoom(gameId, room, confActivity) @@ -94,7 +81,7 @@ func TrySettle(gameId string, topType int, player *Player, config *confroomrank. player.SettleScore = rankScore // 设置玩家奖励等数据 hasChange = true - player.SettleActivityId = config.Id + player.SettleActivityId = confActivity.Id player.SettleActivityTime = activityTime confRoom, hasConfRoom := confActivity.Room[room.ConfigId] if !hasConfRoom { diff --git a/service/roomrank/player.go b/service/roomrank/player.go index d4be549..d2f8eaf 100644 --- a/service/roomrank/player.go +++ b/service/roomrank/player.go @@ -81,7 +81,7 @@ func NewRoomPlayer(player *Player) *RoomPlayer { } // GetInfoFromSettle 活动信息 从结算 -func GetInfoFromSettle(player *Player, config *confroomrank.ActivityConfig) models.RoomRankInfo { +func GetInfoFromSettle(player *Player) models.RoomRankInfo { info := models.RoomRankInfo{} if player.SettleHas() { info.SettleHas = true -- libgit2 0.21.0