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.
150 lines
3.6 KiB
150 lines
3.6 KiB
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 |
|
}
|
|
|