bilibili-backup/app/interface/main/app-intl/service/feed/infoc.go
2019-04-22 02:59:20 +00:00

235 lines
6.0 KiB
Go

package feed
import (
"bytes"
"context"
"encoding/json"
"strconv"
"time"
"go-common/app/interface/main/app-card/model/card/ai"
"go-common/app/interface/main/app-intl/model"
"go-common/library/log"
binfoc "go-common/library/log/infoc"
"go-common/library/net/metadata"
)
// infoc struct
type infoc struct {
typ string
mid string
client string
build string
buvid string
disid string
ip string
style string
api string
now string
isRcmd string
pull string
userFeature json.RawMessage
code string
items []*ai.Item
lp bool
zoneID string
adResponse string
deviceID string
network string
newUser string
flush string
autoPlay string
deviceType string
}
// IndexInfoc is.
func (s *Service) IndexInfoc(c context.Context, mid int64, plat int8, build int, buvid, disid, api string, userFeature json.RawMessage, style, code int, items []*ai.Item, isRcmd, pull, newUser bool, now time.Time, adResponse, deviceID, network string, flush int, autoPlay string, deviceType int) {
if items == nil {
return
}
var (
isRc = "0"
isPull = "0"
isNewUser = "0"
zoneID int64
)
if isRcmd {
isRc = "1"
}
if pull {
isPull = "1"
}
if newUser {
isNewUser = "1"
}
ip := metadata.String(c, metadata.RemoteIP)
info, err := s.loc.Info(c, ip)
if err != nil {
log.Warn(" s.loc.Info(%v) error(%v)", ip, err)
err = nil
}
if info != nil {
zoneID = info.ZoneID
}
s.infoc(infoc{"综合推荐", strconv.FormatInt(mid, 10), strconv.Itoa(int(plat)), strconv.Itoa(build), buvid, disid, ip, strconv.Itoa(style), api, strconv.FormatInt(now.Unix(), 10), isRc, isPull, userFeature, strconv.Itoa(code), items, false, strconv.FormatInt(zoneID, 10), adResponse, deviceID, network, isNewUser, strconv.Itoa(flush), autoPlay, strconv.Itoa(deviceType)})
}
// infoc is.
func (s *Service) infoc(i interface{}) {
select {
case s.logCh <- i:
default:
log.Warn("infocproc chan full")
}
}
// infocproc is.
func (s *Service) infocproc() {
const (
// infoc format {"section":{"id":"%s推荐","pos":1,"style":%d,"items":[{"id":%s,"pos":%d,"type":1,"url":""}]}}
noItem1 = `{"section":{"id":"`
noItem2 = `{","pos":1,"style":`
noItem3 = `,"items":[]}}`
)
var (
msg1 = []byte(`{"section":{"id":"`)
msg2 = []byte(`","pos":1,"style":`)
msg3 = []byte(`,"items":[`)
msg4 = []byte(`{"id":`)
msg5 = []byte(`,"pos":`)
msg6 = []byte(`,"type":`)
msg7 = []byte(`,"source":"`)
msg8 = []byte(`","tid":`)
msg9 = []byte(`,"av_feature":`)
msg10 = []byte(`,"url":"`)
msg11 = []byte(`","rcmd_reason":"`)
msg12 = []byte(`"},`)
msg13 = []byte(`]}}`)
showInf = binfoc.New(s.c.ShowInfoc)
buf bytes.Buffer
list string
trackID string
)
for {
i, ok := <-s.logCh
if !ok {
log.Warn("infoc proc exit")
return
}
switch l := i.(type) {
case infoc:
if len(l.items) > 0 {
buf.Write(msg1)
buf.WriteString(l.typ)
buf.Write(msg2)
buf.WriteString(l.style)
buf.Write(msg3)
for i, v := range l.items {
if v == nil {
continue
}
if v.TrackID != "" {
trackID = v.TrackID
}
buf.Write(msg4)
buf.WriteString(strconv.FormatInt(v.ID, 10))
buf.Write(msg5)
buf.WriteString(strconv.Itoa(i + 1))
buf.Write(msg6)
buf.WriteString(gotoMapID(v.Goto))
buf.Write(msg7)
buf.WriteString(v.Source)
buf.Write(msg8)
buf.WriteString(strconv.FormatInt(v.Tid, 10))
buf.Write(msg9)
if v.AvFeature != nil {
buf.Write(v.AvFeature)
} else {
buf.Write([]byte(`""`))
}
buf.Write(msg10)
buf.WriteString("")
buf.Write(msg11)
if v.RcmdReason != nil {
buf.WriteString(v.RcmdReason.Content)
}
buf.Write(msg12)
}
buf.Truncate(buf.Len() - 1)
buf.Write(msg13)
list = buf.String()
buf.Reset()
} else {
list = noItem1 + l.typ + noItem2 + l.style + noItem3
}
showInf.Info(l.ip, l.now, l.api, l.buvid, l.mid, l.client, l.pull, list, l.disid, l.isRcmd, l.build, l.code, string(l.userFeature), l.zoneID, l.adResponse, l.deviceID, l.network, l.newUser, l.flush, l.autoPlay, trackID, l.deviceType)
log.Info("infocproc %s param(mid:%s,buvid:%s,plat:%s,build:%s,isRcmd:%s,code:%s,zone_id:%s,user_feature:%s,ad_response:%s,device_id:%s,network:%s,new_user:%s,flush:%s,autoplay_card:%s,trackid:%s,device_type:%s) response(%s)", l.api, l.mid, l.buvid, l.client, l.build, l.isRcmd, l.code, l.zoneID, l.userFeature, l.adResponse, l.deviceID, l.network, l.newUser, l.flush, l.autoPlay, trackID, l.deviceType, list)
}
}
}
// gotoMapID is.
func gotoMapID(gt string) (id string) {
if gt == model.GotoAv {
id = "1"
} else if gt == model.GotoBangumi {
id = "2"
} else if gt == model.GotoLive {
id = "3"
} else if gt == model.GotoRank {
id = "6"
} else if gt == model.GotoAdAv {
id = "8"
} else if gt == model.GotoAdWeb {
id = "9"
} else if gt == model.GotoBangumiRcmd {
id = "10"
} else if gt == model.GotoLogin {
id = "11"
} else if gt == model.GotoBanner {
id = "13"
} else if gt == model.GotoAdWebS {
id = "14"
} else if gt == model.GotoConverge {
id = "17"
} else if gt == model.GotoSpecial {
id = "18"
} else if gt == model.GotoArticleS {
id = "20"
} else if gt == model.GotoGameDownloadS {
id = "21"
} else if gt == model.GotoShoppingS {
id = "22"
} else if gt == model.GotoAudio {
id = "23"
} else if gt == model.GotoPlayer {
id = "24"
} else if gt == model.GotoSpecialS {
id = "25"
} else if gt == model.GotoAdLarge {
id = "26"
} else if gt == model.GotoPlayerLive {
id = "27"
} else if gt == model.GotoSong {
id = "28"
} else if gt == model.GotoLiveUpRcmd {
id = "29"
} else if gt == model.GotoUpRcmdAv {
id = "30"
} else if gt == model.GotoSubscribe {
id = "31"
} else if gt == model.GotoChannelRcmd {
id = "32"
} else if gt == model.GotoMoe {
id = "33"
} else if gt == model.GotoPGC {
id = "34"
} else if gt == model.GotoSearchSubscribe {
id = "35"
} else {
id = "-1"
}
return
}