package activityclient import ( "encoding/json" "sync" "time" "91porn-server/app/appg" "91porn-server/common" "91porn-server/common/httputil" "91porn-server/common/log" ) // HongbaoActivity 与 activity-public-server activityMod.HongbaoActivity 保持一致 type HongbaoActivity struct { ID string `json:"id"` Name string `json:"name"` StartTime time.Time `json:"startTime"` EndTime time.Time `json:"endTime"` TriggerTimes []string `json:"triggerTimes"` SessionDuration int `json:"sessionDuration"` SessionClickLimit int `json:"sessionClickLimit"` AppIds []string `json:"appIds"` Enabled bool `json:"enabled"` } // UpcomingSessionItem 进行中/即将开启的场次 type UpcomingSessionItem struct { SessionId string `json:"sessionId,omitempty"` StartTime time.Time `json:"startTime"` EndTime time.Time `json:"endTime"` Status string `json:"status"` // active=进行中, upcoming=未来即将开启 } // HongbaoUpcomingResp 拉取响应内容 type HongbaoUpcomingResp struct { Activity *HongbaoActivity `json:"activity"` List []UpcomingSessionItem `json:"list"` } type hongbaoApiResp struct { Code int `json:"code"` Data HongbaoUpcomingResp `json:"data"` } var ( cachedHongbao HongbaoUpcomingResp cachedHongbaoMu sync.RWMutex ) // GetHongbaoUpcoming 获取缓存的红包场次 func GetHongbaoUpcoming() HongbaoUpcomingResp { cachedHongbaoMu.RLock() defer cachedHongbaoMu.RUnlock() return cachedHongbao } // startHongbaoSync 启动定时拉取红包场次(每10秒) func startHongbaoSync() { fetchHongbaoUpcoming() common.Go(func() { ticker := time.NewTicker(10 * time.Second) defer ticker.Stop() for range ticker.C { fetchHongbaoUpcoming() } }) } // fetchHongbaoUpcoming 调活动服 /api/app/hongbao/upcoming func fetchHongbaoUpcoming() { conf := appg.Conf.ActivityServer if conf.ApiUrl == "" || conf.AppId == "" { return } const path = "/api/app/hongbao/upcoming" rawQuery := "appId=" + conf.AppId url := conf.ApiUrl + path + "?" + rawQuery headers := BuildSvcHeaders(conf.AppId, conf.SecretKey, "GET", path, rawQuery, nil) _, body, err := httputil.DefaultClientGetBytes(url, headers) if err != nil { log.Error("活动服-拉取红包场次失败", log.Any("url", url), log.E(err)) return } var resp hongbaoApiResp if err := json.Unmarshal(body, &resp); err != nil { log.Error("活动服-解析红包场次失败", log.Any("body", string(body)), log.E(err)) return } if resp.Code != 200 { log.Warn("活动服-红包场次返回非成功状态", log.Any("code", resp.Code)) return } cachedHongbaoMu.Lock() cachedHongbao = resp.Data cachedHongbaoMu.Unlock() }