104 lines
2.3 KiB
Go
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
|
|
}
|