From c2bc0824abc2e385943b0d262da70e5783101689 Mon Sep 17 00:00:00 2001 From: 王家文 Date: Thu, 18 Apr 2024 15:30:08 +0800 Subject: [PATCH] feat✨:游戏功能配置 --- configs/conf-cardholder-decode.go | 169 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- configs/conf-cardholder.go | 137 ----------------------------------------------------------------------------------------------------------------------------------------- configs/conf-roomrank.go | 2 +- configs/confcardholder/config.go | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configs/confcardholder/decode.go | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configs/confcardholder/get.go | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configs/init.go | 3 ++- configs/registry.go | 27 --------------------------- service/cardholder/handle.go | 12 ++++++------ service/cardholder/logic.go | 32 ++++++++++++++++---------------- service/cardholder/player.go | 4 ++-- util/zredis/kv.go | 8 ++++++++ 12 files changed, 422 insertions(+), 359 deletions(-) delete mode 100644 configs/conf-cardholder-decode.go delete mode 100644 configs/conf-cardholder.go create mode 100644 configs/confcardholder/config.go create mode 100644 configs/confcardholder/decode.go create mode 100644 configs/confcardholder/get.go diff --git a/configs/conf-cardholder-decode.go b/configs/conf-cardholder-decode.go deleted file mode 100644 index 085dd00..0000000 --- a/configs/conf-cardholder-decode.go +++ /dev/null @@ -1,169 +0,0 @@ -package configs - -import ( - "apigame/util/util-lx/lxalilog" - "encoding/json" - "errors" - "fmt" - "strings" -) - -// Decode 解析配置原始数据 -func (c *CardActivityConfig) Decode(gameId string, configRaw *CardActivityConfigRaw) { - c.GameId = gameId - c.Raw = configRaw - - c.Id = configRaw.Id - c.OpenLevel = configRaw.OpenLevel - c.PreviewTime = configRaw.PreviewTime - c.StartTime = configRaw.StartTime - c.EndTime = configRaw.EndTime - c.Round = configRaw.Round - - c.Awards = make(map[string]string) - c.AlbumConfig = make(map[int]AlbumConfig) - c.CardConfig = make(map[int]CardConfig) - c.CardholderConfig = make(map[string]OpenCardholderConfig) - c.NormalCardStarConfig = make(map[string]NormalCardStarConfig) - c.CardSequenceConfig = make(map[string]CardSequenceConfig) - c.StarShopConfig = make(map[int]StarShopConfig) - // 解析奖励 - { - err := json.Unmarshal([]byte(configRaw.Awards), &c.Awards) - if err != nil { - lxalilog.Errors(err, configRaw.Awards, gameId, configRaw.Id) - return - } - } - // 卡组配置 - { - configs := make([]AlbumConfig, 0) - err := json.Unmarshal([]byte(configRaw.AlbumConfig), &configs) - if err != nil { - lxalilog.Errors(err, configRaw.AlbumConfig, gameId, configRaw.Id) - return - } - for _, i2 := range configs { - c.AlbumConfig[i2.SetId] = i2 - } - } - // 卡牌配置 - { - configs := make([]CardConfig, 0) - err := json.Unmarshal([]byte(configRaw.CardConfig), &configs) - if err != nil { - lxalilog.Errors(err, configRaw.CardConfig, gameId, configRaw.Id) - return - } - for _, i2 := range configs { - c.CardConfig[i2.Id] = i2 - } - } - // 卡包开卡规则 - { - configs := make([]OpenCardholderConfig, 0) - err := json.Unmarshal([]byte(configRaw.CardHolderConfig), &configs) - if err != nil { - lxalilog.Errors(err, configRaw.CardHolderConfig, gameId, configRaw.Id) - return - } - for _, i2 := range configs { - c.CardholderConfig[i2.Id] = i2 - } - } - // 卡片星级配置 - { - configs := make([]NormalCardStarConfig, 0) - err := json.Unmarshal([]byte(configRaw.NormalCardStarSequence), &configs) - if err != nil { - lxalilog.Errors(err, configRaw.NormalCardStarSequence, gameId, configRaw.Id) - return - } - for _, i2 := range configs { - i2.NormalCardSequenceIds = strings.Split(i2.NormalCardSequenceId, ",") - combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) - c.NormalCardStarConfig[combineId] = i2 - } - } - // 卡片星级对应卡牌配置 - { - configs := make([]CardSequenceConfig, 0) - err := json.Unmarshal([]byte(configRaw.CardSequenceConfig), &configs) - if err != nil { - lxalilog.Errors(err, configRaw.CardSequenceConfig, gameId, configRaw.Id) - return - } - for _, i2 := range configs { - i2.CardIdLists = strings.Split(i2.CardIdList, ",") - combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) - c.CardSequenceConfig[combineId] = i2 - } - } - // 星星商店配置 - { - configs := make([]StarShopConfig, 0) - err := json.Unmarshal([]byte(configRaw.StarShopConfig), &configs) - if err != nil { - lxalilog.Errors(err, configRaw.StarShopConfig, gameId, configRaw.Id) - return - } - for _, i2 := range configs { - c.StarShopConfig[i2.Id] = i2 - } - } - - c.GenerateConfigClient() -} - -// GenerateConfigClient 生成给客户端的配置 -func (c *CardActivityConfig) GenerateConfigClient() { - configClient := &CardActivityConfigClient{ - Id: c.Id, - RoundAwards: c.Awards, - Albums: make([]AlbumConfig, 0), - Cards: make([]CardConfig, 0), - Holders: make([]OpenCardholderConfig, 0), - StarShop: make([]StarShopConfig, 0), - } - for _, i2 := range c.AlbumConfig { - configClient.Albums = append(configClient.Albums, i2) - } - for _, i2 := range c.CardConfig { - configClient.Cards = append(configClient.Cards, i2) - } - for _, i2 := range c.CardholderConfig { - configClient.Holders = append(configClient.Holders, i2) - } - for _, i2 := range c.StarShopConfig { - configClient.StarShop = append(configClient.StarShop, i2) - } - c.Client = configClient -} - -// CombineIdSequenceIdCohort 组合ID k=ID_用户序列_用户分组 -func CombineIdSequenceIdCohort(id, sequenceId, cohort string) string { - return fmt.Sprintf("%s_%s_%s", id, sequenceId, cohort) -} - -// FindNormalCardStarConfig 查找配置 非保底卡星级ID -func (c *CardActivityConfig) FindNormalCardStarConfig(id, sequenceId, cohort string) (conf NormalCardStarConfig, has bool) { - combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) - conf, has = c.NormalCardStarConfig[combineId] - if !has { - lxalilog.Errors(errors.New("ht_cardholder NormalCardStarConfig error"), id, sequenceId, cohort) - } - return -} - -// FindCardSequenceConfig 查找配置 星级ID对应的卡片 -func (c *CardActivityConfig) FindCardSequenceConfig(id, sequenceId, cohort string) (conf CardSequenceConfig, has bool) { - combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) - conf, has = c.CardSequenceConfig[combineId] - if !has { - lxalilog.Errors(errors.New("ht_cardholder CardSequenceConfig error"), id, sequenceId, cohort) - fmt.Println(id) - fmt.Println(sequenceId) - fmt.Println(cohort) - } - return -} diff --git a/configs/conf-cardholder.go b/configs/conf-cardholder.go deleted file mode 100644 index a586abd..0000000 --- a/configs/conf-cardholder.go +++ /dev/null @@ -1,137 +0,0 @@ -package configs - -import ( - "apigame/service-common/svconst" - "apigame/service-common/svmysql" - "apigame/service-common/svredis" - "fmt" -) - -// CardActivityConfig 卡牌活动配置 分析后数据 -type CardActivityConfig struct { - Raw *CardActivityConfigRaw `json:"-"` - - Id int64 // ID - OpenLevel int // 开启等级 - PreviewTime int64 // 预告时间 - StartTime int64 // 开始时间 - EndTime int64 // 结束时间 - Round int // 轮数 - - Awards map[string]string // 奖励配置 - AlbumConfig map[int]AlbumConfig // 卡组配置 - CardConfig map[int]CardConfig // 卡牌配置 - CardholderConfig map[string]OpenCardholderConfig // 卡包开卡规则 - NormalCardStarConfig map[string]NormalCardStarConfig // k=ID_用户序列_用户分组 卡片星级配置 - CardSequenceConfig map[string]CardSequenceConfig // k=ID_用户序列_用户分组 卡片星级对应卡牌配置 - StarShopConfig map[int]StarShopConfig // 星星商店配置 - - Client *CardActivityConfigClient - GameId string // 所属游戏ID -} - -func (c *CardActivityConfig) RedisInfo(suffix string) *svredis.RedisInfo { - tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_CONFIG - return &svredis.RedisInfo{ - CacheKey: fmt.Sprintf("%s:%s:%s", svconst.REDIS_CACHEP_REFIX, tableName, suffix), - CacheTime: 300, - } -} - -// CardActivityConfigRaw 卡牌活动配置 原始数据 -type CardActivityConfigRaw struct { - Id int64 // ID - OpenLevel int // 开启等级 - PreviewTime int64 // 预告时间 - StartTime int64 // 开始时间 - EndTime int64 // 结束时间 - Round int // 轮数 - - Awards string // 奖励配置 - AlbumConfig string // 卡组配置 - CardConfig string // 卡牌配置 - CardHolderConfig string // 卡包开卡规则 - NormalCardStarSequence string // 卡片星级配置 - CardSequenceConfig string // 卡片星级对应卡牌配置 - StarShopConfig string // 星星商店配置 - - Ver string // 版本号 - Status int // 状态 0=关闭 1=开启 - UpdateTime int64 // 修改时间戳 -} - -func (c *CardActivityConfigRaw) MysqlInfo(suffix string) *svmysql.MysqlInfo { - tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_CONFIG - return &svmysql.MysqlInfo{ - DbMysql: svconst.DbConfig.Where("status = ?", 1), - TableName: fmt.Sprintf("%s_%s", tableName, suffix), - } -} - -// CardActivityConfigClient 卡牌活动配置 给客户端数据 -type CardActivityConfigClient struct { - Id int64 `form:"id" json:"id"` // ID - RoundAwards map[string]string `form:"round_awards" json:"round_awards"` // 轮次奖励配置 - Albums []AlbumConfig `form:"albums" json:"albums"` // 卡组配置 - Cards []CardConfig `form:"cards" json:"cards"` // 卡牌配置 - Holders []OpenCardholderConfig `form:"holders" json:"holders"` // 卡包开卡规则 - StarShop []StarShopConfig `form:"star_shop" json:"star_shop"` // 星星商店配置 -} - -// AlbumConfig 卡组表 -type AlbumConfig struct { - SetId int `json:"set_id"` // 卡组名 - Name int `json:"name"` // 卡组图片 - Icon string `json:"icon"` // 卡组id - Rewards map[string]string `json:"rewards"` // 集齐奖励 k=轮次 - StartTime int64 `json:"start_time"` // 开始时间 - EndTime int64 `json:"end_time"` // 结束时间 -} - -// CardConfig 卡牌表 -type CardConfig struct { - Id int `json:"id"` // ID - Name int `json:"name"` // 卡牌名字 - Icon int `json:"icon"` // 卡牌图标 - Desc int `json:"desc"` // 卡牌描述 - SetId int `json:"album_setid"` // 卡组id - Star int `json:"star"` // 星级 - IsGold int `json:"is_gold"` // 是否是金卡 - IsSend int `json:"is_send"` // 卡片是否可赠送 -} - -// OpenCardholderConfig 卡包开卡规则表 -type OpenCardholderConfig struct { - Id string `json:"id"` // ID - IsGoldCardholder int `json:"is_gold_card_holder"` // 是否是金卡包 - IsNew int `json:"is_new"` // 是否是新卡包 - GuaranteedStarCardId string `json:"guaranteed_star_card_id"` // 保底卡星级序列ID - NormalCardNumber int `json:"normal_card_number"` // 非保底卡数量 - MinimumGuaranteeCardId string `json:"minimum_guarantee_card_id"` // 非保底卡牌序列ID - ActivityId int `json:"activity_id"` // 对应活动ID -} - -// NormalCardStarConfig 非保底卡星级ID -type NormalCardStarConfig struct { - Id string `json:"id"` // ID - SequenceId string `json:"user_sequence_id"` // 用户序列组ID - Cohort string `json:"cohort"` // 用户分组 - NormalCardSequenceId string `json:"normal_card_sequence_id"` // 非保底星级序列 - NormalCardSequenceIds []string `json:"normal_card_sequence_ids"` // 非保底星级序列 -} - -// CardSequenceConfig 星级ID对应的卡片 -type CardSequenceConfig struct { - Id string `json:"id"` // ID - SequenceId string `json:"user_sequence_id"` // 用户序列组ID - Cohort string `json:"cohort"` // 用户分组 - CardIdList string `json:"card_id_list"` // 卡牌抽取序列 - CardIdLists []string `json:"card_id_lists"` // 卡牌抽取序列 -} - -// StarShopConfig 星星商店配置 -type StarShopConfig struct { - Id int `json:"id"` // ID - NeedStarNumber int `json:"need_star_number"` // 需求星星数 - CardBagIds []int `json:"card_bag_ids"` // 可换取的卡包ID {卡包类型,卡包ID,卡包数量} -} diff --git a/configs/conf-roomrank.go b/configs/conf-roomrank.go index 5acdbf2..7b60401 100644 --- a/configs/conf-roomrank.go +++ b/configs/conf-roomrank.go @@ -34,7 +34,7 @@ func (c *RoomRankConfig) RedisInfo(suffix string) *svredis.RedisInfo { // RoomRankConfigRaw 房间排行活动配置 原始数据 type RoomRankConfigRaw struct { - Id int64 // ID + Id int64 `gorm:"column:id;primaryKey"` // ID OpenLevel int // 开启等级 PreviewTime int64 // 预告时间 StartTime int64 // 开始时间 diff --git a/configs/confcardholder/config.go b/configs/confcardholder/config.go new file mode 100644 index 0000000..e3ca142 --- /dev/null +++ b/configs/confcardholder/config.go @@ -0,0 +1,137 @@ +package confcardholder + +import ( + "apigame/service-common/svconst" + "apigame/service-common/svmysql" + "apigame/service-common/svredis" + "fmt" +) + +// ActivityConfig 卡牌活动配置 分析后数据 +type ActivityConfig struct { + Raw *ActivityConfigRaw `json:"-"` + + Id int64 // ID + OpenLevel int // 开启等级 + PreviewTime int64 // 预告时间 + StartTime int64 // 开始时间 + EndTime int64 // 结束时间 + Round int // 轮数 + + Awards map[string]string // 奖励配置 + AlbumConfig map[int]AlbumConfig // 卡组配置 + CardConfig map[int]CardConfig // 卡牌配置 + CardholderConfig map[string]OpenCardholderConfig // 卡包开卡规则 + NormalCardStarConfig map[string]NormalCardStarConfig // k=ID_用户序列_用户分组 卡片星级配置 + CardSequenceConfig map[string]CardSequenceConfig // k=ID_用户序列_用户分组 卡片星级对应卡牌配置 + StarShopConfig map[int]StarShopConfig // 星星商店配置 + + Client *CardActivityConfigClient + GameId string // 所属游戏ID +} + +func (c *ActivityConfig) RedisInfo(suffix string) *svredis.RedisInfo { + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_CONFIG + return &svredis.RedisInfo{ + CacheKey: fmt.Sprintf("%s:%s:%s:%d", svconst.REDIS_CACHEP_REFIX, tableName, suffix, c.Id), + CacheTime: 300, + } +} + +// ActivityConfigRaw 卡牌活动配置 原始数据 +type ActivityConfigRaw struct { + Id int64 `gorm:"column:id;primaryKey"` // ID + OpenLevel int // 开启等级 + PreviewTime int64 // 预告时间 + StartTime int64 // 开始时间 + EndTime int64 // 结束时间 + Round int // 轮数 + + Awards string // 奖励配置 + AlbumConfig string // 卡组配置 + CardConfig string // 卡牌配置 + CardHolderConfig string // 卡包开卡规则 + NormalCardStarSequence string // 卡片星级配置 + CardSequenceConfig string // 卡片星级对应卡牌配置 + StarShopConfig string // 星星商店配置 + + Ver string // 版本号 + Status int // 状态 0=关闭 1=开启 + UpdateTime int64 // 修改时间戳 +} + +func (c *ActivityConfigRaw) MysqlInfo(suffix string) *svmysql.MysqlInfo { + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_CONFIG + return &svmysql.MysqlInfo{ + DbMysql: svconst.DbConfig, + TableName: fmt.Sprintf("%s_%s", tableName, suffix), + } +} + +// CardActivityConfigClient 卡牌活动配置 给客户端数据 +type CardActivityConfigClient struct { + Id int64 `form:"id" json:"id"` // ID + RoundAwards map[string]string `form:"round_awards" json:"round_awards"` // 轮次奖励配置 + Albums []AlbumConfig `form:"albums" json:"albums"` // 卡组配置 + Cards []CardConfig `form:"cards" json:"cards"` // 卡牌配置 + Holders []OpenCardholderConfig `form:"holders" json:"holders"` // 卡包开卡规则 + StarShop []StarShopConfig `form:"star_shop" json:"star_shop"` // 星星商店配置 +} + +// AlbumConfig 卡组表 +type AlbumConfig struct { + SetId int `json:"set_id"` // 卡组名 + Name int `json:"name"` // 卡组图片 + Icon string `json:"icon"` // 卡组id + Rewards map[string]string `json:"rewards"` // 集齐奖励 k=轮次 + StartTime int64 `json:"start_time"` // 开始时间 + EndTime int64 `json:"end_time"` // 结束时间 +} + +// CardConfig 卡牌表 +type CardConfig struct { + Id int `json:"id"` // ID + Name int `json:"name"` // 卡牌名字 + Icon int `json:"icon"` // 卡牌图标 + Desc int `json:"desc"` // 卡牌描述 + SetId int `json:"album_setid"` // 卡组id + Star int `json:"star"` // 星级 + IsGold int `json:"is_gold"` // 是否是金卡 + IsSend int `json:"is_send"` // 卡片是否可赠送 +} + +// OpenCardholderConfig 卡包开卡规则表 +type OpenCardholderConfig struct { + Id string `json:"id"` // ID + IsGoldCardholder int `json:"is_gold_card_holder"` // 是否是金卡包 + IsNew int `json:"is_new"` // 是否是新卡包 + GuaranteedStarCardId string `json:"guaranteed_star_card_id"` // 保底卡星级序列ID + NormalCardNumber int `json:"normal_card_number"` // 非保底卡数量 + MinimumGuaranteeCardId string `json:"minimum_guarantee_card_id"` // 非保底卡牌序列ID + ActivityId int `json:"activity_id"` // 对应活动ID +} + +// NormalCardStarConfig 非保底卡星级ID +type NormalCardStarConfig struct { + Id string `json:"id"` // ID + SequenceId string `json:"user_sequence_id"` // 用户序列组ID + Cohort string `json:"cohort"` // 用户分组 + NormalCardSequenceId string `json:"normal_card_sequence_id"` // 非保底星级序列 + NormalCardSequenceIds []string `json:"normal_card_sequence_ids"` // 非保底星级序列 +} + +// CardSequenceConfig 星级ID对应的卡片 +type CardSequenceConfig struct { + Id string `json:"id"` // ID + SequenceId string `json:"user_sequence_id"` // 用户序列组ID + Cohort string `json:"cohort"` // 用户分组 + CardIdList string `json:"card_id_list"` // 卡牌抽取序列 + CardIdLists []string `json:"card_id_lists"` // 卡牌抽取序列 +} + +// StarShopConfig 星星商店配置 +type StarShopConfig struct { + Id int `json:"id"` // ID + NeedStarNumber int `json:"need_star_number"` // 需求星星数 + CardBagIds []int `json:"card_bag_ids"` // 可换取的卡包ID {卡包类型,卡包ID,卡包数量} +} diff --git a/configs/confcardholder/decode.go b/configs/confcardholder/decode.go new file mode 100644 index 0000000..39dd733 --- /dev/null +++ b/configs/confcardholder/decode.go @@ -0,0 +1,169 @@ +package confcardholder + +import ( + "apigame/util/util-lx/lxalilog" + "encoding/json" + "errors" + "fmt" + "strings" +) + +// Decode 解析配置原始数据 +func (c *ActivityConfig) Decode(gameId string, configRaw *ActivityConfigRaw) { + c.GameId = gameId + c.Raw = configRaw + + c.Id = configRaw.Id + c.OpenLevel = configRaw.OpenLevel + c.PreviewTime = configRaw.PreviewTime + c.StartTime = configRaw.StartTime + c.EndTime = configRaw.EndTime + c.Round = configRaw.Round + + c.Awards = make(map[string]string) + c.AlbumConfig = make(map[int]AlbumConfig) + c.CardConfig = make(map[int]CardConfig) + c.CardholderConfig = make(map[string]OpenCardholderConfig) + c.NormalCardStarConfig = make(map[string]NormalCardStarConfig) + c.CardSequenceConfig = make(map[string]CardSequenceConfig) + c.StarShopConfig = make(map[int]StarShopConfig) + // 解析奖励 + { + err := json.Unmarshal([]byte(configRaw.Awards), &c.Awards) + if err != nil { + lxalilog.Errors(err, configRaw.Awards, gameId, configRaw.Id) + return + } + } + // 卡组配置 + { + configs := make([]AlbumConfig, 0) + err := json.Unmarshal([]byte(configRaw.AlbumConfig), &configs) + if err != nil { + lxalilog.Errors(err, configRaw.AlbumConfig, gameId, configRaw.Id) + return + } + for _, i2 := range configs { + c.AlbumConfig[i2.SetId] = i2 + } + } + // 卡牌配置 + { + configs := make([]CardConfig, 0) + err := json.Unmarshal([]byte(configRaw.CardConfig), &configs) + if err != nil { + lxalilog.Errors(err, configRaw.CardConfig, gameId, configRaw.Id) + return + } + for _, i2 := range configs { + c.CardConfig[i2.Id] = i2 + } + } + // 卡包开卡规则 + { + configs := make([]OpenCardholderConfig, 0) + err := json.Unmarshal([]byte(configRaw.CardHolderConfig), &configs) + if err != nil { + lxalilog.Errors(err, configRaw.CardHolderConfig, gameId, configRaw.Id) + return + } + for _, i2 := range configs { + c.CardholderConfig[i2.Id] = i2 + } + } + // 卡片星级配置 + { + configs := make([]NormalCardStarConfig, 0) + err := json.Unmarshal([]byte(configRaw.NormalCardStarSequence), &configs) + if err != nil { + lxalilog.Errors(err, configRaw.NormalCardStarSequence, gameId, configRaw.Id) + return + } + for _, i2 := range configs { + i2.NormalCardSequenceIds = strings.Split(i2.NormalCardSequenceId, ",") + combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) + c.NormalCardStarConfig[combineId] = i2 + } + } + // 卡片星级对应卡牌配置 + { + configs := make([]CardSequenceConfig, 0) + err := json.Unmarshal([]byte(configRaw.CardSequenceConfig), &configs) + if err != nil { + lxalilog.Errors(err, configRaw.CardSequenceConfig, gameId, configRaw.Id) + return + } + for _, i2 := range configs { + i2.CardIdLists = strings.Split(i2.CardIdList, ",") + combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) + c.CardSequenceConfig[combineId] = i2 + } + } + // 星星商店配置 + { + configs := make([]StarShopConfig, 0) + err := json.Unmarshal([]byte(configRaw.StarShopConfig), &configs) + if err != nil { + lxalilog.Errors(err, configRaw.StarShopConfig, gameId, configRaw.Id) + return + } + for _, i2 := range configs { + c.StarShopConfig[i2.Id] = i2 + } + } + + c.GenerateConfigClient() +} + +// GenerateConfigClient 生成给客户端的配置 +func (c *ActivityConfig) GenerateConfigClient() { + configClient := &CardActivityConfigClient{ + Id: c.Id, + RoundAwards: c.Awards, + Albums: make([]AlbumConfig, 0), + Cards: make([]CardConfig, 0), + Holders: make([]OpenCardholderConfig, 0), + StarShop: make([]StarShopConfig, 0), + } + for _, i2 := range c.AlbumConfig { + configClient.Albums = append(configClient.Albums, i2) + } + for _, i2 := range c.CardConfig { + configClient.Cards = append(configClient.Cards, i2) + } + for _, i2 := range c.CardholderConfig { + configClient.Holders = append(configClient.Holders, i2) + } + for _, i2 := range c.StarShopConfig { + configClient.StarShop = append(configClient.StarShop, i2) + } + c.Client = configClient +} + +// CombineIdSequenceIdCohort 组合ID k=ID_用户序列_用户分组 +func CombineIdSequenceIdCohort(id, sequenceId, cohort string) string { + return fmt.Sprintf("%s_%s_%s", id, sequenceId, cohort) +} + +// FindNormalCardStarConfig 查找配置 非保底卡星级ID +func (c *ActivityConfig) FindNormalCardStarConfig(id, sequenceId, cohort string) (conf NormalCardStarConfig, has bool) { + combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) + conf, has = c.NormalCardStarConfig[combineId] + if !has { + lxalilog.Errors(errors.New("ht_cardholder NormalCardStarConfig error"), id, sequenceId, cohort) + } + return +} + +// FindCardSequenceConfig 查找配置 星级ID对应的卡片 +func (c *ActivityConfig) FindCardSequenceConfig(id, sequenceId, cohort string) (conf CardSequenceConfig, has bool) { + combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) + conf, has = c.CardSequenceConfig[combineId] + if !has { + lxalilog.Errors(errors.New("ht_cardholder CardSequenceConfig error"), id, sequenceId, cohort) + fmt.Println(id) + fmt.Println(sequenceId) + fmt.Println(cohort) + } + return +} diff --git a/configs/confcardholder/get.go b/configs/confcardholder/get.go new file mode 100644 index 0000000..8e8fd96 --- /dev/null +++ b/configs/confcardholder/get.go @@ -0,0 +1,81 @@ +package confcardholder + +import ( + "apigame/service-common/svconst" + "apigame/service-common/svmysql" + "apigame/service-common/svredis" + "apigame/util/util-lx/lxalilog" + "apigame/util/util-lx/lxtime" + "apigame/util/utstring" + "apigame/util/zredis" + "fmt" +) + +// GetCurrent 获取 当前配置 +func GetCurrent(gameId string) (conf *ActivityConfig, has bool) { + currentKey := fmt.Sprintf("%s:%s:%s:current", + svconst.REDIS_CACHEP_REFIX, + svconst.MYSQL_TABLE_S_CARDHOLDER_CONFIG, + gameId) + currentId := zredis.GetInt64(zredis.GetConn(), currentKey) + timeNow := lxtime.NowUninx() + confRaw := new(ActivityConfigRaw) + hasFind := false + if currentId == 0 { + hasFind = FindCurrent(confRaw, gameId) + } else { + conf, has = GetConfig(gameId, currentId) + if has { + if timeNow < conf.StartTime || timeNow > conf.EndTime { + hasFind = FindCurrent(confRaw, gameId) + } + } else { + hasFind = FindCurrent(confRaw, gameId) + } + } + if hasFind { + conf = new(ActivityConfig) + conf.Decode(gameId, confRaw) + svredis.SaveData(gameId, conf) + has = true + currentId = conf.Id + _ = zredis.Set(zredis.GetConn(), currentKey, utstring.Int64ToString(currentId)) + } + return +} + +func FindCurrent(confRaw *ActivityConfigRaw, gameId string) (has bool) { + info := confRaw.MysqlInfo(gameId) + db := info.DbMysql + timeNow := lxtime.NowUninx() + result := db.Table(info.TableName).Where("start_time <= ? AND end_time >= ?", timeNow, timeNow).First(confRaw) + has = result.RowsAffected != 0 + return +} + +// GetConfig 获取 配置根据Id +func GetConfig(gameId string, confId int64) (conf *ActivityConfig, has bool) { + var err error + conf = &ActivityConfig{Id: confId} + has = svredis.LoadData(gameId, conf) + if has { + fmt.Println("dwjw confcardholder.GetConfig use cache") + return + } + confRaw := new(ActivityConfigRaw) + has, err = svmysql.First(confRaw, gameId) + if err != nil { + lxalilog.Errors(err, "confcardholder.GetConfig error", gameId) + return + } + if !has { + return + } + + conf.Decode(gameId, confRaw) + + fmt.Println("dwjw confcardholder.GetConfig save cache") + svredis.SaveData(gameId, conf) + + return +} diff --git a/configs/init.go b/configs/init.go index dc3f922..111e026 100644 --- a/configs/init.go +++ b/configs/init.go @@ -2,6 +2,7 @@ package configs import ( "apigame/configs/confapi" + "apigame/configs/confcardholder" "apigame/service-common/svconst" ) @@ -12,7 +13,7 @@ func Init() bool { } for _, gameId := range svconst.GameListCardHolder { - _, _ = GetCardActivityConfig(gameId) + _, _ = confcardholder.GetCurrent(gameId) } for _, gameId := range svconst.GameListRoomRank { diff --git a/configs/registry.go b/configs/registry.go index f9b764f..730410e 100644 --- a/configs/registry.go +++ b/configs/registry.go @@ -7,33 +7,6 @@ import ( "fmt" ) -// GetCardActivityConfig 获取 卡牌活动配置 -func GetCardActivityConfig(gameId string) (conf *CardActivityConfig, has bool) { - var err error - conf = new(CardActivityConfig) - has = svredis.LoadData(gameId, conf) - if has { - fmt.Println("dwjw GetCardActivityConfig use cache") - return - } - confRaw := new(CardActivityConfigRaw) - has, err = svmysql.First(confRaw, gameId) - if err != nil { - lxalilog.Errors(err, "configs.GetCardActivityConfig error", gameId) - return - } - if !has { - return - } - - conf.Decode(gameId, confRaw) - - fmt.Println("dwjw GetCardActivityConfig save cache") - svredis.SaveData(gameId, conf) - - return -} - // GetRoomRankConfig 获取 房间排行活动配置 func GetRoomRankConfig(gameId string) (conf *RoomRankConfig, has bool) { var err error diff --git a/service/cardholder/handle.go b/service/cardholder/handle.go index 71896fe..a21d9c4 100644 --- a/service/cardholder/handle.go +++ b/service/cardholder/handle.go @@ -1,7 +1,7 @@ package cardholder import ( - "apigame/configs" + "apigame/configs/confcardholder" "apigame/models" "apigame/service/code-msg" "apigame/util/util-lx/lxalilog" @@ -17,7 +17,7 @@ func HandleGetConfig(req *models.ReqCardHolderGetConfig) (code string, rsp model gameId := req.GameID // 尝试更新配置 - config, _ := configs.GetCardActivityConfig(gameId) + config, _ := confcardholder.GetCurrent(gameId) rsp.ActivityId = config.Id rsp.PrepareTime = config.PreviewTime rsp.StartTime = config.StartTime @@ -37,7 +37,7 @@ func HandleInfo(req *models.ReqCardHolderInfo) (code string, rsp models.RspCardH playerUid := req.UID // 尝试更新配置 - config, hasConfig := configs.GetCardActivityConfig(gameId) + config, hasConfig := confcardholder.GetCurrent(gameId) if !hasConfig { code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR return @@ -69,7 +69,7 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH playerUid := req.UID // 尝试更新配置 - config, hasConfig := configs.GetCardActivityConfig(gameId) + config, hasConfig := confcardholder.GetCurrent(gameId) if !hasConfig { code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR return @@ -146,7 +146,7 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model playerUid := req.UID // 尝试更新配置 - config, hasConfig := configs.GetCardActivityConfig(gameId) + config, hasConfig := confcardholder.GetCurrent(gameId) if !hasConfig { code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR return @@ -254,7 +254,7 @@ func HandleAutoExchangeInfo(req *models.ReqAutoExchangeInfo) (code string, rsp m playerUid := req.UID // 尝试更新配置 - config, hasConfig := configs.GetCardActivityConfig(gameId) + config, hasConfig := confcardholder.GetCurrent(gameId) if !hasConfig { code = code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN_ERROR return diff --git a/service/cardholder/logic.go b/service/cardholder/logic.go index cd5c7fa..675b600 100644 --- a/service/cardholder/logic.go +++ b/service/cardholder/logic.go @@ -1,7 +1,7 @@ package cardholder import ( - "apigame/configs" + "apigame/configs/confcardholder" "apigame/models" "apigame/service-common/svmysql" "apigame/service/code-msg" @@ -16,7 +16,7 @@ import ( ) // CheckStatus 判断活动是否开启 -func CheckStatus(conf *configs.CardActivityConfig) string { +func CheckStatus(conf *confcardholder.ActivityConfig) string { sec := lxtime.NowUninx() if conf.Id == 0 { return code_msg.RECODE_MERGE_CARDHOLDER_NOTOPEN1_ERROR @@ -31,7 +31,7 @@ func CheckStatus(conf *configs.CardActivityConfig) string { } // CheckGameData 检查游戏数据 轮次等 -func CheckGameData(d *DataCardHolder, conf *configs.CardActivityConfig) string { +func CheckGameData(d *DataCardHolder, conf *confcardholder.ActivityConfig) string { if d.Details.Round > conf.Round { return code_msg.RECODE_MERGE_CARDHOLDER_ROUNDFINISH_ERROR } @@ -74,7 +74,7 @@ func GetListFromArray(array []string, scale, count int) []string { } // GetNewCard 按顺序查找数目最少的一张卡抽取 -func GetNewCard(player *DataCardHolder, conf *configs.CardActivityConfig) int { +func GetNewCard(player *DataCardHolder, conf *confcardholder.ActivityConfig) int { if len(conf.CardConfig) < 1 { return 0 } @@ -91,7 +91,7 @@ func GetNewCard(player *DataCardHolder, conf *configs.CardActivityConfig) int { } // CheckAlbumFinish 判断卡组是否已集齐 -func CheckAlbumFinish(albumId int, player *DataCardHolder, config *configs.CardActivityConfig) bool { +func CheckAlbumFinish(albumId int, player *DataCardHolder, config *confcardholder.ActivityConfig) bool { for _, conf := range config.CardConfig { if conf.SetId == albumId { count := player.Details.Cards[conf.Id] @@ -104,7 +104,7 @@ func CheckAlbumFinish(albumId int, player *DataCardHolder, config *configs.CardA } // CheckRoundFinish 判断轮次是否已集齐(所有卡组集齐) -func CheckRoundFinish(player *DataCardHolder, config *configs.CardActivityConfig) bool { +func CheckRoundFinish(player *DataCardHolder, config *confcardholder.ActivityConfig) bool { for _, conf := range config.AlbumConfig { count := player.Details.Album[conf.SetId] if count < 1 { @@ -122,7 +122,7 @@ func HandleNextRound(player *DataCardHolder) { } // GetInfo 玩家卡牌活动信息 -func GetInfo(player *DataCardHolder, conf *configs.CardActivityConfig) models.CardHolderInfo { +func GetInfo(player *DataCardHolder, conf *confcardholder.ActivityConfig) models.CardHolderInfo { info := models.CardHolderInfo{ Cards: make(map[int]int), Album: make(map[int]int), @@ -143,8 +143,8 @@ func GetInfo(player *DataCardHolder, conf *configs.CardActivityConfig) models.Ca // openMode:开包类型0客户端驱动1星星商店购买2剩余星星兑换 func DoOpen(gameId string, player *DataCardHolder, - config *configs.CardActivityConfig, - confCardholder configs.OpenCardholderConfig, + config *confcardholder.ActivityConfig, + confCardholder confcardholder.OpenCardholderConfig, sequenceId, cohort string, openMode int) (newCards []int) { @@ -160,7 +160,7 @@ func DoOpen(gameId string, getCardFunc := func(cardConfigId string) { confCardSequence, hasCardSequence := config.FindCardSequenceConfig(cardConfigId, sequenceId, cohort) if hasCardSequence { - combineId := configs.CombineIdSequenceIdCohort(cardConfigId, sequenceId, cohort) + combineId := confcardholder.CombineIdSequenceIdCohort(cardConfigId, sequenceId, cohort) scale := player.Details.CardSequenceScales[combineId] cardId := GetOneFromArray(confCardSequence.CardIdLists, scale) cardIdInt := utstring.StringToInt(cardId) @@ -181,7 +181,7 @@ func DoOpen(gameId string, count := confCardholder.NormalCardNumber confNormalCardStar, hasNormalCardStar := config.FindNormalCardStarConfig(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) if hasNormalCardStar { - combineIdStar := configs.CombineIdSequenceIdCohort(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) + combineIdStar := confcardholder.CombineIdSequenceIdCohort(confCardholder.MinimumGuaranteeCardId, sequenceId, cohort) scaleStar := player.Details.StarSequenceScales[combineIdStar] starIds := GetListFromArray(confNormalCardStar.NormalCardSequenceIds, scaleStar, count) // 增加星级刻度 @@ -207,7 +207,7 @@ func DoOpen(gameId string, // DoOpenCheckAward 封装的新卡判断是否出发卡组和轮次奖励的逻辑 func DoOpenCheckAward(gameId string, player *DataCardHolder, - config *configs.CardActivityConfig, + config *confcardholder.ActivityConfig, sequenceId, cohort string, newCards []int, openMode int) (awardAlbum map[int]string, awardRound string) { @@ -270,7 +270,7 @@ func DoOpenCheckAward(gameId string, } // CalculateStarCount 计算星星点数 -func CalculateStarCount(player *DataCardHolder, config *configs.CardActivityConfig) { +func CalculateStarCount(player *DataCardHolder, config *confcardholder.ActivityConfig) { starCount := 0 for cardId, cardCount := range player.Details.Cards { if cardCount <= 1 { @@ -292,7 +292,7 @@ func CalculateStarCount(player *DataCardHolder, config *configs.CardActivityConf } // GetStarCardList 按照规则扣除星星数找到需要扣除的卡牌列表 -func GetStarCardList(player *DataCardHolder, config *configs.CardActivityConfig, needStar int) (enough bool, cardList map[int]int) { +func GetStarCardList(player *DataCardHolder, config *confcardholder.ActivityConfig, needStar int) (enough bool, cardList map[int]int) { enough = false cardList = make(map[int]int) starAmount := 0 @@ -361,10 +361,10 @@ func GetStarCardList(player *DataCardHolder, config *configs.CardActivityConfig, } // NextActivityAutoExchange 活动切换时自动兑换卡包 -func NextActivityAutoExchange(gameId string, player *DataCardHolder, config *configs.CardActivityConfig) { +func NextActivityAutoExchange(gameId string, player *DataCardHolder, config *confcardholder.ActivityConfig) { starCount := player.Details.LastStarCount // 把星星的配置按照需要的星星数降序排列 - list := lo.Values[int, configs.StarShopConfig](config.StarShopConfig) + list := lo.Values[int, confcardholder.StarShopConfig](config.StarShopConfig) sort.Slice(list, func(i, j int) bool { return list[i].NeedStarNumber < list[j].NeedStarNumber }) diff --git a/service/cardholder/player.go b/service/cardholder/player.go index bcc7db5..e83018d 100644 --- a/service/cardholder/player.go +++ b/service/cardholder/player.go @@ -1,7 +1,7 @@ package cardholder import ( - "apigame/configs" + "apigame/configs/confcardholder" "apigame/service-common/svmysql" "apigame/util/util-lx/lxalilog" "apigame/util/util-lx/lxtime" @@ -35,7 +35,7 @@ func _LoadPlayer(gameId string, playerUid int64) (d *DataCardHolder) { } // LoadPlayer 获取数据 外部接口 -func LoadPlayer(gameId string, playerUid int64, config *configs.CardActivityConfig) (d *DataCardHolder) { +func LoadPlayer(gameId string, playerUid int64, config *confcardholder.ActivityConfig) (d *DataCardHolder) { configId := config.Id d = _LoadPlayer(gameId, playerUid) // 如果当前有上线活动(活动ID不为0),且活动ID和玩家数据不同,说明活动已切换 需更新 diff --git a/util/zredis/kv.go b/util/zredis/kv.go index 10c0a2c..e91ba90 100644 --- a/util/zredis/kv.go +++ b/util/zredis/kv.go @@ -32,3 +32,11 @@ func SetEx(conn redis.Conn, key, value string, exTime int) (err error) { _, err = conn.Do("Set", key, value, "EX", exTime) return } + +func GetInt64(conn redis.Conn, key string) int64 { + value, err := redis.Int64(conn.Do("Get", key)) + if err == nil { + return value + } + return 0 +} -- libgit2 0.21.0