134 lines
3.6 KiB
Go
134 lines
3.6 KiB
Go
package imadser
|
|
|
|
import (
|
|
"sort"
|
|
"strings"
|
|
|
|
"91porn-server/app/service/adser"
|
|
"91porn-server/common/enum/imad"
|
|
)
|
|
|
|
const maxAdsPerPosition = 10
|
|
|
|
type IMAdItem struct {
|
|
ID string `json:"id"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
Cover string `json:"cover"`
|
|
Href string `json:"href"`
|
|
Position string `json:"position"`
|
|
PositionName string `json:"positionName"`
|
|
SortCode int `json:"sortCode"`
|
|
CoverImgSize string `json:"coverImgSize"`
|
|
WatchTime int `json:"watchTime"`
|
|
}
|
|
|
|
type AdPositionGroup struct {
|
|
Position string `json:"position"`
|
|
PositionName string `json:"positionName"`
|
|
List []IMAdItem `json:"list"`
|
|
}
|
|
|
|
func GetAdsByPositionCode(positionCode string) (positionName string, list []IMAdItem) {
|
|
slots, err := adser.JtAdvertiseThreeServer()
|
|
if err != nil {
|
|
return "", []IMAdItem{}
|
|
}
|
|
return SelectAdsByPositionCode(slots, positionCode)
|
|
}
|
|
|
|
func GetAdsByPositionCodes(positionCodes []string) []AdPositionGroup {
|
|
slots, err := adser.JtAdvertiseThreeServer()
|
|
if err != nil {
|
|
return []AdPositionGroup{}
|
|
}
|
|
return SelectAdsByPositionCodes(slots, positionCodes)
|
|
}
|
|
|
|
func SelectAdsByPositionCode(slots []adser.AdSlot, positionCode string) (string, []IMAdItem) {
|
|
positionCode = strings.TrimSpace(positionCode)
|
|
matches := make([]IMAdItem, 0)
|
|
positionName := ""
|
|
for _, slot := range slots {
|
|
if strings.TrimSpace(slot.AdvertiseLocationCode) != positionCode {
|
|
continue
|
|
}
|
|
positionName = slot.AdvertiseLocationName
|
|
for _, ad := range slot.AdDetailInfoList {
|
|
extra := ad.GetExtraData()
|
|
matches = append(matches, IMAdItem{
|
|
ID: ad.AdvertiseCode,
|
|
Title: ad.AdvertiseName,
|
|
Description: ad.AdvertiseDesc,
|
|
Cover: ad.GetCoverLsj(),
|
|
Href: ad.GetRealLink(nil, nil),
|
|
Position: positionCode,
|
|
PositionName: slot.AdvertiseLocationName,
|
|
SortCode: ad.Sort,
|
|
CoverImgSize: extra.CoverImgSize,
|
|
WatchTime: extra.WatchTime,
|
|
})
|
|
}
|
|
}
|
|
sort.SliceStable(matches, func(i, j int) bool {
|
|
return matches[i].SortCode < matches[j].SortCode
|
|
})
|
|
if len(matches) > maxAdsPerPosition {
|
|
matches = matches[:maxAdsPerPosition]
|
|
}
|
|
return positionName, matches
|
|
}
|
|
|
|
func SelectAdsByPositionCodes(slots []adser.AdSlot, positionCodes []string) []AdPositionGroup {
|
|
normalized := normalizePositionCodes(positionCodes)
|
|
groups := make([]AdPositionGroup, 0, len(normalized))
|
|
for _, positionCode := range normalized {
|
|
positionName, list := SelectAdsByPositionCode(slots, positionCode)
|
|
groups = append(groups, AdPositionGroup{
|
|
Position: positionCode,
|
|
PositionName: positionName,
|
|
List: list,
|
|
})
|
|
}
|
|
return groups
|
|
}
|
|
|
|
func ListIMAdPositionCodesWithAds() []string {
|
|
slots, err := adser.JtAdvertiseThreeServer()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
positions := make([]string, 0)
|
|
seen := make(map[string]struct{})
|
|
for _, slot := range slots {
|
|
code := strings.TrimSpace(slot.AdvertiseLocationCode)
|
|
if !imad.IsPositionCode(code) || len(slot.AdDetailInfoList) == 0 {
|
|
continue
|
|
}
|
|
if _, ok := seen[code]; ok {
|
|
continue
|
|
}
|
|
seen[code] = struct{}{}
|
|
positions = append(positions, code)
|
|
}
|
|
sort.Strings(positions)
|
|
return positions
|
|
}
|
|
|
|
func normalizePositionCodes(positionCodes []string) []string {
|
|
seen := make(map[string]struct{}, len(positionCodes))
|
|
normalized := make([]string, 0, len(positionCodes))
|
|
for _, positionCode := range positionCodes {
|
|
positionCode = strings.TrimSpace(positionCode)
|
|
if positionCode == "" {
|
|
continue
|
|
}
|
|
if _, ok := seen[positionCode]; ok {
|
|
continue
|
|
}
|
|
seen[positionCode] = struct{}{}
|
|
normalized = append(normalized, positionCode)
|
|
}
|
|
return normalized
|
|
}
|