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.
233 lines
5.9 KiB
233 lines
5.9 KiB
package feed |
|
|
|
import ( |
|
"time" |
|
|
|
"go-common/app/interface/main/app-card/model/card/ai" |
|
"go-common/app/interface/main/app-card/model/card/live" |
|
"go-common/app/interface/main/app-card/model/card/operate" |
|
"go-common/app/interface/main/app-card/model/card/rank" |
|
"go-common/app/interface/main/app-feed/conf" |
|
accdao "go-common/app/interface/main/app-feed/dao/account" |
|
addao "go-common/app/interface/main/app-feed/dao/ad" |
|
arcdao "go-common/app/interface/main/app-feed/dao/archive" |
|
artdao "go-common/app/interface/main/app-feed/dao/article" |
|
audiodao "go-common/app/interface/main/app-feed/dao/audio" |
|
adtdao "go-common/app/interface/main/app-feed/dao/audit" |
|
bgmdao "go-common/app/interface/main/app-feed/dao/bangumi" |
|
blkdao "go-common/app/interface/main/app-feed/dao/black" |
|
bplusdao "go-common/app/interface/main/app-feed/dao/bplus" |
|
carddao "go-common/app/interface/main/app-feed/dao/card" |
|
cvgdao "go-common/app/interface/main/app-feed/dao/converge" |
|
gamedao "go-common/app/interface/main/app-feed/dao/game" |
|
livdao "go-common/app/interface/main/app-feed/dao/live" |
|
locdao "go-common/app/interface/main/app-feed/dao/location" |
|
rankdao "go-common/app/interface/main/app-feed/dao/rank" |
|
rcmdao "go-common/app/interface/main/app-feed/dao/recommend" |
|
reldao "go-common/app/interface/main/app-feed/dao/relation" |
|
rscdao "go-common/app/interface/main/app-feed/dao/resource" |
|
searchdao "go-common/app/interface/main/app-feed/dao/search" |
|
showdao "go-common/app/interface/main/app-feed/dao/show" |
|
specdao "go-common/app/interface/main/app-feed/dao/special" |
|
tabdao "go-common/app/interface/main/app-feed/dao/tab" |
|
tagdao "go-common/app/interface/main/app-feed/dao/tag" |
|
updao "go-common/app/interface/main/app-feed/dao/upper" |
|
"go-common/app/interface/main/app-feed/model" |
|
"go-common/app/interface/main/app-feed/model/feed" |
|
resource "go-common/app/service/main/resource/model" |
|
"go-common/library/log" |
|
"go-common/library/stat/prom" |
|
) |
|
|
|
var ( |
|
_emptyItem = []*feed.Item{} |
|
) |
|
|
|
// Service is show service. |
|
type Service struct { |
|
c *conf.Config |
|
pHit *prom.Prom |
|
pMiss *prom.Prom |
|
// dao |
|
rcmd *rcmdao.Dao |
|
bgm *bgmdao.Dao |
|
tg *tagdao.Dao |
|
adt *adtdao.Dao |
|
blk *blkdao.Dao |
|
lv *livdao.Dao |
|
ad *addao.Dao |
|
rank *rankdao.Dao |
|
gm *gamedao.Dao |
|
sp *specdao.Dao |
|
cvg *cvgdao.Dao |
|
show *showdao.Dao |
|
tab *tabdao.Dao |
|
audio *audiodao.Dao |
|
// rpc |
|
arc *arcdao.Dao |
|
acc *accdao.Dao |
|
rel *reldao.Dao |
|
upper *updao.Dao |
|
art *artdao.Dao |
|
rsc *rscdao.Dao |
|
card *carddao.Dao |
|
search *searchdao.Dao |
|
bplus *bplusdao.Dao |
|
loc *locdao.Dao |
|
// tick |
|
tick time.Duration |
|
// audit cache |
|
auditCache map[string]map[int]struct{} // audit mobi_app builds |
|
// black cache |
|
blackCache map[int64]struct{} // black aids |
|
// ai cache |
|
rcmdCache []*ai.Item |
|
// rank |
|
rankCache []*rank.Rank |
|
// converge cache |
|
convergeCache map[int64]*operate.Converge |
|
// download cache |
|
downloadCache map[int64]*operate.Download |
|
// special cache |
|
specialCache map[int64]*operate.Special |
|
// follow cache |
|
followCache map[int64]*operate.Follow |
|
liveCardCache map[int64][]*live.Card |
|
// tab cache |
|
menuCache []*operate.Menu |
|
tabCache map[int64][]*operate.Active |
|
coverCache map[int64]string |
|
// group cache |
|
groupCache map[int64]int |
|
// cache |
|
cacheCh chan func() |
|
// infoc |
|
logCh chan interface{} |
|
// ad |
|
cmResourceMap map[int8]int64 |
|
// abtest cache |
|
abtestCache map[string]*resource.AbTest |
|
// autoplay mids cache |
|
autoplayMidsCache map[int64]struct{} |
|
// follow mode list |
|
followModeList map[int64]struct{} |
|
} |
|
|
|
// New new a show service. |
|
func New(c *conf.Config) (s *Service) { |
|
s = &Service{ |
|
c: c, |
|
pHit: prom.CacheHit, |
|
pMiss: prom.CacheMiss, |
|
// dao |
|
rcmd: rcmdao.New(c), |
|
bgm: bgmdao.New(c), |
|
tg: tagdao.New(c), |
|
adt: adtdao.New(c), |
|
blk: blkdao.New(c), |
|
lv: livdao.New(c), |
|
ad: addao.New(c), |
|
rank: rankdao.New(c), |
|
gm: gamedao.New(c), |
|
cvg: cvgdao.New(c), |
|
sp: specdao.New(c), |
|
show: showdao.New(c), |
|
tab: tabdao.New(c), |
|
audio: audiodao.New(c), |
|
card: carddao.New(c), |
|
search: searchdao.New(c), |
|
bplus: bplusdao.New(c), |
|
// rpc |
|
arc: arcdao.New(c), |
|
rel: reldao.New(c), |
|
acc: accdao.New(c), |
|
upper: updao.New(c), |
|
art: artdao.New(c), |
|
rsc: rscdao.New(c), |
|
loc: locdao.New(c), |
|
// tick |
|
tick: time.Duration(c.Tick), |
|
// group cache |
|
groupCache: map[int64]int{}, |
|
// cache |
|
cacheCh: make(chan func(), 1024), |
|
// infoc |
|
logCh: make(chan interface{}, 1024), |
|
// abtest cache |
|
abtestCache: map[string]*resource.AbTest{}, |
|
// autoplay mids cache |
|
autoplayMidsCache: map[int64]struct{}{}, |
|
} |
|
var err error |
|
if s.cmResourceMap, err = s.coverCMResource(c.Feed.CMResource); err != nil { |
|
panic(err) |
|
} |
|
s.loadAuditCache() |
|
s.loadBlackCache() |
|
s.loadRcmdCache() |
|
s.loadRankCache() |
|
s.loadConvergeCache() |
|
s.loadDownloadCache() |
|
s.loadSpecialCache() |
|
s.loadTabCache() |
|
s.loadGroupCache() |
|
s.loadUpCardCache() |
|
s.loadLiveCardCache() |
|
s.loadABTestCache() |
|
s.loadAutoPlayMid() |
|
s.loadFollowModeList() |
|
go s.cacheproc() |
|
go s.auditproc() |
|
go s.blackproc() |
|
go s.rcmdproc() |
|
go s.rankproc() |
|
go s.convergeproc() |
|
go s.downloadproc() |
|
go s.specialproc() |
|
go s.tabproc() |
|
go s.groupproc() |
|
go s.infocproc() |
|
go s.upCardproc() |
|
go s.liveCardproc() |
|
go s.loadABTestCacheProc() |
|
go s.followModeListproc() |
|
return |
|
} |
|
|
|
func (s *Service) coverCMResource(resource map[string]int64) (rscm map[int8]int64, err error) { |
|
if len(resource) == 0 { |
|
return |
|
} |
|
rscm = make(map[int8]int64, len(resource)) |
|
for mobiApp, r := range resource { |
|
var plat int8 |
|
if mobiApp == "iphone" { |
|
plat = model.PlatIPhone |
|
} else if mobiApp == "android" { |
|
plat = model.PlatAndroid |
|
} else if mobiApp == "ipad" { |
|
plat = model.PlatIPad |
|
} |
|
rscm[plat] = r |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) addCache(f func()) { |
|
select { |
|
case s.cacheCh <- f: |
|
default: |
|
log.Warn("cacheproc chan full") |
|
} |
|
} |
|
|
|
func (s *Service) cacheproc() { |
|
for { |
|
f, ok := <-s.cacheCh |
|
if !ok { |
|
log.Warn("cache proc exit") |
|
return |
|
} |
|
f() |
|
} |
|
}
|
|
|