All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
feat(fight): 新增疲惫状态并优化睡眠状态机制 - 实现疲惫状态(StatusTired),仅限制攻击技能,允许属性技能正常使用 - 重构睡眠状态,改为在被攻击且未miss时立即解除,而非技能使用后 - 修复寄生种子效果触发时机,改为回合开始时触发 - 调整寄生效果的目标为技能施放者而非
166 lines
5.0 KiB
Go
166 lines
5.0 KiB
Go
package app
|
||
|
||
import (
|
||
"blazing/cool"
|
||
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)
|
||
|
||
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
|
||
}
|