From 3b35789b471337e43b318ab818fd1a5c9ae28b1d Mon Sep 17 00:00:00 2001 From: xinian Date: Wed, 8 Apr 2026 19:31:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96CDK=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E5=86=A0=E5=90=8D=E9=80=BB=E8=BE=91=E4=B8=8E=E9=89=B4?= =?UTF-8?q?=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/cool/coolconfig/config.go | 244 ++++++++++++++------------- logic/controller/inbound_user.go | 90 +++++++--- modules/config/service/cdk.go | 44 +++-- modules/config/service/server.go | 6 +- modules/player/controller/app/cdk.go | 48 +++--- 5 files changed, 248 insertions(+), 184 deletions(-) diff --git a/common/cool/coolconfig/config.go b/common/cool/coolconfig/config.go index 3b44a9bbc..6ef563c81 100644 --- a/common/cool/coolconfig/config.go +++ b/common/cool/coolconfig/config.go @@ -1,121 +1,123 @@ -package coolconfig - -import ( - "time" - - "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/util/gconv" -) - -// cool config -type sConfig struct { - AutoMigrate bool `json:"auto_migrate,omitempty"` // 是否自动创建表 - Eps bool `json:"eps,omitempty"` // 是否开启eps - File *file `json:"file,omitempty"` // 文件上传配置 - Name string `json:"name"` // 项目名称 - // LoginPort string `json:"port"` - GameOnlineID uint32 `json:"port_bl"` //这个是命令行输入的参数 - ServerInfo ServerList - - Address string //rpc端口 - -} -type ServerList struct { - OnlineID uint32 `gorm:"column:online_id;comment:'在线ID';uniqueIndex" json:"online_id"` - //服务器名称Desc - Name string `gorm:"comment:'服务器名称'" json:"name"` - IP string `gorm:"type:string;comment:'服务器IP'" json:"ip"` - Port uint32 `gorm:"comment:'端口号,通常是小整数'" json:"port"` - IsOpen uint8 `gorm:"default:0;not null;comment:'是否开启'" json:"is_open"` - //登录地址 - LoginAddr string `gorm:"type:string;comment:'登录地址'" json:"login_addr"` - //账号 - Account string `gorm:"type:string;comment:'账号'" json:"account"` - //密码 - Password string `gorm:"type:string;comment:'密码'" json:"password"` - CanPort []uint32 `gorm:"type:jsonb;comment:'可连接端口'" json:"can_port"` - //是否测试服 - IsVip uint32 `gorm:"default:0;not null;comment:'是否为VIP服务器'" json:"is_vip"` - //isdebug 是否本地服 - IsDebug uint8 `gorm:"default:0;comment:'是否为调试模式'" json:"is_debug"` - - //服务器属主Desc - Owner uint32 `gorm:"comment:'服务器属主'" json:"owner"` - Desc string `gorm:"comment:'服务器描述'" json:"desc"` - OldScreen string `gorm:"comment:'服务器screen参数'" json:"old_screen"` - //到期时间ServerList - ExpireTime time.Time `gorm:"default:0;comment:'到期时间'" json:"expire_time"` -} - -func (s *ServerList) GetID() string { - return gconv.String(100000*s.OnlineID + s.Port) -} - -// OSS相关配置 -type oss struct { - Endpoint string `json:"endpoint"` - AccessKeyID string `json:"accessKeyID"` - SecretAccessKey string `json:"secretAccessKey"` - UseSSL bool `json:"useSSL"` - BucketName string `json:"bucketName"` - Location string `json:"location"` -} - -// 文件上传配置 -type file struct { - Mode string `json:"mode"` // 模式 local oss - Domain string `json:"domain"` // 域名 http:// - Oss *oss `json:"oss,omitempty"` -} - -// NewConfig new config -func newConfig() *sConfig { - var ctx g.Ctx - config := &sConfig{ - AutoMigrate: GetCfgWithDefault(ctx, "blazing.autoMigrate", g.NewVar(false)).Bool(), - Name: GetCfgWithDefault(ctx, "server.name", g.NewVar("")).String(), - - Eps: GetCfgWithDefault(ctx, "blazing.eps", g.NewVar(false)).Bool(), - // LoginPort: string(GetCfgWithDefault(ctx, "server.port", g.NewVar("8080")).String()), - Address: GetCfgWithDefault(ctx, "server.address", g.NewVar("8080")).String(), - //GamePort: GetCfgWithDefault(ctx, "server.game", g.NewVar("8080")).Uint64s(), - - File: &file{ - Mode: GetCfgWithDefault(ctx, "blazing.file.mode", g.NewVar("none")).String(), - Domain: GetCfgWithDefault(ctx, "blazing.file.domain", g.NewVar("http://127.0.0.1:8300")).String(), - Oss: &oss{ - Endpoint: GetCfgWithDefault(ctx, "blazing.file.oss.endpoint", g.NewVar("127.0.0.1:9000")).String(), - AccessKeyID: GetCfgWithDefault(ctx, "blazing.file.oss.accessKeyID", g.NewVar("")).String(), - SecretAccessKey: GetCfgWithDefault(ctx, "blazing.file.oss.secretAccessKey", g.NewVar("")).String(), - UseSSL: GetCfgWithDefault(ctx, "blazing.file.oss.useSSL", g.NewVar(false)).Bool(), - BucketName: GetCfgWithDefault(ctx, "blazing.file.oss.bucketName", g.NewVar("blazing")).String(), - Location: GetCfgWithDefault(ctx, "blazing.file.oss.location", g.NewVar("us-east-1")).String(), - }, - }, - } - - return config -} - -// qiniu 七牛云配置 -type qiniu struct { - AccessKey string `json:"ak"` - SecretKey string `json:"sk"` - Bucket string `json:"bucket"` - CDN string `json:"cdn"` -} - -// Config config -var Config = newConfig() - -// GetCfgWithDefault get config with default value -func GetCfgWithDefault(ctx g.Ctx, key string, defaultValue *g.Var) *g.Var { - value, err := g.Cfg().GetWithEnv(ctx, key) - if err != nil { - return defaultValue - } - if value.IsEmpty() || value.IsNil() { - return defaultValue - } - return value -} +package coolconfig + +import ( + "time" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" +) + +// cool config +type sConfig struct { + AutoMigrate bool `json:"auto_migrate,omitempty"` // 是否自动创建表 + Eps bool `json:"eps,omitempty"` // 是否开启eps + File *file `json:"file,omitempty"` // 文件上传配置 + Name string `json:"name"` // 项目名称 + // LoginPort string `json:"port"` + GameOnlineID uint32 `json:"port_bl"` //这个是命令行输入的参数 + ServerInfo ServerList + + Address string //rpc端口 + +} +type ServerList struct { + OnlineID uint32 `gorm:"column:online_id;comment:'在线ID';uniqueIndex" json:"online_id"` + //服务器名称Desc + Name string `gorm:"comment:'服务器名称'" json:"name"` + IP string `gorm:"type:string;comment:'服务器IP'" json:"ip"` + Port uint32 `gorm:"comment:'端口号,通常是小整数'" json:"port"` + IsOpen uint8 `gorm:"default:0;not null;comment:'是否开启'" json:"is_open"` + //登录地址 + LoginAddr string `gorm:"type:string;comment:'登录地址'" json:"login_addr"` + //账号 + Account string `gorm:"type:string;comment:'账号'" json:"account"` + //密码 + Password string `gorm:"type:string;comment:'密码'" json:"password"` + CanPort []uint32 `gorm:"type:jsonb;comment:'可连接端口'" json:"can_port"` + //是否测试服 + IsVip uint32 `gorm:"default:0;not null;comment:'是否为VIP服务器'" json:"is_vip"` + //isdebug 是否本地服 + IsDebug uint8 `gorm:"default:0;comment:'是否为调试模式'" json:"is_debug"` + + //服务器属主Desc + Owner uint32 `gorm:"comment:'服务器属主'" json:"owner"` + Desc string `gorm:"comment:'服务器描述'" json:"desc"` + OldScreen string `gorm:"comment:'服务器screen参数'" json:"old_screen"` + //到期时间ServerList + ExpireTime time.Time `gorm:"default:0;comment:'到期时间'" json:"expire_time"` + //CDK冠名到期时间ServerList + CDKExpireTime time.Time `gorm:"column:cdk_expire_time;default:0;comment:'CDK冠名到期时间'" json:"cdk_expire_time"` +} + +func (s *ServerList) GetID() string { + return gconv.String(100000*s.OnlineID + s.Port) +} + +// OSS相关配置 +type oss struct { + Endpoint string `json:"endpoint"` + AccessKeyID string `json:"accessKeyID"` + SecretAccessKey string `json:"secretAccessKey"` + UseSSL bool `json:"useSSL"` + BucketName string `json:"bucketName"` + Location string `json:"location"` +} + +// 文件上传配置 +type file struct { + Mode string `json:"mode"` // 模式 local oss + Domain string `json:"domain"` // 域名 http:// + Oss *oss `json:"oss,omitempty"` +} + +// NewConfig new config +func newConfig() *sConfig { + var ctx g.Ctx + config := &sConfig{ + AutoMigrate: GetCfgWithDefault(ctx, "blazing.autoMigrate", g.NewVar(false)).Bool(), + Name: GetCfgWithDefault(ctx, "server.name", g.NewVar("")).String(), + + Eps: GetCfgWithDefault(ctx, "blazing.eps", g.NewVar(false)).Bool(), + // LoginPort: string(GetCfgWithDefault(ctx, "server.port", g.NewVar("8080")).String()), + Address: GetCfgWithDefault(ctx, "server.address", g.NewVar("8080")).String(), + //GamePort: GetCfgWithDefault(ctx, "server.game", g.NewVar("8080")).Uint64s(), + + File: &file{ + Mode: GetCfgWithDefault(ctx, "blazing.file.mode", g.NewVar("none")).String(), + Domain: GetCfgWithDefault(ctx, "blazing.file.domain", g.NewVar("http://127.0.0.1:8300")).String(), + Oss: &oss{ + Endpoint: GetCfgWithDefault(ctx, "blazing.file.oss.endpoint", g.NewVar("127.0.0.1:9000")).String(), + AccessKeyID: GetCfgWithDefault(ctx, "blazing.file.oss.accessKeyID", g.NewVar("")).String(), + SecretAccessKey: GetCfgWithDefault(ctx, "blazing.file.oss.secretAccessKey", g.NewVar("")).String(), + UseSSL: GetCfgWithDefault(ctx, "blazing.file.oss.useSSL", g.NewVar(false)).Bool(), + BucketName: GetCfgWithDefault(ctx, "blazing.file.oss.bucketName", g.NewVar("blazing")).String(), + Location: GetCfgWithDefault(ctx, "blazing.file.oss.location", g.NewVar("us-east-1")).String(), + }, + }, + } + + return config +} + +// qiniu 七牛云配置 +type qiniu struct { + AccessKey string `json:"ak"` + SecretKey string `json:"sk"` + Bucket string `json:"bucket"` + CDN string `json:"cdn"` +} + +// Config config +var Config = newConfig() + +// GetCfgWithDefault get config with default value +func GetCfgWithDefault(ctx g.Ctx, key string, defaultValue *g.Var) *g.Var { + value, err := g.Cfg().GetWithEnv(ctx, key) + if err != nil { + return defaultValue + } + if value.IsEmpty() || value.IsNil() { + return defaultValue + } + return value +} diff --git a/logic/controller/inbound_user.go b/logic/controller/inbound_user.go index 365b8bfd3..2466cf74b 100644 --- a/logic/controller/inbound_user.go +++ b/logic/controller/inbound_user.go @@ -1,56 +1,92 @@ package controller -import "blazing/logic/service/common" +import ( + "blazing/cool" + "blazing/logic/service/common" + "blazing/modules/player/model" + "context" + "encoding/hex" + "fmt" + "hash/crc32" +) -type Login struct { +// MAIN_LOGIN_IN 定义请求或响应数据结构。 +type MAIN_LOGIN_IN struct { Head common.TomeeHeader `cmd:"1001" struc:"skip"` Sid []byte `struc:"[16]byte"` } -type HeartBeat struct { - Head common.TomeeHeader `cmd:"2051" struc:"skip"` - Time uint32 +// CheakSession 校验登录session。 +func (l *MAIN_LOGIN_IN) CheakSession() (bool, uint32) { + t1 := hex.EncodeToString(l.Sid) + r, err := cool.CacheManager.Get(context.Background(), fmt.Sprintf("session:%d", l.Head.UserID)) + if err != nil { + return false, 0 + } + if r.String() != t1 { + return false, 0 + } + crc32Table := crc32.MakeTable(crc32.IEEE) + crcValue := crc32.Checksum([]byte(l.Sid), crc32Table) + cool.CacheManager.Remove(context.Background(), fmt.Sprintf("session:%d", l.Head.UserID)) + return true, crcValue } -type KeepAlive struct { - Head common.TomeeHeader `cmd:"2052" struc:"skip"` - Time uint32 +// SimUserInfoInboundInfo 定义请求或响应数据结构。 +type SimUserInfoInboundInfo struct { + Head common.TomeeHeader `cmd:"2051" struc:"skip"` + UserId uint32 `fieldDescription:"米米号" uint:"true" codec:"true"` } -type UserInfo struct { +// MoreUserInfoInboundInfo 定义请求或响应数据结构。 +type MoreUserInfoInboundInfo struct { + Head common.TomeeHeader `cmd:"2052" struc:"skip"` + UserId uint32 `fieldDescription:"米米号" uint:"true" codec:"true"` +} + +// AimatInboundInfo 定义请求或响应数据结构。 +type AimatInboundInfo struct { Head common.TomeeHeader `cmd:"2104" struc:"skip"` - UserID uint32 - ShowNono uint8 - RoomStyle uint32 + ItemId uint32 `description:"物品id 射击激光 物品id为0" codec:"auto" uint:"true"` + ShootType uint32 `description:"射击类型 未知 给0" codec:"auto" uint:"true"` + Point model.Pos `description:"射击的坐标 x y" codec:"auto"` } -type UserTalk struct { +// ChatInboundInfo 定义请求或响应数据结构。 +type ChatInboundInfo struct { Head common.TomeeHeader `cmd:"2102" struc:"skip"` - ReceiverID uint32 - MessageLen uint32 `struc:"sizeof=Message"` - Message []byte + Reserve uint32 `json:"reserve" fieldDescription:"填充 默认值为0" uint:"true"` + MessageLen uint32 `struc:"sizeof=Message"` + Message string `json:"message" fieldDescription:"消息内容, 结束符为utf-8的数字0"` } -type ChangeTitle struct { +// ChangeColorInboundInfo 定义请求或响应数据结构。 +type ChangeColorInboundInfo struct { Head common.TomeeHeader `cmd:"2063" struc:"skip"` - Title uint32 + Color uint32 `codec:"color"` } -type ChangePlayerIcon struct { - Head common.TomeeHeader `cmd:"2062" struc:"skip"` - Icon uint32 +// ChangeDoodleInboundInfo 定义请求或响应数据结构。 +type ChangeDoodleInboundInfo struct { + Head common.TomeeHeader `cmd:"2062" struc:"skip"` + Id uint32 `codec:"id"` + Color uint32 `codec:"color"` } -type GetMotto struct { - Head common.TomeeHeader `cmd:"9012" struc:"skip"` +// ChangeNONOColorInboundInfo 定义请求或响应数据结构。 +type ChangeNONOColorInboundInfo struct { + Head common.TomeeHeader `cmd:"9012" struc:"skip"` + Color uint32 `codec:"color"` } -type GetTask struct { - Head common.TomeeHeader `cmd:"2103" struc:"skip"` - TaskLen uint32 `struc:"sizeof=TaskList"` - TaskList []uint32 +// C2SDanceAction 定义请求或响应数据结构。 +type C2SDanceAction struct { + Head common.TomeeHeader `cmd:"2103" struc:"skip"` + Reserve uint32 `struc:"uint32,big"` + Type uint32 `struc:"uint32,big"` } +// C2SPEOPLE_TRANSFROM 定义请求或响应数据结构。 type C2SPEOPLE_TRANSFROM struct { Head common.TomeeHeader `cmd:"2111" struc:"skip"` SuitID uint32 `struc:"uint32,big"` diff --git a/modules/config/service/cdk.go b/modules/config/service/cdk.go index 4bfa0f1ea..ef7c16702 100644 --- a/modules/config/service/cdk.go +++ b/modules/config/service/cdk.go @@ -160,7 +160,16 @@ func (s *CdkService) Set(id string) bool { return true } -func (s *CdkService) UseServerNamingCDK(ctx context.Context, code string, ownerID, serverID uint32, serverName string) (*model.ServerList, error) { +type ServerNamingCDKResult struct { + ServerID uint32 + ServerName string + OwnerID uint32 + ServerExpireTime time.Time + CDKExpireTime time.Time +} + +// UseServerNamingCDK 使用服务器冠名类型CDK,并原子化更新服务器归属和到期时间。 +func (s *CdkService) UseServerNamingCDK(ctx context.Context, code string, ownerID, serverID uint32, serverName string) (*ServerNamingCDKResult, error) { if ctx == nil { ctx = context.TODO() } @@ -190,7 +199,10 @@ func (s *CdkService) UseServerNamingCDK(ctx context.Context, code string, ownerI if err := tx.Model(model.NewServerList()).Where("online_id", serverID).Scan(&server); err != nil { return err } - if !serverService.CanUseDonationName(server, now) { + if server.OnlineID == 0 { + return gerror.New("服务器不存在") + } + if server.Owner != ownerID && !serverService.CanUseDonationName(server, now) { return gerror.New("服务器不可冠名") } @@ -203,19 +215,23 @@ func (s *CdkService) UseServerNamingCDK(ctx context.Context, code string, ownerI return gerror.New("cdk已被使用") } - baseTime := now - if server.ExpireTime.After(now) { - baseTime = server.ExpireTime - } updated = server updated.Name = serverName updated.Owner = ownerID - updated.ExpireTime = baseTime.AddDate(0, 1, 0) + if server.Owner != ownerID { + updated.CDKExpireTime = now.AddDate(0, 1, 0) + } else { + baseTime := server.CDKExpireTime + if baseTime.IsZero() { + baseTime = now + } + updated.CDKExpireTime = baseTime.AddDate(0, 1, 0) + } _, err = tx.Model(model.NewServerList()).Where("online_id", serverID).Data(g.Map{ - "name": updated.Name, - "owner": updated.Owner, - "expire_time": updated.ExpireTime, + "name": updated.Name, + "owner": updated.Owner, + "cdk_expire_time": updated.CDKExpireTime, }).Update() return err }) @@ -225,7 +241,13 @@ func (s *CdkService) UseServerNamingCDK(ctx context.Context, code string, ownerI g.DB(s.Model.GroupName()).GetCore().ClearCache(context.TODO(), s.Model.TableName()) g.DB(model.NewServerList().GroupName()).GetCore().ClearCache(context.TODO(), model.NewServerList().TableName()) - return &updated, nil + return &ServerNamingCDKResult{ + ServerID: updated.OnlineID, + ServerName: updated.Name, + OwnerID: updated.Owner, + ServerExpireTime: updated.ExpireTime, + CDKExpireTime: updated.CDKExpireTime, + }, nil } func (s *CdkService) BatchGenerate(ctx context.Context, count int) (interface{}, error) { diff --git a/modules/config/service/server.go b/modules/config/service/server.go index 8b78a0e05..69d163cca 100644 --- a/modules/config/service/server.go +++ b/modules/config/service/server.go @@ -131,9 +131,10 @@ func (s *ServerService) GetServerID(OnlineID uint32) model.ServerList { } +// GetDonationAvailableServerIDs 返回当前可被冠名占用的服务器ID列表。 func (s *ServerService) GetDonationAvailableServerIDs() []uint32 { now := time.Now() - builder := dbm_nocache_noenable(s.Model).Builder().Where("owner", 0).WhereOr("expire_time <= ?", now) + builder := dbm_nocache_noenable(s.Model).Builder().Where("owner", 0).WhereOr("cdk_expire_time <= ?", now) var rows []struct { OnlineID uint32 `json:"online_id"` @@ -150,6 +151,7 @@ func (s *ServerService) GetDonationAvailableServerIDs() []uint32 { return ids } +// CanUseDonationName 校验目标服务器在当前时间点是否允许被冠名。 func (s *ServerService) CanUseDonationName(server model.ServerList, now time.Time) bool { if server.OnlineID == 0 { return false @@ -157,7 +159,7 @@ func (s *ServerService) CanUseDonationName(server model.ServerList, now time.Tim if server.Owner == 0 { return true } - return !server.ExpireTime.After(now) + return !server.CDKExpireTime.After(now) } // 保存版本号 diff --git a/modules/player/controller/app/cdk.go b/modules/player/controller/app/cdk.go index e46bb90e9..7baf5df7d 100644 --- a/modules/player/controller/app/cdk.go +++ b/modules/player/controller/app/cdk.go @@ -15,6 +15,7 @@ type CdkController struct { *cool.Controller } +// init 注册用户态CDK相关Web接口。 func init() { controller := &CdkController{ &cool.Controller{ @@ -27,33 +28,29 @@ func init() { } type DonationServerListReq struct { - g.Meta `path:"/donation/serverIds" method:"GET"` - UserID uint32 `json:"user_id" v:"required|min:1#用户ID不能为空|用户ID非法"` - Session string `json:"session" v:"required#session不能为空"` + g.Meta `path:"/donation/serverIds" method:"GET"` } type DonationRedeemReq struct { g.Meta `path:"/donation/redeem" method:"POST"` - UserID uint32 `json:"user_id" v:"required|min:1#用户ID不能为空|用户ID非法"` - Session string `json:"session" v:"required#session不能为空"` 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"` - ExpireTime time.Time `json:"expire_time"` + ServerID uint32 `json:"server_id"` + ServerName string `json:"server_name"` + OwnerID uint32 `json:"owner_id"` + ServerExpireTime time.Time `json:"server_expire_time"` + CDKExpireTime time.Time `json:"cdk_expire_time"` } +// DonationServerIDs 查询当前可用于服务器绑定CDK的服务器ID列表。 func (c *CdkController) DonationServerIDs(ctx context.Context, req *DonationServerListReq) (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 + admin := cool.GetAdmin(ctx) + if admin == nil || admin.UserId == 0 { + return cool.Fail("未登录或登录已失效"), nil } return cool.Ok(g.Map{ @@ -61,13 +58,17 @@ func (c *CdkController) DonationServerIDs(ctx context.Context, req *DonationServ }), 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 } - if err = validateGameSession(req.UserID, req.Session); 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 == "" { @@ -88,28 +89,29 @@ func (c *CdkController) DonationRedeem(ctx context.Context, req *DonationRedeemR if cdkInfo.CDKType != configservice.CDKTypeServerNaming { return cool.Fail("CDK类型不匹配"), nil } - if cdkInfo.BindUserId != 0 && cdkInfo.BindUserId != req.UserID { + 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(req.UserID) + playerCdkService := playerservice.NewCdkService(ownerID) if !playerCdkService.CanGet(uint32(cdkInfo.ID)) { return cool.Fail("CDK已领取"), nil } - serverInfo, useErr := cdkService.UseServerNamingCDK(ctx, cdkCode, req.UserID, req.ServerID, serverName) + 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.OnlineID, - ServerName: serverInfo.Name, - OwnerID: serverInfo.Owner, - ExpireTime: serverInfo.ExpireTime, + ServerID: serverInfo.ServerID, + ServerName: serverInfo.ServerName, + OwnerID: serverInfo.OwnerID, + ServerExpireTime: serverInfo.ServerExpireTime, + CDKExpireTime: serverInfo.CDKExpireTime, }), nil }