refactor: 移除 ScoreSaber 和 BeatLeader 热门成绩相关代码,并为玩家信息添加头像显示
This commit is contained in:
parent
7d5b69685b
commit
2eb9716d24
@ -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 := ""
|
||||||
|
@ -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)
|
|
||||||
// }
|
|
@ -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" +
|
||||||
|
@ -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)
|
|
||||||
}
|
|
@ -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" +
|
||||||
|
@ -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("获取歌曲ID,url:%s", queryUrl)
|
|
||||||
resp, err := http.Get(queryUrl)
|
resp, err := http.Get(queryUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
Loading…
x
Reference in New Issue
Block a user