package entity import ( "admin/apps/game/model" "admin/internal/consts" "admin/internal/errcode" "admin/internal/model/dto" "admin/lib/cdkey" "time" ) type CDKey struct { Po *model.CDKey } func NewCDKey(po *model.CDKey) *CDKey { return &CDKey{ Po: po, } } func (c *CDKey) GetName() string { return c.Po.Name } func (c *CDKey) IsGlobalType() bool { return c.Po.CodeType == consts.CDKeyType_Global } func (c *CDKey) GenerateKeys() []string { if c.IsGlobalType() { return []string{c.Po.Code} } codeList := make([]string, 0, c.Po.CodeNum) for i := 0; i < c.Po.CodeNum; i++ { codeList = append(codeList, cdkey.GenerateOne(c.Po.ID, consts.CDKeyBatchMaxKeyNum, i)) } return codeList //return cdkey.GenerateAll(c.Po.ID, consts.CDKeyBatchMaxKeyNum)[:c.Po.CodeNum] } func (c *CDKey) AddCount(delta int) { c.Po.CodeNum += delta } func (c *CDKey) GetCount() int { return c.Po.CodeNum } func (c *CDKey) CheckCanUse(roleServerId string) error { if ok := c.checkServerId(roleServerId); !ok { return errcode.New(errcode.CDKeyInvalid, "server_id %v not in %v", roleServerId, c.Po.ServerIDs) } timeNow := time.Now() if c.Po.ValidStartTime.Valid { if c.Po.ValidStartTime.Time.After(timeNow) { return errcode.New(errcode.CDKeyAlreadyExpired, "not reach start time:%v", c.Po.ValidStartTime.Time.Format(time.DateTime)) } } if c.Po.ValidEndTime.Valid { if c.Po.ValidEndTime.Time.Before(timeNow) { return errcode.New(errcode.CDKeyAlreadyExpired, "expired at:%v", c.Po.ValidEndTime.Time.Format(time.DateTime)) } } return nil } func (c *CDKey) checkServerId(serverId string) bool { if len(c.Po.ServerIDs) == 0 { return true } if len(c.Po.ServerIDs) == 1 && c.Po.ServerIDs[0] == "" { return true } for _, id := range c.Po.ServerIDs { if id == serverId { return true } } return false } func (c *CDKey) RewardItemsView() []*dto.ItemInfo { items := make([]*dto.ItemInfo, 0, len(c.Po.Attach)) for _, v := range c.Po.Attach { items = append(items, &dto.ItemInfo{ ItemID: int(v.ID), ItemNum: v.Num, ItemType: v.ItemType, Desc: v.Desc, }) } return items }