feat: 添加查bl图命令以获取最新分数截图,并优化头像处理逻辑,使用新的图片缩放方法

This commit is contained in:
lixiangwuxian
2025-05-10 14:33:53 +08:00
parent aa9994de17
commit 74b92f675b
7 changed files with 217 additions and 14 deletions

View File

@@ -2,11 +2,16 @@ package beatleader
import (
"fmt"
"image"
"image/color"
"image/draw"
"log"
"os"
"strings"
"time"
"git.lxtend.com/lixiangwuxian/imagedd/font2img"
"git.lxtend.com/lixiangwuxian/imagedd/sprite"
"git.lxtend.com/qqbot/message"
"git.lxtend.com/qqbot/util"
)
@@ -415,7 +420,7 @@ func (p PlayerData) ToString() string {
log.Default().Printf("下载头像失败url:%s,err:%v", p.Avatar, err)
}
defer os.Remove(filePath)
outFile, err := util.ResizeImageByMaxHeight(filePath, 20)
outFile, err := util.ResizeImageByMaxHeight2File(filePath, 20)
if err != nil {
log.Default().Printf("缩放头像失败url:%s,err:%v", p.Avatar, err)
}
@@ -453,7 +458,7 @@ func (p PlayerDataLite) LastDiffToString(lastDayQueryData PlayerDataLite) string
log.Default().Printf("下载头像失败url:%s,err:%v", p.Avatar, err)
}
defer os.Remove(filePath)
outFile, err := util.ResizeImageByMaxHeight(filePath, 20)
outFile, err := util.ResizeImageByMaxHeight2File(filePath, 20)
if err != nil {
log.Default().Printf("缩放头像失败url:%s,err:%v", p.Avatar, err)
}
@@ -519,6 +524,113 @@ func (p PlayerDataLite) LastDiffToString(lastDayQueryData PlayerDataLite) string
return sb.String()
}
func (p PlayerDataLite) LastDiffToImage(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)
}
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,
// },
// }
baseboard := sprite.NewNamedSpriteBoard()
background := image.NewRGBA(image.Rect(0, 0, 500, 1000))
draw.Draw(background, background.Bounds(), image.White, image.Point{}, draw.Src)
backgroundSpirit := sprite.Sprite{
Name: "background",
Image: background,
Index: 0,
}
baseboard.AddSprite(&backgroundSpirit)
avatar, err := util.ResizeImageByMaxHeight2Image(filePath, 20)
if err != nil {
log.Default().Printf("缩放头像失败url:%s,err:%v", p.Avatar, err)
}
avatarSpirit := sprite.Sprite{
Name: "avatar",
Image: avatar,
Index: 1,
}
baseboard.AddSprite(&avatarSpirit)
var sb strings.Builder
sb.WriteString(fmt.Sprintf("玩家 %s\n", p.Name))
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))
text := sb.String()
textImg, err := font2img.RenderTextToTrimmedImage(nil, text, 12, color.Black, 0, 0)
if err != nil {
log.Default().Printf("渲染文字失败err:%v", err)
}
textSpirit := sprite.Sprite{
Name: "text",
Image: textImg,
Index: 2,
Position: image.Point{X: 23, Y: 23},
}
baseboard.AddSprite(&textSpirit)
if err := baseboard.SaveToPng(util.GenTempFilePath("cbl.png")); err != nil {
log.Default().Printf("保存图片失败err:%v", err)
}
return util.GenTempFilePath("cbl.png")
}
func GetControllerStr(controller int) string {
switch controller {
case 1:

View File

@@ -229,7 +229,7 @@ func (p PlayerData) ToString() string {
log.Default().Printf("下载头像失败url:%s,err:%v", p.ProfilePicture, err)
}
defer os.Remove(filePath)
outFile, err := util.ResizeImageByMaxHeight(filePath, 20)
outFile, err := util.ResizeImageByMaxHeight2File(filePath, 20)
if err != nil {
log.Default().Printf("缩放头像失败url:%s,err:%v", p.ProfilePicture, err)
}
@@ -289,7 +289,7 @@ func (p PlayerData) LastDiffToString(lastDayQueryData PlayerDataLite) string {
log.Default().Printf("下载头像失败url:%s,err:%v", p.ProfilePicture, err)
}
defer os.Remove(filePath)
outFile, err := util.ResizeImageByMaxHeight(filePath, 20)
outFile, err := util.ResizeImageByMaxHeight2File(filePath, 20)
if err != nil {
log.Default().Printf("缩放头像失败url:%s,err:%v", p.ProfilePicture, err)
}