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.
118 lines
2.8 KiB
118 lines
2.8 KiB
package show |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"fmt" |
|
"strconv" |
|
|
|
"go-common/app/interface/main/app-resource/model" |
|
"go-common/app/interface/main/app-resource/model/abtest" |
|
"go-common/app/interface/main/app-resource/model/show" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
|
|
farm "github.com/dgryski/go-farm" |
|
) |
|
|
|
const ( |
|
_initTabKey = "tab_%d_%s" |
|
_initVersion = "showtab_version" |
|
_defaultLanguageHans = "hans" |
|
_defaultLanguageHant = "hant" |
|
) |
|
|
|
var ( |
|
_showAbtest = map[string]string{ |
|
"bilibili://pegasus/hottopic": "home_tabbar_server_1", |
|
} |
|
_deafaultTab = map[string]*show.Tab{ |
|
"bilibili://pegasus/promo": &show.Tab{ |
|
DefaultSelected: 1, |
|
}, |
|
} |
|
) |
|
|
|
// Tabs show tabs |
|
func (s *Service) Tabs(c context.Context, plat int8, build int, buvid, ver, mobiApp, language string, mid int64) (res map[string][]*show.Tab, version string, a *abtest.List, err error) { |
|
if key := fmt.Sprintf(_initTabKey, plat, language); len(s.tabCache[fmt.Sprintf(key)]) == 0 || language == "" { |
|
if model.IsOverseas(plat) { |
|
var key = fmt.Sprintf(_initTabKey, plat, _defaultLanguageHant) |
|
if len(s.tabCache[fmt.Sprintf(key)]) > 0 { |
|
language = _defaultLanguageHant |
|
} else { |
|
language = _defaultLanguageHans |
|
} |
|
} else { |
|
language = _defaultLanguageHans |
|
} |
|
} |
|
var ( |
|
key = fmt.Sprintf(_initTabKey, plat, language) |
|
tmptabs = []*show.Tab{} |
|
) |
|
res = map[string][]*show.Tab{} |
|
if tabs, ok := s.tabCache[key]; ok { |
|
LOOP: |
|
for _, v := range tabs { |
|
for _, l := range s.limitsCahce[v.ID] { |
|
if model.InvalidBuild(build, l.Build, l.Condition) { |
|
continue LOOP |
|
} |
|
} |
|
if !s.c.ShowHotAll { |
|
if ab, ok := s.abtestCache[v.Group]; ok { |
|
if _, ok := s.showTabMids[mid]; !ab.AbTestIn(buvid) && !ok { |
|
continue LOOP |
|
} |
|
a = &abtest.List{} |
|
a.ListChange(ab) |
|
} |
|
} |
|
tmptabs = append(tmptabs, v) |
|
} |
|
} |
|
if !s.auditTab(mobiApp, build, plat) { |
|
if menus := s.menus(plat, build); len(menus) > 0 { |
|
tmptabs = append(tmptabs, menus...) |
|
} |
|
} |
|
for _, v := range tmptabs { |
|
t := &show.Tab{} |
|
*t = *v |
|
t.Pos = len(res[v.ModuleStr]) + 1 |
|
res[v.ModuleStr] = append(res[v.ModuleStr], t) |
|
} |
|
if version = s.hash(res); version == ver { |
|
err = ecode.NotModified |
|
res = nil |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) menus(plat int8, build int) (res []*show.Tab) { |
|
memuCache := s.menuCache |
|
LOOP: |
|
for _, m := range memuCache { |
|
if vs, ok := m.Versions[model.PlatAPPBuleChange(plat)]; ok { |
|
for _, v := range vs { |
|
if model.InvalidBuild(build, v.Build, v.Condition) { |
|
continue LOOP |
|
} |
|
} |
|
t := &show.Tab{} |
|
t.TabMenuChange(m) |
|
res = append(res, t) |
|
} |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) hash(v map[string][]*show.Tab) string { |
|
bs, err := json.Marshal(v) |
|
if err != nil { |
|
log.Error("json.Marshal error(%v)", err) |
|
return _initVersion |
|
} |
|
return strconv.FormatUint(farm.Hash64(bs), 10) |
|
}
|
|
|