123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- 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
- }
|