package scoresaber import ( "log" "sync" "time" "github.com/gorilla/websocket" ) const wsURL = "wss://scoresaber.com/ws" var ScoresManager = scoresManager{} type scoresManager struct { recentScores []Command mu sync.Mutex conn *websocket.Conn retryTimes int } func init() { for err := ScoresManager.connect(); err != nil; err = ScoresManager.connect() { log.Print("连接 WebSocket 失败:", err) time.Sleep(time.Second) } } func (sm *scoresManager) connect() error { var err error sm.conn, _, err = websocket.DefaultDialer.Dial(wsURL, nil) if err != nil { return err } sm.retryTimes = 0 sm.recentScores = make([]Command, 0) go sm.receiveData() return nil } func (sm *scoresManager) receiveData() { defer func() { for err := ScoresManager.connect(); err != nil; err = ScoresManager.connect() { log.Printf("连接 WebSocket 失败:%v", err) time.Sleep(time.Second) } }() for { var cmd Command err := sm.conn.ReadJSON(&cmd) if err != nil { log.Print("读取数据失败:", err) time.Sleep(time.Second) sm.retryTimes++ if sm.retryTimes > 3 { return } continue } SSQuery.SaveRecord(cmd.CommandData) if cmd.CommandData.Score.LeaderboardPlayerInfo.Country != "CN" { continue } sm.mu.Lock() if len(sm.recentScores) >= 50 { sm.recentScores = sm.recentScores[1:] } sm.recentScores = append(sm.recentScores, cmd) sm.mu.Unlock() } } func (sm *scoresManager) GetRecentScores(count int) []Command { sm.mu.Lock() defer sm.mu.Unlock() if count > len(sm.recentScores) { count = len(sm.recentScores) } scoresCopy := make([]Command, count) copy(scoresCopy, sm.recentScores[len(sm.recentScores)-count:]) return scoresCopy }