From a304841f1530b1c5835cdcaa3389cd280d15c78c Mon Sep 17 00:00:00 2001 From: lixiangwuxian Date: Sat, 10 May 2025 13:43:47 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BF=AE=E6=94=B9=20GetScore=20?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E4=BB=A5=E8=BF=94=E5=9B=9E=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E5=92=8C=E5=8E=86=E5=8F=B2=E7=8E=A9=E5=AE=B6=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=20getMyBL=20=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E7=BB=93=E6=9E=9C=E5=A4=84=E7=90=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handler/beatleader/beatleader.go | 9 +++- service/beatleader/bind_bl.go | 23 +++++----- service/beatleader/model.go | 78 +++++++++++++++++++++++--------- 3 files changed, 77 insertions(+), 33 deletions(-) diff --git a/handler/beatleader/beatleader.go b/handler/beatleader/beatleader.go index 98384c9..8fc57fa 100644 --- a/handler/beatleader/beatleader.go +++ b/handler/beatleader/beatleader.go @@ -174,8 +174,10 @@ func getMyBL(msg model.Message) (reply *model.Reply) { ) userIdStr := strconv.Itoa(int(msg.UserId)) + var data *beatleader.PlayerDataLite + var lastData *beatleader.PlayerDataLite for attempts < maxRetries { - resultStr, err = beatleader.BLQuery.GetScore(userIdStr) + data, lastData, err = beatleader.BLQuery.GetScore(userIdStr) if err == nil { break // 成功时退出循环 } @@ -187,6 +189,11 @@ func getMyBL(msg model.Message) (reply *model.Reply) { if err != nil { resultStr = "获取您的分数时出现问题,请稍后重试。" } + if lastData != nil { + resultStr = data.LastDiffToString(*lastData) + } else { + resultStr = data.ToString() + } return &model.Reply{ ReplyMsg: resultStr, diff --git a/service/beatleader/bind_bl.go b/service/beatleader/bind_bl.go index b0e5856..efa76ad 100644 --- a/service/beatleader/bind_bl.go +++ b/service/beatleader/bind_bl.go @@ -149,28 +149,28 @@ func (bl *blQuery) UnbindBL(qqId string) (reply string) { return "解绑成功,重新绑定请输入\"绑定bl [blId]\"" } -func (bl *blQuery) GetScore(qqId string) (reply string, err error) { +func (bl *blQuery) GetScore(qqId string) (currentData *PlayerDataLite, lastData *PlayerDataLite, err error) { db := sqlite3.GetDB() // 假设 sqlite3.GetDB() 返回 *sqlx.DB tx, err := db.Beginx() if err != nil { log.Print(err) - return "数据库连接失败,请稍后重试", err + return nil, nil, err } defer tx.Rollback() blId, err := getBLID(qqId) if err != nil { - return err.Error(), nil + return nil, nil, err } // 查询玩家数据 data, err := FetchPlayerData(blId) if data == nil && err == nil { - return "查询出错,服务器返回了空数据", errors.New("查询出错,服务器返回了空数据") + return nil, nil, errors.New("查询出错,服务器返回了空数据") } if err != nil { log.Print(err) - return "查询出错,服务器返回了空数据" + err.Error(), err + return nil, nil, err } // 构建 PlayerDataLite 结构体 @@ -178,6 +178,7 @@ func (bl *blQuery) GetScore(qqId string) (reply string, err error) { ID: data.ID, Name: data.Name, Country: data.Country, + Avatar: data.Avatar, PP: data.AccPp + data.PassPp + data.TechPp, Rank: data.Rank, CountryRank: data.CountryRank, @@ -195,7 +196,7 @@ func (bl *blQuery) GetScore(qqId string) (reply string, err error) { err = tx.Get(&lastDataLite, "SELECT * FROM blData WHERE id = ? ORDER BY generated_time DESC LIMIT 1", dataLite.ID) if err != nil && err != sql.ErrNoRows { log.Print(err) - return "查询历史数据时出错", err + return nil, nil, err } // 如果有新的数据,则插入 @@ -206,29 +207,29 @@ func (bl *blQuery) GetScore(qqId string) (reply string, err error) { :total_ranked_score, :average_ranked_accuracy, :total_play_count, :ranked_play_count, :replays_watched, :generated_time)`, dataLite) if err != nil { log.Print(err) - return "插入新数据时出错", err + return nil, nil, err } // 提交事务 err = tx.Commit() if err != nil { log.Print(err) - return "SQL事务提交失败,请重试", err + return nil, nil, err } // 返回差异信息 - return data.LastDiffToString(lastDataLite), nil + return &dataLite, &lastDataLite, nil } // 如果没有新数据,直接提交事务 err = tx.Commit() if err != nil { log.Print(err) - return "SQL事务提交失败,请重试", err + return nil, nil, err } // 返回当前数据的字符串表示 - return data.ToString(), nil + return &dataLite, nil, nil } func (bl *blQuery) SaveRecord(scoreData ScoreData) { diff --git a/service/beatleader/model.go b/service/beatleader/model.go index b9ce9b3..b86d98c 100644 --- a/service/beatleader/model.go +++ b/service/beatleader/model.go @@ -4,6 +4,7 @@ import ( "fmt" "log" "os" + "strings" "time" "git.lxtend.com/qqbot/message" @@ -384,6 +385,7 @@ type PlayerDataLite struct { ID string `json:"id" db:"id"` Name string `json:"name" db:"name"` Country string `json:"country" db:"country"` + Avatar string `json:"avatar" db:"avatar"` Device string `json:"device" db:"device"` PP float64 `json:"pp" db:"pp"` Rank int `json:"rank" db:"rank"` @@ -467,7 +469,7 @@ func (p PlayerDataLite) ToString() string { p.ReplaysWatched) } -func (p PlayerData) LastDiffToString(lastDayQueryData PlayerDataLite) string { +func (p PlayerDataLite) LastDiffToString(lastDayQueryData PlayerDataLite) string { filePath, err := util.DownloadFile(p.Avatar, "/tmp/qqbot", false) if err != nil { log.Default().Printf("下载头像失败,url:%s,err:%v", p.Avatar, err) @@ -483,26 +485,60 @@ func (p PlayerData) LastDiffToString(lastDayQueryData PlayerDataLite) string { File: outFile, }, } - formatedStr := "玩家 %s\n" + - picMsg.ToCQString() + - "区域 %s\n" + - "PP %.1f(%+.1f)\n" + - "全球排名 %d(%+d)\n" + - "区域排名 %d(%+d)\n" + - "Ranked谱面均准 %.2f%%(%+.2f%%)\n" + - "总游玩记数 %d(%+d)\n" + - "Ranked谱面游玩记数 %d(%+d)\n" + - "回放被观看次数 %d" - return fmt.Sprintf(formatedStr, - p.Name, - p.Country, - p.PP, p.PP-lastDayQueryData.PP, - p.Rank, lastDayQueryData.Rank-p.Rank, - p.CountryRank, lastDayQueryData.CountryRank-p.CountryRank, - p.ScoreStats.AverageRankedAccuracy*100, (p.ScoreStats.AverageRankedAccuracy-lastDayQueryData.AverageRankedAccuracy)*100, - p.ScoreStats.TotalPlayCount, p.ScoreStats.TotalPlayCount-lastDayQueryData.TotalPlayCount, - p.ScoreStats.RankedPlayCount, p.ScoreStats.RankedPlayCount-lastDayQueryData.RankedPlayCount, - p.ScoreStats.WatchedReplays) + + var sb strings.Builder + sb.WriteString(fmt.Sprintf("玩家 %s\n", p.Name)) + sb.WriteString(picMsg.ToCQString()) + sb.WriteString(fmt.Sprintf("区域 %s\n", p.Country)) + + // PP值 + ppDiff := p.PP - lastDayQueryData.PP + if ppDiff == 0 { + sb.WriteString(fmt.Sprintf("PP %.1f\n", p.PP)) + } else { + sb.WriteString(fmt.Sprintf("PP %.1f(%+.1f)\n", p.PP, ppDiff)) + } // 全球排名 + rankDiff := lastDayQueryData.Rank - p.Rank + if rankDiff == 0 { + sb.WriteString(fmt.Sprintf("全球排名 %d\n", p.Rank)) + } else { + sb.WriteString(fmt.Sprintf("全球排名 %d(%+d)\n", p.Rank, rankDiff)) + } + + // 区域排名 + countryRankDiff := lastDayQueryData.CountryRank - p.CountryRank + if countryRankDiff == 0 { + sb.WriteString(fmt.Sprintf("区域排名 %d\n", p.CountryRank)) + } else { + sb.WriteString(fmt.Sprintf("区域排名 %d(%+d)\n", p.CountryRank, countryRankDiff)) + } + + // Ranked谱面均准 + accDiff := (p.AverageRankedAccuracy - lastDayQueryData.AverageRankedAccuracy) * 100 + if accDiff == 0 { + sb.WriteString(fmt.Sprintf("Ranked谱面均准 %.2f%%\n", p.AverageRankedAccuracy*100)) + } else { + sb.WriteString(fmt.Sprintf("Ranked谱面均准 %.2f%%(%+.2f%%)\n", p.AverageRankedAccuracy*100, accDiff)) + } + // 总游玩记数 + totalPlayDiff := p.TotalPlayCount - lastDayQueryData.TotalPlayCount + if totalPlayDiff == 0 { + sb.WriteString(fmt.Sprintf("总游玩记数 %d\n", p.TotalPlayCount)) + } else { + sb.WriteString(fmt.Sprintf("总游玩记数 %d(%+d)\n", p.TotalPlayCount, totalPlayDiff)) + } + + // Ranked谱面游玩记数 + rankedPlayDiff := p.RankedPlayCount - lastDayQueryData.RankedPlayCount + if rankedPlayDiff == 0 { + sb.WriteString(fmt.Sprintf("Ranked谱面游玩记数 %d\n", p.RankedPlayCount)) + } else { + sb.WriteString(fmt.Sprintf("Ranked谱面游玩记数 %d(%+d)\n", p.RankedPlayCount, rankedPlayDiff)) + } + // 回放被观看次数 + sb.WriteString(fmt.Sprintf("回放被观看次数 %d", p.ReplaysWatched)) + + return sb.String() } func GetControllerStr(controller int) string {