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.
388 lines
10 KiB
388 lines
10 KiB
package handler |
|
|
|
import ( |
|
"fmt" |
|
"net/http/httptest" |
|
"reflect" |
|
"server/call" |
|
"server/common" |
|
"server/db" |
|
"server/modules/web/app" |
|
"server/modules/web/values" |
|
"server/util" |
|
"time" |
|
|
|
"github.com/gin-gonic/gin" |
|
"github.com/liangdas/mqant/log" |
|
"gorm.io/gorm" |
|
) |
|
|
|
func getUserInfo(uid int) (resp values.UserInfoResp, err error) { |
|
pd := &common.PlayerData{UID: uid} |
|
db.Mysql().Get(pd) |
|
ret, err := call.GetUserXInfo(uid, "avatar", "nick", "mobile", "birth") |
|
if err != nil { |
|
log.Error("err:%v", err) |
|
return |
|
} |
|
resp = values.UserInfoResp{ |
|
UID: uid, |
|
Nick: ret.Nick, |
|
Avatar: ret.Avatar, |
|
VIPLevel: call.GetVIP(uid).Level, |
|
Currencys: make(map[common.CurrencyType]int64), |
|
Feedback: pd.FeedbackTime > 0, |
|
NewPddShare: call.HasNewAcitivityPddShare(uid), |
|
Birth: ret.Birth, |
|
Phone: ret.Mobile, |
|
CurrentVip: &values.OneUserInfoVip{}, |
|
NextVip: &values.OneUserInfoVip{}, |
|
} |
|
|
|
resp.Activitys.RechargeBack = call.ShouldShowActivityFirstRechargeBack(uid) |
|
resp.Activitys.DaySign = call.ShouldShowActivitySign(uid) |
|
resp.Activitys.WeekCard = call.ShouldShowActivityWeekCard(uid) |
|
resp.Activitys.LuckyShop = call.ShouldShowActivityLuckShop(uid) |
|
vip := call.GetVipCon(uid) |
|
var nextVip *common.ConfigVIP |
|
if vip != nil { |
|
nextVip = call.GetConfigVIPByLevel(vip.Level + 1) |
|
resp.CurrentVip.Bonus = vip.Bonus |
|
resp.CurrentVip.Cashback = vip.Cashback |
|
resp.CurrentVip.WithdrawFee = vip.Fee |
|
resp.CurrentVip.WithdrawCount = vip.WithdrawCount |
|
} |
|
|
|
if nextVip != nil { |
|
resp.NextVip.Bonus = nextVip.Bonus |
|
resp.NextVip.Cashback = nextVip.Cashback |
|
resp.NextVip.WithdrawFee = nextVip.Fee |
|
resp.NextVip.WithdrawCount = nextVip.WithdrawCount |
|
} else { |
|
resp.NextVip = resp.CurrentVip |
|
} |
|
|
|
if pd.LastAppSpinDraw == 0 { |
|
resp.AppSpinCount++ |
|
} |
|
currency := &common.PlayerCurrency{UID: uid} |
|
db.Mysql().Get(currency) |
|
ref := reflect.ValueOf(currency).Elem() |
|
for i := common.CurrencyTypeZero + 1; i < common.CurrencyAll; i++ { |
|
if i == common.CurrencyUSDT { |
|
continue |
|
} |
|
resp.Currencys[i] = ref.Field(int(i) + 1).Int() |
|
} |
|
re := &common.RechargeInfo{UID: uid} |
|
db.Mysql().Get(re) |
|
resp.Recharge = re.TotalRecharge |
|
return |
|
} |
|
|
|
func GetUserInfo(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.Response() |
|
}() |
|
req := new(values.GetUserInfoReq) |
|
if !a.S(req) { |
|
return |
|
} |
|
uid := a.UID |
|
if req.UID > 0 { |
|
uid = req.UID |
|
} |
|
CheckTask(a) |
|
|
|
// todo |
|
pd := &common.PlayerData{UID: uid} |
|
db.Mysql().Get(pd) |
|
ret, err := call.GetUserXInfo(uid, "avatar", "nick", "mobile", "birth") |
|
if err != nil { |
|
log.Error("err:%v", err) |
|
a.Code = values.CodeRetry |
|
return |
|
} |
|
resp := values.UserInfoResp{ |
|
UID: uid, |
|
Nick: ret.Nick, |
|
Avatar: ret.Avatar, |
|
VIPLevel: call.GetVIP(uid).Level, |
|
Currencys: make(map[common.CurrencyType]int64), |
|
Feedback: pd.FeedbackTime > 0, |
|
NewPddShare: call.HasNewAcitivityPddShare(a.UID), |
|
Birth: ret.Birth, |
|
Phone: ret.Mobile, |
|
CurrentVip: &values.OneUserInfoVip{}, |
|
NextVip: &values.OneUserInfoVip{}, |
|
} |
|
resp.Activitys.RechargeBack = call.ShouldShowActivityFirstRechargeBack(uid) |
|
resp.Activitys.DaySign = call.ShouldShowActivitySign(uid) |
|
resp.Activitys.WeekCard = call.ShouldShowActivityWeekCard(uid) |
|
resp.Activitys.LuckyShop = call.ShouldShowActivityLuckShop(uid) |
|
vip := call.GetVipCon(a.UID) |
|
nextVip := call.GetConfigVIPByLevel(vip.Level + 1) |
|
resp.CurrentVip.Bonus = vip.Bonus |
|
resp.CurrentVip.Cashback = vip.Cashback |
|
resp.CurrentVip.WithdrawFee = vip.Fee |
|
resp.CurrentVip.WithdrawCount = vip.WithdrawCount |
|
// resp.CurrentVip.Cashback = util.FormatFloat(float64(vip.Cashback)/10, 2) + "%" |
|
// resp.CurrentVip.WithdrawFee = util.FormatFloat(float64(vip.Fee)/10, 2) + "%" |
|
if nextVip != nil { |
|
resp.NextVip.Bonus = nextVip.Bonus |
|
resp.NextVip.Cashback = nextVip.Cashback |
|
resp.NextVip.WithdrawFee = nextVip.Fee |
|
resp.NextVip.WithdrawCount = nextVip.WithdrawCount |
|
// resp.NextVip.Cashback = util.FormatFloat(float64(nextVip.Cashback)/10, 2) + "%" |
|
// resp.NextVip.WithdrawFee = util.FormatFloat(float64(nextVip.Fee)/10, 2) + "%" |
|
} else { |
|
resp.NextVip = resp.CurrentVip |
|
} |
|
|
|
if pd.LastAppSpinDraw == 0 { |
|
resp.AppSpinCount++ |
|
} |
|
// call.GetUserCurrency() |
|
currency := &common.PlayerCurrency{UID: uid} |
|
db.Mysql().Get(currency) |
|
// currencyRe := &common.PlayerCurrency{UID: uid} |
|
// db.Mysql().C().Table(common.PlayerRechargeTableName).Where("uid = ?", uid).Scan(currencyRe) |
|
ref := reflect.ValueOf(currency).Elem() |
|
// refRe := reflect.ValueOf(currencyRe).Elem() |
|
for i := common.CurrencyTypeZero + 1; i < common.CurrencyAll; i++ { |
|
if i == common.CurrencyUSDT { |
|
continue |
|
} |
|
resp.Currencys[i] = ref.Field(int(i) + 1).Int() |
|
} |
|
// 一些参数只发给玩家自己 |
|
// if req.UID <= 0 { |
|
re := &common.RechargeInfo{UID: uid} |
|
db.Mysql().Get(re) |
|
resp.Recharge = re.TotalRecharge |
|
a.Code = values.CodeOK |
|
// } |
|
a.Data = resp |
|
util.Go(func() { |
|
CheckRedPoint(uid, c) |
|
}) |
|
|
|
} |
|
|
|
func EditUserInfo(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.Response() |
|
}() |
|
req := new(values.EditUserInfoReq) |
|
if !a.S(req) { |
|
return |
|
} |
|
if req.Avatar == nil && req.Nick == nil { |
|
a.Code = values.CodeParam |
|
return |
|
} |
|
tx := db.Mysql().Begin() |
|
uid := a.UID |
|
defer func() { |
|
a.MCommit(tx) |
|
}() |
|
update := map[string]interface{}{} |
|
if req.Nick != nil { |
|
if !call.IsUserNickValid(*req.Nick) { |
|
a.Code = values.CodeNickInvalid |
|
return |
|
} |
|
// pd := &common.PlayerData{UID: uid} |
|
// db.Mysql().Get(pd) |
|
// if pd.LastNickEdit > 0 { |
|
// if time.Now().Unix()-pd.LastNickEdit < 24*60*60 { |
|
// a.Code = values.CodeNickEditBusy |
|
// return |
|
// } |
|
// if _, err := call.UpdateCurrencyAndNotify(&common.UpdateCurrencyNotify{ |
|
// UID: uid, |
|
// Event: common.CurrencyEventChangeNick, |
|
// Pairs: []*common.CurrencyPair{{Type: common.CurrencyTypeCash, Value: -200}}, |
|
// }, true, tx); err != nil { |
|
// log.Error("err:%v", err) |
|
// a.Code = values.CodeRetry |
|
// return |
|
// } |
|
// } |
|
// if err := tx.Model(pd).Where("uid = ? and last_nick_edit = ?", uid, pd.LastNickEdit).Updates(&common.PlayerData{LastNickEdit: time.Now().Unix()}).Error; err != nil { |
|
// log.Error("err:%v", err) |
|
// a.Code = values.CodeRetry |
|
// return |
|
// } |
|
update["nick"] = *req.Nick |
|
} |
|
if req.Avatar != nil { |
|
update["avatar"] = *req.Avatar |
|
} |
|
search := &common.PlayerDBInfo{Id: uid} |
|
if err := tx.Model(search).Where(search).Updates(update).Error; err != nil { |
|
log.Error("err:%v", err) |
|
a.Code = values.CodeRetry |
|
return |
|
} |
|
if err := db.Redis().UpdateUserFields(uid, update); err != nil { |
|
log.Error("err:%v", err) |
|
a.Code = values.CodeRetry |
|
return |
|
} |
|
} |
|
|
|
func Feedback(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.Response() |
|
}() |
|
req := new(values.FeedbackReq) |
|
if !a.S(req) { |
|
return |
|
} |
|
if len(req.List) == 0 { |
|
return |
|
} |
|
// questions := []int{} |
|
// all := []values.OneFeedback{} |
|
for _, v := range req.List { |
|
for _, j := range v.Choose { |
|
if j == 0 && v.Context == "" { |
|
a.Code = values.CodeParam |
|
a.Msg = "context should not be empty." |
|
return |
|
} |
|
} |
|
// if !util.SliceContain(questions, v.Index) { |
|
// questions = append(questions, v.Index) |
|
// all = append(all, v) |
|
// } |
|
} |
|
pd := &common.PlayerData{UID: a.UID} |
|
db.Mysql().Get(pd) |
|
if pd.FeedbackTime > 0 { |
|
a.Code = values.CodeRetry |
|
return |
|
} |
|
now := time.Now().Unix() |
|
rows, err := db.Mysql().UpdateResW(&common.PlayerData{}, map[string]interface{}{"feedback_time": now}, fmt.Sprintf("uid = %d and feedback_time = 0", a.UID)) |
|
if err != nil { |
|
log.Error("err:%v", err) |
|
a.Code = values.CodeRetry |
|
return |
|
} |
|
if rows == 0 { |
|
a.Code = values.CodeRetry |
|
return |
|
} |
|
call.GetAcitivityPddData(a.UID) |
|
db.Mysql().Update(&common.PddData{UID: a.UID}, map[string]interface{}{"spin": gorm.Expr("spin + 1")}) |
|
for _, v := range req.List { |
|
for _, j := range v.Choose { |
|
db.ES().InsertToESGO(common.ESIndexBackFeedback, &common.ESFeedback{ |
|
UID: a.UID, |
|
QuestionIndex: v.Index, |
|
Choose: j, |
|
Context: v.Context, |
|
Time: now, |
|
}) |
|
} |
|
} |
|
} |
|
|
|
func FavoriteGame(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.Response() |
|
}() |
|
req := new(values.FavoriteGameReq) |
|
if !a.S(req) { |
|
return |
|
} |
|
if req.Cancel { |
|
err := call.DelPlayerFavorite(a.UID, req.GameProvider, req.GameId) |
|
if err != nil { |
|
a.Code = values.CodeRetry |
|
a.Msg = err.Error() |
|
return |
|
} |
|
} else { |
|
err := call.AddPlayerFavorite(a.UID, req.GameProvider, req.GameId) |
|
if err != nil { |
|
a.Code = values.CodeRetry |
|
a.Msg = err.Error() |
|
} |
|
} |
|
} |
|
|
|
func GetRedPoint(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.Response() |
|
}() |
|
CheckRedPoint(a.UID, c) |
|
} |
|
|
|
func newContext(c *gin.Context) *gin.Context { |
|
// 创建一个新的 HTTP 请求 |
|
req := httptest.NewRequest(c.Request.Method, c.Request.URL.String(), c.Request.Body) |
|
// 复制头部信息 |
|
for key, values := range c.Request.Header { |
|
for _, value := range values { |
|
req.Header.Add(key, value) |
|
} |
|
} |
|
// 创建一个新的 gin.Context |
|
w := httptest.NewRecorder() |
|
nContext, _ := gin.CreateTestContext(w) |
|
nContext.Request = req |
|
return nContext |
|
} |
|
|
|
// CheckTask 完成任务 |
|
func CheckTask(a *app.Gin) { |
|
var taskList []*values.OneTask |
|
tasks := call.GetConfigTask() |
|
for _, v := range tasks { |
|
one := &values.OneTask{ |
|
ID: v.ID, |
|
TaskID: v.TaskID, |
|
Target: v.Target, |
|
Reward: v.Reward, |
|
Kind: v.Kind, |
|
Type: int(v.Type), |
|
Icon: v.Icon, |
|
Title: common.GetTaskTitle(v), |
|
Action: v.Action, |
|
} |
|
taskList = append(taskList, one) |
|
} |
|
for _, v := range taskList { |
|
if v.Type == int(common.TaskTypeDownload) && v.Progess != -1 { // 已下载直接标记为完成 |
|
if a.DeviceType == common.DeviceTypeWebview || a.DeviceType == common.DeviceTypePWA { |
|
// 直接领取下载奖励 |
|
taskId := call.CheckTask(call.Task{Uid: a.UID, Value: 0, Types: []common.TaskType{common.TaskTypeDownload}}) |
|
TaskComplete(a, &DrawTaskReq{TaskID: taskId}) |
|
} |
|
} |
|
} |
|
} |
|
func CheckRedPoint(uid int, c *gin.Context) { |
|
// 防止玩家未连接网关,所以延迟3秒 |
|
time.AfterFunc(time.Second*3, func() { |
|
nc := newContext(c) |
|
// 是否可以转动转盘 |
|
ActivityBetDrawInfo(nc) |
|
// 是否可以签到 |
|
ActivitySignNewInfo(nc) |
|
// 判断是否有任务可以领取 |
|
GetPromotions(nc) |
|
// 邀请奖励 |
|
ShareInfo(nc) |
|
// vip奖励 |
|
GetVipInfo(nc) |
|
}) |
|
}
|
|
|