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.
126 lines
3.1 KiB
126 lines
3.1 KiB
package service |
|
|
|
import ( |
|
"context" |
|
|
|
plamdl "go-common/app/interface/main/playlist/model" |
|
"go-common/app/job/main/playlist/conf" |
|
"go-common/app/job/main/playlist/dao" |
|
"go-common/app/job/main/playlist/model" |
|
"go-common/library/log" |
|
) |
|
|
|
func (s *Service) viewproc(i int64) { |
|
defer s.waiter.Done() |
|
var ( |
|
c = context.TODO() |
|
ch = s.statCh[i] |
|
) |
|
for { |
|
sm, ok := <-ch |
|
if !ok { |
|
log.Warn("statproc(%d) quit", i) |
|
return |
|
} |
|
// filter view count |
|
if conf.Conf.Job.InterceptOn && sm.Count != nil && *sm.Count > 0 { |
|
if s.intercept(sm) { |
|
log.Info("intercept view count (pid:%d, aid:%d, ip:%s)", sm.ID, sm.Aid, sm.IP) |
|
dao.PromInfo("stat:访问计数拦截") |
|
continue |
|
} |
|
} |
|
s.upStat(c, sm, model.ViewCountType) |
|
} |
|
} |
|
|
|
func (s *Service) upStat(c context.Context, sm *model.StatM, tp string) { |
|
// update cache |
|
s.updateCache(c, sm, tp) |
|
// update db |
|
s.updateDB(c, sm, tp) |
|
} |
|
|
|
// updateDB update stat in db. |
|
func (s *Service) updateDB(c context.Context, stat *model.StatM, tp string) (err error) { |
|
if _, err = s.dao.Update(context.TODO(), stat, tp); err != nil { |
|
return |
|
} |
|
log.Info("update db success "+tp+" pid(%d) count(%d) ", stat.ID, *stat.Count) |
|
dao.PromInfo("stat:更新计数DB") |
|
return |
|
} |
|
|
|
// updateCache update stat in cache |
|
func (s *Service) updateCache(c context.Context, sm *model.StatM, tp string) (err error) { |
|
var ( |
|
mid int64 |
|
fid int64 |
|
st *plamdl.PlStat |
|
stat *plamdl.ArgStats |
|
) |
|
if st, err = s.dao.Stat(c, sm.ID); err != nil { |
|
log.Error("s.dao.Stat(%d) error(%v)", sm.ID, err) |
|
return |
|
} |
|
switch tp { |
|
case model.ViewCountType: |
|
stat = &plamdl.ArgStats{PlStat: &plamdl.PlStat{ |
|
ID: sm.ID, |
|
Mid: st.Mid, |
|
Fid: st.Fid, |
|
View: *sm.Count, |
|
Reply: st.Reply, |
|
Fav: st.Fav, |
|
Share: st.Share, |
|
MTime: st.MTime, |
|
}} |
|
case model.FavCountType: |
|
stat = &plamdl.ArgStats{PlStat: &plamdl.PlStat{ |
|
ID: sm.ID, |
|
Mid: st.Mid, |
|
Fid: st.Fid, |
|
View: st.View, |
|
Reply: st.Reply, |
|
Fav: *sm.Count, |
|
Share: st.Share, |
|
MTime: st.MTime, |
|
}} |
|
case model.ReplyCountType: |
|
stat = &plamdl.ArgStats{PlStat: &plamdl.PlStat{ |
|
ID: sm.ID, |
|
Mid: st.Mid, |
|
Fid: st.Fid, |
|
View: st.View, |
|
Reply: *sm.Count, |
|
Fav: st.Fav, |
|
Share: st.Share, |
|
MTime: st.MTime, |
|
}} |
|
case model.ShareCountType: |
|
stat = &plamdl.ArgStats{PlStat: &plamdl.PlStat{ |
|
ID: sm.ID, |
|
Mid: st.Mid, |
|
Fid: st.Fid, |
|
View: st.View, |
|
Reply: st.Reply, |
|
Fav: st.Fav, |
|
Share: *sm.Count, |
|
MTime: st.MTime, |
|
}} |
|
} |
|
if err = s.playlistRPC.SetStat(c, stat); err != nil { |
|
dao.PromError("stat:更新计数缓存", |
|
"s.playlistRPC.SetStat "+tp+" pid(%d) fid(%d) mid(%d) view(%d) favorite(%d) reply(%d) share(%d) error(%v)", |
|
sm.ID, fid, mid, *sm.Count, st.Fav, st.Reply, st.Share, err) |
|
} |
|
log.Info("update cache success "+tp+" pid(%d) aid(%d) fid(%d) mid(%d) view(%d) favorite(%d) reply(%d) share(%d)", |
|
sm.ID, sm.Aid, fid, mid, *sm.Count, st.Fav, st.Reply, st.Share) |
|
dao.PromInfo("stat:更新计数缓存") |
|
return |
|
} |
|
|
|
// intercept intercepts illegal views. |
|
func (s *Service) intercept(stat *model.StatM) bool { |
|
return s.dao.Intercept(context.TODO(), stat.ID, stat.Aid, stat.IP) |
|
}
|
|
|