印度包网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

511 lines
12 KiB

1 year ago
package awc
import (
"encoding/json"
"fmt"
"server/call"
"server/common"
"server/db"
"server/modules/web/app"
"server/modules/web/providers/base"
"server/natsClient"
"server/pb"
"server/util"
"time"
"github.com/gin-gonic/gin"
"github.com/liangdas/mqant/log"
)
func AWC(e *gin.RouterGroup) {
e.POST("", Callback)
}
func Callback(c *gin.Context) {
a := app.NewApp(c)
defer func() {
a.ResponseB()
}()
key := c.PostForm("key")
message := c.PostForm("message")
log.Debug("awc callback key:%v,message:%v", key, message)
if key != APIKey {
return
}
// message, err := strconv.Unquote(message)
// if err != nil {
// log.Error("err:%v", err)
// }
a.TmpData = message
act := new(Action)
json.Unmarshal([]byte(message), act)
switch act.Action {
case "getBalance":
uid, ct := base.GetUIDAndCurrency(act.UserId)
if uid <= 0 || !ct.IsValid() {
a.RetData = &CommonResp{Status: "1002"}
return
}
a.UID = uid
a.TmpData = ct
getBalance(a)
case "bet":
placeBet(a)
case "cancelBet":
cancelBet(a)
case "voidBet":
cancelBet(a)
case "settle":
settle(a)
case "voidSettle":
viodSettle(a)
case "give":
give(a)
case "resettle":
resettle(a)
default:
a.RetData = &CommonResp{Status: "1036"}
return
}
}
func getBalance(a *app.Gin) {
resp := &GetBalanceResp{}
a.RetData = resp
// currency, err := db.Redis().GetInt(common.GetRedisKeyGameCurrency(a.UID))
// if err != nil {
// log.Error("err:%v", err)
// resp.Status = "1036"
// return
// }
resp.Status = "0000"
resp.Balance = call.GetUserCurrencyFloat(a.UID, a.TmpData.(common.CurrencyType), 4)
resp.UserId = fmt.Sprintf("%v", a.UID)
resp.BalanceTs = time.Now().Format(TimeFormatString)
}
func placeBet(a *app.Gin) {
req := new(PlaceBetReq)
message := a.TmpData.(string)
resp := &PlaceBetResp{}
a.RetData = resp
err := json.Unmarshal([]byte(message), req)
if err != nil {
log.Error("err:%v", err)
resp.Status = "1036"
return
}
// log.Debug("placeBet:%+v", req)
now := time.Now().Unix()
var totalBet int64
var uid int
var ct common.CurrencyType
myUUID := call.SnowNode().Generate().Int64()
for _, v := range req.Txns {
uid = util.GetIntFromString(v.UserId)
if uid <= 0 {
resp.Status = "1036"
return
}
ctName := v.Currency
if ctName == "USD" {
ctName = "USDT"
}
ct = common.GetCurrencyID(ctName)
if !ct.IsValid() {
log.Debug("unknown ct:%v", ct)
resp.Status = "1036"
return
}
gameID := 0
var provider *common.ConfigGameProvider
if v.Platform == "SEXYBCRT" {
fmt.Sscanf(v.GameCode, "MX-LIVE-%d", &gameID)
provider = call.GetConfigGameProvider(common.ProviderSexy)
}
var betTime int64
t, err := time.Parse(TimeFormatString, v.BetTime)
if err != nil {
betTime = now
} else {
betTime = t.Unix()
}
betAmount := common.CashFloat64ToInt64(v.BetAmount)
record := &common.ProviderBetRecord{
UID: uid,
Provider: provider.ProviderID,
UUID: v.PlatformTxId,
}
db.Mysql().Get(record)
if record.ID > 0 {
resp.Status = "1036"
return
}
if err := db.Mysql().Create(&common.ProviderBetRecord{
UID: uid,
Provider: provider.ProviderID,
Currency: ct.GetCurrencyName(),
CurrencyType: ct,
GameID: gameID,
UUID: v.PlatformTxId,
MyUUID: myUUID,
Type: common.SessionTypeBet,
Time: now,
ProviderTime: betTime,
Amount: betAmount,
SessionID: v.RoundId,
// TurnOver: req.TurnOver,
// Preserve: req.Preserve,
Esi: base.SessionSuccess,
}); err != nil {
log.Error("err:%v", err)
resp.Status = "1036"
return
}
totalBet += betAmount
// log.Debug("betResp:%+v", betResp)
}
pro := call.MineCurrencyProReal(
&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{
UID: uid,
Type: ct,
Event: common.CurrencyEventGameBet,
Value: -totalBet,
Exs1: fmt.Sprintf("%d", myUUID),
// Exs2: req.BetID,
// Exs3: req.SessionID,
},
},
)
if pro.Err != nil {
log.Error("err:%v", pro.Err)
resp.Status = "1036"
if pro.Err == call.ErrNotEnoughBalance {
resp.Status = "1018"
}
return
}
resp.Status = "0000"
resp.Balance = util.Decimal(float64(pro.Balance)/common.DecimalDigits, 4)
resp.BalanceTs = time.Now().Format(TimeFormatString)
}
func cancelBet(a *app.Gin) {
req := new(CancelBetReq)
message := a.TmpData.(string)
resp := &CancelBetResp{}
a.RetData = resp
err := json.Unmarshal([]byte(message), req)
if err != nil {
log.Error("err:%v", err)
resp.Status = "1036"
return
}
now := time.Now().Unix()
var betResp base.BetResp
for _, v := range req.Txns {
uid := util.GetIntFromString(v.UserId)
if uid <= 0 {
resp.Status = "1036"
return
}
gameID := 0
var provider *common.ConfigGameProvider
if v.Platform == "SEXYBCRT" {
fmt.Sscanf(v.GameCode, "MX-LIVE-%d", &gameID)
provider = call.GetConfigGameProvider(common.ProviderSexy)
}
var betTime int64
t, err := time.Parse(TimeFormatString, v.BetTime)
if err != nil {
betTime = now
} else {
betTime = t.Unix()
}
betResp = base.CancelSessionBet(&base.BetReq{
UID: uid,
SessionType: common.SessionTypeBet,
GameID: gameID,
Provider: provider,
BetID: v.PlatformTxId,
SessionID: v.RoundId,
Time: betTime,
VoidType: v.VoidType,
})
}
resp.Status = "0000"
resp.Balance = util.Decimal(float64(betResp.Balance)/common.DecimalDigits, 4)
resp.BalanceTs = time.Now().Format(TimeFormatString)
}
type SettleUser struct {
UID int
TotalSettle int64
TotalBet int64
TotalTurnover int64
}
func settle(a *app.Gin) {
req := new(SettleReq)
message := a.TmpData.(string)
resp := &SettleResp{}
a.RetData = resp
err := json.Unmarshal([]byte(message), req)
if err != nil {
log.Error("err:%v", err)
resp.Status = "1036"
return
}
now := time.Now().Unix()
var settleResp base.SettleResp
var uid int
var ct common.CurrencyType
myUUID := call.SnowNode().Generate().Int64()
provider := new(common.ConfigGameProvider)
gameID := 0
uuid := ""
settles := map[int]SettleUser{}
for _, v := range req.Txns {
uid = util.GetIntFromString(v.UserId)
if uid <= 0 {
resp.Status = "1036"
return
}
if v.Platform == "SEXYBCRT" {
fmt.Sscanf(v.GameCode, "MX-LIVE-%d", &gameID)
provider = call.GetConfigGameProvider(common.ProviderSexy)
}
var settleTime int64
t, err := time.Parse(TimeFormatString, v.UpdateTime)
if err != nil {
settleTime = now
} else {
settleTime = t.Unix()
}
record := &common.ProviderBetRecord{
UID: uid,
Provider: provider.ProviderID,
UUID: v.PlatformTxId,
Type: common.SessionTypeBet,
}
db.Mysql().Get(record)
if record.ID == 0 {
resp.Status = "1036"
return
}
// 重复结算,忽略
if db.Mysql().Exist(&common.ProviderBetRecord{
UID: uid,
Provider: provider.ProviderID,
UUID: v.PlatformTxId,
Type: common.SessionTypeSettle,
}) {
continue
}
ct = record.CurrencyType
uuid = v.PlatformTxId
settleAmount := common.CashFloat64ToInt64(v.WinAmount)
betAmount := common.CashFloat64ToInt64(v.BetAmount)
turnOver := common.CashFloat64ToInt64(v.TurnOver)
if err := db.Mysql().Create(&common.ProviderBetRecord{
UID: uid,
Provider: provider.ProviderID,
Currency: ct.GetCurrencyName(),
CurrencyType: ct,
GameID: gameID,
UUID: v.PlatformTxId,
Type: common.SessionTypeSettle,
Time: now,
ProviderTime: settleTime,
Amount: betAmount,
SessionID: v.RoundId,
MyUUID: myUUID,
Settle: settleAmount,
Esi: base.SessionSuccess,
}); err != nil {
log.Error("err:%v", err)
resp.Status = "1036"
return
}
user, ok := settles[uid]
if ok {
user.TotalBet += betAmount
user.TotalSettle += settleAmount
user.TotalTurnover += turnOver
settles[uid] = user
} else {
settles[uid] = SettleUser{
TotalBet: betAmount,
TotalSettle: settleAmount,
TotalTurnover: turnOver,
}
}
}
for i, v := range settles {
thisUID := i
if v.TotalSettle != 0 {
pro := call.UpdateCurrencyProReal(
&common.UpdateCurrency{
CurrencyBalance: &common.CurrencyBalance{
UID: thisUID,
Type: ct,
Event: common.CurrencyEventGameSettle,
Value: v.TotalSettle,
Exs1: fmt.Sprintf("%d", myUUID),
// Exs2: req.BetID,
// Exs3: req.SessionID,
},
},
)
if pro.Err != nil {
log.Error("err:%v", pro.Err)
resp.Status = "1036"
return
}
// balance = pro.Balance
}
util.IndexTryS(func() error {
return call.Publish(natsClient.TopicInnerAfterSettle, &pb.InnerAfterSettle{
UID: int64(thisUID),
ProviderID: int64(provider.ProviderID),
GameID: int64(gameID),
UUID: uuid,
CurrencyType: int64(ct),
TotalBet: v.TotalTurnover,
OriginSettle: v.TotalSettle,
FinalSettle: v.TotalSettle,
MyUUID: fmt.Sprintf("%d", myUUID),
})
})
}
resp.Status = "0000"
if settleResp.Code != base.CodeOk {
resp.Status = "9999"
}
}
func viodSettle(a *app.Gin) {
req := new(SettleReq)
message := a.TmpData.(string)
resp := &SettleResp{}
a.RetData = resp
err := json.Unmarshal([]byte(message), req)
if err != nil {
log.Error("err:%v", err)
resp.Status = "1036"
return
}
// var settleResp base.SettleResp
for _, v := range req.Txns {
uid := util.GetIntFromString(v.UserId)
if uid <= 0 {
resp.Status = "1036"
return
}
gameID := 0
var provider *common.ConfigGameProvider
if v.Platform == "SEXYBCRT" {
fmt.Sscanf(v.GameCode, "MX-LIVE-%d", &gameID)
provider = call.GetConfigGameProvider(common.ProviderSexy)
}
base.VoidSettle(&base.VoidSettleReq{
UID: uid,
Provider: provider,
BetID: v.PlatformTxId,
})
}
resp.Status = "0000"
}
func give(a *app.Gin) {
req := new(GiveReq)
message := a.TmpData.(string)
resp := &GiveResp{}
a.RetData = resp
err := json.Unmarshal([]byte(message), req)
if err != nil {
log.Error("err:%v", err)
resp.Status = "1036"
return
}
now := time.Now().Unix()
// var settleResp base.SettleResp
for _, v := range req.Txns {
uid := util.GetIntFromString(v.UserId)
if uid <= 0 {
resp.Status = "1036"
return
}
ctName := v.Currency
if ctName == "USD" {
ctName = "USDT"
}
ct := common.GetCurrencyID(ctName)
if !ct.IsValid() {
resp.Status = "1036"
return
}
var provider *common.ConfigGameProvider
if v.Platform == "SEXYBCRT" {
provider = call.GetConfigGameProvider(common.ProviderSexy)
}
var txTime int64
t, err := time.Parse(TimeFormatString, v.TxTime)
if err != nil {
txTime = now
} else {
txTime = t.Unix()
}
base.Adjustment(&base.AdjustmentReq{
Time: txTime,
UID: uid,
CurrencyType: ct,
Amount: common.CashFloat64ToInt64(v.Amount),
Provider: provider,
BetID: v.PromotionTxId + v.PromotionId,
Ess: v.PromotionTypeId,
Type: common.SessionTypeActivity,
})
}
resp.Status = "0000"
}
func resettle(a *app.Gin) {
req := new(SettleReq)
message := a.TmpData.(string)
resp := &SettleResp{}
a.RetData = resp
err := json.Unmarshal([]byte(message), req)
if err != nil {
log.Error("err:%v", err)
resp.Status = "1036"
return
}
var settleResp base.ReSettleResp
for _, v := range req.Txns {
uid := util.GetIntFromString(v.UserId)
if uid <= 0 {
resp.Status = "1036"
return
}
var provider *common.ConfigGameProvider
if v.Platform == "SEXYBCRT" {
provider = call.GetConfigGameProvider(common.ProviderSexy)
}
settleResp = base.Resettle(&base.ReSettleReq{
UID: uid,
SettleAmount: common.CashFloat64ToInt64(v.WinAmount),
Provider: provider,
BetID: v.PlatformTxId,
})
}
resp.Status = "0000"
if settleResp.Code != base.CodeOk {
resp.Status = "9999"
}
}