From 95b319ad15c6eaf353b21f41137b658282bb6d31 Mon Sep 17 00:00:00 2001 From: lixiangwuxian Date: Sat, 19 Jul 2025 18:06:13 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=88=A0=E9=99=A4=20CreateSSData?= =?UTF-8?q?=20=E5=87=BD=E6=95=B0=E5=B9=B6=E6=9B=B4=E6=96=B0=20GetScore=20?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E4=BB=A5=E5=A4=84=E7=90=86=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E5=92=8C=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E5=90=8C=E6=97=B6=E4=BF=AE=E6=94=B9=20PlayerDataLite?= =?UTF-8?q?=20=E7=9A=84=E8=A1=A8=E5=90=8D=E4=B8=BA=20blRecordData?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- service/beatleader/bind_bl.go | 110 ++++++++++++++++++++++------------ service/beatleader/model.go | 2 +- service/game_data_helpers.go | 5 -- service/scoresaber/bind_ss.go | 16 +++-- 4 files changed, 84 insertions(+), 49 deletions(-) diff --git a/service/beatleader/bind_bl.go b/service/beatleader/bind_bl.go index 0ee9ae9..35c514d 100644 --- a/service/beatleader/bind_bl.go +++ b/service/beatleader/bind_bl.go @@ -1,7 +1,6 @@ package beatleader import ( - "database/sql" "encoding/json" "errors" "fmt" @@ -114,62 +113,97 @@ func (bl *blQuery) GetScore(qqId string) (currentData *PlayerDataLite, lastData // 构建 PlayerDataLite 结构体 dataLite := data.ToDataLite() + newBLData := service.BLData{ + ID: dataLite.ID, + Name: dataLite.Name, + Country: dataLite.Country, + PP: dataLite.PP, + Rank: dataLite.Rank, + CountryRank: dataLite.CountryRank, + TotalScore: dataLite.TotalScore, + TotalRankedScore: dataLite.TotalRankedScore, + AverageRankedAccuracy: dataLite.AverageRankedAccuracy, + TotalPlayCount: dataLite.TotalPlayCount, + RankedPlayCount: dataLite.RankedPlayCount, + ReplaysWatched: dataLite.ReplaysWatched, + GeneratedTime: time.Now(), + } + // 查询最近的玩家数据 - var lastDataLite PlayerDataLite - err = tx.Select("*").Where("id = ?", dataLite.ID).Order("generated_time DESC").Limit(1).Find(&lastDataLite).Error - if err != nil && err != sql.ErrNoRows { + lastBLData, err := service.GetLatestBLData(dataLite.ID) + if err != nil { log.Print(err) return nil, nil, err } + currentDataLite := PlayerDataLite{ + ID: dataLite.ID, + Name: dataLite.Name, + Country: dataLite.Country, + PP: dataLite.PP, + Rank: dataLite.Rank, + CountryRank: dataLite.CountryRank, + TotalScore: dataLite.TotalScore, + TotalRankedScore: dataLite.TotalRankedScore, + AverageRankedAccuracy: dataLite.AverageRankedAccuracy, + TotalPlayCount: dataLite.TotalPlayCount, + RankedPlayCount: dataLite.RankedPlayCount, + ReplaysWatched: dataLite.ReplaysWatched, + GeneratedTime: time.Now().Format("2006-01-02 15:04:05.999999999-07:00"), + } + + if lastBLData == nil || hasDataChanged(lastBLData, &newBLData) { + err = tx.Create(&newBLData).Error + if err != nil { + log.Print(err) + return nil, nil, err + } + err = tx.Delete(&service.BLData{ID: dataLite.ID}).Error + if err != nil { + log.Print(err) + return nil, nil, err + } + } + // 如果有新的数据,则插入 - if lastDataLite.IsDiffFrom(dataLite) { + if lastBLData == nil || hasDataChanged(lastBLData, &newBLData) { //删掉旧数据 err = tx.Delete(&PlayerDataLite{ID: dataLite.ID}).Error if err != nil { log.Print(err) return nil, nil, err } - err = tx.Create(&PlayerDataLite{ - ID: dataLite.ID, - Name: dataLite.Name, - Country: dataLite.Country, - PP: dataLite.PP, - Rank: dataLite.Rank, - CountryRank: dataLite.CountryRank, - TotalScore: dataLite.TotalScore, - TotalRankedScore: dataLite.TotalRankedScore, - AverageRankedAccuracy: dataLite.AverageRankedAccuracy, - TotalPlayCount: dataLite.TotalPlayCount, - RankedPlayCount: dataLite.RankedPlayCount, - ReplaysWatched: dataLite.ReplaysWatched, - GeneratedTime: time.Now().Format("2006-01-02 15:04:05.999999999-07:00"), - }).Error + err = tx.Create(&newBLData).Error if err != nil { log.Print(err) return nil, nil, err } - - // 提交事务 - err = tx.Commit().Error - if err != nil { - log.Print(err) - return nil, nil, err + if lastBLData != nil { + lastDataLite := PlayerDataLite{ + ID: lastBLData.ID, + Name: lastBLData.Name, + Country: lastBLData.Country, + PP: lastBLData.PP, + Rank: lastBLData.Rank, + CountryRank: lastBLData.CountryRank, + TotalScore: lastBLData.TotalScore, + TotalRankedScore: lastBLData.TotalRankedScore, + AverageRankedAccuracy: lastBLData.AverageRankedAccuracy, + TotalPlayCount: lastBLData.TotalPlayCount, + RankedPlayCount: lastBLData.RankedPlayCount, + ReplaysWatched: lastBLData.ReplaysWatched, + GeneratedTime: lastBLData.GeneratedTime.Format("2006-01-02 15:04:05.999999999-07:00"), + } + // 返回差异信息 + return ¤tDataLite, &lastDataLite, tx.Commit().Error } - - // 返回差异信息 - return &dataLite, &lastDataLite, nil } + return &dataLite, nil, tx.Commit().Error +} - // 如果没有新数据,直接提交事务 - err = tx.Commit().Error - if err != nil { - log.Print(err) - return nil, nil, err - } - - // 返回当前数据的字符串表示 - return &dataLite, nil, nil +func hasDataChanged(old *service.BLData, new *service.BLData) bool { + return old.PP != new.PP || old.Rank != new.Rank || old.CountryRank != new.CountryRank || + old.TotalScore != new.TotalScore || old.TotalRankedScore != new.TotalRankedScore } func (bl *blQuery) GetScoreWithoutUpdate(qqId string) (currentData *PlayerDataLite, err error) { diff --git a/service/beatleader/model.go b/service/beatleader/model.go index 92387a7..186c2a4 100644 --- a/service/beatleader/model.go +++ b/service/beatleader/model.go @@ -425,7 +425,7 @@ type PlayerDataLite struct { } func (p PlayerDataLite) TableName() string { - return "blData" + return "blRecordData" } func (p PlayerDataLite) IsDiffFrom(p2 PlayerDataLite) bool { diff --git a/service/game_data_helpers.go b/service/game_data_helpers.go index 8812d76..3daec70 100644 --- a/service/game_data_helpers.go +++ b/service/game_data_helpers.go @@ -57,11 +57,6 @@ func GetLatestSSData(id string) (*SSData, error) { return &data, err } -func CreateSSData(data SSData) error { - db := sqlite3.GetGormDB() - return db.Create(&data).Error -} - // BLData相关的GORM辅助函数 func GetLatestBLData(id string) (*BLData, error) { diff --git a/service/scoresaber/bind_ss.go b/service/scoresaber/bind_ss.go index c68096b..776fc59 100644 --- a/service/scoresaber/bind_ss.go +++ b/service/scoresaber/bind_ss.go @@ -96,6 +96,9 @@ func (ss *ssQuery) UnbindSS(qqId string) (reply string) { } func (ss *ssQuery) GetScore(qqId string) (currentData *PlayerDataLite, lastData *PlayerDataLite, err error) { + tx := sqlite3.GetGormDB().Begin() + defer tx.Rollback() + ssId, err := GetSSID(qqId) if err != nil { return nil, nil, err @@ -155,7 +158,12 @@ func (ss *ssQuery) GetScore(qqId string) (currentData *PlayerDataLite, lastData // 如果有新的数据且与上次不同,则插入 if lastSSData == nil || hasDataChanged(lastSSData, &newSSData) { - err = service.CreateSSData(newSSData) + err = tx.Delete(&service.SSData{ID: data.ID}).Error + if err != nil { + log.Print(err) + return nil, nil, err + } + err = tx.Create(&newSSData).Error if err != nil { log.Print(err) return nil, nil, err @@ -178,12 +186,10 @@ func (ss *ssQuery) GetScore(qqId string) (currentData *PlayerDataLite, lastData ReplaysWatched: lastSSData.ReplaysWatched, GeneratedTime: lastSSData.GeneratedTime.Format("2006-01-02 15:04:05.999999999-07:00"), } - return ¤tDataLite, &lastDataLite, nil + return ¤tDataLite, &lastDataLite, tx.Commit().Error } - return ¤tDataLite, nil, nil } - - return ¤tDataLite, nil, nil + return ¤tDataLite, nil, tx.Commit().Error } // 辅助函数:检查数据是否有变化