83 lines
1.7 KiB
Go
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
|
|
}
|