From 2ef4b7241d4f17a5aadb5001c74fc6830f3a832b Mon Sep 17 00:00:00 2001 From: Menci Date: Sat, 1 Feb 2025 15:49:40 +0800 Subject: [PATCH] [+] MaiMile and UserIntimate (partner closeness) --- .../icu/samnyan/aqua/sega/maimai2/Maimai2Apis.kt | 7 ++++++- .../sega/maimai2/handler/UpsertUserAllHandler.kt | 6 +++++- .../icu/samnyan/aqua/sega/maimai2/model/Repos.kt | 5 +++++ .../sega/maimai2/model/request/data/UserAll.java | 1 + .../sega/maimai2/model/userdata/Mai2UserDetail.kt | 4 ++++ .../sega/maimai2/model/userdata/UserEntities.kt | 8 ++++++++ .../db/V1000_36__maimai2_maimile_intimate.sql | 15 +++++++++++++++ 7 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/db/V1000_36__maimai2_maimile_intimate.sql diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2Apis.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2Apis.kt index c555424b..d3f6cdb9 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2Apis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2Apis.kt @@ -6,6 +6,7 @@ import ext.* import icu.samnyan.aqua.sega.general.PagedHandler import icu.samnyan.aqua.sega.maimai2.model.response.data.UserRivalMusic import icu.samnyan.aqua.sega.maimai2.model.response.data.UserRivalMusicDetail +import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserIntimate import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserKaleidx import java.time.LocalDate import java.util.* @@ -175,11 +176,15 @@ fun Maimai2ServletController.initApis() { mapOf("userId" to uid, "rivalId" to rivalId, "nextIndex" to 0, "userRivalMusicList" to res.values) } + "GetUserIntimate".unpaged { + val u = db.userData.findByCardExtId(uid)() ?: (404 - "User not found") + db.userIntimate.findByUser(u) + } + // Empty List Handlers "GetUserRegion".unpaged { empty } "GetUserGhost".unpaged { empty } "GetUserFriendBonus" { mapOf("userId" to uid, "returnCode" to 0, "getMiles" to 0) } - "GetUserIntimate" { mapOf("userId" to uid, "length" to 0, "userIntimateList" to empty) } "GetTransferFriend" { mapOf("userId" to uid, "transferFriendList" to empty) } "GetUserNewItem" { mapOf("userId" to uid, "itemKind" to 0, "itemId" to 0) } diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/UpsertUserAllHandler.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/UpsertUserAllHandler.kt index c5a026d3..2d4e7bef 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/UpsertUserAllHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/UpsertUserAllHandler.kt @@ -73,7 +73,7 @@ class UpsertUserAllHandler( listOfNotNull( userExtend, userOption, userCharacterList, userMapList, userLoginBonusList, userItemList, userMusicDetailList, userCourseList, userFriendSeasonRankingList, userFavoriteList, - userKaleidxScopeList + userKaleidxScopeList, userIntimateList ) }.flatten().forEach { it.user = u } @@ -134,6 +134,10 @@ class UpsertUserAllHandler( repos.userKaleidx.saveAll(lst.mapApply { id = repos.userKaleidx.findByUserAndGateId(u, gateId)?.id ?: 0 }) } + req.userIntimateList?.unique { it.partnerId }?.let { lst -> + repos.userIntimate.saveAll(lst.mapApply { + id = repos.userIntimate.findByUserAndPartnerId(u, partnerId)?.id ?: 0 }) } + // 2024/10/31 Found some user data findByUserAndKindAndActivityId is not unique // I think userActivityList is not important, so I will ignore it try { diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/Repos.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/Repos.kt index 6d130c44..309b95ce 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/Repos.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/Repos.kt @@ -114,6 +114,10 @@ interface MAi2UserKaleidxRepo : Mai2UserLinked { fun findByUserAndGateId(user: Mai2UserDetail, gateId: Int): Mai2UserKaleidx? } +interface MAi2UserIntimateRepo : Mai2UserLinked { + fun findByUserAndPartnerId(user: Mai2UserDetail, partnerId: Int): Mai2UserIntimate? +} + interface Mai2GameChargeRepo : JpaRepository interface Mai2GameEventRepo : JpaRepository { @@ -144,6 +148,7 @@ class Mai2Repos( val userPrintDetail: Mai2UserPrintDetailRepo, val userUdemae: Mai2UserUdemaeRepo, val userKaleidx: MAi2UserKaleidxRepo, + val userIntimate: MAi2UserIntimateRepo, val gameCharge: Mai2GameChargeRepo, val gameEvent: Mai2GameEventRepo, val gameSellingCard: Mai2GameSellingCardRepo diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/request/data/UserAll.java b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/request/data/UserAll.java index fe1c7c03..88c38e9f 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/request/data/UserAll.java +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/request/data/UserAll.java @@ -36,6 +36,7 @@ public class UserAll implements Serializable { private List> userGamePlaylogList; private List userFavoritemusicList; private List userKaleidxScopeList; + private List userIntimateList; private String isNewCharacterList; private String isNewMapList; private String isNewLoginBonusList; diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/Mai2UserDetail.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/Mai2UserDetail.kt index 0dff70f7..c82efefb 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/Mai2UserDetail.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/Mai2UserDetail.kt @@ -148,6 +148,10 @@ class Mai2UserDetail( var cmLastEmoneyCredit: Int = 69, var mapStock: Int = 0, + // MaiMile + var point: Int = 0, + var totalPoint: Int = 0, + // TODO: Make these non-nullable with default value var currentPlayCount: Int? = 0, var renameCredit: Int? = 0 diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserEntities.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserEntities.kt index 569b9007..813d8903 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserEntities.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserEntities.kt @@ -597,3 +597,11 @@ class Mai2UserKaleidx : Mai2UserEntity() { var lastPlayDate: LocalDateTime? = null var isInfoWatched = false } + +@Table(name = "maimai2_user_intimate") +@Data @Entity +class Mai2UserIntimate : Mai2UserEntity() { + var partnerId = 1; + var intimateLevel = 0; + var intimateCountRewarded = 0; +} diff --git a/src/main/resources/db/V1000_36__maimai2_maimile_intimate.sql b/src/main/resources/db/V1000_36__maimai2_maimile_intimate.sql new file mode 100644 index 00000000..8cb4ba59 --- /dev/null +++ b/src/main/resources/db/V1000_36__maimai2_maimile_intimate.sql @@ -0,0 +1,15 @@ +ALTER TABLE maimai2_user_detail + ADD COLUMN point INT DEFAULT 0, + ADD COLUMN total_point INT DEFAULT 0; + +CREATE TABLE maimai2_user_intimate +( + id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY, + user_id BIGINT NULL, + partner_id INT NOT NULL, + intimate_level INT NOT NULL, + intimate_count_rewarded INT NOT NULL, + CONSTRAINT fku_maimai2_user_intimate FOREIGN KEY (user_id) REFERENCES maimai2_user_detail (id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT unique_maimai2_user_intimate UNIQUE (user_id, partner_id) +); +