qq_bot/handler/beatleader/beatleader.go

235 lines
6.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package beatleader
import (
"log"
"os"
"strconv"
"sync"
"git.lxtend.com/qqbot/constants"
"git.lxtend.com/qqbot/handler"
"git.lxtend.com/qqbot/message"
"git.lxtend.com/qqbot/model"
"git.lxtend.com/qqbot/service/beatleader"
"git.lxtend.com/qqbot/util"
)
func init() {
handler.RegisterHandler("查bl", getMyBL, constants.LEVEL_USER)
handler.RegisterHelpInform("查bl", "beatleader", "查bl 查看您的最新分数")
handler.RegisterHandler("绑定bl", bindBL, constants.LEVEL_USER)
handler.RegisterHelpInform("绑定bl", "beatleader", "绑定bl 绑定您的beatleader账号")
handler.RegisterHandler("解绑bl", unbindBL, constants.LEVEL_USER)
handler.RegisterHelpInform("解绑bl", "beatleader", "解绑bl 解绑您的beatleader账号")
handler.RegisterHandler("最新bl", getMyRecentScore, constants.LEVEL_USER)
handler.RegisterHelpInform("最新bl", "beatleader", "最新bl 查看您的最新游戏记录")
// handler.RegisterHandler("最热bl", getRecentScore, constants.LEVEL_USER)
// handler.RegisterHelpInform("最热bl", "beatleader", "最热bl 查看全大陆的最新游戏记录")
handler.RegisterHandler("截bl", screenShotBL, constants.LEVEL_USER)
handler.RegisterHelpInform("截bl", "beatleader", "截bl 截bl 截bl主页截图")
handler.RegisterHandler("jbl", screenShotBL, constants.LEVEL_USER)
}
// func blPlus(msg model.Message) (reply model.Reply) {
// var (
// resultStr strings.Builder
// err error
// maxRetries = 5 // 最大重试次数
// attempts = 0
// )
// var N int
// if len(msg.RawMsg) > len("bl+") {
// N, err = strconv.Atoi(msg.RawMsg[len("bl+"):])
// if err != nil || N <= 0 {
// return model.Reply{
// ReplyMsg: "请输入一个正整数",
// ReferOriginMsg: true,
// FromMsg: msg,
// }
// }
// }
// userIdStr := strconv.Itoa(int(msg.UserId))
// userBLID, err := scoresaber.GetSSID(userIdStr)
// if err != nil {
// return model.Reply{
// ReplyMsg: err.Error(),
// ReferOriginMsg: true,
// FromMsg: msg,
// }
// }
// var userInfo beatleader.PlayerData
// for attempts < maxRetries {
// err = nil
// userInfo, err = beatleader.FetchPlayerData(userBLID)
// if err != nil {
// break
// }
// attempts++
// }
// if err != nil {
// return model.Reply{
// ReplyMsg: "获取您的分数时出现问题,请稍后重试。" + err.Error(),
// ReferOriginMsg: true,
// FromMsg: msg,
// }
// }
// resultStr.WriteString(fmt.Sprintf("您当前的全区排名为:%d\n", userInfo.CountryRank))
// // 获取当前用户所在区对应+N位的玩家列表
// leaderboard, err := beatleader.FetchCountryLeaderboard(userInfo.Country, userInfo.CountryRank-N, userInfo.ID)
// if err != nil {
// return model.Reply{
// ReplyMsg: "获取当前用户所在区对应+N位的玩家列表时出现问题请稍后重试。" + err.Error(),
// ReferOriginMsg: true,
// FromMsg: msg,
// }
// }
// resultStr.WriteString(fmt.Sprintf("您只需要再打出%.2fpp就能达到%s区第%d名。", targetPlayer.PP-userInfo.PP, userInfo.Country, targetPlayer.CountryRank))
// return model.Reply{
// ReplyMsg: resultStr.String(),
// ReferOriginMsg: true,
// FromMsg: msg,
// }
// }
func getMyBL(msg model.Message) (reply *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)
}
// 如果所有尝试都失败,返回适当的错误消息
if err != nil {
resultStr = "获取您的分数时出现问题,请稍后重试。"
}
return &model.Reply{
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 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,
}
}
if count > 10 {
count = 10
}
}
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,
}
}
// 单独线程下载封面图片
coverImageMap := make(map[string]string)
wg := sync.WaitGroup{}
for _, record := range records {
coverImageMap[record.SongHash] = record.CoverImage
wg.Add(1)
go func(songHash string) {
defer wg.Done()
filePath, err := util.DownloadFile(coverImageMap[songHash], "/tmp/qqbot", true)
if err != nil {
log.Printf("下载图片失败: %v", err)
return
}
newPath, err := util.ResizeImageByMaxHeight(filePath, 20)
os.Remove(filePath)
if err != nil {
log.Printf("缩放图片失败: %v", err)
}
coverImageMap[songHash] = newPath
}(record.SongHash)
}
wg.Wait()
for _, record := range records {
imageMsg := message.ImageMessage{
Type: "image",
Data: message.ImageMessageData{
File: util.GetResizedIamgePathByOrgPath(util.GenTempFilePath(record.SongHash + ".jpeg")),
},
}
scoreMsg += imageMsg.ToCQString() + record.ToString() + "\n"
userName = record.Name
recordCount++
}
if len(scoreMsg) > 0 {
scoreMsg = scoreMsg[:len(scoreMsg)-len("\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) {
imageMsg := message.ImageMessage{
Type: "image",
Data: message.ImageMessageData{
File: "file:///tmp/qqbot/" + beatleader.GetBLPicture(strconv.Itoa(int(msg.UserId))),
},
}
return &model.Reply{
ReplyMsg: imageMsg.ToCQString(),
ReferOriginMsg: true,
FromMsg: msg,
}
}