handle.go 5.05 KB
package roomrank

import (
	"apigame/configs/confroomrank"
	"apigame/models"
	"apigame/service-common/svmysql"
	"apigame/service/code-msg"
	"apigame/util/zredislock"
	"fmt"
)

// 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)
	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 {
		TryReSort(room, config)

		SavePlayer(gameId, player)
		SaveRoom(gameId, room)
	}

	rsp.RoomRankInfo = GetInfoFromRoom(player, room)

	fmt.Println("dwjw🐸  len(room.Details.Players) 1:", len(room.Details.Players))

	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)
	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
	player.SettleHas = false
	player.SettleAward = ""
	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)
	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 {
		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
}