From 8fd378852f4b285036ca744a32b073b8bc7697ee Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Tue, 11 Mar 2025 05:11:10 -0400 Subject: [PATCH] [+] Mai2 broker --- .../samnyan/aqua/net/transfer/AllNetClient.kt | 1 + .../samnyan/aqua/net/transfer/DataBroker.kt | 35 +++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/main/java/icu/samnyan/aqua/net/transfer/AllNetClient.kt b/src/main/java/icu/samnyan/aqua/net/transfer/AllNetClient.kt index 1fd93d1c..3547b6ec 100644 --- a/src/main/java/icu/samnyan/aqua/net/transfer/AllNetClient.kt +++ b/src/main/java/icu/samnyan/aqua/net/transfer/AllNetClient.kt @@ -53,6 +53,7 @@ class AllNetClient(val dns: String, val keychip: String, val game: String, val v fun findDataBroker(log: (String) -> Unit) = when (game) { "SDHD" -> ChusanDataBroker(this, log) + "SDEZ", "SDGA" -> MaimaiDataBroker(this, log) else -> throw IllegalArgumentException("Unsupported game: $game") } } \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/net/transfer/DataBroker.kt b/src/main/java/icu/samnyan/aqua/net/transfer/DataBroker.kt index c99f34d8..a0c70c68 100644 --- a/src/main/java/icu/samnyan/aqua/net/transfer/DataBroker.kt +++ b/src/main/java/icu/samnyan/aqua/net/transfer/DataBroker.kt @@ -6,6 +6,9 @@ import icu.samnyan.aqua.sega.chusan.model.userdata.UserActivity import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem import icu.samnyan.aqua.sega.chusan.model.userdata.UserMusicDetail import icu.samnyan.aqua.sega.maimai2.model.request.Mai2UserAll +import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserFavorite +import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserItem +import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserMusicDetail import icu.samnyan.aqua.sega.util.jackson.BasicMapper import icu.samnyan.aqua.sega.util.jackson.IMapper import icu.samnyan.aqua.sega.util.jackson.StringMapper @@ -18,7 +21,7 @@ abstract class DataBroker( abstract val mapper: IMapper abstract val url: String - inline fun String.get(key: String, data: JDict): T = "$url/$this".request() + inline fun String.getNullable(key: String, data: JDict): T? = "$url/$this".request() .postZ(mapper.write(data)) .bodyMaybeZ() .jsonMap()[key] @@ -26,7 +29,12 @@ abstract class DataBroker( ?.also { if (it is List<*>) log("✅ $this: ${it.size}") else log("✅ $this") - } ?: throw NullPointerException("❌ $this") + } + + inline fun String.get(key: String, data: JDict): T = getNullable(key, data) ?: run { + log("❌ $this") + throw Exception("Failed to get $this") + } abstract fun pull(): String fun push(data: String) { @@ -79,6 +87,8 @@ class MaimaiDataBroker(allNet: AllNetClient, log: (String) -> Unit): DataBroker( override val mapper = BasicMapper() override val url by lazy { "${allNet.gameUrl.ensureEndingSlash()}Maimai2Servlet" } + class UserMusicWrapper(var userMusicDetailList: List) + override fun pull(): String { log("Game URL: ${allNet.gameUrl}") log("User ID: ${allNet.userId}") @@ -88,8 +98,27 @@ class MaimaiDataBroker(allNet: AllNetClient, log: (String) -> Unit): DataBroker( return Mai2UserAll().apply { userData = ls("GetUserDataApi".get("userData", userId)) -// userGameOption = ls("GetUserOptionApi".get("userGameOption", userId)) + userOption = ls("GetUserOptionApi".get("userOption", userId)) + userExtend = ls("GetUserExtendApi".get("userExtend", userId)) + userRatingList = ls("GetUserRatingApi".get("userRating", userId)) + userActivityList = ls("GetUserActivityApi".get("userActivity", userId)) + userMusicDetailList = "GetUserMusicApi".get>("userMusicList", paged) + .flatMap { it.userMusicDetailList } + userFriendSeasonRankingList = "GetUserFriendSeasonRankingApi".get("userFriendSeasonRankingList", paged) + userCharacterList = "GetUserCharacterApi".get("userCharacterList", paged) + userItemList = (1..12).flatMap { + "GetUserItemApi".get>("userItemList", paged + mapOf("nextIndex" to 10000000000 * it)) + } + userCourseList = "GetUserCourseApi".get("userCourseList", paged) + userFavoriteList = (1..5).mapNotNull { + "GetUserFavoriteApi".getNullable("userFavorite", userId + mapOf("itemKind" to it)) + } + userGhost = "GetUserGhostApi".get("userGhostList", userId) + userMapList = "GetUserMapApi".get("userMapList", paged) + userLoginBonusList = "GetUserLoginBonusApi".get("userLoginBonusList", userId) + + // TODO: userFavoriteMusicList }.toJson() }