diff --git a/assets/main.db b/assets/main.db index caa262c..8f156cc 100644 Binary files a/assets/main.db and b/assets/main.db differ diff --git a/go.mod b/go.mod index 7b964c5..7340ae8 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/forgoer/openssl v1.5.0 github.com/mattn/go-sqlite3 v1.14.16 github.com/tidwall/gjson v1.14.4 + xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 xorm.io/xorm v1.3.2 ) @@ -15,7 +16,6 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect - xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 ) require ( diff --git a/handler/download.go b/handler/download.go index a89cd00..3048693 100644 --- a/handler/download.go +++ b/handler/download.go @@ -12,8 +12,15 @@ import ( "github.com/gin-gonic/gin" _ "github.com/mattn/go-sqlite3" + "xorm.io/builder" ) +type PkgInfo struct { + Id int `xorm:"pkg_id"` + Order int `xorm:"pkg_order"` + Size int `xorm:"pkg_size"` +} + func DownloadAdditionalHandler(ctx *gin.Context) { downloadReq := model.AdditionalReq{} if err := json.Unmarshal([]byte(ctx.PostForm("request_data")), &downloadReq); err != nil { @@ -22,18 +29,16 @@ func DownloadAdditionalHandler(ctx *gin.Context) { pkgList := []model.AdditionalResult{} if CdnUrl != "" { pkgType, pkgId := downloadReq.PackageType, downloadReq.PackageID - stmt, err := MainEng.DB().Prepare("SELECT pkg_order,pkg_size FROM download_db WHERE pkg_type = ? AND pkg_id = ? ORDER BY pkg_order ASC") + var pkgInfo []PkgInfo + err := MainEng.Table("download_m").Where("pkg_type = ? AND pkg_id = ? AND pkg_os = ?", pkgType, pkgId, downloadReq.TargetOs). + Cols("pkg_id,pkg_order,pkg_size"). + OrderBy("pkg_id ASC, pkg_order ASC").Find(&pkgInfo) CheckErr(err) - defer stmt.Close() - rows, err := stmt.Query(pkgType, pkgId) - CheckErr(err) - for rows.Next() { - var pkgOrder, pkgSize int - err = rows.Scan(&pkgOrder, &pkgSize) - CheckErr(err) + + for _, pkg := range pkgInfo { pkgList = append(pkgList, model.AdditionalResult{ - Size: pkgSize, - URL: fmt.Sprintf("%s/archives/%d_%d_%d.zip", CdnUrl, pkgType, pkgId, pkgOrder), + Size: pkg.Size, + URL: fmt.Sprintf("%s/%s/archives/%d_%d_%d.zip", CdnUrl, downloadReq.TargetOs, pkgType, pkg.Id, pkg.Order), }) } } @@ -64,26 +69,16 @@ func DownloadBatchHandler(ctx *gin.Context) { pkgList := []model.BatchResult{} if downloadReq.ClientVersion == PackageVersion && CdnUrl != "" { pkgType := downloadReq.PackageType - exPkgId := "" - if len(downloadReq.ExcludedPackageIds) > 0 { - // https://stackoverflow.com/a/37533144 - exPkgId = strings.Trim(strings.Join(strings.Fields(fmt.Sprint(downloadReq.ExcludedPackageIds)), ","), "[]") + var pkgInfo []PkgInfo + err := MainEng.Table("download_m").Where(builder.NotIn("pkg_id", downloadReq.ExcludedPackageIds)).Where("pkg_type = ? AND pkg_os = ?", pkgType, downloadReq.Os). + Cols("pkg_id,pkg_order,pkg_size"). + OrderBy("pkg_id ASC, pkg_order ASC").Find(&pkgInfo) + CheckErr(err) - exPkgId = fmt.Sprintf("AND pkg_id NOT IN (%s)", exPkgId) - } - // fmt.Println(exPkgId) - stmt, err := MainEng.DB().Prepare("SELECT pkg_id,pkg_order,pkg_size FROM download_db WHERE pkg_type = ? " + exPkgId + " ORDER BY pkg_id ASC, pkg_order ASC") - CheckErr(err) - defer stmt.Close() - rows, err := stmt.Query(pkgType) - CheckErr(err) - for rows.Next() { - var pkgId, pkgOrder, pkgSize int - err = rows.Scan(&pkgId, &pkgOrder, &pkgSize) - CheckErr(err) + for _, pkg := range pkgInfo { pkgList = append(pkgList, model.BatchResult{ - Size: pkgSize, - URL: fmt.Sprintf("%s/archives/%d_%d_%d.zip", CdnUrl, pkgType, pkgId, pkgOrder), + Size: pkg.Size, + URL: fmt.Sprintf("%s/%s/archives/%d_%d_%d.zip", CdnUrl, downloadReq.Os, pkgType, pkg.Id, pkg.Order), }) } } @@ -114,15 +109,16 @@ func DownloadUpdateHandler(ctx *gin.Context) { pkgList := []model.UpdateResult{} if downloadReq.ExternalVersion != PackageVersion && CdnUrl != "" { pkgType := 99 - rows, err := MainEng.DB().Query("SELECT pkg_id,pkg_order,pkg_size FROM download_db WHERE pkg_type = 99 ORDER BY pkg_id ASC, pkg_order ASC") + var pkgInfo []PkgInfo + err := MainEng.Table("download_m").Where("pkg_type = ? AND pkg_os = ?", pkgType, downloadReq.TargetOs). + Cols("pkg_id,pkg_order,pkg_size"). + OrderBy("pkg_id ASC, pkg_order ASC").Find(&pkgInfo) CheckErr(err) - for rows.Next() { - var pkgId, pkgOrder, pkgSize int - err = rows.Scan(&pkgId, &pkgOrder, &pkgSize) - CheckErr(err) + + for _, pkg := range pkgInfo { pkgList = append(pkgList, model.UpdateResult{ - Size: pkgSize, - URL: fmt.Sprintf("%s/archives/%d_%d_%d.zip", CdnUrl, pkgType, pkgId, pkgOrder), + Size: pkg.Size, + URL: fmt.Sprintf("%s/%s/archives/%d_%d_%d.zip", CdnUrl, downloadReq.TargetOs, pkgType, pkg.Id, pkg.Order), Version: PackageVersion, }) } @@ -147,7 +143,7 @@ func DownloadUpdateHandler(ctx *gin.Context) { } func DownloadUrlHandler(ctx *gin.Context) { - // Extract SQL: SELECT CAST(pkg_type AS TEXT) || '_' || CAST(pkg_id AS TEXT) || '_' || CAST(pkg_order AS TEXT) || '.zip' AS zip_name FROM download_db ORDER BY pkg_type ASC,pkg_id ASC, pkg_order ASC; + // Extract SQL: SELECT CAST(pkg_type AS TEXT) || '_' || CAST(pkg_id AS TEXT) || '_' || CAST(pkg_order AS TEXT) || '.zip' AS zip_name FROM download_m ORDER BY pkg_type ASC,pkg_id ASC, pkg_order ASC; // Extract Cmd: cat list.txt | while read line; do; unzip -o $line; done downloadReq := model.UrlReq{} if err := json.Unmarshal([]byte(ctx.PostForm("request_data")), &downloadReq); err != nil { @@ -155,7 +151,7 @@ func DownloadUrlHandler(ctx *gin.Context) { } urlList := []string{} for _, v := range downloadReq.PathList { - urlList = append(urlList, fmt.Sprintf("%s/extracted/%s", CdnUrl, strings.ReplaceAll(v, "\\", ""))) + urlList = append(urlList, fmt.Sprintf("%s/%s/extracted/%s", CdnUrl, downloadReq.Os, strings.ReplaceAll(v, "\\", ""))) } urlResp := model.UrlResp{ ResponseData: model.UrlResult{ diff --git a/handler/live.go b/handler/live.go index 1690cde..e9bb144 100644 --- a/handler/live.go +++ b/handler/live.go @@ -38,7 +38,6 @@ func PartyListHandler(ctx *gin.Context) { } func PlayLiveHandler(ctx *gin.Context) { - fmt.Println(ctx.PostForm("request_data")) playReq := model.PlayReq{} err := json.Unmarshal([]byte(ctx.PostForm("request_data")), &playReq) CheckErr(err) diff --git a/main.go b/main.go index 39f6f7f..8327124 100644 --- a/main.go +++ b/main.go @@ -102,5 +102,5 @@ func main() { ctx.HTML(http.StatusOK, "manga.tmpl", gin.H{}) }) - r.Run(":8080") // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") + r.Run(":80") // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") } diff --git a/middleware/common.go b/middleware/common.go index cc345c5..609b1e1 100644 --- a/middleware/common.go +++ b/middleware/common.go @@ -24,6 +24,13 @@ func CheckErr(err error) { func Common(ctx *gin.Context) { ctx.Set("req_time", time.Now().Unix()) + ctx.Request.ParseMultipartForm(0) + if len(ctx.PostForm("request_data")) == 0 { + // 弱智iOS客户端经常发些空的表单上来... + fmt.Println("Fuck you, iOS!") + ctx.Abort() + } + authorize := ctx.Request.Header.Get("Authorize") if authorize == "" { ctx.String(http.StatusForbidden, ErrorMsg) diff --git a/tools/download.go b/tools/download.go new file mode 100644 index 0000000..647ca3f --- /dev/null +++ b/tools/download.go @@ -0,0 +1,72 @@ +package tools + +import ( + "fmt" + "os" + "strings" + + _ "github.com/mattn/go-sqlite3" +) + +func GenDownloadDb() { + // Create table + // CREATE TABLE "download_m" ( + // "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, + // "pkg_type" integer, + // "pkg_id" integer, + // "pkg_order" integer, + // "pkg_size" integer, + // "pkg_os" TEXT + // ); + fileLists, err := os.ReadDir("F:/sif_dl/list_CN_Android") + CheckErr(err) + for _, v := range fileLists { + if v.IsDir() { + panic(err) + } + fileList := "F:/sif_dl/list_CN_Android/" + v.Name() + fileStat, err := os.Stat(fileList) + CheckErr(err) + pkgSize := fileStat.Size() + fileInfo := strings.Split(strings.ReplaceAll(v.Name(), ".zip", ""), "_") + pkgType, pkgId, pkgOrder := fileInfo[0], fileInfo[1], fileInfo[2] + fmt.Printf("Android: %s - %s - %s - %d\n", pkgType, pkgId, pkgOrder, pkgSize) + + stmt, err := MainEng.DB().Prepare("INSERT INTO download_m(pkg_type,pkg_id,pkg_order,pkg_size,pkg_os) VALUES (?,?,?,?,?)") + CheckErr(err) + defer stmt.Close() + + res, err := stmt.Exec(pkgType, pkgId, pkgOrder, pkgSize, "Android") + CheckErr(err) + + id, err := res.LastInsertId() + CheckErr(err) + fmt.Println("LastInsertId:", id) + } + + fileLists, err = os.ReadDir("F:/sif_dl/list_CN_iOS") + CheckErr(err) + for _, v := range fileLists { + if v.IsDir() { + panic(err) + } + fileList := "F:/sif_dl/list_CN_iOS/" + v.Name() + fileStat, err := os.Stat(fileList) + CheckErr(err) + pkgSize := fileStat.Size() + fileInfo := strings.Split(strings.ReplaceAll(v.Name(), ".zip", ""), "_") + pkgType, pkgId, pkgOrder := fileInfo[0], fileInfo[1], fileInfo[2] + fmt.Printf("iOS: %s - %s - %s - %d\n", pkgType, pkgId, pkgOrder, pkgSize) + + stmt, err := MainEng.DB().Prepare("INSERT INTO download_m(pkg_type,pkg_id,pkg_order,pkg_size,pkg_os) VALUES (?,?,?,?,?)") + CheckErr(err) + defer stmt.Close() + + res, err := stmt.Exec(pkgType, pkgId, pkgOrder, pkgSize, "iOS") + CheckErr(err) + + id, err := res.LastInsertId() + CheckErr(err) + fmt.Println("LastInsertId:", id) + } +} diff --git a/tools/download_db.go b/tools/download_db.go deleted file mode 100644 index 0537c95..0000000 --- a/tools/download_db.go +++ /dev/null @@ -1,46 +0,0 @@ -package tools - -import ( - "fmt" - "os" - "strings" - - _ "github.com/mattn/go-sqlite3" -) - -func GenDownloadDb() { - // Create table - // sql := `CREATE TABLE "main"."download_db" ( - // "id" integer NOT NULL, - // "pkg_type" integer, - // "pkg_id" integer, - // "pkg_order" integer, - // "pkg_size" integer, - // PRIMARY KEY ("id") - // )` - fileLists, err := os.ReadDir("F:/sif_dl/list_CN_Android") - CheckErr(err) - for _, v := range fileLists { - if v.IsDir() { - panic(err) - } - fileList := "F:/sif_dl/list_CN_Android/" + v.Name() - fileStat, err := os.Stat(fileList) - CheckErr(err) - pkgSize := fileStat.Size() - fileInfo := strings.Split(strings.ReplaceAll(v.Name(), ".zip", ""), "_") - pkgType, pkgId, pkgOrder := fileInfo[0], fileInfo[1], fileInfo[2] - fmt.Printf("%s - %s - %s - %d\n", pkgType, pkgId, pkgOrder, pkgSize) - - stmt, err := MainEng.DB().Prepare("INSERT INTO download_db(pkg_type,pkg_id,pkg_order,pkg_size) VALUES (?,?,?,?)") - CheckErr(err) - defer stmt.Close() - - res, err := stmt.Exec(pkgType, pkgId, pkgOrder, pkgSize) - CheckErr(err) - - id, err := res.LastInsertId() - CheckErr(err) - fmt.Println("LastInsertId:", id) - } -}