From f8860f65ceacf778b6ea3b5685470ee16aa9824b Mon Sep 17 00:00:00 2001 From: Yuan Si Date: Thu, 30 Mar 2023 06:08:53 +0800 Subject: [PATCH] Add album seriesAll api Signed-off-by: Yuan Si --- handler/album.go | 174 +++++++++++++++++++++++++++++++++++++++++++++++ handler/live.go | 1 + main.go | 1 + model/album.go | 7 +- 4 files changed, 180 insertions(+), 3 deletions(-) create mode 100644 handler/album.go diff --git a/handler/album.go b/handler/album.go new file mode 100644 index 0000000..ee856e8 --- /dev/null +++ b/handler/album.go @@ -0,0 +1,174 @@ +package handler + +import ( + "database/sql" + "encoding/base64" + "encoding/json" + "fmt" + "honoka-chan/config" + "honoka-chan/database" + "honoka-chan/encrypt" + "honoka-chan/model" + "honoka-chan/utils" + "net/http" + "time" + + "github.com/gin-gonic/gin" + _ "github.com/mattn/go-sqlite3" +) + +func AlbumSeriesAllHandler(ctx *gin.Context) { + db, err := sql.Open("sqlite3", "assets/unit.db") + if err != nil { + panic(err) + } + defer db.Close() + + reqTime := time.Now().Unix() + + authorizeStr := ctx.Request.Header["Authorize"] + authToken, err := utils.GetAuthorizeToken(authorizeStr) + if err != nil { + ctx.String(http.StatusForbidden, "Fuck you!") + return + } + userId := ctx.Request.Header[http.CanonicalHeaderKey("User-ID")] + if len(userId) == 0 { + ctx.String(http.StatusForbidden, "Fuck you!") + return + } + + if !database.MatchTokenUid(authToken, userId[0]) { + ctx.String(http.StatusForbidden, "Fuck you!") + return + } + + nonce, err := utils.GetAuthorizeNonce(authorizeStr) + if err != nil { + fmt.Println(err) + ctx.String(http.StatusForbidden, "Fuck you!") + return + } + nonce++ + + respTime := time.Now().Unix() + newAuthorizeStr := fmt.Sprintf("consumerKey=lovelive_test&timeStamp=%d&version=1.1&token=%s&nonce=%d&user_id=%s&requestTimeStamp=%d", respTime, authToken, nonce, userId[0], reqTime) + // fmt.Println(newAuthorizeStr) + + // + sql := `SELECT album_series_id FROM album_series_m` + seriesRows, err := db.Query(sql) + if err != nil { + panic(err) + } + albumSeriesAllResp := []model.AlbumResponseData{} + for seriesRows.Next() { + var series int + err = seriesRows.Scan(&series) + if err != nil { + panic(err) + } + + albumSeriesAll := []model.AlbumUnitList{} + stmt, err := db.Prepare("SELECT unit_id,rarity FROM unit_m WHERE album_series_id = ?") + if err != nil { + panic(err) + } + + unitRows, err := stmt.Query(series) + if err != nil { + panic(err) + } + + for unitRows.Next() { + var unitId, rarity int + err = unitRows.Scan(&unitId, &rarity) + if err != nil { + panic(err) + } + + albumSeries := model.AlbumUnitList{ + UnitID: unitId, + RankMaxFlag: true, + LoveMaxFlag: true, + RankLevelMaxFlag: true, + AllMaxFlag: true, + TotalLove: 10000, + FavoritePoint: 1000, + } + + if rarity != 4 { + switch rarity { + case 1: + // N + albumSeries.HighestLovePerUnit = 50 + case 2: + // R + albumSeries.HighestLovePerUnit = 200 + case 3: + // SR + albumSeries.HighestLovePerUnit = 500 + case 5: + // SSR + albumSeries.HighestLovePerUnit = 750 + } + } else { + // UR + albumSeries.HighestLovePerUnit = 1000 + + // IsSigned + stmt, err = db.Prepare("SELECT COUNT(*) AS ct FROM unit_sign_asset_m WHERE unit_id = ?") + if err != nil { + panic(err) + } + signRows, err := stmt.Query(unitId) + if err != nil { + panic(err) + } + + ct := 0 + for signRows.Next() { + err = signRows.Scan(&ct) + if err != nil { + panic(err) + } + } + if ct > 0 { + albumSeries.SignFlag = true + } else { + albumSeries.SignFlag = false + } + } + + albumSeriesAll = append(albumSeriesAll, albumSeries) + } + albumSeriesAllResp = append(albumSeriesAllResp, model.AlbumResponseData{ + SeriesID: series, + UnitList: albumSeriesAll, + }) + } + rb, err := json.Marshal(albumSeriesAllResp) + if err != nil { + panic(err) + } + resp := model.Response{ + ResponseData: rb, + ReleaseInfo: []interface{}{}, + StatusCode: 200, + } + respb, err := json.Marshal(resp) + if err != nil { + panic(err) + } + // fmt.Println(string(respb)) + + xms := encrypt.RSA_Sign_SHA1(respb, "privatekey.pem") + xms64 := base64.RawStdEncoding.EncodeToString(xms) + + ctx.Header("Server-Version", config.Conf.Server.VersionNumber) + ctx.Header("user_id", userId[0]) + ctx.Header("authorize", newAuthorizeStr) + ctx.Header("X-Message-Sign", xms64) + + ctx.String(http.StatusOK, string(respb)) +} diff --git a/handler/live.go b/handler/live.go index 2b39bd8..8ea4bed 100644 --- a/handler/live.go +++ b/handler/live.go @@ -15,6 +15,7 @@ import ( "time" "github.com/gin-gonic/gin" + _ "github.com/mattn/go-sqlite3" ) func PartyListHandler(ctx *gin.Context) { diff --git a/main.go b/main.go index a1b72a8..3399022 100644 --- a/main.go +++ b/main.go @@ -54,6 +54,7 @@ func main() { r.POST("/main.php/unit/favorite", handler.SetDisplayRankHandler) r.POST("/main.php/subscenario/startup", handler.SubScenarioStartupHandler) r.POST("/main.php/subscenario/reward", handler.SubScenarioStartupHandler) + r.POST("/main.php/album/seriesAll", handler.AlbumSeriesAllHandler) r.Run(":8080") // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") } diff --git a/model/album.go b/model/album.go index f315857..388b480 100644 --- a/model/album.go +++ b/model/album.go @@ -1,7 +1,7 @@ package model // module: album, action: albumAll -type AlbumAll struct { +type AlbumUnitList struct { UnitID int `json:"unit_id"` RankMaxFlag bool `json:"rank_max_flag"` LoveMaxFlag bool `json:"love_max_flag"` @@ -13,6 +13,7 @@ type AlbumAll struct { SignFlag bool `json:"sign_flag"` } -type AlbumAllResult struct { - AlbumAll []AlbumAll +type AlbumResponseData struct { + SeriesID int `json:"series_id"` + UnitList []AlbumUnitList `json:"unit_list"` }