174 lines
5.3 KiB
Go
174 lines
5.3 KiB
Go
package translationser
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
"videoweb/app/api/proto"
|
|
"videoweb/pub/common/log"
|
|
"videoweb/pub/common/netutil"
|
|
"videoweb/pub/models/cfg"
|
|
"videoweb/pub/models/translationcategorymod"
|
|
"videoweb/pub/models/translationmod"
|
|
"videoweb/pub/pubdef"
|
|
|
|
"github.com/robfig/cron/v3"
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
)
|
|
|
|
var (
|
|
CacheMgr CacheInfo //
|
|
skdCron *cron.Cron
|
|
)
|
|
|
|
type CacheInfo struct {
|
|
Lock sync.RWMutex // 读写锁
|
|
TranslationData proto.AppTranslationInfo // 导航信息缓存
|
|
BottomTranslationData proto.AppTranslationInfo // 底部导航信息缓存
|
|
TranslationMap map[int64]proto.TranslationInfo
|
|
}
|
|
|
|
func init() {
|
|
skdCron = cron.New(cron.WithSeconds()) // 秒级定时任务
|
|
CacheMgr.TranslationData = proto.AppTranslationInfo{}
|
|
CacheMgr.BottomTranslationData = proto.AppTranslationInfo{}
|
|
CacheMgr.TranslationMap = make(map[int64]proto.TranslationInfo)
|
|
}
|
|
|
|
func Start() {
|
|
ctx := context.Background()
|
|
UpdateTranslationInfo(ctx)
|
|
|
|
_, _ = skdCron.AddFunc("0 */5 * * * ?", func() {
|
|
UpdateTranslationInfo(ctx)
|
|
})
|
|
|
|
skdCron.Start()
|
|
}
|
|
|
|
func UpdateTranslationInfo(ctx context.Context) {
|
|
filter := bson.M{cfg.FN.SysCfg.Id: 1}
|
|
sysCfg, _ := cfg.FindOneSysCfg(context.Background(), filter)
|
|
if sysCfg == nil {
|
|
return
|
|
}
|
|
translation := proto.AppTranslationInfo{}
|
|
bottomTranslation := proto.AppTranslationInfo{}
|
|
wg := &sync.WaitGroup{}
|
|
wg.Add(2)
|
|
var translationCategoryList translationcategorymod.TranslationCategoryList
|
|
var translationList translationmod.TranslationInfoList
|
|
go func() {
|
|
defer wg.Done()
|
|
categoryFilter := bson.M{
|
|
translationcategorymod.FN.TranslationCategory.Status: true,
|
|
}
|
|
categoryOpt := &options.FindOptions{}
|
|
categoryOpt.SetLimit(1000).SetSort(bson.M{translationcategorymod.FN.TranslationCategory.Rank: -1})
|
|
|
|
translationCategoryList, _ = translationcategorymod.FindManyTranslationCategorys(ctx, categoryFilter, categoryOpt)
|
|
}()
|
|
go func() {
|
|
defer wg.Done()
|
|
translationFilter := bson.M{
|
|
translationmod.FN.TranslationInfo.Status: true,
|
|
}
|
|
translationOpt := &options.FindOptions{}
|
|
translationOpt.SetLimit(1000).SetSort(bson.M{translationmod.FN.TranslationInfo.Rank: -1})
|
|
|
|
translationList, _ = translationmod.FindManyTranslationInfos(ctx, translationFilter, translationOpt)
|
|
}()
|
|
|
|
wg.Wait()
|
|
|
|
tempTranslationMap := make(map[int64]proto.TranslationInfo)
|
|
|
|
for _, categoryInfo := range translationCategoryList {
|
|
|
|
categoryTemp := proto.TranslationCategory{
|
|
ID: categoryInfo.Id,
|
|
Name: categoryInfo.Name,
|
|
Icon: netutil.MergeURL(sysCfg.ImgAppCdn, categoryInfo.Icon),
|
|
TranslationList: make([]proto.TranslationInfo, 0),
|
|
CategoryType: categoryInfo.CategoryType,
|
|
SeoInfo: categoryInfo.SeoInfo,
|
|
}
|
|
if categoryTemp.CategoryType == pubdef.TranslationTypeUrl {
|
|
categoryTemp.UrlValue = categoryInfo.UrlValue
|
|
} else if categoryInfo.CategoryType == pubdef.TranslationTypeSub {
|
|
for _, translationInfo := range translationList {
|
|
if categoryInfo.Id == translationInfo.TransCategoryId {
|
|
translationTmp := proto.TranslationInfo{
|
|
ID: translationInfo.Id,
|
|
Name: translationInfo.Name,
|
|
}
|
|
if translationInfo.IsFriendAds {
|
|
translationTmp.IsFriendAds = true
|
|
// 友链广告 获取的时候添加
|
|
// TODO:顶部暂不支持 。
|
|
continue
|
|
} else {
|
|
translationTmp.UrlValue = translationInfo.Link
|
|
}
|
|
if translationTmp.UrlValue == "" {
|
|
continue
|
|
}
|
|
tempTranslationMap[translationInfo.Id] = translationTmp
|
|
categoryTemp.TranslationList = append(categoryTemp.TranslationList, translationTmp)
|
|
}
|
|
}
|
|
} else if categoryInfo.CategoryType == pubdef.TranslationTypeBottom {
|
|
for _, translationInfo := range translationList {
|
|
if categoryInfo.Id == translationInfo.TransCategoryId {
|
|
translationTmp := proto.TranslationInfo{
|
|
ID: translationInfo.Id,
|
|
Name: translationInfo.Name,
|
|
}
|
|
if translationInfo.IsFriendAds {
|
|
translationTmp.IsFriendAds = true
|
|
// 友链广告 获取的时候添加
|
|
} else {
|
|
translationTmp.UrlValue = translationInfo.Link
|
|
}
|
|
tempTranslationMap[translationInfo.Id] = translationTmp
|
|
categoryTemp.TranslationList = append(categoryTemp.TranslationList, translationTmp)
|
|
|
|
}
|
|
}
|
|
bottomTranslation.CategoryList = append(bottomTranslation.CategoryList, categoryTemp)
|
|
continue
|
|
} else {
|
|
continue
|
|
}
|
|
translation.CategoryList = append(translation.CategoryList, categoryTemp)
|
|
}
|
|
log.Info("", log.Any("categoryInfo.Name", translation.CategoryList))
|
|
CacheMgr.Lock.Lock()
|
|
defer CacheMgr.Lock.Unlock()
|
|
CacheMgr.TranslationData = translation
|
|
CacheMgr.BottomTranslationData = bottomTranslation
|
|
CacheMgr.TranslationMap = tempTranslationMap
|
|
|
|
}
|
|
func GetTranslationData() proto.AppTranslationInfo {
|
|
CacheMgr.Lock.RLock()
|
|
defer CacheMgr.Lock.RUnlock()
|
|
|
|
log.Info("GetTranslationData", log.Any("TranslationData", CacheMgr.TranslationData))
|
|
return CacheMgr.TranslationData
|
|
}
|
|
func GetTranslationBottomList() proto.AppTranslationInfo {
|
|
CacheMgr.Lock.RLock()
|
|
defer CacheMgr.Lock.RUnlock()
|
|
return CacheMgr.BottomTranslationData
|
|
}
|
|
|
|
func GetTranslationInfo(id int64) *proto.TranslationInfo {
|
|
CacheMgr.Lock.RLock()
|
|
defer CacheMgr.Lock.RUnlock()
|
|
if v, ok := CacheMgr.TranslationMap[id]; ok {
|
|
return &v
|
|
}
|
|
return nil
|
|
}
|