Files
web_huakui_server/pub/common/laosiji/domains.go
T
rootandClaude Opus 4.7 85c0071fd8 feat: 从黄果 NET hgdjnet-server 9bfbafe 导入 HKDJ 官网后端
来源:hgdjnet-server 9bfbafe10d417deea959bd53117bc88a10e60a83
项目身份 HKDJ / JHA-216,独立官网仓库,Jenkins 守卫键 hkdjnet
测试目录 /server/hkdj_net,App/Web API 30331/30332

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-10-16 11:20:04 +08:00

78 lines
1.7 KiB
Go

package laosiji
import (
"context"
"sync"
"time"
)
const SystemDomainsPath = "/lsjapi/system/domains"
type SystemDomains struct {
ImgFreeCdn string `json:"img_free_cdn"`
ImgVipCdn string `json:"img_vip_cdn"`
ImgCnCdn string `json:"img_cn_cdn"`
ImgSourceCdn string `json:"img_source_cdn"`
MovieFreeCdn string `json:"movie_free_cdn"`
MovieVipCdn string `json:"movie_vip_cdn"`
MovieCnCdn string `json:"movie_cn_cdn"`
MovieSourceCdn string `json:"movie_source_cdn"`
UploadURL string `json:"upload_url"`
MediaDir string `json:"media_dir"`
UploadKey string `json:"upload_key"`
UserID string `json:"user_id"`
}
type Domains struct {
client *Client
mu sync.RWMutex
cur *SystemDomains
fetchedAt time.Time
}
func NewDomains(client *Client) *Domains {
return &Domains{client: client}
}
func (d *Domains) Refresh(ctx context.Context) (*SystemDomains, error) {
var sd SystemDomains
if err := d.client.Call(ctx, SystemDomainsPath, map[string]string{}, &sd); err != nil {
return nil, err
}
d.mu.Lock()
d.cur = &sd
d.fetchedAt = time.Now()
d.mu.Unlock()
return &sd, nil
}
func (d *Domains) Get(ctx context.Context) (*SystemDomains, error) {
d.mu.RLock()
cur := d.cur
d.mu.RUnlock()
if cur != nil {
return cur, nil
}
return d.Refresh(ctx)
}
func (d *Domains) StartAutoRefresh(interval time.Duration) (stop func()) {
done := make(chan struct{})
go func() {
t := time.NewTicker(interval)
defer t.Stop()
for {
select {
case <-done:
return
case <-t.C:
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
_, _ = d.Refresh(ctx)
cancel()
}
}
}()
return func() { close(done) }
}