diff --git a/README.md b/README.md index dafa58c..038e557 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,4 @@ LoveLive! 学园偶像祭 自用私服。 - 虹原翼 (yazawa@niconi.co.ni) @ [LLSIF 查卡器 ](https://card.niconi.co.ni/) 的技术支持。 - tungnotpunk @ LL Hax 在 iOS 客户端修改方面的支持。 - - reversing-sifas (https://github.com/Francesco149/reversing-sifas) 项目的灵感和技术细节。 - - LLAS WiKi (https://wiki.loveliv.es/) 提供的全量 AS Live Stage 信息。 - 其他可能一时没想起来的大佬们和项目。 diff --git a/assets/.gitignore b/assets/.gitignore index 1e4c958..d634ecb 100644 --- a/assets/.gitignore +++ b/assets/.gitignore @@ -1 +1,2 @@ data.db +load.db diff --git a/assets/main.db b/assets/main.db index 51c2d11..64752b3 100644 Binary files a/assets/main.db and b/assets/main.db differ diff --git a/assets/serverdata/accessoryTab.json b/assets/serverdata/accessoryTab.json new file mode 100644 index 0000000..6c790c1 --- /dev/null +++ b/assets/serverdata/accessoryTab.json @@ -0,0 +1,185 @@ +{ + "result": { + "tab_list": [ + { + "tab_name": "μ’s", + "asset_list": [ + { + "unit_type_id": 1, + "asset_path": "assets/image/accessory/list/list_1.png" + }, + { + "unit_type_id": 2, + "asset_path": "assets/image/accessory/list/list_2.png" + }, + { + "unit_type_id": 3, + "asset_path": "assets/image/accessory/list/list_3.png" + }, + { + "unit_type_id": 4, + "asset_path": "assets/image/accessory/list/list_4.png" + }, + { + "unit_type_id": 5, + "asset_path": "assets/image/accessory/list/list_5.png" + }, + { + "unit_type_id": 6, + "asset_path": "assets/image/accessory/list/list_6.png" + }, + { + "unit_type_id": 7, + "asset_path": "assets/image/accessory/list/list_7.png" + }, + { + "unit_type_id": 8, + "asset_path": "assets/image/accessory/list/list_8.png" + }, + { + "unit_type_id": 9, + "asset_path": "assets/image/accessory/list/list_9.png" + } + ] + }, + { + "tab_name": "Aqours", + "asset_list": [ + { + "unit_type_id": 101, + "asset_path": "assets/image/accessory/list/list_10.png" + }, + { + "unit_type_id": 102, + "asset_path": "assets/image/accessory/list/list_11.png" + }, + { + "unit_type_id": 103, + "asset_path": "assets/image/accessory/list/list_12.png" + }, + { + "unit_type_id": 104, + "asset_path": "assets/image/accessory/list/list_13.png" + }, + { + "unit_type_id": 105, + "asset_path": "assets/image/accessory/list/list_14.png" + }, + { + "unit_type_id": 106, + "asset_path": "assets/image/accessory/list/list_15.png" + }, + { + "unit_type_id": 107, + "asset_path": "assets/image/accessory/list/list_16.png" + }, + { + "unit_type_id": 108, + "asset_path": "assets/image/accessory/list/list_17.png" + }, + { + "unit_type_id": 109, + "asset_path": "assets/image/accessory/list/list_18.png" + } + ] + }, + { + "tab_name": "虹咲", + "asset_list": [ + { + "unit_type_id": 201, + "asset_path": "assets/image/accessory/list/list_24.png" + }, + { + "unit_type_id": 202, + "asset_path": "assets/image/accessory/list/list_25.png" + }, + { + "unit_type_id": 203, + "asset_path": "assets/image/accessory/list/list_26.png" + }, + { + "unit_type_id": 204, + "asset_path": "assets/image/accessory/list/list_27.png" + }, + { + "unit_type_id": 205, + "asset_path": "assets/image/accessory/list/list_28.png" + }, + { + "unit_type_id": 206, + "asset_path": "assets/image/accessory/list/list_29.png" + }, + { + "unit_type_id": 207, + "asset_path": "assets/image/accessory/list/list_30.png" + }, + { + "unit_type_id": 208, + "asset_path": "assets/image/accessory/list/list_31.png" + }, + { + "unit_type_id": 209, + "asset_path": "assets/image/accessory/list/list_32.png" + }, + { + "unit_type_id": 212, + "asset_path": "assets/image/accessory/list/list_33.png" + }, + { + "unit_type_id": 213, + "asset_path": "assets/image/accessory/list/list_34.png" + }, + { + "unit_type_id": 214, + "asset_path": "assets/image/accessory/list/list_35.png" + } + ] + }, + { + "tab_name": "Liella!", + "asset_list": [ + { + "unit_type_id": 301, + "asset_path": "assets/image/accessory/list/list_19.png" + }, + { + "unit_type_id": 302, + "asset_path": "assets/image/accessory/list/list_20.png" + }, + { + "unit_type_id": 303, + "asset_path": "assets/image/accessory/list/list_21.png" + }, + { + "unit_type_id": 304, + "asset_path": "assets/image/accessory/list/list_22.png" + }, + { + "unit_type_id": 305, + "asset_path": "assets/image/accessory/list/list_23.png" + }, + { + "unit_type_id": 306, + "asset_path": "assets/image/accessory/list/list_36.png" + }, + { + "unit_type_id": 307, + "asset_path": "assets/image/accessory/list/list_37.png" + }, + { + "unit_type_id": 308, + "asset_path": "assets/image/accessory/list/list_38.png" + }, + { + "unit_type_id": 309, + "asset_path": "assets/image/accessory/list/list_39.png" + } + ] + } + ] + }, + "status": 200, + "commandNum": false, + "timeStamp": 1679237529 +} diff --git a/assets/serverdata/love.json b/assets/serverdata/love.json index 946cebf..bf85ff4 100644 --- a/assets/serverdata/love.json +++ b/assets/serverdata/love.json @@ -14495,4 +14495,4 @@ "rank": 2416, "sign_flag": false } -] \ No newline at end of file +] diff --git a/assets/serverdata/partylist.json b/assets/serverdata/partylist.json deleted file mode 100644 index 4a0ffa9..0000000 --- a/assets/serverdata/partylist.json +++ /dev/null @@ -1,215 +0,0 @@ -{ - "response_data": { - "party_list": [ - { - "user_info": { - "user_id": 5762285, - "name": "SDS Nico", - "level": 21 - }, - "center_unit_info": { - "unit_owning_user_id": 1000880096808, - "unit_id": 4001, - "exp": 79700, - "next_exp": 0, - "level": 100, - "level_limit_id": 1, - "max_level": 100, - "rank": 2, - "max_rank": 2, - "love": 1000, - "max_love": 1000, - "unit_skill_level": 8, - "max_hp": 4, - "favorite_flag": false, - "display_rank": 2, - "unit_skill_exp": 29900, - "unit_removable_skill_capacity": 8, - "attribute": 2, - "smile": 7210, - "cute": 7870, - "cool": 7430, - "is_love_max": true, - "is_level_max": true, - "is_rank_max": true, - "is_signed": true, - "is_skill_level_max": true, - "setting_award_id": 121, - "removable_skill_ids": [] - }, - "setting_award_id": 121, - "available_social_point": 10, - "friend_status": 1 - }, - { - "user_info": { - "user_id": 5400659, - "name": "\u9ed1\u6850-", - "level": 37 - }, - "center_unit_info": { - "unit_owning_user_id": 1001193273786, - "unit_id": 13, - "exp": 0, - "next_exp": 6, - "level": 1, - "level_limit_id": 0, - "max_level": 30, - "rank": 1, - "max_rank": 2, - "love": 25, - "max_love": 25, - "unit_skill_level": 1, - "max_hp": 2, - "favorite_flag": false, - "display_rank": 1, - "unit_skill_exp": 0, - "unit_removable_skill_capacity": 0, - "attribute": 1, - "smile": 1520, - "cute": 550, - "cool": 308, - "is_love_max": false, - "is_level_max": false, - "is_rank_max": false, - "is_signed": false, - "is_skill_level_max": true, - "setting_award_id": 17, - "removable_skill_ids": [] - }, - "setting_award_id": 17, - "available_social_point": 10, - "friend_status": 1 - }, - { - "user_info": { - "user_id": 7663163, - "name": "\u82b1\u82b1\u82b1\u6912", - "level": 30 - }, - "center_unit_info": { - "unit_owning_user_id": 1002061904425, - "unit_id": 1131, - "exp": 8400, - "next_exp": 8659, - "level": 18, - "level_limit_id": 1, - "max_level": 100, - "rank": 2, - "max_rank": 2, - "love": 1000, - "max_love": 1000, - "unit_skill_level": 1, - "max_hp": 5, - "favorite_flag": true, - "display_rank": 2, - "unit_skill_exp": 0, - "unit_removable_skill_capacity": 4, - "attribute": 3, - "smile": 3195, - "cute": 2925, - "cool": 4085, - "is_love_max": true, - "is_level_max": false, - "is_rank_max": true, - "is_signed": false, - "is_skill_level_max": false, - "setting_award_id": 17, - "removable_skill_ids": [] - }, - "setting_award_id": 17, - "available_social_point": 5, - "friend_status": 0 - }, - { - "user_info": { - "user_id": 7663313, - "name": "\u67f3\u4e95\u4e0e\u5b50", - "level": 34 - }, - "center_unit_info": { - "unit_owning_user_id": 1002062097329, - "unit_id": 1372, - "exp": 79700, - "next_exp": 0, - "level": 100, - "level_limit_id": 1, - "max_level": 100, - "rank": 2, - "max_rank": 2, - "love": 1000, - "max_love": 1000, - "unit_skill_level": 1, - "max_hp": 6, - "favorite_flag": true, - "display_rank": 2, - "unit_skill_exp": 0, - "unit_removable_skill_capacity": 4, - "attribute": 1, - "smile": 5370, - "cute": 4080, - "cool": 4500, - "is_love_max": true, - "is_level_max": true, - "is_rank_max": true, - "is_signed": false, - "is_skill_level_max": false, - "setting_award_id": 17, - "removable_skill_ids": [ - 3, - 2, - 1 - ] - }, - "setting_award_id": 17, - "available_social_point": 5, - "friend_status": 0 - }, - { - "user_info": { - "user_id": 7663527, - "name": "\u6211\u63a8\u5c06\u519b", - "level": 15 - }, - "center_unit_info": { - "unit_owning_user_id": 1002062228744, - "unit_id": 1912, - "exp": 0, - "next_exp": 201, - "level": 1, - "level_limit_id": 1, - "max_level": 100, - "rank": 2, - "max_rank": 2, - "love": 444, - "max_love": 1000, - "unit_skill_level": 1, - "max_hp": 5, - "favorite_flag": false, - "display_rank": 2, - "unit_skill_exp": 0, - "unit_removable_skill_capacity": 4, - "attribute": 1, - "smile": 3870, - "cute": 3090, - "cool": 2470, - "is_love_max": false, - "is_level_max": false, - "is_rank_max": true, - "is_signed": false, - "is_skill_level_max": false, - "setting_award_id": 1, - "removable_skill_ids": [] - }, - "setting_award_id": 1, - "available_social_point": 5, - "friend_status": 0 - } - ], - "training_energy": 999, - "training_energy_max": 999, - "server_timestamp": 1679802984 - }, - "release_info": [], - "status_code": 200 -} \ No newline at end of file diff --git a/go.mod b/go.mod index 64e0857..474d02e 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/bytedance/sonic/loader v0.5.0 // indirect github.com/cloudwego/base64x v0.1.6 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/gabriel-vasile/mimetype v1.4.12 // indirect + github.com/gabriel-vasile/mimetype v1.4.13 // indirect github.com/goccy/go-yaml v1.19.2 // indirect github.com/golang/snappy v1.0.0 // indirect github.com/google/uuid v1.6.0 // indirect @@ -55,7 +55,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect - github.com/syndtr/goleveldb v1.0.0 + github.com/syndtr/goleveldb v1.0.0 // indirect github.com/ugorji/go/codec v1.3.1 // indirect golang.org/x/crypto v0.47.0 // indirect golang.org/x/net v0.49.0 // indirect diff --git a/go.sum b/go.sum index 88d8a3a..a668ebc 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw= -github.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= +github.com/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9Ufpk2AcUM= +github.com/gabriel-vasile/mimetype v1.4.13/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= github.com/gin-contrib/sessions v1.0.4 h1:ha6CNdpYiTOK/hTp05miJLbpTSNfOnFg5Jm2kbcqy8U= github.com/gin-contrib/sessions v1.0.4/go.mod h1:ccmkrb2z6iU2osiAHZG3x3J4suJK+OU27oqzlWOqQgs= github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= diff --git a/internal/constant/constant.go b/internal/constant/constant.go new file mode 100644 index 0000000..ed5e571 --- /dev/null +++ b/internal/constant/constant.go @@ -0,0 +1,17 @@ +package constant + +type LiveGoalType int + +const ( + LiveGoalTypeScore LiveGoalType = iota + 1 + LiveGoalTypeCombo + LiveGoalTypeClear +) + +type PreciseScoreUpdateType int + +const ( + PreciseScoreUpdateTypePerfect PreciseScoreUpdateType = iota + 1 + PreciseScoreUpdateTypeScore + PreciseScoreUpdateTypeAlways +) diff --git a/internal/constant/errorcode.go b/internal/constant/errorcode.go new file mode 100644 index 0000000..92638c6 --- /dev/null +++ b/internal/constant/errorcode.go @@ -0,0 +1,7 @@ +package constant + +type ErrorCode int + +const ( + ErrorCodeLivePreciseListNotFound ErrorCode = 3421 +) diff --git a/internal/handler/album/seriesall.go b/internal/handler/album/seriesall.go index 9f2ece9..a3626ed 100644 --- a/internal/handler/album/seriesall.go +++ b/internal/handler/album/seriesall.go @@ -3,7 +3,7 @@ package album import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/album" + albumschema "honoka-chan/internal/schema/album" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -19,7 +19,7 @@ func seriesAll(ctx *gin.Context) { return } - albumSeriesAllRes := []album.SeriesAllData{} + albumSeriesAllRes := []albumschema.SeriesAllData{} for _, id := range albumID { var unitList []struct { UnitId int `xorm:"unit_id"` @@ -30,9 +30,9 @@ func seriesAll(ctx *gin.Context) { return } - albumSeriesAll := []album.UnitList{} + albumSeriesAll := []albumschema.UnitList{} for _, unit := range unitList { - albumSeries := album.UnitList{ + albumSeries := albumschema.UnitList{ UnitID: unit.UnitId, RankMaxFlag: true, LoveMaxFlag: true, @@ -72,13 +72,13 @@ func seriesAll(ctx *gin.Context) { albumSeriesAll = append(albumSeriesAll, albumSeries) } - albumSeriesAllRes = append(albumSeriesAllRes, album.SeriesAllData{ + albumSeriesAllRes = append(albumSeriesAllRes, albumschema.SeriesAllData{ SeriesID: id, UnitList: albumSeriesAll, }) } - ss.Respond(album.SeriesAllResp{ + ss.Respond(albumschema.SeriesAllResp{ ResponseData: albumSeriesAllRes, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/announce/checkstate.go b/internal/handler/announce/checkstate.go index be2999c..6eea194 100644 --- a/internal/handler/announce/checkstate.go +++ b/internal/handler/announce/checkstate.go @@ -3,7 +3,7 @@ package announce import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/announce" + announceschema "honoka-chan/internal/schema/announce" "honoka-chan/internal/session" "time" @@ -14,8 +14,8 @@ func checkState(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - ss.Respond(announce.CheckStateDataResp{ - ResponseData: announce.CheckStateData{ + ss.Respond(announceschema.CheckStateDataResp{ + ResponseData: announceschema.CheckStateData{ HasUnreadAnnounce: false, ServerTimestamp: time.Now().Unix(), }, diff --git a/internal/handler/api/album/all.go b/internal/handler/api/album/all.go index 4ddfbd0..4fe53c3 100644 --- a/internal/handler/api/album/all.go +++ b/internal/handler/api/album/all.go @@ -1,7 +1,7 @@ package album import ( - "honoka-chan/internal/schema/api/album" + albumapischema "honoka-chan/internal/schema/api/album" "honoka-chan/internal/session" "time" @@ -11,7 +11,7 @@ import ( func albumAll(ctx *gin.Context) (res any, err error) { ss := session.Get(ctx) - albumLists := []album.UnitList{} + albumLists := []albumapischema.UnitList{} var unitList []struct { UnitId int `xorm:"unit_id"` Rarity int `xorm:"rarity"` @@ -22,7 +22,7 @@ func albumAll(ctx *gin.Context) (res any, err error) { } for _, unit := range unitList { - albumList := album.UnitList{ + albumList := albumapischema.UnitList{ RankMaxFlag: true, LoveMaxFlag: true, RankLevelMaxFlag: true, @@ -59,7 +59,7 @@ func albumAll(ctx *gin.Context) (res any, err error) { albumLists = append(albumLists, albumList) } - res = album.AllResp{ + res = albumapischema.AllResp{ Result: albumLists, Status: 200, CommandNum: false, diff --git a/internal/handler/api/award/info.go b/internal/handler/api/award/info.go index c68c27b..a43cf4c 100644 --- a/internal/handler/api/award/info.go +++ b/internal/handler/api/award/info.go @@ -1,7 +1,7 @@ package award import ( - "honoka-chan/internal/schema/api/award" + awardapischema "honoka-chan/internal/schema/api/award" "honoka-chan/internal/session" "time" @@ -23,21 +23,21 @@ func awardInfo(ctx *gin.Context) (res any, err error) { return } - awardsList := []award.Info{} + awardsList := []awardapischema.Info{} for _, id := range awardList { isSet := false if id == awardID { isSet = true } - awardsList = append(awardsList, award.Info{ + awardsList = append(awardsList, awardapischema.Info{ AwardID: id, IsSet: isSet, - InsertDate: time.Now().Format("2006-01-02 03:04:05"), + InsertDate: "2023-03-20 03:58:55", }) } - res = award.InfoResp{ - Result: award.InfoData{ + res = awardapischema.InfoResp{ + Result: awardapischema.InfoData{ AwardInfo: awardsList, }, Status: 200, diff --git a/internal/handler/api/background/info.go b/internal/handler/api/background/info.go index 453a603..470e9ad 100644 --- a/internal/handler/api/background/info.go +++ b/internal/handler/api/background/info.go @@ -1,7 +1,7 @@ package background import ( - "honoka-chan/internal/schema/api/background" + backgroundapischema "honoka-chan/internal/schema/api/background" "honoka-chan/internal/session" "time" @@ -23,21 +23,21 @@ func backgroundInfo(ctx *gin.Context) (res any, err error) { return } - backgroundsList := []background.Info{} + backgroundsList := []backgroundapischema.Info{} for _, id := range backgroundList { isSet := false if id == backgroundID { isSet = true } - backgroundsList = append(backgroundsList, background.Info{ + backgroundsList = append(backgroundsList, backgroundapischema.Info{ BackgroundID: id, IsSet: isSet, - InsertDate: time.Now().Format("2006-01-02 03:04:05"), + InsertDate: "2023-03-20 03:58:55", }) } - res = background.InfoResp{ - Result: background.InfoData{ + res = backgroundapischema.InfoResp{ + Result: backgroundapischema.InfoData{ BackgroundInfo: backgroundsList, }, Status: 200, diff --git a/internal/handler/api/banner/list.go b/internal/handler/api/banner/list.go index 80c8f60..e181fd8 100644 --- a/internal/handler/api/banner/list.go +++ b/internal/handler/api/banner/list.go @@ -1,15 +1,15 @@ package banner import ( - "honoka-chan/internal/schema/api/banner" + bannerapischema "honoka-chan/internal/schema/api/banner" "time" ) func bannerList() (res any, err error) { - res = banner.ListResp{ - Result: banner.ListData{ + res = bannerapischema.ListResp{ + Result: bannerapischema.ListData{ TimeLimit: "2037-12-31 23:59:59", - BannerList: []banner.BannerList{ + BannerList: []bannerapischema.BannerList{ { BannerType: 1, TargetID: 1743, diff --git a/internal/handler/api/challenge/info.go b/internal/handler/api/challenge/info.go index 94ebe05..d214195 100644 --- a/internal/handler/api/challenge/info.go +++ b/internal/handler/api/challenge/info.go @@ -1,12 +1,12 @@ package challenge import ( - "honoka-chan/internal/schema/api/challenge" + challengeapischema "honoka-chan/internal/schema/api/challenge" "time" ) func challengeInfo() (res any, err error) { - res = challenge.InfoResp{ + res = challengeapischema.InfoResp{ Result: []any{}, Status: 200, CommandNum: false, diff --git a/internal/handler/api/costume/list.go b/internal/handler/api/costume/list.go index 7a2f99d..40f9dbc 100644 --- a/internal/handler/api/costume/list.go +++ b/internal/handler/api/costume/list.go @@ -1,14 +1,14 @@ package costume import ( - "honoka-chan/internal/schema/api/costume" + costumeapischema "honoka-chan/internal/schema/api/costume" "time" ) func costumeList() (res any, err error) { - res = costume.ListResp{ - Result: costume.ListData{ - CostumeList: []costume.CostumeList{}, + res = costumeapischema.ListResp{ + Result: costumeapischema.ListData{ + CostumeList: []costumeapischema.CostumeList{}, }, Status: 200, CommandNum: false, diff --git a/internal/handler/api/eventscenario/status.go b/internal/handler/api/eventscenario/status.go index d1f313e..7b0ed91 100644 --- a/internal/handler/api/eventscenario/status.go +++ b/internal/handler/api/eventscenario/status.go @@ -2,7 +2,7 @@ package eventscenario import ( "fmt" - "honoka-chan/internal/schema/api/eventscenario" + eventscenarioapischema "honoka-chan/internal/schema/api/eventscenario" "honoka-chan/internal/session" "strings" "time" @@ -14,7 +14,7 @@ func eventScenarioStatus(ctx *gin.Context) (res any, err error) { ss := session.Get(ctx) var eventID []int - eventsList := []eventscenario.EventScenarioList{} + eventsList := []eventscenarioapischema.EventScenarioList{} err = ss.MainEng.Table("event_scenario_m").Cols("event_id").GroupBy("event_id").OrderBy("event_id DESC").Find(&eventID) if ss.CheckErr(err) { return @@ -27,7 +27,7 @@ func eventScenarioStatus(ctx *gin.Context) (res any, err error) { ChapterAsset string `xorm:"chapter_asset"` OpenDate string `xorm:"open_date"` } - chapsList := []eventscenario.ChapterList{} + chapsList := []eventscenarioapischema.ChapterList{} err = ss.MainEng.Table("event_scenario_m").Where("event_id = ?", id).Cols("event_scenario_id,chapter,chapter_asset,open_date"). OrderBy("chapter DESC").Find(&eventRes) if ss.CheckErr(err) { @@ -35,7 +35,7 @@ func eventScenarioStatus(ctx *gin.Context) (res any, err error) { } for _, res := range eventRes { - chapList := eventscenario.ChapterList{ + chapList := eventscenarioapischema.ChapterList{ EventScenarioID: res.EventScenarioId, Chapter: res.Chapter, ChapterAsset: res.ChapterAsset, @@ -49,7 +49,7 @@ func eventScenarioStatus(ctx *gin.Context) (res any, err error) { chapsList = append(chapsList, chapList) } - event := eventscenario.EventScenarioList{ + event := eventscenarioapischema.EventScenarioList{ EventID: id, OpenDate: strings.ReplaceAll(eventRes[0].OpenDate, "/", "-"), ChapterList: chapsList, @@ -67,8 +67,8 @@ func eventScenarioStatus(ctx *gin.Context) (res any, err error) { eventsList = append(eventsList, event) } - res = eventscenario.StatusResp{ - Result: eventscenario.StatusData{ + res = eventscenarioapischema.StatusResp{ + Result: eventscenarioapischema.StatusData{ EventScenarioList: eventsList, }, Status: 200, diff --git a/internal/handler/api/exchange/owningpoint.go b/internal/handler/api/exchange/owningpoint.go index d17077e..6e92c5a 100644 --- a/internal/handler/api/exchange/owningpoint.go +++ b/internal/handler/api/exchange/owningpoint.go @@ -1,7 +1,7 @@ package exchange import ( - "honoka-chan/internal/schema/api/exchange" + exchangeapischema "honoka-chan/internal/schema/api/exchange" "honoka-chan/internal/session" "time" @@ -12,20 +12,20 @@ func owningPoint(ctx *gin.Context) (res any, err error) { ss := session.Get(ctx) var exchangeID []int - exPointsList := []exchange.ExchangePointList{} + exPointsList := []exchangeapischema.ExchangePointList{} err = ss.MainEng.Table("exchange_point_m").Cols("exchange_point_id").OrderBy("exchange_point_id ASC").Find(&exchangeID) if ss.CheckErr(err) { return } for _, id := range exchangeID { - exPointsList = append(exPointsList, exchange.ExchangePointList{ + exPointsList = append(exPointsList, exchangeapischema.ExchangePointList{ Rarity: id, ExchangePoint: 9999, }) } - res = exchange.OwningPointResp{ - Result: exchange.OwningPointData{ + res = exchangeapischema.OwningPointResp{ + Result: exchangeapischema.OwningPointData{ ExchangePointList: exPointsList, }, Status: 200, diff --git a/internal/handler/api/live/schedule.go b/internal/handler/api/live/schedule.go index 7ef5e6f..0cace96 100644 --- a/internal/handler/api/live/schedule.go +++ b/internal/handler/api/live/schedule.go @@ -1,7 +1,7 @@ package live import ( - "honoka-chan/internal/schema/api/live" + liveapischema "honoka-chan/internal/schema/api/live" "honoka-chan/internal/session" "time" @@ -11,42 +11,32 @@ import ( func liveSchedule(ctx *gin.Context) (res any, err error) { ss := session.Get(ctx) - var liveDifficultyID []int - specialLives := []live.SpecialLiveStatusList{} - err = ss.MainEng.Table("special_live_m").Cols("live_difficulty_id").OrderBy("live_difficulty_id ASC").Find(&liveDifficultyID) + var liveID []int + err = ss.MainEng.Table("special_live_m"). + Cols("live_difficulty_id").OrderBy("live_difficulty_id ASC").Find(&liveID) if ss.CheckErr(err) { return } - for _, id := range liveDifficultyID { - specialLive := live.SpecialLiveStatusList{ - LiveDifficultyID: id, - Status: 1, - HiScore: 0, - HiComboCount: 0, - ClearCnt: 0, - AchievedGoalIDList: []int{}, - } - specialLives = append(specialLives, specialLive) - } - livesList := []live.LiveList{} - for _, v := range specialLives { - livesList = append(livesList, live.LiveList{ - LiveDifficultyID: v.LiveDifficultyID, + liveList := []liveapischema.LiveList{} + for _, id := range liveID { + liveList = append(liveList, liveapischema.LiveList{ + LiveDifficultyID: id, StartDate: "2023-01-01 00:00:00", EndDate: "2037-01-01 00:00:00", IsRandom: false, }) } - res = live.ScheduleResp{ - Result: live.ScheduleData{ + + res = liveapischema.ScheduleResp{ + Result: liveapischema.ScheduleData{ EventList: []any{}, - LiveList: livesList, + LiveList: liveList, LimitedBonusList: []any{}, - LimitedBonusCommonList: []live.LimitedBonusCommonList{}, // 特效道具 - RandomLiveList: []live.RandomLiveList{}, // 随机歌曲 + LimitedBonusCommonList: []liveapischema.LimitedBonusCommonList{}, + RandomLiveList: []liveapischema.RandomLiveList{}, FreeLiveList: []any{}, - TrainingLiveList: []live.TrainingLiveList{}, // 挑战歌曲 + TrainingLiveList: []liveapischema.TrainingLiveList{}, }, Status: 200, CommandNum: false, diff --git a/internal/handler/api/live/status.go b/internal/handler/api/live/status.go index 1531833..59c37b1 100644 --- a/internal/handler/api/live/status.go +++ b/internal/handler/api/live/status.go @@ -1,7 +1,7 @@ package live import ( - "honoka-chan/internal/schema/api/live" + liveapischema "honoka-chan/internal/schema/api/live" "honoka-chan/internal/session" "time" @@ -12,13 +12,13 @@ func liveStatus(ctx *gin.Context) (res any, err error) { ss := session.Get(ctx) var liveDifficultyID []int - normalLives := []live.NormalLiveStatusList{} + normalLives := []liveapischema.NormalLiveStatusList{} err = ss.MainEng.Table("normal_live_m").Cols("live_difficulty_id").OrderBy("live_difficulty_id ASC").Find(&liveDifficultyID) if ss.CheckErr(err) { return } for _, id := range liveDifficultyID { - normalLive := live.NormalLiveStatusList{ + normalLive := liveapischema.NormalLiveStatusList{ LiveDifficultyID: id, Status: 1, HiScore: 0, @@ -29,13 +29,13 @@ func liveStatus(ctx *gin.Context) (res any, err error) { normalLives = append(normalLives, normalLive) } - specialLives := []live.SpecialLiveStatusList{} + specialLives := []liveapischema.SpecialLiveStatusList{} err = ss.MainEng.Table("special_live_m").Cols("live_difficulty_id").OrderBy("live_difficulty_id ASC").Find(&liveDifficultyID) if ss.CheckErr(err) { return } for _, id := range liveDifficultyID { - specialLive := live.SpecialLiveStatusList{ + specialLive := liveapischema.SpecialLiveStatusList{ LiveDifficultyID: id, Status: 1, HiScore: 0, @@ -46,11 +46,11 @@ func liveStatus(ctx *gin.Context) (res any, err error) { specialLives = append(specialLives, specialLive) } - res = live.StatusResp{ - Result: live.StatusData{ + res = liveapischema.StatusResp{ + Result: liveapischema.StatusData{ NormalLiveStatusList: normalLives, SpecialLiveStatusList: specialLives, - TrainingLiveStatusList: []live.TrainingLiveStatusList{}, + TrainingLiveStatusList: []liveapischema.TrainingLiveStatusList{}, MarathonLiveStatusList: []any{}, FreeLiveStatusList: []any{}, CanResumeLive: false, diff --git a/internal/handler/api/liveicon/info.go b/internal/handler/api/liveicon/info.go index 6d2a2de..6138c2c 100644 --- a/internal/handler/api/liveicon/info.go +++ b/internal/handler/api/liveicon/info.go @@ -1,13 +1,13 @@ package liveicon import ( - "honoka-chan/internal/schema/api/liveicon" + liveiconapischema "honoka-chan/internal/schema/api/liveicon" "time" ) func liveIconInfo() (res any, err error) { - res = liveicon.InfoResp{ - Result: liveicon.InfoData{ + res = liveiconapischema.InfoResp{ + Result: liveiconapischema.InfoData{ LiveNotesIconList: []int{1, 2, 3}, }, Status: 200, diff --git a/internal/handler/api/livese/info.go b/internal/handler/api/livese/info.go index 9b8ad46..c2e2fc6 100644 --- a/internal/handler/api/livese/info.go +++ b/internal/handler/api/livese/info.go @@ -1,13 +1,13 @@ package livese import ( - "honoka-chan/internal/schema/api/livese" + liveseapischema "honoka-chan/internal/schema/api/livese" "time" ) func LiveSeInfo() (res any, err error) { - res = livese.InfoResp{ - Result: livese.InfoData{ + res = liveseapischema.InfoResp{ + Result: liveseapischema.InfoData{ LiveSeList: []int{1, 2, 3}, }, Status: 200, diff --git a/internal/handler/api/login/topinfo.go b/internal/handler/api/login/topinfo.go index 48f6ba7..bfb9ede 100644 --- a/internal/handler/api/login/topinfo.go +++ b/internal/handler/api/login/topinfo.go @@ -1,13 +1,13 @@ package login import ( - "honoka-chan/internal/schema/api/login" + loginapischema "honoka-chan/internal/schema/api/login" "time" ) func loginTopInfo() (res any, err error) { - res = login.TopInfoResp{ - Result: login.TopInfoData{ + res = loginapischema.TopInfoResp{ + Result: loginapischema.TopInfoData{ FriendActionCnt: 0, FriendGreetCnt: 0, FriendVarietyCnt: 0, @@ -21,7 +21,7 @@ func loginTopInfo() (res any, err error) { FriendsApprovalWaitCnt: 0, FriendsRequestCnt: 0, IsTodayBirthday: false, - LicenseInfo: login.LicenseInfo{ + LicenseInfo: loginapischema.LicenseInfo{ LicenseList: []any{}, LicensedInfo: []any{}, ExpiredInfo: []any{}, diff --git a/internal/handler/api/login/topinfoonce.go b/internal/handler/api/login/topinfoonce.go index 73f9578..f336a8b 100644 --- a/internal/handler/api/login/topinfoonce.go +++ b/internal/handler/api/login/topinfoonce.go @@ -1,19 +1,19 @@ package login import ( - "honoka-chan/internal/schema/api/login" + loginapischema "honoka-chan/internal/schema/api/login" "time" ) func loginTopInfoOnce() (res any, err error) { - res = login.TopInfoOnceResp{ - Result: login.TopInfoOnceData{ + res = loginapischema.TopInfoOnceResp{ + Result: loginapischema.TopInfoOnceData{ NewAchievementCnt: 0, UnaccomplishedAchievementCnt: 0, LiveDailyRewardExist: false, TrainingEnergy: 10, TrainingEnergyMax: 10, - Notification: login.Notification{ + Notification: loginapischema.Notification{ Push: false, Lp: false, UpdateInfo: false, diff --git a/internal/handler/api/marathon/info.go b/internal/handler/api/marathon/info.go index 55a1859..2fdab8c 100644 --- a/internal/handler/api/marathon/info.go +++ b/internal/handler/api/marathon/info.go @@ -1,12 +1,12 @@ package marathon import ( - "honoka-chan/internal/schema/api/marathon" + marathonapischema "honoka-chan/internal/schema/api/marathon" "time" ) func marathonInfo() (res any, err error) { - res = marathon.InfoResp{ + res = marathonapischema.InfoResp{ Result: []any{}, Status: 200, CommandNum: false, diff --git a/internal/handler/api/multiunit/scenariostatus.go b/internal/handler/api/multiunit/scenariostatus.go index 2af2205..fea27d0 100644 --- a/internal/handler/api/multiunit/scenariostatus.go +++ b/internal/handler/api/multiunit/scenariostatus.go @@ -1,7 +1,7 @@ package multiunit import ( - "honoka-chan/internal/schema/api/multiunit" + multiunitapischema "honoka-chan/internal/schema/api/multiunit" "honoka-chan/internal/session" "strings" "time" @@ -13,7 +13,7 @@ func MultiUnitScenarioStatus(ctx *gin.Context) (res any, err error) { ss := session.Get(ctx) var statusID []int - multiUnitsList := []multiunit.StatusList{} + multiUnitsList := []multiunitapischema.StatusList{} err = ss.MainEng.Table("multi_unit_scenario_m").Cols("multi_unit_id").GroupBy("multi_unit_id").OrderBy("multi_unit_id ASC").Find(&statusID) if ss.CheckErr(err) { return @@ -34,12 +34,12 @@ func MultiUnitScenarioStatus(ctx *gin.Context) (res any, err error) { return } - multiUnitsList = append(multiUnitsList, multiunit.StatusList{ + multiUnitsList = append(multiUnitsList, multiunitapischema.StatusList{ MultiUnitID: id, Status: 2, MultiUnitScenarioBtnAsset: multiRes.MultiUnitScenarioBtnAsset, OpenDate: strings.ReplaceAll(multiRes.OpenDate, "/", "-"), - ChapterList: []multiunit.ChapterList{ + ChapterList: []multiunitapischema.ChapterList{ { MultiUnitScenarioID: multiRes.MultiUnitScenarioId, Chapter: multiRes.Chapter, @@ -48,8 +48,8 @@ func MultiUnitScenarioStatus(ctx *gin.Context) (res any, err error) { }, }) } - res = multiunit.StatusResp{ - Result: multiunit.StatusData{ + res = multiunitapischema.StatusResp{ + Result: multiunitapischema.StatusData{ MultiUnitScenarioStatusList: multiUnitsList, UnlockedMultiUnitScenarioIds: []any{}, }, diff --git a/internal/handler/api/museum/info.go b/internal/handler/api/museum/info.go index ea4746d..4d99bee 100644 --- a/internal/handler/api/museum/info.go +++ b/internal/handler/api/museum/info.go @@ -1,7 +1,7 @@ package museum import ( - "honoka-chan/internal/schema/api/museum" + museumapischema "honoka-chan/internal/schema/api/museum" "honoka-chan/internal/session" "time" @@ -31,10 +31,10 @@ func museumInfo(ctx *gin.Context) (res any, err error) { coolBuff += res.CoolBuff museumID = append(museumID, res.MuseumContentsId) } - res = museum.InfoResp{ - Result: museum.InfoData{ - MuseumInfo: museum.Info{ - Parameter: museum.Parameter{ + res = museumapischema.InfoResp{ + Result: museumapischema.InfoData{ + MuseumInfo: museumapischema.Info{ + Parameter: museumapischema.Parameter{ Smile: smileBuff, Pure: pureBuff, Cool: coolBuff, diff --git a/internal/handler/api/navigation/specialcutin.go b/internal/handler/api/navigation/specialcutin.go index 2834177..998524f 100644 --- a/internal/handler/api/navigation/specialcutin.go +++ b/internal/handler/api/navigation/specialcutin.go @@ -1,13 +1,13 @@ package navigation import ( - "honoka-chan/internal/schema/api/navigation" + navigationapischema "honoka-chan/internal/schema/api/navigation" "time" ) func SpecialCutin() (res any, err error) { - res = navigation.SpecialCutinResp{ - Result: navigation.SpecialCutinData{ + res = navigationapischema.SpecialCutinResp{ + Result: navigationapischema.SpecialCutinData{ SpecialCutinList: []any{}, }, Status: 200, diff --git a/internal/handler/api/notice/marquee.go b/internal/handler/api/notice/marquee.go index a037ba1..16aa61e 100644 --- a/internal/handler/api/notice/marquee.go +++ b/internal/handler/api/notice/marquee.go @@ -1,13 +1,13 @@ package notice import ( - "honoka-chan/internal/schema/api/notice" + noticeapischema "honoka-chan/internal/schema/api/notice" "time" ) func noticeMarquee() (res any, err error) { - res = notice.MarqueeResp{ - Result: notice.MarqueeData{ + res = noticeapischema.MarqueeResp{ + Result: noticeapischema.MarqueeData{ ItemCount: 0, MarqueeList: []any{}, }, diff --git a/internal/handler/api/payment/productlist.go b/internal/handler/api/payment/productlist.go index 3b6a400..a2e6fe5 100644 --- a/internal/handler/api/payment/productlist.go +++ b/internal/handler/api/payment/productlist.go @@ -1,25 +1,25 @@ package payment import ( - "honoka-chan/internal/schema/api/payment" + paymentapischema "honoka-chan/internal/schema/api/payment" "time" ) func productList() (res any, err error) { - res = payment.ProductListResp{ - Result: payment.ProductListData{ - RestrictionInfo: payment.RestrictionInfo{ + res = paymentapischema.ProductListResp{ + Result: paymentapischema.ProductListData{ + RestrictionInfo: paymentapischema.RestrictionInfo{ Restricted: false, }, - UnderAgeInfo: payment.UnderAgeInfo{ + UnderAgeInfo: paymentapischema.UnderAgeInfo{ BirthSet: false, HasLimit: false, LimitAmount: nil, MonthUsed: 0, }, - SnsProductList: []payment.SnsProduct{}, - ProductList: []payment.Product{}, - SubscriptionList: []payment.Subscription{}, + SnsProductList: []paymentapischema.SnsProduct{}, + ProductList: []paymentapischema.Product{}, + SubscriptionList: []paymentapischema.Subscription{}, ShowPointShop: false, }, Status: 200, diff --git a/internal/handler/api/profile/cardranking.go b/internal/handler/api/profile/cardranking.go index 4b88bb3..53e9c19 100644 --- a/internal/handler/api/profile/cardranking.go +++ b/internal/handler/api/profile/cardranking.go @@ -2,7 +2,7 @@ package profile import ( "encoding/json" - "honoka-chan/internal/schema/api/profile" + profileapischema "honoka-chan/internal/schema/api/profile" honokautils "honoka-chan/pkg/utils" "time" ) @@ -15,7 +15,7 @@ func cardRanking() (res any, err error) { return nil, err } - res = profile.CardRankingResp{ + res = profileapischema.CardRankingResp{ Result: result, Status: 200, CommandNum: false, diff --git a/internal/handler/api/profile/info.go b/internal/handler/api/profile/info.go index a11812b..065abe4 100644 --- a/internal/handler/api/profile/info.go +++ b/internal/handler/api/profile/info.go @@ -1,8 +1,9 @@ package profile import ( - "honoka-chan/internal/model/user" - "honoka-chan/internal/schema/api/profile" + unitmodel "honoka-chan/internal/model/unit" + usermodel "honoka-chan/internal/model/user" + profileapischema "honoka-chan/internal/schema/api/profile" "honoka-chan/internal/session" "time" @@ -12,57 +13,25 @@ import ( func profileInfo(ctx *gin.Context) (res any, err error) { ss := session.Get(ctx) - pref := user.UserPref{} + pref := usermodel.UserPref{} _, err = ss.UserEng.Table("user_pref").Where("user_id = ?", ss.UserID).Get(&pref) if err != nil { return nil, err } - commonUnit, err := ss.MainEng.Table("common_unit_m").Count() + unitCount, err := ss.UserEng.Table(new(usermodel.UserUnitData)). + Where("user_id = ?", ss.UserID).Count() if err != nil { return nil, err } - userUnit, err := ss.UserEng.Table("user_unit").Where("user_id = ?", ss.UserID).Count() + unitData := unitmodel.UnitDataMap{} + _, err = ss.GetBasicUnitInfo(). + Where("a.unit_owning_user_id = ?", pref.UnitOwningUserID).Get(&unitData) if err != nil { return nil, err } - unitData := profile.UnitData{} - exists, err := ss.MainEng.Table("common_unit_m").Where("unit_owning_user_id = ?", pref.UnitOwningUserID).Get(&unitData) - if err != nil { - return nil, err - } - - isCommon := true - if !exists { - _, err = ss.UserEng.Table("user_unit"). - Where("unit_owning_user_id = ? AND user_id = ?", pref.UnitOwningUserID, ss.UserID).Get(&unitData) - if err != nil { - return nil, err - } - isCommon = false - } - - var attrId, maxHp, baseSmile, basePure, baseCool int - var smileMax, pureMax, coolMax int - if isCommon { - // 公共卡片仅为100级属性 - _, err = ss.MainEng.Table("unit_m").Where("unit_id = ?", unitData.UnitID). - Cols("attribute_id,hp_max,smile_max,pure_max,cool_max").Get(&attrId, &maxHp, &baseSmile, &basePure, &baseCool) - if err != nil { - return nil, err - } - - // 偷懒起见不计算饰品、宝石、回忆画廊等属性加成 - smileMax = baseSmile - pureMax = basePure - coolMax = baseCool - // } else { - // // 用户卡片需要根据等级计算属性 - // // TODO - } - var accessoryOwningId, accessoryId, exp int _, err = ss.UserEng.Table("user_accessory_wear").Where("unit_owning_user_id = ? AND user_id = ?", pref.UnitOwningUserID, ss.UserID). Cols("accessory_owning_user_id").Get(&accessoryOwningId) @@ -74,7 +43,7 @@ func profileInfo(ctx *gin.Context) (res any, err error) { if err != nil { return nil, err } - accessoryInfo := profile.AccessoryInfo{ + accessoryInfo := profileapischema.AccessoryInfo{ AccessoryOwningUserID: accessoryOwningId, AccessoryID: accessoryId, Exp: exp, @@ -92,9 +61,9 @@ func profileInfo(ctx *gin.Context) (res any, err error) { return nil, err } - res = profile.InfoResp{ - Result: profile.InfoData{ - UserInfo: profile.UserInfo{ + res = profileapischema.InfoResp{ + Result: profileapischema.InfoData{ + UserInfo: profileapischema.UserInfo{ UserID: pref.UserID, Name: pref.UserName, Level: pref.UserLevel, @@ -102,16 +71,17 @@ func profileInfo(ctx *gin.Context) (res any, err error) { UnitMax: 5000, EnergyMax: 417, FriendMax: 99, - UnitCnt: int(commonUnit + userUnit), + UnitCnt: int(unitCount), InviteCode: pref.InviteCode, ElapsedTimeFromLogin: "14\u5c0f\u65f6\u524d", Introduction: pref.UserDesc, }, - CenterUnitInfo: profile.CenterUnitInfo{ + // TODO: 区分队伍中心卡片和看板卡片 + CenterUnitInfo: profileapischema.CenterUnitInfo{ UnitOwningUserID: unitData.UnitOwningUserID, UnitID: unitData.UnitID, Exp: unitData.Exp, - NextExp: unitData.NextExp, + NextExp: 0, Level: unitData.Level, LevelLimitID: unitData.LevelLimitID, MaxLevel: unitData.MaxLevel, @@ -125,10 +95,10 @@ func profileInfo(ctx *gin.Context) (res any, err error) { DisplayRank: unitData.DisplayRank, UnitSkillExp: unitData.UnitSkillExp, UnitRemovableSkillCapacity: unitData.UnitRemovableSkillCapacity, - Attribute: attrId, - Smile: baseSmile, - Cute: basePure, - Cool: baseCool, + Attribute: unitData.Attribute, + Smile: unitData.Smile, + Cute: unitData.Cute, + Cool: unitData.Cool, IsLoveMax: unitData.IsLoveMax, IsLevelMax: unitData.IsLevelMax, IsRankMax: unitData.IsRankMax, @@ -137,17 +107,17 @@ func profileInfo(ctx *gin.Context) (res any, err error) { SettingAwardID: pref.AwardID, RemovableSkillIds: removeSkillIds, AccessoryInfo: accessoryInfo, - Costume: profile.Costume{}, - TotalSmile: smileMax, - TotalCute: pureMax, - TotalCool: coolMax, - TotalHp: maxHp, + Costume: profileapischema.Costume{}, + TotalSmile: unitData.Smile, // TODO: 加成计算 + TotalCute: unitData.Cute, // 同上 + TotalCool: unitData.Cool, // 同上 + TotalHp: unitData.MaxHp, }, - NaviUnitInfo: profile.NaviUnitInfo{ + NaviUnitInfo: profileapischema.NaviUnitInfo{ UnitOwningUserID: unitData.UnitOwningUserID, UnitID: unitData.UnitID, Exp: unitData.Exp, - NextExp: unitData.NextExp, + NextExp: 0, Level: unitData.Level, MaxLevel: unitData.MaxLevel, LevelLimitID: unitData.LevelLimitID, @@ -168,10 +138,10 @@ func profileInfo(ctx *gin.Context) (res any, err error) { IsSkillLevelMax: unitData.IsSkillLevelMax, IsRemovableSkillCapacityMax: unitData.IsRemovableSkillCapacityMax, InsertDate: "2016-10-11 10:33:03", - TotalSmile: smileMax, - TotalCute: pureMax, - TotalCool: coolMax, - TotalHp: maxHp, + TotalSmile: unitData.Smile, // TODO: 加成计算 + TotalCute: unitData.Cute, // 同上 + TotalCool: unitData.Cool, // 同上 + TotalHp: unitData.MaxHp, RemovableSkillIds: removeSkillIds, }, IsAlliance: false, diff --git a/internal/handler/api/profile/livecnt.go b/internal/handler/api/profile/livecnt.go index 357bba6..6eb0cfe 100644 --- a/internal/handler/api/profile/livecnt.go +++ b/internal/handler/api/profile/livecnt.go @@ -1,13 +1,13 @@ package profile import ( - "honoka-chan/internal/schema/api/profile" + profileapischema "honoka-chan/internal/schema/api/profile" "time" ) func liveCnt() (res any, err error) { - res = profile.LiveCntResp{ - Result: []profile.LiveCntData{ + res = profileapischema.LiveCntResp{ + Result: []profileapischema.LiveCntData{ { Difficulty: 1, ClearCnt: 315, diff --git a/internal/handler/api/scenario/status.go b/internal/handler/api/scenario/status.go index c821475..6ea1b73 100644 --- a/internal/handler/api/scenario/status.go +++ b/internal/handler/api/scenario/status.go @@ -1,7 +1,7 @@ package scenario import ( - "honoka-chan/internal/schema/api/scenario" + scenarioapischema "honoka-chan/internal/schema/api/scenario" "honoka-chan/internal/session" "time" @@ -12,20 +12,20 @@ func scenarioStatus(ctx *gin.Context) (res any, err error) { ss := session.Get(ctx) var scenarioID []int - scenarioLists := []scenario.StatusList{} + scenarioLists := []scenarioapischema.StatusList{} err = ss.MainEng.Table("scenario_m").Cols("scenario_id").OrderBy("scenario_id ASC").Find(&scenarioID) if ss.CheckErr(err) { return } for _, id := range scenarioID { - scenarioLists = append(scenarioLists, scenario.StatusList{ + scenarioLists = append(scenarioLists, scenarioapischema.StatusList{ ScenarioID: id, Status: 2, }) } - res = scenario.StatusResp{ - Result: scenario.StatusData{ + res = scenarioapischema.StatusResp{ + Result: scenarioapischema.StatusData{ ScenarioStatusList: scenarioLists, }, Status: 200, diff --git a/internal/handler/api/subscenario/status.go b/internal/handler/api/subscenario/status.go index 8d28fa2..1da7bc4 100644 --- a/internal/handler/api/subscenario/status.go +++ b/internal/handler/api/subscenario/status.go @@ -1,7 +1,7 @@ package subscenario import ( - "honoka-chan/internal/schema/api/subscenario" + subscenarioapischema "honoka-chan/internal/schema/api/subscenario" "honoka-chan/internal/session" "time" @@ -12,20 +12,20 @@ func subscenarioStatus(ctx *gin.Context) (res any, err error) { ss := session.Get(ctx) var subScenarioID []int - subScenarioLists := []subscenario.StatusList{} + subScenarioLists := []subscenarioapischema.StatusList{} err = ss.MainEng.Table("subscenario_m").Cols("subscenario_id").OrderBy("subscenario_id ASC").Find(&subScenarioID) if ss.CheckErr(err) { return } for _, id := range subScenarioID { - subScenarioLists = append(subScenarioLists, subscenario.StatusList{ + subScenarioLists = append(subScenarioLists, subscenarioapischema.StatusList{ SubscenarioID: id, Status: 2, }) } - res = subscenario.StatusResp{ - Result: subscenario.StatusData{ + res = subscenarioapischema.StatusResp{ + Result: subscenarioapischema.StatusData{ SubscenarioStatusList: subScenarioLists, UnlockedSubscenarioIds: []any{}, }, diff --git a/internal/handler/api/unit/accessoryall.go b/internal/handler/api/unit/accessoryall.go index 29395f0..a6e2489 100644 --- a/internal/handler/api/unit/accessoryall.go +++ b/internal/handler/api/unit/accessoryall.go @@ -1,7 +1,7 @@ package unit import ( - "honoka-chan/internal/schema/api/unit" + unitapischema "honoka-chan/internal/schema/api/unit" "honoka-chan/internal/session" "time" @@ -11,7 +11,7 @@ import ( func unitAccessoryAll(ctx *gin.Context) (res any, err error) { ss := session.Get(ctx) - accessoryList := []unit.AccessoryList{} + accessoryList := []unitapischema.AccessoryList{} err = ss.MainEng.Table("common_accessory_m").Find(&accessoryList) if ss.CheckErr(err) { return @@ -23,13 +23,13 @@ func unitAccessoryAll(ctx *gin.Context) (res any, err error) { accessoryList[k].RankUpCount = 4 accessoryList[k].FavoriteFlag = true } - wearingInfo := []unit.WearingInfo{} + wearingInfo := []unitapischema.WearingInfo{} err = ss.UserEng.Table("user_accessory_wear").Where("user_id = ?", ss.UserID).Find(&wearingInfo) if ss.CheckErr(err) { return } - res = unit.AccessoryAllResp{ - Result: unit.AccessoryAllData{ + res = unitapischema.AccessoryAllResp{ + Result: unitapischema.AccessoryAllData{ AccessoryList: accessoryList, WearingInfo: wearingInfo, EspecialCreateFlag: false, diff --git a/internal/handler/api/unit/accessorymaterialall.go b/internal/handler/api/unit/accessorymaterialall.go new file mode 100644 index 0000000..474215f --- /dev/null +++ b/internal/handler/api/unit/accessorymaterialall.go @@ -0,0 +1,17 @@ +package unit + +import ( + unitapischema "honoka-chan/internal/schema/api/unit" + "time" +) + +func unitAccessoryMaterialAll() (res any, err error) { + res = unitapischema.AccessoryMaterialAllResp{ + Result: unitapischema.AccessoryMaterialAllData{}, + Status: 200, + CommandNum: false, + TimeStamp: time.Now().Unix(), + } + + return res, err +} diff --git a/internal/handler/api/unit/accessorytab.go b/internal/handler/api/unit/accessorytab.go new file mode 100644 index 0000000..30d9c67 --- /dev/null +++ b/internal/handler/api/unit/accessorytab.go @@ -0,0 +1,20 @@ +package unit + +import ( + "encoding/json" + unitapischema "honoka-chan/internal/schema/api/unit" + honokautils "honoka-chan/pkg/utils" + "time" +) + +func unitAccessoryTab() (res any, err error) { + data := honokautils.ReadAllText("assets/serverdata/accessoryTab.json") + resp := unitapischema.AccessoryTabResp{} + err = json.Unmarshal([]byte(data), &resp) + if err != nil { + return nil, err + } + resp.TimeStamp = time.Now().Unix() + + return resp, err +} diff --git a/internal/handler/api/unit/all.go b/internal/handler/api/unit/all.go index 4649331..dba7dd4 100644 --- a/internal/handler/api/unit/all.go +++ b/internal/handler/api/unit/all.go @@ -1,7 +1,8 @@ package unit import ( - "honoka-chan/internal/schema/api/unit" + unitmodel "honoka-chan/internal/model/unit" + unitapischema "honoka-chan/internal/schema/api/unit" "honoka-chan/internal/session" "time" @@ -11,23 +12,48 @@ import ( func unitAll(ctx *gin.Context) (res any, err error) { ss := session.Get(ctx) - unitsData := []unit.Active{} - err = ss.MainEng.Table("common_unit_m").Find(&unitsData) + unitMap := []unitmodel.UnitDataMap{} + err = ss.GetBasicUnitInfo(). + Where("a.user_id = ?", ss.UserID).Find(&unitMap) if ss.CheckErr(err) { return } - userUnits := []unit.Active{} - err = ss.UserEng.Table("user_unit").Where("user_id = ?", ss.UserID).Find(&userUnits) - if ss.CheckErr(err) { - return + unitsData := []unitapischema.Active{} + for _, u := range unitMap { + unitsData = append(unitsData, unitapischema.Active{ + UnitOwningUserID: u.UnitOwningUserID, + UserID: ss.UserID, + UnitID: u.UnitID, + Exp: u.Exp, + NextExp: 0, + Level: u.Level, + MaxLevel: u.MaxLevel, + LevelLimitID: u.LevelLimitID, + Rank: u.Rank, + MaxRank: u.MaxRank, + Love: u.Love, + MaxLove: u.MaxLove, + UnitSkillExp: u.UnitSkillExp, + UnitSkillLevel: u.UnitSkillLevel, + MaxHp: u.MaxHp, + UnitRemovableSkillCapacity: u.UnitRemovableSkillCapacity, + FavoriteFlag: u.FavoriteFlag, + DisplayRank: u.DisplayRank, + IsRankMax: u.IsRankMax, + IsLoveMax: u.IsLoveMax, + IsLevelMax: u.IsLevelMax, + IsSigned: u.IsSigned, + IsSkillLevelMax: u.IsSkillLevelMax, + IsRemovableSkillCapacityMax: u.IsRemovableSkillCapacityMax, + InsertDate: "2023-03-20 03:58:55", + }) } - unitsData = append(unitsData, userUnits...) - res = unit.AllResp{ - Result: unit.AllData{ + res = unitapischema.AllResp{ + Result: unitapischema.AllData{ Active: unitsData, - Waiting: []unit.Waiting{}, + Waiting: []unitapischema.Waiting{}, }, Status: 200, CommandNum: false, diff --git a/internal/handler/api/unit/deckinfo.go b/internal/handler/api/unit/deckinfo.go index 3ac93f8..064f07f 100644 --- a/internal/handler/api/unit/deckinfo.go +++ b/internal/handler/api/unit/deckinfo.go @@ -1,7 +1,7 @@ package unit import ( - "honoka-chan/internal/schema/api/unit" + unitapischema "honoka-chan/internal/schema/api/unit" "honoka-chan/internal/session" "time" @@ -11,23 +11,23 @@ import ( func unitDeckInfo(ctx *gin.Context) (res any, err error) { ss := session.Get(ctx) - userDeck := []unit.UserDeckData{} + userDeck := []unitapischema.UserDeckData{} err = ss.UserEng.Table("user_deck").Where("user_id = ?", ss.UserID).Asc("deck_id").Find(&userDeck) if ss.CheckErr(err) { return } - unitDeckInfo := []unit.DeckInfoData{} + unitDeckInfo := []unitapischema.DeckInfoData{} for _, deck := range userDeck { - deckUnit := []unit.UnitDeckData{} + deckUnit := []unitapischema.UnitDeckData{} err = ss.UserEng.Table("user_deck_unit").Where("user_deck_id = ?", deck.ID).Asc("position").Find(&deckUnit) if ss.CheckErr(err) { return } - oUID := []unit.UnitOwningUserIds{} + oUID := []unitapischema.UnitOwningUserIds{} for _, u := range deckUnit { - oUID = append(oUID, unit.UnitOwningUserIds{ + oUID = append(oUID, unitapischema.UnitOwningUserIds{ Position: u.Position, UnitOwningUserID: u.UnitOwningUserID, }) @@ -37,14 +37,14 @@ func unitDeckInfo(ctx *gin.Context) (res any, err error) { if deck.MainFlag == 1 { mainFlag = true } - unitDeckInfo = append(unitDeckInfo, unit.DeckInfoData{ + unitDeckInfo = append(unitDeckInfo, unitapischema.DeckInfoData{ UnitDeckID: deck.DeckID, MainFlag: mainFlag, DeckName: deck.DeckName, UnitOwningUserIds: oUID, }) } - res = unit.DeckInfoResp{ + res = unitapischema.DeckInfoResp{ Result: unitDeckInfo, Status: 200, CommandNum: false, diff --git a/internal/handler/api/unit/removableskillinfo.go b/internal/handler/api/unit/removableskillinfo.go index 99d49a6..a508479 100644 --- a/internal/handler/api/unit/removableskillinfo.go +++ b/internal/handler/api/unit/removableskillinfo.go @@ -1,7 +1,7 @@ package unit import ( - "honoka-chan/internal/schema/api/unit" + unitapischema "honoka-chan/internal/schema/api/unit" "honoka-chan/internal/session" "time" @@ -11,7 +11,7 @@ import ( func unitRemovableSkillInfo(ctx *gin.Context) (res any, err error) { ss := session.Get(ctx) - var skillEquipCount []unit.SkillEquipCount + var skillEquipCount []unitapischema.SkillEquipCount err = ss.UserEng.Table("user_unit_skill_equip").Where("user_id = ?", ss.UserID).Select("unit_removable_skill_id,COUNT(*) AS ct"). GroupBy("unit_removable_skill_id").Find(&skillEquipCount) if ss.CheckErr(err) { @@ -24,12 +24,12 @@ func unitRemovableSkillInfo(ctx *gin.Context) (res any, err error) { return } - owingInfo := []unit.OwningInfo{} + owingInfo := []unitapischema.OwningInfo{} for _, id := range rmSkillIds { - info := unit.OwningInfo{ + info := unitapischema.OwningInfo{ UnitRemovableSkillID: id, - TotalAmount: 9, - EquippedAmount: 0, + TotalAmount: 999, + EquippedAmount: 0, // TODO: 计算实际数量 InsertDate: "2023-01-01 12:00:00", } for _, sk := range skillEquipCount { @@ -49,21 +49,21 @@ func unitRemovableSkillInfo(ctx *gin.Context) (res any, err error) { equipInfo := map[int]any{} for _, v := range unitOwningIds { - detail := []unit.SkillEquipDetail{} + detail := []unitapischema.SkillEquipDetail{} err = ss.UserEng.Table("user_unit_skill_equip").Where("user_id = ? AND unit_owning_user_id = ?", ss.UserID, v). Cols("unit_removable_skill_id").Find(&detail) if ss.CheckErr(err) { return } - equipInfo[v] = unit.SkillEquipList{ + equipInfo[v] = unitapischema.SkillEquipList{ UnitOwningUserID: v, Detail: detail, } } - res = unit.RemovableSkillInfoResp{ - Result: unit.RemovableSkillInfoData{ + res = unitapischema.RemovableSkillInfoResp{ + Result: unitapischema.RemovableSkillInfoData{ OwningInfo: owingInfo, EquipmentInfo: equipInfo, }, // 宝石 diff --git a/internal/handler/api/unit/supporterall.go b/internal/handler/api/unit/supporterall.go index 9b6fb61..1d2dc05 100644 --- a/internal/handler/api/unit/supporterall.go +++ b/internal/handler/api/unit/supporterall.go @@ -1,14 +1,14 @@ package unit import ( - "honoka-chan/internal/schema/api/unit" + unitapischema "honoka-chan/internal/schema/api/unit" "time" ) func unitSupporterAll() (res any, err error) { - res = unit.SupporterAllResp{ - Result: unit.SupporterAllData{ - UnitSupportList: []unit.SupporterList{}, + res = unitapischema.SupporterAllResp{ + Result: unitapischema.SupporterAllData{ + UnitSupportList: []unitapischema.SupporterList{}, }, // 练习道具 Status: 200, CommandNum: false, diff --git a/internal/handler/api/unit/unit.go b/internal/handler/api/unit/unit.go index 2ed19fa..e282743 100644 --- a/internal/handler/api/unit/unit.go +++ b/internal/handler/api/unit/unit.go @@ -10,6 +10,10 @@ func UnitApi(ctx *gin.Context, action string) (res any, err error) { switch action { case "accessoryAll": res, err = unitAccessoryAll(ctx) + case "accessoryMaterialAll": + res, err = unitAccessoryMaterialAll() + case "accessoryTab": + res, err = unitAccessoryTab() case "deckInfo": res, err = unitDeckInfo(ctx) case "removableSkillInfo": diff --git a/internal/handler/api/user/getnavi.go b/internal/handler/api/user/getnavi.go index 9520705..8236e29 100644 --- a/internal/handler/api/user/getnavi.go +++ b/internal/handler/api/user/getnavi.go @@ -1,7 +1,7 @@ package user import ( - "honoka-chan/internal/schema/api/user" + userapischema "honoka-chan/internal/schema/api/user" "honoka-chan/internal/session" "time" @@ -17,9 +17,9 @@ func userGetNavi(ctx *gin.Context) (res any, err error) { return } - res = user.GetNaviResp{ - Result: user.GetNaviData{ - User: user.User{ + res = userapischema.GetNaviResp{ + Result: userapischema.GetNaviData{ + User: userapischema.User{ UserID: uID, UnitOwningUserID: oID, }, diff --git a/internal/handler/api/user/info.go b/internal/handler/api/user/info.go index 67c6d8e..fd61b8f 100644 --- a/internal/handler/api/user/info.go +++ b/internal/handler/api/user/info.go @@ -1,7 +1,7 @@ package user import ( - "honoka-chan/internal/model/user" + usermodel "honoka-chan/internal/model/user" userapischema "honoka-chan/internal/schema/api/user" "honoka-chan/internal/session" "time" @@ -12,43 +12,14 @@ import ( func userInfo(ctx *gin.Context) (res any, err error) { ss := session.Get(ctx) - pref := user.UserPref{} + pref := usermodel.UserPref{} _, err = ss.UserEng.Table("user_pref").Where("user_id = ?", ss.UserID).Get(&pref) if err != nil { return nil, err } res = userapischema.InfoResp{ - Result: userapischema.UserInfo{ - UserID: ss.UserID, - Name: pref.UserName, - Level: pref.UserLevel, - Exp: 1089696, - PreviousExp: 0, - NextExp: 1207185, - GameCoin: 999999999, - SnsCoin: 100000, - FreeSnsCoin: 50000, - PaidSnsCoin: 50000, - SocialPoint: 1438395, - UnitMax: 5000, - WaitingUnitMax: 1000, - EnergyMax: 417, - EnergyFullTime: "2023-03-20 03:58:55", - LicenseLiveEnergyRecoverlyTime: 60, - EnergyFullNeedTime: 0, - OverMaxEnergy: 417, - TrainingEnergy: 100, - TrainingEnergyMax: 100, - FriendMax: 99, - InviteCode: pref.InviteCode, - InsertDate: "2015-08-10 18:58:30", - UpdateDate: "2018-08-09 18:13:12", - TutorialState: -1, - DiamondCoin: 0, - CrystalCoin: 0, - LpRecoveryItem: []userapischema.LpRecoveryItem{}, - }, + Result: ss.GetUserInfo(), Status: 200, CommandNum: false, TimeStamp: time.Now().Unix(), diff --git a/internal/handler/award/set.go b/internal/handler/award/set.go index f554d10..da2fca3 100644 --- a/internal/handler/award/set.go +++ b/internal/handler/award/set.go @@ -2,9 +2,9 @@ package award import ( "honoka-chan/internal/middleware" - "honoka-chan/internal/model/user" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" - "honoka-chan/internal/schema/award" + awardschema "honoka-chan/internal/schema/award" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -16,7 +16,7 @@ func set(ctx *gin.Context) { defer ss.Finalize() reqData := gjson.Parse(ctx.MustGet("request_data").(string)) - pref := user.UserPref{ + pref := usermodel.UserPref{ AwardID: int(reqData.Get("award_id").Int()), } @@ -25,7 +25,7 @@ func set(ctx *gin.Context) { return } - ss.Respond(award.SetResp{ + ss.Respond(awardschema.SetResp{ ResponseData: []any{}, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/background/set.go b/internal/handler/background/set.go index 4cfca5a..36d705d 100644 --- a/internal/handler/background/set.go +++ b/internal/handler/background/set.go @@ -2,9 +2,9 @@ package background import ( "honoka-chan/internal/middleware" - "honoka-chan/internal/model/user" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" - "honoka-chan/internal/schema/background" + backgroundschema "honoka-chan/internal/schema/background" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -16,7 +16,7 @@ func set(ctx *gin.Context) { defer ss.Finalize() reqData := gjson.Parse(ctx.MustGet("request_data").(string)) - pref := user.UserPref{ + pref := usermodel.UserPref{ BackgroundID: int(reqData.Get("background_id").Int()), } @@ -25,7 +25,7 @@ func set(ctx *gin.Context) { return } - ss.Respond(background.SetResp{ + ss.Respond(backgroundschema.SetResp{ ResponseData: []any{}, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/download/additional.go b/internal/handler/download/additional.go index 59930a8..e4ebfe7 100644 --- a/internal/handler/download/additional.go +++ b/internal/handler/download/additional.go @@ -6,7 +6,7 @@ import ( "honoka-chan/config" "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/download" + downloadschema "honoka-chan/internal/schema/download" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -22,13 +22,13 @@ func additional(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - downloadReq := download.AdditionalReq{} + downloadReq := downloadschema.AdditionalReq{} err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &downloadReq) if ss.CheckErr(err) { return } - pkgList := []download.AdditionalData{} + pkgList := []downloadschema.AdditionalData{} pkgType, pkgId := downloadReq.PackageType, downloadReq.PackageID var pkgInfo []PkgInfo err = ss.MainEng.Table("download_m").Where("pkg_type = ? AND pkg_id = ? AND pkg_os = ?", pkgType, pkgId, downloadReq.TargetOs). @@ -39,14 +39,14 @@ func additional(ctx *gin.Context) { } for _, pkg := range pkgInfo { - pkgList = append(pkgList, download.AdditionalData{ + pkgList = append(pkgList, downloadschema.AdditionalData{ Size: pkg.Size, URL: fmt.Sprintf("%s/%s/archives/%d_%d_%d.zip", config.Conf.Settings.CdnServer, downloadReq.TargetOs, pkgType, pkg.Id, pkg.Order), }) } - ss.Respond(download.AdditionalResp{ + ss.Respond(downloadschema.AdditionalResp{ ResponseData: pkgList, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/download/batch.go b/internal/handler/download/batch.go index 2de4f15..a3d1da8 100644 --- a/internal/handler/download/batch.go +++ b/internal/handler/download/batch.go @@ -6,7 +6,7 @@ import ( "honoka-chan/config" "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/download" + downloadschema "honoka-chan/internal/schema/download" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -17,13 +17,13 @@ func batch(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - downloadReq := download.BatchReq{} + downloadReq := downloadschema.BatchReq{} err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &downloadReq) if ss.CheckErr(err) { return } - pkgList := []download.BatchData{} + pkgList := []downloadschema.BatchData{} if downloadReq.ClientVersion == config.PackageVersion { pkgType := downloadReq.PackageType var pkgInfo []PkgInfo @@ -35,7 +35,7 @@ func batch(ctx *gin.Context) { } for _, pkg := range pkgInfo { - pkgList = append(pkgList, download.BatchData{ + pkgList = append(pkgList, downloadschema.BatchData{ Size: pkg.Size, URL: fmt.Sprintf("%s/%s/archives/%d_%d_%d.zip", config.Conf.Settings.CdnServer, downloadReq.Os, pkgType, pkg.Id, pkg.Order), @@ -43,7 +43,7 @@ func batch(ctx *gin.Context) { } } - ss.Respond(download.BatchResp{ + ss.Respond(downloadschema.BatchResp{ ResponseData: pkgList, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/download/event.go b/internal/handler/download/event.go index 2bcea28..f0e973f 100644 --- a/internal/handler/download/event.go +++ b/internal/handler/download/event.go @@ -3,7 +3,7 @@ package download import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/download" + downloadschema "honoka-chan/internal/schema/download" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -13,7 +13,7 @@ func event(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - ss.Respond(download.EventResp{ + ss.Respond(downloadschema.EventResp{ ResponseData: []any{}, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/download/update.go b/internal/handler/download/update.go index c04ea2a..4c0b5df 100644 --- a/internal/handler/download/update.go +++ b/internal/handler/download/update.go @@ -6,7 +6,7 @@ import ( "honoka-chan/config" "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/download" + downloadschema "honoka-chan/internal/schema/download" "honoka-chan/internal/session" "io" "net/http" @@ -18,13 +18,13 @@ func update(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - downloadReq := download.UpdateReq{} + downloadReq := downloadschema.UpdateReq{} err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &downloadReq) if ss.CheckErr(err) { return } - pkgList := []download.UpdateData{} + pkgList := []downloadschema.UpdateData{} if downloadReq.ExternalVersion != config.PackageVersion { pkgType := 99 var pkgInfo []PkgInfo @@ -36,7 +36,7 @@ func update(ctx *gin.Context) { } for _, pkg := range pkgInfo { - pkgList = append(pkgList, download.UpdateData{ + pkgList = append(pkgList, downloadschema.UpdateData{ Size: pkg.Size, URL: fmt.Sprintf("%s/%s/archives/%d_%d_%d.zip", config.Conf.Settings.CdnServer, downloadReq.TargetOs, pkgType, pkg.Id, pkg.Order), @@ -60,7 +60,7 @@ func update(ctx *gin.Context) { } } - ss.Respond(download.UpdateResp{ + ss.Respond(downloadschema.UpdateResp{ ResponseData: pkgList, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/download/url.go b/internal/handler/download/url.go index e1d9a25..2b06826 100644 --- a/internal/handler/download/url.go +++ b/internal/handler/download/url.go @@ -6,7 +6,7 @@ import ( "honoka-chan/config" "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/download" + downloadschema "honoka-chan/internal/schema/download" "honoka-chan/internal/session" "strings" @@ -17,7 +17,7 @@ func url(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - downloadReq := download.UrlReq{} + downloadReq := downloadschema.UrlReq{} err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &downloadReq) if ss.CheckErr(err) { return @@ -34,8 +34,8 @@ func url(ctx *gin.Context) { cdnServer, downloadReq.Os, strings.ReplaceAll(v, "\\", ""))) } - ss.Respond(download.UrlResp{ - ResponseData: download.UrlData{ + ss.Respond(downloadschema.UrlResp{ + ResponseData: downloadschema.UrlData{ UrlList: urlList, }, ReleaseInfo: []any{}, diff --git a/internal/handler/event/list.go b/internal/handler/event/list.go index c521881..137151c 100644 --- a/internal/handler/event/list.go +++ b/internal/handler/event/list.go @@ -3,7 +3,7 @@ package event import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/event" + eventschema "honoka-chan/internal/schema/event" "honoka-chan/internal/session" "time" @@ -14,9 +14,9 @@ func list(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - targets := []event.TargetList{} + targets := []eventschema.TargetList{} for i := range 6 { - targets = append(targets, event.TargetList{ + targets = append(targets, eventschema.TargetList{ Position: i + 1, IsDisplayable: false, }) @@ -30,8 +30,8 @@ func list(ctx *gin.Context) { // StatusCode: 600, // }) - ss.Respond(event.ListResp{ - ResponseData: event.ListData{ + ss.Respond(eventschema.ListResp{ + ResponseData: eventschema.ListData{ TargetList: targets, ServerTimestamp: time.Now().Unix(), }, diff --git a/internal/handler/gdpr/get.go b/internal/handler/gdpr/get.go index 4454860..0b13ba3 100644 --- a/internal/handler/gdpr/get.go +++ b/internal/handler/gdpr/get.go @@ -3,7 +3,7 @@ package gdpr import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/gdpr" + gdprschema "honoka-chan/internal/schema/gdpr" "honoka-chan/internal/session" "time" @@ -14,8 +14,8 @@ func get(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - ss.Respond(gdpr.GetResp{ - ResponseData: gdpr.GetData{ + ss.Respond(gdprschema.GetResp{ + ResponseData: gdprschema.GetData{ EnableGdpr: true, IsEea: false, ServerTimestamp: time.Now().Unix(), diff --git a/internal/handler/ghome/account/active.go b/internal/handler/ghome/account/active.go index e95e0d7..5d63f09 100644 --- a/internal/handler/ghome/account/active.go +++ b/internal/handler/ghome/account/active.go @@ -2,7 +2,7 @@ package account import ( "honoka-chan/internal/router" - "honoka-chan/internal/schema/ghome" + ghomeschema "honoka-chan/internal/schema/ghome" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -12,10 +12,10 @@ func active(ctx *gin.Context) { ss := session.New(ctx) defer ss.Finalize() - ss.Respond(ghome.ActiveResp{ + ss.Respond(ghomeschema.ActiveResp{ Code: 0, Msg: "ok", - Data: ghome.ActiveData{ + Data: ghomeschema.ActiveData{ Message: "ok", Result: 0, }, diff --git a/internal/handler/ghome/account/initialize.go b/internal/handler/ghome/account/initialize.go index f8973dc..4f03eba 100644 --- a/internal/handler/ghome/account/initialize.go +++ b/internal/handler/ghome/account/initialize.go @@ -4,7 +4,7 @@ import ( "encoding/base64" "encoding/json" "honoka-chan/internal/router" - "honoka-chan/internal/schema/ghome" + ghomeschema "honoka-chan/internal/schema/ghome" "honoka-chan/internal/session" "strings" @@ -16,7 +16,7 @@ func initialize(ctx *gin.Context) { ss := session.New(ctx) defer ss.Finalize() - initData := ghome.InitializeData{ + initData := ghomeschema.InitializeData{ BrandLogo: "http://gskd.sdo.com/ghome/ztc/logo/og/logo_xhdpi.png", BrandName: "盛趣游戏", ForceShowAgreement: 1, @@ -38,7 +38,7 @@ func initialize(ctx *gin.Context) { return } - ss.Respond(ghome.InitializeResp{ + ss.Respond(ghomeschema.InitializeResp{ Code: 0, Msg: "ok", Data: base64.StdEncoding.EncodeToString(encryptedData), diff --git a/internal/handler/ghome/account/login.go b/internal/handler/ghome/account/login.go index 8f2f9d5..5c6f88a 100644 --- a/internal/handler/ghome/account/login.go +++ b/internal/handler/ghome/account/login.go @@ -4,13 +4,13 @@ import ( "encoding/base64" "encoding/json" "fmt" - "honoka-chan/internal/model/user" + unitmodel "honoka-chan/internal/model/unit" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" - "honoka-chan/internal/schema/api/profile" - "honoka-chan/internal/schema/api/unit" + unitapischema "honoka-chan/internal/schema/api/unit" ghomeschema "honoka-chan/internal/schema/ghome" "honoka-chan/internal/session" - honokautils "honoka-chan/pkg/utils" + "honoka-chan/pkg/utils" "net/url" "strconv" "strings" @@ -62,10 +62,10 @@ func login(ctx *gin.Context) { userID, _ = checkUserID(ss, int(loginTime)) pass = openssl.Md5ToString(password) - autoKey = "AUTO" + strings.ToUpper(honokautils.RandomStr(32)) + autoKey = "AUTO" + strings.ToUpper(utils.RandomStr(32)) ticket = fmt.Sprintf("9999999%d%d", userID, userID) - userData := user.Users{ + userData := usermodel.Users{ Phone: phone, Password: pass, Autokey: autoKey, @@ -80,7 +80,7 @@ func login(ctx *gin.Context) { // 方便起见初始化 userid 和 key 一样 // 注意:user_key 表中的 key 是上文生成的用于登录的 userid,而 userid 则是用于 Authorize Token 生成用的 - userKey := user.UserKey{ + userKey := usermodel.UserKey{ UserID: userID, Key: userID, } @@ -96,20 +96,59 @@ func login(ctx *gin.Context) { } if !exists { - // 默认中心成员 - var unitOwningUserID int - _, err = ss.MainEng.Table("common_unit_m").Cols("unit_owning_user_id").Where("unit_id = ?", 31).Get(&unitOwningUserID) + // 生成用于卡片 + var unitData []unitmodel.CommonUnitData + err = ss.UserEng.Table(new(unitmodel.CommonUnitData)).Find(&unitData) if ss.CheckErr(err) { return } - userPref := user.UserPref{ + checked := false + for _, u := range unitData { + userUnit := usermodel.UserUnitData{ + UnitID: u.UnitID, + FavoriteFlag: false, + DisplayRank: u.MaxRank, + UserID: userID, + InsertDate: time.Now().Unix(), + UpdateDate: time.Now().Unix(), + } + + // 检查表里是否已经有数据 + if !checked { + ct, err := ss.UserEng.Table(new(usermodel.UserUnitData)).Count() + if ss.CheckErr(err) { + return + } + + if ct == 0 { + userUnit.UnitOwningUserID = 38383 + } + + checked = true + } + + _, err = ss.UserEng.Table(new(usermodel.UserUnitData)).Insert(&userUnit) + if ss.CheckErr(err) { + return + } + } + + // 默认中心成员 + var unitOwningUserID int + _, err = ss.UserEng.Table(new(usermodel.UserUnitData)). + Cols("unit_owning_user_id").Where("unit_id = ?", 31).Get(&unitOwningUserID) + if ss.CheckErr(err) { + return + } + + userPref := usermodel.UserPref{ UserID: userID, AwardID: 1, // 音乃木坂学生 BackgroundID: 1, // 初始背景 UnitOwningUserID: unitOwningUserID, UserName: "音乃木坂学生", - UserLevel: 1, + UserLevel: 1028, UserDesc: "你好。", InviteCode: strconv.Itoa(userID), UpdateTime: time.Now().Unix(), @@ -128,7 +167,7 @@ func login(ctx *gin.Context) { if !exists { // 默认队伍 - userDeck := unit.UserDeckData{ + userDeck := unitapischema.UserDeckData{ DeckID: 1, MainFlag: 1, DeckName: "队伍A", @@ -139,44 +178,37 @@ func login(ctx *gin.Context) { userDeckID := userDeck.ID // 默认卡组 - 仆光 - unitID := []int{} - err = ss.MainEng.Table("unit_m").Cols("unit_id").Where("album_series_id = ?", 615).Find(&unitID) + unitID := []int{3465, 3466, 3467, 3468, 3469, 3470, 3471, 3472, 3473} + var unitData []unitmodel.UnitDataMap + err = ss.GetBasicUnitInfo().In("a.unit_id", unitID).Find(&unitData) if ss.CheckErr(err) { return } - unitData := []profile.UnitData{} - err = ss.MainEng.Table("common_unit_m").In("unit_id", unitID).Find(&unitData) - if ss.CheckErr(err) { - return - } - - position := 1 - for _, u := range unitData { - unitDeckData := unit.UnitDeckData{ + for i, u := range unitData { + unitDeckData := usermodel.UserDeckUnit{ UserDeckID: userDeckID, UnitOwningUserID: u.UnitOwningUserID, UnitID: u.UnitID, - Position: position, - Level: 100, - LevelLimitID: 1, - DisplayRank: 2, - Love: 1000, - UnitSkillLevel: 8, - IsRankMax: true, - IsLoveMax: true, - IsLevelMax: true, + Position: i + 1, + Level: u.Level, + LevelLimitID: u.LevelLimitID, + DisplayRank: u.DisplayRank, + Love: u.MaxLove, + UnitSkillLevel: u.UnitSkillLevel, + IsRankMax: u.IsRankMax, + IsLoveMax: u.IsLoveMax, + IsLevelMax: u.IsLevelMax, IsSigned: u.IsSigned, - BeforeLove: 1000, - MaxLove: 1000, - InsertData: time.Now().Unix(), + BeforeLove: u.MaxLove, + MaxLove: u.MaxLove, + UserID: userID, + InsertDate: time.Now().Unix(), } _, err = ss.UserEng.Table("user_deck_unit").Insert(&unitDeckData) if ss.CheckErr(err) { return } - - position++ } } @@ -193,7 +225,7 @@ func login(ctx *gin.Context) { loginCode = 31 loginMsg = "账号不存在或者密码有误!" } else { - userData := user.Users{ + userData := usermodel.Users{ Autokey: autoKey, Ticket: ticket, LastLoginTime: loginTime, diff --git a/internal/handler/ghome/account/loginauto.go b/internal/handler/ghome/account/loginauto.go index ce1bb2a..ed56f04 100644 --- a/internal/handler/ghome/account/loginauto.go +++ b/internal/handler/ghome/account/loginauto.go @@ -3,10 +3,12 @@ package account import ( "encoding/base64" "encoding/json" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" - "honoka-chan/internal/schema/ghome" + ghomeschema "honoka-chan/internal/schema/ghome" "honoka-chan/internal/session" "net/url" + "strconv" "github.com/gin-gonic/gin" "github.com/go-think/openssl" @@ -36,27 +38,27 @@ func loginAuto(ctx *gin.Context) { params, _ := url.ParseQuery(queryStr) autoKey := params.Get("autokey") - var uid, ticket string - _, err = ss.UserEng.Table("users").Cols("user_id,ticket").Where("autokey = ?", autoKey).Get(&uid, &ticket) + var userData usermodel.Users + exists, err := ss.UserEng.Table("users").Where("autokey = ?", autoKey).Get(&userData) if ss.CheckErr(err) { return } - loginAutoData := ghome.LoginAutoData{} + loginAutoData := ghomeschema.LoginAutoData{} loginAutoCode := 0 loginAutoMsg := "ok" - if uid != "" { - loginAutoData = ghome.LoginAutoData{ + if exists { + loginAutoData = ghomeschema.LoginAutoData{ Result: loginAutoCode, Message: loginAutoMsg, Autokey: autoKey, - UserId: uid, - Ticket: ticket, + UserId: strconv.Itoa(userData.UserID), + Ticket: userData.Ticket, } } else { loginAutoCode = 31 loginAutoMsg = "账号不存在或者登陆状态已过期!" - loginAutoData = ghome.LoginAutoData{ + loginAutoData = ghomeschema.LoginAutoData{ Result: loginAutoCode, Message: loginAutoMsg, } @@ -71,7 +73,7 @@ func loginAuto(ctx *gin.Context) { return } - ss.Respond(ghome.LoginAutoResp{ + ss.Respond(ghomeschema.LoginAutoResp{ Code: loginAutoCode, Msg: loginAutoMsg, Data: base64.StdEncoding.EncodeToString(encryptedData), diff --git a/internal/handler/ghome/account/reportrole.go b/internal/handler/ghome/account/reportrole.go index 515a1ba..dc4ea14 100644 --- a/internal/handler/ghome/account/reportrole.go +++ b/internal/handler/ghome/account/reportrole.go @@ -3,7 +3,7 @@ package account import ( "encoding/base64" "honoka-chan/internal/router" - "honoka-chan/internal/schema/ghome" + ghomeschema "honoka-chan/internal/schema/ghome" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -21,7 +21,7 @@ func reportRole(ctx *gin.Context) { return } - ss.Respond(ghome.ReportRoleResp{ + ss.Respond(ghomeschema.ReportRoleResp{ Code: 0, Msg: "ok", Data: base64.StdEncoding.EncodeToString(encryptedToken), diff --git a/internal/handler/ghome/basic/getcode.go b/internal/handler/ghome/basic/getcode.go index 9241671..1ea7e78 100644 --- a/internal/handler/ghome/basic/getcode.go +++ b/internal/handler/ghome/basic/getcode.go @@ -3,7 +3,7 @@ package basic import ( "encoding/json" "honoka-chan/internal/router" - "honoka-chan/internal/schema/ghome" + ghomeschema "honoka-chan/internal/schema/ghome" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -20,7 +20,7 @@ func getCode(ctx *gin.Context) { return } - ss.Respond(ghome.GetCodeResp{ + ss.Respond(ghomeschema.GetCodeResp{ Code: 0, Msg: "ok", Data: getCodeData, diff --git a/internal/handler/ghome/basic/getproductlist.go b/internal/handler/ghome/basic/getproductlist.go index 2930d17..d3c2d7c 100644 --- a/internal/handler/ghome/basic/getproductlist.go +++ b/internal/handler/ghome/basic/getproductlist.go @@ -2,7 +2,7 @@ package basic import ( "honoka-chan/internal/router" - "honoka-chan/internal/schema/ghome" + ghomeschema "honoka-chan/internal/schema/ghome" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -12,12 +12,12 @@ func getProductList(ctx *gin.Context) { ss := session.New(ctx) defer ss.Finalize() - getProductListData := ghome.GetProductListData{ + getProductListData := ghomeschema.GetProductListData{ Message: []string{}, Result: 0, } - ss.Respond(ghome.GetProductListResp{ + ss.Respond(ghomeschema.GetProductListResp{ Code: 1, Msg: "ok", Data: getProductListData, diff --git a/internal/handler/ghome/basic/handshake.go b/internal/handler/ghome/basic/handshake.go index 7a5b69c..0f4a40c 100644 --- a/internal/handler/ghome/basic/handshake.go +++ b/internal/handler/ghome/basic/handshake.go @@ -4,9 +4,8 @@ import ( "encoding/base64" "fmt" "honoka-chan/internal/router" - "honoka-chan/internal/schema/ghome" + ghomeschema "honoka-chan/internal/schema/ghome" "honoka-chan/internal/session" - "honoka-chan/pkg/db" "honoka-chan/pkg/encrypt" honokautils "honoka-chan/pkg/utils" "net/url" @@ -34,21 +33,16 @@ func handshake(ctx *gin.Context) { params, _ := url.ParseQuery(string(decryptedData)) - randKey := []byte(params.Get("randkey")) - deviceID := ss.GetDeviceID() - - err = db.Ldb.Set([]byte(deviceID), randKey) - if ss.CheckErr(err) { - return - } + randKey := params.Get("randkey") + ss.SetRandKey(randKey) token := fmt.Sprintf(`{"message":"ok","result":0,"token":"%s"}`, strings.ToUpper(honokautils.RandomStr(33))) - encryptedToken, err := openssl.Des3ECBEncrypt([]byte(token), randKey[0:24], openssl.PKCS7_PADDING) + encryptedToken, err := openssl.Des3ECBEncrypt([]byte(token), []byte(randKey)[0:24], openssl.PKCS7_PADDING) if ss.CheckErr(err) { return } - ss.Respond(ghome.HandshakeResp{ + ss.Respond(ghomeschema.HandshakeResp{ Code: 0, Msg: "ok", Data: base64.StdEncoding.EncodeToString(encryptedToken), diff --git a/internal/handler/ghome/basic/loginarea.go b/internal/handler/ghome/basic/loginarea.go index 81ff233..b014051 100644 --- a/internal/handler/ghome/basic/loginarea.go +++ b/internal/handler/ghome/basic/loginarea.go @@ -2,7 +2,7 @@ package basic import ( "honoka-chan/internal/router" - "honoka-chan/internal/schema/ghome" + ghomeschema "honoka-chan/internal/schema/ghome" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -12,10 +12,10 @@ func loginArea(ctx *gin.Context) { ss := session.New(ctx) defer ss.Finalize() - ss.Respond(ghome.LoginAreaResp{ + ss.Respond(ghomeschema.LoginAreaResp{ Code: 0, Msg: "ok", - Data: ghome.LoginAreaData{ + Data: ghomeschema.LoginAreaData{ UserID: ctx.PostForm("userid"), }, }) diff --git a/internal/handler/ghome/basic/publickey.go b/internal/handler/ghome/basic/publickey.go index 14258f6..bfcc860 100644 --- a/internal/handler/ghome/basic/publickey.go +++ b/internal/handler/ghome/basic/publickey.go @@ -5,7 +5,7 @@ import ( "encoding/pem" "honoka-chan/config" "honoka-chan/internal/router" - "honoka-chan/internal/schema/ghome" + ghomeschema "honoka-chan/internal/schema/ghome" "honoka-chan/internal/session" honokautils "honoka-chan/pkg/utils" @@ -18,7 +18,7 @@ func publicKey(ctx *gin.Context) { publicKeyCode := 0 publicKeyMsg := "ok" - publicKeyData := ghome.PublicKeyData{ + publicKeyData := ghomeschema.PublicKeyData{ Result: publicKeyCode, Message: publicKeyMsg, } @@ -33,7 +33,7 @@ func publicKey(ctx *gin.Context) { publicKeyData.Method = "rsa" } - ss.Respond(ghome.PublicKeyResp{ + ss.Respond(ghomeschema.PublicKeyResp{ Code: publicKeyCode, Msg: publicKeyMsg, Data: publicKeyData, diff --git a/internal/handler/ghome/guest/status.go b/internal/handler/ghome/guest/status.go index 018cc23..ff06ca2 100644 --- a/internal/handler/ghome/guest/status.go +++ b/internal/handler/ghome/guest/status.go @@ -2,7 +2,7 @@ package guest import ( "honoka-chan/internal/router" - "honoka-chan/internal/schema/ghome" + ghomeschema "honoka-chan/internal/schema/ghome" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -12,10 +12,10 @@ func status(ctx *gin.Context) { ss := session.New(ctx) defer ss.Finalize() - ss.Respond(ghome.GuestStatusResp{ + ss.Respond(ghomeschema.GuestStatusResp{ Code: 0, Msg: "ok", - Data: ghome.GuestStatusData{ + Data: ghomeschema.GuestStatusData{ Disablead: 1, Loginswitch: 1, Message: "ok", diff --git a/internal/handler/ghome/misc/agreement.go b/internal/handler/ghome/misc/agreement.go index 249e50e..6e875c6 100644 --- a/internal/handler/ghome/misc/agreement.go +++ b/internal/handler/ghome/misc/agreement.go @@ -2,7 +2,7 @@ package misc import ( "honoka-chan/internal/router" - "honoka-chan/internal/schema/ghome" + ghomeschema "honoka-chan/internal/schema/ghome" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -12,11 +12,11 @@ func agreement(ctx *gin.Context) { ss := session.New(ctx) defer ss.Finalize() - ss.Respond(ghome.AgreementResp{ + ss.Respond(ghomeschema.AgreementResp{ ReturnCode: 0, ErrorType: 0, ReturnMessage: "", - Data: ghome.AgreementData{}, + Data: ghomeschema.AgreementData{}, }) } diff --git a/internal/handler/ghome/misc/integration.go b/internal/handler/ghome/misc/integration.go index 336a4bb..851539b 100644 --- a/internal/handler/ghome/misc/integration.go +++ b/internal/handler/ghome/misc/integration.go @@ -2,7 +2,7 @@ package misc import ( "honoka-chan/internal/router" - "honoka-chan/internal/schema/ghome" + ghomeschema "honoka-chan/internal/schema/ghome" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -12,10 +12,10 @@ func appReport(ctx *gin.Context) { ss := session.New(ctx) defer ss.Finalize() - ss.Respond(ghome.AppReportResp{ + ss.Respond(ghomeschema.AppReportResp{ Code: 0, Msg: "", - Data: ghome.AppReportData{ + Data: ghomeschema.AppReportData{ NeedReport: 0, }, }) diff --git a/internal/handler/lbonus/execute.go b/internal/handler/lbonus/execute.go index 626d817..0e32f67 100644 --- a/internal/handler/lbonus/execute.go +++ b/internal/handler/lbonus/execute.go @@ -3,7 +3,7 @@ package lbonus import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/lbonus" + lbonusschema "honoka-chan/internal/schema/lbonus" "honoka-chan/internal/session" "time" @@ -35,7 +35,7 @@ func execute(ctx *gin.Context) { d2 := d1.AddDate(0, 1, -1) // fmt.Println(d2) - weeksList := []lbonus.Day{} + weeksList := []lbonusschema.Day{} for c := d1; ; c = c.AddDate(0, 0, 1) { _, _, rd := c.Date() received := false @@ -43,14 +43,14 @@ func execute(ctx *gin.Context) { received = true } rw := weeks[c.Weekday().String()] - weeksList = append(weeksList, lbonus.Day{ + weeksList = append(weeksList, lbonusschema.Day{ Day: rd, DayOfTheWeek: rw, SpecialDay: false, SpecialImageAsset: "", Received: received, AdReceived: false, - Item: lbonus.Item{ + Item: lbonusschema.Item{ ItemID: 4, AddType: 3001, Amount: 1, @@ -72,18 +72,18 @@ func execute(ctx *gin.Context) { d2 = d1.AddDate(0, 1, -1) // fmt.Println(d2) - nextWeeksList := []lbonus.Day{} + nextWeeksList := []lbonusschema.Day{} for c := d1; ; c = c.AddDate(0, 0, 1) { _, _, rd := c.Date() rw := weeks[c.Weekday().String()] - nextWeeksList = append(nextWeeksList, lbonus.Day{ + nextWeeksList = append(nextWeeksList, lbonusschema.Day{ Day: rd, DayOfTheWeek: rw, SpecialDay: false, SpecialImageAsset: "", Received: false, AdReceived: false, - Item: lbonus.Item{ + Item: lbonusschema.Item{ ItemID: 4, AddType: 3001, Amount: 1, @@ -94,26 +94,26 @@ func execute(ctx *gin.Context) { } } - resp := lbonus.ExecuteResp{ - ResponseData: lbonus.ExecuteData{ + resp := lbonusschema.ExecuteResp{ + ResponseData: lbonusschema.ExecuteData{ Sheets: []any{}, - CalendarInfo: lbonus.CalendarInfo{ + CalendarInfo: lbonusschema.CalendarInfo{ CurrentDate: time.Now().Format("2006-01-02 03:04:05"), - CurrentMonth: lbonus.Month{ + CurrentMonth: lbonusschema.Month{ Year: y, Month: int(cm), Days: weeksList, }, - NextMonth: lbonus.Month{ + NextMonth: lbonusschema.Month{ Year: y, Month: int(m), Days: nextWeeksList, }, }, - TotalLoginInfo: lbonus.TotalLoginInfo{ + TotalLoginInfo: lbonusschema.TotalLoginInfo{ LoginCount: 2626, RemainingCount: 74, - Reward: []lbonus.Reward{ + Reward: []lbonusschema.Reward{ { ItemID: 5, AddType: 1000, @@ -122,8 +122,8 @@ func execute(ctx *gin.Context) { }, }, LicenseLbonusList: []any{}, - ClassSystem: lbonus.ClassSystem{ - RankInfo: lbonus.RankInfo{ + ClassSystem: lbonusschema.ClassSystem{ + RankInfo: lbonusschema.RankInfo{ BeforeClassRankID: 10, AfterClassRankID: 10, RankUpDate: "2020-02-12 11:57:15", @@ -133,17 +133,17 @@ func execute(ctx *gin.Context) { IsVisible: true, }, StartDashSheets: []any{}, - EffortPoint: []lbonus.EffortPoint{ + EffortPoint: []lbonusschema.EffortPoint{ { LiveEffortPointBoxSpecID: 5, Capacity: 4000000, Before: 1400116, After: 1400116, - Rewards: []lbonus.Rewards{}, + Rewards: []lbonusschema.Rewards{}, }, }, LimitedEffortBox: []any{}, - MuseumInfo: lbonus.Museum{}, + MuseumInfo: lbonusschema.Museum{}, ServerTimestamp: time.Now().Unix(), PresentCnt: 0, }, diff --git a/internal/handler/live/continue.go b/internal/handler/live/continue.go new file mode 100644 index 0000000..92ada89 --- /dev/null +++ b/internal/handler/live/continue.go @@ -0,0 +1,30 @@ +package live + +import ( + "honoka-chan/internal/middleware" + "honoka-chan/internal/router" + liveschema "honoka-chan/internal/schema/live" + "honoka-chan/internal/session" + "time" + + "github.com/gin-gonic/gin" +) + +func continuee(ctx *gin.Context) { + ss := session.Get(ctx) + defer ss.Finalize() + + ss.Respond(liveschema.ContinueResp{ + ResponseData: liveschema.ContinueData{ + BeforeSnsCoin: 100000, + AfterSnsCoin: 100000, + ServerTimestamp: time.Now().Unix(), + }, + ReleaseInfo: []any{}, + StatusCode: 200, + }) +} + +func init() { + router.AddHandler("main.php", "POST", "/live/continue", middleware.Common, continuee) +} diff --git a/internal/handler/live/gameover.go b/internal/handler/live/gameover.go index b19413f..4b4a3b1 100644 --- a/internal/handler/live/gameover.go +++ b/internal/handler/live/gameover.go @@ -3,7 +3,7 @@ package live import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/live" + liveschema "honoka-chan/internal/schema/live" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -11,9 +11,12 @@ import ( func gameOver(ctx *gin.Context) { ss := session.Get(ctx) - defer ss.Finalize() + defer func() { + ss.ClearLiveInProgress() + ss.Finalize() + }() - ss.Respond(live.GameOverResp{ + ss.Respond(liveschema.GameOverResp{ ResponseData: []any{}, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/live/partylist.go b/internal/handler/live/partylist.go index 1f6660c..89bbadc 100644 --- a/internal/handler/live/partylist.go +++ b/internal/handler/live/partylist.go @@ -1,11 +1,14 @@ package live import ( - "encoding/json" + "errors" "honoka-chan/internal/middleware" + unitmodel "honoka-chan/internal/model/unit" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" + liveschema "honoka-chan/internal/schema/live" "honoka-chan/internal/session" - honokautils "honoka-chan/pkg/utils" + "time" "github.com/gin-gonic/gin" ) @@ -14,14 +17,81 @@ func partyList(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - data := honokautils.ReadAllText("assets/serverdata/partylist.json") - var partyResp map[string]any - err := json.Unmarshal([]byte(data), &partyResp) + pref := usermodel.UserPref{} + _, err := ss.UserEng.Table("user_pref").Where("user_id = ?", ss.UserID).Get(&pref) if ss.CheckErr(err) { return } - ss.Respond(partyResp) + // TODO: 好友功能实装前先使用自己的卡组助战 + var unitList []usermodel.UserDeckUnit + err = ss.UserEng.Table("user_deck_unit").Where("user_id = ? AND position = 5", ss.UserID).Find(&unitList) + if ss.CheckErr(err) { + return + } + + var partyList []liveschema.PartyList + for _, u := range unitList { + var unitInfo unitmodel.UnitDataMap + has, err := ss.GetBasicUnitInfo(). + Where("unit_owning_user_id = ?", u.UnitOwningUserID).Get(&unitInfo) + if ss.CheckErr(err) { + return + } + + if !has { + ss.Abort(errors.New("卡片不存在!")) + return + } + + partyList = append(partyList, liveschema.PartyList{ + UserInfo: ss.GetUserInfo(), + CenterUnitInfo: liveschema.CenterUnitInfo{ + UnitOwningUserID: u.UnitOwningUserID, + UnitID: u.UnitID, + Exp: unitInfo.Exp, + NextExp: 0, + Level: u.Level, + LevelLimitID: u.LevelLimitID, + MaxLevel: unitInfo.MaxLevel, + Rank: unitInfo.Rank, + MaxRank: unitInfo.MaxRank, + Love: u.Love, + MaxLove: u.MaxLove, + UnitSkillLevel: u.UnitSkillLevel, + MaxHp: unitInfo.MaxHp, + FavoriteFlag: unitInfo.FavoriteFlag, + DisplayRank: u.DisplayRank, + UnitSkillExp: unitInfo.UnitSkillExp, + UnitRemovableSkillCapacity: unitInfo.UnitRemovableSkillCapacity, + Attribute: unitInfo.Attribute, + Smile: unitInfo.Smile, + Cute: unitInfo.Cute, + Cool: unitInfo.Cool, + IsLoveMax: u.IsLoveMax, + IsLevelMax: u.IsLevelMax, + IsRankMax: u.IsRankMax, + IsSigned: u.IsSigned, + IsSkillLevelMax: unitInfo.IsSkillLevelMax, + SettingAwardID: pref.AwardID, + RemovableSkillIds: []int{}, + }, + SettingAwardID: pref.AwardID, + AvailableSocialPoint: 10, + FriendStatus: 1, + }) + } + + ss.Respond(liveschema.PartyListResp{ + ResponseData: liveschema.PartyListData{ + PartyList: partyList, + TrainingEnergy: 10, + TrainingEnergyMax: 10, + ServerTimestamp: time.Now().Unix(), + }, + ReleaseInfo: []any{}, + StatusCode: 200, + }) } func init() { diff --git a/internal/handler/live/play.go b/internal/handler/live/play.go index f2d1e6c..879b716 100644 --- a/internal/handler/live/play.go +++ b/internal/handler/live/play.go @@ -2,183 +2,157 @@ package live import ( "encoding/json" - "fmt" "honoka-chan/internal/middleware" + unitmodel "honoka-chan/internal/model/unit" "honoka-chan/internal/router" - "honoka-chan/internal/schema/live" + liveschema "honoka-chan/internal/schema/live" "honoka-chan/internal/session" - "honoka-chan/pkg/db" honokautils "honoka-chan/pkg/utils" "math" "strconv" "time" "github.com/gin-gonic/gin" - "github.com/tidwall/gjson" ) func play(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - playReq := live.PlayReq{} + playReq := liveschema.PlayReq{} err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &playReq) if ss.CheckErr(err) { return } + // fmt.Println(ctx.MustGet("request_data").(string)) - tDifficultyId := playReq.LiveDifficultyID - difficultyId, err := strconv.Atoi(tDifficultyId) + ss.RegisterLiveInProgress(playReq.UnitDeckID) + + difficultyID, _ := strconv.Atoi(playReq.LiveDifficultyID) + + // 歌曲类型: normal / special + // sqlite3 不支持 FULL OUTER JOIN 所以这里使用 UNION ALL + var liveSetting struct { + NotesSettingAsset string `xorm:"notes_setting_asset"` + ARankScore int `xorm:"a_rank_score"` + BRankScore int `xorm:"b_rank_score"` + CRankScore int `xorm:"c_rank_score"` + SRankScore int `xorm:"s_rank_score"` + AcFlag int `xorm:"ac_flag"` + SwingFlag int `xorm:"swing_flag"` + } + sql := ` + SELECT notes_setting_asset, + a_rank_score, + b_rank_score, + c_rank_score, + s_rank_score, + ac_flag, + swing_flag + FROM live_setting_m + WHERE live_setting_id IN ( + SELECT live_setting_id + FROM normal_live_m + WHERE live_difficulty_id = ? + UNION ALL + SELECT live_setting_id + FROM special_live_m + WHERE live_difficulty_id = ? + ) + ` + _, err = ss.MainEng.SQL(sql, difficultyID, difficultyID).Get(&liveSetting) if ss.CheckErr(err) { return } - deckId := playReq.UnitDeckID + // fmt.Println("liveSetting", liveSetting) - // Save Deck Id for /live/reward - key := "live_deck_" + strconv.Itoa(ss.UserID) - err = db.Ldb.Set([]byte(key), []byte(strconv.Itoa(deckId))) - if ss.CheckErr(err) { - return - } - - // Song type: normal / special - // sqlite3 doesn't support FULL OUTER JOIN so use UNION ALL here. - sql := `SELECT notes_setting_asset,c_rank_score,b_rank_score,a_rank_score,s_rank_score,ac_flag,swing_flag FROM live_setting_m WHERE live_setting_id IN (SELECT live_setting_id FROM normal_live_m WHERE live_difficulty_id = ? UNION ALL SELECT live_setting_id FROM special_live_m WHERE live_difficulty_id = ?)` - var notes_setting_asset string - var c_rank_score, b_rank_score, a_rank_score, s_rank_score, ac_flag, swing_flag int - err = ss.MainEng.DB().QueryRow(sql, difficultyId, difficultyId).Scan(¬es_setting_asset, &c_rank_score, &b_rank_score, &a_rank_score, &s_rank_score, &ac_flag, &swing_flag) - if ss.CheckErr(err) { - return - } - - // fmt.Println(notes_setting_asset) - // fmt.Println(c_rank_score, b_rank_score, a_rank_score, s_rank_score) - - notes := []live.NotesList{} - // fmt.Println("./assets/serverdata/beatmaps/" + notes_setting_asset) - notes_list := honokautils.ReadAllText("./assets/serverdata/beatmaps/" + notes_setting_asset) + notes := []liveschema.NotesList{} + notes_list := honokautils.ReadAllText("./assets/serverdata/beatmaps/" + liveSetting.NotesSettingAsset) err = json.Unmarshal([]byte(notes_list), ¬es) if ss.CheckErr(err) { return } - ranks := []live.RankInfo{} - ranks = append(ranks, live.RankInfo{ + ranks := []liveschema.RankInfo{} + ranks = append(ranks, liveschema.RankInfo{ Rank: 5, RankMin: 0, - RankMax: c_rank_score, - }, live.RankInfo{ + RankMax: liveSetting.CRankScore, + }, liveschema.RankInfo{ Rank: 4, - RankMin: c_rank_score + 1, - RankMax: b_rank_score, - }, live.RankInfo{ + RankMin: liveSetting.CRankScore + 1, + RankMax: liveSetting.BRankScore, + }, liveschema.RankInfo{ Rank: 3, - RankMin: b_rank_score + 1, - RankMax: a_rank_score, - }, live.RankInfo{ + RankMin: liveSetting.BRankScore + 1, + RankMax: liveSetting.ARankScore, + }, liveschema.RankInfo{ Rank: 2, - RankMin: a_rank_score + 1, - RankMax: s_rank_score, - }, live.RankInfo{ + RankMin: liveSetting.ARankScore + 1, + RankMax: liveSetting.SRankScore, + }, liveschema.RankInfo{ Rank: 1, - RankMin: s_rank_score + 1, + RankMin: liveSetting.SRankScore + 1, RankMax: 0, }) - // ss.UserEng.ShowSQL(true) - // ss.MainEng.ShowSQL(true) owningIdList := []int{} - err = ss.UserEng.Table("user_deck_unit").Join("LEFT", "user_deck", "user_deck_unit.user_deck_id = user_deck.id"). - Where("user_id = ? AND deck_id = ?", ss.UserID, deckId).Cols("unit_owning_user_id"). - OrderBy("user_deck_unit.position ASC").Find(&owningIdList) + err = ss.UserEng.Table("user_deck_unit"). + Join("LEFT", "user_deck", "user_deck_unit.user_deck_id = user_deck.id"). + Where("user_deck.user_id = ? AND user_deck.deck_id = ?", ss.UserID, playReq.UnitDeckID). + Cols("unit_owning_user_id").OrderBy("user_deck_unit.position ASC").Find(&owningIdList) if ss.CheckErr(err) { return } - unitList := []live.UnitList{} - var totalSmile, totalPure, totalCool, maxLove float64 + unitList := []liveschema.UnitList{} + var totalSmile, totalPure, totalCool float64 var totalHp int for _, owningId := range owningIdList { - var uId int - exists, err := ss.MainEng.Table("common_unit_m").Where("unit_owning_user_id = ?", owningId).Cols("unit_id").Get(&uId) + // 卡片基础属性 + var baseSmile, basePure, baseCool, smileMax, pureMax, coolMax float64 + var unitData unitmodel.UnitDataMap + _, err = ss.GetBasicUnitInfo().Where("unit_owning_user_id = ?", owningId).Get(&unitData) if ss.CheckErr(err) { return } - - var maxHp, attrId, unitTypeId int - var baseSmile, basePure, baseCool, smileMax, pureMax, coolMax float64 - if exists { - // 公共卡片仅为100级属性 - _, err = ss.MainEng.Table("unit_m").Where("unit_id = ?", uId). - Join("LEFT", "unit_rarity_m", "unit_m.rarity = unit_rarity_m.rarity"). - Cols("attribute_id,hp_max,smile_max,pure_max,cool_max,after_love_max,unit_type_id"). - Get(&attrId, &maxHp, &baseSmile, &basePure, &baseCool, &maxLove, &unitTypeId) - if ss.CheckErr(err) { - return - } - } else { - // 用户卡片暂时固定为满级350级 - exists, err := ss.UserEng.Table("user_unit").Where("unit_owning_user_id = ?", owningId).Cols("unit_id").Get(&uId) - if ss.CheckErr(err) { - return - } - - if exists { - // 卡片100级基础属性 - _, err = ss.MainEng.Table("unit_m").Where("unit_id = ?", uId). - Join("LEFT", "unit_rarity_m", "unit_m.rarity = unit_rarity_m.rarity"). - Cols("attribute_id,hp_max,smile_max,pure_max,cool_max,after_love_max,unit_type_id"). - Get(&attrId, &maxHp, &baseSmile, &basePure, &baseCool, &maxLove, &unitTypeId) - if ss.CheckErr(err) { - return - } - - // 增量属性 - var diffSmile, diffPure, diffCool float64 - _, err = ss.MainEng.Table("unit_level_limit_pattern_m").Where("unit_level_limit_id = 1 AND unit_level = 350"). - Cols("smile_diff,pure_diff,cool_diff").Get(&diffSmile, &diffPure, &diffCool) - if ss.CheckErr(err) { - return - } - - // 更新卡片属性(注意这里是负数,要用减号) - baseSmile -= diffSmile - basePure -= diffPure - baseCool -= diffCool - } else { - err = fmt.Errorf("no such unit owning id: %d", owningId) - } - if ss.CheckErr(err) { - return - } - } + baseSmile = float64(unitData.Smile) + basePure = float64(unitData.Cute) + baseCool = float64(unitData.Cool) + // fmt.Println("================================") + // fmt.Println("基础属性:", baseSmile, basePure, baseCool) // 饰品属性加成(满级) var accessoryOwningId int - _, err = ss.UserEng.Table("user_accessory_wear").Where("unit_owning_user_id = ?", owningId). + exists, err := ss.UserEng.Table("user_accessory_wear"). + Where("unit_owning_user_id = ?", owningId). Cols("accessory_owning_user_id").Get(&accessoryOwningId) if ss.CheckErr(err) { return } - var smileAccessory, pureAccessory, coolAccessory float64 - _, err = ss.MainEng.Table("common_accessory_m").Join("LEFT", "accessory_m", "common_accessory_m.accessory_id = accessory_m.accessory_id"). - Where("accessory_owning_user_id = ?", accessoryOwningId).Cols("smile_max,pure_max,cool_max"). - Get(&smileAccessory, &pureAccessory, &coolAccessory) - if ss.CheckErr(err) { - return - } - // fmt.Println("基础属性:", baseSmile, basePure, baseCool) + if exists { + var smileAccessory, pureAccessory, coolAccessory float64 + _, err = ss.MainEng.Table("common_accessory_m"). + Join("LEFT", "accessory_m", "common_accessory_m.accessory_id = accessory_m.accessory_id"). + Where("accessory_owning_user_id = ?", accessoryOwningId).Cols("smile_max,pure_max,cool_max"). + Get(&smileAccessory, &pureAccessory, &coolAccessory) + if ss.CheckErr(err) { + return + } - // 饰品属性加成(该加成会影响个宝等百分比宝石属性加成的计算,故先计算。) - baseSmile += smileAccessory - basePure += pureAccessory - baseCool += coolAccessory - // fmt.Println("饰品属性加成:", smileAccessory, pureAccessory, coolAccessory) - // fmt.Println("饰品属性加成后的基础属性:", baseSmile, basePure, baseCool) + // 饰品属性加成(该加成会影响个宝等百分比宝石属性加成的计算,故先计算。) + baseSmile += smileAccessory + basePure += pureAccessory + baseCool += coolAccessory + // fmt.Println("饰品属性加成:", smileAccessory, pureAccessory, coolAccessory) + // fmt.Println("饰品属性加成后的基础属性:", baseSmile, basePure, baseCool) + } // 回忆画廊属性加成(该加成会影响个宝等百分比宝石属性加成的计算,故先计算。) var smileBuff, pureBuff, coolBuff float64 - _, err = ss.MainEng.Table("museum_contents_m").Select("SUM(smile_buff),SUM(pure_buff),SUM(cool_buff)").Get(&smileBuff, &pureBuff, &coolBuff) + _, err = ss.MainEng.Table("museum_contents_m"). + Select("SUM(smile_buff),SUM(pure_buff),SUM(cool_buff)"). + Get(&smileBuff, &pureBuff, &coolBuff) if ss.CheckErr(err) { return } @@ -189,26 +163,25 @@ func play(ctx *gin.Context) { // fmt.Println("回忆画廊属性加成后的基础属性:", baseSmile, basePure, baseCool) // 绊属性加成(该加成会影响个宝等百分比宝石属性加成的计算,故先计算。) - switch attrId { + switch unitData.Attribute { case 1: - baseSmile += maxLove + baseSmile += float64(unitData.MaxLove) case 2: - basePure += maxLove + basePure += float64(unitData.MaxLove) case 3: - baseCool += maxLove + baseCool += float64(unitData.MaxLove) } - // fmt.Println("绊属性加成:", maxLove) + // fmt.Println("绊属性加成:", unitData.MaxLove) // fmt.Println("绊属性加成后的基础属性:", baseSmile, basePure, baseCool) // 宝石属性加成 var kissSmile, kissPure, kissCool float64 var skillSmile, skillPure, skillCool float64 - // var mainCenterSmile, mainCenterPure, mainCenterCool float64 - // var secCenterSmile, secCenterPure, secCenterCool float64 // 宝石加成(满级) removableSkillIds := []int{} - err = ss.UserEng.Table("user_unit_skill_equip").Where("unit_owning_user_id = ? AND user_id = ?", owningId, ss.UserID). + err = ss.UserEng.Table("user_unit_skill_equip"). + Where("unit_owning_user_id = ?", owningId). Cols("unit_removable_skill_id").Find(&removableSkillIds) if ss.CheckErr(err) { return @@ -218,7 +191,8 @@ func play(ctx *gin.Context) { // 判断宝石效果类型(效果范围、效果类型、效果值、是否固定数值) var effectRange, effectType, fixedValueFlag, refType int var effectValue float64 - _, err = ss.MainEng.Table("unit_removable_skill_m").Where("unit_removable_skill_id = ?", sk). + _, err = ss.MainEng.Table("unit_removable_skill_m"). + Where("unit_removable_skill_id = ?", sk). Cols("effect_range,effect_type,effect_value,fixed_value_flag,target_reference_type"). Get(&effectRange, &effectType, &effectValue, &fixedValueFlag, &refType) if ss.CheckErr(err) { @@ -276,7 +250,8 @@ func play(ctx *gin.Context) { // 主唱技能加成 var myCenterUnitId int - _, err = ss.UserEng.Table("user_deck_unit").Join("LEFT", "user_deck", "user_deck_unit.user_deck_id = user_deck.id"). + _, err = ss.UserEng.Table("user_deck_unit"). + Join("LEFT", "user_deck", "user_deck_unit.user_deck_id = user_deck.id"). Where("user_deck.deck_id = ? AND user_deck.user_id = ? AND user_deck_unit.position = 5", playReq.UnitDeckID, ss.UserID). Cols("user_deck_unit.unit_id").Get(&myCenterUnitId) if ss.CheckErr(err) { @@ -310,16 +285,18 @@ func play(ctx *gin.Context) { _, err = ss.MainEng.Table("unit_m"). Join("LEFT", "unit_leader_skill_extra_m", "unit_m.default_leader_skill_id = unit_leader_skill_extra_m.unit_leader_skill_id"). Where("unit_m.unit_id = ?", myCenterUnitId). - Cols("unit_leader_skill_extra_m.effect_value,unit_leader_skill_extra_m.member_tag_id").Get(&mySubEffectValue, &myMemberTagId) + Cols("unit_leader_skill_extra_m.effect_value,unit_leader_skill_extra_m.member_tag_id"). + Get(&mySubEffectValue, &myMemberTagId) if ss.CheckErr(err) { return } exists, err = ss.MainEng.Table("unit_type_member_tag_m"). - Where("unit_type_id = ? AND member_tag_id = ?", unitTypeId, myMemberTagId).Exist() + Where("unit_type_id = ? AND member_tag_id = ?", unitData.UnitTypeID, myMemberTagId).Exist() if ss.CheckErr(err) { return } + var mySubSmile, mySubPure, mySubCool float64 if exists { switch myAttrId { @@ -335,24 +312,26 @@ func play(ctx *gin.Context) { // 好友主唱技能加成 // TODO 好友支援存入数据库 - var tomoUnitId int64 - partyList := gjson.Parse(honokautils.ReadAllText("assets/serverdata/partylist.json")).Get("response_data.party_list") - partyList.ForEach(func(key, value gjson.Result) bool { - if value.Get("user_info.user_id").Int() == playReq.PartyUserID { - tomoUnitId = value.Get("center_unit_info.unit_id").Int() - return false - } - return true - }) + // var tomoUnitId int64 + // partyList := gjson.Parse(honokautils.ReadAllText("assets/serverdata/partylist.json")).Get("response_data.party_list") + // partyList.ForEach(func(key, value gjson.Result) bool { + // if value.Get("user_info.user_id").Int() == playReq.PartyUserID { + // tomoUnitId = value.Get("center_unit_info.unit_id").Int() + // return false + // } + // return true + // }) + // TODO: 好友功能实装前先使用自己的卡组助战 + tomoUnitId := myCenterUnitId // fmt.Println("好友UnitID:", tomoUnitId) // 好友主唱技能加成:主C技能(这里不使用新C技能,即以某属性的百分比提升另一属性) - var tomoAttrId int var tomoEffectValue float64 _, err = ss.MainEng.Table("unit_m"). Join("LEFT", "unit_leader_skill_m", "unit_m.default_leader_skill_id = unit_leader_skill_m.unit_leader_skill_id"). Where("unit_m.unit_id = ?", tomoUnitId). - Cols("unit_m.attribute_id,unit_leader_skill_m.effect_value").Get(&tomoAttrId, &tomoEffectValue) + Cols("unit_leader_skill_m.effect_value"). + Get(&tomoEffectValue) if ss.CheckErr(err) { return } @@ -373,13 +352,14 @@ func play(ctx *gin.Context) { _, err = ss.MainEng.Table("unit_m"). Join("LEFT", "unit_leader_skill_extra_m", "unit_m.default_leader_skill_id = unit_leader_skill_extra_m.unit_leader_skill_id"). Where("unit_m.unit_id = ?", tomoUnitId). - Cols("unit_leader_skill_extra_m.effect_value,unit_leader_skill_extra_m.member_tag_id").Get(&tomoSubEffectValue, &tomoMemberTagId) + Cols("unit_leader_skill_extra_m.effect_value,unit_leader_skill_extra_m.member_tag_id"). + Get(&tomoSubEffectValue, &tomoMemberTagId) if ss.CheckErr(err) { return } exists, err = ss.MainEng.Table("unit_type_member_tag_m"). - Where("unit_type_id = ? AND member_tag_id = ?", unitTypeId, tomoMemberTagId).Exist() + Where("unit_type_id = ? AND member_tag_id = ?", unitData.UnitTypeID, tomoMemberTagId).Exist() if ss.CheckErr(err) { return } @@ -400,7 +380,16 @@ func play(ctx *gin.Context) { totalSmile += smileMax + myCenterSmile + mySubSmile + tomoCenterSmile + tomoSubSmile totalPure += pureMax + myCenterPure + mySubPure + tomoCenterPure + tomoSubPure totalCool += coolMax + myCenterCool + mySubCool + tomoCenterCool + tomoSubCool - totalHp += maxHp + totalHp += unitData.MaxHp + // fmt.Println("smileMax, myCenterSmile, mySubSmile, tomoCenterSmile, tomoSubSmile, totalSmile", + // smileMax, myCenterSmile, mySubSmile, tomoCenterSmile, tomoSubSmile, + // smileMax+myCenterSmile+mySubSmile+tomoCenterSmile+tomoSubSmile) + // fmt.Println("pureMax, myCenterPure, mySubPure, tomoCenterPure, tomoSubPure, totalPure", + // pureMax, myCenterPure, mySubPure, tomoCenterPure, tomoSubPure, + // pureMax+myCenterPure+mySubPure+tomoCenterPure+tomoSubPure) + // fmt.Println("coolMax, myCenterCool, mySubCool, tomoCenterCool, tomoSubCool, totalPure", + // coolMax, myCenterCool, mySubCool, tomoCenterCool, tomoSubCool, + // coolMax+myCenterCool+mySubCool+tomoCenterCool+tomoSubCool) // 单卡属性计算结果取上取整 fixedSmileMax := int(smileMax) @@ -408,7 +397,7 @@ func play(ctx *gin.Context) { fixedCoolMax := int(coolMax) // fmt.Println("单卡属性:", fixedSmileMax, fixedPureMax, fixedCoolMax) - unitList = append(unitList, live.UnitList{ + unitList = append(unitList, liveschema.UnitList{ Smile: fixedSmileMax, Cute: fixedPureMax, Cool: fixedCoolMax, @@ -421,17 +410,17 @@ func play(ctx *gin.Context) { fixedTotalCool := int(math.Ceil(totalCool)) // fmt.Println("全卡组属性:", fixedTotalSmile, fixedTotalPure, fixedTotalCool) - lives := []live.PlayLiveList{} - lives = append(lives, live.PlayLiveList{ - LiveInfo: live.LiveInfo{ - LiveDifficultyID: difficultyId, + lives := []liveschema.PlayLiveList{} + lives = append(lives, liveschema.PlayLiveList{ + LiveInfo: liveschema.LiveInfo{ + LiveDifficultyID: difficultyID, IsRandom: false, - AcFlag: ac_flag, - SwingFlag: swing_flag, + AcFlag: liveSetting.AcFlag, + SwingFlag: liveSetting.SwingFlag, NotesList: notes, }, - DeckInfo: live.DeckInfo{ - UnitDeckID: deckId, + DeckInfo: liveschema.DeckInfo{ + UnitDeckID: playReq.UnitDeckID, TotalSmile: fixedTotalSmile, TotalCute: fixedTotalPure, TotalCool: fixedTotalCool, @@ -441,8 +430,8 @@ func play(ctx *gin.Context) { }, }) - playResp := live.PlayResp{ - ResponseData: live.PlayData{ + playResp := liveschema.PlayResp{ + ResponseData: liveschema.PlayData{ RankInfo: ranks, EnergyFullTime: "2023-03-20 01:28:55", OverMaxEnergy: 0, diff --git a/internal/handler/live/precisescore.go b/internal/handler/live/precisescore.go index 9ec6362..cd96062 100644 --- a/internal/handler/live/precisescore.go +++ b/internal/handler/live/precisescore.go @@ -2,11 +2,13 @@ package live import ( "encoding/json" + "honoka-chan/internal/constant" "honoka-chan/internal/middleware" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" - "honoka-chan/internal/schema/live" + liveschema "honoka-chan/internal/schema/live" "honoka-chan/internal/session" - honokautils "honoka-chan/pkg/utils" + "honoka-chan/pkg/utils" "strconv" "time" @@ -17,90 +19,225 @@ func preciseScore(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - playScoreReq := live.PlayScoreReq{} + playScoreReq := liveschema.PlayScoreReq{} err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &playScoreReq) if ss.CheckErr(err) { return } + // fmt.Println(ctx.MustGet("request_data").(string)) - tDifficultyId := playScoreReq.LiveDifficultyID - difficultyId, err := strconv.Atoi(tDifficultyId) + difficultyID, _ := strconv.Atoi(playScoreReq.LiveDifficultyID) + + // 歌曲类型: normal / special + // sqlite3 不支持 FULL OUTER JOIN 所以这里使用 UNION ALL + var liveSetting struct { + NotesSettingAsset string `xorm:"notes_setting_asset"` + ARankScore int `xorm:"a_rank_score"` + BRankScore int `xorm:"b_rank_score"` + CRankScore int `xorm:"c_rank_score"` + SRankScore int `xorm:"s_rank_score"` + AcFlag int `xorm:"ac_flag"` + SwingFlag int `xorm:"swing_flag"` + } + sql := ` + SELECT notes_setting_asset, + a_rank_score, + b_rank_score, + c_rank_score, + s_rank_score, + ac_flag, + swing_flag + FROM live_setting_m + WHERE live_setting_id IN ( + SELECT live_setting_id + FROM normal_live_m + WHERE live_difficulty_id = ? + UNION ALL + SELECT live_setting_id + FROM special_live_m + WHERE live_difficulty_id = ? + ) + ` + _, err = ss.MainEng.SQL(sql, difficultyID, difficultyID).Get(&liveSetting) if ss.CheckErr(err) { return } + // fmt.Println("liveSetting", liveSetting) - // Song type: normal / special - // sqlite3 doesn't support FULL OUTER JOIN so use UNION ALL here. - sql := `SELECT notes_setting_asset,c_rank_score,b_rank_score,a_rank_score,s_rank_score,ac_flag,swing_flag FROM live_setting_m WHERE live_setting_id IN (SELECT live_setting_id FROM normal_live_m WHERE live_difficulty_id = ? UNION ALL SELECT live_setting_id FROM special_live_m WHERE live_difficulty_id = ?)` - var notes_setting_asset string - var c_rank_score, b_rank_score, a_rank_score, s_rank_score, ac_flag, swing_flag int - err = ss.MainEng.DB().QueryRow(sql, difficultyId, difficultyId).Scan(¬es_setting_asset, &c_rank_score, &b_rank_score, &a_rank_score, &s_rank_score, &ac_flag, &swing_flag) - if ss.CheckErr(err) { - return - } - - // fmt.Println(notes_setting_asset) - // fmt.Println(c_rank_score, b_rank_score, a_rank_score, s_rank_score) - - notes := []live.NotesList{} - // fmt.Println("./assets/serverdata/beatmaps/" + notes_setting_asset) - notes_list := honokautils.ReadAllText("./assets/serverdata/beatmaps/" + notes_setting_asset) + notes := []liveschema.NotesList{} + notes_list := utils.ReadAllText("./assets/serverdata/beatmaps/" + liveSetting.NotesSettingAsset) err = json.Unmarshal([]byte(notes_list), ¬es) if ss.CheckErr(err) { return } - ranks := []live.RankInfo{} - ranks = append(ranks, live.RankInfo{ + ranks := []liveschema.RankInfo{} + ranks = append(ranks, liveschema.RankInfo{ Rank: 5, RankMin: 0, - RankMax: c_rank_score, - }, live.RankInfo{ + RankMax: liveSetting.CRankScore, + }, liveschema.RankInfo{ Rank: 4, - RankMin: c_rank_score + 1, - RankMax: b_rank_score, - }, live.RankInfo{ + RankMin: liveSetting.CRankScore + 1, + RankMax: liveSetting.BRankScore, + }, liveschema.RankInfo{ Rank: 3, - RankMin: b_rank_score + 1, - RankMax: a_rank_score, - }, live.RankInfo{ + RankMin: liveSetting.BRankScore + 1, + RankMax: liveSetting.ARankScore, + }, liveschema.RankInfo{ Rank: 2, - RankMin: a_rank_score + 1, - RankMax: s_rank_score, - }, live.RankInfo{ + RankMin: liveSetting.ARankScore + 1, + RankMax: liveSetting.SRankScore, + }, liveschema.RankInfo{ Rank: 1, - RankMin: s_rank_score + 1, + RankMin: liveSetting.SRankScore + 1, RankMax: 0, }) - playResp := live.PreciseScoreResp{ - ResponseData: live.PreciseScoreData{ - On: live.On{ - HasRecord: false, - LiveInfo: live.LiveInfo{ - LiveDifficultyID: difficultyId, - IsRandom: false, - AcFlag: ac_flag, - SwingFlag: swing_flag, - NotesList: notes, + // 检查是否正在进行 Live + progress, _ := ss.GetLiveInProgress() + + // 检查是否有 Live 记录 + liveRecord := ss.GetUserLiveRecord(difficultyID) + + var skillOn liveschema.Skill + var skillOff liveschema.Skill + var playResp liveschema.PreciseScoreResp + + // 正在进行 Live + if progress { + // 返回默认 + playResp = liveschema.PreciseScoreResp{ + ResponseData: liveschema.PreciseScoreData{ + On: liveschema.Skill{ + HasRecord: false, + LiveInfo: liveschema.LiveInfo{ + LiveDifficultyID: difficultyID, + IsRandom: false, + AcFlag: liveSetting.AcFlag, + SwingFlag: liveSetting.SwingFlag, + NotesList: notes, + }, }, - }, - Off: live.Off{ - HasRecord: false, - LiveInfo: live.LiveInfo{ - LiveDifficultyID: difficultyId, - IsRandom: false, - AcFlag: ac_flag, - SwingFlag: swing_flag, - NotesList: notes, + Off: liveschema.Skill{ + HasRecord: false, + LiveInfo: liveschema.LiveInfo{ + LiveDifficultyID: difficultyID, + IsRandom: false, + AcFlag: liveSetting.AcFlag, + SwingFlag: liveSetting.SwingFlag, + NotesList: notes, + }, }, + RankInfo: ranks, + CanActivateEffect: true, + ServerTimestamp: time.Now().Unix(), }, - RankInfo: ranks, - CanActivateEffect: true, - ServerTimestamp: time.Now().Unix(), - }, - ReleaseInfo: []any{}, - StatusCode: 200, + ReleaseInfo: []any{}, + StatusCode: 200, + } + } else { + // 如果有 Live 记录 + if len(liveRecord) > 0 { + skillOn = liveschema.Skill{ + HasRecord: false, + RandomSeed: nil, + MaxCombo: nil, + UpdateDate: nil, + PreciseList: nil, + DeckInfo: nil, + TapAdjust: nil, // TODO: 不知道保存在哪里 + CanReplay: false, // TODO: 不知道保存在哪里 + } + skillOff = skillOn + + // 已完成的 Live 判断技能开关情况 + for _, record := range liveRecord { + // LiveInfo + var liveInfo liveschema.LiveInfo + err = json.Unmarshal([]byte(record.LiveInfoJSON), &liveInfo) + if ss.CheckErr(err) { + return + } + liveInfo.NotesList = notes + + // PreciseList + var preciseList []liveschema.PreciseList + err = json.Unmarshal([]byte(record.PreciseListJSON), &preciseList) + if ss.CheckErr(err) { + return + } + + // DeckInfo + var deckInfo usermodel.DeckInfo + err = json.Unmarshal([]byte(record.DeckInfoJSON), &deckInfo) + if ss.CheckErr(err) { + return + } + + // LiveSetting + var liveSetting liveschema.LiveSetting + err = json.Unmarshal([]byte(record.LiveSettingJSON), &liveSetting) + if ss.CheckErr(err) { + return + } + + // TriggerLog + var triggerLog []liveschema.TriggerLog + err = json.Unmarshal([]byte(record.TriggerLogJSON), &triggerLog) + if ss.CheckErr(err) { + return + } + + if record.IsSkillOn { + // 技能开 + skillOn.HasRecord = true + skillOn.LiveInfo = liveInfo + skillOn.RandomSeed = time.Now().Unix() // TODO: 从 /live/play 的 Timestamp 字段获取 + skillOn.MaxCombo = record.MaxCombo + skillOn.UpdateDate = record.UpdateDate + skillOn.PreciseList = preciseList + skillOn.DeckInfo = deckInfo + skillOn.LiveSetting = liveSetting + skillOn.TriggerLog = triggerLog + skillOn.TapAdjust = record.TapAdjust + skillOn.CanReplay = record.CanReplay + } else { + // 技能关 + skillOff.HasRecord = true + skillOff.LiveInfo = liveInfo + skillOff.RandomSeed = time.Now().Unix() // TODO: 从 /live/play 的 Timestamp 字段获取 + skillOff.MaxCombo = record.MaxCombo + skillOff.UpdateDate = record.UpdateDate + skillOff.PreciseList = preciseList + skillOff.DeckInfo = deckInfo + skillOff.LiveSetting = liveSetting + skillOff.TriggerLog = triggerLog + skillOff.TapAdjust = record.TapAdjust + skillOff.CanReplay = record.CanReplay + } + } + + playResp = liveschema.PreciseScoreResp{ + ResponseData: liveschema.PreciseScoreData{ + On: skillOn, + Off: skillOff, + RankInfo: ranks, + CanActivateEffect: true, + ServerTimestamp: time.Now().Unix(), + }, + ReleaseInfo: []any{}, + StatusCode: 200, + } + } else { + playResp = liveschema.PreciseScoreResp{ + ResponseData: map[string]constant.ErrorCode{ + "error_code": constant.ErrorCodeLivePreciseListNotFound, + }, + ReleaseInfo: []any{}, + StatusCode: 600, + } + } } ss.Respond(playResp) diff --git a/internal/handler/live/reward.go b/internal/handler/live/reward.go index 5d4f9bc..0807627 100644 --- a/internal/handler/live/reward.go +++ b/internal/handler/live/reward.go @@ -3,12 +3,11 @@ package live import ( "encoding/json" "honoka-chan/internal/middleware" - "honoka-chan/internal/model/user" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" - "honoka-chan/internal/schema/live" + liveschema "honoka-chan/internal/schema/live" "honoka-chan/internal/session" - "honoka-chan/pkg/db" - "strconv" + "honoka-chan/pkg/utils" "time" "github.com/gin-gonic/gin" @@ -16,68 +15,64 @@ import ( func reward(ctx *gin.Context) { ss := session.Get(ctx) - defer ss.Finalize() + defer func() { + ss.ClearLiveInProgress() + ss.Finalize() + }() - playRewardReq := live.RewardReq{} + playRewardReq := liveschema.RewardReq{} err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &playRewardReq) if ss.CheckErr(err) { return } + // fmt.Println(ctx.MustGet("request_data").(string)) - difficultyId := playRewardReq.LiveDifficultyID + difficultyID := playRewardReq.LiveDifficultyID + _, liveInfo := ss.GetLiveInfo(difficultyID) + _, progress := ss.GetLiveInProgress() // TODO: 添加返回指定状态码的方法 + _, deckInfo := ss.GetDeckInfo(progress.DeckID) + deckInfo.LiveDifficultyID = difficultyID - // Song type: normal / special - // sqlite3 doesn't support FULL OUTER JOIN so use UNION ALL here. - sql := `SELECT c_rank_score,b_rank_score,a_rank_score,s_rank_score,c_rank_combo,b_rank_combo,a_rank_combo,s_rank_combo,ac_flag,swing_flag FROM live_setting_m WHERE live_setting_id IN (SELECT live_setting_id FROM normal_live_m WHERE live_difficulty_id = ? UNION ALL SELECT live_setting_id FROM special_live_m WHERE live_difficulty_id = ?)` - var c_rank_score, b_rank_score, a_rank_score, s_rank_score, c_rank_combo, b_rank_combo, a_rank_combo, s_rank_combo, ac_flag, swing_flag int - err = ss.MainEng.DB().QueryRow(sql, difficultyId, difficultyId).Scan(&c_rank_score, &b_rank_score, &a_rank_score, &s_rank_score, &c_rank_combo, &b_rank_combo, &a_rank_combo, &s_rank_combo, &ac_flag, &swing_flag) + unitsList := []liveschema.PlayRewardUnitList{} + err = ss.UserEng.Table("user_deck_unit"). + Join("LEFT", "user_deck", "user_deck_unit.user_deck_id = user_deck.id"). + Where("user_deck.user_id = ? AND user_deck.deck_id = ?", ss.UserID, progress.DeckID). + Find(&unitsList) if ss.CheckErr(err) { return } - key := "live_deck_" + strconv.Itoa(ss.UserID) - deckId, err := db.Ldb.Get([]byte(key)) - if ss.CheckErr(err) { - return - } - unitsList := []live.PlayRewardUnitList{} - err = ss.UserEng.Table("user_deck_unit").Join("LEFT", "user_deck", "user_deck_unit.user_deck_id = user_deck.id"). - Where("user_id = ? AND deck_id = ?", ss.UserID, string(deckId)).Find(&unitsList) - if ss.CheckErr(err) { - return - } - - pref := user.UserPref{} + pref := usermodel.UserPref{} _, err = ss.UserEng.Table("user_pref").Where("user_id = ?", ss.UserID).Get(&pref) if ss.CheckErr(err) { return } totalScore := playRewardReq.ScoreSmile + playRewardReq.ScoreCool + playRewardReq.ScoreCute - playResp := live.RewardResp{ - ResponseData: live.RewardData{ - LiveInfo: []live.RewardLiveInfo{ + playResp := liveschema.RewardResp{ + ResponseData: liveschema.RewardData{ + LiveInfo: []liveschema.RewardLiveInfo{ { - LiveDifficultyID: difficultyId, + LiveDifficultyID: difficultyID, IsRandom: false, - AcFlag: ac_flag, - SwingFlag: swing_flag, + AcFlag: liveInfo.AcFlag, + SwingFlag: liveInfo.SwingFlag, }, }, TotalLove: 0, IsHighScore: true, HiScore: totalScore, - BaseRewardInfo: live.BaseRewardInfo{ + BaseRewardInfo: liveschema.BaseRewardInfo{ PlayerExp: 0, - PlayerExpUnitMax: live.PlayerExpUnitMax{ + PlayerExpUnitMax: liveschema.PlayerExpUnitMax{ Before: 0, After: 0, }, - PlayerExpFriendMax: live.PlayerExpFriendMax{ + PlayerExpFriendMax: liveschema.PlayerExpFriendMax{ Before: 99, After: 99, }, - PlayerExpLpMax: live.PlayerExpLpMax{ + PlayerExpLpMax: liveschema.PlayerExpLpMax{ Before: 417, After: 417, }, @@ -85,72 +80,26 @@ func reward(ctx *gin.Context) { GameCoinRewardBoxFlag: false, SocialPoint: 0, }, - RewardUnitList: live.RewardUnitList{ - LiveClear: []live.LiveClear{}, - LiveRank: []live.LiveRank{}, + RewardUnitList: liveschema.RewardUnitList{ + LiveClear: []liveschema.LiveClear{}, + LiveRank: []liveschema.LiveRank{}, LiveCombo: []any{}, }, UnlockedSubscenarioIds: []any{}, UnlockedMultiUnitScenarioIds: []any{}, - EffortPoint: []live.EffortPoint{}, + EffortPoint: []liveschema.EffortPoint{}, IsEffortPointVisible: false, LimitedEffortBox: []any{}, UnitList: unitsList, - BeforeUserInfo: live.BeforeUserInfo{ - Level: pref.UserLevel, - Exp: 1089696, - PreviousExp: 0, - NextExp: 1207185, - GameCoin: 999999999, - SnsCoin: 10000, - FreeSnsCoin: 50000, - PaidSnsCoin: 50000, - SocialPoint: 1438165, - UnitMax: 5000, - WaitingUnitMax: 1000, - CurrentEnergy: 417, - EnergyMax: 417, - TrainingEnergy: 9, - TrainingEnergyMax: 10, - EnergyFullTime: "2023-03-20 01:28:55", - LicenseLiveEnergyRecoverlyTime: 60, - FriendMax: 99, - TutorialState: -1, - OverMaxEnergy: 417, - UnlockRandomLiveMuse: 1, - UnlockRandomLiveAqours: 1, - }, - AfterUserInfo: live.AfterUserInfo{ - Level: pref.UserLevel, - Exp: 1089696, - PreviousExp: 0, - NextExp: 1207185, - GameCoin: 999999999, - SnsCoin: 100000, - FreeSnsCoin: 50000, - PaidSnsCoin: 50000, - SocialPoint: 1438375, - UnitMax: 5000, - WaitingUnitMax: 1000, - CurrentEnergy: 417, - EnergyMax: 417, - TrainingEnergy: 9, - TrainingEnergyMax: 10, - EnergyFullTime: "2023-03-20 01:28:55", - LicenseLiveEnergyRecoverlyTime: 60, - FriendMax: 99, - TutorialState: -1, - OverMaxEnergy: 417, - UnlockRandomLiveMuse: 1, - UnlockRandomLiveAqours: 1, - }, - NextLevelInfo: []live.NextLevelInfo{ + BeforeUserInfo: ss.GetUserInfo(), + AfterUserInfo: ss.GetUserInfo(), + NextLevelInfo: []liveschema.NextLevelInfo{ { Level: pref.UserLevel, FromExp: 1089696, }, }, - GoalAccompInfo: live.GoalAccompInfo{ + GoalAccompInfo: liveschema.GoalAccompInfo{ AchievedIds: []any{}, Rewards: []any{}, }, @@ -159,8 +108,8 @@ func reward(ctx *gin.Context) { DailyRewardInfo: []any{}, CanSendFriendRequest: false, UsingBuffInfo: []any{}, - ClassSystem: live.ClassSystem{ - RankInfo: live.RewardRankInfo{ + ClassSystem: liveschema.ClassSystem{ + RankInfo: liveschema.RewardRankInfo{ BeforeClassRankID: 10, AfterClassRankID: 10, RankUpDate: "2020-02-12 11:57:15", @@ -169,11 +118,11 @@ func reward(ctx *gin.Context) { IsOpened: true, IsVisible: true, }, - AccomplishedAchievementList: []live.AccomplishedAchievementList{}, + AccomplishedAchievementList: []liveschema.AccomplishedAchievementList{}, UnaccomplishedAchievementCnt: 0, AddedAchievementList: []any{}, - MuseumInfo: live.Museum{}, - UnitSupportList: []live.RewardUnitSupportList{}, + MuseumInfo: liveschema.Museum{}, + UnitSupportList: []liveschema.RewardUnitSupportList{}, ServerTimestamp: time.Now().Unix(), PresentCnt: 0, }, @@ -181,30 +130,58 @@ func reward(ctx *gin.Context) { StatusCode: 200, } - if playRewardReq.MaxCombo > s_rank_combo { + if playRewardReq.MaxCombo > liveInfo.SRankCombo { playResp.ResponseData.ComboRank = 1 - } else if playRewardReq.MaxCombo > a_rank_combo { + } else if playRewardReq.MaxCombo > liveInfo.ARankCombo { playResp.ResponseData.ComboRank = 2 - } else if playRewardReq.MaxCombo > b_rank_combo { + } else if playRewardReq.MaxCombo > liveInfo.BRankCombo { playResp.ResponseData.ComboRank = 3 - } else if playRewardReq.MaxCombo > c_rank_combo { + } else if playRewardReq.MaxCombo > liveInfo.CRankCombo { playResp.ResponseData.ComboRank = 4 } else { playResp.ResponseData.ComboRank = 5 } - if totalScore > s_rank_score { + if totalScore > liveInfo.SRankScore { playResp.ResponseData.Rank = 1 - } else if totalScore > a_rank_score { + } else if totalScore > liveInfo.ARankScore { playResp.ResponseData.Rank = 2 - } else if totalScore > b_rank_score { + } else if totalScore > liveInfo.BRankScore { playResp.ResponseData.Rank = 3 - } else if totalScore > c_rank_score { + } else if totalScore > liveInfo.CRankScore { playResp.ResponseData.Rank = 4 } else { playResp.ResponseData.Rank = 5 } + // 判断歌曲记录是否需要保存或者更新 + liveSetting := playRewardReq.PreciseScoreLog.LiveSetting + liveSetting.BackgroundID = ss.UserPref.BackgroundID + if playRewardReq.PreciseScoreLog.IsLogOn && liveSetting.PreciseScoreAutoUpdateFlag { + newLiveRecord := usermodel.UserLiveRecord{ + LiveDifficultyID: difficultyID, + DeckID: progress.DeckID, + TotalScore: totalScore, + PerfectCnt: playRewardReq.PerfectCnt, + GreatCnt: playRewardReq.GreatCnt, + GoodCnt: playRewardReq.GoodCnt, + BadCnt: playRewardReq.BadCnt, + MissCnt: playRewardReq.MissCnt, + MaxCombo: playRewardReq.MaxCombo, + IsSkillOn: playRewardReq.PreciseScoreLog.IsSkillOn, + LiveInfoJSON: utils.ToJSON(liveInfo), + PreciseListJSON: utils.ToJSON(playRewardReq.PreciseScoreLog.PreciseList), + DeckInfoJSON: utils.ToJSON(deckInfo), + TapAdjust: playRewardReq.PreciseScoreLog.TapAdjust, + LiveSettingJSON: utils.ToJSON(liveSetting), + CanReplay: true, + TriggerLogJSON: utils.ToJSON(playRewardReq.PreciseScoreLog.TriggerLog), + UserID: ss.UserID, + UpdateDate: time.Now().Format("2006-01-02 15:04:05"), + } + ss.UpdateUserLiveRecord(&newLiveRecord, liveSetting.PreciseScoreUpdateType) + } + ss.Respond(playResp) } diff --git a/internal/handler/login/authkey.go b/internal/handler/login/authkey.go index dc2f310..b277050 100644 --- a/internal/handler/login/authkey.go +++ b/internal/handler/login/authkey.go @@ -2,14 +2,14 @@ package login import ( "encoding/base64" - "encoding/json" "honoka-chan/internal/middleware" + loginmodel "honoka-chan/internal/model/login" "honoka-chan/internal/router" loginschema "honoka-chan/internal/schema/login" "honoka-chan/internal/session" - "honoka-chan/pkg/db" "honoka-chan/pkg/encrypt" honokautils "honoka-chan/pkg/utils" + "time" "github.com/gin-gonic/gin" "github.com/tidwall/gjson" @@ -38,18 +38,12 @@ func authKey(ctx *gin.Context) { serverToken := base64.StdEncoding.EncodeToString([]byte(honokautils.RandomStr(32))) authorizeToken := base64.StdEncoding.EncodeToString([]byte(honokautils.RandomStr(32))) - authJson, err := json.Marshal(map[string]any{ - "client_token": clientToken, - "server_token": serverToken, + ss.SetAuthKey(&loginmodel.AuthKey{ + AuthorizeToken: authorizeToken, + ClientToken: clientToken, + ServerToken: serverToken, + InsertDate: time.Now().Format("2006-01-02 15:04:05"), }) - if ss.CheckErr(err) { - return - } - - err = db.Ldb.Set([]byte(authorizeToken), authJson) - if ss.CheckErr(err) { - return - } ss.Respond(loginschema.AuthKeyResp{ ResponseData: loginschema.AuthKeyData{ diff --git a/internal/handler/login/login.go b/internal/handler/login/login.go index cce9ef4..851e4ef 100644 --- a/internal/handler/login/login.go +++ b/internal/handler/login/login.go @@ -7,10 +7,8 @@ import ( "honoka-chan/internal/router" loginschema "honoka-chan/internal/schema/login" "honoka-chan/internal/session" - "honoka-chan/pkg/db" "honoka-chan/pkg/encrypt" honokautils "honoka-chan/pkg/utils" - "strconv" "time" "github.com/gin-gonic/gin" @@ -21,16 +19,17 @@ func login(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - authData, err := db.Ldb.Get([]byte(ctx.MustGet("token").(string))) - if ss.CheckErr(err) { + has, authKeyData := ss.GetAuthKey(ctx.MustGet("token").(string)) + if !has { + ss.Abort(errors.New("invalid token")) return } - clientToken, err := base64.StdEncoding.DecodeString(gjson.Get(string(authData), "client_token").String()) + clientToken, err := base64.StdEncoding.DecodeString(authKeyData.ClientToken) if ss.CheckErr(err) { return } - serverToken, err := base64.StdEncoding.DecodeString(gjson.Get(string(authData), "server_token").String()) + serverToken, err := base64.StdEncoding.DecodeString(authKeyData.ServerToken) if ss.CheckErr(err) { return } @@ -55,7 +54,7 @@ func login(ctx *gin.Context) { authorizeToken := base64.StdEncoding.EncodeToString([]byte(honokautils.RandomStr(32))) - var userID int // 需要更新为字符串 + var userID int exists, err := ss.UserEng.Table("user_key").Where("key = ?", string(loginKey)).Cols("user_id").Get(&userID) if ss.CheckErr(err) { return @@ -66,11 +65,6 @@ func login(ctx *gin.Context) { return } - err = db.Ldb.Set([]byte(strconv.Itoa(userID)), []byte(authorizeToken)) - if ss.CheckErr(err) { - return - } - ss.Respond(loginschema.LoginResp{ ResponseData: loginschema.LoginData{ AuthorizeToken: authorizeToken, diff --git a/internal/handler/multiunit/scenariostartup.go b/internal/handler/multiunit/scenariostartup.go index b9d2817..4157d0f 100644 --- a/internal/handler/multiunit/scenariostartup.go +++ b/internal/handler/multiunit/scenariostartup.go @@ -4,7 +4,7 @@ import ( "encoding/json" "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/multiunit" + multiunitschema "honoka-chan/internal/schema/multiunit" "honoka-chan/internal/session" "time" @@ -15,14 +15,14 @@ func scenarioStartup(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - startReq := multiunit.ScenarioStartUpReq{} + startReq := multiunitschema.ScenarioStartUpReq{} err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &startReq) if ss.CheckErr(err) { return } - ss.Respond(multiunit.ScenarioStartUpResp{ - ResponseData: multiunit.ScenarioStartUpData{ + ss.Respond(multiunitschema.ScenarioStartUpResp{ + ResponseData: multiunitschema.ScenarioStartUpData{ MultiUnitScenarioID: startReq.MultiUnitScenarioID, ScenarioAdjustment: 50, ServerTimestamp: time.Now().Unix(), diff --git a/internal/handler/museum/info.go b/internal/handler/museum/info.go index ff09cf8..cd87c79 100644 --- a/internal/handler/museum/info.go +++ b/internal/handler/museum/info.go @@ -3,7 +3,7 @@ package museum import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/museum" + museumschema "honoka-chan/internal/schema/museum" "honoka-chan/internal/session" "time" @@ -33,10 +33,10 @@ func info(ctx *gin.Context) { coolBuff += content.CoolBuff contentsList = append(contentsList, content.MuseumContentsId) } - museumResp := museum.InfoResp{ - ResponseData: museum.InfoData{ - MuseumInfo: museum.Museum{ - Parameter: museum.Parameter{ + museumResp := museumschema.InfoResp{ + ResponseData: museumschema.InfoData{ + MuseumInfo: museumschema.Museum{ + Parameter: museumschema.Parameter{ Smile: smileBuff, Pure: pureBuff, Cool: coolBuff, diff --git a/internal/handler/notice/friendgreeting.go b/internal/handler/notice/friendgreeting.go index edac7b8..48d3be3 100644 --- a/internal/handler/notice/friendgreeting.go +++ b/internal/handler/notice/friendgreeting.go @@ -3,7 +3,7 @@ package notice import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/notice" + noticeschema "honoka-chan/internal/schema/notice" "honoka-chan/internal/session" "time" @@ -14,8 +14,8 @@ func friendGreeting(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - ss.Respond(notice.FriendGreetingResp{ - ResponseData: notice.FriendGreetingData{ + ss.Respond(noticeschema.FriendGreetingResp{ + ResponseData: noticeschema.FriendGreetingData{ NextId: 0, NoticeList: []any{}, ServerTimestamp: time.Now().Unix(), diff --git a/internal/handler/notice/friendvariety.go b/internal/handler/notice/friendvariety.go index 16bb8b3..721f68b 100644 --- a/internal/handler/notice/friendvariety.go +++ b/internal/handler/notice/friendvariety.go @@ -3,7 +3,7 @@ package notice import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/notice" + noticeschema "honoka-chan/internal/schema/notice" "honoka-chan/internal/session" "time" @@ -14,8 +14,8 @@ func friendVariety(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - ss.Respond(notice.FriendVarietyResp{ - ResponseData: notice.FriendVarietyData{ + ss.Respond(noticeschema.FriendVarietyResp{ + ResponseData: noticeschema.FriendVarietyData{ ItemCount: 1, NoticeList: []any{}, ServerTimestamp: time.Now().Unix(), diff --git a/internal/handler/notice/usergreetinghistory.go b/internal/handler/notice/usergreetinghistory.go index 2bd9ec8..cfea2c9 100644 --- a/internal/handler/notice/usergreetinghistory.go +++ b/internal/handler/notice/usergreetinghistory.go @@ -3,7 +3,7 @@ package notice import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/notice" + noticeschema "honoka-chan/internal/schema/notice" "honoka-chan/internal/session" "time" @@ -14,8 +14,8 @@ func userGreetingHistory(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - ss.Respond(notice.UserGreetingResp{ - ResponseData: notice.UserGreetingData{ + ss.Respond(noticeschema.UserGreetingResp{ + ResponseData: noticeschema.UserGreetingData{ ItemCount: 0, HasNext: false, NoticeList: []any{}, diff --git a/internal/handler/payment/productlist.go b/internal/handler/payment/productlist.go index 740fe69..5a18999 100644 --- a/internal/handler/payment/productlist.go +++ b/internal/handler/payment/productlist.go @@ -4,7 +4,7 @@ import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" paymentapischema "honoka-chan/internal/schema/api/payment" - "honoka-chan/internal/schema/payment" + paymentschema "honoka-chan/internal/schema/payment" "honoka-chan/internal/session" "time" @@ -15,8 +15,8 @@ func productList(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - prodResp := payment.ProductListResp{ - ResponseData: payment.ProductListData{ + prodResp := paymentschema.ProductListResp{ + ResponseData: paymentschema.ProductListData{ RestrictionInfo: paymentapischema.RestrictionInfo{ Restricted: false, }, diff --git a/internal/handler/personalnotice/get.go b/internal/handler/personalnotice/get.go index f1c1410..b6b0b0a 100644 --- a/internal/handler/personalnotice/get.go +++ b/internal/handler/personalnotice/get.go @@ -3,7 +3,7 @@ package personalnotice import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/personalnotice" + personalnoticeschema "honoka-chan/internal/schema/personalnotice" "honoka-chan/internal/session" "time" @@ -14,8 +14,8 @@ func get(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - noticeResp := personalnotice.GetResp{ - ResponseData: personalnotice.GetData{ + noticeResp := personalnoticeschema.GetResp{ + ResponseData: personalnoticeschema.GetData{ HasNotice: false, NoticeID: 0, Type: 0, diff --git a/internal/handler/profile/register.go b/internal/handler/profile/register.go index 79b9771..bab47c7 100644 --- a/internal/handler/profile/register.go +++ b/internal/handler/profile/register.go @@ -2,9 +2,9 @@ package profile import ( "honoka-chan/internal/middleware" - "honoka-chan/internal/model/user" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" - "honoka-chan/internal/schema/profile" + profileschema "honoka-chan/internal/schema/profile" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -16,7 +16,7 @@ func register(ctx *gin.Context) { defer ss.Finalize() req := gjson.Parse(ctx.PostForm("request_data")) - pref := user.UserPref{ + pref := usermodel.UserPref{ UserDesc: req.Get("introduction").String(), } @@ -25,7 +25,7 @@ func register(ctx *gin.Context) { return } - ss.Respond(profile.RegisterResp{ + ss.Respond(profileschema.RegisterResp{ ResponseData: []any{}, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/scenario/startup.go b/internal/handler/scenario/startup.go index 377b14d..3911eee 100644 --- a/internal/handler/scenario/startup.go +++ b/internal/handler/scenario/startup.go @@ -4,7 +4,7 @@ import ( "encoding/json" "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/scenario" + scenarioschema "honoka-chan/internal/schema/scenario" "honoka-chan/internal/session" "time" @@ -15,14 +15,14 @@ func startup(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - startReq := scenario.StartUpReq{} + startReq := scenarioschema.StartUpReq{} err := json.Unmarshal([]byte(ctx.PostForm("request_data")), &startReq) if ss.CheckErr(err) { return } - ss.Respond(scenario.StartUpResp{ - ResponseData: scenario.StartUpData{ + ss.Respond(scenarioschema.StartUpResp{ + ResponseData: scenarioschema.StartUpData{ ScenarioID: startReq.ScenarioID, ScenarioAdjustment: 50, ServerTimestamp: time.Now().Unix(), diff --git a/internal/handler/subscenario/startup.go b/internal/handler/subscenario/startup.go index 5d242b1..a6b8e06 100644 --- a/internal/handler/subscenario/startup.go +++ b/internal/handler/subscenario/startup.go @@ -4,7 +4,7 @@ import ( "encoding/json" "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/subscenario" + subscenarioschema "honoka-chan/internal/schema/subscenario" "honoka-chan/internal/session" "time" @@ -15,14 +15,14 @@ func startup(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - startReq := subscenario.StartUpReq{} + startReq := subscenarioschema.StartUpReq{} err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &startReq) if ss.CheckErr(err) { return } - ss.Respond(subscenario.StartUpResp{ - ResponseData: subscenario.StartUpData{ + ss.Respond(subscenarioschema.StartUpResp{ + ResponseData: subscenarioschema.StartUpData{ SubscenarioID: startReq.SubscenarioID, ScenarioAdjustment: 50, ServerTimestamp: time.Now().Unix(), diff --git a/internal/handler/tos/check.go b/internal/handler/tos/check.go index d970071..ebd5f5b 100644 --- a/internal/handler/tos/check.go +++ b/internal/handler/tos/check.go @@ -3,7 +3,7 @@ package tos import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/tos" + tosschema "honoka-chan/internal/schema/tos" "honoka-chan/internal/session" "time" @@ -14,8 +14,8 @@ func check(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - ss.Respond(tos.CheckResp{ - ResponseData: tos.CheckData{ + ss.Respond(tosschema.CheckResp{ + ResponseData: tosschema.CheckData{ TosID: 1, TosType: 1, IsAgreed: true, diff --git a/internal/handler/unit/deck.go b/internal/handler/unit/deck.go index 2e8ce6c..ac8d304 100644 --- a/internal/handler/unit/deck.go +++ b/internal/handler/unit/deck.go @@ -2,12 +2,12 @@ package unit import ( "encoding/json" - "errors" "honoka-chan/internal/middleware" + unitmodel "honoka-chan/internal/model/unit" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" - profileapischema "honoka-chan/internal/schema/api/profile" unitapischema "honoka-chan/internal/schema/api/unit" - "honoka-chan/internal/schema/unit" + unitschema "honoka-chan/internal/schema/unit" "honoka-chan/internal/session" "time" @@ -18,7 +18,7 @@ func deck(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - deckReq := unit.DeckReq{} + deckReq := unitschema.DeckReq{} err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &deckReq) if ss.CheckErr(err) { return @@ -63,53 +63,34 @@ func deck(ctx *gin.Context) { // 队伍成员信息 for _, u := range deck.UnitDeckDetail { // 成员信息 - newUnitData := profileapischema.UnitData{} - exists, err := ss.UserEng.Table("user_unit").Where("unit_owning_user_id = ?", u.UnitOwningUserID).Exist() + unitData := unitmodel.UnitDataMap{} + _, err = ss.GetBasicUnitInfo(). + Where("a.unit_owning_user_id = ?", u.UnitOwningUserID).Get(&unitData) if ss.CheckErr(err) { return } - if exists { - // fmt.Println("新成员为用户增加成员") - _, err = ss.UserEng.Table("user_unit").Where("unit_owning_user_id = ?", u.UnitOwningUserID).Get(&newUnitData) - if ss.CheckErr(err) { - return - } - } else { - exists, err := ss.MainEng.Table("common_unit_m").Where("unit_owning_user_id = ?", u.UnitOwningUserID).Exist() - if ss.CheckErr(err) { - return - } - if exists { - // fmt.Println("新成员为公共成员") - _, err = ss.MainEng.Table("common_unit_m").Where("unit_owning_user_id = ?", u.UnitOwningUserID).Get(&newUnitData) - if ss.CheckErr(err) { - return - } - } else { - // fmt.Println("新成员不存在") - err = errors.New("新成员不存在") - } - if ss.CheckErr(err) { - return - } - } - // fmt.Println("新的成员信息:", newUnitData) + // fmt.Println("新的成员信息:", unitData) // 插入新成员信息 - newUnitDeckData := unitapischema.UnitDeckData{} - b, err := json.Marshal(newUnitData) - if ss.CheckErr(err) { - return + newUnitDeckData := usermodel.UserDeckUnit{ + UserDeckID: userDeckId, + UnitOwningUserID: unitData.UnitOwningUserID, + UnitID: unitData.UnitID, + Position: u.Position, + Level: unitData.Level, + LevelLimitID: unitData.LevelLimitID, + DisplayRank: unitData.DisplayRank, + Love: unitData.Love, + UnitSkillLevel: unitData.UnitSkillLevel, + IsRankMax: unitData.IsRankMax, + IsLoveMax: unitData.IsLoveMax, + IsLevelMax: unitData.IsLevelMax, + IsSigned: unitData.IsSigned, + BeforeLove: unitData.MaxLove, + MaxLove: unitData.MaxLove, + UserID: ss.UserID, + InsertDate: time.Now().Unix(), } - err = json.Unmarshal(b, &newUnitDeckData) - if ss.CheckErr(err) { - return - } - newUnitDeckData.BeforeLove = newUnitDeckData.MaxLove - newUnitDeckData.Position = u.Position - newUnitDeckData.UserDeckID = userDeckId - newUnitDeckData.InsertData = time.Now().Unix() - _, err = ss.UserEng.Table("user_deck_unit").Insert(&newUnitDeckData) if ss.CheckErr(err) { return @@ -117,7 +98,7 @@ func deck(ctx *gin.Context) { } } - ss.Respond(unit.DeckResp{ + ss.Respond(unitschema.DeckResp{ ResponseData: []any{}, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/unit/deckname.go b/internal/handler/unit/deckname.go index 16b1f4e..e6cfbb7 100644 --- a/internal/handler/unit/deckname.go +++ b/internal/handler/unit/deckname.go @@ -5,7 +5,7 @@ import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" unitapischema "honoka-chan/internal/schema/api/unit" - "honoka-chan/internal/schema/unit" + unitschema "honoka-chan/internal/schema/unit" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -15,7 +15,7 @@ func deckName(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - deckReq := unit.DeckNameReq{} + deckReq := unitschema.DeckNameReq{} err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &deckReq) if ss.CheckErr(err) { return @@ -37,7 +37,7 @@ func deckName(ctx *gin.Context) { return } - ss.Respond(unit.DeckResp{ + ss.Respond(unitschema.DeckResp{ ResponseData: []any{}, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/unit/favorite.go b/internal/handler/unit/favorite.go index e767718..e7b0ec9 100644 --- a/internal/handler/unit/favorite.go +++ b/internal/handler/unit/favorite.go @@ -1,9 +1,11 @@ package unit import ( + "encoding/json" "honoka-chan/internal/middleware" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" - "honoka-chan/internal/schema/unit" + unitschema "honoka-chan/internal/schema/unit" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -13,7 +15,22 @@ func favorite(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - ss.Respond(unit.FavoriteResp{ + var req unitschema.FavoriteReq + err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &req) + if ss.CheckErr(err) { + return + } + + data := usermodel.UserUnitData{ + FavoriteFlag: req.FavoriteFlag != 0, + } + _, err = ss.UserEng.Table(new(usermodel.UserUnitData)). + ID(req.UnitOwningUserID).Cols("favorite_flag").Update(&data) + if ss.CheckErr(err) { + return + } + + ss.Respond(unitschema.FavoriteResp{ ResponseData: []any{}, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/unit/favoriteaccessory.go b/internal/handler/unit/favoriteaccessory.go new file mode 100644 index 0000000..9530c01 --- /dev/null +++ b/internal/handler/unit/favoriteaccessory.go @@ -0,0 +1,33 @@ +package unit + +import ( + "fmt" + "honoka-chan/internal/middleware" + "honoka-chan/internal/router" + "honoka-chan/internal/session" + + "github.com/gin-gonic/gin" +) + +type SetResp struct { + ResponseData []any `json:"response_data"` + ReleaseInfo []any `json:"release_info"` + StatusCode int `json:"status_code"` +} + +func favoriteAccessory(ctx *gin.Context) { + ss := session.Get(ctx) + defer ss.Finalize() + + fmt.Println(ctx.MustGet("request_data").(string)) + + ss.Respond(SetResp{ + ResponseData: []any{}, + ReleaseInfo: []any{}, + StatusCode: 200, + }) +} + +func init() { + router.AddHandler("main.php", "POST", "/unit/favoriteAccessory", middleware.Common, favoriteAccessory) +} diff --git a/internal/handler/unit/removableskillequipment.go b/internal/handler/unit/removableskillequipment.go index 818b193..367fc46 100644 --- a/internal/handler/unit/removableskillequipment.go +++ b/internal/handler/unit/removableskillequipment.go @@ -4,7 +4,7 @@ import ( "encoding/json" "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/unit" + unitschema "honoka-chan/internal/schema/unit" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -14,7 +14,7 @@ func removableSkillEquipment(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - req := unit.RemovableSkillEquipmentReq{} + req := unitschema.RemovableSkillEquipmentReq{} err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &req) if ss.CheckErr(err) { return @@ -34,7 +34,7 @@ func removableSkillEquipment(ctx *gin.Context) { // 佩戴宝石 for _, v := range req.Equip { // fmt.Println("Equip:", v.UnitOwningUserID, v.UnitRemovableSkillID) - data := unit.RemovableSkillEquipmentData{ + data := unitschema.RemovableSkillEquipmentData{ UnitRemovableSkillId: v.UnitRemovableSkillID, UnitOwningUserID: v.UnitOwningUserID, UserID: ss.UserID, @@ -45,7 +45,7 @@ func removableSkillEquipment(ctx *gin.Context) { } } - ss.Respond(unit.RemovableSkillEquipmentResp{ + ss.Respond(unitschema.RemovableSkillEquipmentResp{ ResponseData: []any{}, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/unit/sale.go b/internal/handler/unit/sale.go new file mode 100644 index 0000000..ca8b7a8 --- /dev/null +++ b/internal/handler/unit/sale.go @@ -0,0 +1,99 @@ +package unit + +import ( + "encoding/json" + "honoka-chan/internal/middleware" + usermodel "honoka-chan/internal/model/user" + "honoka-chan/internal/router" + unitschema "honoka-chan/internal/schema/unit" + "honoka-chan/internal/session" + "time" + + "github.com/gin-gonic/gin" +) + +func sale(ctx *gin.Context) { + ss := session.Get(ctx) + defer ss.Finalize() + + req := unitschema.SaleReq{} + err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &req) + if ss.CheckErr(err) { + return + } + + totalCoin := 0 + saleDetail := []unitschema.Detail{} + for _, id := range req.UnitOwningUserID { + salePrice := 1 // TODO: 从 unit_level_up_pattern_m 表获取实际价格 + totalCoin += salePrice + + _, unitData := ss.GetUserUnitInfo(id) + + saleDetail = append(saleDetail, unitschema.Detail{ + UnitOwningUserID: id, + UnitID: unitData.UnitID, + IsSigned: unitData.IsSigned, + Price: salePrice, + }) + + // 卸载宝石 + _, err = ss.UserEng.Table(new(usermodel.UserUnitSkillEquip)). + Where("unit_owning_user_id = ?", id).Delete() + if ss.CheckErr(err) { + return + } + + // 卸载饰品 + _, err = ss.UserEng.Table(new(usermodel.UserAccessoryWear)). + Where("unit_owning_user_id = ?", id).Delete() + if ss.CheckErr(err) { + return + } + + // 移除卡片 + _, err = ss.UserEng.Table(new(usermodel.UserUnitData)). + Where("unit_owning_user_id = ?", id).Delete() + if ss.CheckErr(err) { + return + } + } + + skillList := []int{} + err = ss.MainEng.Table("unit_removable_skill_m"). + Where("skill_type = 1").Cols("unit_removable_skill_id").Find(&skillList) + if ss.CheckErr(err) { + return + } + + owningData := []unitschema.OwningInfo{} + for _, sk := range skillList { + owningData = append(owningData, unitschema.OwningInfo{ + UnitRemovableSkillID: sk, + TotalAmount: 999, + EquippedAmount: 0, // TODO: 计算实际数量 + InsertDate: "2023-01-01 12:00:00", + }) + } + + ss.Respond(unitschema.SaleResp{ + ResponseData: unitschema.SaleData{ + Total: totalCoin, + Detail: saleDetail, + BeforeUserInfo: ss.GetUserInfo(), + AfterUserInfo: ss.GetUserInfo(), + RewardBoxFlag: false, + GetExchangePointList: []any{}, + UnitRemovableSkill: unitschema.UnitRemovableSkill{ + OwningInfo: owningData, + }, + ServerTimestamp: time.Now().Unix(), + }, + ReleaseInfo: []any{}, + StatusCode: 200, + }) +} + +func init() { + router.AddHandler("main.php", "POST", "/unit/sale", middleware.Common, sale) +} diff --git a/internal/handler/unit/setdisplayrank.go b/internal/handler/unit/setdisplayrank.go index 5c7fcf4..d1b8aec 100644 --- a/internal/handler/unit/setdisplayrank.go +++ b/internal/handler/unit/setdisplayrank.go @@ -1,9 +1,11 @@ package unit import ( + "encoding/json" "honoka-chan/internal/middleware" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" - "honoka-chan/internal/schema/unit" + unitschema "honoka-chan/internal/schema/unit" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -13,7 +15,22 @@ func setDisplayRank(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - ss.Respond(unit.SetDisplayRankResp{ + var req unitschema.SetDisplayRankReq + err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &req) + if ss.CheckErr(err) { + return + } + + data := usermodel.UserUnitData{ + DisplayRank: req.DisplayRank, + } + _, err = ss.UserEng.Table(new(usermodel.UserUnitData)). + ID(req.UnitOwningUserID).Cols("display_rank").Update(&data) + if ss.CheckErr(err) { + return + } + + ss.Respond(unitschema.SetDisplayRankResp{ ResponseData: []any{}, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/unit/wearaccessory.go b/internal/handler/unit/wearaccessory.go index 98dfe70..1830157 100644 --- a/internal/handler/unit/wearaccessory.go +++ b/internal/handler/unit/wearaccessory.go @@ -4,7 +4,7 @@ import ( "encoding/json" "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/unit" + unitschema "honoka-chan/internal/schema/unit" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -14,7 +14,7 @@ func wearAccessory(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - req := unit.WearAccessoryReq{} + req := unitschema.WearAccessoryReq{} err := json.Unmarshal([]byte(ctx.MustGet("request_data").(string)), &req) if ss.CheckErr(err) { return @@ -34,7 +34,7 @@ func wearAccessory(ctx *gin.Context) { // 佩戴饰品 for _, v := range req.Wear { // fmt.Println("Wear:", v.AccessoryOwningUserID, v.UnitOwningUserID) - data := unit.WearAccessoryData{ + data := unitschema.WearAccessoryData{ AccessoryOwningUserID: v.AccessoryOwningUserID, UnitOwningUserID: v.UnitOwningUserID, UserID: ss.UserID, @@ -45,7 +45,7 @@ func wearAccessory(ctx *gin.Context) { } } - ss.Respond(unit.WearAccessoryResp{ + ss.Respond(unitschema.WearAccessoryResp{ ResponseData: []any{}, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/user/changename.go b/internal/handler/user/changename.go index cf81e9f..23ba9d5 100644 --- a/internal/handler/user/changename.go +++ b/internal/handler/user/changename.go @@ -2,7 +2,7 @@ package user import ( "honoka-chan/internal/middleware" - "honoka-chan/internal/model/user" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" userschema "honoka-chan/internal/schema/user" "honoka-chan/internal/session" @@ -23,7 +23,7 @@ func changeName(ctx *gin.Context) { return } - pref := user.UserPref{ + pref := usermodel.UserPref{ UserName: req.Get("name").String(), } _, err = ss.UserEng.Table("user_pref").Where("user_id = ?", ss.UserID).Update(&pref) diff --git a/internal/handler/user/changenavi.go b/internal/handler/user/changenavi.go index b150b99..e41d05a 100644 --- a/internal/handler/user/changenavi.go +++ b/internal/handler/user/changenavi.go @@ -2,7 +2,7 @@ package user import ( "honoka-chan/internal/middleware" - "honoka-chan/internal/model/user" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" userschema "honoka-chan/internal/schema/user" "honoka-chan/internal/session" @@ -16,7 +16,7 @@ func changeNavi(ctx *gin.Context) { defer ss.Finalize() req := gjson.Parse(ctx.MustGet("request_data").(string)) - pref := user.UserPref{ + pref := usermodel.UserPref{ UnitOwningUserID: int(req.Get("unit_owning_user_id").Int()), } _, err := ss.UserEng.Table("user_pref").Where("user_id = ?", ss.UserID).Update(&pref) diff --git a/internal/handler/user/setnotificationtoken.go b/internal/handler/user/setnotificationtoken.go index d1e7c81..6b97a70 100644 --- a/internal/handler/user/setnotificationtoken.go +++ b/internal/handler/user/setnotificationtoken.go @@ -3,7 +3,7 @@ package user import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/user" + userschema "honoka-chan/internal/schema/user" "honoka-chan/internal/session" "github.com/gin-gonic/gin" @@ -13,7 +13,7 @@ func setNotificationToken(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - ss.Respond(user.SetNotificationTokenResp{ + ss.Respond(userschema.SetNotificationTokenResp{ ResponseData: []any{}, ReleaseInfo: []any{}, StatusCode: 200, diff --git a/internal/handler/user/userinfo.go b/internal/handler/user/userinfo.go index 7673d64..9b79881 100644 --- a/internal/handler/user/userinfo.go +++ b/internal/handler/user/userinfo.go @@ -2,9 +2,8 @@ package user import ( "honoka-chan/internal/middleware" - "honoka-chan/internal/model/user" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" - userapischema "honoka-chan/internal/schema/api/user" userschema "honoka-chan/internal/schema/user" "honoka-chan/internal/session" "time" @@ -16,7 +15,7 @@ func userInfo(ctx *gin.Context) { ss := session.Get(ctx) defer ss.Finalize() - pref := user.UserPref{} + pref := usermodel.UserPref{} _, err := ss.UserEng.Table("user_pref").Where("user_id = ?", ss.UserID).Get(&pref) if ss.CheckErr(err) { return @@ -24,36 +23,7 @@ func userInfo(ctx *gin.Context) { userResp := userschema.UserInfoResp{ ResponseData: userschema.UserInfoData{ - User: userapischema.UserInfo{ - UserID: ss.UserID, - Name: pref.UserName, - Level: pref.UserLevel, - Exp: 1089696, - PreviousExp: 0, - NextExp: 1207185, - GameCoin: 112124104, - SnsCoin: 100000, - FreeSnsCoin: 50000, - PaidSnsCoin: 50000, - SocialPoint: 999999999, - UnitMax: 5000, - WaitingUnitMax: 1000, - EnergyMax: 417, - EnergyFullTime: "2023-03-20 03:58:55", - LicenseLiveEnergyRecoverlyTime: 60, - EnergyFullNeedTime: 0, - OverMaxEnergy: 0, - TrainingEnergy: 100, - TrainingEnergyMax: 100, - FriendMax: 99, - InviteCode: pref.InviteCode, - InsertDate: "2015-08-10 18:58:30", - UpdateDate: "2018-08-09 18:13:12", - TutorialState: -1, - DiamondCoin: 0, - CrystalCoin: 0, - LpRecoveryItem: []userapischema.LpRecoveryItem{}, - }, + User: ss.GetUserInfo(), Birth: userschema.Birth{ BirthMonth: 10, BirthDay: 18, diff --git a/internal/handler/webui/login.go b/internal/handler/webui/login.go index 4622641..0f1a16c 100644 --- a/internal/handler/webui/login.go +++ b/internal/handler/webui/login.go @@ -3,7 +3,7 @@ package webui import ( "honoka-chan/internal/middleware" "honoka-chan/internal/router" - "honoka-chan/internal/schema/webui" + webuischema "honoka-chan/internal/schema/webui" "honoka-chan/internal/utils" "honoka-chan/pkg/db" "net/http" @@ -18,7 +18,7 @@ func login(ctx *gin.Context) { user := ctx.PostForm("user") pass := ctx.PostForm("pass") if area == "" || user == "" || pass == "" { - ctx.JSON(http.StatusOK, webui.Msg{ + ctx.JSON(http.StatusOK, webuischema.Msg{ Code: 1, Message: "参数不完整!", Redirect: "", @@ -28,10 +28,12 @@ func login(ctx *gin.Context) { userName := " " + area + "-" + user var userId int - exists, err := db.UserEng.Table("users").Where("phone = ? AND password = ?", userName, openssl.Md5ToString(pass)).Cols("user_id").Get(&userId) + exists, err := db.UserEng.Table("users"). + Where("phone = ? AND password = ?", userName, openssl.Md5ToString(pass)). + Cols("user_id").Get(&userId) utils.CheckErr(err) if !exists { - ctx.JSON(http.StatusOK, webui.Msg{ + ctx.JSON(http.StatusOK, webuischema.Msg{ Code: 1, Message: "账号不存在或者密码有误!", Redirect: "", @@ -46,7 +48,7 @@ func login(ctx *gin.Context) { session.Set("userid", userId) session.Save() - ctx.JSON(http.StatusOK, webui.Msg{ + ctx.JSON(http.StatusOK, webuischema.Msg{ Code: 0, Message: "登录成功!", Redirect: "/admin/index", diff --git a/internal/handler/webui/upload.go b/internal/handler/webui/upload.go index 27a3381..aa02259 100644 --- a/internal/handler/webui/upload.go +++ b/internal/handler/webui/upload.go @@ -3,8 +3,9 @@ package webui import ( "encoding/csv" "honoka-chan/internal/middleware" + unitmodel "honoka-chan/internal/model/unit" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/router" - "honoka-chan/internal/schema/api/profile" "honoka-chan/internal/utils" "honoka-chan/pkg/db" "net/http" @@ -34,11 +35,16 @@ func upload(ctx *gin.Context) { defer session.Close() if err = session.Begin(); err != nil { session.Rollback() - panic(err) + ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: err.Error()}) + return } f, err := os.Open(tmpPath) - utils.CheckErr(err) + if err != nil { + session.Rollback() + ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "文件创建失败!"}) + return + } defer f.Close() r := csv.NewReader(f) @@ -55,95 +61,57 @@ func upload(ctx *gin.Context) { return } - skillLv, err := strconv.Atoi(rr[1]) + skLv, err := strconv.Atoi(rr[1]) if err != nil { session.Rollback() ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "文件解析失败!"}) return } - var unitId, unitExp, unitRarity, unitHp, unitSigned int - exists, err := db.MainEng.Table("common_unit_m").Join("LEFT", "unit_m", "common_unit_m.unit_id = unit_m.unit_id"). - Where("unit_m.unit_number = ?", rr[0]). - Cols("common_unit_m.unit_id,common_unit_m.exp,unit_m.rarity,common_unit_m.max_hp,common_unit_m.is_signed"). - Get(&unitId, &unitExp, &unitRarity, &unitHp, &unitSigned) - utils.CheckErr(err) - + uData := unitmodel.CommonUnitData{} + exists, err := session.Table(new(unitmodel.CommonUnitData)).Where("unit_number = ?", rr[0]).Get(&uData) if !exists { session.Rollback() ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "卡片不存在!"}) return } - if unitRarity != 4 { + if uData.Rarity != 4 { session.Rollback() ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "仅支持导入UR卡片!"}) return } - if skillLv < 0 || skillLv > 8 { + if skLv < 0 || skLv > 8 { session.Rollback() ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "技能等级设置有误!"}) return } - var diffExp, diffSmile, diffPure, diffCool int - _, err = db.MainEng.Table("unit_level_limit_pattern_m").Where("unit_level_limit_id = 1 AND unit_level = 350"). - Cols("next_exp,smile_diff,pure_diff,cool_diff").Get(&diffExp, &diffSmile, &diffPure, &diffCool) - utils.CheckErr(err) - - isSigned := false - if unitSigned == 1 { - isSigned = true + unitData := usermodel.UserUnitData{ + UnitID: uData.UnitID, + FavoriteFlag: false, + DisplayRank: uData.MaxRank, + UserID: ctx.GetInt("userid"), + InsertDate: time.Now().Unix(), + UpdateDate: time.Now().Unix(), } - var skillExp int - if skillLv != 8 { - skillExp = 0 - } else { - skillExp = 29900 - } - - unitData := profile.UnitData{ - UserID: ctx.GetInt("userid"), - UnitID: unitId, - Exp: unitExp + diffExp, - NextExp: 0, - Level: 350, - MaxLevel: 350, - LevelLimitID: 1, - Rank: 2, - MaxRank: 2, - Love: 1000, - MaxLove: 1000, - UnitSkillExp: skillExp, - UnitSkillLevel: skillLv, - MaxHp: unitHp, - UnitRemovableSkillCapacity: 8, - FavoriteFlag: false, - DisplayRank: 2, - IsRankMax: true, - IsLoveMax: true, - IsLevelMax: true, - IsSigned: isSigned, - IsSkillLevelMax: true, - IsRemovableSkillCapacityMax: true, - InsertDate: time.Now().Format("2006-01-02 03:04:05"), - } - - _, err = session.Table("user_unit").Insert(&unitData) + _, err = session.Table(new(usermodel.UserUnitData)).Insert(&unitData) if err != nil { session.Rollback() - panic(err) + ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "卡片添加失败!"}) + return } if err = session.Commit(); err != nil { session.Rollback() - panic(err) + ctx.JSON(http.StatusOK, ErrMsg{Error: 1, Msg: "卡片添加失败!"}) + return } } - ctx.JSON(http.StatusOK, ErrMsg{Error: 0, Msg: "上传成功!"}) + ctx.JSON(http.StatusOK, ErrMsg{Error: 0, Msg: "导入成功,请重新打开游戏!"}) } func init() { diff --git a/internal/model/accessory/accessory.go b/internal/model/accessory/accessory.go new file mode 100644 index 0000000..2aec259 --- /dev/null +++ b/internal/model/accessory/accessory.go @@ -0,0 +1,11 @@ +package accessorymodel + +type Accessory struct { + AccessoryID int `xorm:"accessory_id pk"` + Exp int `xorm:"exp"` + SmileMax int `xorm:"smile_max"` + PureMax int `xorm:"pure_max"` + CoolMax int `xorm:"cool_max"` + DefaultMaxLevel int `xorm:"default_max_level"` + MaxLevel int `xorm:"max_level"` +} diff --git a/internal/model/ghome/devicekey.go b/internal/model/ghome/devicekey.go new file mode 100644 index 0000000..e3c4c4c --- /dev/null +++ b/internal/model/ghome/devicekey.go @@ -0,0 +1,7 @@ +package ghomemodel + +type DeviceKey struct { + ID int `xorm:"id pk autoincr"` + DeviceID string `xorm:"device_id"` + RandKey string `xorm:"rand_key"` +} diff --git a/internal/model/login/authkey.go b/internal/model/login/authkey.go new file mode 100644 index 0000000..64310be --- /dev/null +++ b/internal/model/login/authkey.go @@ -0,0 +1,9 @@ +package loginmodel + +type AuthKey struct { + ID int `xorm:"id pk autoincr"` + AuthorizeToken string `xorm:"authorize_token"` + ClientToken string `xorm:"client_token"` + ServerToken string `xorm:"server_token"` + InsertDate string `xorm:"insert_date"` +} diff --git a/internal/model/unit/commonunitdata.go b/internal/model/unit/commonunitdata.go new file mode 100644 index 0000000..bf7cd84 --- /dev/null +++ b/internal/model/unit/commonunitdata.go @@ -0,0 +1,70 @@ +package unitmodel + +type CommonUnitData struct { + ID int `xorm:"id pk autoincr" json:"-"` + UnitNumber int `xorm:"unit_number" json:"-"` + UnitID int `xorm:"unit_id" json:"unit_id"` + UnitTypeID int `xorm:"unit_type_id" json:"unit_type_id"` + Name string `xorm:"name" json:"name"` + Eponym string `xorm:"eponym" json:"eponym"` + Rarity int `xorm:"rarity" json:"rarity"` + Attribute int `xorm:"attribute" json:"attribute"` + Smile int `xorm:"smile" json:"smile"` + Cute int `xorm:"cute" json:"cute"` + Cool int `xorm:"cool" json:"cool"` + Exp int `xorm:"exp" json:"exp"` + Level int `xorm:"level" json:"level"` + MaxLevel int `xorm:"max_level" json:"max_level"` + LevelLimitID int `xorm:"level_limit_id" json:"level_limit_id"` + Rank int `xorm:"rank" json:"rank"` + MaxRank int `xorm:"max_rank" json:"max_rank"` + Love int `xorm:"love" json:"love"` + MaxLove int `xorm:"max_love" json:"max_love"` + UnitSkillExp int `xorm:"unit_skill_exp" json:"unit_skill_exp"` + UnitSkillLevel int `xorm:"unit_skill_level" json:"unit_skill_level"` + MaxHp int `xorm:"max_hp" json:"max_hp"` + UnitRemovableSkillCapacity int `xorm:"unit_removable_skill_capacity" json:"unit_removable_skill_capacity"` + IsRankMax bool `xorm:"is_rank_max" json:"is_rank_max"` + IsLoveMax bool `xorm:"is_love_max" json:"is_love_max"` + IsLevelMax bool `xorm:"is_level_max" json:"is_level_max"` + IsSigned bool `xorm:"is_signed" json:"is_signed"` + IsSkillLevelMax bool `xorm:"is_skill_level_max" json:"is_skill_level_max"` + IsRemovableSkillCapacityMax bool `xorm:"is_removable_skill_capacity_max" json:"is_removable_skill_capacity_max"` + InsertDate int64 `xorm:"insert_date" json:"insert_date"` +} + +type UnitDataMap struct { + UnitOwningUserID int `xorm:"unit_owning_user_id pk autoincr"` + FavoriteFlag bool `xorm:"favorite_flag"` + DisplayRank int `xorm:"display_rank"` + + ID int `xorm:"id pk autoincr" json:"-"` + UnitID int `xorm:"unit_id" json:"unit_id"` + UnitTypeID int `xorm:"unit_type_id" json:"unit_type_id"` + Name string `xorm:"name" json:"name"` + Eponym string `xorm:"eponym" json:"eponym"` + Rarity int `xorm:"rarity" json:"rarity"` + Attribute int `xorm:"attribute" json:"attribute"` + Smile int `xorm:"smile" json:"smile"` + Cute int `xorm:"cute" json:"cute"` + Cool int `xorm:"cool" json:"cool"` + Exp int `xorm:"exp" json:"exp"` + Level int `xorm:"level" json:"level"` + MaxLevel int `xorm:"max_level" json:"max_level"` + LevelLimitID int `xorm:"level_limit_id" json:"level_limit_id"` + Rank int `xorm:"rank" json:"rank"` + MaxRank int `xorm:"max_rank" json:"max_rank"` + Love int `xorm:"love" json:"love"` + MaxLove int `xorm:"max_love" json:"max_love"` + UnitSkillExp int `xorm:"unit_skill_exp" json:"unit_skill_exp"` + UnitSkillLevel int `xorm:"unit_skill_level" json:"unit_skill_level"` + MaxHp int `xorm:"max_hp" json:"max_hp"` + UnitRemovableSkillCapacity int `xorm:"unit_removable_skill_capacity" json:"unit_removable_skill_capacity"` + IsRankMax bool `xorm:"is_rank_max" json:"is_rank_max"` + IsLoveMax bool `xorm:"is_love_max" json:"is_love_max"` + IsLevelMax bool `xorm:"is_level_max" json:"is_level_max"` + IsSigned bool `xorm:"is_signed" json:"is_signed"` + IsSkillLevelMax bool `xorm:"is_skill_level_max" json:"is_skill_level_max"` + IsRemovableSkillCapacityMax bool `xorm:"is_removable_skill_capacity_max" json:"is_removable_skill_capacity_max"` + InsertDate int64 `xorm:"insert_date" json:"insert_date"` +} diff --git a/internal/model/unit/unitm.go b/internal/model/unit/unitm.go new file mode 100644 index 0000000..868f13f --- /dev/null +++ b/internal/model/unit/unitm.go @@ -0,0 +1,38 @@ +package unitmodel + +type UnitM struct { + UnitId int `xorm:"unit_id pk"` + UnitNumber int `xorm:"unit_number"` + UnitTypeId int `xorm:"unit_type_id"` + AlbumSeriesId *int `xorm:"album_series_id"` + Eponym *string `xorm:"eponym"` + EponymEn string `xorm:"eponym_en"` + Name string `xorm:"name"` + NameEn *string `xorm:"name_en"` + NormalCardId int `xorm:"normal_card_id"` + RankMaxCardId int `xorm:"rank_max_card_id"` + NormalIconAsset string `xorm:"normal_icon_asset"` + NormalIconAssetEn *string `xorm:"normal_icon_asset_en"` + RankMaxIconAsset string `xorm:"rank_max_icon_asset"` + RankMaxIconAssetEn *string `xorm:"rank_max_icon_asset_en"` + NormalUnitNaviAssetId int `xorm:"normal_unit_navi_asset_id"` + RankMaxUnitNaviAssetId int `xorm:"rank_max_unit_navi_asset_id"` + Rarity int `xorm:"rarity"` + AttributeId int `xorm:"attribute_id"` + DefaultUnitSkillId *int `xorm:"default_unit_skill_id"` + SkillAssetVoiceId *int `xorm:"skill_asset_voice_id"` + DefaultLeaderSkillId *int `xorm:"default_leader_skill_id"` + DefaultRemovableSkillCapacity int `xorm:"default_removable_skill_capacity"` + MaxRemovableSkillCapacity int `xorm:"max_removable_skill_capacity"` + DisableRankUp int `xorm:"disable_rank_up"` + RankMin int `xorm:"rank_min"` + RankMax int `xorm:"rank_max"` + UnitLevelUpPatternId int `xorm:"unit_level_up_pattern_id"` + HpMax int `xorm:"hp_max"` + SmileMax int `xorm:"smile_max"` + PureMax int `xorm:"pure_max"` + CoolMax int `xorm:"cool_max"` + ReinforceItemRankUpCost *int `xorm:"reinforce_item_rank_up_cost"` + SubUnitTypeId *int `xorm:"sub_unit_type_id"` + ReleaseTag *string `xorm:"release_tag"` +} diff --git a/internal/model/user/useraccessorywear.go b/internal/model/user/useraccessorywear.go index 507054c..8a2f74b 100644 --- a/internal/model/user/useraccessorywear.go +++ b/internal/model/user/useraccessorywear.go @@ -1,4 +1,4 @@ -package user +package usermodel type UserAccessoryWear struct { ID int `xorm:"id pk autoincr"` diff --git a/internal/model/user/userdeck.go b/internal/model/user/userdeck.go index f981652..058442b 100644 --- a/internal/model/user/userdeck.go +++ b/internal/model/user/userdeck.go @@ -1,4 +1,4 @@ -package user +package usermodel type UserDeck struct { ID int `xorm:"id pk autoincr"` diff --git a/internal/model/user/userdeckunit.go b/internal/model/user/userdeckunit.go index dc08a5d..8f6e027 100644 --- a/internal/model/user/userdeckunit.go +++ b/internal/model/user/userdeckunit.go @@ -1,4 +1,4 @@ -package user +package usermodel type UserDeckUnit struct { ID int `xorm:"id pk autoincr"` @@ -11,12 +11,13 @@ type UserDeckUnit struct { DisplayRank int `xorm:"display_rank"` Love int `xorm:"love"` UnitSkillLevel int `xorm:"unit_skill_level"` - IsRankMax int `xorm:"is_rank_max"` - IsLoveMax int `xorm:"is_love_max"` - IsLevelMax int `xorm:"is_level_max"` - IsSigned int `xorm:"is_signed"` + IsRankMax bool `xorm:"is_rank_max"` + IsLoveMax bool `xorm:"is_love_max"` + IsLevelMax bool `xorm:"is_level_max"` + IsSigned bool `xorm:"is_signed"` BeforeLove int `xorm:"before_love"` MaxLove int `xorm:"max_love"` + UserID int `xorm:"user_id"` InsertDate int64 `xorm:"insert_date"` } diff --git a/internal/model/user/userkey.go b/internal/model/user/userkey.go index c2d8a26..4dc9fb0 100644 --- a/internal/model/user/userkey.go +++ b/internal/model/user/userkey.go @@ -1,4 +1,4 @@ -package user +package usermodel type UserKey struct { ID int `xorm:"id pk autoincr"` diff --git a/internal/model/user/userlivegoal.go b/internal/model/user/userlivegoal.go new file mode 100644 index 0000000..39b13b3 --- /dev/null +++ b/internal/model/user/userlivegoal.go @@ -0,0 +1,11 @@ +package usermodel + +import "honoka-chan/internal/constant" + +type UserLiveGoal struct { + ID int `xorm:"id pk autoincr"` + LiveDifficultyID int `xorm:"live_difficulty_id"` + UserID int `xorm:"user_id"` + GoalType constant.LiveGoalType `xorm:"goal_type"` + CompletedAt int64 `xorm:"completed_at"` +} diff --git a/internal/model/user/userliveinprogress.go b/internal/model/user/userliveinprogress.go new file mode 100644 index 0000000..06b57b7 --- /dev/null +++ b/internal/model/user/userliveinprogress.go @@ -0,0 +1,7 @@ +package usermodel + +type UserLiveInProgress struct { + ID int `xorm:"id pk autoincr"` + DeckID int `xorm:"deck_id"` + UserID int `xorm:"user_id"` +} diff --git a/internal/model/user/userliverecord.go b/internal/model/user/userliverecord.go new file mode 100644 index 0000000..23b78fa --- /dev/null +++ b/internal/model/user/userliverecord.go @@ -0,0 +1,144 @@ +package usermodel + +type UserLiveRecord struct { + ID int `xorm:"id pk autoincr"` + LiveDifficultyID int `xorm:"live_difficulty_id"` + DeckID int `xorm:"deck_id"` + TotalScore int `xorm:"total_score"` // + PerfectCnt int `xorm:"perfect_cnt"` // + GreatCnt int `xorm:"great_cnt"` // + GoodCnt int `xorm:"good_cnt"` // + BadCnt int `xorm:"bad_cnt"` // + MissCnt int `xorm:"miss_cnt"` // + MaxCombo int `xorm:"max_combo"` + IsSkillOn bool `xorm:"is_skill_on"` + LiveInfoJSON string `xorm:"live_info_json"` + PreciseListJSON string `xorm:"precise_list_json"` + DeckInfoJSON string `xorm:"deck_info_json"` + TapAdjust int `xorm:"tap_adjust"` + LiveSettingJSON string `xorm:"live_setting_json"` + CanReplay bool `xorm:"can_replay"` + TriggerLogJSON string `xorm:"trigger_log_json"` + UserID int `xorm:"user_id"` + UpdateDate string `xorm:"insert_date"` +} + +// TODO: 转移到 schema 下 +type NotesList struct { + TimingSec float64 `json:"timing_sec"` + NotesAttribute int `json:"notes_attribute"` + NotesLevel int `json:"notes_level"` + Effect int `json:"effect"` + EffectValue int `json:"effect_value"` + Position int `json:"position"` +} + +type LiveInfo struct { + LiveDifficultyID int `json:"live_difficulty_id"` + IsRandom bool `json:"is_random"` + AcFlag int `json:"ac_flag"` + SwingFlag int `json:"swing_flag"` + NotesList []NotesList `json:"notes_list"` +} + +// TODO: 转移到 schema 下 +type PreciseList struct { + Count int `json:"count"` + Effect int `json:"effect"` + Accuracy int `json:"accuracy"` + Tap float64 `json:"tap"` + IsSame bool `json:"is_same"` + Release any `json:"release"` + Position int `json:"position"` + NoteNumber int `json:"note_number"` + FirstTouch any `json:"first_touch"` + Tp bool `json:"tp"` + Tpf any `json:"tpf"` +} + +// TODO: 转移到 schema 下 +type TotalStatus struct { + Hp int `json:"hp"` + Smile int `json:"smile"` + Cute int `json:"cute"` + Cool int `json:"cool"` +} + +type CenterBonus struct { + Hp int `json:"hp"` + Smile int `json:"smile"` + Cute int `json:"cute"` + Cool int `json:"cool"` +} + +type SiBonus struct { + Hp int `json:"hp"` + Smile int `json:"smile"` + Cute int `json:"cute"` + Cool int `json:"cool"` +} + +type AccessoryInfo struct { + AccessoryOwningUserID int `json:"accessory_owning_user_id"` + AccessoryID int `json:"accessory_id"` + Exp int `json:"exp"` + NextExp int `json:"next_exp"` + Level int `json:"level"` + MaxLevel int `json:"max_level"` + RankUpCount int `json:"rank_up_count"` + FavoriteFlag bool `json:"favorite_flag"` +} + +type UnitList struct { + UnitID int `json:"unit_id"` + Position int `json:"position"` + Level int `json:"level"` + LevelLimitID int `json:"level_limit_id"` + DisplayRank int `json:"display_rank"` + Love int `json:"love"` + UnitSkillLevel int `json:"unit_skill_level"` + IsRankMax bool `json:"is_rank_max"` + IsLoveMax bool `json:"is_love_max"` + IsLevelMax bool `json:"is_level_max"` + IsSigned bool `json:"is_signed"` + Rank int `json:"rank"` + MaxHp int `json:"max_hp"` + UnitRemovableSkillCapacity int `json:"unit_removable_skill_capacity"` + RemovableSkillIds []int `json:"removable_skill_ids"` + TotalStatus TotalStatus `json:"total_status"` + SiBonus SiBonus `json:"si_bonus"` + AccessoryInfo *AccessoryInfo `json:"accessory_info,omitempty"` +} + +type DeckInfo struct { + LiveDifficultyID int `json:"live_difficulty_id"` + TotalStatus TotalStatus `json:"total_status"` + CenterBonus CenterBonus `json:"center_bonus"` + SiBonus SiBonus `json:"si_bonus"` + UnitList []UnitList `json:"unit_list"` +} + +// TODO: 转移到 schema 下 +type Icon struct { + NormalID int `json:"normal_id"` + JustID int `json:"just_id"` + SlideID int `json:"slide_id"` +} + +type LiveSetting struct { + NotesSpeed float64 `json:"notes_speed"` + CutinBrightness int `json:"cutin_brightness"` + CutinType int `json:"cutin_type"` + EffectFlag bool `json:"effect_flag"` + StringSize int `json:"string_size"` + SeID int `json:"se_id"` + Icon Icon `json:"icon"` + BackgroundID int `json:"background_id"` + RandomValue int `json:"random_value"` +} + +// TODO: 转移到 schema 下 +type TriggerLog struct { + Position int `json:"position"` + ActivationRate int `json:"activation_rate"` +} diff --git a/internal/model/user/userpref.go b/internal/model/user/userpref.go index 289c0af..260a187 100644 --- a/internal/model/user/userpref.go +++ b/internal/model/user/userpref.go @@ -1,4 +1,4 @@ -package user +package usermodel type UserPref struct { ID int `xorm:"id pk autoincr"` diff --git a/internal/model/user/users.go b/internal/model/user/users.go index 8dd269a..cc50b2a 100644 --- a/internal/model/user/users.go +++ b/internal/model/user/users.go @@ -1,4 +1,4 @@ -package user +package usermodel type Users struct { ID int `xorm:"id pk autoincr"` diff --git a/internal/model/user/userunit.go b/internal/model/user/userunit.go index 6ce3a31..db08495 100644 --- a/internal/model/user/userunit.go +++ b/internal/model/user/userunit.go @@ -1,4 +1,4 @@ -package user +package usermodel type UserUnit struct { ID int `xorm:"id pk autoincr"` diff --git a/internal/model/user/userunitdata.go b/internal/model/user/userunitdata.go new file mode 100644 index 0000000..f32419c --- /dev/null +++ b/internal/model/user/userunitdata.go @@ -0,0 +1,11 @@ +package usermodel + +type UserUnitData struct { + UnitOwningUserID int `xorm:"unit_owning_user_id pk autoincr"` + UnitID int `xorm:"unit_id"` + FavoriteFlag bool `xorm:"favorite_flag"` + DisplayRank int `xorm:"display_rank"` + UserID int `xorm:"user_id"` + InsertDate int64 `xorm:"insert_date"` + UpdateDate int64 `xorm:"update_date"` +} diff --git a/internal/model/user/userunitskillequip.go b/internal/model/user/userunitskillequip.go index dcfd59f..ca064c6 100644 --- a/internal/model/user/userunitskillequip.go +++ b/internal/model/user/userunitskillequip.go @@ -1,4 +1,4 @@ -package user +package usermodel type UserUnitSkillEquip struct { ID int `xorm:"id pk autoincr"` diff --git a/internal/schema/album/seriesall.go b/internal/schema/album/seriesall.go index ee7789a..59602df 100644 --- a/internal/schema/album/seriesall.go +++ b/internal/schema/album/seriesall.go @@ -1,4 +1,4 @@ -package album +package albumschema type UnitList struct { UnitID int `json:"unit_id"` diff --git a/internal/schema/announce/checkstate.go b/internal/schema/announce/checkstate.go index 97bec02..9a28b80 100644 --- a/internal/schema/announce/checkstate.go +++ b/internal/schema/announce/checkstate.go @@ -1,4 +1,4 @@ -package announce +package announceschema type CheckStateData struct { HasUnreadAnnounce bool `json:"has_unread_announce"` diff --git a/internal/schema/api/album/all.go b/internal/schema/api/album/all.go index a92ce37..7167ebb 100644 --- a/internal/schema/api/album/all.go +++ b/internal/schema/api/album/all.go @@ -1,4 +1,4 @@ -package album +package albumapischema type UnitList struct { UnitID int `json:"unit_id"` diff --git a/internal/schema/api/api.go b/internal/schema/api/api.go index 3f89557..cef60f5 100644 --- a/internal/schema/api/api.go +++ b/internal/schema/api/api.go @@ -1,4 +1,4 @@ -package api +package apischema type ApiReq struct { Module string `json:"module"` diff --git a/internal/schema/api/award/info.go b/internal/schema/api/award/info.go index 47e3f2a..bf38bc4 100644 --- a/internal/schema/api/award/info.go +++ b/internal/schema/api/award/info.go @@ -1,4 +1,4 @@ -package award +package awardapischema type Info struct { AwardID int `json:"award_id"` diff --git a/internal/schema/api/background/info.go b/internal/schema/api/background/info.go index d974c1c..eb3609d 100644 --- a/internal/schema/api/background/info.go +++ b/internal/schema/api/background/info.go @@ -1,4 +1,4 @@ -package background +package backgroundapischema type Info struct { BackgroundID int `json:"background_id"` diff --git a/internal/schema/api/banner/list.go b/internal/schema/api/banner/list.go index 99c48d8..ef8b7a8 100644 --- a/internal/schema/api/banner/list.go +++ b/internal/schema/api/banner/list.go @@ -1,4 +1,4 @@ -package banner +package bannerapischema type BannerList struct { BannerType int `json:"banner_type"` diff --git a/internal/schema/api/challenge/info.go b/internal/schema/api/challenge/info.go index 871b584..ef786c4 100644 --- a/internal/schema/api/challenge/info.go +++ b/internal/schema/api/challenge/info.go @@ -1,4 +1,4 @@ -package challenge +package challengeapischema type InfoResp struct { Result []any `json:"result"` diff --git a/internal/schema/api/costume/list.go b/internal/schema/api/costume/list.go index db6b372..8aa2ba8 100644 --- a/internal/schema/api/costume/list.go +++ b/internal/schema/api/costume/list.go @@ -1,4 +1,4 @@ -package costume +package costumeapischema type CostumeList struct { UnitID int `json:"unit_id"` diff --git a/internal/schema/api/eventscenario/status.go b/internal/schema/api/eventscenario/status.go index 901c31b..7aaad92 100644 --- a/internal/schema/api/eventscenario/status.go +++ b/internal/schema/api/eventscenario/status.go @@ -1,4 +1,4 @@ -package eventscenario +package eventscenarioapischema type ChapterList struct { EventScenarioID int `json:"event_scenario_id"` diff --git a/internal/schema/api/exchange/owningpoint.go b/internal/schema/api/exchange/owningpoint.go index 33526a6..2d2bc90 100644 --- a/internal/schema/api/exchange/owningpoint.go +++ b/internal/schema/api/exchange/owningpoint.go @@ -1,4 +1,4 @@ -package exchange +package exchangeapischema type ExchangePointList struct { Rarity int `json:"rarity"` diff --git a/internal/schema/api/live/schedule.go b/internal/schema/api/live/schedule.go index 96f02c1..111cb3e 100644 --- a/internal/schema/api/live/schedule.go +++ b/internal/schema/api/live/schedule.go @@ -1,4 +1,4 @@ -package live +package liveapischema type LiveList struct { LiveDifficultyID int `json:"live_difficulty_id"` diff --git a/internal/schema/api/live/status.go b/internal/schema/api/live/status.go index a98dae4..e741a60 100644 --- a/internal/schema/api/live/status.go +++ b/internal/schema/api/live/status.go @@ -1,4 +1,4 @@ -package live +package liveapischema type NormalLiveStatusList struct { LiveDifficultyID int `json:"live_difficulty_id"` diff --git a/internal/schema/api/liveicon/info.go b/internal/schema/api/liveicon/info.go index 288b736..b6d3f42 100644 --- a/internal/schema/api/liveicon/info.go +++ b/internal/schema/api/liveicon/info.go @@ -1,4 +1,4 @@ -package liveicon +package liveiconapischema type InfoData struct { LiveNotesIconList []int `json:"live_notes_icon_list"` diff --git a/internal/schema/api/livese/info.go b/internal/schema/api/livese/info.go index f89c785..a496175 100644 --- a/internal/schema/api/livese/info.go +++ b/internal/schema/api/livese/info.go @@ -1,4 +1,4 @@ -package livese +package liveseapischema type InfoData struct { LiveSeList []int `json:"live_se_list"` diff --git a/internal/schema/api/login/topinfo.go b/internal/schema/api/login/topinfo.go index 49ab7f9..ccd9378 100644 --- a/internal/schema/api/login/topinfo.go +++ b/internal/schema/api/login/topinfo.go @@ -1,4 +1,4 @@ -package login +package loginapischema type LicenseInfo struct { LicenseList []any `json:"license_list"` diff --git a/internal/schema/api/login/topinfoonce.go b/internal/schema/api/login/topinfoonce.go index 45dc9d9..08a12fa 100644 --- a/internal/schema/api/login/topinfoonce.go +++ b/internal/schema/api/login/topinfoonce.go @@ -1,4 +1,4 @@ -package login +package loginapischema type Notification struct { Push bool `json:"push"` diff --git a/internal/schema/api/marathon/info.go b/internal/schema/api/marathon/info.go index 83d03df..6b6ba0c 100644 --- a/internal/schema/api/marathon/info.go +++ b/internal/schema/api/marathon/info.go @@ -1,4 +1,4 @@ -package marathon +package marathonapischema type InfoResp struct { Result []any `json:"result"` diff --git a/internal/schema/api/multiunit/scenariostatus.go b/internal/schema/api/multiunit/scenariostatus.go index 2889f01..8251fb2 100644 --- a/internal/schema/api/multiunit/scenariostatus.go +++ b/internal/schema/api/multiunit/scenariostatus.go @@ -1,4 +1,4 @@ -package multiunit +package multiunitapischema type ChapterList struct { MultiUnitScenarioID int `json:"multi_unit_scenario_id"` diff --git a/internal/schema/api/museum/info.go b/internal/schema/api/museum/info.go index f19e2fb..ce06602 100644 --- a/internal/schema/api/museum/info.go +++ b/internal/schema/api/museum/info.go @@ -1,4 +1,4 @@ -package museum +package museumapischema type Parameter struct { Smile int `json:"smile"` diff --git a/internal/schema/api/navigation/specialcutin.go b/internal/schema/api/navigation/specialcutin.go index 54b4528..1b251d1 100644 --- a/internal/schema/api/navigation/specialcutin.go +++ b/internal/schema/api/navigation/specialcutin.go @@ -1,4 +1,4 @@ -package navigation +package navigationapischema type SpecialCutinData struct { SpecialCutinList []any `json:"special_cutin_list"` diff --git a/internal/schema/api/notice/marquee.go b/internal/schema/api/notice/marquee.go index d597faf..5a10026 100644 --- a/internal/schema/api/notice/marquee.go +++ b/internal/schema/api/notice/marquee.go @@ -1,4 +1,4 @@ -package notice +package noticeapischema type MarqueeData struct { ItemCount int `json:"item_count"` diff --git a/internal/schema/api/payment/productlist.go b/internal/schema/api/payment/productlist.go index 9f7cf49..f69763d 100644 --- a/internal/schema/api/payment/productlist.go +++ b/internal/schema/api/payment/productlist.go @@ -1,4 +1,4 @@ -package payment +package paymentapischema type RestrictionInfo struct { Restricted bool `json:"restricted"` @@ -84,7 +84,7 @@ type UserStatus struct { type SubscriptionStatus struct { LicenseID int `json:"license_id"` LicenseType int `json:"license_type"` - LicenseInfo LicenseInfo `json:"license_info,omitempty"` + LicenseInfo LicenseInfo `json:"license_info"` UserStatus UserStatus `json:"user_status"` PurchaseCount int `json:"purchase_count"` BadgeFlag bool `json:"badge_flag"` diff --git a/internal/schema/api/profile/cardranking.go b/internal/schema/api/profile/cardranking.go index a06965d..fb9baed 100644 --- a/internal/schema/api/profile/cardranking.go +++ b/internal/schema/api/profile/cardranking.go @@ -1,7 +1,14 @@ -package profile +package profileapischema + +type CardRankingData struct { + UnitID int `json:"unit_id"` + TotalLove int `json:"total_love"` + Rank int `json:"rank"` + SignFlag bool `json:"sign_flag"` +} type CardRankingResp struct { - Result []any `json:"result"` + Result any `json:"result"` Status int `json:"status"` CommandNum bool `json:"commandNum"` TimeStamp int64 `json:"timeStamp"` diff --git a/internal/schema/api/profile/info.go b/internal/schema/api/profile/info.go index a53faab..f6c5dfb 100644 --- a/internal/schema/api/profile/info.go +++ b/internal/schema/api/profile/info.go @@ -1,4 +1,4 @@ -package profile +package profileapischema type UnitData struct { UnitOwningUserID int `xorm:"unit_owning_user_id pk autoincr" json:"unit_owning_user_id"` diff --git a/internal/schema/api/profile/livecnt.go b/internal/schema/api/profile/livecnt.go index 8c35e0b..6aae695 100644 --- a/internal/schema/api/profile/livecnt.go +++ b/internal/schema/api/profile/livecnt.go @@ -1,4 +1,4 @@ -package profile +package profileapischema type LiveCntData struct { Difficulty int `json:"difficulty"` diff --git a/internal/schema/api/scenario/status.go b/internal/schema/api/scenario/status.go index ffff05e..a246c98 100644 --- a/internal/schema/api/scenario/status.go +++ b/internal/schema/api/scenario/status.go @@ -1,4 +1,4 @@ -package scenario +package scenarioapischema type StatusList struct { ScenarioID int `json:"scenario_id"` diff --git a/internal/schema/api/subscenario/status.go b/internal/schema/api/subscenario/status.go index 1a5486b..86a71e5 100644 --- a/internal/schema/api/subscenario/status.go +++ b/internal/schema/api/subscenario/status.go @@ -1,4 +1,4 @@ -package subscenario +package subscenarioapischema type StatusList struct { SubscenarioID int `json:"subscenario_id"` diff --git a/internal/schema/api/unit/accessoryall.go b/internal/schema/api/unit/accessoryall.go index 1773f94..8dedf2c 100644 --- a/internal/schema/api/unit/accessoryall.go +++ b/internal/schema/api/unit/accessoryall.go @@ -1,4 +1,4 @@ -package unit +package unitapischema type AccessoryList struct { AccessoryOwningUserID int `json:"accessory_owning_user_id" xorm:"accessory_owning_user_id"` diff --git a/internal/schema/api/unit/accessorymaterialall.go b/internal/schema/api/unit/accessorymaterialall.go new file mode 100644 index 0000000..7dcabcb --- /dev/null +++ b/internal/schema/api/unit/accessorymaterialall.go @@ -0,0 +1,17 @@ +package unitapischema + +type AccessoryMaterialList struct { + AccessoryID int `json:"accessory_id"` + Amount int `json:"amount"` +} + +type AccessoryMaterialAllData struct { + AccessoryMaterialList []AccessoryMaterialList `json:"accessory_material_list"` +} + +type AccessoryMaterialAllResp struct { + Result AccessoryMaterialAllData `json:"result"` + Status int `json:"status"` + CommandNum bool `json:"commandNum"` + TimeStamp int64 `json:"timeStamp"` +} diff --git a/internal/schema/api/unit/accessorytab.go b/internal/schema/api/unit/accessorytab.go new file mode 100644 index 0000000..108a12d --- /dev/null +++ b/internal/schema/api/unit/accessorytab.go @@ -0,0 +1,22 @@ +package unitapischema + +type AssetList struct { + UnitTypeID int `json:"unit_type_id"` + AssetPath string `json:"asset_path"` +} + +type TabList struct { + TabName string `json:"tab_name"` + AssetList []AssetList `json:"asset_list"` +} + +type AccessoryTabData struct { + TabList []TabList `json:"tab_list"` +} + +type AccessoryTabResp struct { + Result AccessoryTabData `json:"result"` + Status int `json:"status"` + CommandNum bool `json:"commandNum"` + TimeStamp int64 `json:"timeStamp"` +} diff --git a/internal/schema/api/unit/all.go b/internal/schema/api/unit/all.go index 2d58003..7e0ae31 100644 --- a/internal/schema/api/unit/all.go +++ b/internal/schema/api/unit/all.go @@ -1,4 +1,4 @@ -package unit +package unitapischema type Costume struct { UnitID int `json:"unit_id"` diff --git a/internal/schema/api/unit/deckinfo.go b/internal/schema/api/unit/deckinfo.go index a434b0a..1059811 100644 --- a/internal/schema/api/unit/deckinfo.go +++ b/internal/schema/api/unit/deckinfo.go @@ -1,4 +1,4 @@ -package unit +package unitapischema type UserDeckData struct { ID int `xorm:"id pk autoincr"` @@ -26,7 +26,7 @@ type UnitDeckData struct { IsSigned bool `xorm:"is_signed" json:"is_signed"` BeforeLove int `xorm:"before_love" json:"before_love"` MaxLove int `xorm:"max_love" json:"max_love"` - InsertData int64 `xorm:"insert_date" json:"-"` + InsertDate int64 `xorm:"insert_date" json:"-"` } type UnitOwningUserIds struct { diff --git a/internal/schema/api/unit/removableskillinfo.go b/internal/schema/api/unit/removableskillinfo.go index 8ed7891..da98dd4 100644 --- a/internal/schema/api/unit/removableskillinfo.go +++ b/internal/schema/api/unit/removableskillinfo.go @@ -1,4 +1,4 @@ -package unit +package unitapischema type SkillEquipCount struct { UnitRemovableSkillId int `xorm:"unit_removable_skill_id"` diff --git a/internal/schema/api/unit/supporterall.go b/internal/schema/api/unit/supporterall.go index 40947a5..b7acb27 100644 --- a/internal/schema/api/unit/supporterall.go +++ b/internal/schema/api/unit/supporterall.go @@ -1,4 +1,4 @@ -package unit +package unitapischema type SupporterList struct { UnitID int `json:"unit_id"` diff --git a/internal/schema/api/user/getnavi.go b/internal/schema/api/user/getnavi.go index 73f3b06..c03517f 100644 --- a/internal/schema/api/user/getnavi.go +++ b/internal/schema/api/user/getnavi.go @@ -1,4 +1,4 @@ -package user +package userapischema type User struct { UserID int `json:"user_id"` diff --git a/internal/schema/api/user/info.go b/internal/schema/api/user/info.go index ee85867..7d82629 100644 --- a/internal/schema/api/user/info.go +++ b/internal/schema/api/user/info.go @@ -1,44 +1,10 @@ -package user +package userapischema -type LpRecoveryItem struct { - ItemID int `json:"item_id"` - Amount int `json:"amount"` -} - -type UserInfo struct { - UserID int `json:"user_id"` - Name string `json:"name"` - Level int `json:"level"` - Exp int `json:"exp"` - PreviousExp int `json:"previous_exp"` - NextExp int `json:"next_exp"` - GameCoin int `json:"game_coin"` - SnsCoin int `json:"sns_coin"` - FreeSnsCoin int `json:"free_sns_coin"` - PaidSnsCoin int `json:"paid_sns_coin"` - SocialPoint int `json:"social_point"` - UnitMax int `json:"unit_max"` - WaitingUnitMax int `json:"waiting_unit_max"` - EnergyMax int `json:"energy_max"` - EnergyFullTime string `json:"energy_full_time"` - LicenseLiveEnergyRecoverlyTime int `json:"license_live_energy_recoverly_time"` - EnergyFullNeedTime int `json:"energy_full_need_time"` - OverMaxEnergy int `json:"over_max_energy"` - TrainingEnergy int `json:"training_energy"` - TrainingEnergyMax int `json:"training_energy_max"` - FriendMax int `json:"friend_max"` - InviteCode string `json:"invite_code"` - InsertDate string `json:"insert_date"` - UpdateDate string `json:"update_date"` - TutorialState int `json:"tutorial_state"` - DiamondCoin int `json:"diamond_coin"` - CrystalCoin int `json:"crystal_coin"` - LpRecoveryItem []LpRecoveryItem `json:"lp_recovery_item"` -} +import userschema "honoka-chan/internal/schema/user" type InfoResp struct { - Result UserInfo `json:"result"` - Status int `json:"status"` - CommandNum bool `json:"commandNum"` - TimeStamp int64 `json:"timeStamp"` + Result userschema.UserInfo `json:"result"` + Status int `json:"status"` + CommandNum bool `json:"commandNum"` + TimeStamp int64 `json:"timeStamp"` } diff --git a/internal/schema/award/set.go b/internal/schema/award/set.go index f70b6e8..99fa510 100644 --- a/internal/schema/award/set.go +++ b/internal/schema/award/set.go @@ -1,4 +1,4 @@ -package award +package awardschema type SetResp struct { ResponseData []any `json:"response_data"` diff --git a/internal/schema/background/set.go b/internal/schema/background/set.go index 9b4be09..3c50d6f 100644 --- a/internal/schema/background/set.go +++ b/internal/schema/background/set.go @@ -1,4 +1,4 @@ -package background +package backgroundschema type SetResp struct { ResponseData []any `json:"response_data"` diff --git a/internal/schema/download/additional.go b/internal/schema/download/additional.go index 4fe32f9..446cc82 100644 --- a/internal/schema/download/additional.go +++ b/internal/schema/download/additional.go @@ -1,4 +1,4 @@ -package download +package downloadschema type AdditionalReq struct { Module string `json:"module"` diff --git a/internal/schema/download/batch.go b/internal/schema/download/batch.go index ea440cf..e5dd57d 100644 --- a/internal/schema/download/batch.go +++ b/internal/schema/download/batch.go @@ -1,4 +1,4 @@ -package download +package downloadschema type BatchReq struct { ClientVersion string `json:"client_version"` diff --git a/internal/schema/download/event.go b/internal/schema/download/event.go index e8fb6c7..87d56ca 100644 --- a/internal/schema/download/event.go +++ b/internal/schema/download/event.go @@ -1,4 +1,4 @@ -package download +package downloadschema type EventResp struct { ResponseData []any `json:"response_data"` diff --git a/internal/schema/download/update.go b/internal/schema/download/update.go index 8e9b61c..5d96bdb 100644 --- a/internal/schema/download/update.go +++ b/internal/schema/download/update.go @@ -1,4 +1,4 @@ -package download +package downloadschema type UpdateReq struct { Module string `json:"module"` diff --git a/internal/schema/download/url.go b/internal/schema/download/url.go index 120515c..190e890 100644 --- a/internal/schema/download/url.go +++ b/internal/schema/download/url.go @@ -1,4 +1,4 @@ -package download +package downloadschema type UrlReq struct { Module string `json:"module"` diff --git a/internal/schema/event/list.go b/internal/schema/event/list.go index 634bc58..cc46c0c 100644 --- a/internal/schema/event/list.go +++ b/internal/schema/event/list.go @@ -1,4 +1,4 @@ -package event +package eventschema type TargetList struct { Position int `json:"position"` diff --git a/internal/schema/gdpr/get.go b/internal/schema/gdpr/get.go index 08096a4..f7a7bb6 100644 --- a/internal/schema/gdpr/get.go +++ b/internal/schema/gdpr/get.go @@ -1,4 +1,4 @@ -package gdpr +package gdprschema type GetData struct { EnableGdpr bool `json:"enable_gdpr"` diff --git a/internal/schema/ghome/account.go b/internal/schema/ghome/account.go index 994b1b2..f035993 100644 --- a/internal/schema/ghome/account.go +++ b/internal/schema/ghome/account.go @@ -1,4 +1,4 @@ -package ghome +package ghomeschema type ActiveData struct { Message string `json:"message"` diff --git a/internal/schema/ghome/basic.go b/internal/schema/ghome/basic.go index 5a63354..f567ca4 100644 --- a/internal/schema/ghome/basic.go +++ b/internal/schema/ghome/basic.go @@ -1,4 +1,4 @@ -package ghome +package ghomeschema type GetCodeResp struct { Code int `json:"code"` diff --git a/internal/schema/ghome/guest.go b/internal/schema/ghome/guest.go index 718d3ec..d893b2c 100644 --- a/internal/schema/ghome/guest.go +++ b/internal/schema/ghome/guest.go @@ -1,4 +1,4 @@ -package ghome +package ghomeschema type GuestStatusData struct { Disablead int `json:"disablead"` diff --git a/internal/schema/ghome/misc.go b/internal/schema/ghome/misc.go index bfd6093..edab676 100644 --- a/internal/schema/ghome/misc.go +++ b/internal/schema/ghome/misc.go @@ -1,4 +1,4 @@ -package ghome +package ghomeschema type AgreementData struct { } diff --git a/internal/schema/lbonus/execute.go b/internal/schema/lbonus/execute.go index 2a54da3..d14d1c3 100644 --- a/internal/schema/lbonus/execute.go +++ b/internal/schema/lbonus/execute.go @@ -1,4 +1,4 @@ -package lbonus +package lbonusschema type Item struct { ItemID int `json:"item_id"` diff --git a/internal/schema/live/continue.go b/internal/schema/live/continue.go new file mode 100644 index 0000000..5da9a34 --- /dev/null +++ b/internal/schema/live/continue.go @@ -0,0 +1,13 @@ +package liveschema + +type ContinueData struct { + BeforeSnsCoin int `json:"before_sns_coin"` + AfterSnsCoin int `json:"after_sns_coin"` + ServerTimestamp int64 `json:"server_timestamp"` +} + +type ContinueResp struct { + ResponseData ContinueData `json:"response_data"` + ReleaseInfo []any `json:"release_info"` + StatusCode int `json:"status_code"` +} diff --git a/internal/schema/live/gameover.go b/internal/schema/live/gameover.go index b5efd81..3112d10 100644 --- a/internal/schema/live/gameover.go +++ b/internal/schema/live/gameover.go @@ -1,4 +1,4 @@ -package live +package liveschema type GameOverResp struct { ResponseData []any `json:"response_data"` diff --git a/internal/schema/live/partylist.go b/internal/schema/live/partylist.go new file mode 100644 index 0000000..0a736eb --- /dev/null +++ b/internal/schema/live/partylist.go @@ -0,0 +1,55 @@ +package liveschema + +import userschema "honoka-chan/internal/schema/user" + +type CenterUnitInfo struct { + UnitOwningUserID int `json:"unit_owning_user_id"` + UnitID int `json:"unit_id"` + Exp int `json:"exp"` + NextExp int `json:"next_exp"` + Level int `json:"level"` + LevelLimitID int `json:"level_limit_id"` + MaxLevel int `json:"max_level"` + Rank int `json:"rank"` + MaxRank int `json:"max_rank"` + Love int `json:"love"` + MaxLove int `json:"max_love"` + UnitSkillLevel int `json:"unit_skill_level"` + MaxHp int `json:"max_hp"` + FavoriteFlag bool `json:"favorite_flag"` + DisplayRank int `json:"display_rank"` + UnitSkillExp int `json:"unit_skill_exp"` + UnitRemovableSkillCapacity int `json:"unit_removable_skill_capacity"` + Attribute int `json:"attribute"` + Smile int `json:"smile"` + Cute int `json:"cute"` + Cool int `json:"cool"` + IsLoveMax bool `json:"is_love_max"` + IsLevelMax bool `json:"is_level_max"` + IsRankMax bool `json:"is_rank_max"` + IsSigned bool `json:"is_signed"` + IsSkillLevelMax bool `json:"is_skill_level_max"` + SettingAwardID int `json:"setting_award_id"` + RemovableSkillIds []int `json:"removable_skill_ids"` +} + +type PartyList struct { + UserInfo userschema.UserInfo `json:"user_info"` + CenterUnitInfo CenterUnitInfo `json:"center_unit_info"` + SettingAwardID int `json:"setting_award_id"` + AvailableSocialPoint int `json:"available_social_point"` + FriendStatus int `json:"friend_statuses"` +} + +type PartyListData struct { + PartyList []PartyList `json:"party_list"` + TrainingEnergy int `json:"training_energy"` + TrainingEnergyMax int `json:"training_energy_max"` + ServerTimestamp int64 `json:"server_timestamp"` +} + +type PartyListResp struct { + ResponseData PartyListData `json:"response_data"` + ReleaseInfo []any `json:"release_info"` + StatusCode int `json:"status_code"` +} diff --git a/internal/schema/live/play.go b/internal/schema/live/play.go index dac4b14..1e415fc 100644 --- a/internal/schema/live/play.go +++ b/internal/schema/live/play.go @@ -1,4 +1,4 @@ -package live +package liveschema type PlayReq struct { Module string `json:"module"` @@ -31,6 +31,14 @@ type NotesList struct { type LiveInfo struct { LiveDifficultyID int `json:"live_difficulty_id"` IsRandom bool `json:"is_random"` + ARankScore int `json:"-"` + BRankScore int `json:"-"` + CRankScore int `json:"-"` + SRankScore int `json:"-"` + ARankCombo int `json:"-"` + BRankCombo int `json:"-"` + CRankCombo int `json:"-"` + SRankCombo int `json:"-"` AcFlag int `json:"ac_flag"` SwingFlag int `json:"swing_flag"` NotesList []NotesList `json:"notes_list"` diff --git a/internal/schema/live/precisescore.go b/internal/schema/live/precisescore.go index b24e70b..0c271f9 100644 --- a/internal/schema/live/precisescore.go +++ b/internal/schema/live/precisescore.go @@ -1,4 +1,4 @@ -package live +package liveschema type PlayScoreReq struct { Module string `json:"module"` @@ -18,7 +18,9 @@ type On struct { PreciseList any `json:"precise_list"` DeckInfo any `json:"deck_info"` TapAdjust any `json:"tap_adjust"` + LiveSetting any `json:"live_setting,omitempty"` CanReplay bool `json:"can_replay"` + TriggerLog any `json:"trigger_log,omitempty"` } type Off struct { @@ -30,19 +32,35 @@ type Off struct { PreciseList any `json:"precise_list"` DeckInfo any `json:"deck_info"` TapAdjust any `json:"tap_adjust"` + LiveSetting any `json:"live_setting,omitempty"` CanReplay bool `json:"can_replay"` + TriggerLog any `json:"trigger_log,omitempty"` +} + +type Skill struct { + HasRecord bool `json:"has_record"` + LiveInfo LiveInfo `json:"live_info"` + RandomSeed any `json:"random_seed"` + MaxCombo any `json:"max_combo"` + UpdateDate any `json:"update_date"` + PreciseList any `json:"precise_list"` + DeckInfo any `json:"deck_info"` + TapAdjust any `json:"tap_adjust"` + LiveSetting any `json:"live_setting,omitempty"` + CanReplay bool `json:"can_replay"` + TriggerLog any `json:"trigger_log,omitempty"` } type PreciseScoreData struct { - On On `json:"on"` - Off Off `json:"off"` + On Skill `json:"on"` + Off Skill `json:"off"` RankInfo []RankInfo `json:"rank_info"` CanActivateEffect bool `json:"can_activate_effect"` ServerTimestamp int64 `json:"server_timestamp"` } type PreciseScoreResp struct { - ResponseData PreciseScoreData `json:"response_data"` - ReleaseInfo []any `json:"release_info"` - StatusCode int `json:"status_code"` + ResponseData any `json:"response_data"` + ReleaseInfo []any `json:"release_info"` + StatusCode int `json:"status_code"` } diff --git a/internal/schema/live/reward.go b/internal/schema/live/reward.go index bece48f..b89e412 100644 --- a/internal/schema/live/reward.go +++ b/internal/schema/live/reward.go @@ -1,4 +1,9 @@ -package live +package liveschema + +import ( + "honoka-chan/internal/constant" + userschema "honoka-chan/internal/schema/user" +) type RewardReq struct { Module string `json:"module"` @@ -31,26 +36,31 @@ type Icon struct { } type LiveSetting struct { - StringSize int `json:"string_size"` - PreciseScoreAutoUpdateFlag bool `json:"precise_score_auto_update_flag"` - SeID int `json:"se_id"` - CutinBrightness int `json:"cutin_brightness"` - RandomValue int `json:"random_value"` - PreciseScoreUpdateType int `json:"precise_score_update_type"` - EffectFlag bool `json:"effect_flag"` - NotesSpeed float64 `json:"notes_speed"` - Icon Icon `json:"icon"` - CutinType int `json:"cutin_type"` + StringSize int `json:"string_size"` + PreciseScoreAutoUpdateFlag bool `json:"precise_score_auto_update_flag"` + SeID int `json:"se_id"` + CutinBrightness int `json:"cutin_brightness"` + RandomValue int `json:"random_value"` + PreciseScoreUpdateType constant.PreciseScoreUpdateType `json:"precise_score_update_type"` + EffectFlag bool `json:"effect_flag"` + NotesSpeed float64 `json:"notes_speed"` + Icon Icon `json:"icon"` + CutinType int `json:"cutin_type"` + BackgroundID any `json:"background_id"` } type PreciseList struct { - Effect int `json:"effect"` Count int `json:"count"` - Tap float64 `json:"tap"` - NoteNumber int `json:"note_number"` - Position int `json:"position"` + Effect int `json:"effect"` Accuracy int `json:"accuracy"` + Tap float64 `json:"tap"` IsSame bool `json:"is_same"` + Release any `json:"release"` + Position int `json:"position"` + NoteNumber int `json:"note_number"` + FirstTouch any `json:"first_touch"` + Tp any `json:"tp"` + Tpf any `json:"tpf"` } type BackgroundScore struct { @@ -208,56 +218,6 @@ type PlayRewardUnitList struct { InsertData int64 `xorm:"insert_date" json:"-"` } -type BeforeUserInfo struct { - Level int `json:"level"` - Exp int `json:"exp"` - PreviousExp int `json:"previous_exp"` - NextExp int `json:"next_exp"` - GameCoin int `json:"game_coin"` - SnsCoin int `json:"sns_coin"` - FreeSnsCoin int `json:"free_sns_coin"` - PaidSnsCoin int `json:"paid_sns_coin"` - SocialPoint int `json:"social_point"` - UnitMax int `json:"unit_max"` - WaitingUnitMax int `json:"waiting_unit_max"` - CurrentEnergy int `json:"current_energy"` - EnergyMax int `json:"energy_max"` - TrainingEnergy int `json:"training_energy"` - TrainingEnergyMax int `json:"training_energy_max"` - EnergyFullTime string `json:"energy_full_time"` - LicenseLiveEnergyRecoverlyTime int `json:"license_live_energy_recoverly_time"` - FriendMax int `json:"friend_max"` - TutorialState int `json:"tutorial_state"` - OverMaxEnergy int `json:"over_max_energy"` - UnlockRandomLiveMuse int `json:"unlock_random_live_muse"` - UnlockRandomLiveAqours int `json:"unlock_random_live_aqours"` -} - -type AfterUserInfo struct { - Level int `json:"level"` - Exp int `json:"exp"` - PreviousExp int `json:"previous_exp"` - NextExp int `json:"next_exp"` - GameCoin int `json:"game_coin"` - SnsCoin int `json:"sns_coin"` - FreeSnsCoin int `json:"free_sns_coin"` - PaidSnsCoin int `json:"paid_sns_coin"` - SocialPoint int `json:"social_point"` - UnitMax int `json:"unit_max"` - WaitingUnitMax int `json:"waiting_unit_max"` - CurrentEnergy int `json:"current_energy"` - EnergyMax int `json:"energy_max"` - TrainingEnergy int `json:"training_energy"` - TrainingEnergyMax int `json:"training_energy_max"` - EnergyFullTime string `json:"energy_full_time"` - LicenseLiveEnergyRecoverlyTime int `json:"license_live_energy_recoverly_time"` - FriendMax int `json:"friend_max"` - TutorialState int `json:"tutorial_state"` - OverMaxEnergy int `json:"over_max_energy"` - UnlockRandomLiveMuse int `json:"unlock_random_live_muse"` - UnlockRandomLiveAqours int `json:"unlock_random_live_aqours"` -} - type NextLevelInfo struct { Level int `json:"level"` FromExp int `json:"from_exp"` @@ -335,8 +295,8 @@ type RewardData struct { IsEffortPointVisible bool `json:"is_effort_point_visible"` LimitedEffortBox []any `json:"limited_effort_box"` UnitList []PlayRewardUnitList `json:"unit_list"` - BeforeUserInfo BeforeUserInfo `json:"before_user_info"` - AfterUserInfo AfterUserInfo `json:"after_user_info"` + BeforeUserInfo userschema.UserInfo `json:"before_user_info"` + AfterUserInfo userschema.UserInfo `json:"after_user_info"` NextLevelInfo []NextLevelInfo `json:"next_level_info"` GoalAccompInfo GoalAccompInfo `json:"goal_accomp_info"` SpecialRewardInfo []any `json:"special_reward_info"` diff --git a/internal/schema/login/authkey.go b/internal/schema/login/authkey.go index 1fb9264..f1c33b5 100644 --- a/internal/schema/login/authkey.go +++ b/internal/schema/login/authkey.go @@ -1,4 +1,4 @@ -package login +package loginschema type AuthKeyData struct { AuthorizeToken string `json:"authorize_token"` diff --git a/internal/schema/login/login.go b/internal/schema/login/login.go index caf39f4..532b2b8 100644 --- a/internal/schema/login/login.go +++ b/internal/schema/login/login.go @@ -1,4 +1,4 @@ -package login +package loginschema type LoginData struct { AuthorizeToken string `json:"authorize_token"` diff --git a/internal/schema/multiunit/scenariostartup.go b/internal/schema/multiunit/scenariostartup.go index ec30c4a..27fb95a 100644 --- a/internal/schema/multiunit/scenariostartup.go +++ b/internal/schema/multiunit/scenariostartup.go @@ -1,4 +1,4 @@ -package multiunit +package multiunitschema type ScenarioStartUpReq struct { Module string `json:"module"` diff --git a/internal/schema/museum/info.go b/internal/schema/museum/info.go index e170521..eb4ab1a 100644 --- a/internal/schema/museum/info.go +++ b/internal/schema/museum/info.go @@ -1,4 +1,4 @@ -package museum +package museumschema type Parameter struct { Smile int `json:"smile"` diff --git a/internal/schema/notice/friendgreeting.go b/internal/schema/notice/friendgreeting.go index 2bb1972..8ce117f 100644 --- a/internal/schema/notice/friendgreeting.go +++ b/internal/schema/notice/friendgreeting.go @@ -1,4 +1,4 @@ -package notice +package noticeschema type FriendGreetingData struct { NextId int `json:"next_id"` diff --git a/internal/schema/notice/friendvariety.go b/internal/schema/notice/friendvariety.go index ab08a93..677874c 100644 --- a/internal/schema/notice/friendvariety.go +++ b/internal/schema/notice/friendvariety.go @@ -1,4 +1,4 @@ -package notice +package noticeschema type FriendVarietyData struct { ItemCount int `json:"item_count"` diff --git a/internal/schema/notice/usergreetinghistory.go b/internal/schema/notice/usergreetinghistory.go index 76620e4..c84d9ab 100644 --- a/internal/schema/notice/usergreetinghistory.go +++ b/internal/schema/notice/usergreetinghistory.go @@ -1,4 +1,4 @@ -package notice +package noticeschema type UserGreetingData struct { ItemCount int `json:"item_count"` diff --git a/internal/schema/payment/productlist.go b/internal/schema/payment/productlist.go index 97edcce..21fbd23 100644 --- a/internal/schema/payment/productlist.go +++ b/internal/schema/payment/productlist.go @@ -1,15 +1,15 @@ -package payment +package paymentschema -import "honoka-chan/internal/schema/api/payment" +import paymentapischema "honoka-chan/internal/schema/api/payment" type ProductListData struct { - RestrictionInfo payment.RestrictionInfo `json:"restriction_info"` - UnderAgeInfo payment.UnderAgeInfo `json:"under_age_info"` - SnsProductList []any `json:"sns_product_list"` - ProductList []any `json:"product_list"` - SubscriptionList []any `json:"subscription_list"` - ShowPointShop bool `json:"show_point_shop"` - ServerTimestamp int64 `json:"server_timestamp"` + RestrictionInfo paymentapischema.RestrictionInfo `json:"restriction_info"` + UnderAgeInfo paymentapischema.UnderAgeInfo `json:"under_age_info"` + SnsProductList []any `json:"sns_product_list"` + ProductList []any `json:"product_list"` + SubscriptionList []any `json:"subscription_list"` + ShowPointShop bool `json:"show_point_shop"` + ServerTimestamp int64 `json:"server_timestamp"` } type ProductListResp struct { diff --git a/internal/schema/personalnotice/get.go b/internal/schema/personalnotice/get.go index 37c43cd..d30d5dc 100644 --- a/internal/schema/personalnotice/get.go +++ b/internal/schema/personalnotice/get.go @@ -1,4 +1,4 @@ -package personalnotice +package personalnoticeschema type GetData struct { HasNotice bool `json:"has_notice"` diff --git a/internal/schema/profile/register.go b/internal/schema/profile/register.go index 8f339f0..b03ebba 100644 --- a/internal/schema/profile/register.go +++ b/internal/schema/profile/register.go @@ -1,4 +1,4 @@ -package profile +package profileschema type RegisterResp struct { ResponseData []any `json:"response_data"` diff --git a/internal/schema/scenario/startup.go b/internal/schema/scenario/startup.go index c99925f..fb49e23 100644 --- a/internal/schema/scenario/startup.go +++ b/internal/schema/scenario/startup.go @@ -1,4 +1,4 @@ -package scenario +package scenarioschema type StartUpReq struct { Module string `json:"module"` diff --git a/internal/schema/subscenario/startup.go b/internal/schema/subscenario/startup.go index 01eeb8c..44a3d5c 100644 --- a/internal/schema/subscenario/startup.go +++ b/internal/schema/subscenario/startup.go @@ -1,4 +1,4 @@ -package subscenario +package subscenarioschema type StartUpReq struct { Module string `json:"module"` diff --git a/internal/schema/tos/check.go b/internal/schema/tos/check.go index 01bcadf..ddaf1be 100644 --- a/internal/schema/tos/check.go +++ b/internal/schema/tos/check.go @@ -1,4 +1,4 @@ -package tos +package tosschema type CheckData struct { TosID int `json:"tos_id"` diff --git a/internal/schema/unit/deck.go b/internal/schema/unit/deck.go index 3a0e422..754f250 100644 --- a/internal/schema/unit/deck.go +++ b/internal/schema/unit/deck.go @@ -1,4 +1,4 @@ -package unit +package unitschema type UnitDeckDetail struct { Position int `json:"position"` diff --git a/internal/schema/unit/deckname.go b/internal/schema/unit/deckname.go index 9e78c53..9eff9ae 100644 --- a/internal/schema/unit/deckname.go +++ b/internal/schema/unit/deckname.go @@ -1,4 +1,4 @@ -package unit +package unitschema type DeckNameReq struct { Module string `json:"module"` diff --git a/internal/schema/unit/favorite.go b/internal/schema/unit/favorite.go index 8af1193..802baa6 100644 --- a/internal/schema/unit/favorite.go +++ b/internal/schema/unit/favorite.go @@ -1,4 +1,14 @@ -package unit +package unitschema + +type FavoriteReq struct { + Module string `json:"module"` + Action string `json:"action"` + TimeStamp int64 `json:"timeStamp"` + Mgd int `json:"mgd"` + FavoriteFlag int `json:"favorite_flag"` + UnitOwningUserID int `json:"unit_owning_user_id"` + CommandNum string `json:"commandNum"` +} type FavoriteResp struct { ResponseData []any `json:"response_data"` diff --git a/internal/schema/unit/removableskillequipment.go b/internal/schema/unit/removableskillequipment.go index 761319a..6e87686 100644 --- a/internal/schema/unit/removableskillequipment.go +++ b/internal/schema/unit/removableskillequipment.go @@ -1,4 +1,4 @@ -package unit +package unitschema type SkillRemove struct { UnitRemovableSkillID int `json:"unit_removable_skill_id"` diff --git a/internal/schema/unit/sale.go b/internal/schema/unit/sale.go new file mode 100644 index 0000000..913a71d --- /dev/null +++ b/internal/schema/unit/sale.go @@ -0,0 +1,48 @@ +package unitschema + +import userschema "honoka-chan/internal/schema/user" + +type SaleReq struct { + Module string `json:"module"` + Action string `json:"action"` + TimeStamp int `json:"timeStamp"` + Mgd int `json:"mgd"` + UnitSupportList []any `json:"unit_support_list"` + UnitOwningUserID []int `json:"unit_owning_user_id"` + CommandNum string `json:"commandNum"` +} + +type Detail struct { + UnitOwningUserID int `json:"unit_owning_user_id"` + UnitID int `json:"unit_id"` + IsSigned bool `json:"is_signed"` + Price int `json:"price"` +} + +type OwningInfo struct { + UnitRemovableSkillID int `json:"unit_removable_skill_id"` + TotalAmount int `json:"total_amount"` + EquippedAmount int `json:"equipped_amount"` + InsertDate string `json:"insert_date"` +} + +type UnitRemovableSkill struct { + OwningInfo []OwningInfo `json:"owning_info"` +} + +type SaleData struct { + Total int `json:"total"` + Detail []Detail `json:"detail"` + BeforeUserInfo userschema.UserInfo `json:"before_user_info"` + AfterUserInfo userschema.UserInfo `json:"after_user_info"` + RewardBoxFlag bool `json:"reward_box_flag"` + GetExchangePointList []any `json:"get_exchange_point_list"` + UnitRemovableSkill UnitRemovableSkill `json:"unit_removable_skill"` + ServerTimestamp int64 `json:"server_timestamp"` +} + +type SaleResp struct { + ResponseData SaleData `json:"response_data"` + ReleaseInfo []any `json:"release_info"` + StatusCode int `json:"status_code"` +} diff --git a/internal/schema/unit/setdisplayrank.go b/internal/schema/unit/setdisplayrank.go index 2c9c542..24dc477 100644 --- a/internal/schema/unit/setdisplayrank.go +++ b/internal/schema/unit/setdisplayrank.go @@ -1,4 +1,14 @@ -package unit +package unitschema + +type SetDisplayRankReq struct { + Module string `json:"module"` + Action string `json:"action"` + TimeStamp int64 `json:"timeStamp"` + Mgd int `json:"mgd"` + UnitOwningUserID int `json:"unit_owning_user_id"` + DisplayRank int `json:"display_rank"` + CommandNum string `json:"commandNum"` +} type SetDisplayRankResp struct { ResponseData []any `json:"response_data"` diff --git a/internal/schema/unit/wearaccessory.go b/internal/schema/unit/wearaccessory.go index e12debd..6edd896 100644 --- a/internal/schema/unit/wearaccessory.go +++ b/internal/schema/unit/wearaccessory.go @@ -1,4 +1,4 @@ -package unit +package unitschema type AccessoryRemove struct { AccessoryOwningUserID int `json:"accessory_owning_user_id"` diff --git a/internal/schema/user/changename.go b/internal/schema/user/changename.go index 0c3f5e5..143bce0 100644 --- a/internal/schema/user/changename.go +++ b/internal/schema/user/changename.go @@ -1,4 +1,4 @@ -package user +package userschema type ChangeNameData struct { BeforeName string `json:"before_name"` diff --git a/internal/schema/user/changenavi.go b/internal/schema/user/changenavi.go index 58259da..9baf287 100644 --- a/internal/schema/user/changenavi.go +++ b/internal/schema/user/changenavi.go @@ -1,4 +1,4 @@ -package user +package userschema type ChangeNaviResp struct { ResponseData []any `json:"response_data"` diff --git a/internal/schema/user/setnotificationtoken.go b/internal/schema/user/setnotificationtoken.go index c390276..eddc4b2 100644 --- a/internal/schema/user/setnotificationtoken.go +++ b/internal/schema/user/setnotificationtoken.go @@ -1,4 +1,4 @@ -package user +package userschema type SetNotificationTokenResp struct { ResponseData []any `json:"response_data"` diff --git a/internal/schema/user/userinfo.go b/internal/schema/user/userinfo.go index fb1fa10..9a35e63 100644 --- a/internal/schema/user/userinfo.go +++ b/internal/schema/user/userinfo.go @@ -1,6 +1,43 @@ -package user +package userschema -import "honoka-chan/internal/schema/api/user" +type LpRecoveryItem struct { + ItemID int `json:"item_id"` + Amount int `json:"amount"` +} + +type UserInfo struct { + UserID int `json:"user_id"` + Name string `json:"name"` + Level int `json:"level"` + Exp int `json:"exp"` + PreviousExp int `json:"previous_exp"` + NextExp int `json:"next_exp"` + GameCoin int `json:"game_coin"` + SnsCoin int `json:"sns_coin"` + FreeSnsCoin int `json:"free_sns_coin"` + PaidSnsCoin int `json:"paid_sns_coin"` + SocialPoint int `json:"social_point"` + UnitMax int `json:"unit_max"` + WaitingUnitMax int `json:"waiting_unit_max"` + CurrentEnergy int `json:"current_energy"` + EnergyMax int `json:"energy_max"` + EnergyFullTime string `json:"energy_full_time"` + LicenseLiveEnergyRecoverlyTime int `json:"license_live_energy_recoverly_time"` + EnergyFullNeedTime int `json:"energy_full_need_time"` + OverMaxEnergy int `json:"over_max_energy"` + TrainingEnergy int `json:"training_energy"` + TrainingEnergyMax int `json:"training_energy_max"` + FriendMax int `json:"friend_max"` + InviteCode string `json:"invite_code"` + InsertDate string `json:"insert_date"` + UpdateDate string `json:"update_date"` + TutorialState int `json:"tutorial_state"` + DiamondCoin int `json:"diamond_coin"` + CrystalCoin int `json:"crystal_coin"` + UnlockRandomLiveMuse int `json:"unlock_random_live_muse"` + UnlockRandomLiveAqours int `json:"unlock_random_live_aqours"` + // LpRecoveryItem []LpRecoveryItem `json:"lp_recovery_item"` +} type Birth struct { BirthMonth int `json:"birth_month"` @@ -8,9 +45,9 @@ type Birth struct { } type UserInfoData struct { - User user.UserInfo `json:"user"` - Birth Birth `json:"birth"` - ServerTimestamp int64 `json:"server_timestamp"` + User UserInfo `json:"user"` + Birth Birth `json:"birth"` + ServerTimestamp int64 `json:"server_timestamp"` } type UserInfoResp struct { diff --git a/internal/schema/webui/webui.go b/internal/schema/webui/webui.go index cea8d63..94d4cfc 100644 --- a/internal/schema/webui/webui.go +++ b/internal/schema/webui/webui.go @@ -1,4 +1,4 @@ -package webui +package webuischema type Msg struct { Code int `json:"code"` diff --git a/internal/session/accessory.go b/internal/session/accessory.go new file mode 100644 index 0000000..caddcc2 --- /dev/null +++ b/internal/session/accessory.go @@ -0,0 +1,53 @@ +package session + +import ( + accessorymodel "honoka-chan/internal/model/accessory" + usermodel "honoka-chan/internal/model/user" +) + +func (ss *Session) GetUserAccessoryWearByUnitOwningUserID(unitOwningUserID int) (bool, *usermodel.UserAccessoryWear) { + wearData := usermodel.UserAccessoryWear{} + has, err := ss.UserEng.Table(new(usermodel.UserAccessoryWear)). + Where("unit_owning_user_id = ?", unitOwningUserID).Get(&wearData) + if ss.CheckErr(err) { + return false, nil + } + + return has, &wearData +} + +func (ss *Session) GetAccessoryByAccessoryOwningUserID(accessoryOwningUserID int) (bool, *accessorymodel.Accessory) { + accessoryData := accessorymodel.Accessory{} + has, err := ss.MainEng.Table("common_accessory_m").Alias("a"). + Join("LEFT", "accessory_m", "a.accessory_id = accessory_m.accessory_id"). + Where("a.accessory_owning_user_id = ?", accessoryOwningUserID). + Cols("accessory_m.*,a.exp").Get(&accessoryData) + if ss.CheckErr(err) { + return false, nil + } + + return has, &accessoryData +} + +func (ss *Session) GetUserAccessoryInfoByUnitOwningUserID(unitOwningUserID int) (bool, *usermodel.AccessoryInfo) { + has, wearData := ss.GetUserAccessoryWearByUnitOwningUserID(unitOwningUserID) + if !has { + return false, nil + } + + has, accessoryData := ss.GetAccessoryByAccessoryOwningUserID(wearData.AccessoryOwningUserID) + if !has { + return false, nil + } + + return has, &usermodel.AccessoryInfo{ + AccessoryOwningUserID: wearData.AccessoryOwningUserID, + AccessoryID: accessoryData.AccessoryID, + Exp: accessoryData.Exp, + NextExp: 0, + Level: accessoryData.MaxLevel, + MaxLevel: accessoryData.MaxLevel, + RankUpCount: accessoryData.MaxLevel - accessoryData.DefaultMaxLevel, + FavoriteFlag: true, + } +} diff --git a/internal/session/deck.go b/internal/session/deck.go new file mode 100644 index 0000000..7ff6ff2 --- /dev/null +++ b/internal/session/deck.go @@ -0,0 +1,32 @@ +package session + +import ( + usermodel "honoka-chan/internal/model/user" +) + +func (ss *Session) GetUserDeck(deckID int) (bool, *usermodel.UserDeck) { + deckData := usermodel.UserDeck{} + has, err := ss.UserEng.Table("user_deck"). + Where("user_id = ? AND deck_id = ?", ss.UserID, deckID).Get(&deckData) + if ss.CheckErr(err) { + return false, nil + } + + return has, &deckData +} + +func (ss *Session) GetUserDeckUnit(deckID int) []usermodel.UserDeckUnit { + has, deckData := ss.GetUserDeck(deckID) + if !has { + return []usermodel.UserDeckUnit{} + } + + unitData := []usermodel.UserDeckUnit{} + err := ss.UserEng.Table("user_deck_unit"). + Where("user_deck_id = ?", deckData.ID).Find(&unitData) + if ss.CheckErr(err) { + return []usermodel.UserDeckUnit{} + } + + return unitData +} diff --git a/internal/session/ghome.go b/internal/session/ghome.go new file mode 100644 index 0000000..e70a6b8 --- /dev/null +++ b/internal/session/ghome.go @@ -0,0 +1,39 @@ +package session + +import ( + ghomemodel "honoka-chan/internal/model/ghome" +) + +func (ss *Session) GetDeviceID() string { + return ss.Ctx.Request.Header.Get("X-DEVICEID") +} + +func (ss *Session) GetRandKey() []byte { + deviceKey := ghomemodel.DeviceKey{} + has, err := ss.UserEng.Table(new(ghomemodel.DeviceKey)). + Where("device_id = ?", ss.GetDeviceID()).Get(&deviceKey) + if ss.CheckErr(err) { + return nil + } + + if !has { + return nil + } + + return []byte(deviceKey.RandKey) +} +func (ss *Session) SetRandKey(key string) { + var err error + if ss.GetRandKey() == nil { + _, err = ss.UserEng.Insert(&ghomemodel.DeviceKey{ + DeviceID: ss.GetDeviceID(), + RandKey: key, + }) + } else { + _, err = ss.UserEng.Table(new(ghomemodel.DeviceKey)). + Where("device_id = ?", ss.GetDeviceID()).Update(&ghomemodel.DeviceKey{RandKey: key}) + } + if ss.CheckErr(err) { + return + } +} diff --git a/internal/session/live.go b/internal/session/live.go new file mode 100644 index 0000000..6fc79b5 --- /dev/null +++ b/internal/session/live.go @@ -0,0 +1,215 @@ +package session + +import ( + "encoding/json" + "honoka-chan/internal/constant" + usermodel "honoka-chan/internal/model/user" + liveschema "honoka-chan/internal/schema/live" + "honoka-chan/pkg/utils" +) + +// Move from LevelDB to SQLite +// https://github.com/YumeMichi/honoka-chan/blob/a749efad9fd0789668dedcb59948248da369d32c/handler/live.go#L554 +// https://github.com/DarkEnergyProcessor/NPPS4/blob/29aaba6e7a3b4b80d414e58f4b511a9627cb0e24/npps4/system/live.py#L360 +func (ss *Session) GetLiveInProgress() (bool, *usermodel.UserLiveInProgress) { + progress := usermodel.UserLiveInProgress{} + has, err := ss.UserEng.Table(new(usermodel.UserLiveInProgress)). + Where("user_id = ?", ss.UserID).Get(&progress) + if ss.CheckErr(err) { + return false, nil + } + + return has, &progress +} + +// Move from LevelDB to SQLite +// https://github.com/YumeMichi/honoka-chan/blob/a749efad9fd0789668dedcb59948248da369d32c/handler/live.go#L45 +// https://github.com/DarkEnergyProcessor/NPPS4/blob/29aaba6e7a3b4b80d414e58f4b511a9627cb0e24/npps4/system/live.py#L372 +func (ss *Session) RegisterLiveInProgress(deckID int) { + var err error + has, progress := ss.GetLiveInProgress() + if has { + progress.DeckID = deckID + _, err = ss.UserEng.Table(new(usermodel.UserLiveInProgress)).ID(progress.ID).Update(progress) + } else { + progress = &usermodel.UserLiveInProgress{ + DeckID: deckID, + UserID: ss.UserID, + } + _, err = ss.UserEng.Table(new(usermodel.UserLiveInProgress)).Insert(progress) + } + if ss.CheckErr(err) { + return + } +} + +// Move from LevelDB to SQLite +// https://github.com/YumeMichi/honoka-chan/blob/a749efad9fd0789668dedcb59948248da369d32c/handler/live.go#L554 +// https://github.com/DarkEnergyProcessor/NPPS4/blob/29aaba6e7a3b4b80d414e58f4b511a9627cb0e24/npps4/system/live.py#L366 +func (ss *Session) ClearLiveInProgress() { + _, err := ss.UserEng.Table(new(usermodel.UserLiveInProgress)).Where("user_id = ?", ss.UserID).Delete() + if ss.CheckErr(err) { + return + } +} + +func (ss *Session) GetLiveInfo(LiveDifficultyID int) (bool, *liveschema.LiveInfo) { + var info struct { + LiveDifficultyID int `xorm:"live_difficulty_id"` + NotesSettingAsset string `xorm:"notes_setting_asset"` + ARankScore int `xorm:"a_rank_score"` + BRankScore int `xorm:"b_rank_score"` + CRankScore int `xorm:"c_rank_score"` + SRankScore int `xorm:"s_rank_score"` + ARankCombo int `xorm:"a_rank_combo"` + BRankCombo int `xorm:"b_rank_combo"` + CRankCombo int `xorm:"c_rank_combo"` + SRankCombo int `xorm:"s_rank_combo"` + AcFlag int `xorm:"ac_flag"` + SwingFlag int `xorm:"swing_flag"` + } + has, err := ss.MainEng.Table("special_live_m").Alias("a"). + Join("LEFT", "live_setting_m", "a.live_setting_id = live_setting_m.live_setting_id"). + Where("live_difficulty_id = ?", LiveDifficultyID). + Cols("a.live_difficulty_id,live_setting_m.*").Get(&info) + if ss.CheckErr(err) { + return false, nil + } + + if !has { + has, err = ss.MainEng.Table("special_live_m").Alias("a"). + Join("LEFT", "live_setting_m", "a.live_setting_id = live_setting_m.live_setting_id"). + Where("live_difficulty_id = ?", LiveDifficultyID). + Cols("a.live_difficulty_id,live_setting_m.*").Get(&info) + if ss.CheckErr(err) { + return false, nil + } + } + + var notesList []liveschema.NotesList + if has { + noteData := utils.ReadAllText("./assets/serverdata/beatmaps/" + info.NotesSettingAsset) + err = json.Unmarshal([]byte(noteData), ¬esList) + if ss.CheckErr(err) { + return false, nil + } + } + + return has, &liveschema.LiveInfo{ + LiveDifficultyID: info.LiveDifficultyID, + IsRandom: false, + ARankScore: info.ARankScore, + BRankScore: info.BRankScore, + CRankScore: info.CRankScore, + SRankScore: info.SRankScore, + ARankCombo: info.ARankCombo, + BRankCombo: info.BRankCombo, + CRankCombo: info.CRankCombo, + SRankCombo: info.SRankCombo, + AcFlag: info.AcFlag, + SwingFlag: info.SwingFlag, + NotesList: notesList, + } +} + +func (ss *Session) GetDeckInfo(deckID int) (bool, *usermodel.DeckInfo) { + // 卡片信息 + totalHp, totalSmile, totalCute, totalCool := 0, 0, 0, 0 + unitData := []usermodel.UnitList{} + units := ss.GetUserDeckUnit(deckID) + for _, u := range units { + _, uData := ss.GetUnitInfo(u.UnitID) + tempUnitData := usermodel.UnitList{ + UnitID: u.UnitID, + Position: u.Position, + Level: u.Level, + LevelLimitID: u.LevelLimitID, + DisplayRank: u.DisplayRank, + Love: u.MaxLove, + UnitSkillLevel: u.UnitSkillLevel, + IsRankMax: u.IsRankMax, + IsLoveMax: u.IsLoveMax, + IsLevelMax: u.IsLevelMax, + IsSigned: u.IsSigned, + Rank: uData.Rank, + MaxHp: uData.MaxHp, + UnitRemovableSkillCapacity: uData.UnitRemovableSkillCapacity, + TotalStatus: usermodel.TotalStatus{ + Hp: uData.MaxHp, + Smile: uData.Smile, + Cute: uData.Cute, + Cool: uData.Cool, + }, + SiBonus: usermodel.SiBonus{ + Hp: 0, + Smile: 0, + Cute: 0, + Cool: 0, + }, + } + + // 技能宝石信息 + skillData := ss.GetUserUnitSkillEquipID(u.UnitOwningUserID) + tempUnitData.RemovableSkillIds = skillData + + // 饰品信息 + has, accessoryData := ss.GetUserAccessoryInfoByUnitOwningUserID(u.UnitOwningUserID) + if has { + tempUnitData.AccessoryInfo = accessoryData + } + + // 其他属性 + totalHp += uData.MaxHp + totalSmile += uData.Smile + totalCute += uData.Cute + totalCool += uData.Cool + + unitData = append(unitData, tempUnitData) + } + + return true, &usermodel.DeckInfo{ + TotalStatus: usermodel.TotalStatus{ + Hp: totalHp, + Smile: totalSmile, + Cute: totalCute, + Cool: totalCool, + }, + CenterBonus: usermodel.CenterBonus{ // TODO: 计算C位加成 + Hp: 0, + Smile: 0, + Cute: 0, + Cool: 0, + }, + SiBonus: usermodel.SiBonus{ + Hp: 0, + Smile: 0, + Cute: 0, + Cool: 0, + }, + UnitList: unitData, + } +} + +func (ss *Session) GetLiveGoalList(LiveDifficultyID int) []constant.LiveGoalType { + var goal []constant.LiveGoalType + err := ss.MainEng.Table("live_goal_reward_m"). + Where("live_difficulty_id = ?", LiveDifficultyID).Cols("live_goal_type").Find(&goal) + if ss.CheckErr(err) { + return []constant.LiveGoalType{} + } + return goal +} + +func (ss *Session) GetUserLiveGoalList(LiveDifficultyID int) []constant.LiveGoalType { + var goal []constant.LiveGoalType + var goalData []usermodel.UserLiveGoal + err := ss.UserEng.Table(new(usermodel.UserLiveGoal)). + Where("user_id = ? AND live_difficulty_id = ?", ss.UserID, LiveDifficultyID).Find(&goalData) + if ss.CheckErr(err) { + return []constant.LiveGoalType{} + } + for _, g := range goalData { + goal = append(goal, g.GoalType) + } + return goal +} diff --git a/internal/session/login.go b/internal/session/login.go new file mode 100644 index 0000000..f95feb7 --- /dev/null +++ b/internal/session/login.go @@ -0,0 +1,21 @@ +package session + +import loginmodel "honoka-chan/internal/model/login" + +func (ss *Session) GetAuthKey(token string) (bool, *loginmodel.AuthKey) { + authKeyData := loginmodel.AuthKey{} + has, err := ss.UserEng.Table(new(loginmodel.AuthKey)). + Where("authorize_token = ?", token).Get(&authKeyData) + if ss.CheckErr(err) { + return false, nil + } + + return has, &authKeyData +} + +func (ss *Session) SetAuthKey(authKey *loginmodel.AuthKey) { + _, err := ss.UserEng.Insert(authKey) + if ss.CheckErr(err) { + return + } +} diff --git a/internal/session/session.go b/internal/session/session.go index e69a39e..194fd2b 100644 --- a/internal/session/session.go +++ b/internal/session/session.go @@ -2,8 +2,7 @@ package session import ( "encoding/json" - "errors" - "honoka-chan/internal/model/user" + usermodel "honoka-chan/internal/model/user" "honoka-chan/internal/utils" "honoka-chan/pkg/db" "log" @@ -19,7 +18,7 @@ type Session struct { UserEng *xorm.Session UserID int - UserPref user.UserPref + UserPref usermodel.UserPref } func New(ctx *gin.Context) *Session { @@ -33,14 +32,7 @@ func New(ctx *gin.Context) *Session { userID := ctx.GetString("userid") if userID != "" { - exist, err := ss.UserEng.Table("user_pref").Where("user_id = ?", userID).Get(&ss.UserPref) - if ss.CheckErr(err) { - return nil - } - if !exist { - ss.Abort(errors.New("user not exist!")) - return nil - } + ss.UserPref = ss.GetUserPref(userID) ss.UserID = ss.UserPref.UserID } @@ -77,18 +69,6 @@ func (ss *Session) CheckErr(err error) bool { return false } -func (ss *Session) GetDeviceID() string { - return ss.Ctx.Request.Header.Get("X-DEVICEID") -} - -func (ss *Session) GetRandKey() []byte { - key, err := db.Ldb.Get([]byte(ss.GetDeviceID())) - if ss.CheckErr(err) { - return nil - } - return key -} - func (ss *Session) Respond(resp any) { data, err := json.Marshal(resp) if ss.CheckErr(err) { diff --git a/internal/session/unit.go b/internal/session/unit.go new file mode 100644 index 0000000..d91ac76 --- /dev/null +++ b/internal/session/unit.go @@ -0,0 +1,67 @@ +package session + +import ( + unitmodel "honoka-chan/internal/model/unit" + usermodel "honoka-chan/internal/model/user" + + "xorm.io/xorm" +) + +func (ss *Session) GetBasicUnitInfo() *xorm.Session { + return ss.UserEng.Table("user_unit_data").Alias("a"). + Join("LEFT", "common_unit_data", "a.unit_id = common_unit_data.unit_id"). + Cols(` + a.unit_owning_user_id, + a.favorite_flag, + a.display_rank, + common_unit_data.* + `) +} + +func (ss *Session) GetUnitInfo(unitID int) (bool, *unitmodel.CommonUnitData) { + unitInfo := unitmodel.CommonUnitData{} + has, err := ss.UserEng.Table(new(unitmodel.CommonUnitData)). + Where("unit_id = ?", unitID).Get(&unitInfo) + if ss.CheckErr(err) { + return false, nil + } + + return has, &unitInfo +} + +func (ss *Session) GetUserUnitInfo(unitOwningUserID int) (bool, *unitmodel.CommonUnitData) { + var unitID int + has, err := ss.UserEng.Table(new(usermodel.UserUnitData)). + Where("unit_owning_user_id = ?", unitOwningUserID). + Cols("unit_id").Get(&unitID) + if ss.CheckErr(err) { + return false, nil + } + + if !has { + return false, nil + } + + return ss.GetUnitInfo(unitID) +} + +func (ss *Session) GetUserUnitSkillEquip(unitOwningUserID int) []usermodel.UserUnitSkillEquip { + skill := []usermodel.UserUnitSkillEquip{} + err := ss.UserEng.Table("user_unit_skill_equip"). + Where("unit_owning_user_id = ?", unitOwningUserID).Find(&skill) + if ss.CheckErr(err) { + return []usermodel.UserUnitSkillEquip{} + } + + return skill +} + +func (ss *Session) GetUserUnitSkillEquipID(unitOwningUserID int) []int { + skillID := []int{} + skill := ss.GetUserUnitSkillEquip(unitOwningUserID) + for _, s := range skill { + skillID = append(skillID, s.UnitRemovableSkillID) + } + + return skillID +} diff --git a/internal/session/userdata.go b/internal/session/userdata.go new file mode 100644 index 0000000..3e36f2a --- /dev/null +++ b/internal/session/userdata.go @@ -0,0 +1,132 @@ +package session + +import ( + "errors" + "honoka-chan/internal/constant" + usermodel "honoka-chan/internal/model/user" + userschema "honoka-chan/internal/schema/user" +) + +func (ss *Session) GetUserPref(userID string) usermodel.UserPref { + pref := usermodel.UserPref{} + has, err := ss.UserEng.Table(new(usermodel.UserPref)). + Where("user_id = ?", userID).Get(&pref) + if ss.CheckErr(err) { + return usermodel.UserPref{} + } + if !has { + ss.Abort(errors.New("用户不存在!")) + return usermodel.UserPref{} + } + + return pref +} + +func (ss *Session) GetUserInfo() userschema.UserInfo { + return userschema.UserInfo{ + UserID: ss.UserID, + Name: ss.UserPref.UserName, + Level: ss.UserPref.UserLevel, + Exp: 1089696, + PreviousExp: 0, + NextExp: 1207185, + GameCoin: 112124104, + SnsCoin: 10000, + FreeSnsCoin: 50000, + PaidSnsCoin: 50000, + SocialPoint: 1438165, + UnitMax: 5000, + WaitingUnitMax: 5000, + CurrentEnergy: 417, + EnergyMax: 417, + EnergyFullTime: "2023-03-20 01:28:55", + LicenseLiveEnergyRecoverlyTime: 60, + EnergyFullNeedTime: 0, + OverMaxEnergy: 417, + TrainingEnergy: 10, + TrainingEnergyMax: 10, + FriendMax: 99, + InviteCode: ss.UserPref.InviteCode, + InsertDate: "2015-08-10 18:58:30", + UpdateDate: "2018-08-09 18:13:12", + TutorialState: -1, + DiamondCoin: 0, + CrystalCoin: 0, + UnlockRandomLiveMuse: 1, + UnlockRandomLiveAqours: 1, + } +} + +func (ss *Session) GetUserLiveRecord(liveDifficultyID int) []usermodel.UserLiveRecord { + liveRecord := []usermodel.UserLiveRecord{} + err := ss.UserEng.Table(new(usermodel.UserLiveRecord)). + Where("user_id = ? AND live_difficulty_id = ?", + ss.UserID, liveDifficultyID). + Find(&liveRecord) + if ss.CheckErr(err) { + return []usermodel.UserLiveRecord{} + } + + return liveRecord +} + +func (ss *Session) GetUserLiveRecordWithSkillOn(liveDifficultyID int, isSkillOn bool) (bool, *usermodel.UserLiveRecord) { + liveRecord := usermodel.UserLiveRecord{} + has, err := ss.UserEng.Table(new(usermodel.UserLiveRecord)). + Where("user_id = ? AND live_difficulty_id = ? AND is_skill_on = ?", + ss.UserID, liveDifficultyID, isSkillOn). + Get(&liveRecord) + if ss.CheckErr(err) { + return false, nil + } + + return has, &liveRecord +} + +func (ss *Session) UpdateUserLiveRecord(newLiveRecord *usermodel.UserLiveRecord, updateType constant.PreciseScoreUpdateType) { + // 获取原有记录 + has, liveRecord := ss.GetUserLiveRecordWithSkillOn(newLiveRecord.LiveDifficultyID, newLiveRecord.IsSkillOn) + if !has { + // 没有记录则直接新增 + ss.UpdateUserLiveRecordWrapper(newLiveRecord, false) + return + } + + // 判断记录更新类型 + switch updateType { + case constant.PreciseScoreUpdateTypePerfect: + // 根据 Perfect 数更新 + // 判断 Perfect 数是否大于原有记录 + if newLiveRecord.PerfectCnt >= liveRecord.PerfectCnt { + // 更新记录 + ss.UpdateUserLiveRecordWrapper(newLiveRecord, true) + } + case constant.PreciseScoreUpdateTypeScore: + // 根据分数更新 + // 判断分数是否大于原有记录 + if newLiveRecord.TotalScore >= liveRecord.TotalScore { + // 更新记录 + ss.UpdateUserLiveRecordWrapper(newLiveRecord, true) + } + default: + // 总是更新 + ss.UpdateUserLiveRecordWrapper(newLiveRecord, true) + } +} + +func (ss *Session) UpdateUserLiveRecordWrapper(newLiveRecord *usermodel.UserLiveRecord, isUpdate bool) { + if isUpdate { + _, err := ss.UserEng.Table(new(usermodel.UserLiveRecord)). + Where("user_id = ? AND live_difficulty_id = ? AND is_skill_on = ?", + ss.UserID, newLiveRecord.LiveDifficultyID, newLiveRecord.IsSkillOn). + Update(newLiveRecord) + if ss.CheckErr(err) { + return + } + } else { + _, err := ss.UserEng.Insert(newLiveRecord) + if ss.CheckErr(err) { + return + } + } +} diff --git a/internal/startup/database.go b/internal/startup/database.go index 22ffb27..cf3b3b8 100644 --- a/internal/startup/database.go +++ b/internal/startup/database.go @@ -1,18 +1,228 @@ package startup import ( - "honoka-chan/internal/model/user" + ghomemodel "honoka-chan/internal/model/ghome" + loginmodel "honoka-chan/internal/model/login" + unitmodel "honoka-chan/internal/model/unit" + usermodel "honoka-chan/internal/model/user" "honoka-chan/pkg/db" + "log" + "time" + + "xorm.io/xorm" ) -func CreateTable() { +var ( + userEng *xorm.Session +) + +func CreateTables() { // db.UserEng.ShowSQL(true) - db.UserEng.Sync2(new(user.Users)) - db.UserEng.Sync2(new(user.UserKey)) - db.UserEng.Sync2(new(user.UserPref)) - db.UserEng.Sync2(new(user.UserAccessoryWear)) - db.UserEng.Sync2(new(user.UserDeck)) - db.UserEng.Sync2(new(user.UserUnit)) - db.UserEng.Sync2(new(user.UserDeckUnit)) - db.UserEng.Sync2(new(user.UserUnitSkillEquip)) + db.UserEng.Sync2(new(ghomemodel.DeviceKey)) + db.UserEng.Sync2(new(loginmodel.AuthKey)) + db.UserEng.Sync2(new(usermodel.UserAccessoryWear)) + db.UserEng.Sync2(new(usermodel.UserDeck)) + db.UserEng.Sync2(new(usermodel.UserDeckUnit)) + db.UserEng.Sync2(new(usermodel.UserKey)) + db.UserEng.Sync2(new(usermodel.UserLiveGoal)) + db.UserEng.Sync2(new(usermodel.UserLiveInProgress)) + db.UserEng.Sync2(new(usermodel.UserLiveRecord)) + db.UserEng.Sync2(new(usermodel.UserPref)) + db.UserEng.Sync2(new(usermodel.Users)) + db.UserEng.Sync2(new(usermodel.UserUnit)) + db.UserEng.Sync2(new(usermodel.UserUnitSkillEquip)) +} + +func LoadUnitData() { + userEng = db.UserEng.NewSession() + defer userEng.Close() + + err := userEng.Begin() + CheckErr(err) + + commonUnitExist, err := userEng.IsTableExist(new(unitmodel.CommonUnitData)) + CheckErr(err) + userUnitExist, err := userEng.IsTableExist(new(usermodel.UserUnitData)) + CheckErr(err) + + if !commonUnitExist || !userUnitExist { + log.Println("卡片数据不存在,正在同步...") + + userEng.DropTable(new(unitmodel.CommonUnitData)) + userEng.CreateTable(new(unitmodel.CommonUnitData)) + userEng.DropTable(new(usermodel.UserUnitData)) + userEng.CreateTable(new(usermodel.UserUnitData)) + + var unitData []unitmodel.UnitM + err = db.MainEng.Table(new(unitmodel.UnitM)).OrderBy("unit_id ASC").Find(&unitData) + CheckErr(err) + + checked := false + for _, u := range unitData { + // 判断卡片最大等级 + var unitMaxLevel, nextExp, sumExp int + _, err = db.MainEng.Table("unit_level_up_pattern_m"). + Where("unit_level_up_pattern_id = ?", u.UnitLevelUpPatternId). + Select("MAX(unit_level),next_exp").Get(&unitMaxLevel, &nextExp) + CheckErr(err) + + // 计算突破前的经验总和 + _, err = db.MainEng.Table("unit_level_up_pattern_m"). + Where("unit_level_up_pattern_id = ?", u.UnitLevelUpPatternId). + Where("unit_level = ?", unitMaxLevel-1).Cols("next_exp").Get(&sumExp) + CheckErr(err) + + // 计算突破前的属性 + var smileMax, pureMax, coolMax int + smileMax = u.SmileMax + pureMax = u.PureMax + coolMax = u.CoolMax + + // 如果 nexpExp 不为零,则说明卡片等级没有达到上限 + if nextExp != 0 { + // 计算突破后的经验总和 + _, err = db.MainEng.Table("unit_level_limit_pattern_m"). + Where("unit_level_limit_id = 1 AND unit_level = 349"). + Cols("next_exp").Get(&sumExp) + CheckErr(err) + + // 突破后最大等级 + unitMaxLevel = 350 + + // 计算突破后的属性 + smileMax += 6000 + pureMax += 6000 + coolMax += 6000 + } + + // 计算绊值、技能等级、技能经验 + var maxLove, skillLevel, skillExp, removableSkillCapacity, levelLimitID int + switch u.Rarity { + case 1: + maxLove = 50 + skillExp = 0 + skillLevel = 0 + removableSkillCapacity = 0 + levelLimitID = 0 + case 2: + maxLove = 200 + skillExp = 490 + skillLevel = 8 + removableSkillCapacity = 1 + levelLimitID = 0 + case 3: + maxLove = 500 + skillExp = 4900 + skillLevel = 8 + removableSkillCapacity = 2 + levelLimitID = 0 + case 4: + maxLove = 1000 + skillExp = 29900 + skillLevel = 8 + removableSkillCapacity = 8 + levelLimitID = 1 + case 5: + maxLove = 750 + skillExp = 12700 + skillLevel = 8 + removableSkillCapacity = 3 + levelLimitID = 0 + } + + // 针对技能卡等应援卡片 + if smileMax == 1 { + maxLove = 0 + skillExp = 0 + skillLevel = 0 + removableSkillCapacity = 0 + } + + // 检查是否签名卡 + var isSigned bool + exist, err := db.MainEng.Table("unit_sign_asset_m").Where("unit_id = ?", u.UnitId).Exist() + CheckErr(err) + if exist { + isSigned = true + } + + // 生成公共卡片 + unitCommon := unitmodel.CommonUnitData{ + UnitNumber: u.UnitNumber, + UnitID: u.UnitId, + UnitTypeID: u.UnitTypeId, + Name: *u.NameEn, + Eponym: u.EponymEn, + Rarity: u.Rarity, + Attribute: u.AttributeId, + Smile: smileMax, + Cute: pureMax, + Cool: coolMax, + Exp: sumExp, + Level: unitMaxLevel, + MaxLevel: unitMaxLevel, + LevelLimitID: levelLimitID, + Rank: u.RankMin, + MaxRank: u.RankMax, + Love: maxLove, + MaxLove: maxLove, + UnitSkillExp: skillExp, + UnitSkillLevel: skillLevel, + MaxHp: u.HpMax, + UnitRemovableSkillCapacity: removableSkillCapacity, + IsRankMax: true, + IsLoveMax: true, + IsLevelMax: true, + IsSigned: isSigned, + IsSkillLevelMax: true, + IsRemovableSkillCapacityMax: true, + InsertDate: time.Now().Unix(), + } + + _, err = userEng.Insert(&unitCommon) + CheckErr(err) + + var userID []int + err = db.UserEng.Table(new(usermodel.Users)).Cols("user_id").Find(&userID) + CheckErr(err) + + for _, id := range userID { + userUnit := usermodel.UserUnitData{ + UnitID: u.UnitId, + FavoriteFlag: false, + DisplayRank: u.RankMax, + UserID: id, + InsertDate: time.Now().Unix(), + UpdateDate: time.Now().Unix(), + } + + // 检查表里是否已经有数据 + if !checked { + ct, err := userEng.Table(new(usermodel.UserUnitData)).Count() + CheckErr(err) + + if ct == 0 { + userUnit.UnitOwningUserID = 38383 + } + + checked = true + } + + _, err = userEng.Insert(&userUnit) + CheckErr(err) + } + } + + err = userEng.Commit() + CheckErr(err) + + log.Println("同步完成!") + } +} + +func CheckErr(err error) { + if err != nil { + userEng.Rollback() + log.Fatalln("同步失败:", err.Error()) + } } diff --git a/internal/startup/startup.go b/internal/startup/startup.go index d5e98b5..d270f06 100644 --- a/internal/startup/startup.go +++ b/internal/startup/startup.go @@ -1,6 +1,6 @@ package startup func StartUp() { - CreateTable() - InitUserData(0) + CreateTables() + LoadUnitData() } diff --git a/internal/startup/userdata.go b/internal/startup/userdata.go deleted file mode 100644 index 63442c4..0000000 --- a/internal/startup/userdata.go +++ /dev/null @@ -1,142 +0,0 @@ -package startup - -import ( - "fmt" - "honoka-chan/internal/model/user" - "honoka-chan/internal/schema/api/profile" - "honoka-chan/internal/schema/api/unit" - "honoka-chan/internal/utils" - "honoka-chan/pkg/db" - "strconv" - "time" -) - -func InitUserData(userId int) { - userList := []user.Users{} - if userId != 0 { - err := db.UserEng.Table("users").Where("user_id = ?", userId).Find(&userList) - utils.CheckErr(err) - } else { - err := db.UserEng.Table("users").Asc("id").Find(&userList) - utils.CheckErr(err) - } - - // 同步用户表 - // db.UserEng.ShowSQL(true) - // db.UserEng.Table("user_info_m").Sync2(new(user.UserInfo)) - // db.UserEng.Table("user_pref").Sync2(new(UserPref)) - - // 开始会话 - session := db.UserEng.NewSession() - defer session.Close() - - if err := session.Begin(); err != nil { - panic(err) - } - - for _, u := range userList { - // 检查用户配置 - exists, err := db.UserEng.Table("user_pref").Where("user_id = ?", u.UserID).Exist() - utils.CheckErr(err) - - if !exists { - // 默认中心成员() - var oId int - _, err = db.MainEng.Table("common_unit_m").Cols("unit_owning_user_id").Where("unit_id = ?", 31).Get(&oId) - utils.CheckErr(err) - fmt.Println("Center UnitOwningUserId:", oId) - userPref := user.UserPref{ - UserID: u.UserID, - AwardID: 1, // 音乃木坂学生 - BackgroundID: 1, // 初始背景 - UnitOwningUserID: oId, - UserName: "音乃木坂学生", - UserLevel: 1, - UserDesc: "你好。", - InviteCode: strconv.Itoa(u.UserID), - UpdateTime: time.Now().Unix(), - } - _, err = session.Table("user_pref").Insert(&userPref) - utils.CheckErr(err) - // fmt.Println("UserPref Id", userPref.Id) - } - - // 检查用户信息 - exists, err = db.UserEng.Table("user_info_m").Where("user_id = ?", u.UserID).Exist() - - // 检查用户卡组配置 - exists, err = db.UserEng.Table("user_deck").Where("user_id = ?", u.UserID).Asc("deck_id").Exist() - utils.CheckErr(err) - // fmt.Println("UserDeck exists:", exists) - - if !exists { - userDeck := unit.UserDeckData{ - DeckID: 1, - MainFlag: 1, - DeckName: "队伍A", - UserID: u.UserID, - InsertDate: time.Now().Unix(), - } - - // 默认队伍 - _, err = session.Table("user_deck").Insert(&userDeck) - if err != nil { - session.Rollback() - panic(err) - } - userDeckId := userDeck.ID - // fmt.Println("New UserDeck:", userDeckId) - - // 默认卡组 - unitIds := []int{} - err = db.MainEng.Table("unit_m").Cols("unit_id").Where("album_series_id = ?", 615).Find(&unitIds) - if err != nil { - session.Rollback() - panic(err) - } - - unitData := []profile.UnitData{} - err = db.MainEng.Table("common_unit_m").In("unit_id", unitIds).Find(&unitData) - if err != nil { - session.Rollback() - panic(err) - } - // fmt.Println(unitData) - - position := 1 - for _, u := range unitData { - unitDeckData := unit.UnitDeckData{ - UserDeckID: userDeckId, - UnitOwningUserID: u.UnitOwningUserID, - UnitID: u.UnitID, - Position: position, - Level: 100, - LevelLimitID: 1, - DisplayRank: 2, - Love: 1000, - UnitSkillLevel: 8, - IsRankMax: true, - IsLoveMax: true, - IsLevelMax: true, - IsSigned: u.IsSigned, - BeforeLove: 1000, - MaxLove: 1000, - InsertData: time.Now().Unix(), - } - _, err = session.Table("user_deck_unit").Insert(&unitDeckData) - if err != nil { - session.Rollback() - panic(err) - } - // fmt.Println("New DeckUnit:", unitDeckData.Id) - - position++ - } - - // 结束会话 - if err = session.Commit(); err != nil { - panic(err) - } - } - } -} diff --git a/main.go b/main.go index 0df3c91..867b038 100644 --- a/main.go +++ b/main.go @@ -27,8 +27,9 @@ func main() { go func() { <-signalChan - log.Println("Shutting down...") - db.Ldb.Close() + log.Println("正在退出...") + db.MainEng.Close() + db.UserEng.Close() os.Exit(0) }() diff --git a/pkg/db/db.go b/pkg/db/db.go index 5a4bd22..1095433 100644 --- a/pkg/db/db.go +++ b/pkg/db/db.go @@ -1,15 +1,11 @@ package db import ( - "fmt" - _ "modernc.org/sqlite" "xorm.io/xorm" ) var ( - Ldb *LdbInstance - MainDb = "assets/main.db" UserDb = "assets/data.db" MainEng *xorm.Engine @@ -17,8 +13,6 @@ var ( ) func init() { - Ldb = GetLdbInstance() - eng, err := xorm.NewEngine("sqlite", MainDb) if err != nil { panic(err) @@ -43,13 +37,3 @@ func init() { eng.SetMaxIdleConns(5) UserEng = eng } - -func MatchTokenUid(token, uid string) bool { - res, err := Ldb.Get([]byte(uid)) - if err != nil { - fmt.Println(err) - return false - } - - return string(res) == token -} diff --git a/pkg/db/leveldb.go b/pkg/db/leveldb.go deleted file mode 100644 index 6d8ac69..0000000 --- a/pkg/db/leveldb.go +++ /dev/null @@ -1,58 +0,0 @@ -package db - -import ( - "errors" - "sync" - - "github.com/syndtr/goleveldb/leveldb" -) - -var ( - once sync.Once -) - -type LdbInstance struct { - db *leveldb.DB - mu sync.Mutex -} - -func GetLdbInstance() *LdbInstance { - in := LdbInstance{} - once.Do(func() { - var err error - in.db, err = leveldb.OpenFile("./data/honoka-chan.db", nil) - if err != nil { - panic(err) - } - }) - return &in -} - -func (in *LdbInstance) Close() error { - in.mu.Lock() - defer in.mu.Unlock() - if in.db != nil { - return in.db.Close() - } - return nil -} - -func (in *LdbInstance) Get(key []byte) ([]byte, error) { - if len(key) == 0 { - return nil, errors.New("empty key") - } - res, err := in.db.Get(key, nil) - if err == leveldb.ErrNotFound { - return nil, nil - } else if err != nil { - return nil, err - } - return res, nil -} - -func (in *LdbInstance) Set(key, value []byte) error { - if len(key) == 0 { - return errors.New("empty key") - } - return in.db.Put(key, value, nil) -} diff --git a/pkg/tools/tools.go b/pkg/tools/tools.go deleted file mode 100644 index ab288a7..0000000 --- a/pkg/tools/tools.go +++ /dev/null @@ -1,497 +0,0 @@ -package tools - -func init() { - - // eng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = eng.Ping() - // utils.CheckErr(err) - - // suitIds := []int{} - // err = eng.Table("m_suit").Cols("id").OrderBy("id ASC").Find(&suitIds) - // utils.CheckErr(err) - - // jsonStr := "[" - // for _, suit := range suitIds { - // suitInfo := model.AsSuitInfo{ - // SuitMasterID: suit, - // IsNew: false, - // } - // m, err := json.Marshal(suitInfo) - // utils.CheckErr(err) - - // jsonStr += fmt.Sprintf("%d,%s,", suit, string(m)) - // } - // jsonStr = strings.TrimRight(jsonStr, ",") - // jsonStr += "]" - // fmt.Println(jsonStr) - - // eng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = eng.Ping() - // utils.CheckErr(err) - - // emblemIds := []int{} - // err = eng.Table("m_emblem").Cols("id").OrderBy("id ASC").Find(&emblemIds) - // utils.CheckErr(err) - - // jsonStr := "[" - // for _, emblem := range emblemIds { - // emblemInfo := model.AsEmblemInfo{ - // EmblemMID: emblem, - // AcquiredAt: time.Now().Unix(), - // } - // m, err := json.Marshal(emblemInfo) - // utils.CheckErr(err) - - // jsonStr += fmt.Sprintf("%d,%s,", emblem, string(m)) - // } - // jsonStr = strings.TrimRight(jsonStr, ",") - // jsonStr += "]" - // fmt.Println(jsonStr) - - // eng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = eng.Ping() - // utils.CheckErr(err) - - // emblemIds := []int{} - // err = eng.Table("m_emblem").Cols("id").OrderBy("id ASC").Find(&emblemIds) - // utils.CheckErr(err) - - // ids := []model.AsEmblemId{} - // for _, id := range emblemIds { - // ids = append(ids, model.AsEmblemId{ - // EmblemMasterID: id, - // IsNew: false, - // }) - // } - // m, err := json.Marshal(ids) - // utils.CheckErr(err) - // fmt.Println(string(m)) - - // eng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = eng.Ping() - // utils.CheckErr(err) - - // difficultyIds := []int{} - // err = eng.Table("m_live_difficulty").Cols("live_difficulty_id").OrderBy("live_difficulty_id ASC").Find(&difficultyIds) - // utils.CheckErr(err) - - // jsonStr := "[" - // for _, id := range difficultyIds { - // difficultyInfo := model.AsLiveDifficultyInfo{ - // LiveDifficultyID: id, - // MaxScore: 0, - // MaxCombo: 0, - // PlayCount: 0, - // ClearCount: 0, - // CancelCount: 0, - // NotClearedCount: 0, - // IsFullCombo: false, - // ClearedDifficultyAchievement1: nil, - // ClearedDifficultyAchievement2: nil, - // ClearedDifficultyAchievement3: nil, - // EnableAutoplay: false, - // IsAutoplay: false, - // IsNew: false, - // } - // m, err := json.Marshal(difficultyInfo) - // utils.CheckErr(err) - - // jsonStr += fmt.Sprintf("%d,%s,", id, string(m)) - // } - // jsonStr = strings.TrimRight(jsonStr, ",") - // jsonStr += "]" - // fmt.Println(jsonStr) - - // eng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = eng.Ping() - // utils.CheckErr(err) - - // storyIds := []int{} - // err = eng.Table("m_story_main_cell").Cols("id").OrderBy("id ASC").Find(&storyIds) - // utils.CheckErr(err) - - // jsonStr := "[" - // for _, id := range storyIds { - // storyInfo := model.AsMainStoryInfo{ - // StoryMainMasterID: id, - // } - // m, err := json.Marshal(storyInfo) - // utils.CheckErr(err) - - // jsonStr += fmt.Sprintf("%d,%s,", id, string(m)) - // } - // jsonStr = strings.TrimRight(jsonStr, ",") - // jsonStr += "]" - // fmt.Println(jsonStr) - - // eng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = eng.Ping() - // utils.CheckErr(err) - - // voiceIds := []int{} - // err = eng.Table("m_navi_voice").Cols("id").OrderBy("id ASC").Find(&voiceIds) - // utils.CheckErr(err) - - // jsonStr := "[" - // for _, id := range voiceIds { - // storyInfo := model.AsNaviVoiceInfo{ - // NaviVoiceMasterID: id, - // IsNew: false, - // } - // m, err := json.Marshal(storyInfo) - // utils.CheckErr(err) - - // jsonStr += fmt.Sprintf("%d,%s,", id, string(m)) - // } - // jsonStr = strings.TrimRight(jsonStr, ",") - // jsonStr += "]" - // fmt.Println(jsonStr) - - // eng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = eng.Ping() - // utils.CheckErr(err) - - // backgroundIds := []int{} - // err = eng.Table("m_custom_background").Cols("id").OrderBy("id ASC").Find(&backgroundIds) - // utils.CheckErr(err) - - // jsonStr := "[" - // for _, id := range backgroundIds { - // storyInfo := model.AsCustomBackgroundInfo{ - // CustomBackgroundMasterID: id, - // IsNew: false, - // } - // m, err := json.Marshal(storyInfo) - // utils.CheckErr(err) - - // jsonStr += fmt.Sprintf("%d,%s,", id, string(m)) - // } - // jsonStr = strings.TrimRight(jsonStr, ",") - // jsonStr += "]" - // fmt.Println(jsonStr) - - // eng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = eng.Ping() - // utils.CheckErr(err) - - // storyIds := []int{} - // err = eng.Table("m_story_side").Cols("id").OrderBy("id ASC").Find(&storyIds) - // utils.CheckErr(err) - - // jsonStr := "[" - // for _, id := range storyIds { - // storyInfo := model.AsStorySideInfo{ - // StorySideMasterID: id, - // IsNew: false, - // AcquiredAt: time.Now().Unix(), - // } - // m, err := json.Marshal(storyInfo) - // utils.CheckErr(err) - - // jsonStr += fmt.Sprintf("%d,%s,", id, string(m)) - // } - // jsonStr = strings.TrimRight(jsonStr, ",") - // jsonStr += "]" - // fmt.Println(jsonStr) - - // eng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = eng.Ping() - // utils.CheckErr(err) - - // storyIds := []int{} - // err = eng.Table("m_story_member").Cols("id").OrderBy("id ASC").Find(&storyIds) - // utils.CheckErr(err) - - // jsonStr := "[" - // for _, id := range storyIds { - // storyInfo := model.AsStoryMemberInfo{ - // StoryMemberMasterID: id, - // IsNew: false, - // AcquiredAt: time.Now().Unix(), - // } - // m, err := json.Marshal(storyInfo) - // utils.CheckErr(err) - - // jsonStr += fmt.Sprintf("%d,%s,", id, string(m)) - // } - // jsonStr = strings.TrimRight(jsonStr, ",") - // jsonStr += "]" - // fmt.Println(jsonStr) - - // eng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = eng.Ping() - // utils.CheckErr(err) - - // eventIds := []int{} - // err = eng.Table("m_story_event_history_detail").Cols("story_event_id").OrderBy("story_event_id ASC").Find(&eventIds) - // utils.CheckErr(err) - - // jsonStr := "[" - // for _, id := range eventIds { - // storyInfo := model.AsStoryEventInfo{ - // StoryEventID: id, - // } - // m, err := json.Marshal(storyInfo) - // utils.CheckErr(err) - - // jsonStr += fmt.Sprintf("%d,%s,", id, string(m)) - // } - // jsonStr = strings.TrimRight(jsonStr, ",") - // jsonStr += "]" - // fmt.Println(jsonStr) - - // eng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = eng.Ping() - // utils.CheckErr(err) - - // missionRes := []model.AsMissionRes{} - // err = eng.Table("m_mission").Cols("id,mission_clear_condition_count"). - // Where("term = 3 AND (end_at > ? OR end_at IS NULL)", time.Now().Unix()).OrderBy("id ASC").Find(&missionRes) - // utils.CheckErr(err) - - // jsonStr := "[" - // for _, res := range missionRes { - // storyInfo := model.AsFreeMissionInfo{ - // MissionMID: res.ID, - // IsNew: false, - // MissionCount: res.Count, - // IsCleared: true, - // IsReceivedReward: true, - // NewExpiredAt: time.Now().Unix(), - // } - // m, err := json.Marshal(storyInfo) - // utils.CheckErr(err) - - // jsonStr += fmt.Sprintf("%d,%s,", res.ID, string(m)) - // } - // jsonStr = strings.TrimRight(jsonStr, ",") - // jsonStr += "]" - // fmt.Println(jsonStr) - - // eng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = eng.Ping() - // utils.CheckErr(err) - - // missionRes := []model.AsMissionRes{} - // err = eng.Table("m_mission").Cols("id,mission_clear_condition_count"). - // Where("term = 1 AND (end_at > ? OR end_at IS NULL)", time.Now().Unix()).OrderBy("id ASC").Find(&missionRes) - // utils.CheckErr(err) - - // jsonStr := "[" - // for _, res := range missionRes { - // storyInfo := model.AsDailyMissionInfo{ - // MissionMID: res.ID, - // IsNew: false, - // MissionStartCount: res.Count, - // MissionCount: res.Count, - // IsCleared: true, - // IsReceivedReward: true, - // ClearedExpiredAt: time.Now().Unix(), - // } - // m, err := json.Marshal(storyInfo) - // utils.CheckErr(err) - - // jsonStr += fmt.Sprintf("%d,%s,", res.ID, string(m)) - // } - // jsonStr = strings.TrimRight(jsonStr, ",") - // jsonStr += "]" - // fmt.Println(jsonStr) - - // eng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = eng.Ping() - // utils.CheckErr(err) - - // missionRes := []model.AsMissionRes{} - // err = eng.Table("m_mission").Cols("id,mission_clear_condition_count"). - // Where("term = 2 AND (end_at > ? OR end_at IS NULL)", time.Now().Unix()).OrderBy("id ASC").Find(&missionRes) - // utils.CheckErr(err) - - // jsonStr := "[" - // for _, res := range missionRes { - // storyInfo := model.AsWeeklyMissionInfo{ - // MissionMID: res.ID, - // IsNew: false, - // MissionStartCount: res.Count, - // MissionCount: res.Count, - // IsCleared: true, - // IsReceivedReward: true, - // ClearedExpiredAt: time.Now().Unix(), - // NewExpiredAt: time.Now().Unix(), - // } - // m, err := json.Marshal(storyInfo) - // utils.CheckErr(err) - - // jsonStr += fmt.Sprintf("%d,%s,", res.ID, string(m)) - // } - // jsonStr = strings.TrimRight(jsonStr, ",") - // jsonStr += "]" - // fmt.Println(jsonStr) - - // eng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = eng.Ping() - // utils.CheckErr(err) - // eng.ShowSQL(true) - - // memberIds := []int{} - // err = eng.Table("m_member").Cols("id").OrderBy("id ASC").Find(&memberIds) - // utils.CheckErr(err) - - // jsonStr := "[" - // for _, memberId := range memberIds { - // cellIds := []int{} - // err = eng.Table("m_member_love_panel_cell"). - // Join("LEFT", "m_member_love_panel", "m_member_love_panel_cell.member_love_panel_master_id = m_member_love_panel.id"). - // Cols("m_member_love_panel_cell.id").Where("m_member_love_panel.member_master_id = ?", memberId). - // OrderBy("m_member_love_panel_cell.id ASC").Find(&cellIds) - // utils.CheckErr(err) - - // panelInfo := model.AsMemberLovePanelInfo{ - // MemberID: memberId, - // MemberLovePanelCellIds: cellIds, - // } - - // m, err := json.Marshal(panelInfo) - // utils.CheckErr(err) - - // jsonStr += fmt.Sprintf("%s,", string(m)) - // } - - // jsonStr = strings.TrimRight(jsonStr, ",") - // jsonStr += "]" - // fmt.Println(jsonStr) - - // mEng, err := xorm.NewEngine("sqlite", "assets/masterdata.db") - // utils.CheckErr(err) - // err = mEng.Ping() - // utils.CheckErr(err) - // defer mEng.Close() - - // dEng, err := xorm.NewEngine("sqlite", "assets/dictionary_zh_k.db") - // utils.CheckErr(err) - // err = dEng.Ping() - // utils.CheckErr(err) - // defer dEng.Close() - - // cardRes := []model.AsCardRes{} - // err = mEng.Table("m_card").Cols("id,card_rarity_type,max_passive_skill_slot").OrderBy("id ASC").Find(&cardRes) - // utils.CheckErr(err) - - // jsonStr := "[" - // for _, card := range cardRes { - // // 绊板等级加成 - // cardLevel := 0 - // cardCellCount := 0 - // if card.CardRarityType == 10 { - // cardLevel = 40 + 42 - // cardCellCount = 61 - // } else if card.CardRarityType == 20 { - // cardLevel = 60 + 24 - // cardCellCount = 75 - // } else if card.CardRarityType == 30 { - // cardLevel = 80 + 12 - // cardCellCount = 87 - // } - - // var apBuff, stBuff, teBuff int - // _, err := mEng.Table("m_training_tree_card_param").Where("id = ? AND training_content_type = ?", card.ID, 2).Select("SUM(value)").Get(&stBuff) - // utils.CheckErr(err) - // // fmt.Println(stBuff) - - // _, err = mEng.Table("m_training_tree_card_param").Where("id = ? AND training_content_type = ?", card.ID, 3).Select("SUM(value)").Get(&apBuff) - // utils.CheckErr(err) - // // fmt.Println(apBuff) - - // _, err = mEng.Table("m_training_tree_card_param").Where("id = ? AND training_content_type = ?", card.ID, 4).Select("SUM(value)").Get(&teBuff) - // utils.CheckErr(err) - // // fmt.Println(teBuff) - - // var skillName string - // var skillId int - // _, err = mEng.Table("m_card_passive_skill_original").Where("card_master_id = ? AND skill_level = 5", card.ID).Cols("name").Get(&skillName) - // utils.CheckErr(err) - // skillName = strings.ReplaceAll(skillName, "k.", "") - // // fmt.Println(skillName) - - // // dEng.ShowSQL(true) - // condition := "id LIKE '%" + skillName + "%' AND (message LIKE '%表现%同策略%' OR message LIKE '%表现%同属性%') AND message NOT LIKE '%时%'" - // count, err := dEng.Table("m_dictionary"). - // Where(condition). - // Count() - // utils.CheckErr(err) - // if count > 0 { - // skillId = 30000507 - // } else { - // skillId = 30000482 - // } - - // var passiveSkillLevel int - // _, err = mEng.Table("m_card_passive_skill_original").Where("card_master_id = ?", card.ID). - // Cols("skill_level").OrderBy("skill_level DESC").Limit(1).Get(&passiveSkillLevel) - // utils.CheckErr(err) - - // cardInfo := model.AsCardInfo{ - // CardMasterID: card.ID, - // Level: cardLevel, - // Exp: 0, - // LovePoint: 0, - // IsFavorite: false, - // IsAwakening: true, - // IsAwakeningImage: true, - // IsAllTrainingActivated: true, - // TrainingActivatedCellCount: cardCellCount, - // MaxFreePassiveSkill: card.MaxPassiveSkillSlot, - // Grade: 5, - // TrainingLife: stBuff, - // TrainingAttack: apBuff, - // TrainingDexterity: teBuff, - // ActiveSkillLevel: 5, - // PassiveSkillALevel: passiveSkillLevel, - // PassiveSkillBLevel: 1, - // PassiveSkillCLevel: 1, - // AdditionalPassiveSkill1ID: skillId, - // AdditionalPassiveSkill2ID: skillId, - // AdditionalPassiveSkill3ID: skillId, - // AdditionalPassiveSkill4ID: skillId, - // AcquiredAt: time.Now().Unix(), - // IsNew: false, - // } - // m, err := json.Marshal(cardInfo) - // utils.CheckErr(err) - - // jsonStr += fmt.Sprintf("%d,%s,", card.ID, string(m)) - // } - // jsonStr = strings.TrimRight(jsonStr, ",") - // jsonStr += "]" - // fmt.Println(jsonStr) - - // gjson.Parse(utils.ReadAllText("data/notesdata.json")).ForEach(func(k, v gjson.Result) bool { - // v.ForEach(func(kk, vv gjson.Result) bool { - // if vv.IsObject() { - // fileName := vv.Get("live.live_stage.live_difficulty_id").String() - // utils.WriteAllText("temp/"+fileName+".json", vv.Get("live.live_stage").String()) - // } - // return true - // }) - // return true - // }) -} - -func CheckErr(err error) { - if err != nil { - panic(err) - } -} diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 8af2a4d..a6cf3e1 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -5,6 +5,9 @@ package utils import ( "encoding/hex" + "encoding/json" + "fmt" + "log" "math/rand" "os" "sync" @@ -48,10 +51,6 @@ func XOR(s1, s2 []byte) []byte { return res } -func Sub16(str []byte) []byte { - return str[16:] -} - func RandomStr(len int) string { rand.Seed(time.Now().UnixNano()) mRand := make([]byte, len) @@ -60,3 +59,20 @@ func RandomStr(len int) string { return mRandStr } + +func ToJSON(data any) string { + b, err := json.Marshal(data) + if err != nil { + log.Println(err.Error()) + return "{}" + } + return string(b) +} + +func PrintJSON(data any) { + b, err := json.MarshalIndent(data, "", " ") + if err != nil { + return + } + fmt.Println(string(b)) +}