This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"crypto/rand"
|
||||
"fmt"
|
||||
"math/big"
|
||||
"time"
|
||||
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
@@ -17,6 +18,9 @@ import (
|
||||
const charsetWithSymbol = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz"
|
||||
|
||||
const (
|
||||
CDKTypeReward uint32 = 0
|
||||
CDKTypeServerNaming uint32 = 1
|
||||
|
||||
cdkCodeLength = 16
|
||||
maxBatchGenerateCount = 5000
|
||||
)
|
||||
@@ -156,6 +160,74 @@ 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) {
|
||||
if ctx == nil {
|
||||
ctx = context.TODO()
|
||||
}
|
||||
now := time.Now()
|
||||
serverService := NewServerService()
|
||||
var updated model.ServerList
|
||||
|
||||
err := g.DB(s.Model.GroupName()).Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
|
||||
var cfg model.CDKConfig
|
||||
if err := tx.Model(s.Model).Where("cdk_code", code).WhereNot("exchange_remain_count", 0).Scan(&cfg); err != nil {
|
||||
return err
|
||||
}
|
||||
if cfg.ID == 0 {
|
||||
return gerror.New("cdk不存在")
|
||||
}
|
||||
if cfg.CDKType != CDKTypeServerNaming {
|
||||
return gerror.New("cdk类型不匹配")
|
||||
}
|
||||
if cfg.BindUserId != 0 && cfg.BindUserId != ownerID {
|
||||
return gerror.New("cdk已绑定其他用户")
|
||||
}
|
||||
if !cfg.ValidEndTime.IsZero() && cfg.ValidEndTime.Before(now) {
|
||||
return gerror.New("cdk已过期")
|
||||
}
|
||||
|
||||
var server model.ServerList
|
||||
if err := tx.Model(model.NewServerList()).Where("online_id", serverID).Scan(&server); err != nil {
|
||||
return err
|
||||
}
|
||||
if !serverService.CanUseDonationName(server, now) {
|
||||
return gerror.New("服务器不可冠名")
|
||||
}
|
||||
|
||||
res, err := tx.Model(s.Model).Where("cdk_code", code).WhereNot("exchange_remain_count", 0).Decrement("exchange_remain_count", 1)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
rows, _ := res.RowsAffected()
|
||||
if rows == 0 {
|
||||
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)
|
||||
|
||||
_, err = tx.Model(model.NewServerList()).Where("online_id", serverID).Data(g.Map{
|
||||
"name": updated.Name,
|
||||
"owner": updated.Owner,
|
||||
"expire_time": updated.ExpireTime,
|
||||
}).Update()
|
||||
return err
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
func (s *CdkService) BatchGenerate(ctx context.Context, count int) (interface{}, error) {
|
||||
if count <= 0 {
|
||||
return nil, gerror.New("生成数量必须大于0")
|
||||
|
||||
Reference in New Issue
Block a user