127 lines
3.1 KiB
Go
127 lines
3.1 KiB
Go
|
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)
|
||
|
}
|