package user import ( "bdgrp_go/db" "bdgrp_go/master" "bdgrp_go/pbutil" "bdgrp_go/routes" "bdgrp_go/utils" "encoding/json" "fmt" "math/rand" "os" "path/filepath" "slices" "strconv" "time" "github.com/gofiber/fiber/v2" ) var decoMotionMap = buildDecoMotionMap() func buildDecoMotionMap() map[string][]int { m := map[string][]int{} for i := 1; i <= 35; i++ { base := 217 + (i-1)*5 m[fmt.Sprintf("%d", i)] = []int{base, base + 1, base + 2} } m["601"] = []int{392, 393, 394} for i := 36; i <= 40; i++ { base := 462 + (i-36)*5 m[fmt.Sprintf("%d", i)] = []int{base, base + 1, base + 2} } return m } func init() { path := routes.PathOf() routes.Register(func(app *fiber.App) { app.Get(path, get) fmt.Println("Loaded:", path) }) } func storyList(userid string, storyMap map[string]any) map[string]any { entries := storyMap["entries"].(map[string]any) var result []any for _, v := range entries { story := v.(map[string]any) result = append(result, map[string]any{ "userId": userid, "bandStoryId": story["bandStoryId"], "bandId": story["bandId"], "status": "already_read", "seq": story["seq"], }) } return map[string]any{"entries": result} } func get(c *fiber.Ctx) error { userid := c.Params("userid") server := os.Getenv("SERVER") user := db.FindUser(userid) if user == nil { return c.Status(404).SendStatus(404) } m := master.GetMaster() // pastEvents pastPath := filepath.Join("pastEvents", server+".json") pastData, _ := os.ReadFile(pastPath) var past map[string]any json.Unmarshal(pastData, &past) // mission.json missionData, _ := os.ReadFile("mission.json") var missionsBase map[string]any json.Unmarshal(missionData, &missionsBase) missions := deepCopy(missionsBase) for _, v := range missions { group := v.(map[string]any) if entries, ok := group["entries"].([]any); ok { for _, e := range entries { entry := e.(map[string]any) entry["userId"] = userid } } } deckName := map[string]string{ "TW": "樂團1", "JP": "バンド1", "GL": "Band 1", "CN": "乐队1", }[server] changed := false if user["situationIllust"] == nil { user["situationIllust"] = map[string]any{} changed = true } if user["decks"] == nil { user["decks"] = []any{map[string]any{ "deckId": 1, "deckName": deckName, "leader": 947, "member1": 1765, "member2": 1730, "member3": 2193, "member4": 2018, "deckType": "normal", }} changed = true } if user["musicScore"] == nil { user["musicScore"] = map[string]any{} changed = true } if user["wearingCostume"] == nil { costumeDefaults := map[int]map[string]any{ 36: {"dressId": 12854, "hairstyleId": 502, "costumeId": 1786}, 37: {"dressId": 12855, "hairstyleId": 503, "costumeId": 1787}, 38: {"dressId": 12856, "hairstyleId": 504, "costumeId": 1788}, 39: {"dressId": 12857, "hairstyleId": 505, "costumeId": 1789}, 40: {"dressId": 12858, "hairstyleId": 506, "costumeId": 1790}, 601: {"dressId": 36, "hairstyleId": 36, "costumeId": 1643}, } wc := map[string]any{} charIds := append(rangeInts(1, 40), 601) for _, charId := range charIds { key := fmt.Sprintf("%d", charId) if def, ok := costumeDefaults[charId]; ok { wc[key] = def } else { wc[key] = map[string]any{ "dressId": charId, "hairstyleId": charId, "costumeId": 1332 + charId, } } } user["wearingCostume"] = wc changed = true } if user["decos"] == nil { user["decos"] = map[string]any{} changed = true } if user["areaItems"] == nil { user["areaItems"] = map[string]any{} changed = true } if changed { db.Save() } charIds := append(rangeInts(1, 40), 601) userCharacterMap := map[string]any{} wc := user["wearingCostume"].(map[string]any) for _, id := range charIds { key := fmt.Sprintf("%d", id) costume := wc[key].(map[string]any) userCharacterMap[key] = map[string]any{ "userId": userid, "characterId": id, "costumeId": costume["costumeId"], } } userSituations := utils.BuildUserSituations(userid, m, user) situationMap := map[string]any{} for _, sit := range userSituations { s := sit.(map[string]any) situationMap[fmt.Sprintf("%v", s["situationId"])] = s } decks := user["decks"].([]any) mainDeckIdx := 1 if md, ok := user["mainDeck"].(float64); ok { mainDeckIdx = int(md) } mainDeck := decks[mainDeckIdx-1].(map[string]any) situationIdFields := []string{"leader", "member1", "member2", "member3", "member4"} charSituationMap := m["masterCharacterSituationMap"].(map[string]any)["entries"].(map[string]any) seen := map[int]bool{} var deckMembers []int for _, field := range situationIdFields { if sid, ok := mainDeck[field]; ok && sid != nil { sidStr := fmt.Sprintf("%v", sid) if entry, ok := charSituationMap[sidStr].(map[string]any); ok { if charId, ok := entry["characterId"].(float64); ok { cid := int(charId) if !seen[cid] { seen[cid] = true deckMembers = append(deckMembers, cid) } } } } } commonsLive2d := map[string]map[int][]int{} if cl2dMap, ok := m["masterCommonsLive2dMap"].(map[string]any); ok { for _, v := range cl2dMap["entries"].(map[string]any) { entry := v.(map[string]any) cat := fmt.Sprintf("%v", entry["live2dCategory"]) cid := int(entry["characterId"].(float64)) lid := int(entry["live2dId"].(float64)) if commonsLive2d[cat] == nil { commonsLive2d[cat] = map[int][]int{} } commonsLive2d[cat][cid] = append(commonsLive2d[cat][cid], lid) } } aggregated := map[string][]int{} for cat, charMap := range commonsLive2d { for charId, ids := range charMap { if slices.Contains(deckMembers, charId) { aggregated[cat] = append(aggregated[cat], ids...) } } } userCommonsLive2dEntries := map[string]any{} for cat, idArray := range aggregated { entries := make([]any, len(idArray)) for i, lid := range idArray { entries[i] = map[string]any{"live2dId": lid, "live2dCategory": cat} } userCommonsLive2dEntries[cat] = map[string]any{"entries": entries} } userProfileDegree := utils.BuildUserProfileDegree(userid, user) charProfileL2d := map[string][]int{} if cpMap, ok := m["masterCharacterProfileLive2dMap"].(map[string]any); ok { for _, v := range cpMap["entries"].(map[string]any) { entry := v.(map[string]any) cid := fmt.Sprintf("%v", entry["characterId"]) lid := int(entry["characterProfileLive2dId"].(float64)) charProfileL2d[cid] = append(charProfileL2d[cid], lid) } } charProfileL2dEntries := map[string]any{} for cid, ids := range charProfileL2d { entries := make([]any, len(ids)) for i, id := range ids { entries[i] = map[string]any{"characterId": cid, "live2dId": id} } charProfileL2dEntries[cid] = map[string]any{"entries": entries} } purchaseIds := []string{} if pm, ok := m["masterPurchaseMap"].(map[string]any); ok { for id := range pm["entries"].(map[string]any) { purchaseIds = append(purchaseIds, id) } } userEpisodeMap := map[string]any{} for _, v := range charSituationMap { card := v.(map[string]any) rel := fmt.Sprintf("%v", card["releasedAt"]) if rel == "4128645600000" || rel == "4131237600000" { continue } eps, ok := card["episodes"].(map[string]any) if !ok { continue } entries, ok := eps["entries"].([]any) if !ok { continue } for _, e := range entries { ep := e.(map[string]any) epId := fmt.Sprintf("%v", ep["episodeId"]) userEpisodeMap[epId] = map[string]any{ "userId": userid, "episodeId": ep["episodeId"], "episodeStatus": "already_read", } } } validSpawnPoints := map[string]bool{} if spMap, ok := m["masterAreaItemSpawnMap"].(map[string]any); ok { for k := range spMap["entries"].(map[string]any) { validSpawnPoints[k] = true } } now := time.Now().UnixMilli() var seasonId any if sbMap, ok := m["masterSeasonBasicMap"].(map[string]any); ok { for _, v := range sbMap["entries"].(map[string]any) { s := v.(map[string]any) startAt, _ := strconv.ParseInt(s["startAt"].(string), 10, 64) endAt, _ := strconv.ParseInt(s["endAt"].(string), 10, 64) if startAt <= now && now < endAt { seasonId = s["seasonId"] break } } } eventStoryEntries := map[string]any{} if escMap, ok := m["masterEventStoryMemorialConfigMap"].(map[string]any); ok { pastStoryEntries := map[string]any{} if pse, ok := past["pastEventStoryMap"].(map[string]any); ok { if entries, ok := pse["entries"].(map[string]any); ok { pastStoryEntries = entries } } for eventId := range escMap["entries"].(map[string]any) { length := 0 if pe, ok := pastStoryEntries[eventId].(map[string]any); ok { if en, ok := pe["entries"].([]any); ok { length = len(en) } } storyEntries := make([]any, length) for i := range storyEntries { storyEntries[i] = map[string]any{ "userId": userid, "eventId": eventId, "seq": i, "status": "already_read", } } eventStoryEntries[eventId] = map[string]any{ "eventId": eventId, "userEventStoryList": map[string]any{"entries": storyEntries}, "isExistUnReadStory": false, "isLocked": false, } } } areaStatusEntries := map[string]any{} if areaMap, ok := m["masterAreaMap"].(map[string]any); ok { for areaId, v := range areaMap["entries"].(map[string]any) { area := v.(map[string]any) if area["areaType"] == "common" { areaStatusEntries[areaId] = map[string]any{"userId": userid, "areaId": areaId} } } } areaItemEntries := map[string]any{} if aiMap, ok := m["masterAreaItemMap"].(map[string]any); ok { for id, v := range aiMap["entries"].(map[string]any) { areaItem := v.(map[string]any) sp := fmt.Sprintf("%v", areaItem["spawnPoint"]) if validSpawnPoints[sp] { areaItemEntries[id] = map[string]any{ "userId": userid, "areaItemId": areaItem["areaItemId"], "areaItemCategory": areaItem["categoryId"], "level": 8, } } } } leaderSitId := fmt.Sprintf("%v", mainDeck["leader"]) leaderEntry, _ := charSituationMap[leaderSitId].(map[string]any) leaderCharId := any(nil) if leaderEntry != nil { leaderCharId = leaderEntry["characterId"] } leaderCharIdStr := fmt.Sprintf("%v", leaderCharId) decos, _ := user["decos"].(map[string]any) if decos == nil { decos = map[string]any{} } decoSit, _ := decos["situation"].(map[string]any) decoSitId := any(1) decoSitStatus := any("normal") if decoSit != nil { decoSitId = decoSit["situationId"] decoSitStatus = decoSit["situationStatus"] } decoL2d, _ := decos["live2d"].(map[string]any) l2dCharId := leaderCharId l2dCostumeId := any(nil) if wc[leaderCharIdStr] != nil { l2dCostumeId = wc[leaderCharIdStr].(map[string]any)["costumeId"] } l2dMotionId := any(nil) if decoL2dMap, ok := m["masterDecoCharacterLive2dMotionMap"].(map[string]any); ok { var firstMotion map[string]any for _, v := range decoL2dMap["entries"].(map[string]any) { mot := v.(map[string]any) if fmt.Sprintf("%v", mot["characterId"]) == leaderCharIdStr { if firstMotion == nil || mot["seq"].(float64) < firstMotion["seq"].(float64) { firstMotion = mot } } } if firstMotion != nil { l2dMotionId = firstMotion["motionId"] } } if decoL2d != nil { if v, ok := decoL2d["characterId"]; ok { l2dCharId = v } if v, ok := decoL2d["costumeId"]; ok { l2dCostumeId = v } if v, ok := decoL2d["motionId"]; ok { l2dMotionId = v } } deco3d, _ := decos["3d"].(map[string]any) d3dCharId := leaderCharId d3dDressId := any(nil) d3dHairstyleId := any(nil) if wc[leaderCharIdStr] != nil { d3dDressId = wc[leaderCharIdStr].(map[string]any)["dressId"] d3dHairstyleId = wc[leaderCharIdStr].(map[string]any)["hairstyleId"] } d3dMotionId := any(nil) if em3Map, ok := m["masterEnableCharacter3dMotionTypeMap"].(map[string]any); ok { if charEntry, ok := em3Map["entries"].(map[string]any)[leaderCharIdStr].(map[string]any); ok { if decoEntry, ok := charEntry["entries"].(map[string]any)["deco"].(map[string]any); ok { if entries, ok := decoEntry["entries"].([]any); ok { var first map[string]any for _, e := range entries { entry := e.(map[string]any) if first == nil || entry["seq"].(float64) < first["seq"].(float64) { first = entry } } if first != nil { d3dMotionId = first["motionId"] } } } } } if deco3d != nil { if v, ok := deco3d["characterId"]; ok { d3dCharId = v } if v, ok := deco3d["dressId"]; ok { d3dDressId = v } if v, ok := deco3d["hairstyleId"]; ok { d3dHairstyleId = v } if v, ok := deco3d["motionId"]; ok { d3dMotionId = v } } frameId := any(1) if v, ok := decos["frameId"]; ok { frameId = v } framepins, _ := decos["framepins"].([]any) getPin := func(i int) any { if framepins != nil && i < len(framepins) { return framepins[i] } return nil } musicScore, _ := user["musicScore"].(map[string]any) if musicScore == nil { musicScore = map[string]any{} } musicScoreEntries := map[string]any{} for musicId, v := range musicScore { sd := v.(map[string]any) entries, _ := sd["entries"].([]any) mapped := make([]any, len(entries)) for i, e := range entries { score := e.(map[string]any) mapped[i] = map[string]any{ "userId": fmt.Sprintf("%v", user["userId"]), "musicId": musicId, "musicDifficulty": score["musicDifficulty"], "soloHighScore": score["soloHighScore"], "maxCombo": score["maxCombo"], "soloScoreRank": score["soloScoreRank"], "clearStatus": score["clearStatus"], } } musicScoreEntries[musicId] = map[string]any{"entries": mapped} } decoEffectEntries := map[string]any{} if deMap, ok := m["masterDecoEffectList"].(map[string]any); ok { if entries, ok := deMap["entries"].([]any); ok { for _, v := range entries { e := v.(map[string]any) startAt, _ := strconv.ParseInt(e["startAt"].(string), 10, 64) endAt, _ := strconv.ParseInt(e["endAt"].(string), 10, 64) if startAt <= now && now >= endAt { id := fmt.Sprintf("%v", e["decoEffectId"]) decoEffectEntries[id] = map[string]any{"userId": userid, "decoEffectId": e["decoEffectId"]} } } } } decoEffectId := any(1) if v, ok := decos["effect"]; ok { decoEffectId = v } digestSeen := map[any]bool{} var digestEntries []any if dsList, ok := m["masterDigestStoryDetailList"].(map[string]any); ok { if entries, ok := dsList["entries"].([]any); ok { for _, v := range entries { story := v.(map[string]any) id := story["digestStoryId"] if !digestSeen[id] { digestSeen[id] = true digestEntries = append(digestEntries, map[string]any{ "userId": userid, "digestStoryId": id, "status": "already_read", }) } } } } decoFrameEntries := map[string]any{} if dfMap, ok := m["masterDecoFrameMap"].(map[string]any); ok { for _, v := range dfMap["entries"].(map[string]any) { f := v.(map[string]any) id := fmt.Sprintf("%v", f["decoFrameId"]) decoFrameEntries[id] = map[string]any{"userId": userid, "decoFrameId": f["decoFrameId"], "level": 5} } } decoPinsEntries := map[string]any{} if dpMap, ok := m["masterDecoPinsMap"].(map[string]any); ok { for _, v := range dpMap["entries"].(map[string]any) { p := v.(map[string]any) id := fmt.Sprintf("%v", p["decoPinsId"]) decoPinsEntries[id] = map[string]any{"userId": userid, "decoPinsId": p["decoPinsId"], "quantity": 5} } } _ = rand.Intn userId := fmt.Sprintf("%v", user["userId"]) data := map[string]any{ "user": map[string]any{ "userRegistration": map[string]any{ "userId": userId, "hash": user["hash"], "userName": user["userName"], "clientVersion": user["clientVersion"], "platform": user["platform"], "deviceModel": user["deviceModel"], "operatingSystem": user["operatingSystem"], "birthMonth": user["birthMonth"], "tutorialStatus": user["tutorialStatus"], "introduction": user["introduction"], "tutorialEndedAt": fmt.Sprintf("%v", user["tutorialEndedAt"]), }, "userGamedata": map[string]any{ "userId": userId, "rank": user["rank"], "exp": user["exp"], "coin": fmt.Sprintf("%v", user["coin"]), "mainDeck": user["mainDeck"], "paidStar": user["paidStar"], "freeStar": user["freeStar"], "seal": user["seal"], "degree": user["degree"].([]any)[0], "publishTotalDeckPowerFlg": user["publishTotalDeckPowerFlg"], "publishBandRankFlg": user["publishBandRankFlg"], "publishMusicClearedFlg": user["publishMusicClearedFlg"], "publishMusicFullComboFlg": user["publishMusicFullComboFlg"], "publishHighScoreRatingFlg": user["publishHighScoreRatingFlg"], "pooledExp": fmt.Sprintf("%v", user["pooledExp"]), "totalExp": fmt.Sprintf("%v", user["totalExp"]), "nextExp": user["nextExp"], "publishUpdatedAtFlg": user["publishUpdatedAtFlg"], "userPaidStarRecallResponse": nil, "startDashLoginBonusReceiveFlg": user["startDashLoginBonusReceiveFlg"], "publishMusicAllPerfectFlg": user["publishMusicAllPerfectFlg"], "publishDeckRankFlg": user["publishDeckRankFlg"], "publishStageAchievementConditionsFlg": user["publishStageAchievementConditionsFlg"], "publishStageFriendRankingFlg": user["publishStageFriendRankingFlg"], "publishCharacterRankFlg": user["publishCharacterRankFlg"], "loginDays": user["loginDays"], }, }, "userCharacterMap": map[string]any{"entries": userCharacterMap}, "userSituationMap": map[string]any{"entries": situationMap}, "userMainStoryList": func() map[string]any { var entries []any if msMap, ok := m["masterMainStoryMap"].(map[string]any); ok { list := msMap["entries"].(map[string]any) for _, l := range list { story := l.(map[string]any) entries = append(entries, map[string]any{ "userId": userid, "storyId": story["mainStoryId"], "status": "already_read", }) } } return map[string]any{"entries": entries} }(), "userPracticeTicketList": nil, "userBondsList": map[string]any{ "entries": func() []any { result := make([]any, 9) for i := range result { result[i] = map[string]any{ "userId": userid, "bondsId": i + 1, "level": 1, "bonds": 5 * (i + 2), } } return result }(), }, "userBandRankMap": map[string]any{ "entries": func() map[string]any { result := map[string]any{} for _, bandId := range []int{1, 2, 3, 4, 5, 18, 21, 45} { result[fmt.Sprintf("%d", bandId)] = map[string]any{ "userId": userid, "bandId": bandId, "bandRank": 50, "exp": 0, "totalExp": 0, "nextExp": 0, } } return result }(), }, "userPoppinPartyStoryList": storyList(userid, m["masterPoppinPartyStoryMap"].(map[string]any)), "userAfterglowStoryList": storyList(userid, m["masterAfterglowStoryMap"].(map[string]any)), "userPastelPalettesStoryList": storyList(userid, m["masterPastelPalettesStoryMap"].(map[string]any)), "userHelloHappyWorldStoryList": storyList(userid, m["masterHelloHappyWorldStoryMap"].(map[string]any)), "userRoseliaStoryList": storyList(userid, m["masterRoseliaStoryMap"].(map[string]any)), "userItemList": func() map[string]any { var entries []any if itemMap, ok := m["masterItemMap"].(map[string]any); ok { for _, v := range itemMap["entries"].(map[string]any) { item := v.(map[string]any) entries = append(entries, map[string]any{ "userId": userid, "itemId": item["itemId"], "quantity": 6767, }) } } return map[string]any{"entries": entries} }(), "userCommonsLive2dMap": map[string]any{"entries": userCommonsLive2dEntries}, "userEpisodeMap": map[string]any{"entries": userEpisodeMap}, "userAppendParameterMap": nil, "userMusicInventoryList": func() map[string]any { var entries []any if ml, ok := m["masterMusicList"].(map[string]any); ok { if songs, ok := ml["entries"].([]any); ok { mvMap := map[string]any{} if mvl, ok := m["masterMusicVideoListMap"].(map[string]any); ok { mvMap = mvl["entries"].(map[string]any) } for _, v := range songs { song := v.(map[string]any) musicId := song["musicId"] _, hasMv := mvMap[fmt.Sprintf("%v", musicId)] entries = append(entries, map[string]any{ "userId": userid, "musicId": musicId, "seq": 1, "hasMv": hasMv, "createdAt": fmt.Sprintf("%d", now), }) } } } return map[string]any{"entries": entries} }(), "userCostumeMap": func() map[string]any { result := map[string]any{} if cm, ok := m["masterCostumeMap"].(map[string]any); ok { for _, v := range cm["entries"].(map[string]any) { costume := v.(map[string]any) id := fmt.Sprintf("%v", costume["costumeId"]) result[id] = map[string]any{ "userId": userid, "costumeId": costume["costumeId"], "characterId": costume["characterId"], } } } return map[string]any{"entries": result} }(), "userAfterLiveTalkListMap": nil, "userAreaItemMap": map[string]any{ "entries": areaItemEntries, "newlyOpenedContents": map[string]any{"entries": []any{}}, }, "userResourceCount": nil, "userLiveBoost": map[string]any{ "userId": userid, "liveBoost": 67, "serverDate": fmt.Sprintf("%d", now), "liveBoostBonusType": "default", }, "userExchangesList": map[string]any{ "entries": []any{map[string]any{"userId": userid, "exchangesId": 1563, "resetAt": "1779155725000"}}, }, "userGachaTicketList": nil, "userGachaStatusMap": nil, "userAreaStatusMap": map[string]any{"entries": areaStatusEntries}, "userLoginBonusMap": map[string]any{"entries": map[string]any{}}, "userHomeBannerList": nil, "userStampMap": func() map[string]any { result := map[string]any{} if sm, ok := m["masterStampMap"].(map[string]any); ok { for stampId, v := range sm["entries"].(map[string]any) { stamp := v.(map[string]any) _, withVoice := stamp["withVoice"] result[stampId] = map[string]any{ "userId": userid, "stampId": stamp["stampId"], "seq": 1, "isUnlockVoice": withVoice, } } } return map[string]any{"entries": result} }(), "userDegreeMap": func() map[string]any { result := map[string]any{} if dm, ok := m["masterDegreeMap"].(map[string]any); ok { for degreeId := range dm["entries"].(map[string]any) { result[degreeId] = map[string]any{"userId": userid, "degreeId": degreeId} } } return map[string]any{"entries": result} }(), "userBadPenalty": nil, "userCharacterProfileLive2dMap": map[string]any{"entries": charProfileL2dEntries}, "userEventExchangesList": map[string]any{"entries": []any{}}, "userEventItemList": func() map[string]any { var entries []any if eim, ok := m["masterEventItemMap"].(map[string]any); ok { for _, v := range eim["entries"].(map[string]any) { item := v.(map[string]any) entries = append(entries, map[string]any{ "userId": userid, "eventItemId": item["eventItemId"], "quantity": 1, }) } } return map[string]any{"entries": entries} }(), "userPurchaseMap": func() map[string]any { result := map[string]any{} for _, id := range purchaseIds { result[id] = map[string]any{"userId": userid, "purchaseId": id, "count": 0} } return map[string]any{"entries": result} }(), "userMissionMap": map[string]any{"entries": missions}, "userGenericStoryMap": func() map[string]any { result := map[string]any{} if gsm, ok := m["masterGenericStoryMap"].(map[string]any); ok { for id, v := range gsm["entries"].(map[string]any) { story := v.(map[string]any) result[id] = map[string]any{ "userId": userid, "genericStoryId": story["genericStoryId"], "status": "already_read", } } } return map[string]any{"entries": result} }(), "userLiveBoostRecoveryItemList": nil, "userHighScoreMusicRating": nil, "userHighScoreMusicRatingMap": nil, "userSeason": map[string]any{"seasonId": seasonId}, "userQualifyTournamentMusicScoreMap": nil, "userEventStoryMemorialMap": map[string]any{"entries": eventStoryEntries}, "userReleasedBondsIdList": func() map[string]any { var entries []any if bm, ok := m["masterBondsMap"].(map[string]any); ok { for k := range bm["entries"].(map[string]any) { entries = append(entries, k) } } return map[string]any{"entries": entries} }(), "userMiracleTicketMap": map[string]any{"entries": []any{}}, "userMiracleTicketExchangesMap": map[string]any{"entries": []any{}}, "userMultiDisconnectionBadPenalty": nil, "userSpecialLotteryDrawResultMap": nil, "userMusicScoreMap": map[string]any{"entries": musicScoreEntries}, "userMusicAchievementMap": nil, "userBirthdayStoryMap": func() map[string]any { result := map[string]any{} if bpm, ok := m["masterBirthdayPageMap"].(map[string]any); ok { for _, v := range bpm["entries"].(map[string]any) { item := v.(map[string]any) if item["birthdayStoryId"] == nil { continue } id := fmt.Sprintf("%v", item["birthdayStoryId"]) result[id] = map[string]any{ "userId": userid, "birthdayStoryId": item["birthdayStoryId"], "status": "already_read", } } } return map[string]any{"entries": result} }(), "userGenericAnimationMap": func() map[string]any { result := map[string]any{} if gam, ok := m["masterGenericAnimationMap"].(map[string]any); ok { for id := range gam["entries"].(map[string]any) { result[id] = map[string]any{"userId": userid, "genericAnimationId": id, "status": "already_read"} } } return map[string]any{"entries": result} }(), "userMusicShopMap": func() map[string]any { var entries []any if ml, ok := m["masterMusicList"].(map[string]any); ok { if songs, ok := ml["entries"].([]any); ok { for i, v := range songs { song := v.(map[string]any) entries = append(entries, map[string]any{ "userId": userid, "musicShopId": i + 1, "shopId": 7, "shopCategory": "common", "musicId": song["musicId"], "status": "sold_out", "seq": i + 1, "isInitialDistribution": false, }) } } } return map[string]any{"entries": map[string]any{"7": map[string]any{"entries": entries}}} }(), "userTitleList": nil, "userPurchaseVoidBadPenaltyStandard": nil, "userSelectNewYearCardMap": nil, "userGachaCountCeilingMap": nil, "userBackstageTalkSetReadHistoryMap": nil, "userNewMusicIntroductionMap": func() map[string]any { result := map[string]any{} if nm, ok := m["masterNewMusicIntroductionMap"].(map[string]any); ok { if entries, ok := nm["entries"].(map[string]any); ok { for _, v := range entries { item := v.(map[string]any) id := fmt.Sprintf("%v", item["newMusicIntroductionId"]) result[id] = map[string]any{ "userId": userid, "newMusicIntroductionId": item["newMusicIntroductionId"], "status": "already_read", } } } } return map[string]any{"entries": result} }(), "userNewSituationIntroductionMap": func() map[string]any { result := map[string]any{} if nsi, ok := m["masterNewSituationIntroductionList"].(map[string]any); ok { if entries, ok := nsi["entries"].([]any); ok { for _, v := range entries { if item, ok := v.(map[string]any); ok { id := fmt.Sprintf("%v", item["newSituationIntroductionId"]) result[id] = map[string]any{ "userId": userid, "newSituationIntroductionId": item["newSituationIntroductionId"], "status": "already_read", } } } } } return map[string]any{"entries": result} }(), "userFriendRelationDetail": map[string]any{ "applicationMap": nil, "approvalMap": nil, "friendMap": nil, "friendLimit": 50, "approvalLimit": 50, "applicationLimit": 50, }, "userNotHaveViewExchangesMiracleTicketIdList": map[string]any{"entries": []any{}}, "userProfileSituation": nil, "userProfileDegreeMap": map[string]any{"entries": userProfileDegree}, "userDecoFrameInventoryMap": map[string]any{"entries": decoFrameEntries}, "userDecoPinsInventoryMap": map[string]any{"entries": decoPinsEntries}, "userDecoEffectInventoryMap": map[string]any{"entries": decoEffectEntries}, "userDecoEquipment": map[string]any{ "userDecoCharacterSituation": map[string]any{ "userId": userid, "situationId": decoSitId, "situationStatus": decoSitStatus, }, "userDecoCharacterLive2d": map[string]any{ "userId": userid, "characterId": l2dCharId, "costumeId": l2dCostumeId, "motionId": l2dMotionId, "backgroundId": func() any { if decoL2d != nil { if v, ok := decoL2d["backgroundId"]; ok { return v } } return 1 }(), }, "userDecoCharacter3d": map[string]any{ "userId": userid, "characterId": d3dCharId, "dressId": d3dDressId, "hairstyleId": d3dHairstyleId, "motionId": d3dMotionId, "backgroundId": func() any { if deco3d != nil { if v, ok := deco3d["backgroundId"]; ok { return v } } return 11 }(), }, "userDecoFramePins": map[string]any{ "userId": userid, "decoFrameId": frameId, "decoPinsId1": getPin(0), "decoPinsId2": getPin(1), "decoPinsId3": getPin(2), "decoPinsId4": getPin(3), "decoPinsId5": getPin(4), }, "userDecoDegreeMap": map[string]any{"entries": userProfileDegree}, "userDecoAppealMap": map[string]any{}, "userDecoSetting": map[string]any{ "useProfileSettingDegree": user["useProfileSettingDegree"], "useProfileSettingSituation": user["useProfileSettingSituation"], "selectedCharacterType": user["selectedCharacterType"], }, "userDecoEffect": map[string]any{"userId": userid, "decoEffectId": decoEffectId}, }, "userMusicVideoListMap": func() map[string]any { result := map[string]any{} if mvlm, ok := m["masterMusicVideoListMap"].(map[string]any); ok { for musicId := range mvlm["entries"].(map[string]any) { result[musicId] = map[string]any{ "entries": []any{map[string]any{"userId": userid, "musicId": musicId, "seq": 1}}, } } } return map[string]any{"userMusicVideoInventoryListMap": map[string]any{"entries": result}} }(), "userPurchaseMenuLastVisitMap": map[string]any{"entries": map[string]any{}}, "userSkinLaneMap": nil, "currentUserEventMusicScoresMap": nil, "currentUserEventMusicAchievementsMap": nil, "currentUserEventBoxGachaMap": nil, "userMonthlyPurchaseMap": nil, "userSubscriptionList": nil, "userCommentBannerList": nil, "userEventBoxGachaSpinSettings": nil, "userMorfonicaStoryList": storyList(userid, m["masterMorfonicaStoryMap"].(map[string]any)), "userMatchingBonusList": nil, "userRaiseASuilenStoryList": storyList(userid, m["masterRaiseASuilenStoryMap"].(map[string]any)), "userCollaboOriginalMusicScoreMap": nil, "userDailyLive": map[string]any{ "lastClearedAt": 0, "liveStartedAt": 0, "getDailyLiveRewardId": 6, }, "userDailyLiveTotalRewardHistory": nil, "userComebackStatus": nil, "userGraphicalInformationList": nil, "userMultiLiveCountRewardList": nil, "userDigestStoryList": map[string]any{"entries": digestEntries}, "userLiveBoostUseBonusLimitList": nil, "userReceivablePresentLocationList": nil, "userPanelMissionList": nil, "userBirthdayIntroductionMap": nil, "userFestivalTeamMap": nil, "userLimitedItemList": nil, "userLimitedExchangesList": map[string]any{"entries": []any{}}, "userDeckList": map[string]any{"entries": decks}, "userAddMusicDifficultyIntroductionList": nil, "userGalleryList": nil, "userBandDeckRatingMap": nil, "updatedBandDeckRankList": nil, "userStageChallengeStageNoMap": nil, "userStageChallengeMap": nil, "userStageChallengeScoreMap": nil, "userStarSeal": map[string]any{"amount": user["seal"]}, "userLiveBoostUseFull": map[string]any{"dailyUseFullCount": 67, "resetTime": 0}, "userAutoLive": map[string]any{"resetTime": 0}, "userMonthlyMission": nil, "userMonthlyMissionRewardList": nil, "userCharacterRankMap": utils.BuildCharacterRankMap(), "userCharacterPotentialLevelMap": func() map[string]any { result := map[string]any{} for i := 1; i <= 40; i++ { result[fmt.Sprintf("%d", i)] = map[string]any{ "performanceLevel": 1, "techniqueLevel": 1, "visualLevel": 1, } } return map[string]any{"entries": result} }(), "userMusicVideo3dListMap": func() map[string]any { result := map[string]any{} if mv3m, ok := m["masterMusicVideo3dMap"].(map[string]any); ok { for _, v := range mv3m["entries"].(map[string]any) { mv := v.(map[string]any) musicId := fmt.Sprintf("%v", mv["musicId"]) result[musicId] = map[string]any{ "entries": []any{map[string]any{ "musicVideo3dId": mv["musicVideo3dId"], "musicId": mv["musicId"], "seq": mv["seq"], }}, } } } return map[string]any{"userMusicVideo3dInventoryListMap": map[string]any{"entries": result}} }(), "userCostume3dDressInventoryMap": func() map[string]any { result := map[string]any{} if cdm, ok := m["masterCostume3dDressMap"].(map[string]any); ok { for id := range cdm["entries"].(map[string]any) { result[id] = map[string]any{"costume3dDressId": id, "status": "obtained"} } } return map[string]any{"entries": result} }(), "userCostume3dHairstyleInventoryMap": func() map[string]any { result := map[string]any{} if chm, ok := m["masterCostume3dHairstyleMap"].(map[string]any); ok { for id := range chm["entries"].(map[string]any) { result[id] = map[string]any{"costume3dHairstyleId": id, "status": "obtained"} } } return map[string]any{"entries": result} }(), "userWearingCostume3dMap": func() map[string]any { result := map[string]any{} for charId, v := range wc { costume := v.(map[string]any) result[charId] = map[string]any{ "characterId": charId, "costume3dDressId": costume["dressId"], "costume3dHairstyleId": costume["hairstyleId"], } } return map[string]any{"entries": result} }(), "userMusicClearInfoMap": utils.ComputeMusicClearInfo(musicScore), "userMusicClearCountInfoMap": utils.ComputeMusicClearCountInfo(musicScore), "userCharacterSituationCountMap": nil, "userDecoCharacterBackgroundInventoryMap": func() map[string]any { result := map[string]any{} if dcbm, ok := m["masterDecoCharacterBackgroundMap"].(map[string]any); ok { for backgroundId := range dcbm["entries"].(map[string]any) { result[backgroundId] = map[string]any{"userId": userid, "backgroundId": backgroundId} } } return map[string]any{"entries": result} }(), "userDecoCharacter3dMotionInventoryListMap": func() map[string]any { result := map[string]any{} for charId, motionIds := range decoMotionMap { entries := make([]any, len(motionIds)) for i, motionId := range motionIds { entries[i] = map[string]any{"userId": userid, "motionId": motionId} } result[charId] = map[string]any{"entries": entries} } return map[string]any{"entries": result} }(), "userMusicVideo3dCustomDeckMap": nil, "userCostume3dMakingItemInventoryMap": nil, "userMusicVideo3dOriginalDeckCostumeMap": nil, "userLimitBreakItemList": nil, "userDecoAppealInventoryMap": nil, "userInvitationInfo": nil, "userCharacterUseStyleMap": nil, "userPurchaseStarList": nil, "userInviteMissionListMap": nil, "userGachaBonusMap": nil, "userStampVoiceMap": func() map[string]any { result := map[string]any{} if sm, ok := m["masterStampMap"].(map[string]any); ok { for stampId, v := range sm["entries"].(map[string]any) { stamp := v.(map[string]any) if _, ok := stamp["withVoice"]; ok { result[stampId] = map[string]any{"userId": userid, "stampId": stampId} } } } return map[string]any{"entries": result} }(), "userEventRankedCountAppeal": nil, "userEventMusicRankedCountAppeal": nil, "userMyGoStoryList": storyList(userid, m["masterMyGoStoryMap"].(map[string]any)), "userTerms": map[string]any{"userId": userid}, "userCharacterMissionBonusMap": nil, "userPhotoStudioMap": nil, "userGachaSelfPickupSituationList": nil, "userPhotoBackInventoryMap": nil, "userLimitedSkinInventoryMap": nil, "userMusicClearCountDetailMap": nil, } encoded, err := pbutil.Encode("SuiteUserGetResponse", data) if err != nil { return c.Status(500).SendString(err.Error()) } encrypted, err := utils.Encrypt(encoded) if err != nil { return c.Status(500).SendString(err.Error()) } c.Set("Content-Type", "application/octet-stream") return c.Send(encrypted) } // helpers func rangeInts(from, to int) []int { result := make([]int, to-from+1) for i := range result { result[i] = from + i } return result } func deepCopy(src map[string]any) map[string]any { b, _ := json.Marshal(src) var dst map[string]any json.Unmarshal(b, &dst) return dst }