refactor: 移除 ScoreSaber 和 BeatLeader 热门成绩相关代码,并为玩家信息添加头像显示

This commit is contained in:
lixiangwuxian 2025-03-09 00:24:44 +08:00
parent 7d5b69685b
commit 2eb9716d24
6 changed files with 76 additions and 215 deletions

View File

@ -24,8 +24,6 @@ func init() {
handler.RegisterHelpInform("解绑ss", "scoresaber", "解绑您的scoresaber账号") handler.RegisterHelpInform("解绑ss", "scoresaber", "解绑您的scoresaber账号")
handler.RegisterHandler("最新ss", getMyRecentScore, constants.LEVEL_USER) handler.RegisterHandler("最新ss", getMyRecentScore, constants.LEVEL_USER)
handler.RegisterHelpInform("最新ss", "scoresaber", "查看您的最新游戏记录") handler.RegisterHelpInform("最新ss", "scoresaber", "查看您的最新游戏记录")
handler.RegisterHandler("最热ss", getRecentScore, constants.LEVEL_USER)
handler.RegisterHelpInform("最热ss", "scoresaber", "查看全大陆的最新游戏记录")
handler.RegisterHandler("截ss", screenshotSS, constants.LEVEL_USER) handler.RegisterHandler("截ss", screenshotSS, constants.LEVEL_USER)
handler.RegisterHelpInform("截ss", "scoresaber", "scoresaber主页截图") handler.RegisterHelpInform("截ss", "scoresaber", "scoresaber主页截图")
handler.RegisterHandler("jss", screenshotSS, constants.LEVEL_USER) handler.RegisterHandler("jss", screenshotSS, constants.LEVEL_USER)
@ -41,7 +39,6 @@ func getSSProfile(msg model.Message) (reply model.Reply) {
) )
var ssId string var ssId string
if len(msg.RawMsg) > len("查ss ") { if len(msg.RawMsg) > len("查ss ") {
// ssId = msg.RawMsg[len("查ss "):]
ssId = strings.Split(msg.RawMsg, " ")[1] ssId = strings.Split(msg.RawMsg, " ")[1]
noUpdate = true noUpdate = true
} }
@ -53,7 +50,6 @@ func getSSProfile(msg model.Message) (reply model.Reply) {
ssId, err = scoresaber.GetSSID(userIdStr) ssId, err = scoresaber.GetSSID(userIdStr)
} }
if err != nil { if err != nil {
// return "您未绑定ss账号输入\"绑定ss [ssId]\"绑定", nil
return model.Reply{ return model.Reply{
ReplyMsg: "您未绑定ss账号输入\"绑定ss [ssId]\"绑定", ReplyMsg: "您未绑定ss账号输入\"绑定ss [ssId]\"绑定",
ReferOriginMsg: true, ReferOriginMsg: true,
@ -66,7 +62,7 @@ func getSSProfile(msg model.Message) (reply model.Reply) {
resultStr, err = scoresaber.SSQuery.GetScoreWithoutUpdate(ssId) resultStr, err = scoresaber.SSQuery.GetScoreWithoutUpdate(ssId)
} }
if err == nil { if err == nil {
break // 成功时退出循环 break
} }
attempts++ attempts++
log.Printf("获取分数时出错,第 %d 次重试: %v", attempts, err) log.Printf("获取分数时出错,第 %d 次重试: %v", attempts, err)
@ -100,36 +96,6 @@ func unbindSS(msg model.Message) (reply model.Reply) {
} }
} }
func getRecentScore(msg model.Message) (reply model.Reply) {
count := 1
if len(msg.RawMsg) > len("最热ss ") {
var err error
count, err = strconv.Atoi(msg.RawMsg[len("最热ss "):])
if err != nil || count <= 0 {
return model.Reply{
ReplyMsg: "",
ReferOriginMsg: true,
FromMsg: msg,
}
}
if count > 10 {
count = 10
}
}
scoreMsg := ""
for _, v := range scoresaber.ScoresManager.GetRecentScores(count, " WHERE country = 'CN' ") {
scoreMsg += v.ToString() + "\n\n"
}
if len(scoreMsg) > 0 {
scoreMsg = scoreMsg[:len(scoreMsg)-len("\n\n")]
}
return model.Reply{
ReplyMsg: scoreMsg,
ReferOriginMsg: true,
FromMsg: msg,
}
}
func getMyRecentScore(msg model.Message) (reply model.Reply) { func getMyRecentScore(msg model.Message) (reply model.Reply) {
count := 1 count := 1
scoreMsg := "" scoreMsg := ""

View File

@ -1,87 +0,0 @@
package beatleader
// import (
// "log"
// "time"
// "git.lxtend.com/qqbot/sqlite3"
// "git.lxtend.com/qqbot/util"
// "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)
// }
// util.AddCycleTask("cleanOldScores", 0, 1*time.Hour, cleanOldScores)
// }
// 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
// // }
// func cleanOldScores() {
// db := sqlite3.GetDB()
// ssBind := make([]string, 0)
// db.Select(&ssBind, "SELECT ssid FROM ssBind")
// db.Exec("DELETE FROM blRecordData WHERE generated_time < ? AND ssid NOT IN (?)", time.Now().AddDate(0, 0, -1).Unix(), ssBind)
// }

View File

@ -2,7 +2,12 @@ package beatleader
import ( import (
"fmt" "fmt"
"log"
"os"
"time" "time"
"git.lxtend.com/qqbot/message"
"git.lxtend.com/qqbot/util"
) )
type ScoreData struct { type ScoreData struct {
@ -402,7 +407,24 @@ func (p PlayerDataLite) IsDiffFrom(p2 PlayerDataLite) bool {
} }
func (p PlayerData) ToString() string { func (p PlayerData) ToString() string {
err := util.DownloadFile(p.Avatar, util.GenTempFilePath(p.ID+".jpg"))
if err != nil {
log.Default().Printf("下载头像失败url:%s,err:%v", p.Avatar, err)
}
defer os.Remove(util.GenTempFilePath(p.ID + ".jpg"))
outFile, err := util.ResizeImageByMaxHeight(util.GenTempFilePath(p.ID+".jpg"), 20)
if err != nil {
log.Default().Printf("缩放头像失败url:%s,err:%v", p.Avatar, err)
}
picMsg := message.ImageMessage{
Type: message.TypeImage,
Data: message.ImageMessageData{
File: outFile,
},
}
formatedStr := "玩家 %s\n" + formatedStr := "玩家 %s\n" +
picMsg.ToCQString() +
"区域 %s\n" + "区域 %s\n" +
"PP %.1f\n" + "PP %.1f\n" +
"全球排名 %d\n" + "全球排名 %d\n" +
@ -446,7 +468,23 @@ func (p PlayerDataLite) ToString() string {
} }
func (p PlayerData) LastDiffToString(lastDayQueryData PlayerDataLite) string { func (p PlayerData) LastDiffToString(lastDayQueryData PlayerDataLite) string {
err := util.DownloadFile(p.Avatar, util.GenTempFilePath(p.ID+".jpg"))
if err != nil {
log.Default().Printf("下载头像失败url:%s,err:%v", p.Avatar, err)
}
defer os.Remove(util.GenTempFilePath(p.ID + ".jpg"))
outFile, err := util.ResizeImageByMaxHeight(util.GenTempFilePath(p.ID+".jpg"), 20)
if err != nil {
log.Default().Printf("缩放头像失败url:%s,err:%v", p.Avatar, err)
}
picMsg := message.ImageMessage{
Type: message.TypeImage,
Data: message.ImageMessageData{
File: outFile,
},
}
formatedStr := "玩家 %s\n" + formatedStr := "玩家 %s\n" +
picMsg.ToCQString() +
"区域 %s\n" + "区域 %s\n" +
"PP %.1f(%+.1f)\n" + "PP %.1f(%+.1f)\n" +
"全球排名 %d(%+d)\n" + "全球排名 %d(%+d)\n" +

View File

@ -1,91 +0,0 @@
package scoresaber
import (
"log"
"time"
"git.lxtend.com/qqbot/sqlite3"
"git.lxtend.com/qqbot/util"
"github.com/gorilla/websocket"
)
const wsURL = "wss://scoresaber.com/ws"
var ScoresManager = scoresManager{}
type scoresManager struct {
conn *websocket.Conn
retryTimes int
}
func init() {
for err := ScoresManager.connect(); err != nil; err = ScoresManager.connect() {
log.Print("连接 WebSocket 失败:", err)
time.Sleep(time.Second)
}
util.AddCycleTask("cleanOldScores", 0, 1*time.Hour, cleanOldScores)
}
func (sm *scoresManager) connect() error {
var err error
sm.conn, _, err = websocket.DefaultDialer.Dial(wsURL, nil)
if err != nil {
return err
}
sm.retryTimes = 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)
}
}
func (sm *scoresManager) GetRecentScores(count int, predict string) []RecordDataLite {
db := sqlite3.GetDB() // 假设 sqlite3.GetDB() 返回 *sqlx.DB
scoresCopy := make([]RecordDataLite, 0, count)
query := "SELECT * FROM ssRecordData"
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
}
func cleanOldScores() {
//清除>1天前且未绑定ss的记录
//1.获取所有绑定ss
//2.获取所有>1天前的记录
//3.删除未绑定ss的记录
db := sqlite3.GetDB()
ssBind := make([]string, 0)
db.Select(&ssBind, "SELECT ssid FROM ssBind")
db.Exec("DELETE FROM ssRecordData WHERE generated_time < ? AND ssid NOT IN (?)", time.Now().AddDate(0, 0, -1).Unix(), ssBind)
}

View File

@ -2,8 +2,13 @@ package scoresaber
import ( import (
"fmt" "fmt"
"log"
"os"
"strings" "strings"
"time" "time"
"git.lxtend.com/qqbot/message"
"git.lxtend.com/qqbot/util"
) )
// Command 表示从 WebSocket 收到的数据结构 // Command 表示从 WebSocket 收到的数据结构
@ -219,7 +224,23 @@ func (p PlayerDataLite) IsDiffFrom(p2 PlayerDataLite) bool {
} }
func (p PlayerData) ToString() string { func (p PlayerData) ToString() string {
err := util.DownloadFile(p.ProfilePicture, util.GenTempFilePath(p.ID+".jpg"))
if err != nil {
log.Default().Printf("下载头像失败url:%s,err:%v", p.ProfilePicture, err)
}
defer os.Remove(util.GenTempFilePath(p.ID + ".jpg"))
outFile, err := util.ResizeImageByMaxHeight(util.GenTempFilePath(p.ID+".jpg"), 20)
if err != nil {
log.Default().Printf("缩放头像失败url:%s,err:%v", p.ProfilePicture, err)
}
picMsg := message.ImageMessage{
Type: message.TypeImage,
Data: message.ImageMessageData{
File: outFile,
},
}
formatedStr := "玩家 %s\n" + formatedStr := "玩家 %s\n" +
picMsg.ToCQString() +
"区域 %s\n" + "区域 %s\n" +
"PP %.1f\n" + "PP %.1f\n" +
"全球排名 %d\n" + "全球排名 %d\n" +
@ -263,7 +284,23 @@ func (p PlayerDataLite) ToString() string {
} }
func (p PlayerData) LastDiffToString(lastDayQueryData PlayerDataLite) string { func (p PlayerData) LastDiffToString(lastDayQueryData PlayerDataLite) string {
err := util.DownloadFile(p.ProfilePicture, util.GenTempFilePath(p.ID+".jpg"))
if err != nil {
log.Default().Printf("下载头像失败url:%s,err:%v", p.ProfilePicture, err)
}
defer os.Remove(util.GenTempFilePath(p.ID + ".jpg"))
outFile, err := util.ResizeImageByMaxHeight(util.GenTempFilePath(p.ID+".jpg"), 20)
if err != nil {
log.Default().Printf("缩放头像失败url:%s,err:%v", p.ProfilePicture, err)
}
picMsg := message.ImageMessage{
Type: message.TypeImage,
Data: message.ImageMessageData{
File: outFile,
},
}
formatedStr := "玩家 %s\n" + formatedStr := "玩家 %s\n" +
picMsg.ToCQString() +
"区域 %s\n" + "区域 %s\n" +
"PP %.1f(%+.1f)\n" + "PP %.1f(%+.1f)\n" +
"全球排名 %d(%+d)\n" + "全球排名 %d(%+d)\n" +

View File

@ -4,7 +4,6 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "io"
"log"
"net/http" "net/http"
"strings" "strings"
) )
@ -23,7 +22,6 @@ func GetSongIdsByHash(hashs []string) (hashToSongId map[string]string, err error
} }
batchHashs := hashs[i:end] batchHashs := hashs[i:end]
queryUrl := "https://api.beatsaver.com/maps/hash/" + strings.Join(batchHashs, ",") queryUrl := "https://api.beatsaver.com/maps/hash/" + strings.Join(batchHashs, ",")
log.Default().Printf("获取歌曲IDurl:%s", queryUrl)
resp, err := http.Get(queryUrl) resp, err := http.Get(queryUrl)
if err != nil { if err != nil {
return nil, err return nil, err