as: Support playing lives

Only support "Sweet Eyes" currently.

Signed-off-by: Yuan Si <do4suki@gmail.com>
This commit is contained in:
2023-06-07 07:01:37 +08:00
parent 2d207cfd68
commit affc960a95
8 changed files with 4025 additions and 6 deletions
+158
View File
@@ -5,6 +5,7 @@ import (
"encoding/json"
"fmt"
"honoka-chan/config"
"honoka-chan/database"
"honoka-chan/encrypt"
"honoka-chan/handler"
"honoka-chan/middleware"
@@ -13,6 +14,7 @@ import (
"net/http"
"os"
"path/filepath"
"strconv"
"strings"
"time"
@@ -830,6 +832,162 @@ func AsRouter(r *gin.Engine) {
resp := SignResp(ctx.GetString("ep"), respBody, sessionKey)
ctx.Header("Content-Type", "application/json")
ctx.String(http.StatusOK, resp)
})
s.POST("/livePartners/fetch", func(ctx *gin.Context) {
resp := SignResp(ctx.GetString("ep"), utils.ReadAllText("assets/as/fetchLivePartners.json"), sessionKey)
ctx.Header("Content-Type", "application/json")
ctx.String(http.StatusOK, resp)
})
s.POST("/liveDeck/fetchLiveDeckSelect", func(ctx *gin.Context) {
resp := SignResp(ctx.GetString("ep"), utils.ReadAllText("assets/as/fetchLiveDeckSelect.json"), sessionKey)
ctx.Header("Content-Type", "application/json")
ctx.String(http.StatusOK, resp)
})
s.POST("/live/start", func(ctx *gin.Context) {
reqBody := gjson.Parse(ctx.GetString("reqBody")).Array()[0]
// fmt.Println(reqBody.String())
liveStartReq := model.AsLiveStartReq{}
if err := json.Unmarshal([]byte(reqBody.String()), &liveStartReq); err != nil {
panic(err)
}
// fmt.Println(liveStartReq)
var cardInfo string
partnerResp := gjson.Parse(utils.ReadAllText("assets/as/fetchLivePartners.json")).Get("partner_select_state.live_partners")
partnerResp.ForEach(func(k, v gjson.Result) bool {
userId := v.Get("user_id").Int()
if userId == int64(liveStartReq.PartnerUserID) {
v.Get("card_by_category").ForEach(func(kk, vv gjson.Result) bool {
if vv.IsObject() {
cardId := vv.Get("card_master_id").Int()
if cardId == int64(liveStartReq.PartnerCardMasterID) {
cardInfo = vv.String()
// fmt.Println(cardInfo)
return false
}
}
return true
})
return false
}
return true
})
// 保存请求包因为 /live/finish 接口的响应包里有部分字段不在该接口的请求包里
liveId := strconv.Itoa(int(time.Now().UnixNano()))
err := database.LevelDb.Put([]byte("live_"+liveId), []byte(reqBody.String()))
CheckErr(err)
liveDifficultyId := strconv.Itoa(liveStartReq.LiveDifficultyID)
liveNotes := utils.ReadAllText("assets/as/notes/" + liveDifficultyId + ".json")
if liveNotes == "" {
panic("歌曲情报信息不存在!")
}
liveStartResp := utils.ReadAllText("assets/as/liveStart.json")
liveStartResp = strings.ReplaceAll(liveStartResp, `"LIVE_ID"`, liveId)
liveStartResp = strings.ReplaceAll(liveStartResp, `"DECK_ID"`, strconv.Itoa(liveStartReq.DeckID))
liveStartResp = strings.ReplaceAll(liveStartResp, `"LIVE_NOTES"`, liveNotes)
liveStartResp = strings.ReplaceAll(liveStartResp, `"LIVE_PARTNER"`, cardInfo)
liveStartResp = strings.ReplaceAll(liveStartResp, `"LIVE_DIFFICULTY_ID"`, liveDifficultyId)
resp := SignResp(ctx.GetString("ep"), liveStartResp, sessionKey)
ctx.Header("Content-Type", "application/json")
ctx.String(http.StatusOK, resp)
})
s.POST("/live/finish", func(ctx *gin.Context) {
reqBody := gjson.Parse(ctx.GetString("reqBody")).Array()[0]
// fmt.Println(reqBody.String())
var cardMasterId, maxVolt, skillCount, appealCount int64
liveFinishReq := gjson.Parse(reqBody.String())
liveFinishReq.Get("live_score.card_stat_dict").ForEach(func(key, value gjson.Result) bool {
if value.IsObject() {
volt := value.Get("got_voltage").Int()
if volt > maxVolt {
maxVolt = volt
cardMasterId = value.Get("card_master_id").Int()
skillCount = value.Get("skill_triggered_count").Int()
appealCount = value.Get("appeal_count").Int()
}
}
return true
})
mvpInfo := model.AsMvpInfo{
CardMasterID: cardMasterId,
GetVoltage: maxVolt,
SkillTriggeredCount: skillCount,
AppealCount: appealCount,
}
mvp, err := json.Marshal(mvpInfo)
CheckErr(err)
// fmt.Println("mvpInfo:", mvpInfo)
liveId := liveFinishReq.Get("live_id").String()
res, err := database.LevelDb.Get([]byte("live_" + liveId))
CheckErr(err)
liveStartReq := model.AsLiveStartReq{}
if err := json.Unmarshal(res, &liveStartReq); err != nil {
panic(err)
}
// fmt.Println("liveStartReq:", liveStartReq)
partnerInfo := model.AsLivePartnerInfo{
LastPlayedAt: time.Now().Unix(),
RecommendCardMasterID: liveStartReq.PartnerCardMasterID,
RecommendCardLevel: 1,
IsRecommendCardImageAwaken: true,
IsRecommendCardAllTrainingActivated: true,
IsNew: false,
FriendApprovedAt: nil,
RequestStatus: 3,
IsRequestPending: false,
}
partnerResp := gjson.Parse(utils.ReadAllText("assets/as/fetchLivePartners.json")).Get("partner_select_state.live_partners")
partnerResp.ForEach(func(k, v gjson.Result) bool {
userId := v.Get("user_id").Int()
if userId == int64(liveStartReq.PartnerUserID) {
partnerInfo.UserID = int(userId)
partnerInfo.Name.DotUnderText = v.Get("name.dot_under_text").String()
partnerInfo.Rank = int(v.Get("rank").Int())
partnerInfo.EmblemID = int(v.Get("emblem_id").Int())
partnerInfo.IntroductionMessage.DotUnderText = v.Get("introduction_message.dot_under_text").String()
}
return true
})
partner, err := json.Marshal(partnerInfo)
CheckErr(err)
// fmt.Println(partnerInfo)
liveResultResp := model.AsLiveResultAchievementStatus{
ClearCount: 1,
GotVoltage: liveFinishReq.Get("live_score.current_score").Int(),
RemainingStamina: liveFinishReq.Get("live_score.remaining_stamina").Int(),
}
liveResult, err := json.Marshal(liveResultResp)
CheckErr(err)
// fmt.Println(liveResultResp)
liveFinishResp := utils.ReadAllText("assets/as/liveFinish.json")
liveFinishResp = strings.ReplaceAll(liveFinishResp, `"LIVE_DIFFICULTY_ID"`, strconv.Itoa(liveStartReq.LiveDifficultyID))
liveFinishResp = strings.ReplaceAll(liveFinishResp, `"DECK_ID"`, strconv.Itoa(liveStartReq.DeckID))
liveFinishResp = strings.ReplaceAll(liveFinishResp, `"MVP_INFO"`, string(mvp))
liveFinishResp = strings.ReplaceAll(liveFinishResp, `"PARTNER_INFO"`, string(partner))
liveFinishResp = strings.ReplaceAll(liveFinishResp, `"LIVE_RESULT"`, string(liveResult))
liveFinishResp = strings.ReplaceAll(liveFinishResp, `"LIVE_VOLTAGE"`, liveFinishReq.Get("live_score.current_score").String())
// fmt.Println(liveFinishResp)
resp := SignResp(ctx.GetString("ep"), liveFinishResp, sessionKey)
ctx.Header("Content-Type", "application/json")
ctx.String(http.StatusOK, resp)
})