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.
163 lines
4.1 KiB
163 lines
4.1 KiB
package model |
|
|
|
import ( |
|
"context" |
|
"sync" |
|
"time" |
|
|
|
"go-common/library/log" |
|
) |
|
|
|
// ReviewConf 复审配置 |
|
type ReviewConf struct { |
|
ID int64 `json:"id" form:"id"` |
|
Types []int64 `json:"types" form:"types,split"` // 分区 |
|
mtp map[int16]struct{} |
|
UpFroms []int64 `json:"upfroms" form:"upfroms,split"` // 投稿来源 |
|
muf map[int8]struct{} |
|
UpGroups []int64 `json:"upgroups" form:"upgroups,split"` // 用户组 |
|
mug map[int8]struct{} |
|
Uids []int64 `json:"uids" form:"uids,split"` // 指定uid |
|
Unames []string `json:"unames"` // 指定uid |
|
muid map[int64]struct{} |
|
FansLow int64 `json:"fanslow" form:"fanslow"` // 粉丝数最低值 |
|
FansHigh int64 `json:"fanshigh" form:"fanshigh"` // 粉丝数最高 |
|
Bt FormatTime `json:"bt" form:"bt"` |
|
Et FormatTime `json:"et" form:"et"` |
|
State int8 `json:"state" form:"state"` |
|
UID int64 `json:"uid"` |
|
Uname string `json:"uname"` |
|
Desc string `json:"desc" form:"desc"` |
|
Mt FormatTime `json:"mt"` |
|
} |
|
|
|
// Refresh refresh |
|
func (r *ReviewConf) Refresh() { |
|
mtp := make(map[int16]struct{}) |
|
muf := make(map[int8]struct{}) |
|
mug := make(map[int8]struct{}) |
|
muid := make(map[int64]struct{}) |
|
|
|
for _, tp := range r.Types { |
|
mtp[int16(tp)] = struct{}{} |
|
} |
|
for _, uf := range r.UpFroms { |
|
muf[int8(uf)] = struct{}{} |
|
} |
|
for _, ug := range r.UpGroups { |
|
mug[int8(ug)] = struct{}{} |
|
} |
|
for _, uid := range r.Uids { |
|
muid[uid] = struct{}{} |
|
} |
|
|
|
r.mtp = mtp |
|
r.muf = muf |
|
r.mug = mug |
|
r.muid = muid |
|
} |
|
|
|
// SubmitForm form |
|
type SubmitForm struct { |
|
Status int16 `json:"status" form:"status"` |
|
ID int64 `json:"id" form:"id"` |
|
CID int64 `json:"cid" form:"cid"` |
|
AID int64 `json:"aid" form:"aid"` |
|
MID int64 `json:"mid" form:"mid"` |
|
Eptitle string `json:"eptitle,omitempty" form:"eptitle"` |
|
Description string `json:"description,omitempty" form:"description"` |
|
Note string `json:"note,omitempty" form:"note"` |
|
ReasonID int64 `json:"reason_id,omitempty" form:"reason_id"` |
|
Reason string `json:"reason,omitempty" form:"reason"` |
|
TID int64 `json:"tid,omitempty" form:"tid"` |
|
Norank int32 `json:"norank" form:"norank"` |
|
Noindex int32 `json:"noindex" form:"noindex"` |
|
PushBlog int32 `json:"push_blog" form:"push_blog"` |
|
NoRecommend int32 `json:"norecommend" form:"norecommend"` |
|
Nosearch int32 `json:"nosearch" form:"nosearch"` |
|
OverseaBlock int32 `json:"oversea_block" form:"oversea_block"` |
|
Encoding int8 `json:"encoding" form:"encoding"` |
|
TaskID int64 `json:"task_id" form:"task_id"` |
|
UID int64 `json:"uid" form:"uid"` |
|
Uname string `json:"uname" form:"uname"` |
|
} |
|
|
|
// ReviewCache 快速判断配置项是否命中 |
|
type ReviewCache struct { |
|
MRC map[int64]*ReviewConf |
|
Mux sync.RWMutex |
|
} |
|
|
|
// NewRC 复审配置 |
|
func NewRC() *ReviewCache { |
|
rc := &ReviewCache{} |
|
rc.MRC = make(map[int64]*ReviewConf) |
|
return rc |
|
} |
|
|
|
// Check 检查配置是否命中 |
|
func (rc *ReviewCache) Check(c context.Context, opt *TaskPriority, uid int64) bool { |
|
rc.Mux.RLock() |
|
defer rc.Mux.RUnlock() |
|
|
|
if len(rc.MRC) == 0 { |
|
log.Info("ReviewCache empty") |
|
return false |
|
} |
|
|
|
log.Info("ReviewCache opt(%+v) uid(%d),", opt, uid) |
|
for id, item := range rc.MRC { |
|
log.Info("ReviewCache config(%+v)", item) |
|
if item.State != 0 { |
|
continue |
|
} |
|
|
|
bt := item.Bt.TimeValue() |
|
et := item.Et.TimeValue() |
|
if bt.After(time.Now()) || (!et.IsZero() && et.Before(time.Now())) { |
|
continue |
|
} |
|
|
|
if len(item.mtp) > 0 { |
|
if _, ok := item.mtp[opt.TypeID]; !ok { |
|
continue |
|
} |
|
} |
|
|
|
if len(item.muf) > 0 { |
|
if _, ok := item.muf[opt.UpFrom]; !ok { |
|
continue |
|
} |
|
} |
|
|
|
if len(item.mug) > 0 { |
|
var hit bool |
|
for _, ug := range opt.UpGroups { |
|
if _, ok := item.mug[ug]; ok { |
|
hit = true |
|
break |
|
} |
|
} |
|
if !hit { |
|
continue |
|
} |
|
} |
|
|
|
if len(item.muid) > 0 { |
|
if _, ok := item.muid[uid]; !ok { |
|
continue |
|
} |
|
} |
|
|
|
if item.FansHigh > 0 { |
|
if opt.Fans < item.FansLow || opt.Fans > item.FansHigh { |
|
continue |
|
} |
|
} |
|
|
|
log.Info("ReviewCache task(%d) hit config(%d)", opt.TaskID, id) |
|
return true |
|
} |
|
|
|
return false |
|
}
|
|
|