You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
2.0 KiB
92 lines
2.0 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"strconv" |
|
"strings" |
|
"time" |
|
|
|
"go-common/app/interface/main/player/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
) |
|
|
|
const ( |
|
_userRandomType = "用户随机-尾号" |
|
) |
|
|
|
// Policy return policy info. |
|
func (s *Service) Policy(c context.Context, id, mid int64) (item *model.Pitem, err error) { |
|
var policy *model.Policy |
|
if policy, err = s.checkPolicy(id); err != nil { |
|
log.Error("s.getPolicy(%d) err(%v)", id, err) |
|
return |
|
} |
|
switch policy.Type { |
|
case _userRandomType: |
|
if item, err = s.userPolicy(mid, policy); err != nil { |
|
log.Error("s.userPolicy(%d) err(%v)", mid, err) |
|
return |
|
} |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) checkPolicy(id int64) (policy *model.Policy, err error) { |
|
if id != 1 { |
|
err = ecode.PLayerPolicyNotExist |
|
return |
|
} |
|
policy = s.c.Policy |
|
if time.Now().Unix() < policy.StartTime.Unix() { |
|
err = ecode.PLayerPolicyNotStart |
|
return |
|
} |
|
if time.Now().Unix() > policy.EndTime.Unix() { |
|
err = ecode.PLayerPolicyEnded |
|
return |
|
} |
|
return |
|
} |
|
|
|
// 用户随机-尾号 策略方法 |
|
func (s *Service) userPolicy(mid int64, policy *model.Policy) (res *model.Pitem, err error) { |
|
var itemMap = make(map[string]*model.Pitem, len(s.c.Pitem)) |
|
for _, item := range s.c.Pitem { |
|
item.Ver = policy.MtimeTime.Unix() |
|
itemMap[item.ExtData] = item |
|
} |
|
if mid > 0 { |
|
utail := int(mid % 100) |
|
for _, item := range itemMap { |
|
var ( |
|
begin int |
|
end int |
|
beginAndEnd []string |
|
) |
|
if item.ExtData == "default" { |
|
continue |
|
} |
|
beginAndEnd = strings.Split(item.ExtData, "-") |
|
if len(beginAndEnd) != 2 { |
|
log.Error("item.ExtData error") |
|
return |
|
} |
|
if begin, err = strconv.Atoi(beginAndEnd[0]); err != nil { |
|
log.Error("item.ExtData error") |
|
return |
|
} |
|
if end, err = strconv.Atoi(beginAndEnd[1]); err != nil { |
|
log.Error("item.ExtData error") |
|
return |
|
} |
|
if utail >= begin && utail < end { |
|
res = item |
|
return |
|
} |
|
} |
|
} else { |
|
res = itemMap["default"] |
|
} |
|
return |
|
}
|
|
|