package beatleader import ( "log" "time" "git.lxtend.com/qqbot/sqlite3" "github.com/gorilla/websocket" ) const wsURL = "wss://sockets.api.beatleader.xyz/scores" var BlScoresManager = blScoresManager{} type blScoresManager struct { conn *websocket.Conn retryTimes int } func init() { for err := BlScoresManager.connect(); err != nil; err = BlScoresManager.connect() { log.Print("连接 WebSocket 失败:", err) time.Sleep(time.Second) } } func (bm *blScoresManager) connect() error { var err error bm.conn, _, err = websocket.DefaultDialer.Dial(wsURL, nil) if err != nil { return err } bm.retryTimes = 0 go bm.receiveData() return nil } func (sm *blScoresManager) receiveData() { defer func() { for err := BlScoresManager.connect(); err != nil; err = BlScoresManager.connect() { log.Printf("连接 WebSocket 失败:%v", err) time.Sleep(time.Second) } }() for { var scoreData ScoreData err := sm.conn.ReadJSON(&scoreData) if err != nil { log.Print("读取数据失败:", err) time.Sleep(time.Second) sm.retryTimes++ if sm.retryTimes > 3 { return } continue } BLQuery.SaveRecord(scoreData) } } func (sm *blScoresManager) GetRecentScores(count int, predict string) []RecordDataLite { db := sqlite3.GetDB() scoresCopy := make([]RecordDataLite, 0, count) query := "SELECT * FROM blRecordData" if predict != "" { query += " " + predict } query += " ORDER BY generated_time DESC LIMIT ?" err := db.Select(&scoresCopy, query, count) if err != nil { log.Print(err) return nil } return scoresCopy }