From b556c5becf0c4e9d051f76454e31c1c27a3794ed Mon Sep 17 00:00:00 2001 From: mofangmin Date: Sat, 31 Aug 2024 10:49:03 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=BB=BA=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/backend/migrate.go | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/backend/migrate.go b/modules/backend/migrate.go index d0f1e57..dfcefc9 100644 --- a/modules/backend/migrate.go +++ b/modules/backend/migrate.go @@ -116,6 +116,7 @@ func MigrateDB() { new(common.ConfigActivityPopup), new(common.SheetBroadcastConfig), new(common.SheetNoticeConfig), + new(common.ConfigDiscountTicket), ) if err != nil { panic("Migrate db fail") From e44d0e1e63ee72d2e8c3d8b652032ce6c9db4bde Mon Sep 17 00:00:00 2001 From: mofangmin Date: Sat, 31 Aug 2024 10:49:56 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=A6=82=E7=8E=87=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- call/pay.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/call/pay.go b/call/pay.go index e22bbbd..e845a94 100644 --- a/call/pay.go +++ b/call/pay.go @@ -242,7 +242,7 @@ func RechargeCallback(r *common.RechargeOrder, success bool, payAccount, extra s if count > 0 { val := rand.Intn(count) log.Info("val:%v", val) - if val <= ticket.CurProb { + if val < ticket.CurProb { AddUserDiscountTicket(uid, ticket.DiscountAmount, ticket.RechargeAmount, -1, 0, true) SendMailWithContent(uid, SystemTitle, fmt.Sprintf(EmailDiscount, ticket.DiscountAmount/common.DecimalDigits, ticket.RechargeAmount/common.DecimalDigits)) } else if nextTicket.Id > 0 { From 0346c6479cdb3b6bd98b746d91b42405454605c5 Mon Sep 17 00:00:00 2001 From: mofangmin Date: Sat, 31 Aug 2024 14:52:34 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=8A=98=E6=89=A3=E5=88=B8=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/config.go | 2 ++ modules/backend/values/gm.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/common/config.go b/common/config.go index 7c640b5..8824ee1 100644 --- a/common/config.go +++ b/common/config.go @@ -148,6 +148,8 @@ func GetConfigStructByType(t int) (interface{}, interface{}) { return &ConfigActivityBetDraw{}, &[]ConfigActivityBetDraw{} case ReloadConfigActivityPopup: return &ConfigActivityPopup{}, &[]ConfigActivityPopup{} + case ReloadConfigDiscountTicket: + return &ConfigDiscountTicket{}, &[]ConfigDiscountTicket{} default: return nil, nil } diff --git a/modules/backend/values/gm.go b/modules/backend/values/gm.go index 2fc22b8..eac185e 100644 --- a/modules/backend/values/gm.go +++ b/modules/backend/values/gm.go @@ -162,6 +162,8 @@ func GetControlType(path string) int { return common.ReloadConfigBetDraw case "activityPopup": return common.ReloadConfigActivityPopup + case "discountTicket": + return common.ReloadConfigDiscountTicket default: return 0 } From 6abd764baf47ff904cdc543d445e82d1253f97ce Mon Sep 17 00:00:00 2001 From: mofangmin Date: Mon, 2 Sep 2024 17:33:32 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=81=87Jili=E3=80=81?= =?UTF-8?q?=E5=81=87PG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- call/config.go | 7 +- common/provider.go | 1 + modules/web/handler/game.go | 14 ++- modules/web/module.go | 3 +- modules/web/providers/all/all.go | 3 + modules/web/providers/jili2/api.go | 144 +++++++++++++++++++++++++ modules/web/providers/jili2/base.go | 72 +++++++++++++ modules/web/providers/jili2/handler.go | 143 ++++++++++++++++++++++++ modules/web/providers/jili2/sign.go | 14 +++ modules/web/providers/jili2/values.go | 24 +++++ modules/web/providers/pg2/api.go | 4 +- modules/web/providers/pg2/base.go | 26 +---- modules/web/providers/pg2/values.go | 43 ++------ 13 files changed, 427 insertions(+), 71 deletions(-) create mode 100644 modules/web/providers/jili2/api.go create mode 100644 modules/web/providers/jili2/base.go create mode 100644 modules/web/providers/jili2/handler.go create mode 100644 modules/web/providers/jili2/sign.go create mode 100644 modules/web/providers/jili2/values.go diff --git a/call/config.go b/call/config.go index e688618..b5d1f7c 100644 --- a/call/config.go +++ b/call/config.go @@ -562,7 +562,7 @@ func LoadGames() (err error) { for _, v := range tmplist { for _, k := range providers { if v.GameProvider == k.ProviderID { - if v.GameProvider == common.ProviderPG2 || k.Open == 1 { // 特殊过滤 + if v.GameProvider == common.ProviderPG2 || v.GameProvider == common.ProviderJiLi2 || k.Open == 1 { // 特殊过滤 list = append(list, v) } break @@ -625,6 +625,9 @@ func GetConfigGameProviderAll() []*common.ConfigGameProvider { func GetConfigGameProviderAllOpen() []*common.ConfigGameProvider { ret := []*common.ConfigGameProvider{} for _, v := range configGameProvider { + if v.ProviderID == common.ProviderPG2 || v.ProviderID == common.ProviderJiLi2 { + continue + } if v.Show == 2 { continue } @@ -725,7 +728,7 @@ func GetConfigGameList(num int, cond ...int) []*common.ConfigGameList { continue } } - if v.GameProvider == common.ProviderPG2 { + if v.GameProvider == common.ProviderPG2 || v.GameProvider == common.ProviderJiLi2 { continue } ret = append(ret, v) diff --git a/common/provider.go b/common/provider.go index 188be5e..c66577a 100644 --- a/common/provider.go +++ b/common/provider.go @@ -36,6 +36,7 @@ const ( ProviderCMD368 ProviderSBO ProviderPG2 + ProviderJiLi2 ProviderAll ) diff --git a/modules/web/handler/game.go b/modules/web/handler/game.go index 4703ef4..cbbe92f 100644 --- a/modules/web/handler/game.go +++ b/modules/web/handler/game.go @@ -2,7 +2,6 @@ package handler import ( "fmt" - "math/rand" "server/call" "server/common" "server/db" @@ -84,16 +83,21 @@ func EnterGame(c *gin.Context) { a.Data = resp // step:特殊逻辑处理 if req.Provider == common.ProviderPGSoft { - a.Code = values.CodeParam - a.Msg = "Under Maintenance,please try later." - return provider = call.GetConfigGameProvider(common.ProviderPG2) game := call.GetConfigGameListByID(common.ProviderPG2, req.GameID) - if game != nil && game.Open == 1 && rand.Intn(100) < 100 { + if game != nil && game.Open == 1 { req.Provider = common.ProviderPG2 resp.Method = provider.Method } } + if req.Provider == common.ProviderJili { + provider = call.GetConfigGameProvider(common.ProviderJiLi2) + game := call.GetConfigGameListByID(common.ProviderJiLi2, req.GameID) + if game != nil && game.Open == 1 { + req.Provider = common.ProviderJiLi2 + resp.Method = provider.Method + } + } if req.IsDemo { log.Debug("player enter demo game %+v", *req) enter := &base.EnterGameReq{ diff --git a/modules/web/module.go b/modules/web/module.go index 3f5969d..396ddc2 100644 --- a/modules/web/module.go +++ b/modules/web/module.go @@ -37,17 +37,18 @@ func (w *Web) GetType() string { // 很关键,需要与配置文件中的Module配置对应 return "web" } + func (w *Web) Version() string { // 可以在监控时了解代码版本 return "1.0.0" } + func (w *Web) OnInit(app module.App, settings *conf.ModuleSettings) { w.BaseModule.OnInit(w, app, settings) db.InitDB(&rdb.RedisClient{}, &edb.EsClient{}, &mdb.MysqlClient{}) log.Info("[%v]module init finish, config:%+v", w.GetType(), config.GetConfig().Web) log.Info("[%v]module init finish, base:%+v", w.GetType(), config.GetBase()) - // 自动初始化数据库 // MigrateDB() call.NewCaller(w) diff --git a/modules/web/providers/all/all.go b/modules/web/providers/all/all.go index a809053..e85b9c1 100644 --- a/modules/web/providers/all/all.go +++ b/modules/web/providers/all/all.go @@ -7,6 +7,7 @@ import ( "server/db" "server/modules/web/providers/base" "server/modules/web/providers/gs" + "server/modules/web/providers/jili2" "server/modules/web/providers/pg2" "server/modules/web/providers/pgsoft" "server/modules/web/providers/tada" @@ -49,6 +50,7 @@ type AllProvider struct { CMD368 func(b *base.Base) SBO func(b *base.Base) PG2 func(b *base.Base) + Jili2 func(b *base.Base) } var All = &AllProvider{} @@ -90,6 +92,7 @@ func initAll() { All.CMD368 = gs.NewSub All.SBO = gs.NewSub All.PG2 = pg2.NewSub + All.Jili2 = jili2.NewSub } func InitRouter(r *gin.RouterGroup) { diff --git a/modules/web/providers/jili2/api.go b/modules/web/providers/jili2/api.go new file mode 100644 index 0000000..d29c7f0 --- /dev/null +++ b/modules/web/providers/jili2/api.go @@ -0,0 +1,144 @@ +package jili2 + +import ( + "fmt" + "server/common" + "server/db" + "server/util" + "strconv" + "time" +) + +const ( + ErrCodeSuccess = 0 + ErrCodePlayerNotFound = 2000 // 玩家不存在 + ErrCodePlayerToken = 2001 // Token错误 + ErrCodeInvalidGameID = 102 // 无效的GameDI + ErrCodeInternalError = 3000 // 内部错误 + ErrCodeInsufficientBal = 2010 // 投注失败,如余额不足 +) + +type GameListResponse struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data GameListData `json:"data"` +} + +type GameListData struct { + GameList []GameListItem `json:"glist"` +} + +type GameListItem struct { + Icon string `json:"icon"` + MapID string `json:"mapid"` + Name string `json:"name"` + Site string `json:"site"` + GameID string `json:"gameid"` +} + +// EnterGameRequest 进入游戏 +type EnterGameRequest struct { + Uname string `json:"uname"` + GameID string `json:"gameid"` + Token string `json:"token,omitempty"` + Lang string `json:"lang,omitempty"` + Nick string `json:"nick,omitempty"` +} + +type EnterGameResponse struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data struct { + GameURL string `json:"gameurl"` + } `json:"data"` +} + +// PlaceBetRequest 下注 +type PlaceBetRequest struct { + Uname string `json:"uname"` + Token string `json:"token"` + BetID string `json:"betid"` + SessionID string `json:"sessionid"` + GameID string `json:"gameid"` + Bet float64 `json:"bet"` + Award float64 `json:"award"` + IsEndRound bool `json:"is_end_round"` + Ctime int64 `json:"ctime"` +} + +type PlaceBetResponse struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data struct { + Uname string `json:"uname"` + BetID string `json:"betid"` + Balance float64 `json:"balance"` + } `json:"data"` +} + +type VerifySessionReq struct { + Uname string `json:"uname"` + Token string `json:"token"` +} + +type VerifySessionResp struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data struct { + Uname string `json:"uname"` + Balance float64 `json:"balance"` + } `json:"data"` +} + +type GetBalanceRequest struct { + GameId string `json:"gameid"` + Uname string `json:"uname"` +} + +type GetBalanceResponse struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data struct { + Uname string `json:"uname"` + Balance float64 `json:"balance"` + } `json:"data"` +} + +func GetGameList() { + API = APITest + AgentMap = AgentMapTest + url := fmt.Sprintf("%s/api/game/loadlist", APITest) + mchid := AgentMap.MchId + key := AgentMap.Key + timestamp := time.Now().Unix() + headers := map[string]string{ + "X-Atgame-Mchid": mchid, + "X-Atgame-Timestamp": strconv.FormatInt(timestamp, 10), + "Content-Type": "application/json;charset=UTF-8", + } + type empty struct{} + var e empty + // Generate sign + emptyBody := "{}" + sign := GenerateSign(emptyBody, timestamp, key) + headers["X-Atgame-Sign"] = sign + + var response GameListResponse + err := util.HttpPost(url, e, &response, headers) + if err != nil { + return + } + + var gameList []*common.ConfigGameList + for _, item := range response.Data.GameList { + id, _ := strconv.Atoi(item.MapID) + gameList = append(gameList, &common.ConfigGameList{ + GameProvider: common.ProviderJiLi2, + GameID: id, + GameCode: item.GameID, + Icon: item.Icon, + Name: item.Name, + }) + } + db.Mysql().Create(gameList) +} diff --git a/modules/web/providers/jili2/base.go b/modules/web/providers/jili2/base.go new file mode 100644 index 0000000..b59169d --- /dev/null +++ b/modules/web/providers/jili2/base.go @@ -0,0 +1,72 @@ +package jili2 + +import ( + "encoding/json" + "fmt" + "server/call" + "server/config" + "server/modules/web/providers/base" + utils "server/util" + "strconv" + "time" + + "github.com/liangdas/mqant/log" +) + +type Sub struct { + Base *base.Base +} + +func NewSub(base *base.Base) { + base.Sub = &Sub{Base: base} + base.SubInitRouter = JiLi +} + +func (s *Sub) Init() { + API = APITest + AgentMap = AgentMapTest + if config.GetBase().Release { + API = APIRlease + AgentMap = AgentMapRelease + } +} + +func (s *Sub) EnterGame() string { + url := fmt.Sprintf("%s/api/usr/ingame", API) + timestamp := time.Now().Unix() + uid := s.Base.EnterGameReq.UID + token := s.Base.EnterGameReq.Token + providerID := s.Base.EnterGameReq.ProviderID + gameID := s.Base.EnterGameReq.GameID + mchid := AgentMap.MchId + key := AgentMap.Key + headers := map[string]string{ + "X-Atgame-Mchid": mchid, + "X-Atgame-Timestamp": strconv.FormatInt(timestamp, 10), + "Content-Type": "application/json;charset=UTF-8", + } + // Generate sign + game := call.GetConfigGameListByID(providerID, gameID) + if game == nil { + return "" + } + request := EnterGameRequest{ + Uname: fmt.Sprintf("%d", uid), + GameID: game.GameCode, + Token: token, + Lang: Lang, + Nick: "", + } + body, _ := json.Marshal(request) + sign := GenerateSign(string(body), timestamp, key) + headers["X-Atgame-Sign"] = sign + // Decode response + var response EnterGameResponse + err := utils.HttpPost(url, request, &response, headers) + if err != nil { + log.Error("err:%v", err) + return "" + } + + return response.Data.GameURL +} diff --git a/modules/web/providers/jili2/handler.go b/modules/web/providers/jili2/handler.go new file mode 100644 index 0000000..99ef222 --- /dev/null +++ b/modules/web/providers/jili2/handler.go @@ -0,0 +1,143 @@ +package jili2 + +import ( + "server/call" + "server/common" + "server/db" + "server/modules/web/app" + "server/modules/web/providers/base" + "server/util" + "strconv" + "time" + + "github.com/gin-gonic/gin" + "github.com/liangdas/mqant/log" +) + +func JiLi(e *gin.RouterGroup) { + e.POST("/VerifySession", VerifySession) + e.POST("/Cash/Get", GetPlayerBalance) + e.POST("/Cash/Bet", PlaceBet) +} + +func GetGameID(providerID int, gameCode string) int { + game := call.GetConfigGameListByCode(providerID, gameCode) + if game != nil { + return game.GameID + } + return 0 +} + +func VerifySession(c *gin.Context) { + a := app.NewApp(c) + defer func() { + a.ResponseB() + }() + req := &VerifySessionReq{} + resp := &VerifySessionResp{} + a.RetData = resp + if !a.SB(req) { + resp.Code = ErrCodeInternalError + return + } + log.Debug("VerifySession req:%+v", req) + uid, err := strconv.Atoi(req.Uname) + if err != nil { + log.Error("err:%v", err) + resp.Code = ErrCodePlayerNotFound + return + } + + currency, err := db.Redis().GetInt(common.GetRedisKeyGameCurrency(uid)) + if err != nil { + log.Error("err:%v", err) + resp.Code = ErrCodeInternalError + return + } + + resp.Data.Balance = call.GetUserCurrencyFloat(uid, common.CurrencyType(currency), 2) + + a.Data = resp +} + +func GetPlayerBalance(c *gin.Context) { + a := app.NewApp(c) + defer func() { + a.ResponseB() + }() + req := &GetBalanceRequest{} + resp := &GetBalanceResponse{} + a.RetData = resp + if !a.SB(req) { + resp.Code = ErrCodeInternalError + return + } + log.Debug("GetPlayerBalance req:%+v", req) + uid, err := strconv.Atoi(req.Uname) + if err != nil { + log.Error("err:%v", err) + resp.Code = ErrCodePlayerNotFound + return + } + + currency, err := db.Redis().GetInt(common.GetRedisKeyGameCurrency(uid)) + if err != nil { + log.Error("err:%v", err) + resp.Code = ErrCodeInternalError + return + } + resp.Data.Uname = req.Uname + resp.Data.Balance = call.GetUserCurrencyFloat(uid, common.CurrencyType(currency), 2) + a.Data = resp +} + +func PlaceBet(c *gin.Context) { + a := app.NewApp(c) + defer func() { + a.ResponseB() + }() + req := &PlaceBetRequest{} + resp := &PlaceBetResponse{} + a.RetData = resp + if !a.SB(req) { + resp.Code = ErrCodeInternalError + return + } + log.Debug("PlaceBet:%+v", req) + // 验证token + uid, _ := db.Redis().GetInt(common.GetRedisKeyToken(req.Token)) + if uid == 0 { + resp.Code = ErrCodePlayerNotFound + return + } + + provider := call.GetConfigGameProvider(common.ProviderJiLi2) + now := time.Now().Unix() + betReq := &base.BetReq{ + UID: uid, + CurrencyType: common.CurrencyINR, + BetAmount: int64(req.Bet * common.DecimalDigits), + TurnOver: int64(req.Bet * common.DecimalDigits), + SettleAmount: int64(req.Award * common.DecimalDigits), + SessionType: common.SessionTypeSettle, + GameID: GetGameID(common.ProviderJiLi2, req.GameID), + GameName: req.GameID, + Provider: provider, + BetID: req.BetID, + SessionID: req.SessionID, + Time: now, + } + betResp := base.SessionBet(betReq) + if betResp.Code != base.CodeOk { + resp.Code = ErrCodeInternalError + if betResp.Code == base.CodeAccepted { + resp.Code = ErrCodeInternalError + } else if betResp.Code == base.CodeNotEnoughAmount { + resp.Code = ErrCodeInsufficientBal + } + return + } + resp.Data.Balance = util.Decimal(float64(betResp.Balance)/common.DecimalDigits, 2) + + a.Data = resp +} diff --git a/modules/web/providers/jili2/sign.go b/modules/web/providers/jili2/sign.go new file mode 100644 index 0000000..19f44f6 --- /dev/null +++ b/modules/web/providers/jili2/sign.go @@ -0,0 +1,14 @@ +package jili2 + +import ( + "crypto/md5" + "encoding/hex" + "strconv" + "strings" +) + +func GenerateSign(body string, timestamp int64, key string) string { + data := body + strconv.FormatInt(timestamp, 10) + key + hash := md5.Sum([]byte(data)) + return strings.ToUpper(hex.EncodeToString(hash[:])) +} diff --git a/modules/web/providers/jili2/values.go b/modules/web/providers/jili2/values.go new file mode 100644 index 0000000..f566899 --- /dev/null +++ b/modules/web/providers/jili2/values.go @@ -0,0 +1,24 @@ +package jili2 + +const ( + APIRlease = "https://openapi-br.atgameapp.com/pub" + APITest = "https://api.jgameworks.com" + LaunchGameURL = "/api/usr/ingame" + GetGameListURL = "/api/game/loadlist" + Lang = "en" +) + +type Agent struct { + MchId string `json:"mch_id"` + Key string `json:"key"` +} + +var ( + API = "" + AgentMap Agent + AgentMapTest = Agent{ + MchId: "10017", + Key: "C54E411A1B89C54BFB977EBAA7BB1D39", + } + AgentMapRelease = Agent{} +) diff --git a/modules/web/providers/pg2/api.go b/modules/web/providers/pg2/api.go index 6491e49..322f948 100644 --- a/modules/web/providers/pg2/api.go +++ b/modules/web/providers/pg2/api.go @@ -108,8 +108,8 @@ func GetGameList() { API = APITest AgentMap = AgentMapTest url := fmt.Sprintf("%s/api/game/loadlist", APITest) - mchid := "" - key := "" + mchid := AgentMap.MchId + key := AgentMap.Key timestamp := time.Now().Unix() headers := map[string]string{ "X-Atgame-Mchid": mchid, diff --git a/modules/web/providers/pg2/base.go b/modules/web/providers/pg2/base.go index ecaaa06..f131189 100644 --- a/modules/web/providers/pg2/base.go +++ b/modules/web/providers/pg2/base.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" "server/call" - "server/common" "server/config" "server/modules/web/providers/base" utils "server/util" @@ -39,29 +38,8 @@ func (s *Sub) EnterGame() string { token := s.Base.EnterGameReq.Token providerID := s.Base.EnterGameReq.ProviderID gameID := s.Base.EnterGameReq.GameID - /** - 玩家再次点击游戏,根据玩家盈利倍数(盈利倍数=(玩家余额+已提现金额)/玩家总充值金额),调取假PG不同档位的接口: - 1、盈利倍数≤1,进入90%档位 - 2、盈利倍数1-7,进入80%档位 - 3、盈利倍数7-10,进入60%档位 - 4、盈利倍数≥10,进入30%档位 - */ - rechargeInfo := call.GetRechargeInfo(uid) - cash := call.GetUserCurrency(uid, common.CurrencyINR) - earnBet := (rechargeInfo.TotalWithdraw + cash) / rechargeInfo.TotalRecharge - log.Info("uid:%d,earnBet:%d", uid, earnBet) - mchid := "" - key := "" - if earnBet <= 7 { - mchid = AgentMap[80].MchId - key = AgentMap[80].Key - } else if earnBet <= 10 { - mchid = AgentMap[60].MchId - key = AgentMap[60].Key - } else { - mchid = AgentMap[30].MchId - key = AgentMap[30].Key - } + mchid := AgentMap.MchId + key := AgentMap.Key headers := map[string]string{ "X-Atgame-Mchid": mchid, "X-Atgame-Timestamp": strconv.FormatInt(timestamp, 10), diff --git a/modules/web/providers/pg2/values.go b/modules/web/providers/pg2/values.go index f7b1957..227af42 100644 --- a/modules/web/providers/pg2/values.go +++ b/modules/web/providers/pg2/values.go @@ -5,7 +5,7 @@ const ( APITest = "https://openapi.windygame.net/demo" LaunchGameURL = "/api/usr/ingame" GetGameListURL = "/api/game/loadlist" - Lang = "pt" + Lang = "en" ) type Agent struct { @@ -15,41 +15,10 @@ type Agent struct { var ( API = "" - AgentMap map[int]Agent - AgentMapTest = map[int]Agent{ - 90: { - "10055", - "170779CCC5E9FE29DBB3F5FEDBB304A0", - }, - 80: { - "10055", - "170779CCC5E9FE29DBB3F5FEDBB304A0", - }, - 60: { - "10055", - "170779CCC5E9FE29DBB3F5FEDBB304A0", - }, - 30: { - "10055", - "170779CCC5E9FE29DBB3F5FEDBB304A0", - }, - } - AgentMapRelease = map[int]Agent{ - 90: { - "10270", - "ECFEF01A0842C8F7BC9A4EFC089D7E6D", - }, - 80: { - "10269", - "0A18B714E125D9C99ABC41E7124D1B15", - }, - 60: { - "10268", - "AC846D0F6C83C2F65A7B07AB530DB978", - }, - 30: { - "10267", - "30C9928DC1240B507889D4768A186139", - }, + AgentMap Agent + AgentMapTest = Agent{ + "10055", + "170779CCC5E9FE29DBB3F5FEDBB304A0", } + AgentMapRelease = Agent{} ) From 87bdf82aa6d997031220fdf09ad083398630290b Mon Sep 17 00:00:00 2001 From: mofangmin Date: Tue, 3 Sep 2024 17:54:39 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E6=8E=A5=E5=85=A5pg=E5=92=8Cjili,rtp?= =?UTF-8?q?=E7=AD=96=E7=95=A5=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- call/config.go | 25 ++++++++ call/reload.go | 10 ++++ call/user.go | 26 +++++++++ common/activity.go | 13 +++++ common/config.go | 11 ++-- common/player.go | 10 ++++ .../backend/handler/guser/editGameUserGold.go | 21 +++++++ .../backend/handler/guser/getGameUserInfo.go | 5 ++ modules/backend/migrate.go | 2 + modules/backend/routers/routers_guser.go | 1 + modules/backend/values/gameuser.go | 6 ++ modules/backend/values/gm.go | 2 + modules/web/providers/base/base.go | 58 +++++++++++-------- modules/web/providers/jili2/api.go | 11 ++-- modules/web/providers/jili2/base.go | 13 +++-- modules/web/providers/jili2/handler.go | 48 ++++++++------- modules/web/providers/pg2/api.go | 11 ++-- modules/web/providers/pg2/base.go | 13 +++-- modules/web/providers/pg2/handler.go | 48 ++++++++------- modules/web/providers/pg2/values.go | 4 +- 20 files changed, 243 insertions(+), 95 deletions(-) diff --git a/call/config.go b/call/config.go index b5d1f7c..8c605fa 100644 --- a/call/config.go +++ b/call/config.go @@ -65,6 +65,7 @@ var ( configBetDraw []*common.ConfigActivityBetDraw configActivityPopup []*common.ConfigActivityPopup configDiscountTicket []common.ConfigDiscountTicket + configRtp []common.ConfigRtp // 客服 configCustomerRobot []*common.ConfigCustomerRobot customerOrderLabel []*common.CustomerOrderLabel @@ -1586,3 +1587,27 @@ func GetConfigDiscountTicketByAmount(amount int64) (ret common.ConfigDiscountTic } return } + +func LoadConfigRTP() (err error) { + var list []common.ConfigRtp + if _, err = db.Mysql().QueryAll("", "", &common.ConfigRtp{}, &list); err != nil { + log.Error("err:%v", err) + return err + } + configRtp = list + return nil +} + +func GetConfigRTP() []common.ConfigRtp { + return configRtp +} + +// GetConfigRTPByAmount +func GetConfigRTPByAmount(amount int64) (ret common.ConfigRtp) { + for _, item := range configRtp { + if amount >= item.MinRecharge && amount <= item.MinRecharge { + return item + } + } + return +} diff --git a/call/reload.go b/call/reload.go index c63050d..40933cc 100644 --- a/call/reload.go +++ b/call/reload.go @@ -476,6 +476,16 @@ func CommonReload(c map[int][]func(*pb.ReloadGameConfig) error) { return nil }} } + + if _, ok := c[common.ReloadConfigRTP]; !ok { + c[common.ReloadConfigRTP] = []func(*pb.ReloadGameConfig) error{func(rgc *pb.ReloadGameConfig) error { + if err := LoadConfigRTP(); err != nil { + log.Error("error : [%s]", err.Error()) + return err + } + return nil + }} + } // 客服 if _, ok := c[common.ReloadConfigCustomerRobot]; !ok { c[common.ReloadConfigCustomerRobot] = []func(*pb.ReloadGameConfig) error{func(rgc *pb.ReloadGameConfig) error { diff --git a/call/user.go b/call/user.go index 8300268..106c415 100644 --- a/call/user.go +++ b/call/user.go @@ -784,3 +784,29 @@ func GetPlayerFavoriteList(uid, num int) (gameList []*common.ConfigGameList) { } return } + +func GetUserRtp(uid int) *common.PlayerRtpData { + data := &common.PlayerRtpData{Uid: uid} + db.Mysql().Get(&data) + return data +} + +func GetRtpControl(uid int) int { + rechargeInfo := GetRechargeInfo(uid) + withdrawRechargePer := (rechargeInfo.TotalWithdraw + rechargeInfo.WithdrawingCash) / rechargeInfo.TotalRecharge + rtpConf := GetConfigRTPByAmount(rechargeInfo.TotalRecharge) + rtpData := GetUserRtp(uid) + // 1.优先玩家配置 + // 2.个控 + // 3.大盘 + rtp := GetConfigPlatform().Rtp + if rtpData.Id > 0 { + rtp = rtpData.Rtp + } + if rtp > 0 && rtpConf.Id > 0 { + if withdrawRechargePer >= int64(rtpConf.EnterPer) && withdrawRechargePer <= int64(rtpConf.ExitPer) { + rtp = rtpConf.Rtp + } + } + return rtp +} diff --git a/common/activity.go b/common/activity.go index 69ae928..b1af671 100644 --- a/common/activity.go +++ b/common/activity.go @@ -561,3 +561,16 @@ type ConfigDiscountTicket struct { func (m *ConfigDiscountTicket) TableName() string { return "config_discount_ticket" } + +type ConfigRtp struct { + Id int `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT" json:"id"` + MinRecharge int64 `gorm:"column:min_recharge;type:bigint(20);comment:最小充值" json:"min_recharge"` + MaxRecharge int64 `gorm:"column:max_recharge;type:bigint(20);comment:最小充值" json:"max_recharge"` + Rtp int `gorm:"column:rtp;type:int(11);comment:rtp" json:"rtp"` + EnterPer int `gorm:"column:enter_per;type:int(11);comment:进入提存比" json:"enter_per"` + ExitPer int `gorm:"column:exit_per;type:int(11);comment:退出提存比" json:"exit_per"` +} + +func (m *ConfigRtp) TableName() string { + return "config_rtp" +} diff --git a/common/config.go b/common/config.go index 8824ee1..eab6482 100644 --- a/common/config.go +++ b/common/config.go @@ -53,10 +53,10 @@ const ( ReloadConfigBetDraw // 下注抽奖 ReloadConfigActivityPopup // 活动弹窗 ReloadConfigDiscountTicket // 折扣券 - - ReloadConfigCustomerRobot // 客服系统机器人配置 - ReloadConfigCustomerLabel // 客服系统订单标签 - ReloadConfigCustomer // 客服系统订单标签 + ReloadConfigRTP // rtp配置 + ReloadConfigCustomerRobot // 客服系统机器人配置 + ReloadConfigCustomerLabel // 客服系统订单标签 + ReloadConfigCustomer // 客服系统订单标签 ) // GetConfigStructByType 获取相应配置的结构 @@ -150,6 +150,8 @@ func GetConfigStructByType(t int) (interface{}, interface{}) { return &ConfigActivityPopup{}, &[]ConfigActivityPopup{} case ReloadConfigDiscountTicket: return &ConfigDiscountTicket{}, &[]ConfigDiscountTicket{} + case ReloadConfigRTP: + return &ConfigRtp{}, &[]ConfigRtp{} default: return nil, nil } @@ -176,6 +178,7 @@ type ConfigPlatform struct { PayTips string `gorm:"column:pay_tips;type:varchar(256);default:'';comment:充值提示语" json:"PayTips" web:"pay_tips"` WithdrawTips string `gorm:"column:withdraw_tips;type:varchar(256);default:'';comment:tx提示语" json:"WithdrawTips" web:"withdraw_tips"` BlackList int `gorm:"column:black_list;type:int(11);default:0;comment:是否开启黑名单 0不开 1开启" json:"BlackList" web:"black_list"` + Rtp int `gorm:"column:rtp;type:int(11);default:0;comment:平台RTP" json:"Rtp" web:"rtp"` } func (c *ConfigPlatform) TableName() string { diff --git a/common/player.go b/common/player.go index 23de945..8b65cd7 100644 --- a/common/player.go +++ b/common/player.go @@ -311,3 +311,13 @@ type PlayerPayData struct { func (c *PlayerPayData) TableName() string { return "player_pay_data" } + +type PlayerRtpData struct { + Id int `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT" json:"id"` + Uid int `gorm:"column:uid;type:int(11)" json:"uid"` + Rtp int `gorm:"column:rtp;type:int(11)" json:"rtp"` +} + +func (c *PlayerRtpData) TableName() string { + return "player_rtp_data" +} diff --git a/modules/backend/handler/guser/editGameUserGold.go b/modules/backend/handler/guser/editGameUserGold.go index d86d7b9..20cb6f3 100644 --- a/modules/backend/handler/guser/editGameUserGold.go +++ b/modules/backend/handler/guser/editGameUserGold.go @@ -4,6 +4,7 @@ import ( "fmt" "server/call" "server/common" + "server/db" "server/modules/backend/app" "server/modules/backend/values" @@ -40,3 +41,23 @@ func EditGameUserGold(c *gin.Context) { } a.RecordEdit(values.PowerGUser, fmt.Sprintf("修改玩家%v金币:%v", req.UID, req.Amount)) } + +func EditGameUserRtp(c *gin.Context) { + a := app.NewApp(c) + defer func() { + a.Response() + }() + req := new(values.EditGameUserRtpReq) + if !a.S(req) { + return + } + err := db.Mysql().Update(&common.PlayerRtpData{Uid: req.UID}, map[string]interface{}{ + "rtp": req.Val, + }) + if err != nil { + a.Code = values.CodeRetry + a.Msg = "modify rtp error" + } + + a.RecordEdit(values.PowerGUser, fmt.Sprintf("修改玩家%vRtp:%v", req.UID, req.Val)) +} diff --git a/modules/backend/handler/guser/getGameUserInfo.go b/modules/backend/handler/guser/getGameUserInfo.go index 2d6aa73..f8437e9 100644 --- a/modules/backend/handler/guser/getGameUserInfo.go +++ b/modules/backend/handler/guser/getGameUserInfo.go @@ -93,6 +93,11 @@ func GetGameUserInfo(c *gin.Context) { // usdtInfo := call.GetPlayerRechargeInfoByCurrency(uid, common.CurrencyUSDT) resp.RechargeBrl = brlInfo.TotalRecharge resp.WithdrawBrl = brlInfo.TotalWithdraw + rtp := call.GetUserRtp(uid) + if rtp.Id == 0 { + db.Mysql().Create(rtp) + } + resp.Rtp = rtp.Rtp // resp.RechargeUsdt = usdtInfo.TotalRecharge // resp.WithdrawUsdt = usdtInfo.TotoalWithdraw diff --git a/modules/backend/migrate.go b/modules/backend/migrate.go index dfcefc9..3ea94ab 100644 --- a/modules/backend/migrate.go +++ b/modules/backend/migrate.go @@ -117,6 +117,8 @@ func MigrateDB() { new(common.SheetBroadcastConfig), new(common.SheetNoticeConfig), new(common.ConfigDiscountTicket), + new(common.ConfigRtp), + new(common.PlayerRtpData), ) if err != nil { panic("Migrate db fail") diff --git a/modules/backend/routers/routers_guser.go b/modules/backend/routers/routers_guser.go index bed36fe..600876a 100644 --- a/modules/backend/routers/routers_guser.go +++ b/modules/backend/routers/routers_guser.go @@ -19,6 +19,7 @@ func guser(e *gin.Engine) { e.POST("/guser/controlBalance", handler.GetGameUserControlBalance) // e.POST("/guser/controlCardData", handler.ControlCardData) e.POST("/guser/editGold", handler.EditGameUserGold) + e.POST("/guser/editRtp", handler.EditGameUserRtp) e.POST("/guser/editStatus", handler.EditGameUserStatus) e.POST("/guser/addUserTag", handler.AddUserTag) e.POST("/guser/deleteUserTag", handler.AddUserTag) diff --git a/modules/backend/values/gameuser.go b/modules/backend/values/gameuser.go index 8606ee8..58f5320 100644 --- a/modules/backend/values/gameuser.go +++ b/modules/backend/values/gameuser.go @@ -137,6 +137,7 @@ type GetGameUserInfoResp struct { OutputData map[string]string Gpsadid string SubAccount []int + Rtp int } type UserGameInfo struct { @@ -415,6 +416,11 @@ type EditGameUserGoldReq struct { Amount int64 `json:"Amount" binding:"required"` } +type EditGameUserRtpReq struct { + UID int `json:"UID" binding:"required"` + Val int +} + // EditGameUserGoldReq 修改玩家状态,解封/封禁 // UID 玩家uid // Status 修改的状态 1正常 2封禁 diff --git a/modules/backend/values/gm.go b/modules/backend/values/gm.go index eac185e..d11f128 100644 --- a/modules/backend/values/gm.go +++ b/modules/backend/values/gm.go @@ -164,6 +164,8 @@ func GetControlType(path string) int { return common.ReloadConfigActivityPopup case "discountTicket": return common.ReloadConfigDiscountTicket + case "configRtp": + return common.ReloadConfigRTP default: return 0 } diff --git a/modules/web/providers/base/base.go b/modules/web/providers/base/base.go index d8520cf..1bbd9a4 100644 --- a/modules/web/providers/base/base.go +++ b/modules/web/providers/base/base.go @@ -1,6 +1,7 @@ package base import ( + "errors" "fmt" "server/call" "server/common" @@ -366,33 +367,36 @@ func SessionBet(req *BetReq) (resp BetResp) { resp.MyUUID = uuid return } - pro := call.MineCurrencyProReal( - &common.UpdateCurrency{ - CurrencyBalance: &common.CurrencyBalance{ - UID: uid, - Type: ct, - Event: common.CurrencyEventGameBet, - Value: -betAmount, - Exi1: req.Provider.ProviderID, - Exi2: req.GameID, - Exs1: fmt.Sprintf("%d", uuid), - Exs2: req.BetID, - Exs3: req.SessionID, + if betAmount > 0 { + pro := call.MineCurrencyProReal( + &common.UpdateCurrency{ + CurrencyBalance: &common.CurrencyBalance{ + UID: uid, + Type: ct, + Event: common.CurrencyEventGameBet, + Value: -betAmount, + Exi1: req.Provider.ProviderID, + Exi2: req.GameID, + Exs1: fmt.Sprintf("%d", uuid), + Exs2: req.BetID, + Exs3: req.SessionID, + }, }, - }, - ) - if pro.Err != nil { - log.Error("err:%v", pro.Err) - resp.Code = CodeInnerError - if pro.Err == call.ErrNotEnoughBalance { - resp.Code = CodeNotEnoughAmount + ) + if pro.Err != nil { + log.Error("err:%v", pro.Err) + resp.Code = CodeInnerError + if errors.Is(pro.Err, call.ErrNotEnoughBalance) { + resp.Code = CodeNotEnoughAmount + } + } + if req.SessionType == SessionTypeBet { + resp.Balance = pro.Balance + resp.MyUUID = uuid + return } } - if req.SessionType == SessionTypeBet { - resp.Balance = pro.Balance - resp.MyUUID = uuid - return - } + var pro *call.ProRes setValue := settle + req.Preserve if setValue != 0 { cb := &common.CurrencyBalance{ @@ -430,7 +434,11 @@ func SessionBet(req *BetReq) (resp BetResp) { MyUUID: fmt.Sprintf("%d", uuid), }) }) - resp.Balance = pro.Balance + if pro != nil { + resp.Balance = pro.Balance + } else { + resp.Balance = call.GetUserCurrency(uid, ct) + } resp.MyUUID = uuid return } diff --git a/modules/web/providers/jili2/api.go b/modules/web/providers/jili2/api.go index d29c7f0..b216e37 100644 --- a/modules/web/providers/jili2/api.go +++ b/modules/web/providers/jili2/api.go @@ -38,11 +38,12 @@ type GameListItem struct { // EnterGameRequest 进入游戏 type EnterGameRequest struct { - Uname string `json:"uname"` - GameID string `json:"gameid"` - Token string `json:"token,omitempty"` - Lang string `json:"lang,omitempty"` - Nick string `json:"nick,omitempty"` + Uname string `json:"uname"` + GameID string `json:"gameid"` + Token string `json:"token,omitempty"` + Lang string `json:"lang,omitempty"` + Nick string `json:"nick,omitempty"` + RtpPool int `json:"rtp_pool"` } type EnterGameResponse struct { diff --git a/modules/web/providers/jili2/base.go b/modules/web/providers/jili2/base.go index b59169d..3906eb2 100644 --- a/modules/web/providers/jili2/base.go +++ b/modules/web/providers/jili2/base.go @@ -40,6 +40,8 @@ func (s *Sub) EnterGame() string { gameID := s.Base.EnterGameReq.GameID mchid := AgentMap.MchId key := AgentMap.Key + rtp := call.GetRtpControl(uid) + log.Info("uid:%v,rtp:%v", uid, rtp) headers := map[string]string{ "X-Atgame-Mchid": mchid, "X-Atgame-Timestamp": strconv.FormatInt(timestamp, 10), @@ -51,11 +53,12 @@ func (s *Sub) EnterGame() string { return "" } request := EnterGameRequest{ - Uname: fmt.Sprintf("%d", uid), - GameID: game.GameCode, - Token: token, - Lang: Lang, - Nick: "", + Uname: fmt.Sprintf("%d", uid), + GameID: game.GameCode, + Token: token, + Lang: Lang, + Nick: "", + RtpPool: rtp, } body, _ := json.Marshal(request) sign := GenerateSign(string(body), timestamp, key) diff --git a/modules/web/providers/jili2/handler.go b/modules/web/providers/jili2/handler.go index 99ef222..7c480f7 100644 --- a/modules/web/providers/jili2/handler.go +++ b/modules/web/providers/jili2/handler.go @@ -113,31 +113,35 @@ func PlaceBet(c *gin.Context) { provider := call.GetConfigGameProvider(common.ProviderJiLi2) now := time.Now().Unix() - betReq := &base.BetReq{ - UID: uid, - CurrencyType: common.CurrencyINR, - BetAmount: int64(req.Bet * common.DecimalDigits), - TurnOver: int64(req.Bet * common.DecimalDigits), - SettleAmount: int64(req.Award * common.DecimalDigits), - SessionType: common.SessionTypeSettle, - GameID: GetGameID(common.ProviderJiLi2, req.GameID), - GameName: req.GameID, - Provider: provider, - BetID: req.BetID, - SessionID: req.SessionID, - Time: now, - } - betResp := base.SessionBet(betReq) - if betResp.Code != base.CodeOk { - resp.Code = ErrCodeInternalError - if betResp.Code == base.CodeAccepted { + if req.Bet != 0 || req.Award != 0 { + betReq := &base.BetReq{ + UID: uid, + CurrencyType: common.CurrencyINR, + BetAmount: int64(req.Bet * common.DecimalDigits), + TurnOver: int64(req.Bet * common.DecimalDigits), + SettleAmount: int64(req.Award * common.DecimalDigits), + SessionType: common.SessionTypeSettle, + GameID: GetGameID(common.ProviderPG2, req.GameID), + GameName: req.GameID, + Provider: provider, + BetID: req.BetID, + SessionID: req.SessionID, + Time: now, + } + betResp := base.SessionBet(betReq) + if betResp.Code != base.CodeOk { resp.Code = ErrCodeInternalError - } else if betResp.Code == base.CodeNotEnoughAmount { - resp.Code = ErrCodeInsufficientBal + if betResp.Code == base.CodeAccepted { + resp.Code = ErrCodeInternalError + } else if betResp.Code == base.CodeNotEnoughAmount { + resp.Code = ErrCodeInsufficientBal + } + return } - return + resp.Data.Balance = util.Decimal(float64(betResp.Balance)/common.DecimalDigits, 2) + } else { + resp.Data.Balance = util.Decimal(float64(call.GetUserCurrency(uid, common.CurrencyINR))/common.DecimalDigits, 2) } - resp.Data.Balance = util.Decimal(float64(betResp.Balance)/common.DecimalDigits, 2) a.Data = resp } diff --git a/modules/web/providers/pg2/api.go b/modules/web/providers/pg2/api.go index 322f948..12e39fb 100644 --- a/modules/web/providers/pg2/api.go +++ b/modules/web/providers/pg2/api.go @@ -38,11 +38,12 @@ type GameListItem struct { // EnterGameRequest 进入游戏 type EnterGameRequest struct { - Uname string `json:"uname"` - GameID string `json:"gameid"` - Token string `json:"token,omitempty"` - Lang string `json:"lang,omitempty"` - Nick string `json:"nick,omitempty"` + Uname string `json:"uname"` + GameID string `json:"gameid"` + Token string `json:"token,omitempty"` + Lang string `json:"lang,omitempty"` + Nick string `json:"nick,omitempty"` + RtpPool int `json:"rtp_pool"` } type EnterGameResponse struct { diff --git a/modules/web/providers/pg2/base.go b/modules/web/providers/pg2/base.go index f131189..3a55ce5 100644 --- a/modules/web/providers/pg2/base.go +++ b/modules/web/providers/pg2/base.go @@ -40,6 +40,8 @@ func (s *Sub) EnterGame() string { gameID := s.Base.EnterGameReq.GameID mchid := AgentMap.MchId key := AgentMap.Key + rtp := call.GetRtpControl(uid) + log.Info("uid:%v,rtp:%v", uid, rtp) headers := map[string]string{ "X-Atgame-Mchid": mchid, "X-Atgame-Timestamp": strconv.FormatInt(timestamp, 10), @@ -51,11 +53,12 @@ func (s *Sub) EnterGame() string { return "" } request := EnterGameRequest{ - Uname: fmt.Sprintf("%d", uid), - GameID: game.GameCode, - Token: token, - Lang: Lang, - Nick: "", + Uname: fmt.Sprintf("%d", uid), + GameID: game.GameCode, + Token: token, + Lang: Lang, + Nick: "", + RtpPool: rtp, } body, _ := json.Marshal(request) sign := GenerateSign(string(body), timestamp, key) diff --git a/modules/web/providers/pg2/handler.go b/modules/web/providers/pg2/handler.go index 9a36947..d08b34d 100644 --- a/modules/web/providers/pg2/handler.go +++ b/modules/web/providers/pg2/handler.go @@ -113,31 +113,35 @@ func PlaceBet(c *gin.Context) { provider := call.GetConfigGameProvider(common.ProviderPG2) now := time.Now().Unix() - betReq := &base.BetReq{ - UID: uid, - CurrencyType: common.CurrencyINR, - BetAmount: int64(req.Bet * common.DecimalDigits), - TurnOver: int64(req.Bet * common.DecimalDigits), - SettleAmount: int64(req.Award * common.DecimalDigits), - SessionType: common.SessionTypeSettle, - GameID: GetGameID(common.ProviderPG2, req.GameID), - GameName: req.GameID, - Provider: provider, - BetID: req.BetID, - SessionID: req.SessionID, - Time: now, - } - betResp := base.SessionBet(betReq) - if betResp.Code != base.CodeOk { - resp.Code = ErrCodeInternalError - if betResp.Code == base.CodeAccepted { + if req.Bet != 0 || req.Award != 0 { + betReq := &base.BetReq{ + UID: uid, + CurrencyType: common.CurrencyINR, + BetAmount: int64(req.Bet * common.DecimalDigits), + TurnOver: int64(req.Bet * common.DecimalDigits), + SettleAmount: int64(req.Award * common.DecimalDigits), + SessionType: common.SessionTypeSettle, + GameID: GetGameID(common.ProviderPG2, req.GameID), + GameName: req.GameID, + Provider: provider, + BetID: req.BetID, + SessionID: req.SessionID, + Time: now, + } + betResp := base.SessionBet(betReq) + if betResp.Code != base.CodeOk { resp.Code = ErrCodeInternalError - } else if betResp.Code == base.CodeNotEnoughAmount { - resp.Code = ErrCodeInsufficientBal + if betResp.Code == base.CodeAccepted { + resp.Code = ErrCodeInternalError + } else if betResp.Code == base.CodeNotEnoughAmount { + resp.Code = ErrCodeInsufficientBal + } + return } - return + resp.Data.Balance = util.Decimal(float64(betResp.Balance)/common.DecimalDigits, 2) + } else { + resp.Data.Balance = util.Decimal(float64(call.GetUserCurrency(uid, common.CurrencyINR))/common.DecimalDigits, 2) } - resp.Data.Balance = util.Decimal(float64(betResp.Balance)/common.DecimalDigits, 2) a.Data = resp } diff --git a/modules/web/providers/pg2/values.go b/modules/web/providers/pg2/values.go index 227af42..2f246e3 100644 --- a/modules/web/providers/pg2/values.go +++ b/modules/web/providers/pg2/values.go @@ -17,8 +17,8 @@ var ( API = "" AgentMap Agent AgentMapTest = Agent{ - "10055", - "170779CCC5E9FE29DBB3F5FEDBB304A0", + "10071", + "E3D1A83FA82F04D9725ACB5A77578A65", } AgentMapRelease = Agent{} ) From eea7bf4af66e409198a54700fff88494f90bb463 Mon Sep 17 00:00:00 2001 From: mofangmin Date: Mon, 9 Sep 2024 16:38:14 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- call/config.go | 2 +- call/mail.go | 11 +- call/pay.go | 44 +++-- call/share.go | 24 ++- call/user.go | 2 +- common/config.go | 35 ++-- common/platform.go | 1 + main.go | 1 + modules/backend/handler/examine/examine.go | 6 +- modules/web/handler/activity.go | 179 +++++++++++++-------- modules/web/handler/game.go | 22 +-- modules/web/handler/recharge.go | 2 +- modules/web/handler/share.go | 45 +++--- modules/web/handler/user.go | 1 + modules/web/handler/withdraw.go | 4 +- modules/web/values/activity.go | 4 +- modules/web/values/share.go | 5 + pb/proto/inner.proto | 2 +- pb/proto/platform.proto | 6 +- 19 files changed, 240 insertions(+), 156 deletions(-) diff --git a/call/config.go b/call/config.go index 8c605fa..b16778f 100644 --- a/call/config.go +++ b/call/config.go @@ -563,7 +563,7 @@ func LoadGames() (err error) { for _, v := range tmplist { for _, k := range providers { if v.GameProvider == k.ProviderID { - if v.GameProvider == common.ProviderPG2 || v.GameProvider == common.ProviderJiLi2 || k.Open == 1 { // 特殊过滤 + if k.Open == 1 { // 特殊过滤 list = append(list, v) } break diff --git a/call/mail.go b/call/mail.go index ce9ee28..dad4203 100644 --- a/call/mail.go +++ b/call/mail.go @@ -11,11 +11,12 @@ import ( ) var ( - SystemTitle = "System Notice" - EmailWithdrawPass = "Your order %v, amount: $%v is in the payment status, please be patient." - EmailWithdrawSuccess = "Your order %v, amount: $%v has been credited, please check. If you have any questions, you can contact customer service." - EmailWithdrawFail = "Your order %v, Amount: $%v\nYour withdrawal failed due to incorrect information. Please verify or change your withdrawal details and resubmit" - EmailDiscount = "Congratulations, you have received a $%v coupon for a top-up of $%v or more." + SystemTitle = "System Notice" + EmailWithdrawPass = "Your order %v, amount: $%v is in the payment status, please be patient." + EmailWithdrawSuccess = "Your order %v, amount: $%v has been credited, please check. If you have any questions, you can contact customer service." + EmailWithdrawFail = "Your order %v, Amount: $%v\nYour withdrawal failed due to incorrect information. Please verify or change your withdrawal details and resubmit" + EmailShareWithdrawFail = "Your friend's invitation reward withdrawal order: %v, Amount: %v\nYour withdrawal failed due to incorrect information. Please verify or change your withdrawal details and resubmit.\n" + EmailDiscount = "Congratulations, you have received a $%v coupon for a top-up of $%v or more." ) func checkMail(uid int, red *common.PlayerRed) { diff --git a/call/pay.go b/call/pay.go index e845a94..d53f384 100644 --- a/call/pay.go +++ b/call/pay.go @@ -81,6 +81,17 @@ func Withdraw(data *pb.InnerWithdrawReq) (*pb.InnerWithdrawResp, error) { return retData, nil } +// CheckUserBet 检测玩家余额 +func CheckUserBet(uid int, t common.CurrencyType) { + cash := GetUserCurrency(uid, t) + if cash < config.GetConfig().Web.BreakLimit { + _, err := db.Mysql().UpdateRes(&common.PlayerProfile{UID: uid}, map[string]interface{}{"need_bet": 0}) + if err != nil { + log.Error("err:%v", err) + } + } +} + // RechargeCallback 充值回调 func RechargeCallback(r *common.RechargeOrder, success bool, payAccount, extra string) (err error) { log.Info("RechargeCallback:%+v,%v,%v,%v,", r, success, payAccount, extra) @@ -101,8 +112,9 @@ func RechargeCallback(r *common.RechargeOrder, success bool, payAccount, extra s log.Error("get recharage info err:%v,uid:%v", err, r.UID) return err } - amount := r.Amount + CheckUserBet(uid, r.CurrencyType) + amount := r.Amount notCharge := re.TotalRecharge == 0 re.TotalRecharge += amount now := time.Now().Unix() @@ -418,18 +430,24 @@ func ReturnBackWithdraw(or *common.WithdrawOrder, originStatus, status uint8, pa return err } if status != common.StatusROrderCreate { - if err := UpdateCurrency(&common.UpdateCurrency{ - CurrencyBalance: &common.CurrencyBalance{ - UID: or.UID, - Type: or.CurrencyType, - Value: or.WithdrawCash, - Event: common.CurrencyEventWithDrawBack, - Exs1: or.OrderID, - }, - }, tx); err != nil { - log.Error("Withdraw callback err:%v", err) - tx.Rollback() - return err + if or.Extra != "share" { + if err := UpdateCurrency(&common.UpdateCurrency{ + CurrencyBalance: &common.CurrencyBalance{ + UID: or.UID, + Type: or.CurrencyType, + Value: or.WithdrawCash, + Event: common.CurrencyEventWithDrawBack, + Exs1: or.OrderID, + }, + }, tx); err != nil { + log.Error("Withdraw callback err:%v", err) + tx.Rollback() + return err + } + } else { + db.Mysql().Update(&common.ShareInfo{UID: or.UID}, map[string]interface{}{ + "available_reward": gorm.Expr("available_reward + ?", or.WithdrawCash), + }) } } // 退还代付券 diff --git a/call/share.go b/call/share.go index dfda928..23b72ae 100644 --- a/call/share.go +++ b/call/share.go @@ -25,15 +25,21 @@ func GetShareInfo(uid int) *common.ShareInfo { } return shareInfo } +func GetShareInfoByCode(code string) *common.ShareInfo { + shareInfo := &common.ShareInfo{Share: code} + db.Mysql().Get(shareInfo) + return shareInfo +} // 分享查询 func ShareBind(share string, isOld bool, uid, cid int) { // 绑定 - if share == "" || isOld { + if share == "" { return } activityId := 0 now := time.Now().Unix() + // 关联活动分享码 codeInfo := &common.ShareActivityCode{ShareCode: share} upInfo := &common.ShareInfo{} db.Mysql().Get(codeInfo) @@ -54,9 +60,19 @@ func ShareBind(share string, isOld bool, uid, cid int) { if upInfo.ID <= 0 { return } - shareInfo := &common.ShareInfo{UID: uid, UP1: upInfo.UID, UP2: upInfo.UP1, UP3: upInfo.UP2, Time: time.Now().Unix(), ChannelID: cid, Share: util.GetShareCode(uid), ActivityId: activityId} - db.Mysql().Create(shareInfo) - + if !isOld { + shareInfo := &common.ShareInfo{UID: uid, UP1: upInfo.UID, UP2: upInfo.UP1, UP3: upInfo.UP2, Time: time.Now().Unix(), ChannelID: cid, Share: util.GetShareCode(uid), ActivityId: activityId} + db.Mysql().Create(shareInfo) + } else { + err := db.Mysql().Update(&common.ShareInfo{UID: uid}, map[string]interface{}{ + "up1": upInfo.UID, + "up2": upInfo.UP1, + "up3": upInfo.UP2, + }) + if err != nil { + log.Error("ShareBind err:%v", err) + } + } // 更新上级邀请玩家数 db.Mysql().Update(&common.ShareInfo{UID: upInfo.UID}, map[string]interface{}{"invites": gorm.Expr("invites + 1")}) diff --git a/call/user.go b/call/user.go index 106c415..94df911 100644 --- a/call/user.go +++ b/call/user.go @@ -793,7 +793,7 @@ func GetUserRtp(uid int) *common.PlayerRtpData { func GetRtpControl(uid int) int { rechargeInfo := GetRechargeInfo(uid) - withdrawRechargePer := (rechargeInfo.TotalWithdraw + rechargeInfo.WithdrawingCash) / rechargeInfo.TotalRecharge + withdrawRechargePer := (rechargeInfo.TotalWithdraw + rechargeInfo.WithdrawingCash) / rechargeInfo.TotalRecharge * 100 rtpConf := GetConfigRTPByAmount(rechargeInfo.TotalRecharge) rtpData := GetUserRtp(uid) // 1.优先玩家配置 diff --git a/common/config.go b/common/config.go index eab6482..4df8d4e 100644 --- a/common/config.go +++ b/common/config.go @@ -166,19 +166,20 @@ func GetConfigStructByType(t int) (interface{}, interface{}) { // WithdrawRecharge 退出需付费的金额 // NewControlEnd 新手调控结束阀值 type ConfigPlatform struct { - ID int `gorm:"primarykey"` - NewPlayerGift int64 `gorm:"column:new_player_gift;type:int(11);default:1000;comment:新玩家赠送金币" json:"NewPlayerGift" web:"new_player_gift"` - BindPhoneGift int64 `gorm:"column:bind_phone_gift;type:int(11);default:1000;comment:绑定手机赠送" json:"BindPhoneGift" web:"bind_phone_gift"` - AvatarCount int `gorm:"column:avatar_count;type:int(11);default:400;comment:最大头像数目" json:"AvatarCount" web:"avatar_count"` - CartoonCount int `gorm:"column:cartoon_count;type:int(11);default:15;comment:卡通头像数目" json:"CartoonCount" web:"cartoon_count"` - SmsChannel int `gorm:"column:sms_channel;type:int(11);default:1;comment:短信服务商 1Antgst 2Buka" json:"SmsChannel" web:"sms_channel"` - Telegram string `gorm:"column:telegram;type:varchar(256);default:'+66636640245';comment:客服telegram" json:"Telegram" web:"telegram"` - Whatsapp string `gorm:"column:whatsapp;type:varchar(256);default:'+66636640245';comment:客服whatsapp" json:"Whatsapp" web:"whatsapp"` - Email string `gorm:"column:email;type:varchar(256);default:'rummywallah@gmail.com';comment:客服email" json:"Email" web:"email"` - PayTips string `gorm:"column:pay_tips;type:varchar(256);default:'';comment:充值提示语" json:"PayTips" web:"pay_tips"` - WithdrawTips string `gorm:"column:withdraw_tips;type:varchar(256);default:'';comment:tx提示语" json:"WithdrawTips" web:"withdraw_tips"` - BlackList int `gorm:"column:black_list;type:int(11);default:0;comment:是否开启黑名单 0不开 1开启" json:"BlackList" web:"black_list"` - Rtp int `gorm:"column:rtp;type:int(11);default:0;comment:平台RTP" json:"Rtp" web:"rtp"` + ID int `gorm:"primarykey"` + NewPlayerGift int64 `gorm:"column:new_player_gift;type:int(11);default:1000;comment:新玩家赠送金币" json:"NewPlayerGift" web:"new_player_gift"` + BindPhoneGift int64 `gorm:"column:bind_phone_gift;type:int(11);default:1000;comment:绑定手机赠送" json:"BindPhoneGift" web:"bind_phone_gift"` + AvatarCount int `gorm:"column:avatar_count;type:int(11);default:400;comment:最大头像数目" json:"AvatarCount" web:"avatar_count"` + CartoonCount int `gorm:"column:cartoon_count;type:int(11);default:15;comment:卡通头像数目" json:"CartoonCount" web:"cartoon_count"` + SmsChannel int `gorm:"column:sms_channel;type:int(11);default:1;comment:短信服务商 1Antgst 2Buka" json:"SmsChannel" web:"sms_channel"` + Telegram string `gorm:"column:telegram;type:varchar(256);default:'+66636640245';comment:客服telegram" json:"Telegram" web:"telegram"` + Whatsapp string `gorm:"column:whatsapp;type:varchar(256);default:'+66636640245';comment:客服whatsapp" json:"Whatsapp" web:"whatsapp"` + Email string `gorm:"column:email;type:varchar(256);default:'rummywallah@gmail.com';comment:客服email" json:"Email" web:"email"` + PayTips string `gorm:"column:pay_tips;type:varchar(256);default:'';comment:充值提示语" json:"PayTips" web:"pay_tips"` + WithdrawTips string `gorm:"column:withdraw_tips;type:varchar(256);default:'';comment:tx提示语" json:"WithdrawTips" web:"withdraw_tips"` + BlackList int `gorm:"column:black_list;type:int(11);default:0;comment:是否开启黑名单 0不开 1开启" json:"BlackList" web:"black_list"` + Rtp int `gorm:"column:rtp;type:int(11);default:0;comment:平台RTP" json:"Rtp" web:"rtp"` + ShareBindReward int64 `gorm:"column:share_bind_reward;type:bigint(20);default:0;comment:分享奖励" json:"ShareBindReward" web:"share_bind_reward"` } func (c *ConfigPlatform) TableName() string { @@ -461,10 +462,6 @@ type ConfigBroadcast struct { ConditionUp int `gorm:"column:condition_up;type:int(11);comment:触发条件上限" web:"condition_up"` } -func (c *ConfigBroadcast) TableName() string { - return "config_broadcast" -} - type ConfigNotice struct { ID int `gorm:"primarykey"` Title1 string `gorm:"column:title1;type:varchar(255);comment:标题1" web:"title1"` // 公告标题_1(英语) @@ -479,10 +476,6 @@ type ConfigNotice struct { PushTimes int `gorm:"column:push_times;type:int(11);comment:推送次数" web:"push_times"` // 推送次数 } -func (c *ConfigNotice) TableName() string { - return "config_notice" -} - // 货币汇率(各种货币转换成美元的汇率) type ConfigCurrencyRateUSD struct { ID int `gorm:"primary_key;AUTO_INCREMENT;column:id"` diff --git a/common/platform.go b/common/platform.go index bf0cb59..2cb932c 100644 --- a/common/platform.go +++ b/common/platform.go @@ -202,6 +202,7 @@ type Channel struct { FBAccessToken string `gorm:"column:fb_accesstoken;type:varchar(256);not null;comment:fb验证码" json:"fb_accesstoken"` UP int `gorm:"column:up;type:int(11);default:0;comment:上级渠道" json:"up"` ADUpload int `gorm:"column:ad_upload;type:int(11);default:0;comment:上报事件的平台" json:"ad_upload"` + ShareUrl string `gorm:"column:share_url;type:varchar(256);comment:分享地址;NOT NULL" json:"share_url"` } func (c *Channel) TableName() string { diff --git a/main.go b/main.go index 704bd38..e5dae90 100644 --- a/main.go +++ b/main.go @@ -34,6 +34,7 @@ import ( ) func main() { + log.Info("启动游戏服务器 ...") rand.Seed(time.Now().UTC().UnixNano()) runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/modules/backend/handler/examine/examine.go b/modules/backend/handler/examine/examine.go index 22c052e..aabb622 100644 --- a/modules/backend/handler/examine/examine.go +++ b/modules/backend/handler/examine/examine.go @@ -178,7 +178,11 @@ func WithdrawExamine(c *gin.Context) { if err != nil { log.Error(err.Error()) } - call.SendMailWithContent(one.UID, call.SystemTitle, fmt.Sprintf(call.EmailWithdrawFail, one.OrderID, one.Amount/common.DecimalDigits)) + if one.Extra == "share" { + call.SendMailWithContent(one.UID, call.SystemTitle, fmt.Sprintf(call.EmailShareWithdrawFail, one.OrderID, one.Amount/common.DecimalDigits)) + } else { + call.SendMailWithContent(one.UID, call.SystemTitle, fmt.Sprintf(call.EmailWithdrawFail, one.OrderID, one.Amount/common.DecimalDigits)) + } return } call.SendMailWithContent(one.UID, call.SystemTitle, fmt.Sprintf(call.EmailWithdrawPass, one.OrderID, one.Amount/common.DecimalDigits)) diff --git a/modules/web/handler/activity.go b/modules/web/handler/activity.go index 574116c..4bd434c 100644 --- a/modules/web/handler/activity.go +++ b/modules/web/handler/activity.go @@ -12,6 +12,7 @@ import ( "server/pb" "server/util" "sort" + "strconv" "strings" "time" @@ -773,91 +774,126 @@ func ActivityLuckyCodeDraw(c *gin.Context) { if !a.S(req) { return } - now := time.Now() - luckyCode := &common.ActivityLuckyCode{Code: req.LuckyCode, Date: now.Format("20060102")} - if !a.MGet(luckyCode) { - a.Code = values.CodeParam - a.Msg = "आपके द्वारा दर्ज किया गया कोड ग़लत है" - return - } resp := &values.ActivityLuckyCodeDrawResp{} a.Data = resp + code, _ := strconv.Atoi(req.LuckyCode) + var reward int64 - codeType := luckyCode.Type - data := &common.ActivityLuckyCodeData{UID: a.UID} - db.Mysql().Get(data) - if (codeType == common.LuckyCodeTypeNormal && util.IsSameDayTimeStamp(now.Unix(), data.LastDraw)) || - (codeType == common.LuckyCodeTypeVip && util.IsSameDayTimeStamp(now.Unix(), data.LastVipDraw)) { - a.Code = values.CodeParam - a.Msg = "इस कोड का पहले ही उपयोग किया जा चुका है" - return - } - // 开始发奖 - con := call.GetConfigAcitivityLuckyCode(codeType) - total := call.GetConfigAcitivityLuckyCodeTotalWeight(codeType) - if total == 0 { - log.Error("con:%+v invalid,uid:%d", con, a.UID) - a.Code = values.CodeParam - a.Msg = "रूपांतरण कोड त्रुटि" - return - } - if data.ID == 0 { - codeData := &common.ActivityLuckyCodeData{UID: a.UID, Type: codeType} - if codeType == common.LuckyCodeTypeNormal { - codeData.LastDraw = now.Unix() - } else if codeType == common.LuckyCodeTypeVip { - codeData.LastVipDraw = now.Unix() + // 判断是否为分享吗 + upShareInfo := call.GetShareInfoByCode(req.LuckyCode) + if upShareInfo.ID > 0 { + if upShareInfo.UID == a.UID { + a.Code = values.CodeRetry + a.Msg = "code error" + return } - err := db.Mysql().Create(codeData) + shareInfo := call.GetShareInfo(a.UID) + if shareInfo.UP1 > 0 { + a.Code = values.CodeRetry + a.Msg = "has binding" + return + } + call.ShareBind(req.LuckyCode, true, a.UID, a.Channel) + reward = call.GetConfigPlatform().ShareBindReward + _, err := call.UpdateCurrencyPro(&common.UpdateCurrency{ + CurrencyBalance: &common.CurrencyBalance{ + UID: a.UID, + Type: common.CurrencyINR, + Value: reward, + Event: common.CurrencyEventTask, + Exi1: code, + NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, reward), + }, + }) if err != nil { + log.Error("err:%v", err) a.Code = values.CodeRetry + a.Msg = "code error" return } } else { - updates := map[string]interface{}{} - if codeType == common.LuckyCodeTypeNormal { - updates["last_draw"] = now.Unix() - } else if codeType == common.LuckyCodeTypeVip { - updates["last_vip_draw"] = now.Unix() - } - rows, err := db.Mysql().UpdateRes(&common.ActivityLuckyCodeData{UID: a.UID, LastDraw: data.LastDraw}, updates) - if rows == 0 || err != nil { - a.Code = values.CodeRetry + now := time.Now() + luckyCode := &common.ActivityLuckyCode{Code: code, Date: now.Format("20060102")} + if !a.MGet(luckyCode) { + a.Code = values.CodeParam + a.Msg = "The code you entered is incorrect" return } - } - ran := rand.Int63n(total) - var rans, reward int64 - id := 0 - for _, v := range con { - rans += v.Per - if ran < rans { - id = v.ID - reward = v.Reward - break + codeType := luckyCode.Type + data := &common.ActivityLuckyCodeData{UID: a.UID} + db.Mysql().Get(data) + if (codeType == common.LuckyCodeTypeNormal && util.IsSameDayTimeStamp(now.Unix(), data.LastDraw)) || + (codeType == common.LuckyCodeTypeVip && util.IsSameDayTimeStamp(now.Unix(), data.LastVipDraw)) { + a.Code = values.CodeParam + a.Msg = "This code has already been used" + return + } + // 开始发奖 + con := call.GetConfigAcitivityLuckyCode(codeType) + total := call.GetConfigAcitivityLuckyCodeTotalWeight(codeType) + if total == 0 { + log.Error("con:%+v invalid,uid:%d", con, a.UID) + a.Code = values.CodeParam + a.Msg = "code error" + return + } + if data.ID == 0 { + codeData := &common.ActivityLuckyCodeData{UID: a.UID, Type: codeType} + if codeType == common.LuckyCodeTypeNormal { + codeData.LastDraw = now.Unix() + } else if codeType == common.LuckyCodeTypeVip { + codeData.LastVipDraw = now.Unix() + } + err := db.Mysql().Create(codeData) + if err != nil { + a.Code = values.CodeRetry + return + } + } else { + updates := map[string]interface{}{} + if codeType == common.LuckyCodeTypeNormal { + updates["last_draw"] = now.Unix() + } else if codeType == common.LuckyCodeTypeVip { + updates["last_vip_draw"] = now.Unix() + } + rows, err := db.Mysql().UpdateRes(&common.ActivityLuckyCodeData{UID: a.UID, LastDraw: data.LastDraw}, updates) + if rows == 0 || err != nil { + a.Code = values.CodeRetry + return + } } - } - _, err := call.UpdateCurrencyPro(&common.UpdateCurrency{ - CurrencyBalance: &common.CurrencyBalance{ - UID: a.UID, - Type: common.CurrencyINR, - Value: reward, - Event: common.CurrencyEventTask, - Exs1: fmt.Sprintf("%d", codeType), - Exi1: req.LuckyCode, - NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, reward), - }, - }) - if err != nil { - log.Error("err:%v", err) - a.Code = values.CodeRetry - a.Msg = "रूपांतरण कोड त्रुटि" - return + ran := rand.Int63n(total) + var rans int64 + for _, v := range con { + rans += v.Per + if ran < rans { + reward = v.Reward + break + } + } + _, err := call.UpdateCurrencyPro(&common.UpdateCurrency{ + CurrencyBalance: &common.CurrencyBalance{ + UID: a.UID, + Type: common.CurrencyINR, + Value: reward, + Event: common.CurrencyEventTask, + Exs1: fmt.Sprintf("%d", codeType), + Exi1: code, + NeedBet: call.GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, reward), + }, + }) + if err != nil { + log.Error("err:%v", err) + a.Code = values.CodeRetry + a.Msg = "code error" + return + } + call.UploadActivityData(a.UID, common.ActivityIDLuckyCode, common.ActivityDataJoin, reward) } - call.UploadActivityData(a.UID, common.ActivityIDLuckyCode, common.ActivityDataJoin, reward) - resp.ID = id + + resp.Reward = reward } // day 二进制从0位开始,实际签到日期需减1 @@ -1356,6 +1392,7 @@ func ActivityWeekCardInfo(c *gin.Context) { if resp.Status && resp.RechargeStatus { call.PushRed(a.UID, pb.RedPointModule_RedPointWeekCard, 1) } + call.UploadActivityData(a.UID, common.ActivityIDSign, common.ActivityDataClick, 0) } func ActivityWeekCardDraw(c *gin.Context) { @@ -1481,7 +1518,7 @@ func ActivityWeekCardDraw(c *gin.Context) { }) } call.PushRed(a.UID, pb.RedPointModule_RedPointWeekCard, 0) - + call.UploadActivityData(a.UID, common.ActivityIDSign, common.ActivityDataJoin, reward) } func ActivitySlotsInfo(c *gin.Context) { diff --git a/modules/web/handler/game.go b/modules/web/handler/game.go index cbbe92f..f74bec8 100644 --- a/modules/web/handler/game.go +++ b/modules/web/handler/game.go @@ -82,22 +82,26 @@ func EnterGame(c *gin.Context) { } a.Data = resp // step:特殊逻辑处理 + providerId := 0 if req.Provider == common.ProviderPGSoft { - provider = call.GetConfigGameProvider(common.ProviderPG2) - game := call.GetConfigGameListByID(common.ProviderPG2, req.GameID) - if game != nil && game.Open == 1 { - req.Provider = common.ProviderPG2 - resp.Method = provider.Method - } + providerId = common.ProviderPG2 } if req.Provider == common.ProviderJili { - provider = call.GetConfigGameProvider(common.ProviderJiLi2) - game := call.GetConfigGameListByID(common.ProviderJiLi2, req.GameID) + providerId = common.ProviderJiLi2 + } + if providerId > 0 { + provider = call.GetConfigGameProvider(providerId) + game := call.GetConfigGameListByID(providerId, req.GameID) if game != nil && game.Open == 1 { - req.Provider = common.ProviderJiLi2 + req.Provider = providerId resp.Method = provider.Method + } else { + a.Code = values.CodeParam + a.Msg = "Under Maintenance,please try later." + return } } + if req.IsDemo { log.Debug("player enter demo game %+v", *req) enter := &base.EnterGameReq{ diff --git a/modules/web/handler/recharge.go b/modules/web/handler/recharge.go index b94764c..6a04c06 100644 --- a/modules/web/handler/recharge.go +++ b/modules/web/handler/recharge.go @@ -40,7 +40,7 @@ func RechargeInfo(c *gin.Context) { defer func() { a.Response() }() - list := call.GetConfigPayProduct() + list := call.GetConfigPayProductByActivityID(0) resp := &values.RechargeInfoResp{Tips: call.GetConfigPlatform().PayTips, SelectID: config.GetConfig().Web.SelectID} a.Data = resp resp.Channels = call.GetConfigPayChannels() diff --git a/modules/web/handler/share.go b/modules/web/handler/share.go index 8141022..8e38b21 100644 --- a/modules/web/handler/share.go +++ b/modules/web/handler/share.go @@ -84,13 +84,14 @@ func ShareInfo(c *gin.Context) { } channel := call.GetChannelByID(a.Channel) if channel != nil { - resp.ShareLink += channel.URL + "?code=" + "xxxxxx" - if a.Prefix != "" { - resp.ShareLink = a.Prefix + "." + resp.ShareLink - } else { - resp.ShareLink = "www." + resp.ShareLink - } - resp.ShareLink = "https://" + resp.ShareLink + // resp.ShareLink += channel.URL + "?code=" + "xxxxxx" + // if a.Prefix != "" { + // resp.ShareLink = a.Prefix + "." + resp.ShareLink + // } else { + // resp.ShareLink = "www." + resp.ShareLink + // } + // resp.ShareLink = "https://" + resp.ShareLink + resp.ShareLink = channel.ShareUrl } a.GetUID() if a.UID <= 0 { @@ -105,20 +106,21 @@ func ShareInfo(c *gin.Context) { resp.AvailableReward = shareInfo.AvailableReward resp.RechargeCount = call.GetUserShareRecharges(a.UID, 1) resp.TotalRecharge = call.GetUserShareRechargeAmount(a.UID, 1) - if channel != nil { - num := 10000 - channelId := channel.ChannelID - if channel.ChannelID < num { - channelId += num - } - resp.ShareLink = channel.URL + "?code=" + shareInfo.Share + "&ch=" + fmt.Sprintf("%d", channelId) - if a.Prefix != "" { - resp.ShareLink = a.Prefix + "." + resp.ShareLink - } else { - resp.ShareLink = "www." + resp.ShareLink - } - resp.ShareLink = "https://" + resp.ShareLink - } + resp.ShareCode = shareInfo.Share + // if channel != nil { + // num := 10000 + // channelId := channel.ChannelID + // if channel.ChannelID < num { + // channelId += num + // } + // resp.ShareLink = channel.URL + "?code=" + shareInfo.Share + "&ch=" + fmt.Sprintf("%d", channelId) + // if a.Prefix != "" { + // resp.ShareLink = a.Prefix + "." + resp.ShareLink + // } else { + // resp.ShareLink = "www." + resp.ShareLink + // } + // resp.ShareLink = "https://" + resp.ShareLink + // } num := 0 if resp.AvailableReward > 0 { num = 1 @@ -297,6 +299,7 @@ func ShareWithdraw(c *gin.Context) { OrderID: orderID, APIPayID: "", // ProductID: one.ID, + Extra: "share", CreateTime: time.Now().Unix(), Amount: realAmount, WithdrawCash: req.Amount, diff --git a/modules/web/handler/user.go b/modules/web/handler/user.go index 4e2279f..85b94b6 100644 --- a/modules/web/handler/user.go +++ b/modules/web/handler/user.go @@ -102,6 +102,7 @@ func GetUserInfo(c *gin.Context) { util.Go(func() { CheckRedPoint(uid, c) }) + } func EditUserInfo(c *gin.Context) { diff --git a/modules/web/handler/withdraw.go b/modules/web/handler/withdraw.go index db21388..d0ec33f 100644 --- a/modules/web/handler/withdraw.go +++ b/modules/web/handler/withdraw.go @@ -465,14 +465,14 @@ func NewWithdraw(req *values.WithdrawReq, uid int, ip string, uuid string) (stri if pi.BankCardNo != one.BankCardNo { sql := fmt.Sprintf("bank_card_no = '%v'", one.BankCardNo) if db.Mysql().Count(&common.PayInfo{}, sql) >= int64(config.GetConfig().Web.MaxBankCardCount) { - return "", values.CodeBankCardNoLimit + return "Bank card error", values.CodeBankCardNoLimit } } } else if one.PayType == common.PayTypeUPI { // UPI if pi.BankCode != one.BankCode { sql := fmt.Sprintf("bank_code = '%v'", one.BankCode) if db.Mysql().Count(&common.PayInfo{}, sql) >= int64(config.GetConfig().Web.MaxBankCardCount) { - return "", values.CodeBankCardNoLimit + return "Bank card error", values.CodeBankCardNoLimit } } } diff --git a/modules/web/values/activity.go b/modules/web/values/activity.go index 8f06174..1da9614 100644 --- a/modules/web/values/activity.go +++ b/modules/web/values/activity.go @@ -81,12 +81,12 @@ type ActivityLuckyCodeInfoReq struct { // Type 类型,预留用于后续其他活动兑换码 type ActivityLuckyCodeDrawReq struct { Type int - LuckyCode int `json:"LuckyCode" binding:"required"` + LuckyCode string `json:"LuckyCode" binding:"required"` } // ID 奖品id type ActivityLuckyCodeDrawResp struct { - ID int + Reward int64 } // Sign 玩家签到情况数据 二进制 如第一天签了,第二天没签,第三天签了,第四天签了 就是1101 diff --git a/modules/web/values/share.go b/modules/web/values/share.go index d3e0865..084c609 100644 --- a/modules/web/values/share.go +++ b/modules/web/values/share.go @@ -29,6 +29,7 @@ type ShareInfoResp struct { PlatformTotalReward int64 Rank []*OneShareRank Msg string // 后台配置消息 + ShareCode string } type SharePlatformResp struct { @@ -202,3 +203,7 @@ type GetActivityCodeReq struct { type GetActivityCodeResp struct { ShareLink string } + +type ShareCodeBindReq struct { + Code string +} diff --git a/pb/proto/inner.proto b/pb/proto/inner.proto index e03c836..7fb2d54 100644 --- a/pb/proto/inner.proto +++ b/pb/proto/inner.proto @@ -28,7 +28,7 @@ message InnerBroadcast { int32 ID = 1; string Content = 2; int32 Priority = 3; - int32 Frequency = 4; + int32 Frequency = 4; int32 Interval = 5; } diff --git a/pb/proto/platform.proto b/pb/proto/platform.proto index f9c68d0..eadbfff 100644 --- a/pb/proto/platform.proto +++ b/pb/proto/platform.proto @@ -132,9 +132,9 @@ message PlayerBalanceResp{ } message BroadcastMsg{ - string Content = 1; - uint32 Priority = 2; - int64 Loop = 3; // 重复次数 + string Content = 1; // 内容 + uint32 Priority = 2; // 优先级 + int64 Loop = 3; // 重复次数 int64 Interval = 4; // 时间间隔 }