Files
2019-04-22 18:49:16 +08:00

444 lines
11 KiB
Go

package show
import (
"strconv"
"time"
clive "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-show/conf"
accdao "go-common/app/interface/main/app-show/dao/account"
actdao "go-common/app/interface/main/app-show/dao/activity"
addao "go-common/app/interface/main/app-show/dao/ad"
arcdao "go-common/app/interface/main/app-show/dao/archive"
adtdao "go-common/app/interface/main/app-show/dao/audit"
bgmdao "go-common/app/interface/main/app-show/dao/bangumi"
carddao "go-common/app/interface/main/app-show/dao/card"
dbusdao "go-common/app/interface/main/app-show/dao/databus"
dyndao "go-common/app/interface/main/app-show/dao/dynamic"
livedao "go-common/app/interface/main/app-show/dao/live"
locdao "go-common/app/interface/main/app-show/dao/location"
rcmmdao "go-common/app/interface/main/app-show/dao/recommend"
regiondao "go-common/app/interface/main/app-show/dao/region"
reldao "go-common/app/interface/main/app-show/dao/relation"
resdao "go-common/app/interface/main/app-show/dao/resource"
showdao "go-common/app/interface/main/app-show/dao/show"
tagdao "go-common/app/interface/main/app-show/dao/tag"
"go-common/app/interface/main/app-show/model/card"
recmod "go-common/app/interface/main/app-show/model/recommend"
"go-common/app/interface/main/app-show/model/region"
"go-common/app/interface/main/app-show/model/show"
creativeAPI "go-common/app/interface/main/creative/api"
"go-common/app/service/main/archive/api"
resource "go-common/app/service/main/resource/model"
httpx "go-common/library/net/http/blademaster"
"go-common/library/stat/prom"
)
type recommend struct {
key string
aids []int64
}
type rcmmndCfg struct {
Aid int64 `json:"aid"`
Goto string `json:"goto"`
Title string `json:"title"`
Cover string `json:"cover"`
}
// Service is show service.
type Service struct {
c *conf.Config
creativeClient creativeAPI.CreativeClient
dao *showdao.Dao
rcmmnd *rcmmdao.Dao
ad *addao.Dao // cptbanner
bgm *bgmdao.Dao
lv *livedao.Dao
// bnnr *bnnrdao.Dao
adt *adtdao.Dao
tag *tagdao.Dao
arc *arcdao.Dao
dbus *dbusdao.Dao
dyn *dyndao.Dao
res *resdao.Dao
// artic *articledao.Dao
client *httpx.Client
rg *regiondao.Dao
cdao *carddao.Dao
act *actdao.Dao
acc *accdao.Dao
// relation
reldao *reldao.Dao
loc *locdao.Dao
tick time.Duration
rcmmndCache []*show.Item
rcmmndOseaCache []*show.Item
regionCache map[string][]*show.Item
regionOseaCache map[string][]*show.Item
regionBgCache map[string][]*show.Item
regionBgOseaCache map[string][]*show.Item
regionBgEpCache map[string][]*show.Item
regionBgEpOseaCache map[string][]*show.Item
bgmCache map[int8][]*show.Item
liveCount int
liveMoeCache []*show.Item // TODO change to liveMoeCache
liveHotCache []*show.Item // TODO change to liveHotCache
bannerCache map[int8]map[int][]*resource.Banner
cache map[string][]*show.Show
cacheBg map[string][]*show.Show
cacheBgEp map[string][]*show.Show
tempCache map[string][]*show.Show
auditCache map[string]map[int]struct{} // audit mobi_app builds
blackCache map[int64]struct{} // black aids
logCh chan infoc
logFeedCh chan interface{}
rcmmndCh chan recommend
logPath string
// loadfile
jsonOn bool
// cpm percentage 0~100
cpmNum int
cpmMid map[int64]struct{}
cpmAll bool
cpmRcmmndNum int
cpmRcmmndMid map[int64]struct{}
cpmRcmmndAll bool
adIsPost bool
// recommend api
rcmmndOn bool
rcmmndGroup map[int64]int // mid -> group
rcmmndHosts map[int][]string // group -> hosts
// region
reRegionCache map[int]*region.Region
// ranking
rankCache []*show.Item
rankOseaCache []*show.Item
// card
cardCache map[string][]*show.Show
columnListCache map[int]*card.ColumnList
cardSetCache map[int64]*operate.CardSet
eventTopicCache map[int64]*operate.EventTopic
// hot card
hotTenTabCardCache map[int][]*recmod.CardList
rankAidsCache []int64
rankScoreCache map[int64]int64
rankArchivesCache map[int64]*api.Arc
// hotCache []*card.PopularCard
rcmdCache []*card.PopularCard
hottopicsCache []*clive.TopicHot
rankCache2 []*rank.Rank
dynamicHotCache []*clive.DynamicHot
// prom
pHit *prom.Prom
pMiss *prom.Prom
}
// New new a show service.
func New(c *conf.Config) (s *Service) {
rcmmndHosts := make(map[int][]string, len(c.Recommend.Host))
for k, v := range c.Recommend.Host {
key, err := strconv.Atoi(k)
if err != nil {
continue
}
rcmmndHosts[key] = v
}
rcmmndGroup := make(map[int64]int, len(c.Recommend.Group))
for k, v := range c.Recommend.Group {
key, err := strconv.Atoi(k)
if err != nil {
continue
}
rcmmndGroup[int64(key)] = v
}
s = &Service{
c: c,
dao: showdao.New(c),
rcmmnd: rcmmdao.New(c),
ad: addao.New(c),
bgm: bgmdao.New(c),
lv: livedao.New(c),
// bnnr: bnnrdao.New(c),
adt: adtdao.New(c),
tag: tagdao.New(c),
arc: arcdao.New(c),
dbus: dbusdao.New(c),
dyn: dyndao.New(c),
res: resdao.New(c),
// artic: articledao.New(c),
rg: regiondao.New(c),
cdao: carddao.New(c),
act: actdao.New(c),
acc: accdao.New(c),
// relation
reldao: reldao.New(c),
loc: locdao.New(c),
client: httpx.NewClient(c.HTTPData),
tick: time.Duration(c.Tick),
jsonOn: false,
logCh: make(chan infoc, 1024),
logFeedCh: make(chan interface{}, 1024),
rcmmndCh: make(chan recommend, 1024),
logPath: c.ShowLog,
rcmmndOn: false,
rcmmndGroup: rcmmndGroup,
rcmmndHosts: rcmmndHosts,
// cpm percentage 0~100
cpmNum: 0,
cpmMid: map[int64]struct{}{},
cpmAll: true,
cpmRcmmndNum: 0,
cpmRcmmndMid: map[int64]struct{}{},
cpmRcmmndAll: true,
adIsPost: false,
// region
reRegionCache: map[int]*region.Region{},
// ranking
rankCache: []*show.Item{},
rankOseaCache: []*show.Item{},
//card
cardCache: map[string][]*show.Show{},
columnListCache: map[int]*card.ColumnList{},
cardSetCache: map[int64]*operate.CardSet{},
eventTopicCache: map[int64]*operate.EventTopic{},
// hot card
hotTenTabCardCache: make(map[int][]*recmod.CardList),
rankAidsCache: []int64{},
rankScoreCache: map[int64]int64{},
rankArchivesCache: map[int64]*api.Arc{},
// hotCache: []*card.PopularCard{},
rcmdCache: []*card.PopularCard{},
hottopicsCache: []*clive.TopicHot{},
rankCache2: []*rank.Rank{},
dynamicHotCache: []*clive.DynamicHot{},
// prom
pHit: prom.CacheHit,
pMiss: prom.CacheMiss,
}
var err error
if s.creativeClient, err = creativeAPI.NewClient(nil); err != nil {
panic("creativeGRPC not found!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
}
now := time.Now()
s.loadCache(now)
go s.cacheproc()
go s.infocproc()
go s.rcmmndproc()
go s.infocfeedproc()
return s
}
// cacheproc load all cache.
func (s *Service) cacheproc() {
for {
time.Sleep(s.tick)
now := time.Now()
s.loadCache(now)
}
}
func (s *Service) loadCache(now time.Time) {
s.loadRcmmndCache(now)
s.loadRegionCache(now)
s.loadBgmCache(now)
s.loadLiveCache(now)
s.loadBannerCahce()
s.loadShowCache()
s.loadShowTempCache()
s.loadBlackCache()
s.loadAuditCache()
s.loadRegionListCache()
s.loadRankAllCache()
s.loadColumnListCache(now)
s.loadCardCache(now)
s.loadCardSetCache()
// hot
// s.loadPopularCard(now)
s.loadHotTenTabAids()
s.loadHotTopicCache()
for i := 0; i < 10; i++ {
s.loadHotTenMergeRcmdCache(i)
}
s.loadDynamicHotCache()
s.loadEventTopicCache()
}
// SetRcmmndOn
func (s *Service) SetRcmmndOn(on bool) {
s.rcmmndOn = on
}
// GetRcmmndOn
func (s *Service) RcmmndOn() bool {
return s.rcmmndOn
}
// Close dao
func (s *Service) Close() error {
return s.dao.Close()
}
// SetRcmmndGroup set rcmmnd group data.
func (s *Service) SetRcmmndGroup(m int64, g int) {
tmp := map[int64]int{}
tmp[m] = g
for k, v := range s.rcmmndGroup {
if k != m {
tmp[k] = v
}
}
s.rcmmndGroup = tmp
}
// GetRcmmndGroup get rcmmnd group data.
func (s *Service) GetRcmmndGroup() map[string]int {
tmp := map[string]int{}
for k, v := range s.rcmmndGroup {
tmp[strconv.FormatInt(k, 10)] = v
}
return tmp
}
// SetRcmmndHost set rcmmnd host data.
func (s *Service) SetRcmmndHost(g int, hosts []string) {
tmp := map[int][]string{}
tmp[g] = hosts
for k, v := range s.rcmmndHosts {
if k != g {
tmp[k] = v
}
}
s.rcmmndHosts = tmp
}
// GetRcmmndHost get rcmmnd host data.
func (s *Service) GetRcmmndHost() map[string][]string {
tmp := map[string][]string{}
for k, v := range s.rcmmndHosts {
tmp[strconv.Itoa(k)] = v
}
return tmp
}
// SetCpm percentage 0~100
func (s *Service) SetCpmNum(num int) {
s.cpmNum = num
if s.cpmNum < 0 {
s.cpmNum = 0
} else if s.cpmNum > 100 {
s.cpmNum = 100
}
}
// GetCpm percentage
func (s *Service) CpmNum() int {
return s.cpmNum
}
// SetCpm percentage 0~100
func (s *Service) SetCpmMid(mid int64) {
var mids = map[int64]struct{}{}
mids[mid] = struct{}{}
for mid, _ := range s.cpmMid {
if _, ok := mids[mid]; !ok {
mids[mid] = struct{}{}
}
}
s.cpmMid = mids
}
// GetCpm percentage
func (s *Service) CpmMid() []int {
var mids []int
for mid, _ := range s.cpmMid {
mids = append(mids, int(mid))
}
return mids
}
// SetCpm All
func (s *Service) SetCpmAll(isAll bool) {
s.cpmAll = isAll
}
// GetCpm All
func (s *Service) CpmAll() int {
if s.cpmAll {
return 1
}
return 0
}
// RcmmndNum percentage
func (s *Service) RcmmndNum() int {
return s.cpmRcmmndNum
}
// SetRcmmndNum percentage 0~100
func (s *Service) SetRcmmndNum(num int) {
s.cpmRcmmndNum = num
if s.cpmRcmmndNum < 0 {
s.cpmRcmmndNum = 0
} else if s.cpmRcmmndNum > 100 {
s.cpmRcmmndNum = 100
}
}
// CpmRcmmndMid Mid
func (s *Service) CpmRcmmndMid() []int {
var mids []int
for mid, _ := range s.cpmRcmmndMid {
mids = append(mids, int(mid))
}
return mids
}
// SetCpmRcmmndMid Mid
func (s *Service) SetCpmRcmmndMid(mid int64) {
var mids = map[int64]struct{}{}
mids[mid] = struct{}{}
for mid, _ := range s.cpmRcmmndMid {
if _, ok := mids[mid]; !ok {
mids[mid] = struct{}{}
}
}
s.cpmRcmmndMid = mids
}
// CpmRcmmnd All
func (s *Service) CpmRcmmndAll() int {
if s.cpmRcmmndAll {
return 1
}
return 0
}
// SetCpmRcmmnd All
func (s *Service) SetCpmRcmmndAll(isAll bool) {
s.cpmRcmmndAll = isAll
}
// SetIsPost Get or Post
func (s *Service) SetAdIsPost(isPost bool) {
s.adIsPost = isPost
}
// IsPost Get or Post
func (s *Service) AdIsPost() int {
if s.adIsPost {
return 1
}
return 0
}