242 lines
5.6 KiB
Go
242 lines
5.6 KiB
Go
package rankser
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"91porn-server/app/appg"
|
|
"91porn-server/common"
|
|
"91porn-server/common/constant/redisconst"
|
|
"91porn-server/common/log"
|
|
"91porn-server/models/s/kwrankmod"
|
|
"91porn-server/models/s/statusermod"
|
|
"91porn-server/models/v/usermod"
|
|
)
|
|
|
|
const MaxCount = 30
|
|
|
|
type KWPage struct {
|
|
List []kwrankmod.Keyword `json:"list"`
|
|
Count int64 `json:"count"`
|
|
UpdatedAt string `json:"updatedAt"`
|
|
HasNext bool `json:"hasNext"`
|
|
}
|
|
|
|
// 热搜排行榜
|
|
func GetHotSearchList() (KWPage, error) {
|
|
keywords, err := kwrankmod.RecentRanking(MaxCount)
|
|
if err != nil {
|
|
log.Error("app service rank GetHotSearchList 1 FindHotSearchList err", log.E(err))
|
|
return KWPage{}, err
|
|
}
|
|
now := time.Now()
|
|
return KWPage{
|
|
List: keywords,
|
|
Count: int64(len(keywords)),
|
|
UpdatedAt: now.Format("2006-01-02 15:04"),
|
|
HasNext: false,
|
|
}, nil
|
|
}
|
|
|
|
type RankType = string
|
|
|
|
const (
|
|
UserInviteRankType RankType = "userInviteRank" //推广达人
|
|
UserIncomeRankType RankType = "userIncomeRank" //收益达人
|
|
UserUploadRankType RankType = "userUploadRank" //上传达人
|
|
|
|
//VideoTodayRankType RankType = "videoTodayRank" //今日排行(视频)
|
|
//VideoLikeRankType RankType = "videoLikeRank" //点赞榜
|
|
//VideoCmtRankType RankType = "videoCmtRank" //评论榜
|
|
//KeywordHotRankType RankType = "keywordHotRank" //热搜榜
|
|
)
|
|
|
|
const (
|
|
UserInviteRankMax = 50
|
|
UserIncomeRankMax = 50
|
|
UserUploadRankMax = 50
|
|
)
|
|
|
|
type RankMap = map[RankType]interface{}
|
|
|
|
func GetRankMap() (RankMap, error) {
|
|
rankMap := RankMap{}
|
|
wg := sync.WaitGroup{}
|
|
wg.Add(3)
|
|
var (
|
|
userInviteRank UserRank
|
|
userIncomeRank UserRank
|
|
userUploadRank UserRank
|
|
)
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
//收益达人
|
|
rank, err := redisUserIncomeRank()
|
|
if err != nil {
|
|
log.Warn("redisUserIncomeRank faild", log.E(err))
|
|
}
|
|
userIncomeRank = rank
|
|
})
|
|
//上传达人
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
rank, err := redisUserUploadRank()
|
|
if err != nil {
|
|
log.Warn("redisUserUploadRank faild", log.E(err))
|
|
}
|
|
userUploadRank = rank
|
|
})
|
|
wg.Wait()
|
|
rankMap[UserInviteRankType] = userInviteRank
|
|
rankMap[UserIncomeRankType] = userIncomeRank
|
|
rankMap[UserUploadRankType] = userUploadRank
|
|
return rankMap, nil
|
|
}
|
|
|
|
type UBaseInfo = usermod.BaseInfo
|
|
|
|
func getExcludedUIDMap() (map[uint64]byte, error) {
|
|
excludedUIDMap, err := usermod.GetLockedUIDMap()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if appg.Static != nil {
|
|
sysUserList := appg.Static.SysUser
|
|
for _, uid := range sysUserList {
|
|
excludedUIDMap[uid] = 1
|
|
}
|
|
}
|
|
//历史遗留的区代不参加排行
|
|
oldAgents := []uint64{115057, 117557, 564993, 1384837, 1384879, 1855799}
|
|
for _, agent := range oldAgents {
|
|
excludedUIDMap[agent] = 1
|
|
}
|
|
return excludedUIDMap, nil
|
|
}
|
|
|
|
func GetUserIncomeRank() (UserRank, error) {
|
|
excludedUIDMap, err := getExcludedUIDMap()
|
|
if err != nil {
|
|
return UserRank{}, err
|
|
}
|
|
list, err := statusermod.ListByVidIncome(UserIncomeRankMax + int64(len(excludedUIDMap)))
|
|
if err != nil {
|
|
return UserRank{}, err
|
|
}
|
|
listLen := len(list)
|
|
uidList := make([]uint64, 0, listLen)
|
|
for _, v := range list {
|
|
if _, ok := excludedUIDMap[v.UID]; !ok {
|
|
uidList = append(uidList, v.UID)
|
|
}
|
|
}
|
|
if len(uidList) > UserIncomeRankMax {
|
|
uidList = uidList[:UserIncomeRankMax]
|
|
}
|
|
uInfos, err := usermod.GetUsersBaseInfo(uidList)
|
|
if err != nil {
|
|
return UserRank{}, err
|
|
}
|
|
uInfoMap := make(map[uint64]*UBaseInfo)
|
|
for _, info := range uInfos {
|
|
uInfoMap[info.UID] = info
|
|
}
|
|
updatedAt := time.Time{}
|
|
if listLen != 0 {
|
|
updatedAt = list[0].UpdatedAt
|
|
}
|
|
userList := make([]User, 0, listLen)
|
|
for _, v := range list {
|
|
uInfo, ok := uInfoMap[v.UID]
|
|
if !ok {
|
|
continue
|
|
}
|
|
userList = append(userList, User{
|
|
UID: uInfo.UID,
|
|
Name: uInfo.Name,
|
|
Portrait: uInfo.Portrait,
|
|
Value: v.Count,
|
|
})
|
|
}
|
|
rank := UserRank{
|
|
ItemList: userList,
|
|
Sort: 1,
|
|
Background: "",
|
|
UpdatedAt: updatedAt,
|
|
}
|
|
return rank, nil
|
|
}
|
|
|
|
func redisUserIncomeRank() (UserRank, error) {
|
|
redisKey := redisconst.RankKey(UserIncomeRankType)
|
|
var rank UserRank
|
|
if err := appg.Redis.Scan(redisKey, &rank); err != nil {
|
|
log.Warn("rankser redisUserIncomeRank redis Scan failed", log.E(err))
|
|
return GetUserIncomeRank()
|
|
}
|
|
return rank, nil
|
|
}
|
|
|
|
func GetUserUploadRank() (UserRank, error) {
|
|
excludedUIDMap, err := getExcludedUIDMap()
|
|
if err != nil {
|
|
return UserRank{}, err
|
|
}
|
|
list, err := statusermod.ListByUploadCount(UserUploadRankMax + int64(len(excludedUIDMap)))
|
|
if err != nil {
|
|
return UserRank{}, err
|
|
}
|
|
listLen := len(list)
|
|
uidList := make([]uint64, 0, listLen)
|
|
for _, v := range list {
|
|
if _, ok := excludedUIDMap[v.UID]; !ok {
|
|
uidList = append(uidList, v.UID)
|
|
}
|
|
}
|
|
if listLen > UserUploadRankMax {
|
|
uidList = uidList[:UserUploadRankMax]
|
|
}
|
|
uInfos, err := usermod.GetUsersBaseInfo(uidList)
|
|
if err != nil {
|
|
return UserRank{}, err
|
|
}
|
|
uInfoMap := make(map[uint64]*UBaseInfo)
|
|
for _, info := range uInfos {
|
|
uInfoMap[info.UID] = info
|
|
}
|
|
updatedAt := time.Time{}
|
|
if len(list) != 0 {
|
|
updatedAt = list[0].UpdatedAt
|
|
}
|
|
userList := make([]User, 0, listLen)
|
|
for _, v := range list {
|
|
uInfo, ok := uInfoMap[v.UID]
|
|
if !ok {
|
|
continue
|
|
}
|
|
userList = append(userList, User{
|
|
UID: uInfo.UID,
|
|
Name: uInfo.Name,
|
|
Portrait: uInfo.Portrait,
|
|
Value: v.Count,
|
|
})
|
|
}
|
|
rank := UserRank{
|
|
ItemList: userList,
|
|
Sort: 1,
|
|
Background: "",
|
|
UpdatedAt: updatedAt,
|
|
}
|
|
return rank, nil
|
|
}
|
|
|
|
func redisUserUploadRank() (UserRank, error) {
|
|
redisKey := redisconst.RankKey(UserUploadRankType)
|
|
var rank UserRank
|
|
if err := appg.Redis.Scan(redisKey, &rank); err != nil {
|
|
log.Warn("rankser redisUserUploadRank redis Scan faild", log.E(err))
|
|
return GetUserUploadRank()
|
|
}
|
|
return rank, nil
|
|
}
|