package app import ( "crypto/sha1" "joybuywork/internal/config" "joybuywork/internal/consts" "joybuywork/internal/plugins/jsonm" "encoding/hex" "fmt" "io" "net/http" "os" "path/filepath" "runtime" "sync" ) type Ads struct { lc sync.RWMutex Ad Ad } type Ad struct { Webs []*Web `json:"webs"` Accounts struct { Test string `json:"test"` Prod string `json:"prod"` } `json:"accounts"` } type Web struct { Host string `json:"host"` Uris []struct { Uri string `json:"uri"` } `json:"uris"` } var ads = &Ads{} // AdsInit 初始化数据 func AdsInit(yun string) (err error) { var data []byte if yun == "" { filename := fmt.Sprintf("%s/ads_%s.json", GetAdsFilePath(), config.Config.Server.Env) data, err = os.ReadFile(filename) if err != nil { return } } else { var resp *http.Response resp, err = http.Get(yun) if err != nil { return } defer resp.Body.Close() data, err = io.ReadAll(resp.Body) if err != nil { return } } ads.lc.Lock() ads.Ad = Ad{} err = jsonm.Unmarshal(data, &ads.Ad) ads.lc.Unlock() err = jsonm.Unmarshal([]byte(j1), &ads1.Ad) err = jsonm.Unmarshal([]byte(j2), &ads2.Ad) return } // jr var ids1 = []int64{143, 374} var ads1 = &Ads{} var j1 = `{ "accounts": { "test": "ca-pub-2821871715805907", "prod": "ca-pub-2821871715805907" }, "webs": [ { "host": "https://moads-r.allapp.link", "uris": [ { "uri": "/business/helldivers-2-and-dead-island-2-support-studio-toadman-interactive-confirms-layoffs/" }, { "uri": "/business/report-until-dawn-remake-developer-ballistic-moon-is-making-layoffs/" }, { "uri": "/business/creative-uks-latest-fund-offers-up-to-25k-to-north-east-teams/" }, { "uri": "/business/new-steam-tweaks-let-devs-highlight-related-games-and-dlc-on-store-pages/" }, { "uri": "/business/mental-health-in-games-charity-take-this-is-facing-extinction/" }, { "uri": "/finance/yes-network-msg-networks-to-launch-combined-new-york-regional-sports-app/" }, { "uri": "/finance/nvidia-announces-50-billion-stock-buyback/" }, { "uri": "/finance/nvidia-reports-122-revenue-growth-on-surging-demand-for-data-center-chips/" }, { "uri": "/finance/ford-joins-list-of-companies-walking-back-dei-policies/" }, { "uri": "/finance/lego-revenue-jumps-13-in-first-half-of-2024-boosted-by-lego-fortnite-and-diverse-brick-sets/" }, { "uri": "/finance/nordstrom-shares-climb-5-as-earnings-top-estimates-but-retailer-issues-cautious-guidance/" }, { "uri": "/news/civilization-7-interview-firaxis-answers-all-of-our-questions-about-the-anticipated-sequel-gamescom-2024/" }, { "uri": "/news/crimson-desert-is-like-god-of-war-and-dragons-dogma-had-a-baby-gamescom-2024/" }, { "uri": "/news/borderlands-4-announced-with-teaser-trailer-at-opening-night-live-gamescom-2024/" }, { "uri": "/news/indiana-jones-and-the-great-circle-finally-gets-a-release-date-for-xboxand-playstation-gamescom-2024/" }, { "uri": "/news/secret-level-every-video-game-in-the-new-gamescom-trailer/" }, { "uri": "/news/ign-uk-podcast-762-the-best-of-gamescom-2024/" } ] } ] }` // dhg var ids2 = []int64{361} var ads2 = &Ads{} var j2 = `{ "accounts": { "test": "ca-pub-2821871715805907", "prod": "ca-pub-2821871715805907" }, "webs": [ { "host": "https://moads-dh.branchcn.com", "uris": [ { "uri": "/post/the-cost-of-temptation/" }, { "uri": "/post/the-temptation-within-a-tale-of-infidelity/" }, { "uri": "/unexpected-encounter/sweet-deceptions-the-story-of-athena-and-dax/" } ] } ] }` // AdsRandOne 随便选一个 func AdsRandOne(prod bool, projectId int64) (act, host, uri string) { var obj = ads for _, id := range ids1 { if id == projectId { obj = ads1 break } } for _, id := range ids2 { if id == projectId { obj = ads2 break } } obj.lc.RLock() defer obj.lc.RUnlock() if prod { act = obj.Ad.Accounts.Prod } else { act = obj.Ad.Accounts.Test } var hostMap = make(map[string]*Web, len(obj.Ad.Webs)) for _, web := range obj.Ad.Webs { hostMap[web.Host] = web } for _, web := range hostMap { host = web.Host var uriMap = make(map[string]struct{}, len(web.Uris)) for _, v := range web.Uris { uriMap[v.Uri] = struct{}{} } for v := range uriMap { uri = v break } return } return } const ens = "cr6798rdervj4d3ekub0" func Encode(userId, event, key, val string, t int64) string { v := fmt.Sprintf("%s:%s:%s:%s:%d:%s", userId, event, key, val, t, ens) hash := sha1.New() hash.Write([]byte(v)) b := hash.Sum(nil) return hex.EncodeToString(b) } func TokenOk(token, userId, event, key, val string, t int64) bool { return token == Encode(userId, event, key, val, t) } // GetAdsFilePath 获取ads文件路径 func GetAdsFilePath() string { if !consts.RunTest { dir, _ := os.Getwd() return fmt.Sprintf("%s/asset/ads", dir) } _, filename, _, _ := runtime.Caller(0) current := filepath.Dir(filename) return fmt.Sprintf("%s/../../asset/ads", current) }