diff --git a/src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt b/src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt index ac7188eb..4a82d629 100644 --- a/src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt +++ b/src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt @@ -1,6 +1,7 @@ package icu.samnyan.aqua.sega.wacca import ext.* +import icu.samnyan.aqua.net.utils.ApiException import icu.samnyan.aqua.sega.general.dao.CardRepository import icu.samnyan.aqua.sega.wacca.WaccaItemType.* import icu.samnyan.aqua.sega.wacca.WaccaOptionType.SET_ICON_ID @@ -38,6 +39,9 @@ class WaccaServer(val rp: WaccaRepos, val cardRepo: CardRepository) { operator fun String.invoke(block: (BaseRequest, List) -> Any) { handlerMap[this.lowercase()] = block } infix fun String.cached(block: () -> Any) { cacheMap[this.lowercase()] = block().let { if (it is String) it else it.toJson() } } + infix fun String.redirect(path: String) { + handlerMap[this.lowercase()] = handlerMap[path.lowercase()] ?: { _, _ -> 404 - "Not Found" } + } /** Convert "3.07.01.JPN.26935.S" into "3.7.1" */ fun String.shortVer() = split('.').let { if (it.size < 3) "1.0.0" else @@ -56,7 +60,7 @@ class WaccaServer(val rp: WaccaRepos, val cardRepo: CardRepository) { /** Handle all requests */ @API("/api/**") - fun handle(req: HttpServletRequest, @RB body: String): Any { + fun handle(req: HttpServletRequest, @RB body: String) = try { val path = req.requestURI.removePrefix("/g/wacca").removePrefix("/api").removePrefix("/").lowercase() if (path in cacheMap) return resp(cacheMap[path]!!) if (path !in handlerMap) return resp("[]", 1, "Not Found") @@ -64,14 +68,20 @@ class WaccaServer(val rp: WaccaRepos, val cardRepo: CardRepository) { log.info("Wacca < $path : $body") val br = JACKSON.parse(body) - return handlerMap[path]!!(br, br.params).let { when (it) { + handlerMap[path]!!(br, br.params).let { when (it) { is String -> return resp(it) is List<*> -> return resp(it.toJson()) else -> Error("Invalid response type ${it.javaClass}") } }.let { log.info("Wacca > $path : $it") } } + catch (e: ApiException) { resp("[]", e.code, e.message ?: "") } + catch (e: Exception) { + log.error("Wacca > Error", e) + resp("[]", 500, e.message ?: "") + } } +@Suppress("UNCHECKED_CAST") fun WaccaServer.init() { "housing/get" cached { ls("housingId" - 39, "isNewCab" - 0) } "housing/start" cached { ls("regionId" - 1, "recommendSongList" - ls(1269, 1007, 1270, 1002, 1020, 1003, 1008, @@ -85,6 +95,8 @@ fun WaccaServer.init() { "user/status/Logout" cached { "[]" } "user/info/GetRanking" cached { ls("totalScore#" - 0, "highScoreBySong#" - 0, "cumulativeScore#" - 0, "stateUpScore#" - 0, "otherScore#" - 0, "waccaPoints#" - 0) } + "competition/status/login" cached { "[]" } + "competition/status/update" cached { "[]" } "user/status/get" { req, (uid) -> val ru = user(uid) @@ -101,7 +113,7 @@ fun WaccaServer.init() { } "user/status/create" { _, (uid, name) -> - if (user(uid) != null) 400 - "User already exists" + if (user(uid) != null) 404 - "User already exists" val u = rp.user.save(WaccaUser().apply { card = cardRepo.findByExtId(uid.long())() ?: (404 - "Card not found") @@ -128,7 +140,7 @@ fun WaccaServer.init() { // Record login rp.user.save(u.apply { - loginCountConsec = loginCount++ + loginCount++ if (millis() - lastConsecDate.time > 23 * 60 * 60 * 1000) { loginCountDays++ loginCountToday = 0 @@ -152,31 +164,31 @@ fun WaccaServer.init() { val go = u.card.aquaUser?.gameOptions // TODO: make this and vip configurable - u.wp = 999999 + // u.wp = 999999 - u.run { ls("status" - lStatus(), + u.run { + ls("status" - lStatus(), "options" - o.map { (k, v) -> ls(k, v) }, - "seasonalPlayModeCounts" - (ls(playcountSingle, playcountMultiVs, playcountMultiCoop, playcountStageup, playcountTimeFree) - .mapIndexed { i, it -> ls(season, i + 1, it) } + ls(ls(0, 1, 1))), + "seasonalPlayModeCounts" - (playCounts.mapIndexed { i, it -> ls(season, i + 1, it) } + ls(ls(0, 1, 1))), "items" - ls(MUSIC_UNLOCK, TITLE, ICON, TROPHY, SKILL, TICKET, NOTE_COLOR, NOTE_SOUND, NAVIGATOR, USER_PLATE, TOUCH_EFFECT).map { if (it == TICKET && go?.unlockTickets == true) (0..4).map { ls(it, 106002, 0) } else items[it()]?.map { it.ls() } ?: empty }, "scores" - scores.map { it.ls() }, - "songPlayStatus" - ls(lastSongId, 1), + "songPlayStatus" - ls(lastSongInfo[0], 1), "seasonInfo" - ls(xp, wpTotal, wpSpent, scores.sumOf { it.score }, items[TITLE()]?.size ?: 0, items[ICON()]?.size ?: 0, 0, items[NOTE_COLOR()]?.size ?: 0, items[NOTE_SOUND()]?.size ?: 0, items[USER_PLATE()]?.size ?: 0, gates.sumOf { it.totalPoints }), "playAreaList" - "[[0],[0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0],[0,0,0,0],[0,0,0,0,0,0,0],[0]]".jsonArray(), "songUpdateTime" - lastLoginDate.time / 1000, - "favorites" - rp.favoriteSong.findByUser(u).map { it.songId }, + "favorites" - u.favoriteSongs, "stoppedSongIds" - empty, "events" - empty, "gate" - gates.associateBy { it.gateId }.let { gateMap -> enabledGates.map { gateMap[it]?.ls() ?: WcUserGate().apply { gateId = it }.ls() } }, - "lastSongInfo" - ls(lastSongId, lastSongDifficulty, lastFolderOrder, lastFolderId, lastSongOrder), + "lastSongInfo" - lastSongInfo, "gateTutorialFlags" - gateTutorialFlags.jsonArray(), "gatchaInfo" - empty, "friendList" - empty, @@ -190,10 +202,10 @@ fun WaccaServer.init() { fun addItems(recv: List>, u: WaccaUser, items: Map>) { if (recv.isEmpty()) return val newItems = mutableListOf() - recv.forEach { (id, type, param) -> + recv.forEach { (type, id, param) -> val ex = items[type]?.get(id) when (type) { - WP() -> u.wp += param + WP() -> { u.wp += param; u.wpTotal += param } XP() -> u.xp += param MUSIC_DIFFICULTY_UNLOCK(), MUSIC_UNLOCK() -> newItems += (ex ?: WcUserItem(type, id)) @@ -207,7 +219,7 @@ fun WaccaServer.init() { } "user/sugoroku/update" api@ { _, (uid, gid, page, progress, loops, boostsUsed, itemsRecv, totalPts, missionFlag) -> - val u = user(uid) ?: (400 - "User not found") + val u = user(uid) ?: (404 - "User not found") val g = rp.gate.findByUserAndGateId(u, gid.int()) ?: WcUserGate().apply { user = u; gateId = gid.int() } val items = itmGrp(u) @@ -218,6 +230,7 @@ fun WaccaServer.init() { it.loops = loops.int() it.missionFlag = missionFlag.int() it.totalPoints = totalPts.int() + it.lastUsed = Date() }) operator fun MutableList.plusAssign(item: T) { add(item) } @@ -228,7 +241,7 @@ fun WaccaServer.init() { } "user/mission/update" { _, (uid, bingoDetail, items, gateTutorialFlags) -> - val u = user(uid) ?: (400 - "User not found") + val u = user(uid) ?: (404 - "User not found") u.gateTutorialFlags = gateTutorialFlags.toJson() addItems(items as List>, u, itmGrp(u)) @@ -240,7 +253,7 @@ fun WaccaServer.init() { } "user/music/update" { _, (uid, _, details, items) -> - val u = user(uid) ?: (400 - "User not found") + val u = user(uid) ?: (404 - "User not found") addItems(items as List>, u, itmGrp(u)) // Upsert playlog diff --git a/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/Repos.kt b/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/Repos.kt index b223e59e..a1ff439b 100644 --- a/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/Repos.kt +++ b/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/Repos.kt @@ -22,7 +22,6 @@ interface WcUserBingoRepo : IWaccaUserLinked { fun findByUserAndPageNumber(user: WaccaUser, pageNumber: Int): WcUserBingo? } interface WcUserFriendRepo : IWaccaUserLinked -interface WcUserFavoriteSongRepo : IWaccaUserLinked interface WcUserGateRepo : IWaccaUserLinked { fun findByUserAndGateId(user: WaccaUser, gateId: Int): WcUserGate? } @@ -39,7 +38,6 @@ class WaccaRepos( val option: WcUserOptionRepo, val bingo: WcUserBingoRepo, val friend: WcUserFriendRepo, - val favoriteSong: WcUserFavoriteSongRepo, val gate: WcUserGateRepo, val item: WcUserItemRepo, val bestScore: WcUserBestScoreRepo, diff --git a/src/test/kotlin/test/WaccaTest.kt b/src/test/kotlin/test/WaccaTest.kt index be12d772..144b7afd 100644 --- a/src/test/kotlin/test/WaccaTest.kt +++ b/src/test/kotlin/test/WaccaTest.kt @@ -32,11 +32,33 @@ class WaccaTest : StringSpec({ // Replace all timestamps as null val start = millis().toString().substring(0..3) val lst = this.toJson().replace(Regex("""$start\d{6}(?=[], ])"""), "null").jsonArray() - lst shouldBe expected + val exp = expected.toJson().replace(Regex("""$start\d{6}(?=[], ])"""), "null").jsonArray() + lst shouldBe exp } infix fun List.exp(json: String) = exp(json.jsonArray()) + infix fun List.expGetDetail(json: String) { + val start = millis().toString().substring(0..3) + val lst = this.toJson().replace(Regex("""$start\d{6}(?=[], ])"""), "null").jsonArray() + val exp = json.replace(Regex("""$start\d{6}(?=[], ])"""), "null").jsonArray() + + // Check each ordered element + listOf(0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17).forEach { i -> + (lst[i] to i) shouldBe (exp[i] to i) + } + + // Check each unordered element + listOf(1, 2, 4, ).forEach { i -> + ((lst[i] as List<*>).toSet() to i) shouldBe ((exp[i] as List<*>).toSet() to i) + } + + // Check items (unordered element inside ordered element) + val setSrc = (lst[3] as List<*>).map { (it as List<*>).toSet() } + val setExp = (exp[3] as List<*>).map { (it as List<*>).toSet() } + setSrc shouldBe setExp + } + System.getProperty("kotest.assertions.collection.print.size", "1000") beforeTest { @@ -59,12 +81,12 @@ class WaccaTest : StringSpec({ "user/status/get #1" { post("user/status/get", """["$uid"]""").res exp - """[[0, "", 1, 0, 0, 0, 0, [0, 0, 0], 0, 0, 0, 0, 3376684800, 0, 0], 104001, 102001, 1, [2, "1.0.0"], []]""" + """[[0, "", 1, 0, 0, 0, 500, [0, 0, 0], 0, 0, 0, 0, 3376684800, 0, 0], 104001, 102001, 1, [2, "1.0.0"], []]""" } "user/status/create #1" { post("user/status/create", """["$uid", "AZA"]""").res exp - """[[$uid, "AZA", 1, 0, 0, 0, 0, [0, 0, 0], 0, 0, 0, 0, 3376684800, 0, 0]]""" + """[[$uid, "AZA", 1, 0, 0, 0, 500, [0, 0, 0], 0, 0, 0, 0, 3376684800, 0, 0]]""" } "user/status/login Guest" { @@ -78,8 +100,8 @@ class WaccaTest : StringSpec({ } "user/status/getDetail #1" { - post("user/status/getDetail", "[$uid]").res exp - """[[$uid, "AZA", 1, 0, 0, 0, 999999, [0, 0, 0], 1, 1, 0, 1, 3376684800, 1, 0], [], [[3, 1, 0], [3, 2, 0], [3, 3, 0], [3, 4, 0], [3, 5, 0], [0, 1, 1]], [[], [[104001, 1, null], [104002, 1, null], [104003, 1, null], [104005, 1, null]], [[102001, 1, 0, null], [102002, 1, 0, null]], [], [], [], [[103001, 1, null], [203001, 1, null]], [[105001, 1, null], [205005, 1, null]], [[210001, 1, null, 0, 0], [210002, 1, null, 0, 0], [210054, 1, null, 0, 0], [210055, 1, null, 0, 0], [210056, 1, null, 0, 0], [210057, 1, null, 0, 0], [210058, 1, null, 0, 0], [210059, 1, null, 0, 0], [210060, 1, null, 0, 0], [210061, 1, null, 0, 0], [310001, 1, null, 0, 0], [310002, 1, null, 0, 0]], [[211001, 1, null]], [[312000, 1, null], [312001, 1, null]]], [], [0, 1], [0, 0, 0, 0, 4, 2, 0, 2, 2, 1, 0], [[0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0]], null, [], [], [], [[1, 1, 1, 0, 0, 0, 0], [2, 1, 1, 0, 0, 0, 0], [3, 1, 1, 0, 0, 0, 0], [4, 1, 1, 0, 0, 0, 0], [5, 1, 1, 0, 0, 0, 0], [6, 1, 1, 0, 0, 0, 0], [7, 1, 1, 0, 0, 0, 0], [8, 1, 1, 0, 0, 0, 0], [9, 1, 1, 0, 0, 0, 0], [10, 1, 1, 0, 0, 0, 0], [11, 1, 1, 0, 0, 0, 0], [12, 1, 1, 0, 0, 0, 0], [13, 1, 1, 0, 0, 0, 0], [14, 1, 1, 0, 0, 0, 0], [15, 1, 1, 0, 0, 0, 0], [16, 1, 1, 0, 0, 0, 0], [17, 1, 1, 0, 0, 0, 0], [18, 1, 1, 0, 0, 0, 0], [19, 1, 1, 0, 0, 0, 0], [20, 1, 1, 0, 0, 0, 0], [21, 1, 1, 0, 0, 0, 0], [22, 1, 1, 0, 0, 0, 0], [23, 1, 1, 0, 0, 0, 0], [24, 1, 1, 0, 0, 0, 0]], [0, 0, 0, 0, 0], [[1, 0], [2, 0], [3, 0], [4, 0], [5, 0]], [], [], [0, []]]""" + post("user/status/getDetail", "[$uid]").res expGetDetail + """[[$uid, "AZA", 1, 0, 0, 0, 500, [0, 0, 0], 1, 1, 0, 1, 3376684800, 1, 0], [], [[3, 1, 0], [3, 2, 0], [3, 3, 0], [3, 4, 0], [3, 5, 0], [0, 1, 1]], [[], [[104001, 1, null], [104002, 1, null], [104003, 1, null], [104005, 1, null]], [[102001, 1, 0, null], [102002, 1, 0, null]], [], [], [], [[103001, 1, null], [203001, 1, null]], [[105001, 1, null], [205005, 1, null]], [[210001, 1, null, 0, 0], [210002, 1, null, 0, 0], [210054, 1, null, 0, 0], [210055, 1, null, 0, 0], [210056, 1, null, 0, 0], [210057, 1, null, 0, 0], [210058, 1, null, 0, 0], [210059, 1, null, 0, 0], [210060, 1, null, 0, 0], [210061, 1, null, 0, 0], [310001, 1, null, 0, 0], [310002, 1, null, 0, 0]], [[211001, 1, null]], [[312000, 1, null], [312001, 1, null]]], [], [0, 1], [0, 500, 0, 0, 4, 2, 0, 2, 2, 1, 0], [[0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0]], null, [], [], [], [[1, 1, 1, 0, 0, 0, 0], [2, 1, 1, 0, 0, 0, 0], [3, 1, 1, 0, 0, 0, 0], [4, 1, 1, 0, 0, 0, 0], [5, 1, 1, 0, 0, 0, 0], [6, 1, 1, 0, 0, 0, 0], [7, 1, 1, 0, 0, 0, 0], [8, 1, 1, 0, 0, 0, 0], [9, 1, 1, 0, 0, 0, 0], [10, 1, 1, 0, 0, 0, 0], [11, 1, 1, 0, 0, 0, 0], [12, 1, 1, 0, 0, 0, 0], [13, 1, 1, 0, 0, 0, 0], [14, 1, 1, 0, 0, 0, 0], [15, 1, 1, 0, 0, 0, 0], [16, 1, 1, 0, 0, 0, 0], [17, 1, 1, 0, 0, 0, 0], [18, 1, 1, 0, 0, 0, 0], [19, 1, 1, 0, 0, 0, 0], [20, 1, 1, 0, 0, 0, 0], [21, 1, 1, 0, 0, 0, 0], [22, 1, 1, 0, 0, 0, 0], [23, 1, 1, 0, 0, 0, 0], [24, 1, 1, 0, 0, 0, 0]], [0, 0, 0, 0, 0], [[1, 0], [2, 0], [3, 0], [4, 0], [5, 0]], [], [], [0, []]]""" } "user/sugoroku/update #1" { @@ -126,5 +148,59 @@ class WaccaTest : StringSpec({ post("user/music/update", "[$uid, 3, [1111, 2, 10.899999618530273, 900776, [484, 128, 13, 19], 157, 7, 1, 0, 0, 0, 0, 0, 15, 126, 1], [[2, 0, 1224], [4, 1111, 3]]]").res exp "[[1111, 2, [1, 1, 0, 0, 0], [1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], 900776, 19, 0, 1, 108], [1111, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], []]" } + + "user/status/update #2" { + post("user/status/update", "[$uid, 1, [[1, 0, 100], [2, 0, 250], [5, 104078, 1], [5, 104125, 1], [7, 301001, 1000], [7, 301002, 300], [7, 301003, 100]], 0, 0, [], [1111, 2, 1, 5, 2]]").res exp + "[]" + } + + "user/rating/update #1" { + post("user/rating/update", "[$uid, 497, [[1116, 2, 97], [2074, 3, 0], [2074, 2, 182], [1111, 3, 0], [1111, 2, 218]]]").res exp + "[]" + } + + "user/info/getMyroom #1" { + post("user/info/getMyroom", "[$uid]").res exp + "[0, 0, 0, 0, 0, [], 0, 0, 0]" + } + + "user/info/update #1" { + post("user/info/update", "[$uid, [[1, 38], [2, 3], [108, 94]], [], [], [], []]").res exp + "[]" + } + + "user/status/logout #2" { + post("user/status/logout", "[$uid]").res exp + "[]" + } + + "user/status/get #2" { + post("user/status/get", """["$uid"]""").res exp + """[[$uid, "AZA", 1, 100, 0, 0, 4134, [0, 0, 0], 1, 1, 0, 1, 3376684800, 1, 497], 104001, 102001, 0, [0, "3.7.1"], [[1, 38], [2, 3], [108, 94]]]""" + } + + "user/status/login #3" { + post("user/status/login", "[$uid]").res exp + "[[], [], [], 0, [2077, 1, 1, 1, [], []], null, []]" + } + + "user/status/getDetail #2" { + post("user/status/getDetail", "[$uid]").res expGetDetail + """[[$uid, "AZA", 1, 100, 0, 0, 4134, [0, 0, 0], 2, 1, 1, 1, 3376684800, 2, 497], [[1, 38], [2, 3], [108, 94]], [[3, 1, 1], [3, 2, 0], [3, 3, 0], [3, 4, 0], [3, 5, 0], [0, 1, 1]], [[[1111, 1, 0, 1711419516], [1111, 2, 0, 1711419516], [1111, 3, 0, 1711419516], [2074, 1, 0, 1711419238], [2074, 2, 0, 1711419238], [2074, 3, 0, 1711419238]], [[104001, 1, 1711418627], [104002, 1, 1711418627], [104003, 1, 1711418627], [104005, 1, 1711418627], [304129, 1, 1711419172], [104078, 1, 1711419526], [104125, 1, 1711419526]], [[102001, 1, 1, 1711418627], [102002, 1, 0, 1711418627], [302027, 1, 0, 1711418927], [302030, 1, 0, 1711419486]], [[301001, 3, 1000, 0], [301002, 3, 300, 0], [301003, 3, 100, 0]], [], [[0, 106002, 0], [1, 106002, 0], [2, 106002, 0], [3, 106002, 0], [4, 106002, 0]], [[103001, 1, 1711418627], [203001, 1, 1711418627]], [[105001, 1, 1711418627], [205005, 1, 1711418627]], [[210001, 1, 1711418627, 0, 0], [210002, 1, 1711418627, 0, 0], [210054, 1, 1711418627, 0, 0], [210055, 1, 1711418627, 0, 0], [210056, 1, 1711418627, 0, 0], [210057, 1, 1711418627, 0, 0], [210058, 1, 1711418627, 0, 0], [210059, 1, 1711418627, 0, 0], [210060, 1, 1711418627, 0, 0], [210061, 1, 1711418627, 0, 0], [310001, 1, 1711418627, 1, 1], [310002, 1, 1711418627, 0, 0]], [[211001, 1, 1711418627]], [[312000, 1, 1711418627], [312001, 1, 1711418627]]], [[1116, 2, [1, 1, 0, 0, 0], [1, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 812201, 56, 33, 1, 97], [2074, 3, [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 0, 0, 0, 1, 0], [2074, 2, [1, 1, 0, 0, 0], [1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], 903346, 77, 11, 1, 182], [1111, 3, [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 0, 0, 0, 1, 0], [1111, 2, [1, 1, 0, 0, 0], [1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], 900776, 157, 19, 1, 218]], [1111, 1], [100, 4134, 0, 2616323, 7, 4, 0, 2, 2, 1, 324], [[0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0]], 1711422586, [], [], [], [[1, 1, 1, 0, 0, 0, 0], [2, 1, 1, 0, 0, 0, 0], [3, 1, 1, 0, 0, 0, 0], [4, 1, 1, 0, 0, 0, 0], [5, 1, 1, 0, 0, 0, 0], [6, 1, 1, 0, 0, 0, 0], [7, 1, 1, 0, 0, 0, 0], [8, 1, 1, 0, 0, 0, 0], [9, 1, 1, 0, 0, 0, 0], [10, 1, 1, 0, 0, 0, 0], [11, 1, 1, 0, 0, 0, 0], [12, 1, 1, 0, 0, 0, 0], [13, 1, 1, 0, 0, 0, 0], [14, 1, 1, 0, 0, 0, 0], [15, 1, 1, 0, 0, 0, 0], [16, 1, 1, 0, 0, 0, 0], [17, 1, 1, 0, 0, 0, 0], [18, 1, 1, 0, 0, 0, 0], [19, 1, 1, 0, 0, 0, 0], [20, 1, 1, 0, 0, 0, 0], [21, 1, 1, 0, 0, 0, 0], [22, 1, 1, 0, 0, 0, 0], [23, 1, 4, 90, 0, 1711418927, 0], [24, 1, 1, 0, 0, 0, 0]], [1111, 2, 1, 5, 2], [[1, 1], [2, 1], [3, 1], [4, 1], [5, 0]], [], [], [1, [[0, 1, 1], [1, 2, 0], [2, 3, 0], [3, 4, 0], [4, 5, 0], [5, 6, 0], [6, 7, 0], [7, 8, 800], [8, 9, 2000000]]]]""" + } + + "user/status/get #3" { + post("user/status/get", """["$uid"]""").res exp + """[[$uid, "AZA", 1, 100, 0, 0, 4134, [0, 0, 0], 2, 1, 1, 1, 3376684800, 2, 497], 104001, 102001, 0, [0, "3.7.1"], [[1, 38], [2, 3], [108, 94]]]""" + } + + "user/status/login #4" { + post("user/status/login", "[$uid]").res exp + "[[], [], [], 0, [2077, 1, 1, 1, [], []], null, []]" + } + + "user/status/getDetail #3" { + post("user/status/getDetail", "[$uid]").res expGetDetail + """[[$uid, "AZA", 1, 100, 0, 0, 4134, [0, 0, 0], 3, 1, 2, 1, 3376684800, 3, 497], [[1, 38], [2, 3], [108, 94]], [[3, 1, 1], [3, 2, 0], [3, 3, 0], [3, 4, 0], [3, 5, 0], [0, 1, 1]], [[[1111, 1, 0, 1711419516], [1111, 2, 0, 1711419516], [1111, 3, 0, 1711419516], [2074, 1, 0, 1711419238], [2074, 2, 0, 1711419238], [2074, 3, 0, 1711419238]], [[104001, 1, 1711418627], [104002, 1, 1711418627], [104003, 1, 1711418627], [104005, 1, 1711418627], [304129, 1, 1711419172], [104078, 1, 1711419526], [104125, 1, 1711419526]], [[102001, 1, 1, 1711418627], [102002, 1, 0, 1711418627], [302027, 1, 0, 1711418927], [302030, 1, 0, 1711419486]], [[301001, 3, 1000, 0], [301002, 3, 300, 0], [301003, 3, 100, 0]], [], [[0, 106002, 0], [1, 106002, 0], [2, 106002, 0], [3, 106002, 0], [4, 106002, 0]], [[103001, 1, 1711418627], [203001, 1, 1711418627]], [[105001, 1, 1711418627], [205005, 1, 1711418627]], [[210001, 1, 1711418627, 0, 0], [210002, 1, 1711418627, 0, 0], [210054, 1, 1711418627, 0, 0], [210055, 1, 1711418627, 0, 0], [210056, 1, 1711418627, 0, 0], [210057, 1, 1711418627, 0, 0], [210058, 1, 1711418627, 0, 0], [210059, 1, 1711418627, 0, 0], [210060, 1, 1711418627, 0, 0], [210061, 1, 1711418627, 0, 0], [310001, 1, 1711418627, 1, 1], [310002, 1, 1711418627, 0, 0]], [[211001, 1, 1711418627]], [[312000, 1, 1711418627], [312001, 1, 1711418627]]], [[1116, 2, [1, 1, 0, 0, 0], [1, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 812201, 56, 33, 1, 97], [2074, 3, [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 0, 0, 0, 1, 0], [2074, 2, [1, 1, 0, 0, 0], [1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], 903346, 77, 11, 1, 182], [1111, 3, [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 0, 0, 0, 1, 0], [1111, 2, [1, 1, 0, 0, 0], [1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], 900776, 157, 19, 1, 218]], [1111, 1], [100, 4134, 0, 2616323, 7, 4, 0, 2, 2, 1, 324], [[0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0]], 1711422954, [], [], [], [[1, 1, 1, 0, 0, 0, 0], [2, 1, 1, 0, 0, 0, 0], [3, 1, 1, 0, 0, 0, 0], [4, 1, 1, 0, 0, 0, 0], [5, 1, 1, 0, 0, 0, 0], [6, 1, 1, 0, 0, 0, 0], [7, 1, 1, 0, 0, 0, 0], [8, 1, 1, 0, 0, 0, 0], [9, 1, 1, 0, 0, 0, 0], [10, 1, 1, 0, 0, 0, 0], [11, 1, 1, 0, 0, 0, 0], [12, 1, 1, 0, 0, 0, 0], [13, 1, 1, 0, 0, 0, 0], [14, 1, 1, 0, 0, 0, 0], [15, 1, 1, 0, 0, 0, 0], [16, 1, 1, 0, 0, 0, 0], [17, 1, 1, 0, 0, 0, 0], [18, 1, 1, 0, 0, 0, 0], [19, 1, 1, 0, 0, 0, 0], [20, 1, 1, 0, 0, 0, 0], [21, 1, 1, 0, 0, 0, 0], [22, 1, 1, 0, 0, 0, 0], [23, 1, 4, 90, 0, 1711418927, 0], [24, 1, 1, 0, 0, 0, 0]], [1111, 2, 1, 5, 2], [[1, 1], [2, 1], [3, 1], [4, 1], [5, 0]], [], [], [1, [[0, 1, 1], [1, 2, 0], [2, 3, 0], [3, 4, 0], [4, 5, 0], [5, 6, 0], [6, 7, 0], [7, 8, 800], [8, 9, 2000000]]]]""" } }) \ No newline at end of file