转盘活动

pull/9/head
mofangmin 1 year ago
parent a28e9d90a4
commit a0743f2480
  1. 28
      call/config.go
  2. 11
      call/reload.go
  3. 3
      call/user.go
  4. 3
      cmd/build.sh
  5. 0
      cmd/fieldalignment.sh
  6. 48
      cmd/gener_code.sh
  7. 0
      cmd/reboot.sh
  8. 0
      cmd/start.sh
  9. 0
      cmd/stop.sh
  10. 0
      cmd/swagger.sh
  11. 11
      common/activity.go
  12. 15
      common/config.go
  13. 1
      common/currency.go
  14. 8
      common/es.go
  15. 2
      modules/backend/migrate.go
  16. 2
      modules/backend/values/gm.go
  17. 122
      modules/web/handler/activity.go
  18. 2
      modules/web/providers/gs/api.go
  19. 4
      modules/web/routers/routers_activity.go
  20. 24
      modules/web/values/activity.go
  21. 21
      util/time.go

@ -62,6 +62,7 @@ var (
configActivitySevenDayBox []*common.ConfigActivitySevenDayBox configActivitySevenDayBox []*common.ConfigActivitySevenDayBox
configActivitySuper []*common.ConfigActivitySuper configActivitySuper []*common.ConfigActivitySuper
configTgRobot []*common.ConfigTgRobot configTgRobot []*common.ConfigTgRobot
configBetDraw []*common.ConfigActivityBetDraw
) )
var ( var (
@ -1496,3 +1497,30 @@ func LoadConfigTgRobot() (err error) {
func GetConfigTgRobot() []*common.ConfigTgRobot { func GetConfigTgRobot() []*common.ConfigTgRobot {
return 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
}

@ -448,4 +448,15 @@ func CommonReload(c map[int][]func(*pb.ReloadGameConfig) error) {
return nil 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
}}
}
} }

@ -601,6 +601,9 @@ func UpdatePlayerProfile(data *common.ESGameData) error {
updates["day_bet"] = gorm.Expr("bet + ?", bet) updates["day_bet"] = gorm.Expr("bet + ?", bet)
} }
db.Mysql().Update(&common.PlayerData{UID: uid}, updates) 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 // 写入es

@ -1,4 +1,5 @@
#!/bin/bash #!/bin/bash
cd ..
set -e set -e
cd pb/proto cd pb/proto
./gener.sh ./gener.sh
@ -7,4 +8,4 @@ cd pb/proto
# go generate # go generate
cd ../.. cd ../..
#go build main.go #go build main.go
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o gameserver main.go CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o indiaprovider main.go

