diff --git a/call/config.go b/call/config.go index ee9eb56..ef7a4d5 100644 --- a/call/config.go +++ b/call/config.go @@ -62,6 +62,7 @@ var ( configActivitySevenDayBox []*common.ConfigActivitySevenDayBox configActivitySuper []*common.ConfigActivitySuper configTgRobot []*common.ConfigTgRobot + configBetDraw []*common.ConfigActivityBetDraw ) var ( @@ -1496,3 +1497,30 @@ func LoadConfigTgRobot() (err error) { func GetConfigTgRobot() []*common.ConfigTgRobot { return configTgRobot } + +// LoadBetDraw 加载 BetDraw 的配置 +func LoadBetDraw() (err error) { + var list []*common.ConfigActivityBetDraw + if _, err = db.Mysql().QueryAll("", "", &common.ConfigActivityBetDraw{}, &list); err != nil { + log.Error("err:%v", err) + return err + } + configBetDraw = list + return nil +} + +func GetConfigBetDraw() []*common.ConfigActivityBetDraw { + return configBetDraw +} + +func GetConfigBetDrawByType(t int) ([]*common.ConfigActivityBetDraw, []int64) { + var ret []*common.ConfigActivityBetDraw + var weight []int64 + for _, conf := range configBetDraw { + if conf.Type == t { + weight = append(weight, conf.Weight) + ret = append(ret, conf) + } + } + return ret, weight +} diff --git a/call/reload.go b/call/reload.go index b5a2f9a..87bad48 100644 --- a/call/reload.go +++ b/call/reload.go @@ -448,4 +448,15 @@ func CommonReload(c map[int][]func(*pb.ReloadGameConfig) error) { return nil }} } + // 为 BetDraw 注册重新加载函数 + if _, ok := c[common.ReloadConfigBetDraw]; !ok { + c[common.ReloadConfigBetDraw] = []func(*pb.ReloadGameConfig) error{func(rgc *pb.ReloadGameConfig) error { + if err := LoadBetDraw(); err != nil { + log.Error("error : [%s]", err.Error()) + return err + } + return nil + }} + } + } diff --git a/call/user.go b/call/user.go index 0f57db9..474bb45 100644 --- a/call/user.go +++ b/call/user.go @@ -601,6 +601,9 @@ func UpdatePlayerProfile(data *common.ESGameData) error { updates["day_bet"] = gorm.Expr("bet + ?", bet) } db.Mysql().Update(&common.PlayerData{UID: uid}, updates) + db.Mysql().Update(&common.ActivityBetDrawData{UID: uid}, map[string]interface{}{ + "lucky": gorm.Expr("lucky + ?", bet/100), + }) }) // 写入es diff --git a/build.sh b/cmd/build.sh similarity index 57% rename from build.sh rename to cmd/build.sh index a6aefd2..4b29610 100644 --- a/build.sh +++ b/cmd/build.sh @@ -1,4 +1,5 @@ #!/bin/bash +cd .. set -e cd pb/proto ./gener.sh @@ -7,4 +8,4 @@ cd pb/proto # go generate cd ../.. #go build main.go -CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o gameserver main.go \ No newline at end of file +CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o indiaprovider main.go \ No newline at end of file diff --git a/fieldalignment.sh b/cmd/fieldalignment.sh similarity index 100% rename from fieldalignment.sh rename to cmd/fieldalignment.sh diff --git a/cmd/gener_code.sh b/cmd/gener_code.sh new file mode 100644 index 0000000..e20ff91 --- /dev/null +++ b/cmd/gener_code.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# 检查是否提供了参数 +if [ $# -eq 0 ]; then + echo "请输入输入值。" + exit 1 +fi + +# 输入值 +input_value=$1 + +# 生成 Go 代码 +cat <generated_code.go + +var config$input_value []*common.Config$input_value + +// Load$input_value 加载 $input_value 的配置 +func Load$input_value() (err error) { + conf := common.ConfigCommon{ConfigType: common.Config$input_value{}.ConfigName()} + if err = db.Mysql().Get(&conf); err != nil { + log.Error("err:%v", err) + return err + } + if err = json.Unmarshal([]byte(conf.TableContent), &config$input_value); err != nil { + log.Error("err:%v", err) + return err + } + return nil +} +func GetConfig$input_value() []*common.Config$input_value { + return config$input_value +} + +ReloadConfig$input_value + +// 为 $input_value 注册重新加载函数 +if _, ok := c[common.ReloadConfig$input_value]; !ok { + c[common.ReloadConfig$input_value] = []func(*pb.ReloadGameConfig) error{func(rgc *pb.ReloadGameConfig) error { + if err := Load$input_value(); err != nil { + log.Error("error : [%s]", err.Error()) + return err + } + return nil + }} +} +EOF + +echo "Go 代码已成功生成至 generated_code.go 文件。" \ No newline at end of file diff --git a/reboot.sh b/cmd/reboot.sh similarity index 100% rename from reboot.sh rename to cmd/reboot.sh diff --git a/start.sh b/cmd/start.sh similarity index 100% rename from start.sh rename to cmd/start.sh diff --git a/stop.sh b/cmd/stop.sh similarity index 100% rename from stop.sh rename to cmd/stop.sh diff --git a/swagger.sh b/cmd/swagger.sh similarity index 100% rename from swagger.sh rename to cmd/swagger.sh diff --git a/common/activity.go b/common/activity.go index c19b8e5..eef29f7 100644 --- a/common/activity.go +++ b/common/activity.go @@ -19,6 +19,7 @@ const ( ActivityIDLuckyShop // 幸运商店活动 ActivityIDSevenDayBox // 7日签到宝箱 ActivityIDSuper // 超级1+2 + ActivityIDBetDraw // 下注抽奖活动 ) @@ -490,3 +491,13 @@ type ActivitySuperData struct { func (c *ActivitySuperData) TableName() string { return "activity_super_data" } + +type ActivityBetDrawData struct { + ID int `gorm:"primarykey"` + UID int `gorm:"column:uid;not null;type:int(11);uniqueIndex:uid"` + Lucky int64 `gorm:"column:lucky;;not null;type:bigint(20);comment:幸运值" web:"lucky"` +} + +func (c *ActivityBetDrawData) TableName() string { + return "config_betdraw_data" +} diff --git a/common/config.go b/common/config.go index 937fcf7..2cf6e22 100644 --- a/common/config.go +++ b/common/config.go @@ -50,6 +50,7 @@ const ( ReloadConfigActivitySevenDayBox // 7日宝箱活动 ReloadConfigActivitySuper // 超级1+2 ReloadConfigTgRobot // tg机器人配置 + ReloadConfigBetDraw // 下注抽奖 ) // GetConfigStructByType 获取相应配置的结构 @@ -137,6 +138,8 @@ func GetConfigStructByType(t int) (interface{}, interface{}) { return &ConfigActivitySuper{}, &[]ConfigActivitySuper{} case ReloadConfigTgRobot: return &ConfigTgRobot{}, &[]ConfigTgRobot{} + case ReloadConfigBetDraw: + return &ConfigActivityBetDraw{}, &[]ConfigActivityBetDraw{} default: return nil, nil } @@ -567,3 +570,15 @@ type ConfigTgRobot struct { func (c *ConfigTgRobot) TableName() string { return "config_tg_robot" } + +type ConfigActivityBetDraw struct { + ID int `gorm:"primarykey"` + Type int `gorm:"column:type;type:int(11);default:0;comment:转盘类型" web:"type"` + Cost int64 `gorm:"column:cost;type:int(11);default:0;comment:消耗幸运值" web:"cost"` + Reward int64 `gorm:"column:reward;type:bigint(20);comment:奖励" web:"reward"` + Weight int64 `gorm:"column:weight;type:bigint(20);comment:权重" web:"weight"` +} + +func (c *ConfigActivityBetDraw) TableName() string { + return "config_activity_betdraw" +} diff --git a/common/currency.go b/common/currency.go index dce9c92..7a4cc00 100644 --- a/common/currency.go +++ b/common/currency.go @@ -95,6 +95,7 @@ const ( CurrencyEventActivityWeekCard // 周卡 CurrencyEventActivitySlots // slots奖池 CurrencyEventActivitySuper // 超级1+2 + CurrencyEventActivityBetDraw // 下注抽奖 CurrencyEventAll CurrencyEventGM = 1000 // 后台修改货币 diff --git a/common/es.go b/common/es.go index 961407b..2432192 100644 --- a/common/es.go +++ b/common/es.go @@ -32,6 +32,7 @@ const ( ESIndexBackPddRecord = "back_pdd_record" ESIndexBackFeedback = "back_feedback" ESIndexBackActivity = "back_activity" + ESIndexBackBetDraw = "back_betdraw" // 下注抽奖 ) // GroupBuckets group聚合查询对象 @@ -329,3 +330,10 @@ type ESActivity struct { Type int // 1点击 2参与 Amount int64 // 赠送金额 } + +type ESActivityBetDraw struct { + UID int + Time int64 + Reward int64 + Type int // 转盘类型 +} diff --git a/modules/backend/migrate.go b/modules/backend/migrate.go index ee77c5e..0efab16 100644 --- a/modules/backend/migrate.go +++ b/modules/backend/migrate.go @@ -111,6 +111,8 @@ func MigrateDB() { new(common.ActivitySuperData), new(common.ShareActivityCode), new(common.ConfigTgRobot), + new(common.ConfigActivityBetDraw), + new(common.ActivityBetDrawData), ) if err != nil { panic("Migrate db fail") diff --git a/modules/backend/values/gm.go b/modules/backend/values/gm.go index ce7d473..9257f4a 100644 --- a/modules/backend/values/gm.go +++ b/modules/backend/values/gm.go @@ -158,6 +158,8 @@ func GetControlType(path string) int { return common.ReloadConfigActivitySuper case "tgRobot": return common.ReloadConfigTgRobot + case "betDraw": + return common.ReloadConfigBetDraw default: return 0 } diff --git a/modules/web/handler/activity.go b/modules/web/handler/activity.go index afdfecd..180ccb4 100644 --- a/modules/web/handler/activity.go +++ b/modules/web/handler/activity.go @@ -991,12 +991,17 @@ func GetSignNewInfo(uid int) (resp *values.ActivitySignInfoResp) { return } data := &common.ActivitySignData{UID: uid} - db.Mysql().Get(data) - if data.ID == 0 { - user, _ := call.GetUserXInfo(uid, "birth") - db.Mysql().Create(&common.ActivitySignData{UID: uid, Time: user.Birth}) - data.Time = user.Birth + if uid > 0 { + db.Mysql().Get(data) + if data.ID == 0 { + user, _ := call.GetUserXInfo(uid, "birth") + db.Mysql().Create(&common.ActivitySignData{UID: uid, Time: user.Birth}) + data.Time = user.Birth + } + } else { + data.Wheel = 1 } + list := call.GetConfigActivitySignByWheel(data.Wheel) if len(list) == 0 { return @@ -1743,3 +1748,110 @@ func ActivitySuperDraw(c *gin.Context) { }, } } + +func ActivityBetDrawInfo(c *gin.Context) { + a := app.NewApp(c) + defer func() { + a.Response() + }() + if !a.CheckActivityExpire(common.ActivityIDBetDraw) { + return + } + a.GetUID() + drawInfo := &common.ActivityBetDrawData{UID: a.UID} + db.Mysql().Get(drawInfo) + if drawInfo.ID == 0 { + db.Mysql().Create(drawInfo) + } + a.Data = &values.ActivityBetDrawInfoResp{ + List: call.GetConfigBetDraw(), + Lucky: drawInfo.Lucky, + } + call.UploadActivityData(a.UID, common.ActivityIDBetDraw, common.ActivityDataClick, 0) +} + +func ActivityBetDrawDraw(c *gin.Context) { + a := app.NewApp(c) + defer func() { + a.Response() + }() + req := values.ActivityBetDrawDrawReq{} + if !a.S(&req) { + return + } + if !a.CheckActivityExpire(common.ActivityIDBetDraw) { + return + } + configList, weightList := call.GetConfigBetDrawByType(req.WheelType) + if len(configList) == 0 { + a.Code = values.CodeRetry + return + } + conf := configList[0] + drawInfo := common.ActivityBetDrawData{UID: a.UID} + db.Mysql().Get(&drawInfo) + if drawInfo.Lucky < conf.Cost { + a.Code = values.CodeRetry + a.Msg = "lucky not enough" + return + } + // 计算权重 + idx := util.RandWeight(weightList) + if idx < 0 { + a.Code = values.CodeRetry + return + } + rewardConf := configList[idx] + reward := rewardConf.Reward + err := db.Mysql().Update(&drawInfo, map[string]interface{}{ + "lucky": gorm.Expr("lucky - ?", conf.Cost), + }) + if err != nil { + a.Code = values.CodeRetry + log.Error("ActivityBetDrawDraw err:%v", err) + return + } + if reward > 0 { + _, _ = call.UpdateCurrencyPro(&common.UpdateCurrency{ + CurrencyBalance: &common.CurrencyBalance{ + UID: a.UID, + Event: common.CurrencyEventActivityAppSpin, + Type: common.CurrencyINR, + Value: reward, + NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, reward), + }, + }) + } + + call.UploadActivityData(a.UID, common.ActivityIDBetDraw, common.ActivityDataJoin, reward) + db.ES().InsertToESGO(common.ESIndexBackBetDraw, common.ESActivityBetDraw{ + UID: a.UID, + Time: time.Now().Unix(), + Reward: reward, + Type: req.WheelType, + }) + a.Data = &values.ActivityBetDrawDrawResp{ + Reward: reward, + } +} + +func ActivityBetDrawHistory(c *gin.Context) { + a := app.NewApp(c) + defer func() { + a.Response() + }() + req := values.ActivityBetDrawRecordReq{} + if !a.S(&req) { + return + } + resp := new(values.ActivityBetDrawRecordResp) + if !a.CheckActivityExpire(common.ActivityIDBetDraw) { + return + } + q := elastic.NewBoolQuery() + q.Filter(elastic.NewTermQuery("Type", req.WheelType)) + _, _ = db.ES().QueryList(common.ESIndexBackBetDraw, req.Page-1, req.Num, q, &resp.RecordList, "Time", false) + q.Filter(elastic.NewTermQuery("UID", a.UID)) + _, _ = db.ES().QueryList(common.ESIndexBackBetDraw, 0, 5000, q, &resp.SelfList, "Time", false) + a.Data = resp +} diff --git a/modules/web/providers/gs/api.go b/modules/web/providers/gs/api.go index c26557f..9d58c8d 100644 --- a/modules/web/providers/gs/api.go +++ b/modules/web/providers/gs/api.go @@ -40,6 +40,8 @@ type GameListResp struct { } func GetGameList(provider int) *GameListResp { + API = APIRlease + AgentMap = AgentMapRelease opCode := AgentMap["E467"].OperatorCode sk := AgentMap["E467"].SecretKey req := &GameListReq{ diff --git a/modules/web/routers/routers_activity.go b/modules/web/routers/routers_activity.go index d4bea0b..9ded507 100644 --- a/modules/web/routers/routers_activity.go +++ b/modules/web/routers/routers_activity.go @@ -39,4 +39,8 @@ func activity(e *gin.RouterGroup) { e.POST("/activity/sevenDayBox/draw", handler.ActivitySevenDayBoxDraw) e.POST("/activity/super/info", handler.ActivitySuperInfo) e.POST("/activity/super/draw", handler.ActivitySuperDraw) + // 下注抽奖 + e.POST("/activity/betDraw/info", handler.ActivityBetDrawInfo) + e.POST("/activity/betDraw/draw", handler.ActivityBetDrawDraw) + e.POST("/activity/betDraw/record", handler.ActivityBetDrawHistory) } diff --git a/modules/web/values/activity.go b/modules/web/values/activity.go index 9721c5f..eeb76ec 100644 --- a/modules/web/values/activity.go +++ b/modules/web/values/activity.go @@ -255,3 +255,27 @@ type ActivitySuperDrawReq struct { type ActivitySuperDrawResp struct { Reward ActivitySuperOneReward } + +type ActivityBetDrawInfoResp struct { + List []*common.ConfigActivityBetDraw // 配置 + Lucky int64 // 幸运值 +} + +type ActivityBetDrawDrawReq struct { + WheelType int // 转盘类型 +} + +type ActivityBetDrawDrawResp struct { + Reward int64 // 奖励 +} + +type ActivityBetDrawRecordReq struct { + WheelType int // 转盘类型 + Page int + Num int +} + +type ActivityBetDrawRecordResp struct { + RecordList []*common.ESActivityBetDraw // 历史记录 + SelfList []*common.ESActivityBetDraw // 个人记录 +} diff --git a/util/time.go b/util/time.go index 77ef363..54e8f7f 100644 --- a/util/time.go +++ b/util/time.go @@ -1,6 +1,9 @@ package util -import "time" +import ( + "math/rand" + "time" +) func IsSameDay(t1 time.Time, t2 time.Time) bool { return t1.Year() == t2.Year() && t1.Month() == t2.Month() && t1.Day() == t2.Day() @@ -103,3 +106,19 @@ func IsSingleDay() bool { } return day%2 == 1 } + +func RandWeight(weightList []int64) int { + var weightCount int64 + for _, weight := range weightList { + weightCount += weight + } + sum := int64(0) + randVal := rand.Int63n(weightCount) + for idx, weight := range weightList { + sum += weight + if randVal < sum { + return idx + } + } + return -1 +}