464 lines
13 KiB
Go
464 lines
13 KiB
Go
package operate
|
||
|
||
import (
|
||
"encoding/json"
|
||
"go-common/app/interface/main/app-card/model"
|
||
"go-common/app/interface/main/app-card/model/card/banner"
|
||
"go-common/app/interface/main/app-card/model/card/cm"
|
||
"go-common/app/interface/main/app-card/model/card/rank"
|
||
"go-common/library/log"
|
||
"sort"
|
||
"strconv"
|
||
)
|
||
|
||
type Card struct {
|
||
Plat int8 `json:"plat,omitempty"`
|
||
Build int `json:"build,omitempty"`
|
||
ID int64 `json:"id,omitempty"`
|
||
Param string `json:"param,omitempty"`
|
||
CardGoto model.CardGt `json:"card_goto,omitempty"`
|
||
Goto model.Gt `json:"goto,omitempty"`
|
||
URI string `json:"uri,omitempty"`
|
||
Title string `json:"title,omitempty"`
|
||
Desc string `json:"desc,omitempty"`
|
||
Cover string `json:"cover,omitempty"`
|
||
Coverm map[model.ColumnStatus]string `json:"coverm,omitempty"`
|
||
Avatar string `json:"avatar,omitempty"`
|
||
Download int32 `json:"download,omitempty"`
|
||
Badge string `json:"badge,omitempty"`
|
||
Ratio int `json:"ratio,omitempty"`
|
||
Score int32 `json:"score,omitempty"`
|
||
Tid int64 `json:"tid,omitempty"`
|
||
Subtitle string `json:"subtitle,omitempty"`
|
||
Limit int `json:"limit,omitempty"`
|
||
Items []*Card `json:"items,omitempty"`
|
||
AdInfo *cm.AdInfo `json:"ad_info,omitempty"`
|
||
Banner []*banner.Banner `json:"banner,omitempty"`
|
||
Hash string `json:"verson,omitempty"`
|
||
TrackID string `json:"trackid,omitempty"`
|
||
FromType string `json:"from_type,omitempty"`
|
||
ShowUGCPay bool `json:"show_ucg_pay,omitempty"`
|
||
Switch model.Switch `json:"switch,omitempty"`
|
||
SwitchLike model.Switch `json:"switch_like,omitempty"`
|
||
Buttons []*Button `json:"buttons,omitempty"`
|
||
}
|
||
|
||
type Button struct {
|
||
Text string `json:"text,omitempty"`
|
||
Event string `json:"event,omitempty"`
|
||
}
|
||
|
||
func (c *Card) From(cardGoto model.CardGt, id int64, tid int64, plat int8, build int) {
|
||
c.CardGoto = cardGoto
|
||
c.ID = id
|
||
c.Tid = tid
|
||
c.Goto = model.Gt(cardGoto)
|
||
c.Param = strconv.FormatInt(id, 10)
|
||
c.URI = strconv.FormatInt(id, 10)
|
||
c.Plat = plat
|
||
c.Build = build
|
||
}
|
||
|
||
func (c *Card) FromSwitch(sw model.Switch) {
|
||
c.SwitchLike = sw
|
||
}
|
||
|
||
func (c *Card) FromDownload(o *Download) {
|
||
c.CardGoto = model.CardGotoDownload
|
||
c.Param = strconv.FormatInt(o.ID, 10)
|
||
c.Coverm = map[model.ColumnStatus]string{model.ColumnSvrSingle: o.Cover, model.ColumnSvrDouble: o.DoubleCover}
|
||
c.Title = o.Title
|
||
c.Goto = model.OperateType[o.URLType]
|
||
c.URI = o.URLValue
|
||
c.Avatar = o.Icon
|
||
c.Download = o.Number
|
||
c.Desc = o.Desc
|
||
}
|
||
|
||
func (c *Card) FromSpecial(o *Special) {
|
||
c.CardGoto = model.CardGotoSpecial
|
||
c.Param = strconv.FormatInt(o.ID, 10)
|
||
c.Coverm = map[model.ColumnStatus]string{model.ColumnSvrSingle: o.SingleCover, model.ColumnSvrDouble: o.Cover}
|
||
c.Title = o.Title
|
||
c.Goto = model.OperateType[o.ReType]
|
||
c.URI = o.ReValue
|
||
c.Desc = o.Desc
|
||
c.Badge = o.Badge
|
||
if o.Size == "1020x300" {
|
||
c.Ratio = 34
|
||
} else if o.Size == "1020x378" {
|
||
c.Ratio = 27
|
||
}
|
||
}
|
||
|
||
func (c *Card) FromTopstick(o *Special) {
|
||
c.CardGoto = model.CardGotoTopstick
|
||
c.Param = strconv.FormatInt(o.ID, 10)
|
||
c.Title = o.Title
|
||
c.Goto = model.OperateType[o.ReType]
|
||
c.URI = o.ReValue
|
||
c.Desc = o.Desc
|
||
c.Badge = o.Badge
|
||
}
|
||
|
||
func (c *Card) FromFollow(o *Follow) {
|
||
switch o.Type {
|
||
case "upper", "channel_three":
|
||
var contents []*struct {
|
||
Ctype string `json:"ctype,omitempty"`
|
||
Cvalue int64 `json:"cvalue,omitempty"`
|
||
}
|
||
if err := json.Unmarshal(o.Content, &contents); err != nil {
|
||
log.Error("%+v", err)
|
||
return
|
||
}
|
||
items := make([]*Card, 0, len(contents))
|
||
for _, content := range contents {
|
||
var gt model.Gt
|
||
switch content.Ctype {
|
||
case "mid":
|
||
gt = model.GotoMid
|
||
case "channel_id":
|
||
gt = model.GotoTag
|
||
default:
|
||
continue
|
||
}
|
||
items = append(items, &Card{ID: content.Cvalue, Goto: gt, Param: strconv.FormatInt(content.Cvalue, 10), URI: strconv.FormatInt(content.Cvalue, 10)})
|
||
}
|
||
if len(items) < 3 {
|
||
return
|
||
}
|
||
c.Items = items
|
||
c.CardGoto = model.CardGotoSubscribe
|
||
c.Title = o.Title
|
||
c.Param = strconv.FormatInt(o.ID, 10)
|
||
case "channel_single":
|
||
var content struct {
|
||
Aid int64 `json:"aid"`
|
||
ChannelID int64 `json:"channel_id"`
|
||
}
|
||
if err := json.Unmarshal(o.Content, &content); err != nil {
|
||
log.Error("%+v", err)
|
||
return
|
||
}
|
||
c.CardGoto = model.CardGotoChannelRcmd
|
||
c.Title = o.Title
|
||
c.ID = content.Aid
|
||
c.Tid = content.ChannelID
|
||
c.Goto = model.GotoAv
|
||
c.Param = strconv.FormatInt(o.ID, 10)
|
||
c.URI = strconv.FormatInt(content.Aid, 10)
|
||
}
|
||
}
|
||
|
||
func (c *Card) FromConverge(o *Converge) {
|
||
c.CardGoto = model.CardGotoConverge
|
||
c.Param = strconv.FormatInt(o.ID, 10)
|
||
c.Coverm = map[model.ColumnStatus]string{model.ColumnSvrSingle: o.Cover, model.ColumnSvrDouble: o.Cover}
|
||
c.Title = o.Title
|
||
c.Goto = model.OperateType[o.ReType]
|
||
c.URI = o.ReValue
|
||
var contents []*struct {
|
||
Ctype string `json:"ctype,omitempty"`
|
||
Cvalue string `json:"cvalue,omitempty"`
|
||
}
|
||
if err := json.Unmarshal(o.Content, &contents); err != nil {
|
||
log.Error("%+v", err)
|
||
return
|
||
}
|
||
c.Items = make([]*Card, 0, len(contents))
|
||
for _, content := range contents {
|
||
var (
|
||
gt model.Gt
|
||
cardGt model.CardGt
|
||
)
|
||
id, _ := strconv.ParseInt(content.Cvalue, 10, 64)
|
||
if id == 0 {
|
||
continue
|
||
}
|
||
switch content.Ctype {
|
||
case "0":
|
||
gt = model.GotoAv
|
||
cardGt = model.CardGotoAv
|
||
case "1":
|
||
gt = model.GotoLive
|
||
cardGt = model.CardGotoLive
|
||
case "2":
|
||
gt = model.GotoArticle
|
||
cardGt = model.CardGotoArticleS
|
||
default:
|
||
continue
|
||
}
|
||
c.Items = append(c.Items, &Card{ID: id, CardGoto: cardGt, Goto: gt, Param: content.Cvalue, URI: content.Cvalue})
|
||
}
|
||
}
|
||
|
||
func (c *Card) FromRank(os []*rank.Rank) {
|
||
c.CardGoto = model.CardGotoRank
|
||
c.Goto = model.GotoRank
|
||
c.Items = make([]*Card, 0, len(os))
|
||
for _, o := range os {
|
||
c.Items = append(c.Items, &Card{Goto: model.GotoAv, ID: o.Aid, Param: strconv.FormatInt(o.Aid, 10), URI: strconv.FormatInt(o.Aid, 10), Score: o.Score})
|
||
}
|
||
}
|
||
|
||
func (c *Card) FromActive(o *Active) {
|
||
switch o.Type {
|
||
case "live", "player_live", "converge", "special", "archive", "player":
|
||
var id int64
|
||
if err := json.Unmarshal(o.Content, &id); err != nil {
|
||
log.Error("%+v", err)
|
||
return
|
||
}
|
||
if id < 1 {
|
||
return
|
||
}
|
||
c.ID = id
|
||
c.Param = strconv.FormatInt(id, 10)
|
||
switch o.Type {
|
||
case "live":
|
||
c.CardGoto = model.CardGotoPlayerLive
|
||
case "converge":
|
||
c.CardGoto = model.CardGotoConverge
|
||
case "special":
|
||
c.CardGoto = model.CardGotoSpecial
|
||
case "archive":
|
||
c.CardGoto = model.CardGotoPlayer
|
||
}
|
||
case "basic", "content_rcmd":
|
||
var basic struct {
|
||
Type string `json:"type,omitempty"`
|
||
Title string `json:"title,omitempty"`
|
||
Subtitle string `json:"subtitle,omitempty"`
|
||
Sublink string `json:"sublink,omitempty"`
|
||
Content []*struct {
|
||
LinkType string `json:"link_type,omitempty"`
|
||
LinkValue string `json:"link_value,omitempty"`
|
||
} `json:"content,omitempty"`
|
||
}
|
||
if err := json.Unmarshal(o.Content, &basic); err != nil {
|
||
log.Error("%+v", err)
|
||
return
|
||
}
|
||
items := make([]*Card, 0, len(basic.Content))
|
||
for _, c := range basic.Content {
|
||
typ, _ := strconv.Atoi(c.LinkType)
|
||
id, _ := strconv.ParseInt(c.LinkValue, 10, 64)
|
||
ri := &Card{Goto: model.OperateType[typ], ID: id, Param: c.LinkValue}
|
||
if ri.Goto != "" {
|
||
items = append(items, ri)
|
||
}
|
||
}
|
||
if len(items) == 0 {
|
||
return
|
||
}
|
||
c.Items = items
|
||
c.Title = basic.Title
|
||
c.Subtitle = basic.Subtitle
|
||
c.URI = basic.Sublink
|
||
c.CardGoto = model.CardGotoContentRcmd
|
||
case "shortcut", "entrance", "banner":
|
||
var card struct {
|
||
Type string `json:"type,omitempty"`
|
||
CardItem []*CardItem `json:"card_item,omitempty"`
|
||
}
|
||
if err := json.Unmarshal(o.Content, &card); err != nil {
|
||
log.Error("%+v", err)
|
||
return
|
||
}
|
||
items := make([]*Card, 0, len(card.CardItem))
|
||
sort.Sort(CardItems(card.CardItem))
|
||
for _, v := range card.CardItem {
|
||
typ, _ := strconv.Atoi(v.LinkType)
|
||
id, _ := strconv.ParseInt(v.LinkValue, 10, 64)
|
||
item := &Card{Goto: model.OperateType[typ], ID: id, Param: v.LinkValue, URI: v.LinkValue, Title: v.Title, Cover: v.Cover}
|
||
if item.Goto != "" {
|
||
items = append(items, item)
|
||
}
|
||
}
|
||
if len(items) == 0 {
|
||
return
|
||
}
|
||
c.Items = items
|
||
switch o.Type {
|
||
case "shortcut", "entrance":
|
||
c.CardGoto = model.CardGotoEntrance
|
||
case "banner":
|
||
c.CardGoto = model.CardGotoBanner
|
||
}
|
||
case "common", "background":
|
||
c.Title = o.Name
|
||
c.Cover = o.Background
|
||
case "tag", "tag_rcmd":
|
||
var tag struct {
|
||
AidStr string `json:"aid,omitempty"`
|
||
Type string `json:"type,omitempty"`
|
||
NumberStr string `json:"number,omitempty"`
|
||
Tid int64 `json:"-"`
|
||
Number int `json:"-"`
|
||
}
|
||
if err := json.Unmarshal(o.Content, &tag); err != nil {
|
||
log.Error("%+v", err)
|
||
return
|
||
}
|
||
tag.Tid, _ = strconv.ParseInt(tag.AidStr, 10, 64)
|
||
tag.Number, _ = strconv.Atoi(tag.NumberStr)
|
||
if tag.Tid == 0 {
|
||
return
|
||
}
|
||
c.ID = tag.Tid
|
||
c.Limit = tag.Number
|
||
c.Goto = model.GotoTag
|
||
c.CardGoto = model.CardGotoTagRcmd
|
||
c.Subtitle = "查看更多"
|
||
case "news":
|
||
var news struct {
|
||
Title string `json:"title,omitempty"`
|
||
Body string `json:"body,omitempty"`
|
||
Link string `json:"link,omitempty"`
|
||
}
|
||
if err := json.Unmarshal(o.Content, &news); err != nil {
|
||
log.Error("%+v", err)
|
||
return
|
||
}
|
||
if news.Body == "" {
|
||
return
|
||
}
|
||
c.Title = news.Title
|
||
c.Desc = news.Body
|
||
c.URI = news.Link
|
||
c.Goto = model.GotoWeb
|
||
c.CardGoto = model.CardGotoNews
|
||
}
|
||
c.Title = o.Title
|
||
c.Param = strconv.FormatInt(o.ID, 10)
|
||
}
|
||
|
||
func (c *Card) FromAdAv(o *cm.AdInfo) {
|
||
c.CardGoto = model.CardGotoAdAv
|
||
c.AdInfo = o
|
||
}
|
||
|
||
func (c *Card) FromActiveBanner(os []*Active, hash string) {
|
||
c.Banner = make([]*banner.Banner, 0, len(os))
|
||
for _, o := range os {
|
||
banner := &banner.Banner{ID: o.Pid, Title: o.Title, Image: o.Cover, URI: model.FillURI(o.Goto, o.Param, nil)}
|
||
c.Banner = append(c.Banner, banner)
|
||
}
|
||
c.CardGoto = model.CardGotoBanner
|
||
c.Hash = hash
|
||
}
|
||
|
||
func (c *Card) FromBanner(os []*banner.Banner, hash string) {
|
||
if len(os) == 0 {
|
||
return
|
||
}
|
||
c.Banner = os
|
||
c.CardGoto = model.CardGotoBanner
|
||
c.Hash = hash
|
||
}
|
||
|
||
func (c *Card) FromLogin(o int64) {
|
||
if !model.IsIPad(c.Plat) {
|
||
if o != 0 {
|
||
c.Param = strconv.FormatInt(o, 10)
|
||
} else {
|
||
c.Param = "1"
|
||
}
|
||
} else {
|
||
c.Param = "5"
|
||
}
|
||
c.CardGoto = model.CardGotoLogin
|
||
}
|
||
|
||
func (c *Card) FromCardSet(o *CardSet) {
|
||
switch o.Type {
|
||
case "pgcs_rcmd":
|
||
var contents []*struct {
|
||
ID interface{} `json:"id,omitempty"`
|
||
}
|
||
if err := json.Unmarshal(o.Content, &contents); err != nil {
|
||
log.Error("%+v", err)
|
||
return
|
||
}
|
||
for _, content := range contents {
|
||
var cid int64
|
||
switch v := content.ID.(type) {
|
||
case string:
|
||
cid, _ = strconv.ParseInt(v, 10, 64)
|
||
case float64:
|
||
cid = int64(v)
|
||
}
|
||
item := &Card{ID: cid, Goto: model.GotoPGC}
|
||
c.Items = append(c.Items, item)
|
||
}
|
||
c.Title = o.Title
|
||
c.Param = strconv.FormatInt(o.ID, 10)
|
||
c.CardGoto = model.CardGotoPgcsRcmd
|
||
case "up_rcmd_new":
|
||
var contents []*struct {
|
||
ID interface{} `json:"id,omitempty"`
|
||
}
|
||
if err := json.Unmarshal(o.Content, &contents); err != nil {
|
||
log.Error("%+v", err)
|
||
return
|
||
}
|
||
for _, content := range contents {
|
||
var aid int64
|
||
switch v := content.ID.(type) {
|
||
case string:
|
||
aid, _ = strconv.ParseInt(v, 10, 64)
|
||
case float64:
|
||
aid = int64(v)
|
||
}
|
||
item := &Card{ID: aid, Goto: model.GotoAv}
|
||
c.Items = append(c.Items, item)
|
||
}
|
||
c.Title = "新星卡片"
|
||
c.Desc = o.Title
|
||
c.Param = strconv.FormatInt(o.Value, 10)
|
||
c.ID = o.Value
|
||
c.CardGoto = model.CardGotoUpRcmdNew
|
||
}
|
||
}
|
||
|
||
func (c *Card) FromFollowMode(title, desc string, button []string) {
|
||
c.Title = title
|
||
if c.Title == "" {
|
||
c.Title = "启用首页推荐 - 关注模式(内测版)"
|
||
}
|
||
c.Desc = desc
|
||
if c.Desc == "" {
|
||
c.Desc = "我们根据你对bilibili推荐的反馈,为你定制了关注模式。开启后,仅为你显示关注UP主更新的视频哦。尝试体验一下?"
|
||
}
|
||
if len(button) == 2 {
|
||
c.Buttons = []*Button{
|
||
{Text: button[0], Event: "close"},
|
||
{Text: button[1], Event: "follow_mode"},
|
||
}
|
||
} else {
|
||
c.Buttons = []*Button{
|
||
{Text: "暂不需要", Event: "close"},
|
||
{Text: "立即开启", Event: "follow_mode"},
|
||
}
|
||
}
|
||
c.CardGoto = model.CardGotoFollowMode
|
||
}
|
||
|
||
func (c *Card) FromEventTopic(o *EventTopic) {
|
||
c.Title = o.Title
|
||
c.Desc = o.Desc
|
||
c.Cover = o.Cover
|
||
switch o.ReType {
|
||
case 1:
|
||
c.Goto = model.Gt("topic")
|
||
case 2:
|
||
c.Goto = model.Gt("broadcast")
|
||
case 3:
|
||
c.Goto = model.Gt("channel")
|
||
}
|
||
c.Param = strconv.FormatInt(o.ID, 10)
|
||
c.URI = o.ReValue
|
||
c.Badge = o.Corner
|
||
}
|