package watcher import ( "slices" "sync" "gitea.timerzz.com/kedaya_haitao/common/structs/storage" v2 "gitea.timerzz.com/kedaya_haitao/common/structs/v2" "github.com/golang/glog" ) type Watcher struct { pArticle *v2.ProviderArticle watching bool //是不是正在抓 } type Watchers struct { m sync.RWMutex list []*Watcher providerId v2.ProviderId storage *storage.Storage ready bool } func NewWatchers(storage *storage.Storage, providerId v2.ProviderId) *Watchers { return &Watchers{ storage: storage, providerId: providerId, list: make([]*Watcher, 0), } } func (w *Watchers) Add(article *v2.ProviderArticle) { w.m.Lock() defer w.m.Unlock() if !slices.ContainsFunc(w.list, func(item *Watcher) bool { return item.pArticle.SkuID == article.SkuID }) { w.list = append(w.list, &Watcher{pArticle: article}) } } func (w *Watchers) Remove(skuID string) { for i, item := range w.list { if item.pArticle.SkuID == skuID { w.m.Lock() w.list = append(w.list[:i], w.list[i+1:]...) w.m.Unlock() return } } } func (w *Watchers) Range(filter func(watcher *Watcher) bool, do func(watcher *Watcher)) { w.m.RLock() defer w.m.RUnlock() for _, item := range w.list { if filter(item) { do(item) } } } func (w *Watchers) Exist(skuID string) bool { w.m.RLock() defer w.m.RUnlock() for _, item := range w.list { if item.pArticle.SkuID == skuID { return true } } return false } func (w *Watchers) Load() (err error) { var articles []*v2.ProviderArticle articles, err = w.storage.ProviderArticle().Find( storage.NewGetProviderArticleQuery(). SetProviderId(w.providerId). SetWatch(true), ) if err != nil { return err } w.m.Lock() defer w.m.Unlock() for _, article := range articles { w.list = append(w.list, &Watcher{pArticle: article}) } glog.Infof("共加载%d个需要蹲货的商品\n", len(w.list)) w.ready = true return } // 返回ready func (w *Watchers) Ready() bool { return w.ready }