2026-04-06 02:06:11 +08:00
|
|
|
|
package app
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"blazing/cool"
|
|
|
|
|
|
configservice "blazing/modules/config/service"
|
|
|
|
|
|
playerservice "blazing/modules/player/service"
|
|
|
|
|
|
"context"
|
|
|
|
|
|
"fmt"
|
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/deatil/go-cryptobin/cryptobin/crypto"
|
|
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
type SignController struct {
|
|
|
|
|
|
*cool.Controller
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
|
controller := &SignController{
|
|
|
|
|
|
&cool.Controller{
|
|
|
|
|
|
Prefix: "/seer/game/sign",
|
|
|
|
|
|
Api: []string{},
|
|
|
|
|
|
Service: configservice.NewSignInService(),
|
|
|
|
|
|
},
|
|
|
|
|
|
}
|
|
|
|
|
|
cool.RegisterController(controller)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type SignStateReq struct {
|
2026-04-06 02:51:13 +08:00
|
|
|
|
g.Meta `path:"/state" method:"GET"`
|
|
|
|
|
|
UserID uint32 `json:"user_id" v:"required|min:1#用户ID不能为空|用户ID非法"`
|
|
|
|
|
|
Session string `json:"session" v:"required#session不能为空"`
|
2026-04-06 02:06:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type SignClaimReq struct {
|
2026-04-06 02:51:13 +08:00
|
|
|
|
g.Meta `path:"/claim" method:"POST"`
|
|
|
|
|
|
UserID uint32 `json:"user_id" v:"required|min:1#用户ID不能为空|用户ID非法"`
|
|
|
|
|
|
Session string `json:"session" v:"required#session不能为空"`
|
2026-04-06 02:06:11 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (c *SignController) State(ctx context.Context, req *SignStateReq) (res *cool.BaseRes, err error) {
|
|
|
|
|
|
if err = g.Validator().Data(req).Run(ctx); err != nil {
|
|
|
|
|
|
return cool.Fail(err.Error()), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
if err = validateGameSession(req.UserID, req.Session); err != nil {
|
|
|
|
|
|
return cool.Fail(err.Error()), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-06 02:51:13 +08:00
|
|
|
|
state, err := playerservice.NewSignService(req.UserID).GetState()
|
2026-04-06 02:06:11 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return cool.Fail(err.Error()), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
return cool.Ok(state), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (c *SignController) Claim(ctx context.Context, req *SignClaimReq) (res *cool.BaseRes, err error) {
|
|
|
|
|
|
if err = g.Validator().Data(req).Run(ctx); err != nil {
|
|
|
|
|
|
return cool.Fail(err.Error()), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
if err = validateGameSession(req.UserID, req.Session); err != nil {
|
|
|
|
|
|
return cool.Fail(err.Error()), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-06 02:51:13 +08:00
|
|
|
|
result, err := playerservice.NewSignService(req.UserID).Claim()
|
2026-04-06 02:06:11 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return cool.Fail(err.Error()), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
return cool.Ok(result), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func validateGameSession(userID uint32, session string) error {
|
|
|
|
|
|
if userID == 0 {
|
|
|
|
|
|
return fmt.Errorf("user_id不能为空")
|
|
|
|
|
|
}
|
|
|
|
|
|
session = strings.TrimSpace(session)
|
|
|
|
|
|
if session == "" {
|
|
|
|
|
|
return fmt.Errorf("session不能为空")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cached, err := cool.CacheManager.Get(context.Background(), fmt.Sprintf("session:%d", userID))
|
|
|
|
|
|
if err != nil || cached.IsEmpty() {
|
|
|
|
|
|
return fmt.Errorf("session已过期,请重新登录")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
rawSession := session
|
|
|
|
|
|
decrypted := crypto.
|
|
|
|
|
|
FromBase64String(session).
|
|
|
|
|
|
SetKey("gfertf12dfertf12").
|
|
|
|
|
|
SetIv("gfertf12dfertf12").
|
|
|
|
|
|
Aes().
|
|
|
|
|
|
CBC().
|
|
|
|
|
|
PKCS7Padding().
|
|
|
|
|
|
Decrypt().
|
|
|
|
|
|
ToString()
|
|
|
|
|
|
if decrypted != "" {
|
|
|
|
|
|
rawSession = decrypted
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if rawSession != cached.String() {
|
|
|
|
|
|
return fmt.Errorf("session无效,请重新登录")
|
|
|
|
|
|
}
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|