@ -0,0 +1,48 @@
#!/bin/bash
# 检查是否提供了参数
if [ $# -eq 0 ]; then
echo "请输入输入值。"
exit 1
fi
# 输入值
input_value=$1
# 生成 Go 代码
cat <<EOF >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 文件。"

@ -19,6 +19,7 @@ const (
ActivityIDLuckyShop // 幸运商店活动 ActivityIDLuckyShop // 幸运商店活动
ActivityIDSevenDayBox // 7日签到宝箱 ActivityIDSevenDayBox // 7日签到宝箱
ActivityIDSuper // 超级1+2 ActivityIDSuper // 超级1+2
ActivityIDBetDraw // 下注抽奖活动
) )
@ -490,3 +491,13 @@ type ActivitySuperData struct {
func (c *ActivitySuperData) TableName() string { func (c *ActivitySuperData) TableName() string {
return "activity_super_data" 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"
}

@ -50,6 +50,7 @@ const (
ReloadConfigActivitySevenDayBox // 7日宝箱活动 ReloadConfigActivitySevenDayBox // 7日宝箱活动
ReloadConfigActivitySuper // 超级1+2 ReloadConfigActivitySuper // 超级1+2
ReloadConfigTgRobot // tg机器人配置 ReloadConfigTgRobot // tg机器人配置
ReloadConfigBetDraw // 下注抽奖
) )
// GetConfigStructByType 获取相应配置的结构 // GetConfigStructByType 获取相应配置的结构
@ -137,6 +138,8 @@ func GetConfigStructByType(t int) (interface{}, interface{}) {
return &ConfigActivitySuper{}, &[]ConfigActivitySuper{} return &ConfigActivitySuper{}, &[]ConfigActivitySuper{}
case ReloadConfigTgRobot: case ReloadConfigTgRobot:
return &ConfigTgRobot{}, &[]ConfigTgRobot{} return &ConfigTgRobot{}, &[]ConfigTgRobot{}
case ReloadConfigBetDraw:
return &ConfigActivityBetDraw{}, &[]ConfigActivityBetDraw{}
default: default:
return nil, nil return nil, nil
} }
@ -567,3 +570,15 @@ type ConfigTgRobot struct {
func (c *ConfigTgRobot) TableName() string { func (c *ConfigTgRobot) TableName() string {
return "config_tg_robot" 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"
}

@ -95,6 +95,7 @@ const (
CurrencyEventActivityWeekCard // 周卡 CurrencyEventActivityWeekCard // 周卡
CurrencyEventActivitySlots // slots奖池 CurrencyEventActivitySlots // slots奖池
CurrencyEventActivitySuper // 超级1+2 CurrencyEventActivitySuper // 超级1+2
CurrencyEventActivityBetDraw // 下注抽奖
CurrencyEventAll CurrencyEventAll
CurrencyEventGM = 1000 // 后台修改货币 CurrencyEventGM = 1000 // 后台修改货币

@ -32,6 +32,7 @@ const (
ESIndexBackPddRecord = "back_pdd_record" ESIndexBackPddRecord = "back_pdd_record"
ESIndexBackFeedback = "back_feedback" ESIndexBackFeedback = "back_feedback"
ESIndexBackActivity = "back_activity" ESIndexBackActivity = "back_activity"
ESIndexBackBetDraw = "back_betdraw" // 下注抽奖
) )
// GroupBuckets group聚合查询对象 // GroupBuckets group聚合查询对象
@ -329,3 +330,10 @@ type ESActivity struct {
Type int // 1点击 2参与 Type int // 1点击 2参与
Amount int64 // 赠送金额 Amount int64 // 赠送金额
} }
type ESActivityBetDraw struct {
UID int
Time int64
Reward int64
Type int // 转盘类型
}

@ -111,6 +111,8 @@ func MigrateDB() {
new(common.ActivitySuperData), new(common.ActivitySuperData),
new(common.ShareActivityCode), new(common.ShareActivityCode),
new(common.ConfigTgRobot), new(common.ConfigTgRobot),
new(common.ConfigActivityBetDraw),
new(common.ActivityBetDrawData),
) )
if err != nil { if err != nil {
panic("Migrate db fail") panic("Migrate db fail")

@ -158,6 +158,8 @@ func GetControlType(path string) int {
return common.ReloadConfigActivitySuper return common.ReloadConfigActivitySuper
case "tgRobot": case "tgRobot":
return common.ReloadConfigTgRobot return common.ReloadConfigTgRobot
case "betDraw":
return common.ReloadConfigBetDraw
default: default:
return 0 return 0
} }

@ -991,12 +991,17 @@ func GetSignNewInfo(uid int) (resp *values.ActivitySignInfoResp) {
return return
} }
data := &common.ActivitySignData{UID: uid} data := &common.ActivitySignData{UID: uid}
db.Mysql().Get(data) if uid > 0 {
if data.ID == 0 { db.Mysql().Get(data)
user, _ := call.GetUserXInfo(uid, "birth") if data.ID == 0 {
db.Mysql().Create(&common.ActivitySignData{UID: uid, Time: user.Birth}) user, _ := call.GetUserXInfo(uid, "birth")
data.Time = user.Birth db.Mysql().Create(&common.ActivitySignData{UID: uid, Time: user.Birth})
data.Time = user.Birth
}
} else {
data.Wheel = 1
} }
list := call.GetConfigActivitySignByWheel(data.Wheel) list := call.GetConfigActivitySignByWheel(data.Wheel)
if len(list) == 0 { if len(list) == 0 {
return 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
}

@ -40,6 +40,8 @@ type GameListResp struct {
} }
func GetGameList(provider int) *GameListResp { func GetGameList(provider int) *GameListResp {
API = APIRlease
AgentMap = AgentMapRelease
opCode := AgentMap["E467"].OperatorCode opCode := AgentMap["E467"].OperatorCode
sk := AgentMap["E467"].SecretKey sk := AgentMap["E467"].SecretKey
req := &GameListReq{ req := &GameListReq{

@ -39,4 +39,8 @@ func activity(e *gin.RouterGroup) {
e.POST("/activity/sevenDayBox/draw", handler.ActivitySevenDayBoxDraw) e.POST("/activity/sevenDayBox/draw", handler.ActivitySevenDayBoxDraw)
e.POST("/activity/super/info", handler.ActivitySuperInfo) e.POST("/activity/super/info", handler.ActivitySuperInfo)
e.POST("/activity/super/draw", handler.ActivitySuperDraw) 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)
} }

@ -255,3 +255,27 @@ type ActivitySuperDrawReq struct {
type ActivitySuperDrawResp struct { type ActivitySuperDrawResp struct {
Reward ActivitySuperOneReward 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 // 个人记录
}

@ -1,6 +1,9 @@
package util package util
import "time" import (
"math/rand"
"time"
)
func IsSameDay(t1 time.Time, t2 time.Time) bool { func IsSameDay(t1 time.Time, t2 time.Time) bool {
return t1.Year() == t2.Year() && t1.Month() == t2.Month() && t1.Day() == t2.Day() return t1.Year() == t2.Year() && t1.Month() == t2.Month() && t1.Day() == t2.Day()
@ -103,3 +106,19 @@ func IsSingleDay() bool {
} }
return day%2 == 1 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
}

Loading…
Cancel
Save