151 lines
3.6 KiB
Go
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
|
|
}
|