refactor: 修改 GetScore 函数以返回当前和历史玩家数据,优化 getMyBL 函数中的结果处理逻辑
This commit is contained in:
parent
9aa41d6d3f
commit
a304841f15
@ -174,8 +174,10 @@ func getMyBL(msg model.Message) (reply *model.Reply) {
|
|||||||
)
|
)
|
||||||
|
|
||||||
userIdStr := strconv.Itoa(int(msg.UserId))
|
userIdStr := strconv.Itoa(int(msg.UserId))
|
||||||
|
var data *beatleader.PlayerDataLite
|
||||||
|
var lastData *beatleader.PlayerDataLite
|
||||||
for attempts < maxRetries {
|
for attempts < maxRetries {
|
||||||
resultStr, err = beatleader.BLQuery.GetScore(userIdStr)
|
data, lastData, err = beatleader.BLQuery.GetScore(userIdStr)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
break // 成功时退出循环
|
break // 成功时退出循环
|
||||||
}
|
}
|
||||||
@ -187,6 +189,11 @@ func getMyBL(msg model.Message) (reply *model.Reply) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
resultStr = "获取您的分数时出现问题,请稍后重试。"
|
resultStr = "获取您的分数时出现问题,请稍后重试。"
|
||||||
}
|
}
|
||||||
|
if lastData != nil {
|
||||||
|
resultStr = data.LastDiffToString(*lastData)
|
||||||
|
} else {
|
||||||
|
resultStr = data.ToString()
|
||||||
|
}
|
||||||
|
|
||||||
return &model.Reply{
|
return &model.Reply{
|
||||||
ReplyMsg: resultStr,
|
ReplyMsg: resultStr,
|
||||||
|
@ -149,28 +149,28 @@ func (bl *blQuery) UnbindBL(qqId string) (reply string) {
|
|||||||
return "解绑成功,重新绑定请输入\"绑定bl [blId]\""
|
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
|
db := sqlite3.GetDB() // 假设 sqlite3.GetDB() 返回 *sqlx.DB
|
||||||
tx, err := db.Beginx()
|
tx, err := db.Beginx()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
return "数据库连接失败,请稍后重试", err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
defer tx.Rollback()
|
defer tx.Rollback()
|
||||||
|
|
||||||
blId, err := getBLID(qqId)
|
blId, err := getBLID(qqId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err.Error(), nil
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询玩家数据
|
// 查询玩家数据
|
||||||
data, err := FetchPlayerData(blId)
|
data, err := FetchPlayerData(blId)
|
||||||
if data == nil && err == nil {
|
if data == nil && err == nil {
|
||||||
return "查询出错,服务器返回了空数据", errors.New("查询出错,服务器返回了空数据")
|
return nil, nil, errors.New("查询出错,服务器返回了空数据")
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
return "查询出错,服务器返回了空数据" + err.Error(), err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 构建 PlayerDataLite 结构体
|
// 构建 PlayerDataLite 结构体
|
||||||
@ -178,6 +178,7 @@ func (bl *blQuery) GetScore(qqId string) (reply string, err error) {
|
|||||||
ID: data.ID,
|
ID: data.ID,
|
||||||
Name: data.Name,
|
Name: data.Name,
|
||||||
Country: data.Country,
|
Country: data.Country,
|
||||||
|
Avatar: data.Avatar,
|
||||||
PP: data.AccPp + data.PassPp + data.TechPp,
|
PP: data.AccPp + data.PassPp + data.TechPp,
|
||||||
Rank: data.Rank,
|
Rank: data.Rank,
|
||||||
CountryRank: data.CountryRank,
|
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)
|
err = tx.Get(&lastDataLite, "SELECT * FROM blData WHERE id = ? ORDER BY generated_time DESC LIMIT 1", dataLite.ID)
|
||||||
if err != nil && err != sql.ErrNoRows {
|
if err != nil && err != sql.ErrNoRows {
|
||||||
log.Print(err)
|
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)
|
:total_ranked_score, :average_ranked_accuracy, :total_play_count, :ranked_play_count, :replays_watched, :generated_time)`, dataLite)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
return "插入新数据时出错", err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 提交事务
|
// 提交事务
|
||||||
err = tx.Commit()
|
err = tx.Commit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
return "SQL事务提交失败,请重试", err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 返回差异信息
|
// 返回差异信息
|
||||||
return data.LastDiffToString(lastDataLite), nil
|
return &dataLite, &lastDataLite, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果没有新数据,直接提交事务
|
// 如果没有新数据,直接提交事务
|
||||||
err = tx.Commit()
|
err = tx.Commit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Print(err)
|
log.Print(err)
|
||||||
return "SQL事务提交失败,请重试", err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 返回当前数据的字符串表示
|
// 返回当前数据的字符串表示
|
||||||
return data.ToString(), nil
|
return &dataLite, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bl *blQuery) SaveRecord(scoreData ScoreData) {
|
func (bl *blQuery) SaveRecord(scoreData ScoreData) {
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.lxtend.com/qqbot/message"
|
"git.lxtend.com/qqbot/message"
|
||||||
@ -384,6 +385,7 @@ type PlayerDataLite struct {
|
|||||||
ID string `json:"id" db:"id"`
|
ID string `json:"id" db:"id"`
|
||||||
Name string `json:"name" db:"name"`
|
Name string `json:"name" db:"name"`
|
||||||
Country string `json:"country" db:"country"`
|
Country string `json:"country" db:"country"`
|
||||||
|
Avatar string `json:"avatar" db:"avatar"`
|
||||||
Device string `json:"device" db:"device"`
|
Device string `json:"device" db:"device"`
|
||||||
PP float64 `json:"pp" db:"pp"`
|
PP float64 `json:"pp" db:"pp"`
|
||||||
Rank int `json:"rank" db:"rank"`
|
Rank int `json:"rank" db:"rank"`
|
||||||
@ -467,7 +469,7 @@ func (p PlayerDataLite) ToString() string {
|
|||||||
p.ReplaysWatched)
|
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)
|
filePath, err := util.DownloadFile(p.Avatar, "/tmp/qqbot", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Default().Printf("下载头像失败,url:%s,err:%v", p.Avatar, err)
|
log.Default().Printf("下载头像失败,url:%s,err:%v", p.Avatar, err)
|
||||||
@ -483,26 +485,60 @@ func (p PlayerData) LastDiffToString(lastDayQueryData PlayerDataLite) string {
|
|||||||
File: outFile,
|
File: outFile,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
formatedStr := "玩家 %s\n" +
|
|
||||||
picMsg.ToCQString() +
|
var sb strings.Builder
|
||||||
"区域 %s\n" +
|
sb.WriteString(fmt.Sprintf("玩家 %s\n", p.Name))
|
||||||
"PP %.1f(%+.1f)\n" +
|
sb.WriteString(picMsg.ToCQString())
|
||||||
"全球排名 %d(%+d)\n" +
|
sb.WriteString(fmt.Sprintf("区域 %s\n", p.Country))
|
||||||
"区域排名 %d(%+d)\n" +
|
|
||||||
"Ranked谱面均准 %.2f%%(%+.2f%%)\n" +
|
// PP值
|
||||||
"总游玩记数 %d(%+d)\n" +
|
ppDiff := p.PP - lastDayQueryData.PP
|
||||||
"Ranked谱面游玩记数 %d(%+d)\n" +
|
if ppDiff == 0 {
|
||||||
"回放被观看次数 %d"
|
sb.WriteString(fmt.Sprintf("PP %.1f\n", p.PP))
|
||||||
return fmt.Sprintf(formatedStr,
|
} else {
|
||||||
p.Name,
|
sb.WriteString(fmt.Sprintf("PP %.1f(%+.1f)\n", p.PP, ppDiff))
|
||||||
p.Country,
|
} // 全球排名
|
||||||
p.PP, p.PP-lastDayQueryData.PP,
|
rankDiff := lastDayQueryData.Rank - p.Rank
|
||||||
p.Rank, lastDayQueryData.Rank-p.Rank,
|
if rankDiff == 0 {
|
||||||
p.CountryRank, lastDayQueryData.CountryRank-p.CountryRank,
|
sb.WriteString(fmt.Sprintf("全球排名 %d\n", p.Rank))
|
||||||
p.ScoreStats.AverageRankedAccuracy*100, (p.ScoreStats.AverageRankedAccuracy-lastDayQueryData.AverageRankedAccuracy)*100,
|
} else {
|
||||||
p.ScoreStats.TotalPlayCount, p.ScoreStats.TotalPlayCount-lastDayQueryData.TotalPlayCount,
|
sb.WriteString(fmt.Sprintf("全球排名 %d(%+d)\n", p.Rank, rankDiff))
|
||||||
p.ScoreStats.RankedPlayCount, p.ScoreStats.RankedPlayCount-lastDayQueryData.RankedPlayCount,
|
}
|
||||||
p.ScoreStats.WatchedReplays)
|
|
||||||
|
// 区域排名
|
||||||
|
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 {
|
func GetControllerStr(controller int) string {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user