Commit 74e1d4d3c0ac419d02d97362c0ea6442898d7f39
1 parent
bce08317
Exists in
master
feat✨:配置管理
Showing
65 changed files
with
2067 additions
and
1311 deletions
Show diff stats
No preview for this file type
| @@ -0,0 +1,48 @@ | @@ -0,0 +1,48 @@ | ||
| 1 | +package confapi | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/configs-db/confbase" | ||
| 5 | + "apigame/service-common/svconst" | ||
| 6 | + "fmt" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +// ApiGameConfig api游戏配置 | ||
| 10 | +type ApiGameConfig struct { | ||
| 11 | + Raw *Raw | ||
| 12 | +} | ||
| 13 | + | ||
| 14 | +func (c *ApiGameConfig) GetUid() string { | ||
| 15 | + return c.Raw.GameId | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +func (c *ApiGameConfig) CheckCurrent() bool { | ||
| 19 | + return true | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +func (c *ApiGameConfig) ConfInfo(suffix string) *confbase.ConfInfo { | ||
| 23 | + tableName := "s_game_config" | ||
| 24 | + cacheKey := fmt.Sprintf("%s:%s:%s", svconst.REDIS_CACHEP_REFIX, tableName, suffix) | ||
| 25 | + return &confbase.ConfInfo{ | ||
| 26 | + DbMysql: svconst.DbApi, | ||
| 27 | + TableName: tableName, | ||
| 28 | + KeyName: "gameid", | ||
| 29 | + CacheKey: cacheKey, | ||
| 30 | + CacheCurrent: cacheKey + ":current", | ||
| 31 | + CacheTime: 300, | ||
| 32 | + } | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +// Raw 配置原始数据 | ||
| 36 | +type Raw struct { | ||
| 37 | + AppId string `gorm:"column:appid"` | ||
| 38 | + GameId string `gorm:"column:gameid"` | ||
| 39 | + Secret string `gorm:"column:secret"` | ||
| 40 | + AppKey string `gorm:"column:appkey"` | ||
| 41 | + Name string `gorm:"column:name"` | ||
| 42 | +} | ||
| 43 | + | ||
| 44 | +// Decode 解析配置原始数据 | ||
| 45 | +func (c *ApiGameConfig) Decode(gameId string, rawData any) { | ||
| 46 | + raw := rawData.(*Raw) | ||
| 47 | + c.Raw = raw | ||
| 48 | +} |
| @@ -0,0 +1,19 @@ | @@ -0,0 +1,19 @@ | ||
| 1 | +package confapi | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/configs-db/confbase" | ||
| 5 | + "errors" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +// GetConfig 获取 api游戏配置 | ||
| 9 | +func GetConfig(gameId string) (conf *ApiGameConfig, err error) { | ||
| 10 | + | ||
| 11 | + conf = new(ApiGameConfig) | ||
| 12 | + has := confbase.GetConfig[*ApiGameConfig, Raw](gameId, gameId, conf) | ||
| 13 | + if !has { | ||
| 14 | + err = errors.New("confapi.GetConfig error") | ||
| 15 | + return | ||
| 16 | + } | ||
| 17 | + | ||
| 18 | + return | ||
| 19 | +} |
| @@ -0,0 +1,113 @@ | @@ -0,0 +1,113 @@ | ||
| 1 | +package confbase | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/util/util-lx/lxalilog" | ||
| 5 | + "apigame/util/zjson" | ||
| 6 | + "apigame/util/zredis" | ||
| 7 | + "fmt" | ||
| 8 | + "runtime/debug" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +var CacheState = 1 // 0=关闭 1=打开 | ||
| 12 | + | ||
| 13 | +func SaveCache[T IConfData](gameId string, obj T) { | ||
| 14 | + info := obj.ConfInfo(gameId) | ||
| 15 | + _ = zredis.SetEx(info.CacheKey, zjson.Str(obj), info.CacheTime) | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +func LoadCache[T IConfData](gameId string, obj T) (has bool) { | ||
| 19 | + if CacheState == 0 { | ||
| 20 | + return false | ||
| 21 | + } | ||
| 22 | + has = true | ||
| 23 | + info := obj.ConfInfo(gameId) | ||
| 24 | + text, err := zredis.Get(info.CacheKey) | ||
| 25 | + if err != nil { | ||
| 26 | + has = false | ||
| 27 | + return | ||
| 28 | + } | ||
| 29 | + err = zjson.Obj(text, &obj) | ||
| 30 | + if err != nil { | ||
| 31 | + fmt.Println(err) | ||
| 32 | + has = false | ||
| 33 | + return | ||
| 34 | + } | ||
| 35 | + return | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +func LoadData[T1 IConfData, T2 IConfRawData](gameId string, confId any, obj T1) (has bool) { | ||
| 39 | + confRaw := new(T2) | ||
| 40 | + info := obj.ConfInfo(gameId) | ||
| 41 | + db := info.DbMysql | ||
| 42 | + result := db.Table(info.TableName).Where(fmt.Sprintf("%s = ?", info.KeyName), confId).First(confRaw) | ||
| 43 | + | ||
| 44 | + has = result.RowsAffected != 0 | ||
| 45 | + err := result.Error | ||
| 46 | + if err != nil { | ||
| 47 | + lxalilog.Errors(err, "confbase.LoadData error", gameId, confId) | ||
| 48 | + fmt.Printf("%s", debug.Stack()) | ||
| 49 | + return | ||
| 50 | + } | ||
| 51 | + if !has { | ||
| 52 | + return | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + obj.Decode(gameId, confRaw) | ||
| 56 | + return | ||
| 57 | +} | ||
| 58 | + | ||
| 59 | +func FindDuringTime[T1 IConfData, T2 IConfRawData](obj T1, raw *T2, gameId string) (has bool) { | ||
| 60 | + info := obj.ConfInfo(gameId) | ||
| 61 | + db := info.DbMysql | ||
| 62 | + result := db.Table(info.TableName).Where(info.CurrentQuery, info.CurrentArgs...).First(raw) | ||
| 63 | + has = result.RowsAffected != 0 | ||
| 64 | + return | ||
| 65 | +} | ||
| 66 | + | ||
| 67 | +func GetConfig[T1 IConfData, T2 IConfRawData](gameId string, confId any, obj T1) (has bool) { | ||
| 68 | + has = LoadCache(gameId, obj) | ||
| 69 | + if has { | ||
| 70 | + return | ||
| 71 | + } | ||
| 72 | + has = LoadData[T1, T2](gameId, confId, obj) | ||
| 73 | + if !has { | ||
| 74 | + return | ||
| 75 | + } | ||
| 76 | + SaveCache(gameId, obj) | ||
| 77 | + return | ||
| 78 | +} | ||
| 79 | + | ||
| 80 | +// GetCurrent 获取 当前配置 | ||
| 81 | +func GetCurrent[T1 IConfData, T2 IConfRawData](gameId string, obj T1) bool { | ||
| 82 | + has := false | ||
| 83 | + info := obj.ConfInfo(gameId) | ||
| 84 | + currentKey := info.CacheCurrent | ||
| 85 | + currentId := zredis.GetString(currentKey) | ||
| 86 | + if currentId != "" { | ||
| 87 | + has = GetConfig[T1, T2](gameId, currentId, obj) | ||
| 88 | + if has { | ||
| 89 | + if !obj.CheckCurrent() { | ||
| 90 | + has = false | ||
| 91 | + } | ||
| 92 | + } | ||
| 93 | + } | ||
| 94 | + return has | ||
| 95 | +} | ||
| 96 | + | ||
| 97 | +// FindCurrent 查找 当前配置 | ||
| 98 | +func FindCurrent[T1 IConfData, T2 IConfRawData](gameId string, obj T1) bool { | ||
| 99 | + has := false | ||
| 100 | + info := obj.ConfInfo(gameId) | ||
| 101 | + currentKey := info.CacheCurrent | ||
| 102 | + currentId := zredis.GetString(currentKey) | ||
| 103 | + confRaw := new(T2) | ||
| 104 | + has = FindDuringTime[T1, T2](obj, confRaw, gameId) | ||
| 105 | + if has { | ||
| 106 | + obj.Decode(gameId, confRaw) | ||
| 107 | + SaveCache(gameId, obj) | ||
| 108 | + has = true | ||
| 109 | + currentId = obj.GetUid() | ||
| 110 | + _ = zredis.Set(currentKey, currentId) | ||
| 111 | + } | ||
| 112 | + return has | ||
| 113 | +} |
| @@ -0,0 +1,31 @@ | @@ -0,0 +1,31 @@ | ||
| 1 | +package confbase | ||
| 2 | + | ||
| 3 | +import "gorm.io/gorm" | ||
| 4 | + | ||
| 5 | +// ConfInfo 配置对象信息 | ||
| 6 | +type ConfInfo struct { | ||
| 7 | + DbMysql *gorm.DB | ||
| 8 | + TableName string | ||
| 9 | + KeyName string | ||
| 10 | + CurrentQuery any | ||
| 11 | + CurrentArgs []any | ||
| 12 | + CacheKey string | ||
| 13 | + CacheCurrent string | ||
| 14 | + CacheTime int | ||
| 15 | +} | ||
| 16 | + | ||
| 17 | +// IConfData 配置对象 | ||
| 18 | +type IConfData interface { | ||
| 19 | + // ConfInfo redis存储信息 | ||
| 20 | + ConfInfo(suffix string) *ConfInfo | ||
| 21 | + // Decode 解码 | ||
| 22 | + Decode(gameId string, rawData any) | ||
| 23 | + // GetUid 获取keyID | ||
| 24 | + GetUid() string | ||
| 25 | + // CheckCurrent 判断当前开放 | ||
| 26 | + CheckCurrent() bool | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +// IConfRawData mysql存储对象 | ||
| 30 | +type IConfRawData interface { | ||
| 31 | +} |
| @@ -0,0 +1,152 @@ | @@ -0,0 +1,152 @@ | ||
| 1 | +package confcardholder | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/configs-db/confbase" | ||
| 5 | + "apigame/service-common/svconst" | ||
| 6 | + "apigame/util/util-lx/lxtime" | ||
| 7 | + "apigame/util/zconvert" | ||
| 8 | + "fmt" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +// ActivityConfig 卡牌活动配置 分析后数据 | ||
| 12 | +type ActivityConfig struct { | ||
| 13 | + Raw *ActivityConfigRaw `json:"-"` | ||
| 14 | + | ||
| 15 | + Id int64 // ID | ||
| 16 | + OpenLevel int // 开启等级 | ||
| 17 | + PreviewTime int64 // 预告时间 | ||
| 18 | + StartTime int64 // 开始时间 | ||
| 19 | + EndTime int64 // 结束时间 | ||
| 20 | + Round int // 轮数 | ||
| 21 | + IconPath string // icon资源路径 | ||
| 22 | + | ||
| 23 | + Awards map[string]string // 奖励配置 | ||
| 24 | + AlbumConfig map[int]AlbumConfig // 卡组配置 | ||
| 25 | + CardConfig map[int]CardConfig // 卡牌配置 | ||
| 26 | + CardholderConfig map[int]OpenCardholderConfig // 卡包开卡规则 | ||
| 27 | + NormalCardStarConfig map[string]NormalCardStarConfig // k=ID_用户序列_用户分组 卡片星级配置 | ||
| 28 | + CardSequenceConfig map[string]CardSequenceConfig // k=ID_用户序列_用户分组 卡片星级对应卡牌配置 | ||
| 29 | + StarShopConfig map[int]StarShopConfig // 星星商店配置 | ||
| 30 | + | ||
| 31 | + Client *ActivityConfigClient | ||
| 32 | + GameId string // 所属游戏ID | ||
| 33 | +} | ||
| 34 | + | ||
| 35 | +func (c *ActivityConfig) GetUid() string { | ||
| 36 | + return zconvert.Int64ToStr(c.Id) | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +func (c *ActivityConfig) CheckCurrent() bool { | ||
| 40 | + timeNow := lxtime.NowUninx() | ||
| 41 | + return timeNow >= c.StartTime && timeNow <= c.EndTime && c.Raw.Status == 1 | ||
| 42 | +} | ||
| 43 | + | ||
| 44 | +func (c *ActivityConfig) ConfInfo(suffix string) *confbase.ConfInfo { | ||
| 45 | + tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_CONFIG | ||
| 46 | + cacheKey := fmt.Sprintf("%s:%s:%s", svconst.REDIS_CACHEP_REFIX, tableName, suffix) | ||
| 47 | + timeNow := lxtime.NowUninx() | ||
| 48 | + return &confbase.ConfInfo{ | ||
| 49 | + DbMysql: svconst.DbConfig, | ||
| 50 | + TableName: fmt.Sprintf("%s_%s", tableName, suffix), | ||
| 51 | + KeyName: "id", | ||
| 52 | + CurrentQuery: "status = ? AND start_time <= ? AND end_time >= ?", | ||
| 53 | + CurrentArgs: []any{1, timeNow, timeNow}, | ||
| 54 | + CacheKey: fmt.Sprintf("%s:%d", cacheKey, c.Id), | ||
| 55 | + CacheCurrent: cacheKey + ":current", | ||
| 56 | + CacheTime: 300, | ||
| 57 | + } | ||
| 58 | +} | ||
| 59 | + | ||
| 60 | +// ActivityConfigRaw 卡牌活动配置 原始数据 | ||
| 61 | +type ActivityConfigRaw struct { | ||
| 62 | + Id int64 `gorm:"column:id;primaryKey"` // ID | ||
| 63 | + OpenLevel int // 开启等级 | ||
| 64 | + PreviewTime int64 // 预告时间 | ||
| 65 | + StartTime int64 // 开始时间 | ||
| 66 | + EndTime int64 // 结束时间 | ||
| 67 | + Round int // 轮数 | ||
| 68 | + IconPath string // icon资源路径 | ||
| 69 | + | ||
| 70 | + Awards string // 奖励配置 | ||
| 71 | + AlbumConfig string // 卡组配置 | ||
| 72 | + CardConfig string // 卡牌配置 | ||
| 73 | + CardHolderConfig string // 卡包开卡规则 | ||
| 74 | + NormalCardStarSequence string // 卡片星级配置 | ||
| 75 | + CardSequenceConfig string // 卡片星级对应卡牌配置 | ||
| 76 | + StarShopConfig string // 星星商店配置 | ||
| 77 | + | ||
| 78 | + Ver string // 版本号 | ||
| 79 | + Status int // 状态 0=关闭 1=开启 | ||
| 80 | + UpdateTime int64 // 修改时间戳 | ||
| 81 | +} | ||
| 82 | + | ||
| 83 | +// ActivityConfigClient 卡牌活动配置 给客户端数据 | ||
| 84 | +type ActivityConfigClient struct { | ||
| 85 | + Id int64 `form:"id" json:"id"` // ID | ||
| 86 | + Round int `form:"round" json:"round"` // 轮数 | ||
| 87 | + IconPath string `form:"icon_path" json:"icon_path"` // icon资源路径 | ||
| 88 | + RoundAwards map[string]string `form:"round_awards" json:"round_awards"` // 轮次奖励配置 | ||
| 89 | + Albums []AlbumConfig `form:"albums" json:"albums"` // 卡组配置 | ||
| 90 | + Cards []CardConfig `form:"cards" json:"cards"` // 卡牌配置 | ||
| 91 | + Holders []OpenCardholderConfig `form:"holders" json:"holders"` // 卡包开卡规则 | ||
| 92 | + StarShop []StarShopConfig `form:"star_shop" json:"star_shop"` // 星星商店配置 | ||
| 93 | +} | ||
| 94 | + | ||
| 95 | +// AlbumConfig 卡组表 | ||
| 96 | +type AlbumConfig struct { | ||
| 97 | + SetId int `json:"set_id"` // 卡组名 | ||
| 98 | + Name int `json:"name"` // 卡组图片 | ||
| 99 | + Icon string `json:"icon"` // 卡组id | ||
| 100 | + Rewards map[string]string `json:"rewards"` // 集齐奖励 k=轮次 | ||
| 101 | + StartTime int64 `json:"start_time"` // 开始时间 | ||
| 102 | + EndTime int64 `json:"end_time"` // 结束时间 | ||
| 103 | +} | ||
| 104 | + | ||
| 105 | +// CardConfig 卡牌表 | ||
| 106 | +type CardConfig struct { | ||
| 107 | + Id int `json:"id"` // ID | ||
| 108 | + Name int `json:"name"` // 卡牌名字 | ||
| 109 | + Icon string `json:"icon"` // 卡牌图标 | ||
| 110 | + Desc int `json:"desc"` // 卡牌描述 | ||
| 111 | + SetId int `json:"album_setid"` // 卡组id | ||
| 112 | + Star int `json:"star"` // 星级 | ||
| 113 | + IsGold int `json:"is_gold"` // 是否是金卡 | ||
| 114 | + IsSend int `json:"is_send"` // 卡片是否可赠送 | ||
| 115 | +} | ||
| 116 | + | ||
| 117 | +// OpenCardholderConfig 卡包开卡规则表 | ||
| 118 | +type OpenCardholderConfig struct { | ||
| 119 | + Id int `json:"id"` // ID | ||
| 120 | + CardPackIcon string `json:"img"` // 卡包资源名 | ||
| 121 | + IsGoldCardholder int `json:"is_gold_card_holder"` // 是否是金卡包 | ||
| 122 | + IsNew int `json:"is_new"` // 是否是新卡包 | ||
| 123 | + GuaranteedStarCardId int `json:"guaranteed_star_card_id"` // 保底卡星级序列ID | ||
| 124 | + NormalCardNumber int `json:"normal_card_number"` // 非保底卡数量 | ||
| 125 | + MinimumGuaranteeCardId int `json:"minimum_guarantee_card_id"` // 非保底卡牌序列ID | ||
| 126 | + ActivityId int `json:"activity_id"` // 对应活动ID | ||
| 127 | + Star int `json:"star"` // star | ||
| 128 | + Name int `json:"name"` // name | ||
| 129 | +} | ||
| 130 | + | ||
| 131 | +// NormalCardStarConfig 非保底卡星级ID | ||
| 132 | +type NormalCardStarConfig struct { | ||
| 133 | + Id int `json:"id"` // ID | ||
| 134 | + SequenceId int `json:"user_sequence_id"` // 用户序列组ID | ||
| 135 | + Cohort int `json:"cohort"` // 用户分组 | ||
| 136 | + NormalCardSequenceId []int `json:"normal_card_sequence_id"` // 非保底星级序列 | ||
| 137 | +} | ||
| 138 | + | ||
| 139 | +// CardSequenceConfig 星级ID对应的卡片 | ||
| 140 | +type CardSequenceConfig struct { | ||
| 141 | + Id int `json:"id"` // ID | ||
| 142 | + SequenceId int `json:"user_sequence_id"` // 用户序列组ID | ||
| 143 | + Cohort int `json:"cohort"` // 用户分组 | ||
| 144 | + CardIdList []int `json:"card_id_list"` // 卡牌抽取序列 | ||
| 145 | +} | ||
| 146 | + | ||
| 147 | +// StarShopConfig 星星商店配置 | ||
| 148 | +type StarShopConfig struct { | ||
| 149 | + Id int `json:"id"` // ID | ||
| 150 | + NeedStarNumber int `json:"need_star_number"` // 需求星星数 | ||
| 151 | + CardBagIds string `json:"card_bag_ids"` // 可换取的卡包ID {卡包类型,卡包ID,卡包数量} | ||
| 152 | +} |
| @@ -0,0 +1,170 @@ | @@ -0,0 +1,170 @@ | ||
| 1 | +package confcardholder | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/util/util-lx/lxalilog" | ||
| 5 | + "encoding/json" | ||
| 6 | + "errors" | ||
| 7 | + "fmt" | ||
| 8 | +) | ||
| 9 | + | ||
| 10 | +// Decode 解析配置原始数据 | ||
| 11 | +func (c *ActivityConfig) Decode(gameId string, rawData any) { | ||
| 12 | + raw := rawData.(*ActivityConfigRaw) | ||
| 13 | + c.GameId = gameId | ||
| 14 | + c.Raw = raw | ||
| 15 | + | ||
| 16 | + c.Id = raw.Id | ||
| 17 | + c.OpenLevel = raw.OpenLevel | ||
| 18 | + c.PreviewTime = raw.PreviewTime | ||
| 19 | + c.StartTime = raw.StartTime | ||
| 20 | + c.EndTime = raw.EndTime | ||
| 21 | + c.Round = raw.Round | ||
| 22 | + c.IconPath = raw.IconPath | ||
| 23 | + | ||
| 24 | + c.Awards = make(map[string]string) | ||
| 25 | + c.AlbumConfig = make(map[int]AlbumConfig) | ||
| 26 | + c.CardConfig = make(map[int]CardConfig) | ||
| 27 | + c.CardholderConfig = make(map[int]OpenCardholderConfig) | ||
| 28 | + c.NormalCardStarConfig = make(map[string]NormalCardStarConfig) | ||
| 29 | + c.CardSequenceConfig = make(map[string]CardSequenceConfig) | ||
| 30 | + c.StarShopConfig = make(map[int]StarShopConfig) | ||
| 31 | + // 解析奖励 | ||
| 32 | + { | ||
| 33 | + err := json.Unmarshal([]byte(raw.Awards), &c.Awards) | ||
| 34 | + if err != nil { | ||
| 35 | + lxalilog.Errors(err, raw.Awards, gameId, raw.Id) | ||
| 36 | + return | ||
| 37 | + } | ||
| 38 | + } | ||
| 39 | + // 卡组配置 | ||
| 40 | + { | ||
| 41 | + configs := make([]AlbumConfig, 0) | ||
| 42 | + err := json.Unmarshal([]byte(raw.AlbumConfig), &configs) | ||
| 43 | + if err != nil { | ||
| 44 | + lxalilog.Errors(err, raw.AlbumConfig, gameId, raw.Id) | ||
| 45 | + return | ||
| 46 | + } | ||
| 47 | + for _, i2 := range configs { | ||
| 48 | + c.AlbumConfig[i2.SetId] = i2 | ||
| 49 | + } | ||
| 50 | + } | ||
| 51 | + // 卡牌配置 | ||
| 52 | + { | ||
| 53 | + configs := make([]CardConfig, 0) | ||
| 54 | + err := json.Unmarshal([]byte(raw.CardConfig), &configs) | ||
| 55 | + if err != nil { | ||
| 56 | + lxalilog.Errors(err, raw.CardConfig, gameId, raw.Id) | ||
| 57 | + return | ||
| 58 | + } | ||
| 59 | + for _, i2 := range configs { | ||
| 60 | + c.CardConfig[i2.Id] = i2 | ||
| 61 | + } | ||
| 62 | + } | ||
| 63 | + // 卡包开卡规则 | ||
| 64 | + { | ||
| 65 | + configs := make([]OpenCardholderConfig, 0) | ||
| 66 | + err := json.Unmarshal([]byte(raw.CardHolderConfig), &configs) | ||
| 67 | + if err != nil { | ||
| 68 | + lxalilog.Errors(err, raw.CardHolderConfig, gameId, raw.Id) | ||
| 69 | + return | ||
| 70 | + } | ||
| 71 | + for _, i2 := range configs { | ||
| 72 | + c.CardholderConfig[i2.Id] = i2 | ||
| 73 | + } | ||
| 74 | + } | ||
| 75 | + // 卡片星级配置 | ||
| 76 | + { | ||
| 77 | + configs := make([]NormalCardStarConfig, 0) | ||
| 78 | + err := json.Unmarshal([]byte(raw.NormalCardStarSequence), &configs) | ||
| 79 | + if err != nil { | ||
| 80 | + lxalilog.Errors(err, raw.NormalCardStarSequence, gameId, raw.Id) | ||
| 81 | + return | ||
| 82 | + } | ||
| 83 | + for _, i2 := range configs { | ||
| 84 | + combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) | ||
| 85 | + c.NormalCardStarConfig[combineId] = i2 | ||
| 86 | + } | ||
| 87 | + } | ||
| 88 | + // 卡片星级对应卡牌配置 | ||
| 89 | + { | ||
| 90 | + configs := make([]CardSequenceConfig, 0) | ||
| 91 | + err := json.Unmarshal([]byte(raw.CardSequenceConfig), &configs) | ||
| 92 | + if err != nil { | ||
| 93 | + lxalilog.Errors(err, raw.CardSequenceConfig, gameId, raw.Id) | ||
| 94 | + return | ||
| 95 | + } | ||
| 96 | + for _, i2 := range configs { | ||
| 97 | + combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) | ||
| 98 | + c.CardSequenceConfig[combineId] = i2 | ||
| 99 | + } | ||
| 100 | + } | ||
| 101 | + // 星星商店配置 | ||
| 102 | + { | ||
| 103 | + configs := make([]StarShopConfig, 0) | ||
| 104 | + err := json.Unmarshal([]byte(raw.StarShopConfig), &configs) | ||
| 105 | + if err != nil { | ||
| 106 | + lxalilog.Errors(err, raw.StarShopConfig, gameId, raw.Id) | ||
| 107 | + return | ||
| 108 | + } | ||
| 109 | + for _, i2 := range configs { | ||
| 110 | + c.StarShopConfig[i2.Id] = i2 | ||
| 111 | + } | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + c.GenerateConfigClient() | ||
| 115 | +} | ||
| 116 | + | ||
| 117 | +// GenerateConfigClient 生成给客户端的配置 | ||
| 118 | +func (c *ActivityConfig) GenerateConfigClient() { | ||
| 119 | + configClient := &ActivityConfigClient{ | ||
| 120 | + Id: c.Id, | ||
| 121 | + Round: c.Round, | ||
| 122 | + IconPath: c.IconPath, | ||
| 123 | + RoundAwards: c.Awards, | ||
| 124 | + Albums: make([]AlbumConfig, 0), | ||
| 125 | + Cards: make([]CardConfig, 0), | ||
| 126 | + Holders: make([]OpenCardholderConfig, 0), | ||
| 127 | + StarShop: make([]StarShopConfig, 0), | ||
| 128 | + } | ||
| 129 | + for _, i2 := range c.AlbumConfig { | ||
| 130 | + configClient.Albums = append(configClient.Albums, i2) | ||
| 131 | + } | ||
| 132 | + for _, i2 := range c.CardConfig { | ||
| 133 | + configClient.Cards = append(configClient.Cards, i2) | ||
| 134 | + } | ||
| 135 | + for _, i2 := range c.CardholderConfig { | ||
| 136 | + configClient.Holders = append(configClient.Holders, i2) | ||
| 137 | + } | ||
| 138 | + for _, i2 := range c.StarShopConfig { | ||
| 139 | + configClient.StarShop = append(configClient.StarShop, i2) | ||
| 140 | + } | ||
| 141 | + c.Client = configClient | ||
| 142 | +} | ||
| 143 | + | ||
| 144 | +// CombineIdSequenceIdCohort 组合ID k=ID_用户序列_用户分组 | ||
| 145 | +func CombineIdSequenceIdCohort(id, sequenceId, cohort int) string { | ||
| 146 | + return fmt.Sprintf("%d_%d_%d", id, sequenceId, cohort) | ||
| 147 | +} | ||
| 148 | + | ||
| 149 | +// FindNormalCardStarConfig 查找配置 非保底卡星级ID | ||
| 150 | +func (c *ActivityConfig) FindNormalCardStarConfig(id, sequenceId, cohort int) (conf NormalCardStarConfig, has bool) { | ||
| 151 | + combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) | ||
| 152 | + conf, has = c.NormalCardStarConfig[combineId] | ||
| 153 | + if !has { | ||
| 154 | + lxalilog.Errors(errors.New("ht_cardholder NormalCardStarConfig error"), id, sequenceId, cohort) | ||
| 155 | + } | ||
| 156 | + return | ||
| 157 | +} | ||
| 158 | + | ||
| 159 | +// FindCardSequenceConfig 查找配置 星级ID对应的卡片 | ||
| 160 | +func (c *ActivityConfig) FindCardSequenceConfig(id, sequenceId, cohort int) (conf CardSequenceConfig, has bool) { | ||
| 161 | + combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) | ||
| 162 | + conf, has = c.CardSequenceConfig[combineId] | ||
| 163 | + if !has { | ||
| 164 | + lxalilog.Errors(errors.New("ht_cardholder CardSequenceConfig error"), id, sequenceId, cohort) | ||
| 165 | + fmt.Println(id) | ||
| 166 | + fmt.Println(sequenceId) | ||
| 167 | + fmt.Println(cohort) | ||
| 168 | + } | ||
| 169 | + return | ||
| 170 | +} |
| @@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
| 1 | +package confcardholder | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/configs-db/confbase" | ||
| 5 | +) | ||
| 6 | + | ||
| 7 | +// GetCurrent 获取 当前配置 | ||
| 8 | +func GetCurrent(gameId string) (conf *ActivityConfig, has bool) { | ||
| 9 | + conf = new(ActivityConfig) | ||
| 10 | + has = confbase.GetCurrent[*ActivityConfig, ActivityConfigRaw](gameId, conf) | ||
| 11 | + if !has { | ||
| 12 | + conf = new(ActivityConfig) | ||
| 13 | + has = confbase.FindCurrent[*ActivityConfig, ActivityConfigRaw](gameId, conf) | ||
| 14 | + } | ||
| 15 | + return | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +// GetConfig 获取 配置根据Id | ||
| 19 | +func GetConfig(gameId string, confId int64) (conf *ActivityConfig, has bool) { | ||
| 20 | + conf = new(ActivityConfig) | ||
| 21 | + has = confbase.GetConfig[*ActivityConfig, ActivityConfigRaw](gameId, confId, conf) | ||
| 22 | + | ||
| 23 | + return | ||
| 24 | +} |
| @@ -0,0 +1,67 @@ | @@ -0,0 +1,67 @@ | ||
| 1 | +package confglobal | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/configs-db/confbase" | ||
| 5 | + "apigame/service-common/svconst" | ||
| 6 | + "apigame/util/util-lx/lxalilog" | ||
| 7 | + "encoding/json" | ||
| 8 | + "fmt" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +// GlobalConfig 全局配置 | ||
| 12 | +type GlobalConfig struct { | ||
| 13 | + Raw *Raw `json:"-"` | ||
| 14 | + Names []string | ||
| 15 | + Avatars []string | ||
| 16 | + AvatarPath string | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +func (c *GlobalConfig) GetUid() string { | ||
| 20 | + return c.Raw.GameId | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +func (c *GlobalConfig) CheckCurrent() bool { | ||
| 24 | + return true | ||
| 25 | +} | ||
| 26 | + | ||
| 27 | +func (c *GlobalConfig) ConfInfo(suffix string) *confbase.ConfInfo { | ||
| 28 | + tableName := "s_game_global_config" | ||
| 29 | + cacheKey := fmt.Sprintf("%s:%s:%s", svconst.REDIS_CACHEP_REFIX, tableName, suffix) | ||
| 30 | + return &confbase.ConfInfo{ | ||
| 31 | + DbMysql: svconst.DbConfig, | ||
| 32 | + TableName: tableName, | ||
| 33 | + KeyName: "gameid", | ||
| 34 | + CacheKey: cacheKey, | ||
| 35 | + CacheCurrent: cacheKey + ":current", | ||
| 36 | + CacheTime: 300, | ||
| 37 | + } | ||
| 38 | +} | ||
| 39 | + | ||
| 40 | +// Raw 配置原始数据 | ||
| 41 | +type Raw struct { | ||
| 42 | + GameId string `gorm:"column:gameid"` | ||
| 43 | + NameConfig string | ||
| 44 | + AvatarConfig string | ||
| 45 | + AvatarPath string | ||
| 46 | +} | ||
| 47 | + | ||
| 48 | +// Decode 解析配置原始数据 | ||
| 49 | +func (c *GlobalConfig) Decode(gameId string, rawData any) { | ||
| 50 | + raw := rawData.(*Raw) | ||
| 51 | + c.Raw = raw | ||
| 52 | + { | ||
| 53 | + err := json.Unmarshal([]byte(raw.NameConfig), &c.Names) | ||
| 54 | + if err != nil { | ||
| 55 | + lxalilog.Errors(err, raw.NameConfig, gameId, raw.GameId) | ||
| 56 | + return | ||
| 57 | + } | ||
| 58 | + } | ||
| 59 | + { | ||
| 60 | + err := json.Unmarshal([]byte(raw.AvatarConfig), &c.Avatars) | ||
| 61 | + if err != nil { | ||
| 62 | + lxalilog.Errors(err, raw.AvatarConfig, gameId, raw.GameId) | ||
| 63 | + return | ||
| 64 | + } | ||
| 65 | + } | ||
| 66 | + c.AvatarPath = raw.AvatarPath | ||
| 67 | +} |
| @@ -0,0 +1,19 @@ | @@ -0,0 +1,19 @@ | ||
| 1 | +package confglobal | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/configs-db/confbase" | ||
| 5 | + "errors" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +// GetConfig 获取 api游戏配置 | ||
| 9 | +func GetConfig(gameId string) (conf *GlobalConfig, err error) { | ||
| 10 | + | ||
| 11 | + conf = new(GlobalConfig) | ||
| 12 | + has := confbase.GetConfig[*GlobalConfig, Raw](gameId, gameId, conf) | ||
| 13 | + if !has { | ||
| 14 | + err = errors.New("confglobal.GetConfig error") | ||
| 15 | + return | ||
| 16 | + } | ||
| 17 | + | ||
| 18 | + return | ||
| 19 | +} |
| @@ -0,0 +1,129 @@ | @@ -0,0 +1,129 @@ | ||
| 1 | +package confroomrank | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/configs-db/confbase" | ||
| 5 | + "apigame/service-common/svconst" | ||
| 6 | + "apigame/util/util-lx/lxtime" | ||
| 7 | + "apigame/util/zconvert" | ||
| 8 | + "fmt" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +// ActivityConfig 房间排行活动配置 分析后数据 | ||
| 12 | +type ActivityConfig struct { | ||
| 13 | + Raw *ActivityConfigRaw `json:"-"` | ||
| 14 | + | ||
| 15 | + Id int64 // ID | ||
| 16 | + Typ int // 排行榜类型 | ||
| 17 | + OpenLevel int // 开启等级 | ||
| 18 | + OpenScore int64 // 开启积分 | ||
| 19 | + PreviewTime int64 // 预告时间 | ||
| 20 | + StartTime int64 // 开始时间 | ||
| 21 | + EndTime int64 // 结束时间 | ||
| 22 | + ReleaseTime string // 结算发奖时间 | ||
| 23 | + | ||
| 24 | + Robot map[int]RobotConfig // 机器人配置 | ||
| 25 | + Room map[int]RoomConfig // 房间配置 | ||
| 26 | + | ||
| 27 | + GameId string // 所属游戏ID | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +func (c *ActivityConfig) GetUid() string { | ||
| 31 | + return zconvert.Int64ToStr(c.Id) | ||
| 32 | +} | ||
| 33 | + | ||
| 34 | +func (c *ActivityConfig) CheckCurrent() bool { | ||
| 35 | + timeNow := lxtime.NowUninx() | ||
| 36 | + return timeNow >= c.StartTime && timeNow <= c.EndTime && c.Raw.Status == 1 | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +func (c *ActivityConfig) ConfInfo(suffix string) *confbase.ConfInfo { | ||
| 40 | + tableName := svconst.MYSQL_TABLE_S_ROOMRANK_CONFIG | ||
| 41 | + cacheKey := fmt.Sprintf("%s:%s:%s", svconst.REDIS_CACHEP_REFIX, tableName, suffix) | ||
| 42 | + timeNow := lxtime.NowUninx() | ||
| 43 | + return &confbase.ConfInfo{ | ||
| 44 | + DbMysql: svconst.DbConfig, | ||
| 45 | + TableName: fmt.Sprintf("%s_%s", tableName, suffix), | ||
| 46 | + KeyName: "id", | ||
| 47 | + CurrentQuery: "typ = ? AND status = ? AND start_time <= ? AND end_time >= ?", | ||
| 48 | + CurrentArgs: []any{c.Typ, 1, timeNow, timeNow}, | ||
| 49 | + CacheKey: fmt.Sprintf("%s:%d", cacheKey, c.Id), | ||
| 50 | + CacheCurrent: fmt.Sprintf("%s:%d:current", cacheKey, c.Typ), | ||
| 51 | + CacheTime: 300, | ||
| 52 | + } | ||
| 53 | +} | ||
| 54 | + | ||
| 55 | +// ActivityConfigRaw 房间排行活动配置 原始数据 | ||
| 56 | +type ActivityConfigRaw struct { | ||
| 57 | + Id int64 `gorm:"column:id;primaryKey"` // ID | ||
| 58 | + Serial int64 // 轮次ID | ||
| 59 | + Typ int // 排行榜类型 | ||
| 60 | + OpenLevel int // 开启等级 | ||
| 61 | + OpenScore int64 // 开启积分 | ||
| 62 | + PreviewTime int64 // 预告时间 | ||
| 63 | + StartTime int64 // 开始时间 | ||
| 64 | + EndTime int64 // 结束时间 | ||
| 65 | + ReleaseTime string // 结算发奖时间 | ||
| 66 | + | ||
| 67 | + BootConfig string // 机器人配置 | ||
| 68 | + RoomConfig string // 房间配置 | ||
| 69 | + | ||
| 70 | + Ver string // 版本号 | ||
| 71 | + Status int // 状态 0=关闭 1=开启 | ||
| 72 | + UpdateTime int64 // 修改时间戳 | ||
| 73 | +} | ||
| 74 | + | ||
| 75 | +// GenerateConfigClient 生成给客户端的配置 | ||
| 76 | +func (c *ActivityConfigRaw) GenerateConfigClient() *ActivityConfigClient { | ||
| 77 | + configClient := &ActivityConfigClient{ | ||
| 78 | + Id: c.Id, | ||
| 79 | + Typ: c.Typ, | ||
| 80 | + Serial: c.Serial, | ||
| 81 | + OpenLevel: c.OpenLevel, | ||
| 82 | + OpenScore: c.OpenScore, | ||
| 83 | + PreviewTime: c.PreviewTime, | ||
| 84 | + StartTime: c.StartTime, | ||
| 85 | + EndTime: c.EndTime, | ||
| 86 | + ReleaseTime: c.ReleaseTime, | ||
| 87 | + Ver: c.Ver, | ||
| 88 | + Status: c.Status, | ||
| 89 | + } | ||
| 90 | + return configClient | ||
| 91 | +} | ||
| 92 | + | ||
| 93 | +// ActivityConfigClient 房间排行活动配置 给客户端数据 | ||
| 94 | +type ActivityConfigClient struct { | ||
| 95 | + Id int64 `form:"id" json:"id"` // ID | ||
| 96 | + Typ int `form:"typ" json:"typ"` // 排行榜类型 | ||
| 97 | + Serial int64 `form:"serial" json:"serial"` // 轮次ID | ||
| 98 | + OpenLevel int `form:"open_level" json:"open_level"` // 开启等级 | ||
| 99 | + OpenScore int64 `form:"open_score" json:"open_score"` // 开启积分 | ||
| 100 | + PreviewTime int64 `form:"preview_time" json:"preview_time"` // 预告时间 | ||
| 101 | + StartTime int64 `form:"start_time" json:"start_time"` // 开始时间 | ||
| 102 | + EndTime int64 `form:"end_time" json:"end_time"` // 结束时间 | ||
| 103 | + ReleaseTime string `form:"release_time" json:"release_time"` // 结算发奖时间 | ||
| 104 | + Ver string `form:"ver" json:"ver"` // 版本号 | ||
| 105 | + Status int `form:"status" json:"status"` // 状态 0=关闭 1=开启 | ||
| 106 | +} | ||
| 107 | + | ||
| 108 | +// RobotConfig 机器人配置 | ||
| 109 | +type RobotConfig struct { | ||
| 110 | + Id int `json:"id"` // id | ||
| 111 | + MinScore int `json:"min_score"` // 最低分数 | ||
| 112 | + TotalScore int `json:"total_score"` // 总分数 | ||
| 113 | + Range int `json:"range"` // 总分浮动范围(%) | ||
| 114 | +} | ||
| 115 | + | ||
| 116 | +// RoomConfig 房间配置 | ||
| 117 | +type RoomConfig struct { | ||
| 118 | + Id int `json:"id"` // id | ||
| 119 | + Levels []int `json:"level_range"` // 等级范围 | ||
| 120 | + UserClass int `json:"rating"` // 评级 | ||
| 121 | + UserScore []int `json:"score_range"` // 分数范围 | ||
| 122 | + TotalPlayer int `json:"room_user_number"` // 房间总人数 | ||
| 123 | + PlayerTypeCount [][]int `json:"user_type_number"` // 玩家类型数量 | ||
| 124 | + AutoRobot []int `json:"auto_room"` // 自动填充机器人 | ||
| 125 | + InitRobot [][]int `json:"disposition_robots"` // 配置机器人 | ||
| 126 | + Awards map[string]string `json:"rewards"` // 奖励 | ||
| 127 | + SettleScores []int `json:"score_adjest"` // 结算分数调整 | ||
| 128 | + SettleUserType []int `json:"user_type"` // 结算用户类型 | ||
| 129 | +} |
| @@ -0,0 +1,50 @@ | @@ -0,0 +1,50 @@ | ||
| 1 | +package confroomrank | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/util/util-lx/lxalilog" | ||
| 5 | + "encoding/json" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +// Decode 解析配置原始数据 | ||
| 9 | +func (c *ActivityConfig) Decode(gameId string, rawData any) { | ||
| 10 | + raw := rawData.(*ActivityConfigRaw) | ||
| 11 | + c.GameId = gameId | ||
| 12 | + c.Raw = raw | ||
| 13 | + | ||
| 14 | + c.Id = raw.Id | ||
| 15 | + c.Typ = raw.Typ | ||
| 16 | + c.OpenLevel = raw.OpenLevel | ||
| 17 | + c.OpenScore = raw.OpenScore | ||
| 18 | + c.PreviewTime = raw.PreviewTime | ||
| 19 | + c.StartTime = raw.StartTime | ||
| 20 | + c.EndTime = raw.EndTime | ||
| 21 | + c.ReleaseTime = raw.ReleaseTime | ||
| 22 | + | ||
| 23 | + c.Robot = make(map[int]RobotConfig) | ||
| 24 | + c.Room = make(map[int]RoomConfig) | ||
| 25 | + | ||
| 26 | + // 解析 机器人 | ||
| 27 | + { | ||
| 28 | + configs := make([]RobotConfig, 0) | ||
| 29 | + err := json.Unmarshal([]byte(raw.BootConfig), &configs) | ||
| 30 | + if err != nil { | ||
| 31 | + lxalilog.Errors(err, raw.BootConfig, gameId, raw.Id) | ||
| 32 | + return | ||
| 33 | + } | ||
| 34 | + for _, i2 := range configs { | ||
| 35 | + c.Robot[i2.Id] = i2 | ||
| 36 | + } | ||
| 37 | + } | ||
| 38 | + // 解析 房间 | ||
| 39 | + { | ||
| 40 | + configs := make([]RoomConfig, 0) | ||
| 41 | + err := json.Unmarshal([]byte(raw.RoomConfig), &configs) | ||
| 42 | + if err != nil { | ||
| 43 | + lxalilog.Errors(err, raw.RoomConfig, gameId, raw.Id) | ||
| 44 | + return | ||
| 45 | + } | ||
| 46 | + for _, i2 := range configs { | ||
| 47 | + c.Room[i2.Id] = i2 | ||
| 48 | + } | ||
| 49 | + } | ||
| 50 | +} |
| @@ -0,0 +1,44 @@ | @@ -0,0 +1,44 @@ | ||
| 1 | +package confroomrank | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/configs-db/confbase" | ||
| 5 | + "apigame/util/util-lx/lxalilog" | ||
| 6 | + "apigame/util/util-lx/lxtime" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +// GetCurrent 获取 当前配置 | ||
| 10 | +func GetCurrent(gameId string, topType int) (conf *ActivityConfig, has bool) { | ||
| 11 | + conf = new(ActivityConfig) | ||
| 12 | + conf.Typ = topType | ||
| 13 | + has = confbase.GetCurrent[*ActivityConfig, ActivityConfigRaw](gameId, conf) | ||
| 14 | + if !has { | ||
| 15 | + conf = new(ActivityConfig) | ||
| 16 | + conf.Typ = topType | ||
| 17 | + has = confbase.FindCurrent[*ActivityConfig, ActivityConfigRaw](gameId, conf) | ||
| 18 | + } | ||
| 19 | + return | ||
| 20 | +} | ||
| 21 | + | ||
| 22 | +// GetConfig 获取 配置根据Id | ||
| 23 | +func GetConfig(gameId string, confId int64) (conf *ActivityConfig, has bool) { | ||
| 24 | + conf = new(ActivityConfig) | ||
| 25 | + has = confbase.GetConfig[*ActivityConfig, ActivityConfigRaw](gameId, confId, conf) | ||
| 26 | + | ||
| 27 | + return | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +// GetCurrentConfigs 获取当前配置列表 | ||
| 31 | +func GetCurrentConfigs(gameId string) []*ActivityConfigRaw { | ||
| 32 | + obj := new(ActivityConfig) | ||
| 33 | + info := obj.ConfInfo(gameId) | ||
| 34 | + db := info.DbMysql | ||
| 35 | + timeNow := lxtime.NowUninx() | ||
| 36 | + objs := make([]*ActivityConfigRaw, 0) | ||
| 37 | + result := db.Table(info.TableName).Where( | ||
| 38 | + "status = ? AND start_time <= ? AND end_time >= ?", | ||
| 39 | + 1, timeNow, timeNow).Find(&objs) | ||
| 40 | + if result.Error != nil { | ||
| 41 | + lxalilog.Errors(result.Error, "confroomrank.GetCurrentConfigs error", gameId) | ||
| 42 | + } | ||
| 43 | + return objs | ||
| 44 | +} |
| @@ -0,0 +1,29 @@ | @@ -0,0 +1,29 @@ | ||
| 1 | +package configs_db | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/configs-db/confapi" | ||
| 5 | + "apigame/configs-db/confcardholder" | ||
| 6 | + "apigame/configs-db/confglobal" | ||
| 7 | + "apigame/service-common/svconst" | ||
| 8 | +) | ||
| 9 | + | ||
| 10 | +func Init() bool { | ||
| 11 | + | ||
| 12 | + for _, gameId := range svconst.GameList { | ||
| 13 | + _, _ = confapi.GetConfig(gameId) | ||
| 14 | + } | ||
| 15 | + | ||
| 16 | + for _, gameId := range svconst.GameList { | ||
| 17 | + _, _ = confglobal.GetConfig(gameId) | ||
| 18 | + } | ||
| 19 | + | ||
| 20 | + for _, gameId := range svconst.GameListCardHolder { | ||
| 21 | + _, _ = confcardholder.GetCurrent(gameId) | ||
| 22 | + } | ||
| 23 | + | ||
| 24 | + //for _, gameId := range svconst.GameListRoomRank { | ||
| 25 | + // _, _ = confroomrank.GetCurrent(gameId) | ||
| 26 | + //} | ||
| 27 | + | ||
| 28 | + return true | ||
| 29 | +} |
configs/confapi/config.go
| @@ -1,48 +0,0 @@ | @@ -1,48 +0,0 @@ | ||
| 1 | -package confapi | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/configs/confbase" | ||
| 5 | - "apigame/service-common/svconst" | ||
| 6 | - "fmt" | ||
| 7 | -) | ||
| 8 | - | ||
| 9 | -// ApiGameConfig api游戏配置 | ||
| 10 | -type ApiGameConfig struct { | ||
| 11 | - Raw *Raw | ||
| 12 | -} | ||
| 13 | - | ||
| 14 | -func (c *ApiGameConfig) GetUid() string { | ||
| 15 | - return c.Raw.GameId | ||
| 16 | -} | ||
| 17 | - | ||
| 18 | -func (c *ApiGameConfig) CheckCurrent() bool { | ||
| 19 | - return true | ||
| 20 | -} | ||
| 21 | - | ||
| 22 | -func (c *ApiGameConfig) ConfInfo(suffix string) *confbase.ConfInfo { | ||
| 23 | - tableName := "s_game_config" | ||
| 24 | - cacheKey := fmt.Sprintf("%s:%s:%s", svconst.REDIS_CACHEP_REFIX, tableName, suffix) | ||
| 25 | - return &confbase.ConfInfo{ | ||
| 26 | - DbMysql: svconst.DbApi, | ||
| 27 | - TableName: tableName, | ||
| 28 | - KeyName: "gameid", | ||
| 29 | - CacheKey: cacheKey, | ||
| 30 | - CacheCurrent: cacheKey + ":current", | ||
| 31 | - CacheTime: 300, | ||
| 32 | - } | ||
| 33 | -} | ||
| 34 | - | ||
| 35 | -// Raw 配置原始数据 | ||
| 36 | -type Raw struct { | ||
| 37 | - AppId string `gorm:"column:appid"` | ||
| 38 | - GameId string `gorm:"column:gameid"` | ||
| 39 | - Secret string `gorm:"column:secret"` | ||
| 40 | - AppKey string `gorm:"column:appkey"` | ||
| 41 | - Name string `gorm:"column:name"` | ||
| 42 | -} | ||
| 43 | - | ||
| 44 | -// Decode 解析配置原始数据 | ||
| 45 | -func (c *ApiGameConfig) Decode(gameId string, rawData any) { | ||
| 46 | - raw := rawData.(*Raw) | ||
| 47 | - c.Raw = raw | ||
| 48 | -} |
configs/confapi/get.go
| @@ -1,19 +0,0 @@ | @@ -1,19 +0,0 @@ | ||
| 1 | -package confapi | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/configs/confbase" | ||
| 5 | - "errors" | ||
| 6 | -) | ||
| 7 | - | ||
| 8 | -// GetConfig 获取 api游戏配置 | ||
| 9 | -func GetConfig(gameId string) (conf *ApiGameConfig, err error) { | ||
| 10 | - | ||
| 11 | - conf = new(ApiGameConfig) | ||
| 12 | - has := confbase.GetConfig[*ApiGameConfig, Raw](gameId, gameId, conf) | ||
| 13 | - if !has { | ||
| 14 | - err = errors.New("confapi.GetConfig error") | ||
| 15 | - return | ||
| 16 | - } | ||
| 17 | - | ||
| 18 | - return | ||
| 19 | -} |
configs/confbase/external.go
| @@ -1,113 +0,0 @@ | @@ -1,113 +0,0 @@ | ||
| 1 | -package confbase | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/util/util-lx/lxalilog" | ||
| 5 | - "apigame/util/zjson" | ||
| 6 | - "apigame/util/zredis" | ||
| 7 | - "fmt" | ||
| 8 | - "runtime/debug" | ||
| 9 | -) | ||
| 10 | - | ||
| 11 | -var CacheState = 1 // 0=关闭 1=打开 | ||
| 12 | - | ||
| 13 | -func SaveCache[T IConfData](gameId string, obj T) { | ||
| 14 | - info := obj.ConfInfo(gameId) | ||
| 15 | - _ = zredis.SetEx(info.CacheKey, zjson.Str(obj), info.CacheTime) | ||
| 16 | -} | ||
| 17 | - | ||
| 18 | -func LoadCache[T IConfData](gameId string, obj T) (has bool) { | ||
| 19 | - if CacheState == 0 { | ||
| 20 | - return false | ||
| 21 | - } | ||
| 22 | - has = true | ||
| 23 | - info := obj.ConfInfo(gameId) | ||
| 24 | - text, err := zredis.Get(info.CacheKey) | ||
| 25 | - if err != nil { | ||
| 26 | - has = false | ||
| 27 | - return | ||
| 28 | - } | ||
| 29 | - err = zjson.Obj(text, &obj) | ||
| 30 | - if err != nil { | ||
| 31 | - fmt.Println(err) | ||
| 32 | - has = false | ||
| 33 | - return | ||
| 34 | - } | ||
| 35 | - return | ||
| 36 | -} | ||
| 37 | - | ||
| 38 | -func LoadData[T1 IConfData, T2 IConfRawData](gameId string, confId any, obj T1) (has bool) { | ||
| 39 | - confRaw := new(T2) | ||
| 40 | - info := obj.ConfInfo(gameId) | ||
| 41 | - db := info.DbMysql | ||
| 42 | - result := db.Table(info.TableName).Where(fmt.Sprintf("%s = ?", info.KeyName), confId).First(confRaw) | ||
| 43 | - | ||
| 44 | - has = result.RowsAffected != 0 | ||
| 45 | - err := result.Error | ||
| 46 | - if err != nil { | ||
| 47 | - lxalilog.Errors(err, "confbase.LoadData error", gameId, confId) | ||
| 48 | - fmt.Printf("%s", debug.Stack()) | ||
| 49 | - return | ||
| 50 | - } | ||
| 51 | - if !has { | ||
| 52 | - return | ||
| 53 | - } | ||
| 54 | - | ||
| 55 | - obj.Decode(gameId, confRaw) | ||
| 56 | - return | ||
| 57 | -} | ||
| 58 | - | ||
| 59 | -func FindDuringTime[T1 IConfData, T2 IConfRawData](obj T1, raw *T2, gameId string) (has bool) { | ||
| 60 | - info := obj.ConfInfo(gameId) | ||
| 61 | - db := info.DbMysql | ||
| 62 | - result := db.Table(info.TableName).Where(info.CurrentQuery, info.CurrentArgs...).First(raw) | ||
| 63 | - has = result.RowsAffected != 0 | ||
| 64 | - return | ||
| 65 | -} | ||
| 66 | - | ||
| 67 | -func GetConfig[T1 IConfData, T2 IConfRawData](gameId string, confId any, obj T1) (has bool) { | ||
| 68 | - has = LoadCache(gameId, obj) | ||
| 69 | - if has { | ||
| 70 | - return | ||
| 71 | - } | ||
| 72 | - has = LoadData[T1, T2](gameId, confId, obj) | ||
| 73 | - if !has { | ||
| 74 | - return | ||
| 75 | - } | ||
| 76 | - SaveCache(gameId, obj) | ||
| 77 | - return | ||
| 78 | -} | ||
| 79 | - | ||
| 80 | -// GetCurrent 获取 当前配置 | ||
| 81 | -func GetCurrent[T1 IConfData, T2 IConfRawData](gameId string, obj T1) bool { | ||
| 82 | - has := false | ||
| 83 | - info := obj.ConfInfo(gameId) | ||
| 84 | - currentKey := info.CacheCurrent | ||
| 85 | - currentId := zredis.GetString(currentKey) | ||
| 86 | - if currentId != "" { | ||
| 87 | - has = GetConfig[T1, T2](gameId, currentId, obj) | ||
| 88 | - if has { | ||
| 89 | - if !obj.CheckCurrent() { | ||
| 90 | - has = false | ||
| 91 | - } | ||
| 92 | - } | ||
| 93 | - } | ||
| 94 | - return has | ||
| 95 | -} | ||
| 96 | - | ||
| 97 | -// FindCurrent 查找 当前配置 | ||
| 98 | -func FindCurrent[T1 IConfData, T2 IConfRawData](gameId string, obj T1) bool { | ||
| 99 | - has := false | ||
| 100 | - info := obj.ConfInfo(gameId) | ||
| 101 | - currentKey := info.CacheCurrent | ||
| 102 | - currentId := zredis.GetString(currentKey) | ||
| 103 | - confRaw := new(T2) | ||
| 104 | - has = FindDuringTime[T1, T2](obj, confRaw, gameId) | ||
| 105 | - if has { | ||
| 106 | - obj.Decode(gameId, confRaw) | ||
| 107 | - SaveCache(gameId, obj) | ||
| 108 | - has = true | ||
| 109 | - currentId = obj.GetUid() | ||
| 110 | - _ = zredis.Set(currentKey, currentId) | ||
| 111 | - } | ||
| 112 | - return has | ||
| 113 | -} |
configs/confbase/interface.go
| @@ -1,31 +0,0 @@ | @@ -1,31 +0,0 @@ | ||
| 1 | -package confbase | ||
| 2 | - | ||
| 3 | -import "gorm.io/gorm" | ||
| 4 | - | ||
| 5 | -// ConfInfo 配置对象信息 | ||
| 6 | -type ConfInfo struct { | ||
| 7 | - DbMysql *gorm.DB | ||
| 8 | - TableName string | ||
| 9 | - KeyName string | ||
| 10 | - CurrentQuery any | ||
| 11 | - CurrentArgs []any | ||
| 12 | - CacheKey string | ||
| 13 | - CacheCurrent string | ||
| 14 | - CacheTime int | ||
| 15 | -} | ||
| 16 | - | ||
| 17 | -// IConfData 配置对象 | ||
| 18 | -type IConfData interface { | ||
| 19 | - // ConfInfo redis存储信息 | ||
| 20 | - ConfInfo(suffix string) *ConfInfo | ||
| 21 | - // Decode 解码 | ||
| 22 | - Decode(gameId string, rawData any) | ||
| 23 | - // GetUid 获取keyID | ||
| 24 | - GetUid() string | ||
| 25 | - // CheckCurrent 判断当前开放 | ||
| 26 | - CheckCurrent() bool | ||
| 27 | -} | ||
| 28 | - | ||
| 29 | -// IConfRawData mysql存储对象 | ||
| 30 | -type IConfRawData interface { | ||
| 31 | -} |
configs/confcardholder/config.go
| @@ -1,152 +0,0 @@ | @@ -1,152 +0,0 @@ | ||
| 1 | -package confcardholder | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/configs/confbase" | ||
| 5 | - "apigame/service-common/svconst" | ||
| 6 | - "apigame/util/util-lx/lxtime" | ||
| 7 | - "apigame/util/utstring" | ||
| 8 | - "fmt" | ||
| 9 | -) | ||
| 10 | - | ||
| 11 | -// ActivityConfig 卡牌活动配置 分析后数据 | ||
| 12 | -type ActivityConfig struct { | ||
| 13 | - Raw *ActivityConfigRaw `json:"-"` | ||
| 14 | - | ||
| 15 | - Id int64 // ID | ||
| 16 | - OpenLevel int // 开启等级 | ||
| 17 | - PreviewTime int64 // 预告时间 | ||
| 18 | - StartTime int64 // 开始时间 | ||
| 19 | - EndTime int64 // 结束时间 | ||
| 20 | - Round int // 轮数 | ||
| 21 | - IconPath string // icon资源路径 | ||
| 22 | - | ||
| 23 | - Awards map[string]string // 奖励配置 | ||
| 24 | - AlbumConfig map[int]AlbumConfig // 卡组配置 | ||
| 25 | - CardConfig map[int]CardConfig // 卡牌配置 | ||
| 26 | - CardholderConfig map[int]OpenCardholderConfig // 卡包开卡规则 | ||
| 27 | - NormalCardStarConfig map[string]NormalCardStarConfig // k=ID_用户序列_用户分组 卡片星级配置 | ||
| 28 | - CardSequenceConfig map[string]CardSequenceConfig // k=ID_用户序列_用户分组 卡片星级对应卡牌配置 | ||
| 29 | - StarShopConfig map[int]StarShopConfig // 星星商店配置 | ||
| 30 | - | ||
| 31 | - Client *ActivityConfigClient | ||
| 32 | - GameId string // 所属游戏ID | ||
| 33 | -} | ||
| 34 | - | ||
| 35 | -func (c *ActivityConfig) GetUid() string { | ||
| 36 | - return utstring.Int64ToString(c.Id) | ||
| 37 | -} | ||
| 38 | - | ||
| 39 | -func (c *ActivityConfig) CheckCurrent() bool { | ||
| 40 | - timeNow := lxtime.NowUninx() | ||
| 41 | - return timeNow >= c.StartTime && timeNow <= c.EndTime && c.Raw.Status == 1 | ||
| 42 | -} | ||
| 43 | - | ||
| 44 | -func (c *ActivityConfig) ConfInfo(suffix string) *confbase.ConfInfo { | ||
| 45 | - tableName := svconst.MYSQL_TABLE_S_CARDHOLDER_CONFIG | ||
| 46 | - cacheKey := fmt.Sprintf("%s:%s:%s", svconst.REDIS_CACHEP_REFIX, tableName, suffix) | ||
| 47 | - timeNow := lxtime.NowUninx() | ||
| 48 | - return &confbase.ConfInfo{ | ||
| 49 | - DbMysql: svconst.DbConfig, | ||
| 50 | - TableName: fmt.Sprintf("%s_%s", tableName, suffix), | ||
| 51 | - KeyName: "id", | ||
| 52 | - CurrentQuery: "status = ? AND start_time <= ? AND end_time >= ?", | ||
| 53 | - CurrentArgs: []any{1, timeNow, timeNow}, | ||
| 54 | - CacheKey: fmt.Sprintf("%s:%d", cacheKey, c.Id), | ||
| 55 | - CacheCurrent: cacheKey + ":current", | ||
| 56 | - CacheTime: 300, | ||
| 57 | - } | ||
| 58 | -} | ||
| 59 | - | ||
| 60 | -// ActivityConfigRaw 卡牌活动配置 原始数据 | ||
| 61 | -type ActivityConfigRaw struct { | ||
| 62 | - Id int64 `gorm:"column:id;primaryKey"` // ID | ||
| 63 | - OpenLevel int // 开启等级 | ||
| 64 | - PreviewTime int64 // 预告时间 | ||
| 65 | - StartTime int64 // 开始时间 | ||
| 66 | - EndTime int64 // 结束时间 | ||
| 67 | - Round int // 轮数 | ||
| 68 | - IconPath string // icon资源路径 | ||
| 69 | - | ||
| 70 | - Awards string // 奖励配置 | ||
| 71 | - AlbumConfig string // 卡组配置 | ||
| 72 | - CardConfig string // 卡牌配置 | ||
| 73 | - CardHolderConfig string // 卡包开卡规则 | ||
| 74 | - NormalCardStarSequence string // 卡片星级配置 | ||
| 75 | - CardSequenceConfig string // 卡片星级对应卡牌配置 | ||
| 76 | - StarShopConfig string // 星星商店配置 | ||
| 77 | - | ||
| 78 | - Ver string // 版本号 | ||
| 79 | - Status int // 状态 0=关闭 1=开启 | ||
| 80 | - UpdateTime int64 // 修改时间戳 | ||
| 81 | -} | ||
| 82 | - | ||
| 83 | -// ActivityConfigClient 卡牌活动配置 给客户端数据 | ||
| 84 | -type ActivityConfigClient struct { | ||
| 85 | - Id int64 `form:"id" json:"id"` // ID | ||
| 86 | - Round int `form:"round" json:"round"` // 轮数 | ||
| 87 | - IconPath string `form:"icon_path" json:"icon_path"` // icon资源路径 | ||
| 88 | - RoundAwards map[string]string `form:"round_awards" json:"round_awards"` // 轮次奖励配置 | ||
| 89 | - Albums []AlbumConfig `form:"albums" json:"albums"` // 卡组配置 | ||
| 90 | - Cards []CardConfig `form:"cards" json:"cards"` // 卡牌配置 | ||
| 91 | - Holders []OpenCardholderConfig `form:"holders" json:"holders"` // 卡包开卡规则 | ||
| 92 | - StarShop []StarShopConfig `form:"star_shop" json:"star_shop"` // 星星商店配置 | ||
| 93 | -} | ||
| 94 | - | ||
| 95 | -// AlbumConfig 卡组表 | ||
| 96 | -type AlbumConfig struct { | ||
| 97 | - SetId int `json:"set_id"` // 卡组名 | ||
| 98 | - Name int `json:"name"` // 卡组图片 | ||
| 99 | - Icon string `json:"icon"` // 卡组id | ||
| 100 | - Rewards map[string]string `json:"rewards"` // 集齐奖励 k=轮次 | ||
| 101 | - StartTime int64 `json:"start_time"` // 开始时间 | ||
| 102 | - EndTime int64 `json:"end_time"` // 结束时间 | ||
| 103 | -} | ||
| 104 | - | ||
| 105 | -// CardConfig 卡牌表 | ||
| 106 | -type CardConfig struct { | ||
| 107 | - Id int `json:"id"` // ID | ||
| 108 | - Name int `json:"name"` // 卡牌名字 | ||
| 109 | - Icon string `json:"icon"` // 卡牌图标 | ||
| 110 | - Desc int `json:"desc"` // 卡牌描述 | ||
| 111 | - SetId int `json:"album_setid"` // 卡组id | ||
| 112 | - Star int `json:"star"` // 星级 | ||
| 113 | - IsGold int `json:"is_gold"` // 是否是金卡 | ||
| 114 | - IsSend int `json:"is_send"` // 卡片是否可赠送 | ||
| 115 | -} | ||
| 116 | - | ||
| 117 | -// OpenCardholderConfig 卡包开卡规则表 | ||
| 118 | -type OpenCardholderConfig struct { | ||
| 119 | - Id int `json:"id"` // ID | ||
| 120 | - CardPackIcon string `json:"img"` // 卡包资源名 | ||
| 121 | - IsGoldCardholder int `json:"is_gold_card_holder"` // 是否是金卡包 | ||
| 122 | - IsNew int `json:"is_new"` // 是否是新卡包 | ||
| 123 | - GuaranteedStarCardId int `json:"guaranteed_star_card_id"` // 保底卡星级序列ID | ||
| 124 | - NormalCardNumber int `json:"normal_card_number"` // 非保底卡数量 | ||
| 125 | - MinimumGuaranteeCardId int `json:"minimum_guarantee_card_id"` // 非保底卡牌序列ID | ||
| 126 | - ActivityId int `json:"activity_id"` // 对应活动ID | ||
| 127 | - Star int `json:"star"` // star | ||
| 128 | - Name int `json:"name"` // name | ||
| 129 | -} | ||
| 130 | - | ||
| 131 | -// NormalCardStarConfig 非保底卡星级ID | ||
| 132 | -type NormalCardStarConfig struct { | ||
| 133 | - Id int `json:"id"` // ID | ||
| 134 | - SequenceId int `json:"user_sequence_id"` // 用户序列组ID | ||
| 135 | - Cohort int `json:"cohort"` // 用户分组 | ||
| 136 | - NormalCardSequenceId []int `json:"normal_card_sequence_id"` // 非保底星级序列 | ||
| 137 | -} | ||
| 138 | - | ||
| 139 | -// CardSequenceConfig 星级ID对应的卡片 | ||
| 140 | -type CardSequenceConfig struct { | ||
| 141 | - Id int `json:"id"` // ID | ||
| 142 | - SequenceId int `json:"user_sequence_id"` // 用户序列组ID | ||
| 143 | - Cohort int `json:"cohort"` // 用户分组 | ||
| 144 | - CardIdList []int `json:"card_id_list"` // 卡牌抽取序列 | ||
| 145 | -} | ||
| 146 | - | ||
| 147 | -// StarShopConfig 星星商店配置 | ||
| 148 | -type StarShopConfig struct { | ||
| 149 | - Id int `json:"id"` // ID | ||
| 150 | - NeedStarNumber int `json:"need_star_number"` // 需求星星数 | ||
| 151 | - CardBagIds string `json:"card_bag_ids"` // 可换取的卡包ID {卡包类型,卡包ID,卡包数量} | ||
| 152 | -} |
configs/confcardholder/decode.go
| @@ -1,170 +0,0 @@ | @@ -1,170 +0,0 @@ | ||
| 1 | -package confcardholder | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/util/util-lx/lxalilog" | ||
| 5 | - "encoding/json" | ||
| 6 | - "errors" | ||
| 7 | - "fmt" | ||
| 8 | -) | ||
| 9 | - | ||
| 10 | -// Decode 解析配置原始数据 | ||
| 11 | -func (c *ActivityConfig) Decode(gameId string, rawData any) { | ||
| 12 | - raw := rawData.(*ActivityConfigRaw) | ||
| 13 | - c.GameId = gameId | ||
| 14 | - c.Raw = raw | ||
| 15 | - | ||
| 16 | - c.Id = raw.Id | ||
| 17 | - c.OpenLevel = raw.OpenLevel | ||
| 18 | - c.PreviewTime = raw.PreviewTime | ||
| 19 | - c.StartTime = raw.StartTime | ||
| 20 | - c.EndTime = raw.EndTime | ||
| 21 | - c.Round = raw.Round | ||
| 22 | - c.IconPath = raw.IconPath | ||
| 23 | - | ||
| 24 | - c.Awards = make(map[string]string) | ||
| 25 | - c.AlbumConfig = make(map[int]AlbumConfig) | ||
| 26 | - c.CardConfig = make(map[int]CardConfig) | ||
| 27 | - c.CardholderConfig = make(map[int]OpenCardholderConfig) | ||
| 28 | - c.NormalCardStarConfig = make(map[string]NormalCardStarConfig) | ||
| 29 | - c.CardSequenceConfig = make(map[string]CardSequenceConfig) | ||
| 30 | - c.StarShopConfig = make(map[int]StarShopConfig) | ||
| 31 | - // 解析奖励 | ||
| 32 | - { | ||
| 33 | - err := json.Unmarshal([]byte(raw.Awards), &c.Awards) | ||
| 34 | - if err != nil { | ||
| 35 | - lxalilog.Errors(err, raw.Awards, gameId, raw.Id) | ||
| 36 | - return | ||
| 37 | - } | ||
| 38 | - } | ||
| 39 | - // 卡组配置 | ||
| 40 | - { | ||
| 41 | - configs := make([]AlbumConfig, 0) | ||
| 42 | - err := json.Unmarshal([]byte(raw.AlbumConfig), &configs) | ||
| 43 | - if err != nil { | ||
| 44 | - lxalilog.Errors(err, raw.AlbumConfig, gameId, raw.Id) | ||
| 45 | - return | ||
| 46 | - } | ||
| 47 | - for _, i2 := range configs { | ||
| 48 | - c.AlbumConfig[i2.SetId] = i2 | ||
| 49 | - } | ||
| 50 | - } | ||
| 51 | - // 卡牌配置 | ||
| 52 | - { | ||
| 53 | - configs := make([]CardConfig, 0) | ||
| 54 | - err := json.Unmarshal([]byte(raw.CardConfig), &configs) | ||
| 55 | - if err != nil { | ||
| 56 | - lxalilog.Errors(err, raw.CardConfig, gameId, raw.Id) | ||
| 57 | - return | ||
| 58 | - } | ||
| 59 | - for _, i2 := range configs { | ||
| 60 | - c.CardConfig[i2.Id] = i2 | ||
| 61 | - } | ||
| 62 | - } | ||
| 63 | - // 卡包开卡规则 | ||
| 64 | - { | ||
| 65 | - configs := make([]OpenCardholderConfig, 0) | ||
| 66 | - err := json.Unmarshal([]byte(raw.CardHolderConfig), &configs) | ||
| 67 | - if err != nil { | ||
| 68 | - lxalilog.Errors(err, raw.CardHolderConfig, gameId, raw.Id) | ||
| 69 | - return | ||
| 70 | - } | ||
| 71 | - for _, i2 := range configs { | ||
| 72 | - c.CardholderConfig[i2.Id] = i2 | ||
| 73 | - } | ||
| 74 | - } | ||
| 75 | - // 卡片星级配置 | ||
| 76 | - { | ||
| 77 | - configs := make([]NormalCardStarConfig, 0) | ||
| 78 | - err := json.Unmarshal([]byte(raw.NormalCardStarSequence), &configs) | ||
| 79 | - if err != nil { | ||
| 80 | - lxalilog.Errors(err, raw.NormalCardStarSequence, gameId, raw.Id) | ||
| 81 | - return | ||
| 82 | - } | ||
| 83 | - for _, i2 := range configs { | ||
| 84 | - combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) | ||
| 85 | - c.NormalCardStarConfig[combineId] = i2 | ||
| 86 | - } | ||
| 87 | - } | ||
| 88 | - // 卡片星级对应卡牌配置 | ||
| 89 | - { | ||
| 90 | - configs := make([]CardSequenceConfig, 0) | ||
| 91 | - err := json.Unmarshal([]byte(raw.CardSequenceConfig), &configs) | ||
| 92 | - if err != nil { | ||
| 93 | - lxalilog.Errors(err, raw.CardSequenceConfig, gameId, raw.Id) | ||
| 94 | - return | ||
| 95 | - } | ||
| 96 | - for _, i2 := range configs { | ||
| 97 | - combineId := CombineIdSequenceIdCohort(i2.Id, i2.SequenceId, i2.Cohort) | ||
| 98 | - c.CardSequenceConfig[combineId] = i2 | ||
| 99 | - } | ||
| 100 | - } | ||
| 101 | - // 星星商店配置 | ||
| 102 | - { | ||
| 103 | - configs := make([]StarShopConfig, 0) | ||
| 104 | - err := json.Unmarshal([]byte(raw.StarShopConfig), &configs) | ||
| 105 | - if err != nil { | ||
| 106 | - lxalilog.Errors(err, raw.StarShopConfig, gameId, raw.Id) | ||
| 107 | - return | ||
| 108 | - } | ||
| 109 | - for _, i2 := range configs { | ||
| 110 | - c.StarShopConfig[i2.Id] = i2 | ||
| 111 | - } | ||
| 112 | - } | ||
| 113 | - | ||
| 114 | - c.GenerateConfigClient() | ||
| 115 | -} | ||
| 116 | - | ||
| 117 | -// GenerateConfigClient 生成给客户端的配置 | ||
| 118 | -func (c *ActivityConfig) GenerateConfigClient() { | ||
| 119 | - configClient := &ActivityConfigClient{ | ||
| 120 | - Id: c.Id, | ||
| 121 | - Round: c.Round, | ||
| 122 | - IconPath: c.IconPath, | ||
| 123 | - RoundAwards: c.Awards, | ||
| 124 | - Albums: make([]AlbumConfig, 0), | ||
| 125 | - Cards: make([]CardConfig, 0), | ||
| 126 | - Holders: make([]OpenCardholderConfig, 0), | ||
| 127 | - StarShop: make([]StarShopConfig, 0), | ||
| 128 | - } | ||
| 129 | - for _, i2 := range c.AlbumConfig { | ||
| 130 | - configClient.Albums = append(configClient.Albums, i2) | ||
| 131 | - } | ||
| 132 | - for _, i2 := range c.CardConfig { | ||
| 133 | - configClient.Cards = append(configClient.Cards, i2) | ||
| 134 | - } | ||
| 135 | - for _, i2 := range c.CardholderConfig { | ||
| 136 | - configClient.Holders = append(configClient.Holders, i2) | ||
| 137 | - } | ||
| 138 | - for _, i2 := range c.StarShopConfig { | ||
| 139 | - configClient.StarShop = append(configClient.StarShop, i2) | ||
| 140 | - } | ||
| 141 | - c.Client = configClient | ||
| 142 | -} | ||
| 143 | - | ||
| 144 | -// CombineIdSequenceIdCohort 组合ID k=ID_用户序列_用户分组 | ||
| 145 | -func CombineIdSequenceIdCohort(id, sequenceId, cohort int) string { | ||
| 146 | - return fmt.Sprintf("%d_%d_%d", id, sequenceId, cohort) | ||
| 147 | -} | ||
| 148 | - | ||
| 149 | -// FindNormalCardStarConfig 查找配置 非保底卡星级ID | ||
| 150 | -func (c *ActivityConfig) FindNormalCardStarConfig(id, sequenceId, cohort int) (conf NormalCardStarConfig, has bool) { | ||
| 151 | - combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) | ||
| 152 | - conf, has = c.NormalCardStarConfig[combineId] | ||
| 153 | - if !has { | ||
| 154 | - lxalilog.Errors(errors.New("ht_cardholder NormalCardStarConfig error"), id, sequenceId, cohort) | ||
| 155 | - } | ||
| 156 | - return | ||
| 157 | -} | ||
| 158 | - | ||
| 159 | -// FindCardSequenceConfig 查找配置 星级ID对应的卡片 | ||
| 160 | -func (c *ActivityConfig) FindCardSequenceConfig(id, sequenceId, cohort int) (conf CardSequenceConfig, has bool) { | ||
| 161 | - combineId := CombineIdSequenceIdCohort(id, sequenceId, cohort) | ||
| 162 | - conf, has = c.CardSequenceConfig[combineId] | ||
| 163 | - if !has { | ||
| 164 | - lxalilog.Errors(errors.New("ht_cardholder CardSequenceConfig error"), id, sequenceId, cohort) | ||
| 165 | - fmt.Println(id) | ||
| 166 | - fmt.Println(sequenceId) | ||
| 167 | - fmt.Println(cohort) | ||
| 168 | - } | ||
| 169 | - return | ||
| 170 | -} |
configs/confcardholder/get.go
| @@ -1,24 +0,0 @@ | @@ -1,24 +0,0 @@ | ||
| 1 | -package confcardholder | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/configs/confbase" | ||
| 5 | -) | ||
| 6 | - | ||
| 7 | -// GetCurrent 获取 当前配置 | ||
| 8 | -func GetCurrent(gameId string) (conf *ActivityConfig, has bool) { | ||
| 9 | - conf = new(ActivityConfig) | ||
| 10 | - has = confbase.GetCurrent[*ActivityConfig, ActivityConfigRaw](gameId, conf) | ||
| 11 | - if !has { | ||
| 12 | - conf = new(ActivityConfig) | ||
| 13 | - has = confbase.FindCurrent[*ActivityConfig, ActivityConfigRaw](gameId, conf) | ||
| 14 | - } | ||
| 15 | - return | ||
| 16 | -} | ||
| 17 | - | ||
| 18 | -// GetConfig 获取 配置根据Id | ||
| 19 | -func GetConfig(gameId string, confId int64) (conf *ActivityConfig, has bool) { | ||
| 20 | - conf = new(ActivityConfig) | ||
| 21 | - has = confbase.GetConfig[*ActivityConfig, ActivityConfigRaw](gameId, confId, conf) | ||
| 22 | - | ||
| 23 | - return | ||
| 24 | -} |
configs/confglobal/config.go
| @@ -1,67 +0,0 @@ | @@ -1,67 +0,0 @@ | ||
| 1 | -package confglobal | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/configs/confbase" | ||
| 5 | - "apigame/service-common/svconst" | ||
| 6 | - "apigame/util/util-lx/lxalilog" | ||
| 7 | - "encoding/json" | ||
| 8 | - "fmt" | ||
| 9 | -) | ||
| 10 | - | ||
| 11 | -// GlobalConfig 全局配置 | ||
| 12 | -type GlobalConfig struct { | ||
| 13 | - Raw *Raw `json:"-"` | ||
| 14 | - Names []string | ||
| 15 | - Avatars []string | ||
| 16 | - AvatarPath string | ||
| 17 | -} | ||
| 18 | - | ||
| 19 | -func (c *GlobalConfig) GetUid() string { | ||
| 20 | - return c.Raw.GameId | ||
| 21 | -} | ||
| 22 | - | ||
| 23 | -func (c *GlobalConfig) CheckCurrent() bool { | ||
| 24 | - return true | ||
| 25 | -} | ||
| 26 | - | ||
| 27 | -func (c *GlobalConfig) ConfInfo(suffix string) *confbase.ConfInfo { | ||
| 28 | - tableName := "s_game_global_config" | ||
| 29 | - cacheKey := fmt.Sprintf("%s:%s:%s", svconst.REDIS_CACHEP_REFIX, tableName, suffix) | ||
| 30 | - return &confbase.ConfInfo{ | ||
| 31 | - DbMysql: svconst.DbConfig, | ||
| 32 | - TableName: tableName, | ||
| 33 | - KeyName: "gameid", | ||
| 34 | - CacheKey: cacheKey, | ||
| 35 | - CacheCurrent: cacheKey + ":current", | ||
| 36 | - CacheTime: 300, | ||
| 37 | - } | ||
| 38 | -} | ||
| 39 | - | ||
| 40 | -// Raw 配置原始数据 | ||
| 41 | -type Raw struct { | ||
| 42 | - GameId string `gorm:"column:gameid"` | ||
| 43 | - NameConfig string | ||
| 44 | - AvatarConfig string | ||
| 45 | - AvatarPath string | ||
| 46 | -} | ||
| 47 | - | ||
| 48 | -// Decode 解析配置原始数据 | ||
| 49 | -func (c *GlobalConfig) Decode(gameId string, rawData any) { | ||
| 50 | - raw := rawData.(*Raw) | ||
| 51 | - c.Raw = raw | ||
| 52 | - { | ||
| 53 | - err := json.Unmarshal([]byte(raw.NameConfig), &c.Names) | ||
| 54 | - if err != nil { | ||
| 55 | - lxalilog.Errors(err, raw.NameConfig, gameId, raw.GameId) | ||
| 56 | - return | ||
| 57 | - } | ||
| 58 | - } | ||
| 59 | - { | ||
| 60 | - err := json.Unmarshal([]byte(raw.AvatarConfig), &c.Avatars) | ||
| 61 | - if err != nil { | ||
| 62 | - lxalilog.Errors(err, raw.AvatarConfig, gameId, raw.GameId) | ||
| 63 | - return | ||
| 64 | - } | ||
| 65 | - } | ||
| 66 | - c.AvatarPath = raw.AvatarPath | ||
| 67 | -} |
configs/confglobal/get.go
| @@ -1,19 +0,0 @@ | @@ -1,19 +0,0 @@ | ||
| 1 | -package confglobal | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/configs/confbase" | ||
| 5 | - "errors" | ||
| 6 | -) | ||
| 7 | - | ||
| 8 | -// GetConfig 获取 api游戏配置 | ||
| 9 | -func GetConfig(gameId string) (conf *GlobalConfig, err error) { | ||
| 10 | - | ||
| 11 | - conf = new(GlobalConfig) | ||
| 12 | - has := confbase.GetConfig[*GlobalConfig, Raw](gameId, gameId, conf) | ||
| 13 | - if !has { | ||
| 14 | - err = errors.New("confglobal.GetConfig error") | ||
| 15 | - return | ||
| 16 | - } | ||
| 17 | - | ||
| 18 | - return | ||
| 19 | -} |
| @@ -0,0 +1,282 @@ | @@ -0,0 +1,282 @@ | ||
| 1 | +// DO NOT EDIT! | ||
| 2 | +// This code is auto generated by go-xlsx-exporter | ||
| 3 | +// VERSION 1.3 | ||
| 4 | +// go-protobuf v1.27.1 | ||
| 5 | + | ||
| 6 | +package configs | ||
| 7 | + | ||
| 8 | +import ( | ||
| 9 | + reflect "reflect" | ||
| 10 | + sync "sync" | ||
| 11 | + | ||
| 12 | + protoreflect "google.golang.org/protobuf/reflect/protoreflect" | ||
| 13 | + protoimpl "google.golang.org/protobuf/runtime/protoimpl" | ||
| 14 | +) | ||
| 15 | + | ||
| 16 | +const ( | ||
| 17 | + // Verify that this generated code is sufficiently up-to-date. | ||
| 18 | + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) | ||
| 19 | + // Verify that runtime/protoimpl is sufficiently up-to-date. | ||
| 20 | + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) | ||
| 21 | +) | ||
| 22 | + | ||
| 23 | +/* type ConvertHandler func (field string, value interface{}) interface{} | ||
| 24 | + | ||
| 25 | +type MessageBase struct { | ||
| 26 | + | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +func (item *MessageBase) GetConvertData(field string, value interface{}) { | ||
| 30 | + | ||
| 31 | +} */ | ||
| 32 | +// Defined in table: data/abtest.xlsx:abtest; | ||
| 33 | +type AbTestCfg struct { | ||
| 34 | + state protoimpl.MessageState | ||
| 35 | + sizeCache protoimpl.SizeCache | ||
| 36 | + unknownFields protoimpl.UnknownFields | ||
| 37 | + | ||
| 38 | + ID uint32 `protobuf:"varint,1,opt,name=ID,proto3uint32" json:"ID,omitempty"` /** 编号 */ | ||
| 39 | + | ||
| 40 | + Name string `protobuf:"bytes,2,opt,name=Name,proto3string" json:"Name,omitempty"` /** 分组名 */ | ||
| 41 | + | ||
| 42 | + Min uint32 `protobuf:"varint,3,opt,name=Min,proto3uint32" json:"Min,omitempty"` /** ID下限 */ | ||
| 43 | + | ||
| 44 | + Max uint32 `protobuf:"varint,4,opt,name=Max,proto3uint32" json:"Max,omitempty"` /** ID上限 */ | ||
| 45 | + | ||
| 46 | + Condition string `protobuf:"bytes,5,opt,name=Condition,proto3string" json:"Condition,omitempty"` /** 条件 */ | ||
| 47 | + | ||
| 48 | + Config string `protobuf:"bytes,6,opt,name=Config,proto3string" json:"Config,omitempty"` /** 配置 */ | ||
| 49 | + | ||
| 50 | +} | ||
| 51 | + | ||
| 52 | +func (x *AbTestCfg) Reset() { | ||
| 53 | + *x = AbTestCfg{} | ||
| 54 | + if protoimpl.UnsafeEnabled { | ||
| 55 | + mi := &file_config_proto_msgTypes[0] | ||
| 56 | + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||
| 57 | + ms.StoreMessageInfo(mi) | ||
| 58 | + } | ||
| 59 | +} | ||
| 60 | + | ||
| 61 | +func (x *AbTestCfg) String() string { | ||
| 62 | + return protoimpl.X.MessageStringOf(x) | ||
| 63 | +} | ||
| 64 | + | ||
| 65 | +func (*AbTestCfg) ProtoMessage() {} | ||
| 66 | + | ||
| 67 | +func (x *AbTestCfg) ProtoReflect() protoreflect.Message { | ||
| 68 | + mi := &file_config_proto_msgTypes[0] | ||
| 69 | + if protoimpl.UnsafeEnabled && x != nil { | ||
| 70 | + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||
| 71 | + if ms.LoadMessageInfo() == nil { | ||
| 72 | + ms.StoreMessageInfo(mi) | ||
| 73 | + } | ||
| 74 | + return ms | ||
| 75 | + } | ||
| 76 | + return mi.MessageOf(x) | ||
| 77 | +} | ||
| 78 | + | ||
| 79 | +// Deprecated: Use AbTestCfg.ProtoReflect.Descriptor instead. | ||
| 80 | +func (*AbTestCfg) Descriptor() ([]byte, []int) { | ||
| 81 | + return file_config_proto_rawDescGZIP(), []int{0} | ||
| 82 | +} | ||
| 83 | + | ||
| 84 | +func (x *AbTestCfg) GetID() uint32 { | ||
| 85 | + if x != nil { | ||
| 86 | + return x.ID | ||
| 87 | + } | ||
| 88 | + return 0 | ||
| 89 | +} | ||
| 90 | + | ||
| 91 | +func (x *AbTestCfg) GetName() string { | ||
| 92 | + if x != nil { | ||
| 93 | + return x.Name | ||
| 94 | + } | ||
| 95 | + return "" | ||
| 96 | +} | ||
| 97 | + | ||
| 98 | +func (x *AbTestCfg) GetMin() uint32 { | ||
| 99 | + if x != nil { | ||
| 100 | + return x.Min | ||
| 101 | + } | ||
| 102 | + return 0 | ||
| 103 | +} | ||
| 104 | + | ||
| 105 | +func (x *AbTestCfg) GetMax() uint32 { | ||
| 106 | + if x != nil { | ||
| 107 | + return x.Max | ||
| 108 | + } | ||
| 109 | + return 0 | ||
| 110 | +} | ||
| 111 | + | ||
| 112 | +func (x *AbTestCfg) GetCondition() string { | ||
| 113 | + if x != nil { | ||
| 114 | + return x.Condition | ||
| 115 | + } | ||
| 116 | + return "" | ||
| 117 | +} | ||
| 118 | + | ||
| 119 | +func (x *AbTestCfg) GetConfig() string { | ||
| 120 | + if x != nil { | ||
| 121 | + return x.Config | ||
| 122 | + } | ||
| 123 | + return "" | ||
| 124 | +} | ||
| 125 | + | ||
| 126 | + | ||
| 127 | +// Defined in table: data/abtest.xlsx:abtest; | ||
| 128 | +type AbTestCfg_ARRAY struct { | ||
| 129 | + state protoimpl.MessageState | ||
| 130 | + sizeCache protoimpl.SizeCache | ||
| 131 | + unknownFields protoimpl.UnknownFields | ||
| 132 | + | ||
| 133 | + | ||
| 134 | + Items []*AbTestCfg `protobuf:"bytes,1,rep,name=Items,proto3*AbTestCfg" json:"Items,omitempty"` | ||
| 135 | + | ||
| 136 | +} | ||
| 137 | + | ||
| 138 | +func (x *AbTestCfg_ARRAY) Reset() { | ||
| 139 | + *x = AbTestCfg_ARRAY{} | ||
| 140 | + if protoimpl.UnsafeEnabled { | ||
| 141 | + mi := &file_config_proto_msgTypes[1] | ||
| 142 | + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||
| 143 | + ms.StoreMessageInfo(mi) | ||
| 144 | + } | ||
| 145 | +} | ||
| 146 | + | ||
| 147 | +func (x *AbTestCfg_ARRAY) String() string { | ||
| 148 | + return protoimpl.X.MessageStringOf(x) | ||
| 149 | +} | ||
| 150 | + | ||
| 151 | +func (*AbTestCfg_ARRAY) ProtoMessage() {} | ||
| 152 | + | ||
| 153 | +func (x *AbTestCfg_ARRAY) ProtoReflect() protoreflect.Message { | ||
| 154 | + mi := &file_config_proto_msgTypes[1] | ||
| 155 | + if protoimpl.UnsafeEnabled && x != nil { | ||
| 156 | + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) | ||
| 157 | + if ms.LoadMessageInfo() == nil { | ||
| 158 | + ms.StoreMessageInfo(mi) | ||
| 159 | + } | ||
| 160 | + return ms | ||
| 161 | + } | ||
| 162 | + return mi.MessageOf(x) | ||
| 163 | +} | ||
| 164 | + | ||
| 165 | +// Deprecated: Use AbTestCfg_ARRAY.ProtoReflect.Descriptor instead. | ||
| 166 | +func (*AbTestCfg_ARRAY) Descriptor() ([]byte, []int) { | ||
| 167 | + return file_config_proto_rawDescGZIP(), []int{1} | ||
| 168 | +} | ||
| 169 | + | ||
| 170 | +func (x *AbTestCfg_ARRAY) GetItems() []*AbTestCfg { | ||
| 171 | + if x != nil { | ||
| 172 | + return x.Items | ||
| 173 | + } | ||
| 174 | + return nil | ||
| 175 | +} | ||
| 176 | + | ||
| 177 | + | ||
| 178 | +var File_config_proto protoreflect.FileDescriptor | ||
| 179 | + | ||
| 180 | +var file_config_proto_rawDesc = []byte{ | ||
| 181 | +0x0a,0x0c,0x63,0x6f,0x6e,0x66,0x69,0x67,0x2e,0x70,0x72,0x6f,0x74,0x6f,0x12,0x07, | ||
| 182 | +0x63,0x6f,0x6e,0x66,0x69,0x67,0x73,0x22,0x89,0x01,0x0a,0x09,0x41,0x62,0x54,0x65, | ||
| 183 | +0x73,0x74,0x43,0x66,0x67,0x12,0x0e,0x0a,0x02,0x49,0x44,0x18,0x01,0x20,0x01,0x28, | ||
| 184 | +0x0d,0x52,0x02,0x49,0x44,0x12,0x12,0x0a,0x04,0x4e,0x61,0x6d,0x65,0x18,0x02,0x20, | ||
| 185 | +0x01,0x28,0x09,0x52,0x04,0x4e,0x61,0x6d,0x65,0x12,0x10,0x0a,0x03,0x4d,0x69,0x6e, | ||
| 186 | +0x18,0x03,0x20,0x01,0x28,0x0d,0x52,0x03,0x4d,0x69,0x6e,0x12,0x10,0x0a,0x03,0x4d, | ||
| 187 | +0x61,0x78,0x18,0x04,0x20,0x01,0x28,0x0d,0x52,0x03,0x4d,0x61,0x78,0x12,0x1c,0x0a, | ||
| 188 | +0x09,0x43,0x6f,0x6e,0x64,0x69,0x74,0x69,0x6f,0x6e,0x18,0x05,0x20,0x01,0x28,0x09, | ||
| 189 | +0x52,0x09,0x43,0x6f,0x6e,0x64,0x69,0x74,0x69,0x6f,0x6e,0x12,0x16,0x0a,0x06,0x43, | ||
| 190 | +0x6f,0x6e,0x66,0x69,0x67,0x18,0x06,0x20,0x01,0x28,0x09,0x52,0x06,0x43,0x6f,0x6e, | ||
| 191 | +0x66,0x69,0x67,0x22,0x3b,0x0a,0x0f,0x41,0x62,0x54,0x65,0x73,0x74,0x43,0x66,0x67, | ||
| 192 | +0x5f,0x41,0x52,0x52,0x41,0x59,0x12,0x28,0x0a,0x05,0x49,0x74,0x65,0x6d,0x73,0x18, | ||
| 193 | +0x01,0x20,0x03,0x28,0x0b,0x32,0x12,0x2e,0x63,0x6f,0x6e,0x66,0x69,0x67,0x73,0x2e, | ||
| 194 | +0x41,0x62,0x54,0x65,0x73,0x74,0x43,0x66,0x67,0x52,0x05,0x49,0x74,0x65,0x6d,0x73, | ||
| 195 | +0x62,0x06,0x70,0x72,0x6f,0x74,0x6f,0x33, | ||
| 196 | +} | ||
| 197 | + | ||
| 198 | +var ( | ||
| 199 | + file_config_proto_rawDescOnce sync.Once | ||
| 200 | + file_config_proto_rawDescData = file_config_proto_rawDesc | ||
| 201 | +) | ||
| 202 | + | ||
| 203 | +func file_config_proto_rawDescGZIP() []byte { | ||
| 204 | + file_config_proto_rawDescOnce.Do(func() { | ||
| 205 | + file_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_config_proto_rawDescData) | ||
| 206 | + }) | ||
| 207 | + return file_config_proto_rawDescData | ||
| 208 | +} | ||
| 209 | + | ||
| 210 | +var file_config_proto_enumTypes = make([]protoimpl.EnumInfo, 0) | ||
| 211 | +var file_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) | ||
| 212 | +var file_config_proto_goTypes = []interface{}{ | ||
| 213 | + (*AbTestCfg)(nil), // 0: configs.AbTestCfg | ||
| 214 | + (*AbTestCfg_ARRAY)(nil), // 1: configs.AbTestCfg_ARRAY | ||
| 215 | + | ||
| 216 | +} | ||
| 217 | + | ||
| 218 | +var file_config_proto_depIdxs = []int32{ | ||
| 219 | + 0, // 0: configs.AbTestCfg_ARRAY:type_name -> configs.AbTestCfg | ||
| 220 | +1, // [1:1] is the sub-list for method output_type | ||
| 221 | +1, // [1:1] is the sub-list for method input_type | ||
| 222 | +1, // [1:1] is the sub-list for extension type_name | ||
| 223 | +1, // [1:1] is the sub-list for extension extendee | ||
| 224 | +0, // [0:1] is the sub-list for field type_name | ||
| 225 | +} | ||
| 226 | + | ||
| 227 | +func file_config_proto_init() { | ||
| 228 | + if File_config_proto != nil { | ||
| 229 | + return | ||
| 230 | + } | ||
| 231 | + if !protoimpl.UnsafeEnabled { | ||
| 232 | + file_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { | ||
| 233 | + switch v := v.(*AbTestCfg); i { | ||
| 234 | + case 0: | ||
| 235 | + return &v.state | ||
| 236 | + case 1: | ||
| 237 | + return &v.sizeCache | ||
| 238 | + case 2: | ||
| 239 | + return &v.unknownFields | ||
| 240 | + default: | ||
| 241 | + return nil | ||
| 242 | + } | ||
| 243 | + } | ||
| 244 | + | ||
| 245 | + file_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { | ||
| 246 | + switch v := v.(*AbTestCfg_ARRAY); i { | ||
| 247 | + case 0: | ||
| 248 | + return &v.state | ||
| 249 | + case 1: | ||
| 250 | + return &v.sizeCache | ||
| 251 | + case 2: | ||
| 252 | + return &v.unknownFields | ||
| 253 | + default: | ||
| 254 | + return nil | ||
| 255 | + } | ||
| 256 | + } | ||
| 257 | + | ||
| 258 | + } | ||
| 259 | + type x struct{} | ||
| 260 | + out := protoimpl.TypeBuilder{ | ||
| 261 | + File: protoimpl.DescBuilder{ | ||
| 262 | + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), | ||
| 263 | + RawDescriptor: file_config_proto_rawDesc, | ||
| 264 | + NumEnums: 0, | ||
| 265 | + NumMessages: 2, | ||
| 266 | + NumExtensions: 0, | ||
| 267 | + NumServices: 0, | ||
| 268 | + }, | ||
| 269 | + GoTypes: file_config_proto_goTypes, | ||
| 270 | + DependencyIndexes: file_config_proto_depIdxs, | ||
| 271 | + EnumInfos: file_config_proto_enumTypes, | ||
| 272 | + MessageInfos: file_config_proto_msgTypes, | ||
| 273 | + }.Build() | ||
| 274 | + File_config_proto = out.File | ||
| 275 | + file_config_proto_rawDesc = nil | ||
| 276 | + file_config_proto_goTypes = nil | ||
| 277 | + file_config_proto_depIdxs = nil | ||
| 278 | +} | ||
| 279 | + | ||
| 280 | +func init() { | ||
| 281 | + file_config_proto_init() | ||
| 282 | +} | ||
| 0 | \ No newline at end of file | 283 | \ No newline at end of file |
configs/confroomrank/config.go
| @@ -1,129 +0,0 @@ | @@ -1,129 +0,0 @@ | ||
| 1 | -package confroomrank | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/configs/confbase" | ||
| 5 | - "apigame/service-common/svconst" | ||
| 6 | - "apigame/util/util-lx/lxtime" | ||
| 7 | - "apigame/util/utstring" | ||
| 8 | - "fmt" | ||
| 9 | -) | ||
| 10 | - | ||
| 11 | -// ActivityConfig 房间排行活动配置 分析后数据 | ||
| 12 | -type ActivityConfig struct { | ||
| 13 | - Raw *ActivityConfigRaw `json:"-"` | ||
| 14 | - | ||
| 15 | - Id int64 // ID | ||
| 16 | - Typ int // 排行榜类型 | ||
| 17 | - OpenLevel int // 开启等级 | ||
| 18 | - OpenScore int64 // 开启积分 | ||
| 19 | - PreviewTime int64 // 预告时间 | ||
| 20 | - StartTime int64 // 开始时间 | ||
| 21 | - EndTime int64 // 结束时间 | ||
| 22 | - ReleaseTime string // 结算发奖时间 | ||
| 23 | - | ||
| 24 | - Robot map[int]RobotConfig // 机器人配置 | ||
| 25 | - Room map[int]RoomConfig // 房间配置 | ||
| 26 | - | ||
| 27 | - GameId string // 所属游戏ID | ||
| 28 | -} | ||
| 29 | - | ||
| 30 | -func (c *ActivityConfig) GetUid() string { | ||
| 31 | - return utstring.Int64ToString(c.Id) | ||
| 32 | -} | ||
| 33 | - | ||
| 34 | -func (c *ActivityConfig) CheckCurrent() bool { | ||
| 35 | - timeNow := lxtime.NowUninx() | ||
| 36 | - return timeNow >= c.StartTime && timeNow <= c.EndTime && c.Raw.Status == 1 | ||
| 37 | -} | ||
| 38 | - | ||
| 39 | -func (c *ActivityConfig) ConfInfo(suffix string) *confbase.ConfInfo { | ||
| 40 | - tableName := svconst.MYSQL_TABLE_S_ROOMRANK_CONFIG | ||
| 41 | - cacheKey := fmt.Sprintf("%s:%s:%s", svconst.REDIS_CACHEP_REFIX, tableName, suffix) | ||
| 42 | - timeNow := lxtime.NowUninx() | ||
| 43 | - return &confbase.ConfInfo{ | ||
| 44 | - DbMysql: svconst.DbConfig, | ||
| 45 | - TableName: fmt.Sprintf("%s_%s", tableName, suffix), | ||
| 46 | - KeyName: "id", | ||
| 47 | - CurrentQuery: "typ = ? AND status = ? AND start_time <= ? AND end_time >= ?", | ||
| 48 | - CurrentArgs: []any{c.Typ, 1, timeNow, timeNow}, | ||
| 49 | - CacheKey: fmt.Sprintf("%s:%d", cacheKey, c.Id), | ||
| 50 | - CacheCurrent: fmt.Sprintf("%s:%d:current", cacheKey, c.Typ), | ||
| 51 | - CacheTime: 300, | ||
| 52 | - } | ||
| 53 | -} | ||
| 54 | - | ||
| 55 | -// ActivityConfigRaw 房间排行活动配置 原始数据 | ||
| 56 | -type ActivityConfigRaw struct { | ||
| 57 | - Id int64 `gorm:"column:id;primaryKey"` // ID | ||
| 58 | - Serial int64 // 轮次ID | ||
| 59 | - Typ int // 排行榜类型 | ||
| 60 | - OpenLevel int // 开启等级 | ||
| 61 | - OpenScore int64 // 开启积分 | ||
| 62 | - PreviewTime int64 // 预告时间 | ||
| 63 | - StartTime int64 // 开始时间 | ||
| 64 | - EndTime int64 // 结束时间 | ||
| 65 | - ReleaseTime string // 结算发奖时间 | ||
| 66 | - | ||
| 67 | - BootConfig string // 机器人配置 | ||
| 68 | - RoomConfig string // 房间配置 | ||
| 69 | - | ||
| 70 | - Ver string // 版本号 | ||
| 71 | - Status int // 状态 0=关闭 1=开启 | ||
| 72 | - UpdateTime int64 // 修改时间戳 | ||
| 73 | -} | ||
| 74 | - | ||
| 75 | -// GenerateConfigClient 生成给客户端的配置 | ||
| 76 | -func (c *ActivityConfigRaw) GenerateConfigClient() *ActivityConfigClient { | ||
| 77 | - configClient := &ActivityConfigClient{ | ||
| 78 | - Id: c.Id, | ||
| 79 | - Typ: c.Typ, | ||
| 80 | - Serial: c.Serial, | ||
| 81 | - OpenLevel: c.OpenLevel, | ||
| 82 | - OpenScore: c.OpenScore, | ||
| 83 | - PreviewTime: c.PreviewTime, | ||
| 84 | - StartTime: c.StartTime, | ||
| 85 | - EndTime: c.EndTime, | ||
| 86 | - ReleaseTime: c.ReleaseTime, | ||
| 87 | - Ver: c.Ver, | ||
| 88 | - Status: c.Status, | ||
| 89 | - } | ||
| 90 | - return configClient | ||
| 91 | -} | ||
| 92 | - | ||
| 93 | -// ActivityConfigClient 房间排行活动配置 给客户端数据 | ||
| 94 | -type ActivityConfigClient struct { | ||
| 95 | - Id int64 `form:"id" json:"id"` // ID | ||
| 96 | - Typ int `form:"typ" json:"typ"` // 排行榜类型 | ||
| 97 | - Serial int64 `form:"serial" json:"serial"` // 轮次ID | ||
| 98 | - OpenLevel int `form:"open_level" json:"open_level"` // 开启等级 | ||
| 99 | - OpenScore int64 `form:"open_score" json:"open_score"` // 开启积分 | ||
| 100 | - PreviewTime int64 `form:"preview_time" json:"preview_time"` // 预告时间 | ||
| 101 | - StartTime int64 `form:"start_time" json:"start_time"` // 开始时间 | ||
| 102 | - EndTime int64 `form:"end_time" json:"end_time"` // 结束时间 | ||
| 103 | - ReleaseTime string `form:"release_time" json:"release_time"` // 结算发奖时间 | ||
| 104 | - Ver string `form:"ver" json:"ver"` // 版本号 | ||
| 105 | - Status int `form:"status" json:"status"` // 状态 0=关闭 1=开启 | ||
| 106 | -} | ||
| 107 | - | ||
| 108 | -// RobotConfig 机器人配置 | ||
| 109 | -type RobotConfig struct { | ||
| 110 | - Id int `json:"id"` // id | ||
| 111 | - MinScore int `json:"min_score"` // 最低分数 | ||
| 112 | - TotalScore int `json:"total_score"` // 总分数 | ||
| 113 | - Range int `json:"range"` // 总分浮动范围(%) | ||
| 114 | -} | ||
| 115 | - | ||
| 116 | -// RoomConfig 房间配置 | ||
| 117 | -type RoomConfig struct { | ||
| 118 | - Id int `json:"id"` // id | ||
| 119 | - Levels []int `json:"level_range"` // 等级范围 | ||
| 120 | - UserClass int `json:"rating"` // 评级 | ||
| 121 | - UserScore []int `json:"score_range"` // 分数范围 | ||
| 122 | - TotalPlayer int `json:"room_user_number"` // 房间总人数 | ||
| 123 | - PlayerTypeCount [][]int `json:"user_type_number"` // 玩家类型数量 | ||
| 124 | - AutoRobot []int `json:"auto_room"` // 自动填充机器人 | ||
| 125 | - InitRobot [][]int `json:"disposition_robots"` // 配置机器人 | ||
| 126 | - Awards map[string]string `json:"rewards"` // 奖励 | ||
| 127 | - SettleScores []int `json:"score_adjest"` // 结算分数调整 | ||
| 128 | - SettleUserType []int `json:"user_type"` // 结算用户类型 | ||
| 129 | -} |
configs/confroomrank/decode.go
| @@ -1,50 +0,0 @@ | @@ -1,50 +0,0 @@ | ||
| 1 | -package confroomrank | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/util/util-lx/lxalilog" | ||
| 5 | - "encoding/json" | ||
| 6 | -) | ||
| 7 | - | ||
| 8 | -// Decode 解析配置原始数据 | ||
| 9 | -func (c *ActivityConfig) Decode(gameId string, rawData any) { | ||
| 10 | - raw := rawData.(*ActivityConfigRaw) | ||
| 11 | - c.GameId = gameId | ||
| 12 | - c.Raw = raw | ||
| 13 | - | ||
| 14 | - c.Id = raw.Id | ||
| 15 | - c.Typ = raw.Typ | ||
| 16 | - c.OpenLevel = raw.OpenLevel | ||
| 17 | - c.OpenScore = raw.OpenScore | ||
| 18 | - c.PreviewTime = raw.PreviewTime | ||
| 19 | - c.StartTime = raw.StartTime | ||
| 20 | - c.EndTime = raw.EndTime | ||
| 21 | - c.ReleaseTime = raw.ReleaseTime | ||
| 22 | - | ||
| 23 | - c.Robot = make(map[int]RobotConfig) | ||
| 24 | - c.Room = make(map[int]RoomConfig) | ||
| 25 | - | ||
| 26 | - // 解析 机器人 | ||
| 27 | - { | ||
| 28 | - configs := make([]RobotConfig, 0) | ||
| 29 | - err := json.Unmarshal([]byte(raw.BootConfig), &configs) | ||
| 30 | - if err != nil { | ||
| 31 | - lxalilog.Errors(err, raw.BootConfig, gameId, raw.Id) | ||
| 32 | - return | ||
| 33 | - } | ||
| 34 | - for _, i2 := range configs { | ||
| 35 | - c.Robot[i2.Id] = i2 | ||
| 36 | - } | ||
| 37 | - } | ||
| 38 | - // 解析 房间 | ||
| 39 | - { | ||
| 40 | - configs := make([]RoomConfig, 0) | ||
| 41 | - err := json.Unmarshal([]byte(raw.RoomConfig), &configs) | ||
| 42 | - if err != nil { | ||
| 43 | - lxalilog.Errors(err, raw.RoomConfig, gameId, raw.Id) | ||
| 44 | - return | ||
| 45 | - } | ||
| 46 | - for _, i2 := range configs { | ||
| 47 | - c.Room[i2.Id] = i2 | ||
| 48 | - } | ||
| 49 | - } | ||
| 50 | -} |
configs/confroomrank/get.go
| @@ -1,44 +0,0 @@ | @@ -1,44 +0,0 @@ | ||
| 1 | -package confroomrank | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/configs/confbase" | ||
| 5 | - "apigame/util/util-lx/lxalilog" | ||
| 6 | - "apigame/util/util-lx/lxtime" | ||
| 7 | -) | ||
| 8 | - | ||
| 9 | -// GetCurrent 获取 当前配置 | ||
| 10 | -func GetCurrent(gameId string, topType int) (conf *ActivityConfig, has bool) { | ||
| 11 | - conf = new(ActivityConfig) | ||
| 12 | - conf.Typ = topType | ||
| 13 | - has = confbase.GetCurrent[*ActivityConfig, ActivityConfigRaw](gameId, conf) | ||
| 14 | - if !has { | ||
| 15 | - conf = new(ActivityConfig) | ||
| 16 | - conf.Typ = topType | ||
| 17 | - has = confbase.FindCurrent[*ActivityConfig, ActivityConfigRaw](gameId, conf) | ||
| 18 | - } | ||
| 19 | - return | ||
| 20 | -} | ||
| 21 | - | ||
| 22 | -// GetConfig 获取 配置根据Id | ||
| 23 | -func GetConfig(gameId string, confId int64) (conf *ActivityConfig, has bool) { | ||
| 24 | - conf = new(ActivityConfig) | ||
| 25 | - has = confbase.GetConfig[*ActivityConfig, ActivityConfigRaw](gameId, confId, conf) | ||
| 26 | - | ||
| 27 | - return | ||
| 28 | -} | ||
| 29 | - | ||
| 30 | -// GetCurrentConfigs 获取当前配置列表 | ||
| 31 | -func GetCurrentConfigs(gameId string) []*ActivityConfigRaw { | ||
| 32 | - obj := new(ActivityConfig) | ||
| 33 | - info := obj.ConfInfo(gameId) | ||
| 34 | - db := info.DbMysql | ||
| 35 | - timeNow := lxtime.NowUninx() | ||
| 36 | - objs := make([]*ActivityConfigRaw, 0) | ||
| 37 | - result := db.Table(info.TableName).Where( | ||
| 38 | - "status = ? AND start_time <= ? AND end_time >= ?", | ||
| 39 | - 1, timeNow, timeNow).Find(&objs) | ||
| 40 | - if result.Error != nil { | ||
| 41 | - lxalilog.Errors(result.Error, "confroomrank.GetCurrentConfigs error", gameId) | ||
| 42 | - } | ||
| 43 | - return objs | ||
| 44 | -} |
| @@ -0,0 +1,42 @@ | @@ -0,0 +1,42 @@ | ||
| 1 | +package configs | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "reflect" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +func Init() bool { | ||
| 9 | + fmt.Println("configs Init") | ||
| 10 | + Initial("./conf/bytes", "ID") | ||
| 11 | + | ||
| 12 | + //InitExt() | ||
| 13 | + return true | ||
| 14 | +} | ||
| 15 | + | ||
| 16 | +func GetConfig[T any](id string, t T) (obj *T) { | ||
| 17 | + var table = GetTable(t) | ||
| 18 | + dt := table.GetItem(id) | ||
| 19 | + if dt == nil { | ||
| 20 | + return nil | ||
| 21 | + } | ||
| 22 | + obj = dt.(*T) | ||
| 23 | + return | ||
| 24 | +} | ||
| 25 | + | ||
| 26 | +func HasConfig[T any](id string, t T) (has bool) { | ||
| 27 | + var table = GetTable(t) | ||
| 28 | + return table.GetItem(id) != nil | ||
| 29 | +} | ||
| 30 | + | ||
| 31 | +func GetOne[T any](t T) (obj *T) { | ||
| 32 | + var table = GetTable(t) | ||
| 33 | + if len(table.Items()) > 0 { | ||
| 34 | + return table.Items()[0].(*T) | ||
| 35 | + } | ||
| 36 | + return nil | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +func GetTable[T any](t T) (table *DataTable) { | ||
| 40 | + table = GetDataTable(reflect.TypeOf(t)) | ||
| 41 | + return | ||
| 42 | +} |
configs/init.go
| @@ -1,29 +0,0 @@ | @@ -1,29 +0,0 @@ | ||
| 1 | -package configs | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/configs/confapi" | ||
| 5 | - "apigame/configs/confcardholder" | ||
| 6 | - "apigame/configs/confglobal" | ||
| 7 | - "apigame/service-common/svconst" | ||
| 8 | -) | ||
| 9 | - | ||
| 10 | -func Init() bool { | ||
| 11 | - | ||
| 12 | - for _, gameId := range svconst.GameList { | ||
| 13 | - _, _ = confapi.GetConfig(gameId) | ||
| 14 | - } | ||
| 15 | - | ||
| 16 | - for _, gameId := range svconst.GameList { | ||
| 17 | - _, _ = confglobal.GetConfig(gameId) | ||
| 18 | - } | ||
| 19 | - | ||
| 20 | - for _, gameId := range svconst.GameListCardHolder { | ||
| 21 | - _, _ = confcardholder.GetCurrent(gameId) | ||
| 22 | - } | ||
| 23 | - | ||
| 24 | - //for _, gameId := range svconst.GameListRoomRank { | ||
| 25 | - // _, _ = confroomrank.GetCurrent(gameId) | ||
| 26 | - //} | ||
| 27 | - | ||
| 28 | - return true | ||
| 29 | -} |
| @@ -0,0 +1,280 @@ | @@ -0,0 +1,280 @@ | ||
| 1 | +package configs | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "os" | ||
| 6 | + "reflect" | ||
| 7 | + "strings" | ||
| 8 | + | ||
| 9 | + "google.golang.org/protobuf/proto" | ||
| 10 | + "google.golang.org/protobuf/reflect/protoreflect" | ||
| 11 | + "google.golang.org/protobuf/reflect/protoregistry" | ||
| 12 | +) | ||
| 13 | + | ||
| 14 | +type DataTableMap map[string]IData | ||
| 15 | +type DataItemMap map[string]IData | ||
| 16 | + | ||
| 17 | +type DataArray []interface{} | ||
| 18 | +type DataMap map[string]interface{} | ||
| 19 | + | ||
| 20 | +var ( | ||
| 21 | + DefaultIndexKey = "ID" | ||
| 22 | + BytesFileExt = ".bytes" | ||
| 23 | + | ||
| 24 | + dataDir = "" | ||
| 25 | + dataItemMap = make(DataItemMap, 0) | ||
| 26 | + dataTableMap = make(DataTableMap, 0) | ||
| 27 | +) | ||
| 28 | + | ||
| 29 | +type IFilenameGenerator interface { | ||
| 30 | + GetFilename(typeName string) string | ||
| 31 | +} | ||
| 32 | + | ||
| 33 | +type IData interface { | ||
| 34 | + DataType() reflect.Type | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +func DataDir() string { | ||
| 38 | + return dataDir | ||
| 39 | +} | ||
| 40 | + | ||
| 41 | +func Initial(dir, defaultKeyName string) { | ||
| 42 | + dataDir = strings.ReplaceAll(dir, "\\", "/") | ||
| 43 | + if strings.LastIndex(dataDir, "/") != len(dataDir)-1 { | ||
| 44 | + dataDir = dataDir + "/" | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + if defaultKeyName != "" { | ||
| 48 | + DefaultIndexKey = defaultKeyName | ||
| 49 | + } | ||
| 50 | +} | ||
| 51 | + | ||
| 52 | +func RegistDataTable(indexKey string, dataType reflect.Type) { | ||
| 53 | + if _, ok := dataTableMap[dataType.Name()]; !ok { | ||
| 54 | + var t = NewDataTable(indexKey, dataType) | ||
| 55 | + dataTableMap[dataType.Name()] = t | ||
| 56 | + } | ||
| 57 | +} | ||
| 58 | + | ||
| 59 | +func RegistDataTableExt(table IData) { | ||
| 60 | + var dataType = table.DataType() | ||
| 61 | + if _, ok := dataTableMap[dataType.Name()]; !ok { | ||
| 62 | + dataTableMap[dataType.Name()] = table | ||
| 63 | + } | ||
| 64 | +} | ||
| 65 | + | ||
| 66 | +func GetDataItem(dataType reflect.Type) *DataItem { | ||
| 67 | + var dt *DataItem | ||
| 68 | + if item, ok := dataItemMap[dataType.Name()]; !ok { | ||
| 69 | + var t = NewDataItem(dataType) | ||
| 70 | + dataItemMap[dataType.Name()] = t | ||
| 71 | + dt = t | ||
| 72 | + } else { | ||
| 73 | + dt = item.(*DataItem) | ||
| 74 | + } | ||
| 75 | + return dt | ||
| 76 | +} | ||
| 77 | + | ||
| 78 | +func GetDataTable(dataType reflect.Type) *DataTable { | ||
| 79 | + var dt *DataTable | ||
| 80 | + if item, ok := dataTableMap[dataType.Name()]; !ok { | ||
| 81 | + var t = NewDataTable("", dataType) | ||
| 82 | + dataTableMap[dataType.Name()] = t | ||
| 83 | + dt = t | ||
| 84 | + } else { | ||
| 85 | + dt = item.(*DataTable) | ||
| 86 | + } | ||
| 87 | + return dt | ||
| 88 | +} | ||
| 89 | + | ||
| 90 | +func getFullname(dataType reflect.Type) string { | ||
| 91 | + var pkgs = strings.Split(dataType.PkgPath(), "/") | ||
| 92 | + var pkg = pkgs[len(pkgs)-1] | ||
| 93 | + var name = dataType.Name() | ||
| 94 | + return fmt.Sprintf("%s.%s", pkg, name) | ||
| 95 | +} | ||
| 96 | + | ||
| 97 | +type DataItem struct { | ||
| 98 | + dataType reflect.Type | ||
| 99 | + data interface{} | ||
| 100 | + fileGen IFilenameGenerator | ||
| 101 | +} | ||
| 102 | + | ||
| 103 | +func NewDataItem(dataType reflect.Type) *DataItem { | ||
| 104 | + t := new(DataItem) | ||
| 105 | + t.dataType = dataType | ||
| 106 | + t.fileGen = t | ||
| 107 | + return t | ||
| 108 | +} | ||
| 109 | + | ||
| 110 | +func (t *DataItem) DataType() reflect.Type { | ||
| 111 | + return t.dataType | ||
| 112 | +} | ||
| 113 | + | ||
| 114 | +func (t *DataItem) Item() interface{} { | ||
| 115 | + t.load() | ||
| 116 | + return t.data | ||
| 117 | +} | ||
| 118 | + | ||
| 119 | +func (t *DataItem) Clear() { | ||
| 120 | + t.data = nil | ||
| 121 | +} | ||
| 122 | + | ||
| 123 | +func (t *DataItem) GetFilename(typeName string) string { | ||
| 124 | + return fmt.Sprintf("%s%s%s", dataDir, strings.ToLower(typeName), BytesFileExt) | ||
| 125 | +} | ||
| 126 | + | ||
| 127 | +func (t *DataItem) load() { | ||
| 128 | + if t.data != nil { | ||
| 129 | + return | ||
| 130 | + } | ||
| 131 | + | ||
| 132 | + var filename = t.fileGen.GetFilename(t.dataType.Name()) | ||
| 133 | + if ok, _ := PathExists(filename); !ok { | ||
| 134 | + fmt.Printf("can not find data file %s", filename) | ||
| 135 | + return | ||
| 136 | + } | ||
| 137 | + | ||
| 138 | + fullName := getFullname(t.dataType) | ||
| 139 | + msgName := protoreflect.FullName(fullName) | ||
| 140 | + msgType, err := protoregistry.GlobalTypes.FindMessageByName(msgName) | ||
| 141 | + if err != nil { | ||
| 142 | + fmt.Printf("can not find proto message named %v, %v", fullName, err) | ||
| 143 | + return | ||
| 144 | + } | ||
| 145 | + message := msgType.New().Interface() | ||
| 146 | + | ||
| 147 | + bytes, err := os.ReadFile(filename) | ||
| 148 | + if err != nil { | ||
| 149 | + fmt.Printf("read bytes file failed, %v", err) | ||
| 150 | + return | ||
| 151 | + } | ||
| 152 | + | ||
| 153 | + err = proto.Unmarshal(bytes, message) | ||
| 154 | + if err != nil { | ||
| 155 | + fmt.Printf("proto unmarshal failed, %v", err) | ||
| 156 | + return | ||
| 157 | + } | ||
| 158 | + | ||
| 159 | + t.data = message | ||
| 160 | +} | ||
| 161 | + | ||
| 162 | +type DataTable struct { | ||
| 163 | + indexKey string | ||
| 164 | + dataType reflect.Type | ||
| 165 | + data DataArray | ||
| 166 | + dataMap DataMap | ||
| 167 | + fileGen IFilenameGenerator | ||
| 168 | +} | ||
| 169 | + | ||
| 170 | +func NewDataTable(indexKey string, dataType reflect.Type) *DataTable { | ||
| 171 | + if indexKey == "" { | ||
| 172 | + indexKey = DefaultIndexKey | ||
| 173 | + } | ||
| 174 | + | ||
| 175 | + t := new(DataTable) | ||
| 176 | + t.indexKey = indexKey | ||
| 177 | + t.dataType = dataType | ||
| 178 | + t.fileGen = t | ||
| 179 | + return t | ||
| 180 | +} | ||
| 181 | + | ||
| 182 | +func (t *DataTable) DataType() reflect.Type { | ||
| 183 | + return t.dataType | ||
| 184 | +} | ||
| 185 | + | ||
| 186 | +func (t *DataTable) Items() DataArray { | ||
| 187 | + if t.data == nil { | ||
| 188 | + t.load() | ||
| 189 | + } | ||
| 190 | + return t.data | ||
| 191 | +} | ||
| 192 | + | ||
| 193 | +func (t *DataTable) ItemsMap() DataMap { | ||
| 194 | + if t.data == nil { | ||
| 195 | + t.load() | ||
| 196 | + } | ||
| 197 | + t.itemsAsMap() | ||
| 198 | + return t.dataMap | ||
| 199 | +} | ||
| 200 | + | ||
| 201 | +func (t *DataTable) GetItem(id string) interface{} { | ||
| 202 | + var dataMap = t.ItemsMap() | ||
| 203 | + if dt, ok := dataMap[id]; ok { | ||
| 204 | + return dt | ||
| 205 | + } | ||
| 206 | + return nil | ||
| 207 | +} | ||
| 208 | + | ||
| 209 | +func (t *DataTable) Clear() { | ||
| 210 | + t.data = nil | ||
| 211 | + t.dataMap = nil | ||
| 212 | +} | ||
| 213 | + | ||
| 214 | +func (t *DataTable) GetFilename(typeName string) string { | ||
| 215 | + return fmt.Sprintf("%s%s%s", dataDir, strings.ToLower(typeName), BytesFileExt) | ||
| 216 | +} | ||
| 217 | + | ||
| 218 | +func (t *DataTable) load() { | ||
| 219 | + if t.data != nil { | ||
| 220 | + return | ||
| 221 | + } | ||
| 222 | + | ||
| 223 | + var filename = t.fileGen.GetFilename(t.dataType.Name()) | ||
| 224 | + if ok, _ := PathExists(filename); !ok { | ||
| 225 | + fmt.Printf("can not find data file %s", filename) | ||
| 226 | + return | ||
| 227 | + } | ||
| 228 | + | ||
| 229 | + fullName := getFullname(t.dataType) + "_ARRAY" | ||
| 230 | + msgName := protoreflect.FullName(fullName) | ||
| 231 | + msgType, err := protoregistry.GlobalTypes.FindMessageByName(msgName) | ||
| 232 | + if err != nil { | ||
| 233 | + fmt.Printf("can not find proto message named %v, %v", fullName, err) | ||
| 234 | + return | ||
| 235 | + } | ||
| 236 | + message := msgType.New().Interface() | ||
| 237 | + | ||
| 238 | + bytes, err := os.ReadFile(filename) | ||
| 239 | + if err != nil { | ||
| 240 | + fmt.Printf("read bytes file failed, %v", err) | ||
| 241 | + return | ||
| 242 | + } | ||
| 243 | + | ||
| 244 | + err = proto.Unmarshal(bytes, message) | ||
| 245 | + if err != nil { | ||
| 246 | + fmt.Printf("proto unmarshal failed, %v", err) | ||
| 247 | + return | ||
| 248 | + } | ||
| 249 | + | ||
| 250 | + var value = reflect.ValueOf(message) | ||
| 251 | + var elm = value.Elem() | ||
| 252 | + if elm.Kind() != reflect.Struct { | ||
| 253 | + fmt.Printf("type %s kind error", fullName) | ||
| 254 | + return | ||
| 255 | + } | ||
| 256 | + | ||
| 257 | + t.data = make(DataArray, 0) | ||
| 258 | + var items = elm.FieldByName("Items").Interface() | ||
| 259 | + if reflect.TypeOf(items).Kind() == reflect.Slice { | ||
| 260 | + s := reflect.ValueOf(items) | ||
| 261 | + for i := 0; i < s.Len(); i++ { | ||
| 262 | + ele := s.Index(i) | ||
| 263 | + t.data = append(t.data, ele.Interface()) | ||
| 264 | + } | ||
| 265 | + } | ||
| 266 | +} | ||
| 267 | + | ||
| 268 | +func (t *DataTable) itemsAsMap() { | ||
| 269 | + if t.dataMap != nil { | ||
| 270 | + return | ||
| 271 | + } | ||
| 272 | + t.dataMap = make(DataMap) | ||
| 273 | + | ||
| 274 | + for _, item := range t.data { | ||
| 275 | + var value = reflect.ValueOf(item) | ||
| 276 | + var elm = value.Elem() | ||
| 277 | + var idx = elm.FieldByName(t.indexKey).Interface() | ||
| 278 | + t.dataMap[fmt.Sprintf("%v", idx)] = item | ||
| 279 | + } | ||
| 280 | +} |
controllers/admin.go
controllers/demo.go
| 1 | package controllers | 1 | package controllers |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | + "apigame/configs" | ||
| 4 | "apigame/models" | 5 | "apigame/models" |
| 5 | "apigame/service/code-msg" | 6 | "apigame/service/code-msg" |
| 6 | - "apigame/util/util-lx/lxalilog" | 7 | + "apigame/util/zjson" |
| 7 | "encoding/json" | 8 | "encoding/json" |
| 8 | "fmt" | 9 | "fmt" |
| 9 | ) | 10 | ) |
| @@ -23,7 +24,7 @@ func (c *DemoController) Demo() { | @@ -23,7 +24,7 @@ func (c *DemoController) Demo() { | ||
| 23 | 24 | ||
| 24 | fmt.Println("DemoController.demo") | 25 | fmt.Println("DemoController.demo") |
| 25 | 26 | ||
| 26 | - lxalilog.Errors("DemoController.demo") | 27 | + //lxalilog.Errors("DemoController.demo") |
| 27 | 28 | ||
| 28 | //{ | 29 | //{ |
| 29 | // gameId := "10149" | 30 | // gameId := "10149" |
| @@ -42,6 +43,14 @@ func (c *DemoController) Demo() { | @@ -42,6 +43,14 @@ func (c *DemoController) Demo() { | ||
| 42 | // fmt.Println(conf) | 43 | // fmt.Println(conf) |
| 43 | // } | 44 | // } |
| 44 | //} | 45 | //} |
| 46 | + { | ||
| 47 | + cs := configs.GetTable(configs.AbTestCfg{}).Items() | ||
| 48 | + //for _, dt := range cs { | ||
| 49 | + // conf := dt.(*configs.AbTestCfg) | ||
| 50 | + // fmt.Println(conf) | ||
| 51 | + //} | ||
| 52 | + fmt.Println("cs", zjson.Str(cs)) | ||
| 53 | + } | ||
| 45 | 54 | ||
| 46 | c.RetRspCodeData(code_msg.RECODE_OK, rsp) | 55 | c.RetRspCodeData(code_msg.RECODE_OK, rsp) |
| 47 | } | 56 | } |
go.mod
| @@ -10,9 +10,12 @@ require ( | @@ -10,9 +10,12 @@ require ( | ||
| 10 | github.com/garyburd/redigo v1.6.4 | 10 | github.com/garyburd/redigo v1.6.4 |
| 11 | github.com/go-sql-driver/mysql v1.7.0 | 11 | github.com/go-sql-driver/mysql v1.7.0 |
| 12 | github.com/gomodule/redigo v2.0.0+incompatible | 12 | github.com/gomodule/redigo v2.0.0+incompatible |
| 13 | + github.com/google/uuid v1.6.0 | ||
| 13 | github.com/lixu-any/go-tools v0.0.0-20221128094643-07d54c69e9bf | 14 | github.com/lixu-any/go-tools v0.0.0-20221128094643-07d54c69e9bf |
| 14 | github.com/mitchellh/mapstructure v1.1.2 | 15 | github.com/mitchellh/mapstructure v1.1.2 |
| 16 | + github.com/redis/go-redis/v9 v9.0.3 | ||
| 15 | github.com/samber/lo v1.39.0 | 17 | github.com/samber/lo v1.39.0 |
| 18 | + google.golang.org/protobuf v1.25.0 | ||
| 16 | gorm.io/driver/mysql v1.5.6 | 19 | gorm.io/driver/mysql v1.5.6 |
| 17 | gorm.io/gorm v1.25.9 | 20 | gorm.io/gorm v1.25.9 |
| 18 | ) | 21 | ) |
| @@ -26,7 +29,6 @@ require ( | @@ -26,7 +29,6 @@ require ( | ||
| 26 | github.com/go-logfmt/logfmt v0.5.0 // indirect | 29 | github.com/go-logfmt/logfmt v0.5.0 // indirect |
| 27 | github.com/gogo/protobuf v1.3.2 // indirect | 30 | github.com/gogo/protobuf v1.3.2 // indirect |
| 28 | github.com/golang/protobuf v1.4.2 // indirect | 31 | github.com/golang/protobuf v1.4.2 // indirect |
| 29 | - github.com/google/uuid v1.6.0 // indirect | ||
| 30 | github.com/hashicorp/golang-lru v0.5.4 // indirect | 32 | github.com/hashicorp/golang-lru v0.5.4 // indirect |
| 31 | github.com/jinzhu/inflection v1.0.0 // indirect | 33 | github.com/jinzhu/inflection v1.0.0 // indirect |
| 32 | github.com/jinzhu/now v1.1.5 // indirect | 34 | github.com/jinzhu/now v1.1.5 // indirect |
| @@ -37,7 +39,6 @@ require ( | @@ -37,7 +39,6 @@ require ( | ||
| 37 | github.com/prometheus/client_model v0.2.0 // indirect | 39 | github.com/prometheus/client_model v0.2.0 // indirect |
| 38 | github.com/prometheus/common v0.10.0 // indirect | 40 | github.com/prometheus/common v0.10.0 // indirect |
| 39 | github.com/prometheus/procfs v0.1.3 // indirect | 41 | github.com/prometheus/procfs v0.1.3 // indirect |
| 40 | - github.com/redis/go-redis/v9 v9.0.3 // indirect | ||
| 41 | github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect | 42 | github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect |
| 42 | go.uber.org/atomic v1.5.0 // indirect | 43 | go.uber.org/atomic v1.5.0 // indirect |
| 43 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect | 44 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect |
| @@ -47,7 +48,6 @@ require ( | @@ -47,7 +48,6 @@ require ( | ||
| 47 | golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 // indirect | 48 | golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 // indirect |
| 48 | golang.org/x/text v0.3.7 // indirect | 49 | golang.org/x/text v0.3.7 // indirect |
| 49 | golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023 // indirect | 50 | golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023 // indirect |
| 50 | - google.golang.org/protobuf v1.25.0 // indirect | ||
| 51 | gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect | 51 | gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect |
| 52 | gopkg.in/yaml.v2 v2.2.8 // indirect | 52 | gopkg.in/yaml.v2 v2.2.8 // indirect |
| 53 | ) | 53 | ) |
main.go
| @@ -2,6 +2,7 @@ package main | @@ -2,6 +2,7 @@ package main | ||
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "apigame/configs" | 4 | "apigame/configs" |
| 5 | + "apigame/configs-db" | ||
| 5 | _ "apigame/routers" | 6 | _ "apigame/routers" |
| 6 | "apigame/service" | 7 | "apigame/service" |
| 7 | "apigame/service-common/svconst" | 8 | "apigame/service-common/svconst" |
| @@ -65,6 +66,10 @@ func Init() bool { | @@ -65,6 +66,10 @@ func Init() bool { | ||
| 65 | // | 66 | // |
| 66 | //_ = config.InitLxLimit() | 67 | //_ = config.InitLxLimit() |
| 67 | 68 | ||
| 69 | + if !configs_db.Init() { | ||
| 70 | + return false | ||
| 71 | + } | ||
| 72 | + | ||
| 68 | if !configs.Init() { | 73 | if !configs.Init() { |
| 69 | return false | 74 | return false |
| 70 | } | 75 | } |
middleware/sign/index.go
service-common/svcommon/simulate.go
| 1 | package svcommon | 1 | package svcommon |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | - "apigame/configs/confglobal" | ||
| 5 | - "apigame/util/utmisc" | 4 | + "apigame/configs-db/confglobal" |
| 5 | + "apigame/util/zmisc" | ||
| 6 | "math/rand" | 6 | "math/rand" |
| 7 | ) | 7 | ) |
| 8 | 8 | ||
| @@ -24,7 +24,7 @@ func GetIndexNames(gameId string, amount int) []int { | @@ -24,7 +24,7 @@ func GetIndexNames(gameId string, amount int) []int { | ||
| 24 | if err == nil { | 24 | if err == nil { |
| 25 | count := len(config.Names) | 25 | count := len(config.Names) |
| 26 | if count > 0 { | 26 | if count > 0 { |
| 27 | - return utmisc.RandomMultiple(amount, 0, count) | 27 | + return zmisc.RandomMultiple(amount, 0, count) |
| 28 | } | 28 | } |
| 29 | } | 29 | } |
| 30 | return list | 30 | return list |
service-common/svredis/index.go
| @@ -3,7 +3,7 @@ package svredis | @@ -3,7 +3,7 @@ package svredis | ||
| 3 | import ( | 3 | import ( |
| 4 | "apigame/service-common/svconst" | 4 | "apigame/service-common/svconst" |
| 5 | "apigame/util/util-lx/lxredis" | 5 | "apigame/util/util-lx/lxredis" |
| 6 | - "apigame/util/utstring" | 6 | + "apigame/util/zconvert" |
| 7 | "apigame/util/zjson" | 7 | "apigame/util/zjson" |
| 8 | "apigame/util/zredis" | 8 | "apigame/util/zredis" |
| 9 | "apigame/util/zredislock" | 9 | "apigame/util/zredislock" |
| @@ -33,7 +33,7 @@ func Init() bool { | @@ -33,7 +33,7 @@ func Init() bool { | ||
| 33 | 33 | ||
| 34 | // 初始化Redis | 34 | // 初始化Redis |
| 35 | { | 35 | { |
| 36 | - zredis.Init(confRedis.Host+":"+confRedis.Port, confRedis.Pwd, utstring.StringToInt(confRedis.Db)) | 36 | + zredis.Init(confRedis.Host+":"+confRedis.Port, confRedis.Pwd, zconvert.ToInt(confRedis.Db)) |
| 37 | if !zredis.Check() { | 37 | if !zredis.Check() { |
| 38 | return false | 38 | return false |
| 39 | } | 39 | } |
| @@ -43,7 +43,7 @@ func Init() bool { | @@ -43,7 +43,7 @@ func Init() bool { | ||
| 43 | 43 | ||
| 44 | // 初始化redis锁 | 44 | // 初始化redis锁 |
| 45 | { | 45 | { |
| 46 | - zredislock.Init(confRedis.Host+":"+confRedis.Port, confRedis.Pwd, utstring.StringToInt(confRedis.Db)) | 46 | + zredislock.Init(confRedis.Host+":"+confRedis.Port, confRedis.Pwd, zconvert.ToInt(confRedis.Db)) |
| 47 | fmt.Println(svconst.AppName + " zredislock init success") | 47 | fmt.Println(svconst.AppName + " zredislock init success") |
| 48 | } | 48 | } |
| 49 | 49 |
service/cardholder/handle.go
| 1 | package cardholder | 1 | package cardholder |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | - "apigame/configs/confcardholder" | 4 | + "apigame/configs-db/confcardholder" |
| 5 | "apigame/models" | 5 | "apigame/models" |
| 6 | "apigame/service-common/svmysql" | 6 | "apigame/service-common/svmysql" |
| 7 | "apigame/service/code-msg" | 7 | "apigame/service/code-msg" |
| 8 | "apigame/util/util-lx/lxalilog" | 8 | "apigame/util/util-lx/lxalilog" |
| 9 | "apigame/util/util-lx/lxtime" | 9 | "apigame/util/util-lx/lxtime" |
| 10 | - "apigame/util/utslice" | ||
| 11 | - "apigame/util/utstring" | 10 | + "apigame/util/zconvert" |
| 11 | + "apigame/util/zslice" | ||
| 12 | ) | 12 | ) |
| 13 | 13 | ||
| 14 | // HandleGetConfig 活动配置 | 14 | // HandleGetConfig 活动配置 |
| @@ -112,7 +112,7 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH | @@ -112,7 +112,7 @@ func HandleOpen(req *models.ReqCardHolderOpen) (code string, rsp models.RspCardH | ||
| 112 | sequenceId, cohort, | 112 | sequenceId, cohort, |
| 113 | openMode) | 113 | openMode) |
| 114 | // 打乱顺序 | 114 | // 打乱顺序 |
| 115 | - utslice.Shuffle(newCards) | 115 | + zslice.Shuffle(newCards) |
| 116 | for _, i3 := range newCards { | 116 | for _, i3 := range newCards { |
| 117 | allNewCards = append(allNewCards, i3) | 117 | allNewCards = append(allNewCards, i3) |
| 118 | } | 118 | } |
| @@ -268,7 +268,7 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model | @@ -268,7 +268,7 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model | ||
| 268 | 268 | ||
| 269 | // 从配置里拿到卡包ID和数量列表 | 269 | // 从配置里拿到卡包ID和数量列表 |
| 270 | cardholderIdCount := make(map[int]int) | 270 | cardholderIdCount := make(map[int]int) |
| 271 | - cardholderIdCountList := utstring.StringToListListInt(confStarShop.CardBagIds, "|", ",") | 271 | + cardholderIdCountList := zconvert.ToListListInt(confStarShop.CardBagIds, "|", ",") |
| 272 | for _, i2 := range cardholderIdCountList { | 272 | for _, i2 := range cardholderIdCountList { |
| 273 | if len(i2) >= 3 { | 273 | if len(i2) >= 3 { |
| 274 | cardholderIdCount[i2[1]] = i2[2] | 274 | cardholderIdCount[i2[1]] = i2[2] |
| @@ -292,7 +292,7 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model | @@ -292,7 +292,7 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model | ||
| 292 | sequenceId, cohort, | 292 | sequenceId, cohort, |
| 293 | openMode) | 293 | openMode) |
| 294 | // 打乱顺序 | 294 | // 打乱顺序 |
| 295 | - utslice.Shuffle(newCards) | 295 | + zslice.Shuffle(newCards) |
| 296 | for _, i3 := range newCards { | 296 | for _, i3 := range newCards { |
| 297 | allNewCards = append(allNewCards, i3) | 297 | allNewCards = append(allNewCards, i3) |
| 298 | } | 298 | } |
| @@ -314,7 +314,7 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model | @@ -314,7 +314,7 @@ func HandleShopExchange(req *models.ReqStarShopExchange) (code string, rsp model | ||
| 314 | // 存档 | 314 | // 存档 |
| 315 | SavePlayer(gameId, player) | 315 | SavePlayer(gameId, player) |
| 316 | 316 | ||
| 317 | - utslice.Shuffle(rsp.NewCards) | 317 | + zslice.Shuffle(rsp.NewCards) |
| 318 | 318 | ||
| 319 | // 返回信息 | 319 | // 返回信息 |
| 320 | rsp.CardHolderInfo = GetInfo(player, config) | 320 | rsp.CardHolderInfo = GetInfo(player, config) |
| @@ -374,7 +374,7 @@ func HandleAutoExchangeInfo(req *models.ReqAutoExchangeInfo) (code string, rsp m | @@ -374,7 +374,7 @@ func HandleAutoExchangeInfo(req *models.ReqAutoExchangeInfo) (code string, rsp m | ||
| 374 | // 存档 | 374 | // 存档 |
| 375 | SavePlayer(gameId, player) | 375 | SavePlayer(gameId, player) |
| 376 | 376 | ||
| 377 | - utslice.Shuffle(rsp.NewCards) | 377 | + zslice.Shuffle(rsp.NewCards) |
| 378 | 378 | ||
| 379 | // 返回信息 | 379 | // 返回信息 |
| 380 | rsp.CardHolderInfo = GetInfo(player, config) | 380 | rsp.CardHolderInfo = GetInfo(player, config) |
service/cardholder/logic.go
| 1 | package cardholder | 1 | package cardholder |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | - "apigame/configs/confcardholder" | 4 | + "apigame/configs-db/confcardholder" |
| 5 | "apigame/models" | 5 | "apigame/models" |
| 6 | "apigame/service-common/svmysql" | 6 | "apigame/service-common/svmysql" |
| 7 | "apigame/service/code-msg" | 7 | "apigame/service/code-msg" |
| 8 | "apigame/util/util-lx/lxalilog" | 8 | "apigame/util/util-lx/lxalilog" |
| 9 | "apigame/util/util-lx/lxtime" | 9 | "apigame/util/util-lx/lxtime" |
| 10 | - "apigame/util/utslice" | ||
| 11 | - "apigame/util/utstring" | 10 | + "apigame/util/zconvert" |
| 12 | "apigame/util/zjson" | 11 | "apigame/util/zjson" |
| 12 | + "apigame/util/zslice" | ||
| 13 | "github.com/samber/lo" | 13 | "github.com/samber/lo" |
| 14 | "math" | 14 | "math" |
| 15 | "sort" | 15 | "sort" |
| @@ -241,7 +241,7 @@ func DoOpenCheckAward(gameId string, | @@ -241,7 +241,7 @@ func DoOpenCheckAward(gameId string, | ||
| 241 | } | 241 | } |
| 242 | // 集齐处理发奖 | 242 | // 集齐处理发奖 |
| 243 | player.Details.Album[albumId] += 1 | 243 | player.Details.Album[albumId] += 1 |
| 244 | - award := confAlbum.Rewards[utstring.IntToString(player.Details.Round)] | 244 | + award := confAlbum.Rewards[zconvert.IntToStr(player.Details.Round)] |
| 245 | awardAlbum[albumId] = award | 245 | awardAlbum[albumId] = award |
| 246 | { | 246 | { |
| 247 | // 记录日志 | 247 | // 记录日志 |
| @@ -254,7 +254,7 @@ func DoOpenCheckAward(gameId string, | @@ -254,7 +254,7 @@ func DoOpenCheckAward(gameId string, | ||
| 254 | // 判断 处理 发放轮次奖励 轮次完成 | 254 | // 判断 处理 发放轮次奖励 轮次完成 |
| 255 | if CheckRoundFinish(player, config) { | 255 | if CheckRoundFinish(player, config) { |
| 256 | // 返回奖励 | 256 | // 返回奖励 |
| 257 | - awardRound = config.Awards[utstring.IntToString(player.Details.Round)] | 257 | + awardRound = config.Awards[zconvert.IntToStr(player.Details.Round)] |
| 258 | 258 | ||
| 259 | // 记录日志 | 259 | // 记录日志 |
| 260 | recordBase := NewRecordBase(player.Uid, sequenceId, cohort, config.Id, player.Details.Round) | 260 | recordBase := NewRecordBase(player.Uid, sequenceId, cohort, config.Id, player.Details.Round) |
| @@ -395,7 +395,7 @@ func NextActivityAutoExchange(gameId string, player *Player, config *confcardhol | @@ -395,7 +395,7 @@ func NextActivityAutoExchange(gameId string, player *Player, config *confcardhol | ||
| 395 | sequenceId, cohort, | 395 | sequenceId, cohort, |
| 396 | openMode) | 396 | openMode) |
| 397 | // 打乱顺序 | 397 | // 打乱顺序 |
| 398 | - utslice.Shuffle(newCards) | 398 | + zslice.Shuffle(newCards) |
| 399 | for _, i3 := range newCards { | 399 | for _, i3 := range newCards { |
| 400 | allNewCards = append(allNewCards, i3) | 400 | allNewCards = append(allNewCards, i3) |
| 401 | } | 401 | } |
service/cardholder/player.go
| 1 | package cardholder | 1 | package cardholder |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | - "apigame/configs/confcardholder" | 4 | + "apigame/configs-db/confcardholder" |
| 5 | "apigame/service-common/svmysql" | 5 | "apigame/service-common/svmysql" |
| 6 | "apigame/util/util-lx/lxalilog" | 6 | "apigame/util/util-lx/lxalilog" |
| 7 | "apigame/util/util-lx/lxtime" | 7 | "apigame/util/util-lx/lxtime" |
service/roomrank/handle.go
service/roomrank/logic.go
| 1 | package roomrank | 1 | package roomrank |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | - "apigame/configs/confroomrank" | 4 | + "apigame/configs-db/confroomrank" |
| 5 | "apigame/service-common/svconst" | 5 | "apigame/service-common/svconst" |
| 6 | "apigame/util/util-lx/lxtime" | 6 | "apigame/util/util-lx/lxtime" |
| 7 | - "apigame/util/utstring" | 7 | + "apigame/util/zconvert" |
| 8 | "apigame/util/ztime" | 8 | "apigame/util/ztime" |
| 9 | "fmt" | 9 | "fmt" |
| 10 | "time" | 10 | "time" |
| @@ -91,7 +91,7 @@ func TrySettle(gameId string, topType int, player *Player) (hasChange bool) { | @@ -91,7 +91,7 @@ func TrySettle(gameId string, topType int, player *Player) (hasChange bool) { | ||
| 91 | if !hasConfRoom { | 91 | if !hasConfRoom { |
| 92 | return | 92 | return |
| 93 | } | 93 | } |
| 94 | - if confAward, hasConfAward := confRoom.Awards[utstring.IntToString(player.SettleRank)]; hasConfAward { | 94 | + if confAward, hasConfAward := confRoom.Awards[zconvert.IntToStr(player.SettleRank)]; hasConfAward { |
| 95 | player.SettleAward = confAward | 95 | player.SettleAward = confAward |
| 96 | } | 96 | } |
| 97 | if len(confRoom.SettleScores) > rankIndex { | 97 | if len(confRoom.SettleScores) > rankIndex { |
service/roomrank/player.go
| 1 | package roomrank | 1 | package roomrank |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | - "apigame/configs/confroomrank" | 4 | + "apigame/configs-db/confroomrank" |
| 5 | "apigame/models" | 5 | "apigame/models" |
| 6 | "apigame/service-common/svcommon" | 6 | "apigame/service-common/svcommon" |
| 7 | "apigame/service-common/svmysql" | 7 | "apigame/service-common/svmysql" |
| 8 | "apigame/util/util-lx/lxalilog" | 8 | "apigame/util/util-lx/lxalilog" |
| 9 | "apigame/util/util-lx/lxtime" | 9 | "apigame/util/util-lx/lxtime" |
| 10 | - "apigame/util/utstring" | 10 | + "apigame/util/zconvert" |
| 11 | ) | 11 | ) |
| 12 | 12 | ||
| 13 | func tryInitPlayer(gameId string, player *Player) { | 13 | func tryInitPlayer(gameId string, player *Player) { |
| @@ -118,7 +118,7 @@ func GetInfoFromRoom(gameId string, player *Player, room *Room, config *confroom | @@ -118,7 +118,7 @@ func GetInfoFromRoom(gameId string, player *Player, room *Room, config *confroom | ||
| 118 | IsRobot: p.IsRobot(), | 118 | IsRobot: p.IsRobot(), |
| 119 | } | 119 | } |
| 120 | if confRoom, hasConfRoom := config.Room[room.ConfigId]; hasConfRoom { | 120 | if confRoom, hasConfRoom := config.Room[room.ConfigId]; hasConfRoom { |
| 121 | - if confAward, hasConfAward := confRoom.Awards[utstring.IntToString(rank)]; hasConfAward { | 121 | + if confAward, hasConfAward := confRoom.Awards[zconvert.IntToStr(rank)]; hasConfAward { |
| 122 | node.Award = confAward | 122 | node.Award = confAward |
| 123 | } | 123 | } |
| 124 | } | 124 | } |
service/roomrank/room.go
| 1 | package roomrank | 1 | package roomrank |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | - "apigame/configs/confroomrank" | 4 | + "apigame/configs-db/confroomrank" |
| 5 | "apigame/service-common/svcommon" | 5 | "apigame/service-common/svcommon" |
| 6 | "apigame/service-common/svmysql" | 6 | "apigame/service-common/svmysql" |
| 7 | "apigame/util/util-lx/lxalilog" | 7 | "apigame/util/util-lx/lxalilog" |
util/utmap/map.go
| @@ -1,66 +0,0 @@ | @@ -1,66 +0,0 @@ | ||
| 1 | -package utmap | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/util/uttype" | ||
| 5 | - "math/rand" | ||
| 6 | -) | ||
| 7 | - | ||
| 8 | -// Keys Keys切片 | ||
| 9 | -func Keys[T1 comparable, T2 any](dict map[T1]T2) []T1 { | ||
| 10 | - list := make([]T1, 0) | ||
| 11 | - for k, _ := range dict { | ||
| 12 | - list = append(list, k) | ||
| 13 | - } | ||
| 14 | - return list | ||
| 15 | -} | ||
| 16 | - | ||
| 17 | -// Values Values切片 | ||
| 18 | -func Values[T1 comparable, T2 any](dict map[T1]T2) []T2 { | ||
| 19 | - list := make([]T2, 0) | ||
| 20 | - for _, v := range dict { | ||
| 21 | - list = append(list, v) | ||
| 22 | - } | ||
| 23 | - return list | ||
| 24 | -} | ||
| 25 | - | ||
| 26 | -// ContainValue 值等于 | ||
| 27 | -func ContainValue[T1 comparable, T2 comparable](dict map[T1]T2, value T2) bool { | ||
| 28 | - for _, v := range dict { | ||
| 29 | - if v == value { | ||
| 30 | - return true | ||
| 31 | - } | ||
| 32 | - } | ||
| 33 | - return false | ||
| 34 | -} | ||
| 35 | - | ||
| 36 | -// ContainValueEquals 值等于 | ||
| 37 | -func ContainValueEquals[T1 comparable, T2 uttype.EqualAble](dict map[T1]T2, value T2) bool { | ||
| 38 | - for _, v := range dict { | ||
| 39 | - if v.Equals(value) { | ||
| 40 | - return true | ||
| 41 | - } | ||
| 42 | - } | ||
| 43 | - return false | ||
| 44 | -} | ||
| 45 | - | ||
| 46 | -// ContainValueBy 值符合 | ||
| 47 | -func ContainValueBy[T1 comparable, T2 any](dict map[T1]T2, value T2, equals func(v1 T2, v2 T2) bool) bool { | ||
| 48 | - for _, v := range dict { | ||
| 49 | - if equals(v, value) { | ||
| 50 | - return true | ||
| 51 | - } | ||
| 52 | - } | ||
| 53 | - return false | ||
| 54 | -} | ||
| 55 | - | ||
| 56 | -// RandomOne 随机一个值 | ||
| 57 | -func RandomOne[T1 comparable, T2 any](dict map[T1]T2) T2 { | ||
| 58 | - if len(dict) <= 0 { | ||
| 59 | - return *new(T2) | ||
| 60 | - } | ||
| 61 | - list := make([]T1, 0) | ||
| 62 | - for i, _ := range dict { | ||
| 63 | - list = append(list, i) | ||
| 64 | - } | ||
| 65 | - return dict[list[rand.Intn(len(list))]] | ||
| 66 | -} |
util/utmisc/goroutine.go
| @@ -1,15 +0,0 @@ | @@ -1,15 +0,0 @@ | ||
| 1 | -package utmisc | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "fmt" | ||
| 5 | - "runtime" | ||
| 6 | -) | ||
| 7 | - | ||
| 8 | -// GetGoroutineID 获取携程ID | ||
| 9 | -func GetGoroutineID() int { | ||
| 10 | - var buf [64]byte | ||
| 11 | - runtime.Stack(buf[:], false) | ||
| 12 | - var id int | ||
| 13 | - fmt.Sscanf(string(buf[:]), "goroutine %d", &id) | ||
| 14 | - return id | ||
| 15 | -} |
util/utmisc/random.go
| @@ -1,21 +0,0 @@ | @@ -1,21 +0,0 @@ | ||
| 1 | -package utmisc | ||
| 2 | - | ||
| 3 | -import "math/rand" | ||
| 4 | - | ||
| 5 | -func RandomMultiple(count, minNum, maxNum int) []int { | ||
| 6 | - list := make([]int, 0) | ||
| 7 | - if maxNum > minNum { | ||
| 8 | - if count > maxNum-minNum { | ||
| 9 | - count = maxNum - minNum | ||
| 10 | - } | ||
| 11 | - m := make(map[int]struct{}) | ||
| 12 | - for len(m) < count { | ||
| 13 | - v := minNum + rand.Intn(maxNum-minNum) | ||
| 14 | - if _, ok := m[v]; !ok { | ||
| 15 | - m[v] = struct{}{} | ||
| 16 | - list = append(list, v) | ||
| 17 | - } | ||
| 18 | - } | ||
| 19 | - } | ||
| 20 | - return list | ||
| 21 | -} |
util/utslice/slice.go
| @@ -1,161 +0,0 @@ | @@ -1,161 +0,0 @@ | ||
| 1 | -package utslice | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "apigame/util/uttype" | ||
| 5 | - "math/rand" | ||
| 6 | -) | ||
| 7 | - | ||
| 8 | -// Contains 判断切片是否包含某元素 | ||
| 9 | -func Contains[T comparable](list []T, value T) bool { | ||
| 10 | - for _, v := range list { | ||
| 11 | - if v == value { | ||
| 12 | - return true | ||
| 13 | - } | ||
| 14 | - } | ||
| 15 | - return false | ||
| 16 | -} | ||
| 17 | - | ||
| 18 | -// RandomOne 随机一个元素 | ||
| 19 | -func RandomOne[T any](list []T) T { | ||
| 20 | - if len(list) <= 0 { | ||
| 21 | - return *new(T) | ||
| 22 | - } | ||
| 23 | - return list[rand.Intn(len(list))] | ||
| 24 | -} | ||
| 25 | - | ||
| 26 | -// Remove 切片删除一个元素 | ||
| 27 | -func Remove[T comparable](list []T, item T) []T { | ||
| 28 | - for i := 0; i < len(list); i++ { | ||
| 29 | - if item == list[i] { | ||
| 30 | - list = append(list[:i], list[i+1:]...) | ||
| 31 | - i = i - 1 | ||
| 32 | - } | ||
| 33 | - } | ||
| 34 | - return list | ||
| 35 | -} | ||
| 36 | - | ||
| 37 | -// RemoveList 切片删除多个元素 | ||
| 38 | -func RemoveList[T comparable](list []T, items []T) []T { | ||
| 39 | - dMap := make(map[T]bool) | ||
| 40 | - for _, s := range items { | ||
| 41 | - dMap[s] = true | ||
| 42 | - } | ||
| 43 | - | ||
| 44 | - for i := 0; i < len(list); i++ { | ||
| 45 | - if _, ok := dMap[list[i]]; ok { | ||
| 46 | - list = append(list[:i], list[i+1:]...) | ||
| 47 | - i = i - 1 | ||
| 48 | - } | ||
| 49 | - } | ||
| 50 | - return list | ||
| 51 | -} | ||
| 52 | - | ||
| 53 | -// Sum 求和 | ||
| 54 | -func Sum[T uttype.UtNumber](list []T) T { | ||
| 55 | - var result T = 0 | ||
| 56 | - for _, v := range list { | ||
| 57 | - result += v | ||
| 58 | - } | ||
| 59 | - return result | ||
| 60 | -} | ||
| 61 | - | ||
| 62 | -// Any 其中有一个元素符合就返回true | ||
| 63 | -func Any[T uttype.UtNumber](list []T, value T) bool { | ||
| 64 | - for _, v := range list { | ||
| 65 | - if v == value { | ||
| 66 | - return true | ||
| 67 | - } | ||
| 68 | - } | ||
| 69 | - return false | ||
| 70 | -} | ||
| 71 | - | ||
| 72 | -// AnyEquals 其中有一个元素符合就返回true | ||
| 73 | -func AnyEquals[T uttype.EqualAble](list []T, value T) bool { | ||
| 74 | - for _, v := range list { | ||
| 75 | - if v.Equals(value) { | ||
| 76 | - return true | ||
| 77 | - } | ||
| 78 | - } | ||
| 79 | - return false | ||
| 80 | -} | ||
| 81 | - | ||
| 82 | -// AnyBy 其中有一个元素符合就返回true | ||
| 83 | -func AnyBy[T any](list []T, value T, equals func(v1 T, v2 T) bool) bool { | ||
| 84 | - for _, v := range list { | ||
| 85 | - if equals(v, value) { | ||
| 86 | - return true | ||
| 87 | - } | ||
| 88 | - } | ||
| 89 | - return false | ||
| 90 | -} | ||
| 91 | - | ||
| 92 | -// All 所有元素符合就返回true | ||
| 93 | -func All[T uttype.UtNumber](list []T, value T) bool { | ||
| 94 | - for _, v := range list { | ||
| 95 | - if v != value { | ||
| 96 | - return false | ||
| 97 | - } | ||
| 98 | - } | ||
| 99 | - return true | ||
| 100 | -} | ||
| 101 | - | ||
| 102 | -// AllEquals 所有元素符合就返回true | ||
| 103 | -func AllEquals[T uttype.EqualAble](list []T, value T) bool { | ||
| 104 | - for _, v := range list { | ||
| 105 | - if !v.Equals(value) { | ||
| 106 | - return false | ||
| 107 | - } | ||
| 108 | - } | ||
| 109 | - return true | ||
| 110 | -} | ||
| 111 | - | ||
| 112 | -// AllBy 所有元素符合就返回true | ||
| 113 | -func AllBy[T any](list []T, value T, equals func(v1 T, v2 T) bool) bool { | ||
| 114 | - for _, v := range list { | ||
| 115 | - if !equals(v, value) { | ||
| 116 | - return false | ||
| 117 | - } | ||
| 118 | - } | ||
| 119 | - return true | ||
| 120 | -} | ||
| 121 | - | ||
| 122 | -// Filter 过滤 | ||
| 123 | -func Filter[T comparable](list []T, value T) []T { | ||
| 124 | - result := make([]T, 0) | ||
| 125 | - for _, v := range list { | ||
| 126 | - if v == value { | ||
| 127 | - result = append(result, v) | ||
| 128 | - } | ||
| 129 | - } | ||
| 130 | - return result | ||
| 131 | -} | ||
| 132 | - | ||
| 133 | -// FilterEquals 过滤 | ||
| 134 | -func FilterEquals[T uttype.EqualAble](list []T, value T) []T { | ||
| 135 | - result := make([]T, 0) | ||
| 136 | - for _, v := range list { | ||
| 137 | - if v.Equals(value) { | ||
| 138 | - result = append(result, v) | ||
| 139 | - } | ||
| 140 | - } | ||
| 141 | - return result | ||
| 142 | -} | ||
| 143 | - | ||
| 144 | -// FilterBy 过滤 | ||
| 145 | -func FilterBy[T any](list []T, value T, equals func(v1 T, v2 T) bool) []T { | ||
| 146 | - result := make([]T, 0) | ||
| 147 | - for _, v := range list { | ||
| 148 | - if equals(v, value) { | ||
| 149 | - result = append(result, v) | ||
| 150 | - } | ||
| 151 | - } | ||
| 152 | - return result | ||
| 153 | -} | ||
| 154 | - | ||
| 155 | -// Shuffle 打乱 | ||
| 156 | -func Shuffle[T any](list []T) { | ||
| 157 | - for i := len(list) - 1; i > 0; i-- { | ||
| 158 | - j := rand.Intn(i + 1) | ||
| 159 | - list[i], list[j] = list[j], list[i] | ||
| 160 | - } | ||
| 161 | -} |
util/utstring/list.go
| @@ -1,51 +0,0 @@ | @@ -1,51 +0,0 @@ | ||
| 1 | -package utstring | ||
| 2 | - | ||
| 3 | -import "strings" | ||
| 4 | - | ||
| 5 | -func ListStringToListInt(list []string) []int { | ||
| 6 | - result := make([]int, 0) | ||
| 7 | - for _, v := range list { | ||
| 8 | - result = append(result, StringToInt(v)) | ||
| 9 | - } | ||
| 10 | - return result | ||
| 11 | -} | ||
| 12 | -func ListStringToListInt64(list []string) []int64 { | ||
| 13 | - result := make([]int64, 0) | ||
| 14 | - for _, v := range list { | ||
| 15 | - result = append(result, StringToInt64(v)) | ||
| 16 | - } | ||
| 17 | - return result | ||
| 18 | -} | ||
| 19 | -func StringToListString(str string, sep string) []string { | ||
| 20 | - return strings.Split(str, sep) | ||
| 21 | -} | ||
| 22 | -func StringToListInt(str string, sep string) []int { | ||
| 23 | - return ListStringToListInt(strings.Split(str, sep)) | ||
| 24 | -} | ||
| 25 | -func StringToListListString(str string, sep1, sep2 string) [][]string { | ||
| 26 | - result := make([][]string, 0) | ||
| 27 | - list1 := strings.Split(str, sep1) | ||
| 28 | - for _, v := range list1 { | ||
| 29 | - list2 := strings.Split(v, sep2) | ||
| 30 | - result = append(result, list2) | ||
| 31 | - } | ||
| 32 | - return result | ||
| 33 | -} | ||
| 34 | -func StringToListListInt(str string, sep1, sep2 string) [][]int { | ||
| 35 | - result := make([][]int, 0) | ||
| 36 | - list1 := strings.Split(str, sep1) | ||
| 37 | - for _, v := range list1 { | ||
| 38 | - list2 := strings.Split(v, sep2) | ||
| 39 | - result = append(result, ListStringToListInt(list2)) | ||
| 40 | - } | ||
| 41 | - return result | ||
| 42 | -} | ||
| 43 | -func StringToListListInt64(str string, sep1, sep2 string) [][]int64 { | ||
| 44 | - result := make([][]int64, 0) | ||
| 45 | - list1 := strings.Split(str, sep1) | ||
| 46 | - for _, v := range list1 { | ||
| 47 | - list2 := strings.Split(v, sep2) | ||
| 48 | - result = append(result, ListStringToListInt64(list2)) | ||
| 49 | - } | ||
| 50 | - return result | ||
| 51 | -} |
util/utstring/string.go
| @@ -1,30 +0,0 @@ | @@ -1,30 +0,0 @@ | ||
| 1 | -package utstring | ||
| 2 | - | ||
| 3 | -import ( | ||
| 4 | - "strconv" | ||
| 5 | -) | ||
| 6 | - | ||
| 7 | -func StringToInt(str string) int { | ||
| 8 | - if value, err := strconv.Atoi(str); err == nil { | ||
| 9 | - return value | ||
| 10 | - } | ||
| 11 | - return 0 | ||
| 12 | -} | ||
| 13 | -func StringToInt32(str string) int32 { | ||
| 14 | - return int32(StringToInt(str)) | ||
| 15 | -} | ||
| 16 | -func StringToInt64(str string) int64 { | ||
| 17 | - if value, err := strconv.ParseInt(str, 10, 64); err == nil { | ||
| 18 | - return value | ||
| 19 | - } | ||
| 20 | - return 0 | ||
| 21 | -} | ||
| 22 | -func IntToString(value int) string { | ||
| 23 | - return strconv.Itoa(value) | ||
| 24 | -} | ||
| 25 | -func Int32ToString(value int32) string { | ||
| 26 | - return IntToString(int(value)) | ||
| 27 | -} | ||
| 28 | -func Int64ToString(value int64) string { | ||
| 29 | - return strconv.FormatInt(value, 10) | ||
| 30 | -} |
util/uttype/equals.go
util/uttype/type.go
| @@ -1,21 +0,0 @@ | @@ -1,21 +0,0 @@ | ||
| 1 | -package uttype | ||
| 2 | - | ||
| 3 | -type UtInt interface { | ||
| 4 | - ~int | ~int8 | ~int16 | ~int32 | ~int64 | ||
| 5 | -} | ||
| 6 | - | ||
| 7 | -type UtUint interface { | ||
| 8 | - ~uint | ~uint8 | ~uint16 | ~uint32 | ||
| 9 | -} | ||
| 10 | - | ||
| 11 | -type UtFloat interface { | ||
| 12 | - ~float32 | ~float64 | ||
| 13 | -} | ||
| 14 | - | ||
| 15 | -type UtNumber interface { | ||
| 16 | - UtInt | UtUint | UtFloat | ||
| 17 | -} | ||
| 18 | - | ||
| 19 | -type UtBase interface { | ||
| 20 | - UtNumber | string | ||
| 21 | -} |
util/utuuid/uuid.go
| @@ -0,0 +1,109 @@ | @@ -0,0 +1,109 @@ | ||
| 1 | +package zconvert | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/util/ztype" | ||
| 5 | + "strings" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +/* ----- list<number> -> list<number> ----- */ | ||
| 9 | + | ||
| 10 | +func ListNumberToListNumber[T1 ztype.UtNumber, T2 ztype.UtNumber](in []T1) (out []T2) { | ||
| 11 | + for _, t1 := range in { | ||
| 12 | + out = append(out, T2(t1)) | ||
| 13 | + } | ||
| 14 | + return | ||
| 15 | +} | ||
| 16 | + | ||
| 17 | +/* ----- list<string> -> list<number> ----- */ | ||
| 18 | + | ||
| 19 | +func ListStrToListNumber[T ztype.UtNumber](list []string) []T { | ||
| 20 | + result := make([]T, 0) | ||
| 21 | + for _, v := range list { | ||
| 22 | + result = append(result, T(ToInt64(v))) | ||
| 23 | + } | ||
| 24 | + return result | ||
| 25 | +} | ||
| 26 | +func ListStrToListInt(list []string) []int { | ||
| 27 | + result := make([]int, 0) | ||
| 28 | + for _, v := range list { | ||
| 29 | + result = append(result, ToInt(v)) | ||
| 30 | + } | ||
| 31 | + return result | ||
| 32 | +} | ||
| 33 | +func ListStrToListInt32(list []string) []int32 { | ||
| 34 | + result := make([]int32, 0) | ||
| 35 | + for _, v := range list { | ||
| 36 | + result = append(result, ToInt32(v)) | ||
| 37 | + } | ||
| 38 | + return result | ||
| 39 | +} | ||
| 40 | +func ListStrToListInt64(list []string) []int64 { | ||
| 41 | + result := make([]int64, 0) | ||
| 42 | + for _, v := range list { | ||
| 43 | + result = append(result, ToInt64(v)) | ||
| 44 | + } | ||
| 45 | + return result | ||
| 46 | +} | ||
| 47 | + | ||
| 48 | +/* ----- string -> list<number> ----- */ | ||
| 49 | + | ||
| 50 | +func ToListStr(str string, sep string) []string { | ||
| 51 | + return strings.Split(str, sep) | ||
| 52 | +} | ||
| 53 | +func ToListNumber[T ztype.UtNumber](str string, sep string) []T { | ||
| 54 | + return ListStrToListNumber[T](strings.Split(str, sep)) | ||
| 55 | +} | ||
| 56 | +func ToListInt(str string, sep string) []int { | ||
| 57 | + return ListStrToListInt(strings.Split(str, sep)) | ||
| 58 | +} | ||
| 59 | +func ToListInt32(str string, sep string) []int32 { | ||
| 60 | + return ListStrToListInt32(strings.Split(str, sep)) | ||
| 61 | +} | ||
| 62 | + | ||
| 63 | +/* ----- string -> list<list<number>> ----- */ | ||
| 64 | + | ||
| 65 | +func ToListListStr(str string, sep1, sep2 string) [][]string { | ||
| 66 | + result := make([][]string, 0) | ||
| 67 | + list1 := strings.Split(str, sep1) | ||
| 68 | + for _, v := range list1 { | ||
| 69 | + list2 := strings.Split(v, sep2) | ||
| 70 | + result = append(result, list2) | ||
| 71 | + } | ||
| 72 | + return result | ||
| 73 | +} | ||
| 74 | +func ToListListNumber[T ztype.UtNumber](str string, sep1, sep2 string) [][]T { | ||
| 75 | + result := make([][]T, 0) | ||
| 76 | + list1 := strings.Split(str, sep1) | ||
| 77 | + for _, v := range list1 { | ||
| 78 | + list2 := strings.Split(v, sep2) | ||
| 79 | + result = append(result, ListStrToListNumber[T](list2)) | ||
| 80 | + } | ||
| 81 | + return result | ||
| 82 | +} | ||
| 83 | +func ToListListInt(str string, sep1, sep2 string) [][]int { | ||
| 84 | + result := make([][]int, 0) | ||
| 85 | + list1 := strings.Split(str, sep1) | ||
| 86 | + for _, v := range list1 { | ||
| 87 | + list2 := strings.Split(v, sep2) | ||
| 88 | + result = append(result, ListStrToListInt(list2)) | ||
| 89 | + } | ||
| 90 | + return result | ||
| 91 | +} | ||
| 92 | +func ToListListInt32(str string, sep1, sep2 string) [][]int32 { | ||
| 93 | + result := make([][]int32, 0) | ||
| 94 | + list1 := strings.Split(str, sep1) | ||
| 95 | + for _, v := range list1 { | ||
| 96 | + list2 := strings.Split(v, sep2) | ||
| 97 | + result = append(result, ListStrToListInt32(list2)) | ||
| 98 | + } | ||
| 99 | + return result | ||
| 100 | +} | ||
| 101 | +func ToListListInt64(str string, sep1, sep2 string) [][]int64 { | ||
| 102 | + result := make([][]int64, 0) | ||
| 103 | + list1 := strings.Split(str, sep1) | ||
| 104 | + for _, v := range list1 { | ||
| 105 | + list2 := strings.Split(v, sep2) | ||
| 106 | + result = append(result, ListStrToListInt64(list2)) | ||
| 107 | + } | ||
| 108 | + return result | ||
| 109 | +} |
| @@ -0,0 +1,25 @@ | @@ -0,0 +1,25 @@ | ||
| 1 | +package zconvert | ||
| 2 | + | ||
| 3 | +/* ----- string -> map ----- */ | ||
| 4 | + | ||
| 5 | +func ToMapStr(str string, sep1, sep2 string) map[string]string { | ||
| 6 | + result := make(map[string]string) | ||
| 7 | + list := ToListListStr(str, sep1, sep2) | ||
| 8 | + for _, i2 := range list { | ||
| 9 | + if len(i2) >= 2 { | ||
| 10 | + result[i2[0]] = i2[1] | ||
| 11 | + } | ||
| 12 | + } | ||
| 13 | + return result | ||
| 14 | +} | ||
| 15 | + | ||
| 16 | +func ToMapInt32(str string, sep1, sep2 string) map[int32]int32 { | ||
| 17 | + result := make(map[int32]int32) | ||
| 18 | + list := ToListListInt32(str, sep1, sep2) | ||
| 19 | + for _, i2 := range list { | ||
| 20 | + if len(i2) >= 2 { | ||
| 21 | + result[i2[0]] = i2[1] | ||
| 22 | + } | ||
| 23 | + } | ||
| 24 | + return result | ||
| 25 | +} |
| @@ -0,0 +1,45 @@ | @@ -0,0 +1,45 @@ | ||
| 1 | +package zconvert | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/util/ztype" | ||
| 5 | + "strconv" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +/* -----泛型----- */ | ||
| 9 | + | ||
| 10 | +func ToStr[T ztype.UtInteger](t T) string { | ||
| 11 | + return strconv.FormatInt(int64(t), 10) | ||
| 12 | +} | ||
| 13 | +func IToStr[T ztype.UtInt](t T) string { | ||
| 14 | + return strconv.FormatInt(int64(t), 10) | ||
| 15 | +} | ||
| 16 | +func UToStr[T ztype.UtUint](t T) string { | ||
| 17 | + return strconv.FormatUint(uint64(t), 10) | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +/* ----- string -> number ----- */ | ||
| 21 | + | ||
| 22 | +func ToInt(str string) int { | ||
| 23 | + if value, err := strconv.Atoi(str); err == nil { | ||
| 24 | + return value | ||
| 25 | + } | ||
| 26 | + return 0 | ||
| 27 | +} | ||
| 28 | +func ToInt32(str string) int32 { | ||
| 29 | + return int32(ToInt(str)) | ||
| 30 | +} | ||
| 31 | +func ToInt64(str string) int64 { | ||
| 32 | + if value, err := strconv.ParseInt(str, 10, 64); err == nil { | ||
| 33 | + return value | ||
| 34 | + } | ||
| 35 | + return 0 | ||
| 36 | +} | ||
| 37 | +func IntToStr(value int) string { | ||
| 38 | + return strconv.Itoa(value) | ||
| 39 | +} | ||
| 40 | +func Int32ToStr(value int32) string { | ||
| 41 | + return IntToStr(int(value)) | ||
| 42 | +} | ||
| 43 | +func Int64ToStr(value int64) string { | ||
| 44 | + return strconv.FormatInt(value, 10) | ||
| 45 | +} |
| @@ -0,0 +1,66 @@ | @@ -0,0 +1,66 @@ | ||
| 1 | +package zmap | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/util/ztype" | ||
| 5 | + "math/rand" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +// Keys Keys切片 | ||
| 9 | +func Keys[T1 comparable, T2 any](dict map[T1]T2) []T1 { | ||
| 10 | + list := make([]T1, 0) | ||
| 11 | + for k, _ := range dict { | ||
| 12 | + list = append(list, k) | ||
| 13 | + } | ||
| 14 | + return list | ||
| 15 | +} | ||
| 16 | + | ||
| 17 | +// Values Values切片 | ||
| 18 | +func Values[T1 comparable, T2 any](dict map[T1]T2) []T2 { | ||
| 19 | + list := make([]T2, 0) | ||
| 20 | + for _, v := range dict { | ||
| 21 | + list = append(list, v) | ||
| 22 | + } | ||
| 23 | + return list | ||
| 24 | +} | ||
| 25 | + | ||
| 26 | +// ContainValue 值等于 | ||
| 27 | +func ContainValue[T1 comparable, T2 comparable](dict map[T1]T2, value T2) bool { | ||
| 28 | + for _, v := range dict { | ||
| 29 | + if v == value { | ||
| 30 | + return true | ||
| 31 | + } | ||
| 32 | + } | ||
| 33 | + return false | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +// ContainValueEquals 值等于 | ||
| 37 | +func ContainValueEquals[T1 comparable, T2 ztype.EqualAble](dict map[T1]T2, value T2) bool { | ||
| 38 | + for _, v := range dict { | ||
| 39 | + if v.Equals(value) { | ||
| 40 | + return true | ||
| 41 | + } | ||
| 42 | + } | ||
| 43 | + return false | ||
| 44 | +} | ||
| 45 | + | ||
| 46 | +// ContainValueBy 值符合 | ||
| 47 | +func ContainValueBy[T1 comparable, T2 any](dict map[T1]T2, value T2, equals func(v1 T2, v2 T2) bool) bool { | ||
| 48 | + for _, v := range dict { | ||
| 49 | + if equals(v, value) { | ||
| 50 | + return true | ||
| 51 | + } | ||
| 52 | + } | ||
| 53 | + return false | ||
| 54 | +} | ||
| 55 | + | ||
| 56 | +// RandomOne 随机一个值 | ||
| 57 | +func RandomOne[T1 comparable, T2 any](dict map[T1]T2) T2 { | ||
| 58 | + if len(dict) <= 0 { | ||
| 59 | + return *new(T2) | ||
| 60 | + } | ||
| 61 | + list := make([]T1, 0) | ||
| 62 | + for i, _ := range dict { | ||
| 63 | + list = append(list, i) | ||
| 64 | + } | ||
| 65 | + return dict[list[rand.Intn(len(list))]] | ||
| 66 | +} |
| @@ -0,0 +1,15 @@ | @@ -0,0 +1,15 @@ | ||
| 1 | +package zmisc | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "runtime" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +// GetGoroutineID 获取携程ID | ||
| 9 | +func GetGoroutineID() int { | ||
| 10 | + var buf [64]byte | ||
| 11 | + runtime.Stack(buf[:], false) | ||
| 12 | + var id int | ||
| 13 | + fmt.Sscanf(string(buf[:]), "goroutine %d", &id) | ||
| 14 | + return id | ||
| 15 | +} |
| @@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
| 1 | +package zmisc | ||
| 2 | + | ||
| 3 | +import "math/rand" | ||
| 4 | + | ||
| 5 | +func RandomMultiple(count, minNum, maxNum int) []int { | ||
| 6 | + list := make([]int, 0) | ||
| 7 | + if maxNum > minNum { | ||
| 8 | + if count > maxNum-minNum { | ||
| 9 | + count = maxNum - minNum | ||
| 10 | + } | ||
| 11 | + m := make(map[int]struct{}) | ||
| 12 | + for len(m) < count { | ||
| 13 | + v := minNum + rand.Intn(maxNum-minNum) | ||
| 14 | + if _, ok := m[v]; !ok { | ||
| 15 | + m[v] = struct{}{} | ||
| 16 | + list = append(list, v) | ||
| 17 | + } | ||
| 18 | + } | ||
| 19 | + } | ||
| 20 | + return list | ||
| 21 | +} |
| @@ -0,0 +1,161 @@ | @@ -0,0 +1,161 @@ | ||
| 1 | +package zslice | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "apigame/util/ztype" | ||
| 5 | + "math/rand" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +// Contains 判断切片是否包含某元素 | ||
| 9 | +func Contains[T comparable](list []T, value T) bool { | ||
| 10 | + for _, v := range list { | ||
| 11 | + if v == value { | ||
| 12 | + return true | ||
| 13 | + } | ||
| 14 | + } | ||
| 15 | + return false | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +// RandomOne 随机一个元素 | ||
| 19 | +func RandomOne[T any](list []T) T { | ||
| 20 | + if len(list) <= 0 { | ||
| 21 | + return *new(T) | ||
| 22 | + } | ||
| 23 | + return list[rand.Intn(len(list))] | ||
| 24 | +} | ||
| 25 | + | ||
| 26 | +// Remove 切片删除一个元素 | ||
| 27 | +func Remove[T comparable](list []T, item T) []T { | ||
| 28 | + for i := 0; i < len(list); i++ { | ||
| 29 | + if item == list[i] { | ||
| 30 | + list = append(list[:i], list[i+1:]...) | ||
| 31 | + i = i - 1 | ||
| 32 | + } | ||
| 33 | + } | ||
| 34 | + return list | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +// RemoveList 切片删除多个元素 | ||
| 38 | +func RemoveList[T comparable](list []T, items []T) []T { | ||
| 39 | + dMap := make(map[T]bool) | ||
| 40 | + for _, s := range items { | ||
| 41 | + dMap[s] = true | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + for i := 0; i < len(list); i++ { | ||
| 45 | + if _, ok := dMap[list[i]]; ok { | ||
| 46 | + list = append(list[:i], list[i+1:]...) | ||
| 47 | + i = i - 1 | ||
| 48 | + } | ||
| 49 | + } | ||
| 50 | + return list | ||
| 51 | +} | ||
| 52 | + | ||
| 53 | +// Sum 求和 | ||
| 54 | +func Sum[T ztype.UtNumber](list []T) T { | ||
| 55 | + var result T = 0 | ||
| 56 | + for _, v := range list { | ||
| 57 | + result += v | ||
| 58 | + } | ||
| 59 | + return result | ||
| 60 | +} | ||
| 61 | + | ||
| 62 | +// Any 其中有一个元素符合就返回true | ||
| 63 | +func Any[T ztype.UtNumber](list []T, value T) bool { | ||
| 64 | + for _, v := range list { | ||
| 65 | + if v == value { | ||
| 66 | + return true | ||
| 67 | + } | ||
| 68 | + } | ||
| 69 | + return false | ||
| 70 | +} | ||
| 71 | + | ||
| 72 | +// AnyEquals 其中有一个元素符合就返回true | ||
| 73 | +func AnyEquals[T ztype.EqualAble](list []T, value T) bool { | ||
| 74 | + for _, v := range list { | ||
| 75 | + if v.Equals(value) { | ||
| 76 | + return true | ||
| 77 | + } | ||
| 78 | + } | ||
| 79 | + return false | ||
| 80 | +} | ||
| 81 | + | ||
| 82 | +// AnyBy 其中有一个元素符合就返回true | ||
| 83 | +func AnyBy[T any](list []T, value T, equals func(v1 T, v2 T) bool) bool { | ||
| 84 | + for _, v := range list { | ||
| 85 | + if equals(v, value) { | ||
| 86 | + return true | ||
| 87 | + } | ||
| 88 | + } | ||
| 89 | + return false | ||
| 90 | +} | ||
| 91 | + | ||
| 92 | +// All 所有元素符合就返回true | ||
| 93 | +func All[T ztype.UtNumber](list []T, value T) bool { | ||
| 94 | + for _, v := range list { | ||
| 95 | + if v != value { | ||
| 96 | + return false | ||
| 97 | + } | ||
| 98 | + } | ||
| 99 | + return true | ||
| 100 | +} | ||
| 101 | + | ||
| 102 | +// AllEquals 所有元素符合就返回true | ||
| 103 | +func AllEquals[T ztype.EqualAble](list []T, value T) bool { | ||
| 104 | + for _, v := range list { | ||
| 105 | + if !v.Equals(value) { | ||
| 106 | + return false | ||
| 107 | + } | ||
| 108 | + } | ||
| 109 | + return true | ||
| 110 | +} | ||
| 111 | + | ||
| 112 | +// AllBy 所有元素符合就返回true | ||
| 113 | +func AllBy[T any](list []T, value T, equals func(v1 T, v2 T) bool) bool { | ||
| 114 | + for _, v := range list { | ||
| 115 | + if !equals(v, value) { | ||
| 116 | + return false | ||
| 117 | + } | ||
| 118 | + } | ||
| 119 | + return true | ||
| 120 | +} | ||
| 121 | + | ||
| 122 | +// Filter 过滤 | ||
| 123 | +func Filter[T comparable](list []T, value T) []T { | ||
| 124 | + result := make([]T, 0) | ||
| 125 | + for _, v := range list { | ||
| 126 | + if v == value { | ||
| 127 | + result = append(result, v) | ||
| 128 | + } | ||
| 129 | + } | ||
| 130 | + return result | ||
| 131 | +} | ||
| 132 | + | ||
| 133 | +// FilterEquals 过滤 | ||
| 134 | +func FilterEquals[T ztype.EqualAble](list []T, value T) []T { | ||
| 135 | + result := make([]T, 0) | ||
| 136 | + for _, v := range list { | ||
| 137 | + if v.Equals(value) { | ||
| 138 | + result = append(result, v) | ||
| 139 | + } | ||
| 140 | + } | ||
| 141 | + return result | ||
| 142 | +} | ||
| 143 | + | ||
| 144 | +// FilterBy 过滤 | ||
| 145 | +func FilterBy[T any](list []T, value T, equals func(v1 T, v2 T) bool) []T { | ||
| 146 | + result := make([]T, 0) | ||
| 147 | + for _, v := range list { | ||
| 148 | + if equals(v, value) { | ||
| 149 | + result = append(result, v) | ||
| 150 | + } | ||
| 151 | + } | ||
| 152 | + return result | ||
| 153 | +} | ||
| 154 | + | ||
| 155 | +// Shuffle 打乱 | ||
| 156 | +func Shuffle[T any](list []T) { | ||
| 157 | + for i := len(list) - 1; i > 0; i-- { | ||
| 158 | + j := rand.Intn(i + 1) | ||
| 159 | + list[i], list[j] = list[j], list[i] | ||
| 160 | + } | ||
| 161 | +} |
| @@ -0,0 +1,25 @@ | @@ -0,0 +1,25 @@ | ||
| 1 | +package ztype | ||
| 2 | + | ||
| 3 | +type UtInt interface { | ||
| 4 | + ~int | ~int8 | ~int16 | ~int32 | ~int64 | ||
| 5 | +} | ||
| 6 | + | ||
| 7 | +type UtUint interface { | ||
| 8 | + ~uint | ~uint8 | ~uint16 | ~uint32 | ||
| 9 | +} | ||
| 10 | + | ||
| 11 | +type UtFloat interface { | ||
| 12 | + ~float32 | ~float64 | ||
| 13 | +} | ||
| 14 | + | ||
| 15 | +type UtInteger interface { | ||
| 16 | + UtInt | UtUint | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +type UtNumber interface { | ||
| 20 | + UtInt | UtUint | UtFloat | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +type UtBase interface { | ||
| 24 | + UtNumber | string | ||
| 25 | +} |