From 2eb9716d248395b9d2d4d9db56bba02dc09a8fd9 Mon Sep 17 00:00:00 2001 From: lixiangwuxian Date: Sun, 9 Mar 2025 00:24:44 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=20ScoreSaber=20?= =?UTF-8?q?=E5=92=8C=20BeatLeader=20=E7=83=AD=E9=97=A8=E6=88=90=E7=BB=A9?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=B9=B6=E4=B8=BA?= =?UTF-8?q?=E7=8E=A9=E5=AE=B6=E4=BF=A1=E6=81=AF=E6=B7=BB=E5=8A=A0=E5=A4=B4?= =?UTF-8?q?=E5=83=8F=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handler/scoresaber/score.go | 36 +-------------- service/beatleader/hot.go | 87 ----------------------------------- service/beatleader/model.go | 38 ++++++++++++++++ service/scoresaber/hot.go | 91 ------------------------------------- service/scoresaber/model.go | 37 +++++++++++++++ util/song_id.go | 2 - 6 files changed, 76 insertions(+), 215 deletions(-) delete mode 100644 service/beatleader/hot.go delete mode 100644 service/scoresaber/hot.go diff --git a/handler/scoresaber/score.go b/handler/scoresaber/score.go index ad15a76..0cd42e4 100644 --- a/handler/scoresaber/score.go +++ b/handler/scoresaber/score.go @@ -24,8 +24,6 @@ func init() { handler.RegisterHelpInform("解绑ss", "scoresaber", "解绑您的scoresaber账号") handler.RegisterHandler("最新ss", getMyRecentScore, constants.LEVEL_USER) handler.RegisterHelpInform("最新ss", "scoresaber", "查看您的最新游戏记录") - handler.RegisterHandler("最热ss", getRecentScore, constants.LEVEL_USER) - handler.RegisterHelpInform("最热ss", "scoresaber", "查看全大陆的最新游戏记录") handler.RegisterHandler("截ss", screenshotSS, constants.LEVEL_USER) handler.RegisterHelpInform("截ss", "scoresaber", "scoresaber主页截图") handler.RegisterHandler("jss", screenshotSS, constants.LEVEL_USER) @@ -41,7 +39,6 @@ func getSSProfile(msg model.Message) (reply model.Reply) { ) var ssId string if len(msg.RawMsg) > len("查ss ") { - // ssId = msg.RawMsg[len("查ss "):] ssId = strings.Split(msg.RawMsg, " ")[1] noUpdate = true } @@ -53,7 +50,6 @@ func getSSProfile(msg model.Message) (reply model.Reply) { ssId, err = scoresaber.GetSSID(userIdStr) } if err != nil { - // return "您未绑定ss账号,输入\"绑定ss [ssId]\"绑定", nil return model.Reply{ ReplyMsg: "您未绑定ss账号,输入\"绑定ss [ssId]\"绑定", ReferOriginMsg: true, @@ -66,7 +62,7 @@ func getSSProfile(msg model.Message) (reply model.Reply) { resultStr, err = scoresaber.SSQuery.GetScoreWithoutUpdate(ssId) } if err == nil { - break // 成功时退出循环 + break } attempts++ 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) { count := 1 scoreMsg := "" diff --git a/service/beatleader/hot.go b/service/beatleader/hot.go deleted file mode 100644 index 126ef3a..0000000 --- a/service/beatleader/hot.go +++ /dev/null @@ -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) -// } diff --git a/service/beatleader/model.go b/service/beatleader/model.go index 5889421..b89b8eb 100644 --- a/service/beatleader/model.go +++ b/service/beatleader/model.go @@ -2,7 +2,12 @@ package beatleader import ( "fmt" + "log" + "os" "time" + + "git.lxtend.com/qqbot/message" + "git.lxtend.com/qqbot/util" ) type ScoreData struct { @@ -402,7 +407,24 @@ func (p PlayerDataLite) IsDiffFrom(p2 PlayerDataLite) bool { } 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" + + picMsg.ToCQString() + "区域 %s\n" + "PP %.1f\n" + "全球排名 %d\n" + @@ -446,7 +468,23 @@ func (p PlayerDataLite) ToString() 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" + + picMsg.ToCQString() + "区域 %s\n" + "PP %.1f(%+.1f)\n" + "全球排名 %d(%+d)\n" + diff --git a/service/scoresaber/hot.go b/service/scoresaber/hot.go deleted file mode 100644 index 101efbe..0000000 --- a/service/scoresaber/hot.go +++ /dev/null @@ -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) -} diff --git a/service/scoresaber/model.go b/service/scoresaber/model.go index ed792c5..88f6f73 100644 --- a/service/scoresaber/model.go +++ b/service/scoresaber/model.go @@ -2,8 +2,13 @@ package scoresaber import ( "fmt" + "log" + "os" "strings" "time" + + "git.lxtend.com/qqbot/message" + "git.lxtend.com/qqbot/util" ) // Command 表示从 WebSocket 收到的数据结构 @@ -219,7 +224,23 @@ func (p PlayerDataLite) IsDiffFrom(p2 PlayerDataLite) bool { } 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" + + picMsg.ToCQString() + "区域 %s\n" + "PP %.1f\n" + "全球排名 %d\n" + @@ -263,7 +284,23 @@ func (p PlayerDataLite) ToString() 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" + + picMsg.ToCQString() + "区域 %s\n" + "PP %.1f(%+.1f)\n" + "全球排名 %d(%+d)\n" + diff --git a/util/song_id.go b/util/song_id.go index eb3a24f..a7f9e7b 100644 --- a/util/song_id.go +++ b/util/song_id.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" "io" - "log" "net/http" "strings" ) @@ -23,7 +22,6 @@ func GetSongIdsByHash(hashs []string) (hashToSongId map[string]string, err error } batchHashs := hashs[i:end] queryUrl := "https://api.beatsaver.com/maps/hash/" + strings.Join(batchHashs, ",") - log.Default().Printf("获取歌曲ID,url:%s", queryUrl) resp, err := http.Get(queryUrl) if err != nil { return nil, err