123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- package show
- import (
- "context"
- "hash/crc32"
- "strconv"
- "time"
- cdm "go-common/app/interface/main/app-card/model"
- cardm "go-common/app/interface/main/app-card/model/card"
- operate "go-common/app/interface/main/app-card/model/card/operate"
- "go-common/app/interface/main/app-card/model/card/rank"
- "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"
- account "go-common/app/service/main/account/model"
- "go-common/app/service/main/archive/api"
- "go-common/app/service/main/archive/model/archive"
- relation "go-common/app/service/main/relation/model"
- "go-common/library/ecode"
- "go-common/library/log"
- "go-common/library/sync/errgroup"
- )
- var (
- _emptyList2 = []cardm.Handler{}
- )
- // FeedIndex feed index
- func (s *Service) FeedIndex2(c context.Context, mid, idx int64, plat int8, build, loginEvent int, lastParam, mobiApp, device, buvid string, now time.Time) (res []cardm.Handler, ver string, err error) {
- var (
- ps = 10
- isIpad = plat == model.PlatIPad
- cards, cardCache []*card.PopularCard
- infocs []*feed.Item
- style int8
- )
- 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 {
- err = ecode.AppNotData
- res = _emptyList2
- return
- }
- // HotDynamic====================
- // cards = append(cards[:0], append([]*card.PopularCard{&card.PopularCard{Type: model.GotoHotDynamic, ReasonType: 0, FromType: "recommend"}}, cards[0:]...)...)
- // HotDynamic====================
- //build
- if plat == model.PlatIPhone && build > 8230 || plat == model.PlatAndroid && build > 5345000 {
- // switch key {
- // // case 0, 3:
- // // style = cdm.HotCardStyleShowUp
- // case 2, 5:
- // style = cdm.HotCardStyleHideUp
- // default:
- // style = cdm.HotCardStyleOld
- // }
- style = cdm.HotCardStyleHideUp
- } else {
- style = cdm.HotCardStyleOld
- }
- //build
- res, infocs = s.dealItem2(c, plat, build, ps, cards, mid, idx, lastParam, now, style)
- ver = strconv.FormatInt(now.Unix(), 10)
- if len(res) == 0 {
- err = ecode.AppNotData
- res = _emptyList2
- 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: infocs,
- }
- s.infocfeed(infoc)
- return
- }
- // dealItem feed item
- func (s *Service) dealItem2(c context.Context, plat int8, build, ps int, cards []*card.PopularCard, mid, idx int64, lastParam string, now time.Time, style int8) (is []cardm.Handler, infocs []*feed.Item) {
- var (
- max = int64(100)
- _fTypeOperation = "operation"
- aids, avUpIDs, upIDs, rnUpIDs []int64
- am map[int64]*archive.ArchiveWithPlayer
- feedcards []*card.PopularCard
- err error
- rank *operate.Card
- accountm map[int64]*account.Card
- isAtten map[int64]int8
- statm map[int64]*relation.Stat
- )
- cardSet := map[int64]*operate.Card{}
- eventTopic := map[int64]*operate.Card{}
- 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
- if plat == model.PlatIPhone && build > 8290 || plat == model.PlatAndroid && build > 5365000 {
- switch ca.Type {
- case model.GotoUpRcmdNew:
- tmp.Type = model.GotoUpRcmdNewV2
- }
- }
- tmp.Idx = cardIdx
- feedcards = append(feedcards, tmp)
- switch ca.Type {
- case model.GotoAv:
- aids = append(aids, ca.Value)
- case model.GotoRank:
- rank = &operate.Card{}
- rank.FromRank(s.rankCache2)
- case model.GotoUpRcmdNew, model.GotoUpRcmdNewV2:
- cardm, as, upid := s.cardSetChange(c, ca.Value)
- aids = append(aids, as...)
- for id, card := range cardm {
- cardSet[id] = card
- }
- rnUpIDs = append(rnUpIDs, upid)
- case model.GotoEventTopic:
- eventTopic = s.eventTopicChange(c, ca.Value)
- }
- if len(feedcards) == ps {
- break
- }
- }
- if len(aids) != 0 {
- var as map[int64]*api.Arc
- if as, err = s.arc.ArchivesPB(c, aids); err != nil {
- log.Error("%+v", err)
- err = nil
- } else {
- am = map[int64]*archive.ArchiveWithPlayer{}
- for _, a := range as {
- avUpIDs = append(avUpIDs, a.Author.Mid)
- am[a.Aid] = &archive.ArchiveWithPlayer{Archive3: archive.BuildArchive3(a)}
- }
- }
- }
- switch style {
- case cdm.HotCardStyleShowUp, cdm.HotCardStyleHideUp:
- upIDs = append(upIDs, avUpIDs...)
- }
- upIDs = append(upIDs, rnUpIDs...)
- avUpIDs = append(avUpIDs, rnUpIDs...)
- g, ctx := errgroup.WithContext(c)
- if len(avUpIDs) > 0 {
- g.Go(func() (err error) {
- if accountm, err = s.acc.Cards3(ctx, avUpIDs); err != nil {
- log.Error("%+v", err)
- err = nil
- }
- return nil
- })
- }
- if len(upIDs) > 0 {
- g.Go(func() (err error) {
- if statm, err = s.reldao.Stats(ctx, upIDs); err != nil {
- log.Error("%+v", err)
- err = nil
- }
- return nil
- })
- if mid != 0 {
- g.Go(func() error {
- isAtten = s.acc.IsAttention(ctx, upIDs, mid)
- return nil
- })
- }
- }
- g.Wait()
- for _, ca := range feedcards {
- var (
- r = ca.PopularCardToAiChange()
- main interface{}
- cardType cdm.CardType
- )
- r.Style = style
- op := &operate.Card{}
- op.From(cdm.CardGt(r.Goto), r.ID, 0, plat, build)
- switch r.Style {
- case cdm.HotCardStyleShowUp, cdm.HotCardStyleHideUp:
- switch r.Goto {
- case model.GotoAv:
- cardType = cdm.SmallCoverV5
- }
- }
- switch r.Goto {
- case model.GotoAv:
- if a, ok := am[r.ID]; ok && (a.AttrVal(archive.AttrBitOverseaLock) == 0 || !model.IsOverseas(plat)) {
- main = map[int64]*archive.ArchiveWithPlayer{a.Aid: a}
- // op.Tid = a.Aid
- r.HideButton = true
- if (plat == model.PlatIPhone && build > 8290 || plat == model.PlatAndroid && build > 5365000) && cardType == cdm.SmallCoverV5 {
- op.Switch = cdm.SwitchCooperationShow
- } else {
- op.Switch = cdm.SwitchCooperationHide
- }
- }
- case model.GotoRank:
- ams := map[int64]*archive.ArchiveWithPlayer{}
- for aid, a := range s.rankArchivesCache {
- ams[aid] = &archive.ArchiveWithPlayer{Archive3: archive.BuildArchive3(a)}
- }
- main = map[cdm.Gt]interface{}{cdm.GotoAv: ams}
- op = rank
- case model.GotoHotTopic:
- main = s.hottopicsCache
- case model.GotoUpRcmdNew, model.GotoUpRcmdNewV2:
- main = am
- op = cardSet[r.ID]
- case model.GotoHotDynamic:
- main = s.dynamicHotCache
- case model.GotoEventTopic:
- op = eventTopic[r.ID]
- }
- h := cardm.Handle(plat, cdm.CardGt(r.Goto), cardType, cdm.ColumnSvrSingle, r, nil, isAtten, statm, accountm)
- if h == nil {
- continue
- }
- h.From(main, op)
- h.Get().FromType = ca.FromType
- h.Get().Idx = ca.Idx
- if h.Get().Right {
- h.Get().ThreePointWatchLater()
- is = append(is, h)
- }
- // infoc
- tinfo := &feed.Item{
- Goto: ca.Type,
- Param: strconv.FormatInt(ca.Value, 10),
- URI: h.Get().URI,
- FromType: ca.FromType,
- Idx: h.Get().Idx,
- CornerMark: ca.CornerMark,
- CardStyle: r.Style,
- }
- if r.RcmdReason != nil {
- tinfo.RcmdContent = r.RcmdReason.Content
- }
- if op != nil {
- switch r.Goto {
- case model.GotoEventTopic:
- tinfo.Item = append(tinfo.Item, &feed.Item{Param: op.URI, Goto: string(op.Goto)})
- default:
- for _, tmp := range op.Items {
- tinfo.Item = append(tinfo.Item, &feed.Item{Param: strconv.FormatInt(tmp.ID, 10), Goto: string(tmp.Goto)})
- }
- }
- }
- infocs = append(infocs, tinfo)
- if len(is) == ps {
- break
- }
- }
- rl := len(is)
- if rl == 0 {
- is = _emptyList2
- return
- }
- return
- }
- func (s *Service) RankCard() (ranks []*rank.Rank, aids []int64) {
- const _limit = 3
- ranks = make([]*rank.Rank, 0, _limit)
- aids = make([]int64, 0, _limit)
- for _, rank := range s.rankCache2 {
- ranks = append(ranks, rank)
- aids = append(aids, rank.Aid)
- if len(ranks) == _limit {
- break
- }
- }
- return
- }
|