From d4b8e7c11f2836398f73d4581b2c9536131060f9 Mon Sep 17 00:00:00 2001 From: lixiangwuxian Date: Thu, 17 Oct 2024 01:51:00 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84ss=E8=BE=93?= =?UTF-8?q?=E5=87=BA=EF=BC=8C=E9=87=8D=E6=9E=84url=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- action/send_msg.go | 1 - handler/beatleader/beatleader.go | 141 ++++++++++++++++++++++++++++-- handler/scoresaber/score.go | 34 +++++-- handler/urlparser/url.go | 2 + register.go | 1 + service/scoresaber/bind_ss.go | 27 +++--- service/scoresaber/gen_picture.go | 2 +- service/scoresaber/get_ssid.go | 2 +- service/scoresaber/model.go | 109 ++++++++++++----------- 9 files changed, 241 insertions(+), 78 deletions(-) delete mode 100644 action/send_msg.go diff --git a/action/send_msg.go b/action/send_msg.go deleted file mode 100644 index 5e1133f..0000000 --- a/action/send_msg.go +++ /dev/null @@ -1 +0,0 @@ -package action diff --git a/handler/beatleader/beatleader.go b/handler/beatleader/beatleader.go index 562837e..2e4aca8 100644 --- a/handler/beatleader/beatleader.go +++ b/handler/beatleader/beatleader.go @@ -1,25 +1,150 @@ package beatleader import ( + "log" + "strconv" + "git.lxtend.com/qqbot/handler" "git.lxtend.com/qqbot/model" + "git.lxtend.com/qqbot/service/beatleader" ) func init() { handler.RegisterHandler("查bl", getMyBL) - // handler.RegisterHandler("绑定bl", bindBL) - // handler.RegisterHandler("解绑bl", unbindSS) - // handler.RegisterHandler("最新bl", getMyRecentScore) - // handler.RegisterHandler("最热bl", getRecentScore) + handler.RegisterHandler("绑定bl", bindBL) + handler.RegisterHandler("解绑bl", unbindBL) + handler.RegisterHandler("最新bl", getMyRecentScore) + handler.RegisterHandler("最热bl", getRecentScore) + handler.RegisterHandler("截图bl", screenShotBL) } func getMyBL(msg model.Message) (reply model.Reply) { - if len(msg.Msg) <= len("查bl ") { - return model.Reply{} + var ( + resultStr string + err error + maxRetries = 3 // 最大重试次数 + attempts = 0 + ) + + userIdStr := strconv.Itoa(int(msg.UserId)) + for attempts < maxRetries { + resultStr, err = beatleader.BLQuery.GetScore(userIdStr) + if err == nil { + break // 成功时退出循环 + } + attempts++ + log.Printf("获取分数时出错,第 %d 次重试: %v", attempts, err) } - bindResult := "" + + // 如果所有尝试都失败,返回适当的错误消息 + if err != nil { + resultStr = "获取您的分数时出现问题,请稍后重试。" + } + return model.Reply{ - ReplyMsg: bindResult, + ReplyMsg: resultStr, + ReferOriginMsg: true, + FromMsg: msg, + } +} +func bindBL(msg model.Message) (reply model.Reply) { + if len(msg.RawMsg) <= len("绑定bl ") { + return model.Reply{ + ReplyMsg: "请输入绑定的beatleader账号", + ReferOriginMsg: true, + FromMsg: msg, + } + } + return model.Reply{ + ReplyMsg: beatleader.BLQuery.BindBL(strconv.Itoa(int(msg.UserId)), msg.RawMsg[len("绑定bl "):]), + ReferOriginMsg: true, + FromMsg: msg, + } +} + +func unbindBL(msg model.Message) (reply model.Reply) { + return model.Reply{ + ReplyMsg: beatleader.BLQuery.UnbindBL(strconv.Itoa(int(msg.UserId))), + ReferOriginMsg: true, + FromMsg: msg, + } +} + +func getRecentScore(msg model.Message) (reply model.Reply) { + count := 1 + if len(msg.RawMsg) > len("最热bl ") { + var err error + count, err = strconv.Atoi(msg.RawMsg[len("最热bl "):]) + if err != nil || count <= 0 { + return model.Reply{ + ReplyMsg: "", + ReferOriginMsg: true, + FromMsg: msg, + } + } + } + scoreMsg := "" + for _, v := range beatleader.BlScoresManager.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 := "" + if len(msg.RawMsg) > len("最新bl ") { + var err error + count, err = strconv.Atoi(msg.RawMsg[len("最新bl "):]) + if err != nil || count <= 0 { + return model.Reply{ + ReplyMsg: "", + ReferOriginMsg: true, + FromMsg: msg, + } + } + } + var userName string + recordCount := 0 + records, err := beatleader.BLQuery.GetRecentScores(count, strconv.Itoa(int(msg.UserId))) + if err != nil { + return model.Reply{ + ReplyMsg: err.Error(), + ReferOriginMsg: true, + FromMsg: msg, + } + } + for _, v := range records { + scoreMsg += v.ToString() + "\n\n" + userName = v.Name + recordCount++ + } + if len(scoreMsg) > 0 { + scoreMsg = scoreMsg[:len(scoreMsg)-len("\n\n")] //去掉最后一个换行符 + } else { + return model.Reply{ + ReplyMsg: "无最近游戏记录", + ReferOriginMsg: true, + FromMsg: msg, + } + } + return model.Reply{ + ReplyMsg: "玩家 " + userName + " 的" + strconv.Itoa(recordCount) + "条最近记录为:\n" + scoreMsg, + ReferOriginMsg: true, + FromMsg: msg, + } +} + +func screenShotBL(msg model.Message) (reply model.Reply) { + return model.Reply{ + ReplyMsg: "[CQ:image,file=file:///root/qqbot/tmp/" + beatleader.GetBLPicture(strconv.Itoa(int(msg.UserId))) + "]", ReferOriginMsg: true, FromMsg: msg, } diff --git a/handler/scoresaber/score.go b/handler/scoresaber/score.go index 5b0930d..7beefc2 100644 --- a/handler/scoresaber/score.go +++ b/handler/scoresaber/score.go @@ -3,6 +3,7 @@ package scoresaber import ( "log" "strconv" + "strings" "git.lxtend.com/qqbot/handler" "git.lxtend.com/qqbot/model" @@ -10,7 +11,7 @@ import ( ) func init() { - handler.RegisterHandler("查ss", getMySS) + handler.RegisterHandler("查ss", getSSProfile) handler.RegisterHelpInform("查ss", "查看您的最新分数") handler.RegisterHandler("绑定ss", bindSS) handler.RegisterHelpInform("绑定ss", "绑定您的scoresaber账号") @@ -25,17 +26,40 @@ func init() { handler.RegisterHelpInform("截ss/jss", "scoresaber主页截图") } -func getMySS(msg model.Message) (reply model.Reply) { +func getSSProfile(msg model.Message) (reply model.Reply) { var ( resultStr string err error - maxRetries = 3 // 最大重试次数 + maxRetries = 5 // 最大重试次数 attempts = 0 + noUpdate = false ) + var ssId string + if len(msg.RawMsg) > len("查ss ") { + // ssId = msg.RawMsg[len("查ss "):] + ssId = strings.Split(msg.RawMsg, " ")[1] + noUpdate = true + } userIdStr := strconv.Itoa(int(msg.UserId)) for attempts < maxRetries { - resultStr, err = scoresaber.SSQuery.GetScore(userIdStr) + err = nil + if ssId == "" { + ssId, err = scoresaber.GetSSID(userIdStr) + } + if err != nil { + // return "您未绑定ss账号,输入\"绑定ss [ssId]\"绑定", nil + return model.Reply{ + ReplyMsg: "您未绑定ss账号,输入\"绑定ss [ssId]\"绑定", + ReferOriginMsg: true, + FromMsg: msg, + } + } + if !noUpdate { + resultStr, err = scoresaber.SSQuery.GetScore(ssId) + } else { + resultStr, err = scoresaber.SSQuery.GetScoreWithoutUpdate(ssId) + } if err == nil { break // 成功时退出循环 } @@ -45,7 +69,7 @@ func getMySS(msg model.Message) (reply model.Reply) { // 如果所有尝试都失败,返回适当的错误消息 if err != nil { - resultStr = "获取您的分数时出现问题,请稍后重试。" + resultStr = "获取您的分数时出现问题,请稍后重试。" + err.Error() } return model.Reply{ diff --git a/handler/urlparser/url.go b/handler/urlparser/url.go index 646312e..d6c646a 100644 --- a/handler/urlparser/url.go +++ b/handler/urlparser/url.go @@ -85,6 +85,8 @@ func extractQQDocURL(input string) (string, error) { if err != nil { return "", fmt.Errorf("解析 JSON 失败: %w", err) } + url, _ = resolveFinalURL(url) + url, _ = removeTrackingParams(url) return url, nil } diff --git a/register.go b/register.go index b0ed8e1..e1f053f 100644 --- a/register.go +++ b/register.go @@ -1,6 +1,7 @@ package main import ( + // _ "git.lxtend.com/qqbot/handler/beatleader" _ "git.lxtend.com/qqbot/handler/echo" _ "git.lxtend.com/qqbot/handler/getweb" _ "git.lxtend.com/qqbot/handler/headmaster" diff --git a/service/scoresaber/bind_ss.go b/service/scoresaber/bind_ss.go index 7694ac7..b4f4d34 100644 --- a/service/scoresaber/bind_ss.go +++ b/service/scoresaber/bind_ss.go @@ -51,6 +51,7 @@ func init() { weight REAL, modifiers VARCHAR(255), multiplier REAL, + rank INT, bad_cuts INT, missed_notes INT, max_combo INT, @@ -129,7 +130,7 @@ func (ss *ssQuery) UnbindSS(qqId string) (reply string) { return "解绑成功,重新绑定请输入\"绑定ss [ssId]\"" } -func (ss *ssQuery) GetScore(qqId string) (reply string, err error) { +func (ss *ssQuery) GetScore(ssId string) (reply string, err error) { db := sqlite3.GetDB() // 假设 sqlite3.GetDB() 返回 *sqlx.DB tx, err := db.Beginx() if err != nil { @@ -138,17 +139,10 @@ func (ss *ssQuery) GetScore(qqId string) (reply string, err error) { } defer tx.Rollback() - // 检查是否已绑定 - var ssId string - err = tx.Get(&ssId, "SELECT ssid FROM ssBind WHERE qqid = ?", qqId) - if err != nil { - return "您未绑定ss账号,输入\"绑定ss [ssId]\"绑定", nil - } - // 查询玩家数据 - data, _ := FetchPlayerData(ssId) + data, err := FetchPlayerData(ssId) if data == nil { - return "查询出错,服务器返回了空数据", errors.New("查询出错,服务器返回了空数据") + return "查询出错,报错如下" + err.Error(), errors.New("查询出错,报错如下" + err.Error()) } // 构建 PlayerDataLite 结构体 @@ -209,6 +203,16 @@ func (ss *ssQuery) GetScore(qqId string) (reply string, err error) { return data.ToString(), nil } +func (ss *ssQuery) GetScoreWithoutUpdate(ssId string) (reply string, err error) { + // 查询玩家数据 + data, err := FetchPlayerData(ssId) + if data == nil { + return "查询出错,报错如下" + err.Error(), errors.New("查询出错,报错如下" + err.Error()) + } + // 返回当前数据的字符串表示 + return data.ToString(), nil +} + func (ss *ssQuery) SaveRecord(cmdData CommandData) { db := sqlite3.GetDB() // 假设 sqlite3.GetDB() 返回 *sqlx.DB tx, err := db.Beginx() @@ -235,6 +239,7 @@ func (ss *ssQuery) SaveRecord(cmdData CommandData) { Weight: cmdData.Score.Weight, Modifiers: cmdData.Score.Modifiers, Multiplier: cmdData.Score.Multiplier, + Rank: cmdData.Score.Rank, BadCuts: cmdData.Score.BadCuts, Score: cmdData.Score.ModifiedScore, MaxScore: cmdData.Leaderboard.MaxScore, @@ -291,7 +296,7 @@ func (ss *ssQuery) GetRecentScores(count int, qqId string) ([]RecordDataLite, er } defer tx.Rollback() - ssId, err := getSSID(qqId) + ssId, err := GetSSID(qqId) if err != nil { return nil, err } diff --git a/service/scoresaber/gen_picture.go b/service/scoresaber/gen_picture.go index 137d8b7..6e6d53a 100644 --- a/service/scoresaber/gen_picture.go +++ b/service/scoresaber/gen_picture.go @@ -7,7 +7,7 @@ import ( ) func GetSSPicture(qqId string) (outputImgName string) { - ssId, err := getSSID(qqId) + ssId, err := GetSSID(qqId) if err != nil { return "" } diff --git a/service/scoresaber/get_ssid.go b/service/scoresaber/get_ssid.go index e9cf7fd..8d6cc89 100644 --- a/service/scoresaber/get_ssid.go +++ b/service/scoresaber/get_ssid.go @@ -8,7 +8,7 @@ import ( "git.lxtend.com/qqbot/sqlite3" ) -func getSSID(qqId string) (ssId string, err error) { +func GetSSID(qqId string) (ssId string, err error) { db := sqlite3.GetDB() // 假设 sqlite3.GetDB() 返回 *sqlx.DB if err != nil { diff --git a/service/scoresaber/model.go b/service/scoresaber/model.go index ed3f966..c28d0db 100644 --- a/service/scoresaber/model.go +++ b/service/scoresaber/model.go @@ -16,31 +16,34 @@ func (c Command) ToString() string { if c.CommandName != "score" { return "" } - strWithRank := "玩家 %s 使用 %s 在 %s 的 %s 难度(%.1f🌟)中获得了 %d 分,排名第 %d,pp 为 %.2f。" - strWithoutRank := "玩家 %s 使用 %s 在 %s 的 %s 难度中获得了 %d 分,排名第 %d。" - strWithOutDevice := "玩家 %s 在 %s 的 %s 难度(%.1f🌟)中获得了 %d 分,排名第 %d,pp 为 %.2f。" - strWithOutDeviceAndRank := "玩家 %s 在 %s 的 %s 难度(%.1f🌟)中获得了 %d 分。" + strWithRank := "%s 使用 %s 在 %s 的 %s 难度(%.1f🌟)中取得了排名第%d的成绩,pp 为%.2f。" + strWithoutRank := "%s 使用 %s 在 %s 的 %s 难度中取得了排名第%d的成绩。" + strWithOutDevice := "%s 在 %s 的 %s 难度(%.1f🌟)中取得了排名第%d的成绩,pp 为%.2f。" + strWithOutDeviceAndRank := "%s 在 %s 的 %s 难度(%.1f🌟)中取得了排名第%d的成绩。" hardStr := strings.Split(c.CommandData.Leaderboard.Difficulty.DifficultyRaw, "_")[1] if c.CommandData.Leaderboard.Ranked && c.CommandData.Score.DeviceHmd != nil { - return fmt.Sprintf(strWithRank, c.CommandData.Score.LeaderboardPlayerInfo.Name, *c.CommandData.Score.DeviceHmd, c.CommandData.Leaderboard.SongName, hardStr, c.CommandData.Leaderboard.Stars, c.CommandData.Score.ModifiedScore, c.CommandData.Score.Rank, c.CommandData.Score.Pp) + return fmt.Sprintf(strWithRank, c.CommandData.Score.LeaderboardPlayerInfo.Name, *c.CommandData.Score.DeviceHmd, c.CommandData.Leaderboard.SongName, hardStr, c.CommandData.Leaderboard.Stars, c.CommandData.Score.Rank, c.CommandData.Score.Pp) } else if !c.CommandData.Leaderboard.Ranked && c.CommandData.Score.DeviceHmd != nil { - return fmt.Sprintf(strWithoutRank, c.CommandData.Score.LeaderboardPlayerInfo.Name, *c.CommandData.Score.DeviceHmd, c.CommandData.Leaderboard.SongName, hardStr, c.CommandData.Score.ModifiedScore, c.CommandData.Score.Rank) + return fmt.Sprintf(strWithoutRank, c.CommandData.Score.LeaderboardPlayerInfo.Name, *c.CommandData.Score.DeviceHmd, c.CommandData.Leaderboard.SongName, hardStr, c.CommandData.Score.Rank) } else if c.CommandData.Leaderboard.Ranked && c.CommandData.Score.DeviceHmd == nil { - return fmt.Sprintf(strWithOutDevice, c.CommandData.Score.LeaderboardPlayerInfo.Name, c.CommandData.Leaderboard.SongName, hardStr, c.CommandData.Leaderboard.Stars, c.CommandData.Score.ModifiedScore, c.CommandData.Score.Rank, c.CommandData.Score.Pp) + return fmt.Sprintf(strWithOutDevice, c.CommandData.Score.LeaderboardPlayerInfo.Name, c.CommandData.Leaderboard.SongName, hardStr, c.CommandData.Leaderboard.Stars, c.CommandData.Score.Rank, c.CommandData.Score.Pp) } else { - return fmt.Sprintf(strWithOutDeviceAndRank, c.CommandData.Score.LeaderboardPlayerInfo.Name, c.CommandData.Leaderboard.SongName, hardStr, c.CommandData.Leaderboard.Stars, c.CommandData.Score.ModifiedScore) + return fmt.Sprintf(strWithOutDeviceAndRank, c.CommandData.Score.LeaderboardPlayerInfo.Name, c.CommandData.Leaderboard.SongName, hardStr, c.CommandData.Leaderboard.Stars, c.CommandData.Score.Rank) } } +// type Badge struct { +// Description string `json:"description"` +// Image string `json:"image"` +// } + // LeaderboardPlayerInfo 表示玩家的信息 type LeaderboardPlayerInfo struct { - ID string `json:"id"` - Name string `json:"name"` - ProfilePicture string `json:"profilePicture"` - Country string `json:"country"` - Permissions int `json:"permissions"` - Badges *string `json:"badges"` - Role *string `json:"role"` + ID string `json:"id"` + Name string `json:"name"` + ProfilePicture string `json:"profilePicture"` + Country string `json:"country"` + Permissions int `json:"permissions"` } // Score 表示分数的信息 @@ -125,6 +128,7 @@ type RecordDataLite struct { Weight float64 `json:"weight" db:"weight"` Modifiers string `json:"modifiers" db:"modifiers"` Multiplier float64 `json:"multiplier" db:"multiplier"` + Rank int `json:"rank" db:"rank"` BadCuts int `json:"badCuts" db:"bad_cuts"` MissedNotes int `json:"missedNotes" db:"missed_notes"` MaxCombo int `json:"maxCombo" db:"max_combo"` @@ -138,23 +142,23 @@ type RecordDataLite struct { } func (r RecordDataLite) ToString() string { - formatedStrRanked := "%s,%s 使用 %s 在 %s 的 %s 难度(%.1f🌟)中获得了 %d 分,pp 为 %.2f,准度为 %s。" - formatedStrUnranked := "%s, %s 使用 %s 在 %s 的 %s 难度中获得了 %d 分,准度为 %s。" - formatedStrWithoutDevice := "%s, %s 在 %s 的 %s 难度(%.1f🌟)中获得了 %d 分,pp 为 %.2f,准度为 %s。" - formatedStrWithoutDeviceAndRank := "%s, %s 在 %s 的 %s 难度中获得了 %d 分,准度为 %s。" + formatedStrRanked := "%s,%s 使用 %s 在 %s 的 %s 难度(%.1f🌟)中打到了全球排名第%d,pp 为 %.2f,准度为 %s。" + formatedStrUnranked := "%s, %s 使用 %s 在 %s 的 %s 难度中打到了全球排名第%d,准度为 %s。" + formatedStrWithoutDevice := "%s, %s 在 %s 的 %s 难度(%.1f🌟)中打到了全球排名第%d,pp 为 %.2f,准度为 %s。" + formatedStrWithoutDeviceAndRank := "%s, %s 在 %s 的 %s 难度中打到了全球排名第%d,准度为 %s。" hardStr := strings.Split(r.DifficultyRaw, "_")[1] layout := "2006-01-02 15:04:05.999999999-07:00" parsedTime, _ := time.Parse(layout, r.GeneratedTime) duration := time.Since(parsedTime) timeStr := timeConvert(duration) if r.Stars == 0 && r.DeviceHmd != "" { - return fmt.Sprintf(formatedStrUnranked, timeStr, r.Name, r.DeviceHmd, r.SongName, hardStr, r.Score, fmt.Sprintf("%.2f%%", float64(r.Score)/float64(r.MaxScore)*100)) + return fmt.Sprintf(formatedStrUnranked, timeStr, r.Name, r.DeviceHmd, r.SongName, hardStr, r.Rank, fmt.Sprintf("%.2f%%", float64(r.Score)/float64(r.MaxScore)*100)) } else if r.Stars != 0 && r.DeviceHmd != "" { - return fmt.Sprintf(formatedStrRanked, timeStr, r.Name, r.DeviceHmd, r.SongName, hardStr, r.Stars, r.Score, r.PP, fmt.Sprintf("%.2f%%", float64(r.Score)/float64(r.MaxScore)*100)) + return fmt.Sprintf(formatedStrRanked, timeStr, r.Name, r.DeviceHmd, r.SongName, hardStr, r.Stars, r.Rank, r.PP, fmt.Sprintf("%.2f%%", float64(r.Score)/float64(r.MaxScore)*100)) } else if r.Stars != 0 && r.DeviceHmd == "" { - return fmt.Sprintf(formatedStrWithoutDevice, timeStr, r.Name, r.SongName, hardStr, r.Stars, r.Score, r.PP, fmt.Sprintf("%.2f%%", float64(r.Score)/float64(r.MaxScore)*100)) + return fmt.Sprintf(formatedStrWithoutDevice, timeStr, r.Name, r.SongName, hardStr, r.Stars, r.Rank, r.PP, fmt.Sprintf("%.2f%%", float64(r.Score)/float64(r.MaxScore)*100)) } else { - return fmt.Sprintf(formatedStrWithoutDeviceAndRank, timeStr, r.Name, r.SongName, hardStr, r.Score, fmt.Sprintf("%.2f%%", float64(r.Score)/float64(r.MaxScore)*100)) + return fmt.Sprintf(formatedStrWithoutDeviceAndRank, timeStr, r.Name, r.SongName, hardStr, r.Rank, fmt.Sprintf("%.2f%%", float64(r.Score)/float64(r.MaxScore)*100)) } } @@ -189,22 +193,22 @@ type ScoreStats struct { // PlayerData 存储玩家的完整信息 type PlayerData struct { - ID string `json:"id" db:"id"` - Name string `json:"name" db:"name"` - ProfilePicture string `json:"profilePicture" db:"profile_picture"` - Bio *string `json:"bio" db:"bio"` - Country string `json:"country" db:"country"` - PP float64 `json:"pp" db:"pp"` - Rank int `json:"rank" db:"rank"` - CountryRank int `json:"countryRank" db:"country_rank"` - Role *string `json:"role" db:"role"` - Badges []string `json:"badges" db:"badges"` - Histories string `json:"histories" db:"histories"` - Permissions int `json:"permissions" db:"permissions"` - Banned bool `json:"banned" db:"banned"` - Inactive bool `json:"inactive" db:"inactive"` - ScoreStats ScoreStats `json:"scoreStats" db:"score_stats"` - FirstSeen time.Time `json:"firstSeen" db:"first_seen"` + ID string `json:"id" db:"id"` + Name string `json:"name" db:"name"` + ProfilePicture string `json:"profilePicture" db:"profile_picture"` + Bio *string `json:"bio" db:"bio"` + Country string `json:"country" db:"country"` + PP float64 `json:"pp" db:"pp"` + Rank int `json:"rank" db:"rank"` + CountryRank int `json:"countryRank" db:"country_rank"` + Role *string `json:"role" db:"role"` + // Badges []string `json:"badges" db:"badges"` + Histories string `json:"histories" db:"histories"` + Permissions int `json:"permissions" db:"permissions"` + Banned bool `json:"banned" db:"banned"` + Inactive bool `json:"inactive" db:"inactive"` + ScoreStats ScoreStats `json:"scoreStats" db:"score_stats"` + FirstSeen time.Time `json:"firstSeen" db:"first_seen"` } type PlayerDataLite struct { @@ -230,13 +234,11 @@ func (p PlayerData) ToString() string { "PP %.1f\n" + "全球排名 %d\n" + "区域排名 %d\n" + - "总分 %d\n" + - "Ranked谱面总分 %d\n" + - "平均Ranked谱面准确率 %.2f\n" + + "Ranked谱面均准 %.2f%%\n" + "总游玩次数 %d\n" + "Ranked谱面游玩次数 %d\n" + "回放被观看次数 %d" - return fmt.Sprintf(formatedStr, p.Name, p.Country, p.PP, p.Rank, p.CountryRank, p.ScoreStats.TotalScore, p.ScoreStats.TotalRankedScore, p.ScoreStats.AverageRankedAccuracy, p.ScoreStats.TotalPlayCount, p.ScoreStats.RankedPlayCount, p.ScoreStats.ReplaysWatched) + return fmt.Sprintf(formatedStr, p.Name, p.Country, p.PP, p.Rank, p.CountryRank, p.ScoreStats.AverageRankedAccuracy, p.ScoreStats.TotalPlayCount, p.ScoreStats.RankedPlayCount, p.ScoreStats.ReplaysWatched) } func (p PlayerDataLite) ToString() string { @@ -245,13 +247,11 @@ func (p PlayerDataLite) ToString() string { "PP %.1f\n" + "全球排名 %d\n" + "区域排名 %d\n" + - "总分 %d\n" + - "Ranked谱面总分 %d\n" + - "平均Ranked谱面准确率 %.2f\n" + + "Ranked谱面均准 %.2f%%\n" + "总游玩次数 %d\n" + "Ranked谱面游玩次数 %d\n" + "回放被观看次数 %d" - return fmt.Sprintf(formatedStr, p.Name, p.Country, p.PP, p.Rank, p.CountryRank, p.TotalScore, p.TotalRankedScore, p.AverageRankedAccuracy, p.TotalPlayCount, p.RankedPlayCount, p.ReplaysWatched) + return fmt.Sprintf(formatedStr, p.Name, p.Country, p.PP, p.Rank, p.CountryRank, p.AverageRankedAccuracy, p.TotalPlayCount, p.RankedPlayCount, p.ReplaysWatched) } func (p PlayerData) LastDiffToString(lastDayQueryData PlayerDataLite) string { @@ -260,11 +260,18 @@ func (p PlayerData) LastDiffToString(lastDayQueryData PlayerDataLite) string { "PP %.1f(%+.1f)\n" + "全球排名 %d(%+d)\n" + "区域排名 %d(%+d)\n" + - "总分 %d(%+d)\n" + - "Ranked谱面总分 %d(%+d)\n" + - "平均Ranked谱面准确率 %.2f(%+.2f)\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.TotalScore, p.ScoreStats.TotalScore-lastDayQueryData.TotalScore, p.ScoreStats.TotalRankedScore, p.ScoreStats.TotalRankedScore-lastDayQueryData.TotalRankedScore, p.ScoreStats.AverageRankedAccuracy, p.ScoreStats.AverageRankedAccuracy-lastDayQueryData.AverageRankedAccuracy, p.ScoreStats.TotalPlayCount, p.ScoreStats.TotalPlayCount-lastDayQueryData.TotalPlayCount, p.ScoreStats.RankedPlayCount, p.ScoreStats.RankedPlayCount-lastDayQueryData.RankedPlayCount, p.ScoreStats.ReplaysWatched) + 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, p.ScoreStats.AverageRankedAccuracy-lastDayQueryData.AverageRankedAccuracy, + p.ScoreStats.TotalPlayCount, p.ScoreStats.TotalPlayCount-lastDayQueryData.TotalPlayCount, + p.ScoreStats.RankedPlayCount, p.ScoreStats.RankedPlayCount-lastDayQueryData.RankedPlayCount, + p.ScoreStats.ReplaysWatched) }