bilibili-backup/app/interface/main/web-show/service/resource/ad.go
2019-04-22 02:59:20 +00:00

104 lines
2.3 KiB
Go

package resource
import (
"context"
"math/rand"
"go-common/app/interface/main/web-show/dao/ad"
resmdl "go-common/app/interface/main/web-show/model/resource"
account "go-common/app/service/main/account/model"
"go-common/library/log"
"go-common/library/net/metadata"
)
var (
_emptyVideoAds = []*resmdl.VideoAD{}
)
// VideoAd get videoad by aid
func (s *Service) VideoAd(c context.Context, arg *resmdl.ArgAid) (res []*resmdl.VideoAD) {
arg.IP = metadata.String(c, metadata.RemoteIP)
if arg.Mid > 0 {
// ignore error
var (
resPro *account.Card
err error
)
if resPro, err = s.user(c, arg.Mid, arg.IP); err == nil {
if s.normalVip(c, resPro) {
return
}
}
// NOTE cache?
if isBp := s.bangumiDao.IsBp(c, arg.Mid, arg.Aid, arg.IP); isBp {
log.Info("mid(%d) aid(%d) is bp", arg.Mid, arg.IP)
res = _emptyVideoAds
return
}
}
if res = s.videoAdByAid(arg.Aid); len(res) == 0 {
res = _emptyVideoAds
}
return
}
func (s *Service) user(c context.Context, mid int64, ip string) (resPro *account.Card, err error) {
arg := &account.ArgMid{
Mid: mid,
}
resPro, err = s.accRPC.Card3(c, arg)
if err != nil {
ad.PromError("accRPC.Info2", "s.accRPC.Info2() err(%v)", err)
log.Error("s.accRPC.Info2() err(%v)", err)
}
return
}
// checkVip check normal vip
func (s *Service) normalVip(c context.Context, pro *account.Card) bool {
if pro.Vip.Type != 0 && pro.Vip.Status == 1 {
return true
}
return false
}
func (s *Service) videoAdByAid(aid int64) (res []*resmdl.VideoAD) {
ss := s.videoCache[aid]
l := len(ss)
if l == 0 {
return
}
// NOTE this means StrategyOnly
if l == 1 {
res = ss[0]
return
}
// NOTE this means StrategyShare
res = ss[rand.Intn(l)]
return
}
// loadVideoAd load videoad to cache
func (s *Service) loadVideoAd() (err error) {
ads, err := s.resdao.VideoAds(context.Background())
if err != nil {
log.Error("s.resdao.VideoAds error(%v)", err)
return
}
tmp := make(map[int64][][]*resmdl.VideoAD)
for aid, vads := range ads {
if len(vads) < 1 {
continue
}
if vads[0].Strategy == resmdl.StrategyOnly || vads[0].Strategy == resmdl.StrategyRank {
tmp[aid] = append(tmp[aid], vads)
} else if vads[0].Strategy == resmdl.StrategyShare {
for _, vad := range vads {
tmp[aid] = append(tmp[aid], []*resmdl.VideoAD{vad})
}
}
}
s.videoCache = tmp
return
}