package roomrank import ( "apigame/configs/confroomrank" "apigame/models" "apigame/service-common/svmysql" "apigame/service/code-msg" "apigame/util/zredislock" ) // HandleGetConfig 活动配置 func HandleGetConfig(req *models.ReqRoomRankGetConfig) (code string, rsp models.RspRoomRankGetConfig) { rsp = models.RspRoomRankGetConfig{} code = code_msg.RECODE_OK gameId := req.GameID // 尝试更新配置 config, hasConfig := confroomrank.GetCurrent(gameId) if !hasConfig { code = code_msg.RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR return } rsp.ActivityId = config.Id rsp.PrepareTime = config.PreviewTime rsp.StartTime = config.StartTime rsp.EndTime = config.EndTime rsp.ReleaseTime = config.ReleaseTime rsp.OpenLevel = config.OpenLevel rsp.Config = config.Client return } // HandleInfo 房间排行信息 func HandleInfo(req *models.ReqRoomRankInfo) (code string, rsp models.RspRoomRankInfo) { rsp = models.RspRoomRankInfo{} code = code_msg.RECODE_OK gameId := req.GameID playerUid := req.UID playerLevel := req.PlayerLevel // 尝试更新配置 config, hasConfig := confroomrank.GetCurrent(gameId) if !hasConfig { config = new(confroomrank.ActivityConfig) code = code_msg.RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR return } // 读取游戏数据 player := LoadPlayer(gameId, playerUid) player.Name = req.PlayerName player.Icon = req.PlayerIcon // 采用分布式锁 lockKey := getLockKey(gameId, config.Id) lock := zredislock.Obtain(lockKey, RoomLockMillisecond, nil) if lock.Err != nil { code = code_msg.RECODE_CAOZUOPINFAN_ERROR return } defer lock.Release() // 尝试判断结算 hasSettleChange := TrySettle(gameId, player, config) if hasSettleChange { SavePlayer(gameId, player) } if player.SettleHas { rsp.RoomRankInfo = GetInfoFromSettle(player, config) return } // 判断玩家等级 if req.PlayerLevel < config.OpenLevel { code = code_msg.RECODE_MERGE_ROOMRANK_LEVEL_ERROR return } // 尝试加入房间 room, hasRoom := TryGetRoom(gameId, player, config, playerLevel) if !hasRoom { code = code_msg.RECODE_MERGE_CONFIG_ERROR return } TryReSort(room, config) SavePlayer(gameId, player) SaveRoom(gameId, room) rsp.RoomRankInfo = GetInfoFromRoom(player, room) return } // HandleGetSettleAward 领取上期结算奖励 func HandleGetSettleAward(req *models.ReqRoomRankGetSettleAward) (code string, rsp models.RspRoomRankGetSettleAward) { rsp = models.RspRoomRankGetSettleAward{} code = code_msg.RECODE_OK gameId := req.GameID playerUid := req.UID // 尝试更新配置 config, hasConfig := confroomrank.GetCurrent(gameId) if !hasConfig { config = new(confroomrank.ActivityConfig) code = code_msg.RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR return } // 读取游戏数据 player := LoadPlayer(gameId, playerUid) player.Name = req.PlayerName player.Icon = req.PlayerIcon // 采用分布式锁 lockKey := getLockKey(gameId, config.Id) lock := zredislock.Obtain(lockKey, RoomLockMillisecond, nil) if lock.Err != nil { code = code_msg.RECODE_CAOZUOPINFAN_ERROR return } defer lock.Release() // 尝试判断结算 _ = TrySettle(gameId, player, config) if !player.SettleHas { code = code_msg.RECODE_MERGE_ROOMRANK_NOTHASSETTLE_ERROR return } oldActivityId := player.ActivityId // 领取奖励 rsp.AwardText = player.SettleAward rsp.UserClass = player.UserClass player.SettleHas = false player.SettleAward = "" player.ActivityId = config.Id player.RoomUid = 0 SavePlayer(gameId, player) // 记录日志 recordBase := NewRecordBase(player.Uid, oldActivityId) _ = svmysql.Create(NewRecordGetSettleAward(recordBase, rsp.AwardText), gameId) return } // HandleAddScore 房间排行增加积分 func HandleAddScore(req *models.ReqRoomRankAddScore) (code string, rsp models.RspRoomRankAddScore) { rsp = models.RspRoomRankAddScore{} code = code_msg.RECODE_OK gameId := req.GameID playerUid := req.UID playerLevel := req.PlayerLevel // 尝试更新配置 config, hasConfig := confroomrank.GetCurrent(gameId) if !hasConfig { config = new(confroomrank.ActivityConfig) code = code_msg.RECODE_MERGE_ROOMRANK_NOTOPEN_ERROR return } // 读取游戏数据 player := LoadPlayer(gameId, playerUid) player.Name = req.PlayerName player.Icon = req.PlayerIcon // 采用分布式锁 lockKey := getLockKey(gameId, config.Id) lock := zredislock.Obtain(lockKey, RoomLockMillisecond, nil) if lock.Err != nil { code = code_msg.RECODE_CAOZUOPINFAN_ERROR return } defer lock.Release() // 尝试判断结算 hasSettleChange := TrySettle(gameId, player, config) if hasSettleChange { SavePlayer(gameId, player) } if player.SettleHas { rsp.RoomRankInfo = GetInfoFromSettle(player, config) code = code_msg.RECODE_MERGE_ROOMRANK_HASSETTLE_ERROR return } // 判断玩家等级 if req.PlayerLevel < config.OpenLevel { code = code_msg.RECODE_MERGE_ROOMRANK_LEVEL_ERROR return } // 尝试加入房间 room, hasRoom := TryGetRoom(gameId, player, config, playerLevel) // 房间排行增加积分 oldScore, newScore := ChangePlayerScore(room, player, req.AddScore) if !hasRoom { code = code_msg.RECODE_MERGE_CONFIG_ERROR return } TryReSort(room, config) SavePlayer(gameId, player) SaveRoom(gameId, room) rsp.RoomRankInfo = GetInfoFromRoom(player, room) // 记录日志 recordBase := NewRecordBase(player.Uid, config.Id) _ = svmysql.Create(NewRecordAddScore(recordBase, req.AddScore, oldScore, newScore), gameId) return }