refactor: 优化 getMySSPic 函数,支持从消息中提取用户ID并处理头像为 nil 的情况,同时调整数据获取逻辑以提升代码灵活性

This commit is contained in:
lixiangwuxian
2025-05-11 02:12:13 +08:00
parent f20edf3e78
commit 22f09b7097
7 changed files with 301 additions and 177 deletions

View File

@@ -174,22 +174,7 @@ func (bl *blQuery) GetScore(qqId string) (currentData *PlayerDataLite, lastData
}
// 构建 PlayerDataLite 结构体
dataLite := PlayerDataLite{
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,
TotalScore: data.ScoreStats.TotalScore,
TotalRankedScore: data.ScoreStats.TotalRankedScore,
AverageRankedAccuracy: data.ScoreStats.AverageRankedAccuracy,
TotalPlayCount: data.ScoreStats.TotalPlayCount,
RankedPlayCount: data.ScoreStats.RankedPlayCount,
ReplaysWatched: data.ScoreStats.WatchedReplays,
GeneratedTime: time.Now().Format("2006-01-02 15:04:05.999999999-07:00"),
}
dataLite := data.ToDataLite()
// 查询最近的玩家数据
var lastDataLite PlayerDataLite
@@ -232,6 +217,24 @@ func (bl *blQuery) GetScore(qqId string) (currentData *PlayerDataLite, lastData
return &dataLite, nil, nil
}
func (bl *blQuery) GetScoreWithoutUpdate(qqId string) (currentData *PlayerDataLite, err error) {
blId, err := getBLID(qqId)
if err != nil {
return nil, err
}
// 查询玩家数据
data, err := FetchPlayerData(blId)
if err != nil {
return nil, errors.New("查询出错,报错如下" + err.Error())
}
if data.ID == "" {
return nil, errors.New("未找到玩家,请检查ID后重试")
}
dataLite := data.ToDataLite()
// 返回当前数据的字符串表示
return &dataLite, nil
}
func (bl *blQuery) SaveRecord(scoreData ScoreData) {
db := sqlite3.GetDB() // 假设 sqlite3.GetDB() 返回 *sqlx.DB
tx, err := db.Beginx()

View File

@@ -289,6 +289,26 @@ type PlayerData struct {
// Clans []string `json:"clans"`
}
func (p PlayerData) ToDataLite() PlayerDataLite {
dataLite := PlayerDataLite{
ID: p.ID,
Name: p.Name,
Country: p.Country,
Avatar: p.Avatar,
PP: p.AccPp + p.PassPp + p.TechPp,
Rank: p.Rank,
CountryRank: p.CountryRank,
TotalScore: p.ScoreStats.TotalScore,
TotalRankedScore: p.ScoreStats.TotalRankedScore,
AverageRankedAccuracy: p.ScoreStats.AverageRankedAccuracy,
TotalPlayCount: p.ScoreStats.TotalPlayCount,
RankedPlayCount: p.ScoreStats.RankedPlayCount,
ReplaysWatched: p.ScoreStats.WatchedReplays,
GeneratedTime: time.Now().Format("2006-01-02 15:04:05.999999999-07:00"),
}
return dataLite
}
type LinkedIDs struct {
QuestID int `json:"questId"`
SteamID string `json:"steamId"`
@@ -413,46 +433,7 @@ func (p PlayerDataLite) IsDiffFrom(p2 PlayerDataLite) bool {
p.ReplaysWatched != p2.ReplaysWatched
}
func (p PlayerData) ToString() string {
filePath, err := util.DownloadFile(p.Avatar, "/tmp/qqbot", false)
if err != nil {
log.Default().Printf("下载头像失败url:%s,err:%v", p.Avatar, err)
}
defer os.Remove(filePath)
outFile, err := util.ResizeImageByMaxHeight2File(filePath, 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" +
"区域排名 %d\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.AverageRankedAccuracy*100,
p.ScoreStats.TotalPlayCount,
p.ScoreStats.RankedPlayCount,
p.ScoreStats.WatchedReplays)
}
func (p PlayerDataLite) LastDiffToString(lastDayQueryData PlayerDataLite) string {
func (p PlayerDataLite) LastDiffToString(lastQueryData PlayerDataLite) string {
filePath, err := util.DownloadFile(p.Avatar, "/tmp/qqbot", false)
if err != nil {
log.Default().Printf("下载头像失败url:%s,err:%v", p.Avatar, err)
@@ -475,13 +456,13 @@ func (p PlayerDataLite) LastDiffToString(lastDayQueryData PlayerDataLite) string
sb.WriteString(fmt.Sprintf("区域 %s\n", p.Country))
// PP值
ppDiff := p.PP - lastDayQueryData.PP
ppDiff := p.PP - lastQueryData.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
rankDiff := lastQueryData.Rank - p.Rank
if rankDiff == 0 {
sb.WriteString(fmt.Sprintf("全球排名 %d\n", p.Rank))
} else {
@@ -489,7 +470,7 @@ func (p PlayerDataLite) LastDiffToString(lastDayQueryData PlayerDataLite) string
}
// 区域排名
countryRankDiff := lastDayQueryData.CountryRank - p.CountryRank
countryRankDiff := lastQueryData.CountryRank - p.CountryRank
if countryRankDiff == 0 {
sb.WriteString(fmt.Sprintf("区域排名 %d\n", p.CountryRank))
} else {
@@ -497,14 +478,14 @@ func (p PlayerDataLite) LastDiffToString(lastDayQueryData PlayerDataLite) string
}
// Ranked谱面均准
accDiff := (p.AverageRankedAccuracy - lastDayQueryData.AverageRankedAccuracy) * 100
accDiff := (p.AverageRankedAccuracy - lastQueryData.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
totalPlayDiff := p.TotalPlayCount - lastQueryData.TotalPlayCount
if totalPlayDiff == 0 {
sb.WriteString(fmt.Sprintf("总游玩记数 %d\n", p.TotalPlayCount))
} else {
@@ -512,7 +493,7 @@ func (p PlayerDataLite) LastDiffToString(lastDayQueryData PlayerDataLite) string
}
// Ranked谱面游玩记数
rankedPlayDiff := p.RankedPlayCount - lastDayQueryData.RankedPlayCount
rankedPlayDiff := p.RankedPlayCount - lastQueryData.RankedPlayCount
if rankedPlayDiff == 0 {
sb.WriteString(fmt.Sprintf("Ranked谱面游玩记数 %d\n", p.RankedPlayCount))
} else {
@@ -524,7 +505,7 @@ func (p PlayerDataLite) LastDiffToString(lastDayQueryData PlayerDataLite) string
return sb.String()
}
func (p PlayerDataLite) LastDiffToImage(lastDayQueryData PlayerDataLite) string {
func (p PlayerDataLite) LastDiffToImage(lastQueryData PlayerDataLite) string {
filePath, err := util.DownloadFile(p.Avatar, "/tmp/qqbot", false)
if err != nil {
log.Default().Printf("下载头像失败url:%s,err:%v", p.Avatar, err)
@@ -550,54 +531,54 @@ func (p PlayerDataLite) LastDiffToImage(lastDayQueryData PlayerDataLite) string
var sb strings.Builder
sb.WriteString(fmt.Sprintf("玩家 %s\n", p.Name))
sb.WriteString(fmt.Sprintf("区域 %s\n", p.Country))
{
// PP值
ppDiff := p.PP - lastQueryData.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 := lastQueryData.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))
}
// 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 := lastQueryData.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))
}
// 区域排名
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 - lastQueryData.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 - lastQueryData.TotalPlayCount
if totalPlayDiff == 0 {
sb.WriteString(fmt.Sprintf("总游玩记数 %d\n", p.TotalPlayCount))
} else {
sb.WriteString(fmt.Sprintf("总游玩记数 %d(%+d)\n", p.TotalPlayCount, totalPlayDiff))
}
// 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))
// Ranked谱面游玩记数
rankedPlayDiff := p.RankedPlayCount - lastQueryData.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))
}
// 总游玩记数
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))
text := sb.String()
textImg, err := font2img.RenderTextToTrimmedImage(nil, text, 12, color.Black, 0, 0)
if err != nil {