2024-10-09 01:30:50 +08:00

83 lines
1.7 KiB
Go

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
}