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

151 lines
3.6 KiB
Go

package show
import (
"context"
"hash/crc32"
"strconv"
"time"
"go-common/app/interface/main/app-show/model"
"go-common/app/interface/main/app-show/model/card"
"go-common/app/interface/main/app-show/model/feed"
"go-common/app/service/main/archive/api"
"go-common/app/service/main/archive/model/archive"
)
var (
_emptyList = []*feed.Item{}
)
// FeedIndex feed index
func (s *Service) FeedIndex(c context.Context, mid, idx int64, plat int8, build, loginEvent int, lastParam, mobiApp, device, buvid string, now time.Time) (res []*feed.Item) {
var (
ps = 10
isIpad = plat == model.PlatIPad
cards, cardCache []*card.PopularCard
)
if isIpad {
ps = 20
}
var key int
if mid > 0 {
key = int((mid / 1000) % 10)
} else {
key = int((crc32.ChecksumIEEE([]byte(buvid)) / 1000) % 10)
}
cardCache = s.PopularCardTenList(c, key)
if len(cardCache) > int(idx) {
cards = cardCache[idx:]
} else {
res = _emptyList
return
}
res = s.dealItem(c, plat, build, ps, cards, idx, lastParam, now)
if len(res) == 0 {
res = _emptyList
return
}
//infoc
infoc := &feedInfoc{
mobiApp: mobiApp,
device: device,
build: strconv.Itoa(build),
now: now.Format("2006-01-02 15:04:05"),
loginEvent: strconv.Itoa(loginEvent),
mid: strconv.FormatInt(mid, 10),
buvid: buvid,
page: strconv.Itoa((int(idx) / ps) + 1),
feed: res,
}
s.infocfeed(infoc)
return
}
// dealItem feed item
func (s *Service) dealItem(c context.Context, plat int8, build, ps int, cards []*card.PopularCard, idx int64, lastParam string, now time.Time) (is []*feed.Item) {
const _rankCount = 3
var (
uri map[int64]string
// key
max = int64(100)
_fTypeOperation = "operation"
aids []int64
am map[int64]*api.Arc
feedcards []*card.PopularCard
err error
)
LOOP:
for pos, ca := range cards {
var cardIdx = idx + int64(pos+1)
if cardIdx > max && ca.FromType != _fTypeOperation {
continue
}
if config, ok := ca.PopularCardPlat[plat]; ok {
for _, l := range config {
if model.InvalidBuild(build, l.Build, l.Condition) {
continue LOOP
}
}
} else if ca.FromType == _fTypeOperation {
continue LOOP
}
tmp := &card.PopularCard{}
*tmp = *ca
tmp.Idx = cardIdx
feedcards = append(feedcards, tmp)
switch ca.Type {
case model.GotoAv:
aids = append(aids, ca.Value)
}
if len(feedcards) == ps {
break
}
}
if len(aids) != 0 {
if am, err = s.arc.ArchivesPB(c, aids); err != nil {
s.pMiss.Incr("popularcard_Archives")
err = nil
} else {
s.pHit.Incr("popularcard_Archives")
}
}
for _, ca := range feedcards {
i := &feed.Item{}
i.FromType = ca.FromType
i.Idx = ca.Idx
i.Pos = ca.Pos
switch ca.Type {
case model.GotoAv:
a := am[ca.Value]
isOsea := model.IsOverseas(plat)
if a != nil && a.IsNormal() && (!isOsea || (isOsea && a.AttrVal(archive.AttrBitOverseaLock) == 0)) {
i.FromPlayerAv(a, uri[a.Aid])
i.FromRcmdReason(ca)
// if tag, ok := s.hotArcTag[a.Aid]; ok {
// i.Tag = &feed.Tag{TagID: tag.ID, TagName: tag.Name}
// }
i.Goto = ca.Type
is = append(is, i)
}
case model.GotoRank:
if rankAids := s.rankAidsCache; len(rankAids) >= _rankCount {
i.FromRank(rankAids, s.rankScoreCache, s.rankArchivesCache)
// i.Param = strconv.FormatInt(ca.ID, 10)
if i.Goto != "" {
is = append(is, i)
}
}
case model.GotoHotTopic:
if hotTopics := s.hottopicsCache; len(hotTopics) > 0 {
i.FromHotTopic(hotTopics)
is = append(is, i)
}
}
}
if rl := len(is); rl == 0 {
is = _emptyList
return
}
return
}