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.
103 lines
2.3 KiB
103 lines
2.3 KiB
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 |
|
}
|
|
|