Files
bl/modules/player/controller/app/cdk.go
昔念 da118dc826
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
1
2026-04-18 16:34:03 +08:00

171 lines
5.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package app
import (
"blazing/cool"
baseservice "blazing/modules/base/service"
configservice "blazing/modules/config/service"
playerservice "blazing/modules/player/service"
"context"
"strings"
"time"
"github.com/gogf/gf/v2/frame/g"
)
type CdkController struct {
*cool.Controller
}
// init 注册用户态CDK相关Web接口。
func init() {
controller := &CdkController{
&cool.Controller{
Prefix: "/seer/game/cdk",
Api: []string{},
Service: configservice.NewCdkService(),
},
}
cool.RegisterController(controller)
}
type DonationServerListReq struct {
g.Meta `path:"/donation/serverIds" method:"GET"`
}
type DonationCurrentReq struct {
g.Meta `path:"/donation/current" method:"GET"`
}
type DonationServerInfoReq struct {
g.Meta `path:"/donation/serverInfo" method:"GET"`
ServerID uint32 `json:"server_id" v:"required|min:1#服务器ID不能为空|服务器ID非法"`
}
type DonationServerInfoRes struct {
ServerID uint32 `json:"server_id"`
ServerName string `json:"server_name"`
Remark string `json:"remark"`
}
type DonationRedeemReq struct {
g.Meta `path:"/donation/redeem" method:"POST"`
CDKCode string `json:"cdk_code" v:"required#CDK不能为空"`
ServerID uint32 `json:"server_id" v:"required|min:1#服务器ID不能为空|服务器ID非法"`
ServerName string `json:"server_name" v:"required#服务器名称不能为空"`
}
type DonationRedeemRes struct {
ServerID uint32 `json:"server_id"`
ServerName string `json:"server_name"`
OwnerID uint32 `json:"owner_id"`
ServerExpireTime time.Time `json:"server_expire_time"`
}
// DonationServerIDs 查询当前可用于服务器绑定CDK的服务器ID列表。
func (c *CdkController) DonationServerIDs(ctx context.Context, req *DonationServerListReq) (res *cool.BaseRes, err error) {
admin := cool.GetAdmin(ctx)
if admin == nil || admin.UserId == 0 {
return cool.Fail("未登录或登录已失效"), nil
}
return cool.Ok(g.Map{
"server_ids": configservice.NewServerService().GetDonationAvailableServerIDs(),
}), nil
}
// DonationCurrent 查询当前账号名下仍在有效期内的服务器冠名信息。
func (c *CdkController) DonationCurrent(ctx context.Context, req *DonationCurrentReq) (res *cool.BaseRes, err error) {
admin := cool.GetAdmin(ctx)
if admin == nil || admin.UserId == 0 {
return cool.Fail("未登录或登录已失效"), nil
}
return cool.Ok(g.Map{
"list": configservice.NewServerService().GetOwnerActiveDonationServers(uint32(admin.UserId)),
}), nil
}
// DonationServerInfo 查询冠名兑换前展示的服务器名称与备注。
func (c *CdkController) DonationServerInfo(ctx context.Context, req *DonationServerInfoReq) (res *cool.BaseRes, err error) {
if err = g.Validator().Data(req).Run(ctx); err != nil {
return cool.Fail(err.Error()), nil
}
admin := cool.GetAdmin(ctx)
if admin == nil || admin.UserId == 0 {
return cool.Fail("未登录或登录已失效"), nil
}
server := configservice.NewServerService().GetServerID(req.ServerID)
if server.OnlineID == 0 {
return cool.Fail("服务器不存在"), nil
}
return cool.Ok(&DonationServerInfoRes{
ServerID: server.OnlineID,
ServerName: server.Name,
Remark: server.Desc,
}), nil
}
// DonationRedeem 兑换服务器绑定类型CDK并完成冠名写入。
func (c *CdkController) DonationRedeem(ctx context.Context, req *DonationRedeemReq) (res *cool.BaseRes, err error) {
if err = g.Validator().Data(req).Run(ctx); err != nil {
return cool.Fail(err.Error()), nil
}
admin := cool.GetAdmin(ctx)
if admin == nil || admin.UserId == 0 {
return cool.Fail("未登录或登录已失效"), nil
}
ownerID := uint32(admin.UserId)
user := baseservice.NewBaseSysUserService().GetPerson(ownerID)
if user == nil || user.QQ == 0 {
return cool.Fail("请先绑定QQ"), nil
}
cdkCode := strings.TrimSpace(req.CDKCode)
if cdkCode == "" {
return cool.Fail("CDK不能为空"), nil
}
serverName := strings.TrimSpace(req.ServerName)
serverName = strings.Trim(cool.Filter.Replace(serverName, '*'), "*")
if serverName == "" {
return cool.Fail("服务器名称不能为空"), nil
}
cdkService := configservice.NewCdkService()
cdkInfo := cdkService.Get(cdkCode)
if cdkInfo == nil {
return cool.Fail("CDK不存在或已被使用"), nil
}
if cdkInfo.Type != configservice.CDKTypeServerNaming {
return cool.Fail("当前页面仅支持服务器冠名CDK请确认输入的是服务器冠名类型"), nil
}
if cdkInfo.BindUserId != 0 && cdkInfo.BindUserId != ownerID {
return cool.Fail("CDK已绑定其他用户"), nil
}
if !cdkInfo.ValidEndTime.IsZero() && cdkInfo.ValidEndTime.Before(time.Now()) {
return cool.Fail("CDK已过期"), nil
}
playerCdkService := playerservice.NewCdkService(ownerID)
if !playerCdkService.CanGet(uint32(cdkInfo.ID)) {
return cool.Fail("CDK已领取"), nil
}
serverInfo, useErr := cdkService.UseServerNamingCDK(ctx, cdkCode, ownerID, req.ServerID, serverName)
if useErr != nil {
return cool.Fail(useErr.Error()), nil
}
playerCdkService.Log(uint32(cdkInfo.ID))
return cool.Ok(&DonationRedeemRes{
ServerID: serverInfo.ServerID,
ServerName: serverInfo.ServerName,
OwnerID: serverInfo.OwnerID,
ServerExpireTime: serverInfo.ServerExpireTime,
}), nil
}