From b0392cd3e61b1a0640bcbef3c9645ad8e70359ee Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 9 Mar 2025 07:10:15 -0400 Subject: [PATCH 01/20] [+] Unlock challenge? --- .../aqua/sega/chusan/handler/ChusanApis.kt | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt index c9280fd6..b1598524 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt @@ -27,6 +27,45 @@ fun ChusanController.chusanInit() { mapOf("type" to type, "length" to 0, "gameRankingList" to lst) } + // VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE + "GetGameCourseLevel" { + // gameCourseLevelList: [{courseId: int, startDate: date, endDate: date}] + mapOf("length" to 0, "gameCourseLevelList" to listOf( + mapOf("courseId" to 300004, "startDate" to "2019-01-01 00:00:00", "endDate" to "2077-01-01 11:45:14"), + mapOf("courseId" to 300009, "startDate" to "2019-01-01 00:00:00", "endDate" to "2077-01-01 11:45:14") + )) + } + + "GetGameUCCondition" { + val lst = listOf( + mapOf("unlockChallengeId" to 10001, "length" to 1, "conditionList" to listOf( + mapOf("type" to 1, "conditionId" to 3020798, "logicalOpe" to 1, "startDate" to "2024-03-08 01:00:00", "endDate" to "2077-01-01 11:45:14") + )), + mapOf("unlockChallengeId" to 10002, "length" to 1, "conditionList" to listOf( + mapOf("type" to 0, "conditionId" to -1, "logicalOpe" to 1, "startDate" to "2024-03-08 01:00:00", "endDate" to "2077-01-01 11:45:14") + )) + ) + mapOf("length" to lst.size, "gameUnlockChallengeConditionList" to lst) + } + + "GetUserUC".paged("userUnlockChallengeList") { + // TODO: Save and load user unlock challenge + // unlockChallengeId: int, status: int, clearCourseId: int, conditionType: int + // score: int, life: int, clearDate: date + empty + } + + "GetUserRecMusic".paged("userRecMusicList") { + // musicId: int, recMusicList: string??? + empty + } + + "GetUserRecRating".paged("userRecRatingList") { + // ratingMin: int, ratingMax: int, recMusicList: string??? + empty + } + // VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE + // Stub handlers "GetGameIdlist" { """{"type":"${data["type"]}","length":"0","gameIdlistList":[]}""" } From 6e6adb8caaee40e0a0ab006f976bf90a36117140 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 9 Mar 2025 09:57:09 -0400 Subject: [PATCH 02/20] [+] Verse: Save rating --- .../samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt | 7 +++++-- .../aqua/sega/chusan/model/request/UpsertUserAll.kt | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt index e8bb3664..b8056a99 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt @@ -42,8 +42,11 @@ fun ChusanController.upsertApiInit() { fun Iterable.str() = joinToString(",") { "${it.musicId}:${it.difficultId}:${it.score}" } ls( - userRecentRatingList to "recent_rating_list", userRatingBaseList to "rating_base_list", - userRatingBaseHotList to "rating_hot_list", userRatingBaseNextList to "rating_next_list", + userRecentRatingList to "recent_rating_list", + userRatingBaseList to "rating_base_list", + userRatingBaseHotList to "rating_hot_list", + userRatingBaseNextList to "rating_next_list", + userRatingBaseNewList to "rating_new_list" ).filter { it.first != null }.forEach { (list, key) -> val d = db.userGeneralData.findByUserAndPropertyKey(u, key)() ?: UserGeneralData().apply { user = u; propertyKey = key } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.kt index 99be8f6f..5f630794 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.kt @@ -54,6 +54,7 @@ class UpsertUserAll( var userRatingBaseHotList: List? = null, var userRatingBaseList: List? = null, var userRatingBaseNextList: List? = null, + var userRatingBaseNewList: List? = null, var userLoginBonusList: List? = null, var userMapAreaList: List? = null, var userOverPowerList: List? = null, From 6d02c53eb3cef70fd4d3baf2ac87145d7f5d076a Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 9 Mar 2025 09:57:46 -0400 Subject: [PATCH 03/20] [+] Verse: Save unlock challenge --- .../sega/chusan/handler/ChusanUpsertApis.kt | 4 ++++ .../aqua/sega/chusan/model/Chu3Repos.kt | 5 +++++ .../sega/chusan/model/request/UpsertUserAll.kt | 1 + .../chusan/model/userdata/Chu3UserChallenge.kt | 18 ++++++++++++++++++ 4 files changed, 28 insertions(+) create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserChallenge.kt diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt index b8056a99..dbe8ff86 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt @@ -124,6 +124,10 @@ fun ChusanController.upsertApiInit() { db.userDuel.saveAll(list.distinctBy { it.duelId }.mapApply { id = db.userDuel.findByUserAndDuelId(u, duelId)?.id ?: 0 }) } + userUnlockChallengeList?.let { list -> + db.userChallenge.saveAll(list.distinctBy { it.unlockChallengeId }.mapApply { + id = db.userChallenge.findByUserAndUnlockChallengeId(u, unlockChallengeId)?.id ?: 0 }) } + // Need testing // userLoginBonusList?.let { list -> // db.userLoginBonus.saveAll(list.distinctBy { it["presetId"] as String }.map { diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3Repos.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3Repos.kt index a8841c51..280978f5 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3Repos.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3Repos.kt @@ -136,6 +136,10 @@ interface Chu3NetBattleLogRepo : Chu3UserLinked { interface Chu3UserMiscRepo : Chu3UserLinked +interface Chu3UserChallengeRepo : Chu3UserLinked { + fun findByUserAndUnlockChallengeId(user: Chu3UserData, unlockChallengeId: Int): Chu3UserChallenge? +} + interface Chu3GameChargeRepo : JpaRepository interface Chu3GameEventRepo : JpaRepository { @@ -191,6 +195,7 @@ class Chu3Repos( val userCMissionProgress: Chu3UserCMissionProgressRepo, val netBattleLog: Chu3NetBattleLogRepo, val userMisc: Chu3UserMiscRepo, + val userChallenge: Chu3UserChallengeRepo, val gameCharge: Chu3GameChargeRepo, val gameEvent: Chu3GameEventRepo, val gameGachaCard: Chu3GameGachaCardRepo, diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.kt index 5f630794..2c195609 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.kt @@ -63,4 +63,5 @@ class UpsertUserAll( var userNetBattleData: List? = null, var userCMissionList: List? = null, var userFavoriteMusicList: List? = null, + var userUnlockChallengeList: List? = null, ) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserChallenge.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserChallenge.kt new file mode 100644 index 00000000..7f0e6ef2 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserChallenge.kt @@ -0,0 +1,18 @@ +package icu.samnyan.aqua.sega.chusan.model.userdata + +import jakarta.persistence.Entity +import jakarta.persistence.Table +import jakarta.persistence.UniqueConstraint + + +@Entity(name = "ChusanUserChallenge") +@Table(name = "chusan_user_challenge", uniqueConstraints = [UniqueConstraint(columnNames = ["user_id", "unlock_challenge_id"])]) +class Chu3UserChallenge : Chu3UserEntity() { + var unlockChallengeId = 0 + var status = 0 + var clearCourseId = 0 + var conditionType = 0 + var score = 0 + var life = 0 + var clearDate = "" // len 20 YYYY-MM-DD HH:MM:SS +} From cc5ffdf6441b07603d4512b72e294b7943323999 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 9 Mar 2025 09:58:42 -0400 Subject: [PATCH 04/20] [+] Verse: Add user data fields --- .../sega/chusan/model/userdata/Chu3UserData.kt | 4 ++++ .../resources/db/V1000_40__chusan_verse.sql | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/main/resources/db/V1000_40__chusan_verse.sql diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserData.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserData.kt index b357c9e5..06c1788e 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserData.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserData.kt @@ -141,6 +141,10 @@ class Chu3UserData : BaseEntity(), IUserData { @JsonInclude(JsonInclude.Include.NON_NULL) @Transient var userEmoney: UserEmoney? = null + + // VERSE + var trophyIdSub1 = 0 + var trophyIdSub2 = 0 override val totalScore get() = totalHiScore } diff --git a/src/main/resources/db/V1000_40__chusan_verse.sql b/src/main/resources/db/V1000_40__chusan_verse.sql new file mode 100644 index 00000000..ea17e466 --- /dev/null +++ b/src/main/resources/db/V1000_40__chusan_verse.sql @@ -0,0 +1,17 @@ +ALTER TABLE chusan_user_data ADD COLUMN trophy_id_sub1 INT NOT NULL DEFAULT 0; +ALTER TABLE chusan_user_data ADD COLUMN trophy_id_sub2 INT NOT NULL DEFAULT 0; + +CREATE TABLE chusan_user_challenge +( + id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY, + user_id BIGINT NOT NULL, + unlock_challenge_id INT NOT NULL, + status INT NOT NULL, + clear_course_id INT NOT NULL, + condition_type INT NOT NULL, + score INT NOT NULL, + life INT NOT NULL, + clear_date VARCHAR(20) NULL, + CONSTRAINT fku_chusan_user_challenge FOREIGN KEY (user_id) REFERENCES chusan_user_data (id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT unique_user_challenge UNIQUE (user_id, unlock_challenge_id) +); From 9ac4b56ef7bd49aa8c65f130742d4790b316da73 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 9 Mar 2025 10:00:37 -0400 Subject: [PATCH 05/20] [+] Verse: Return user challenge --- .../java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt index b1598524..cf8bb351 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt @@ -49,10 +49,9 @@ fun ChusanController.chusanInit() { } "GetUserUC".paged("userUnlockChallengeList") { - // TODO: Save and load user unlock challenge // unlockChallengeId: int, status: int, clearCourseId: int, conditionType: int // score: int, life: int, clearDate: date - empty + db.userChallenge.findByUser_Card_ExtId(uid) } "GetUserRecMusic".paged("userRecMusicList") { From 8bbde9e7e346c809a3edc932945d5271f6d92fee Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 9 Mar 2025 10:07:00 -0400 Subject: [PATCH 06/20] [F] Verse: Fix userid null --- .../icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt index dbe8ff86..36425071 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt @@ -35,7 +35,7 @@ fun ChusanController.upsertApiInit() { listOfNotNull( userPlaylogList, userGameOption, userMapAreaList, userCharacterList, userItemList, userMusicDetailList, userActivityList, userChargeList, userCourseList, userDuelList, - userNetBattlelogList + userNetBattlelogList, userUnlockChallengeList ).flatten().forEach { it.user = u } // Ratings From 226ba475aa67ed93dde1f7a83a62a46843510890 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 9 Mar 2025 10:19:39 -0400 Subject: [PATCH 07/20] [+] Verse: Generalize AI recommender --- tools/recommend.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tools/recommend.py b/tools/recommend.py index 10c475c6..7564894f 100644 --- a/tools/recommend.py +++ b/tools/recommend.py @@ -12,17 +12,16 @@ import implicit from hypy_utils.logging_utils import setup_logger BASE_URL = "https://aquadx.net/aqua/api/v2/game" -GAME = "mai2" BOT_SECRET = "hunter2" log = setup_logger() -if __name__ == '__main__': +def main(game: str): # Load the CSV data log.info("Loading data...") # data = pd.read_csv("data.csv") - resp = requests.get(f"{BASE_URL}/{GAME}/recommender-fetch", params={"botSecret": BOT_SECRET}) + resp = requests.get(f"{BASE_URL}/{game}/recommender-fetch", params={"botSecret": BOT_SECRET}) assert resp.status_code == 200, f"Failed to fetch data: {resp.status_code} {resp.text}" data = pd.read_csv(StringIO(resp.text)) @@ -48,4 +47,13 @@ if __name__ == '__main__': # Save recommendations to a file log.info("Saving recommendations...") # Path("recommendations.json").write_text(json.dumps(recommendations)) - resp = requests.post(f"{BASE_URL}/{GAME}/recommender-update", params={"botSecret": BOT_SECRET}, json=recommendations) + resp = requests.post(f"{BASE_URL}/{game}/recommender-update", params={"botSecret": BOT_SECRET}, json=recommendations) + if resp.status_code != 200: + log.error(f"Failed to update recommendations: {resp.status_code} {resp.text}") + + log.info("Done!") + + +if __name__ == '__main__': + main("mai2") + main("chu3") From d983d7a5f515992df95047dd2b3ac3e7efbd646f Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 9 Mar 2025 10:27:15 -0400 Subject: [PATCH 08/20] [+] Verse: Return recommended music --- .../icu/samnyan/aqua/sega/chusan/ChusanController.kt | 2 ++ .../icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanController.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanController.kt index 15cf24ff..03444005 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanController.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanController.kt @@ -2,6 +2,7 @@ package icu.samnyan.aqua.sega.chusan import ext.* import icu.samnyan.aqua.net.db.AquaUserServices +import icu.samnyan.aqua.net.games.chu3.Chusan import icu.samnyan.aqua.net.utils.simpleDescribe import icu.samnyan.aqua.sega.allnet.TokenChecker import icu.samnyan.aqua.sega.chusan.handler.chusanInit @@ -31,6 +32,7 @@ class ChusanController( val versionHelper: ChusanVersionHelper, val props: ChusanProps, val pop: GameMusicPopularity, + val chusan: Chusan ): MeowApi({ api, resp -> if (resp is String) resp else (if ("CM" in api) cmMapper else mapper).write(resp) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt index cf8bb351..69915d36 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt @@ -55,8 +55,13 @@ fun ChusanController.chusanInit() { } "GetUserRecMusic".paged("userRecMusicList") { - // musicId: int, recMusicList: string??? - empty + // musicId: int, recMusicList: string + +// listOf( +// mapOf("musicId" to "2630", "recMusicList" to "2387,1"), +// ) + val list = (chusan.recommendedMusic[uid] ?: empty) + list.map { mapOf("musicId" to it, "recMusicList" to "$it,1") } } "GetUserRecRating".paged("userRecRatingList") { From 47a508e8a9b9735cebdac68ce542848f414808cd Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 9 Mar 2025 10:54:46 -0400 Subject: [PATCH 09/20] [F] Verse: Fix id mismatch in recommend music --- .../icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt index 69915d36..d3924a62 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt @@ -56,11 +56,8 @@ fun ChusanController.chusanInit() { "GetUserRecMusic".paged("userRecMusicList") { // musicId: int, recMusicList: string - -// listOf( -// mapOf("musicId" to "2630", "recMusicList" to "2387,1"), -// ) - val list = (chusan.recommendedMusic[uid] ?: empty) + val u = db.userData.findByCard_ExtId(uid)() ?: return@paged empty + val list = (chusan.recommendedMusic[u.id] ?: empty) list.map { mapOf("musicId" to it, "recMusicList" to "$it,1") } } From e1d33691b48e1d453638c8c00b591b02f278f34b Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 9 Mar 2025 10:57:49 -0400 Subject: [PATCH 10/20] [+] Verse: Model inference progress bar --- tools/recommend.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/recommend.py b/tools/recommend.py index 7564894f..ef487ef2 100644 --- a/tools/recommend.py +++ b/tools/recommend.py @@ -10,6 +10,7 @@ import requests import scipy.sparse as sp import implicit from hypy_utils.logging_utils import setup_logger +from tqdm import tqdm BASE_URL = "https://aquadx.net/aqua/api/v2/game" BOT_SECRET = "hunter2" @@ -40,7 +41,7 @@ def main(game: str): # Generate recommendations for each user log.info("Generating recommendations...") recommendations = {} - for user_id in range(user_item_matrix.shape[0]): # Loop over all users + for user_id in tqdm(list(range(user_item_matrix.shape[0]))): # Loop over all users rec, prob = model.recommend(user_id, user_item_matrix[user_id], N=20) recommendations[user_id] = [int(item) for item in rec] From 6bdfab6cba8ff6564394d583eabad666059caaf7 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 9 Mar 2025 11:25:24 -0400 Subject: [PATCH 11/20] [F] Verse: FIx recommendation return format --- .../java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt index d3924a62..e236871b 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt @@ -56,9 +56,10 @@ fun ChusanController.chusanInit() { "GetUserRecMusic".paged("userRecMusicList") { // musicId: int, recMusicList: string + // musicId cannot be the same with the id in recMusicList val u = db.userData.findByCard_ExtId(uid)() ?: return@paged empty - val list = (chusan.recommendedMusic[u.id] ?: empty) - list.map { mapOf("musicId" to it, "recMusicList" to "$it,1") } + val list = (chusan.recommendedMusic[u.id] ?: ls()).filter { it != 1 } + ls(mapOf("musicId" to 1, "recMusicList" to list.joinToString(";") { "$it,1" })) } "GetUserRecRating".paged("userRecRatingList") { From 44f62e8f544b5bc0a09a1f3a19f6b7fc9a684cfc Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 9 Mar 2025 11:36:37 -0400 Subject: [PATCH 12/20] [F] Verse: Fix list empty case --- .../java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt index e236871b..1669e3a1 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt @@ -59,7 +59,9 @@ fun ChusanController.chusanInit() { // musicId cannot be the same with the id in recMusicList val u = db.userData.findByCard_ExtId(uid)() ?: return@paged empty val list = (chusan.recommendedMusic[u.id] ?: ls()).filter { it != 1 } - ls(mapOf("musicId" to 1, "recMusicList" to list.joinToString(";") { "$it,1" })) + + if (list.isEmpty()) empty + else ls(mapOf("musicId" to 1, "recMusicList" to list.joinToString(";") { "$it,1" })) } "GetUserRecRating".paged("userRecRatingList") { From 5816f5dffbef94591eaf76d55b3f673ef16d6e0c Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 9 Mar 2025 11:37:14 -0400 Subject: [PATCH 13/20] [-] Verse: Give up on rec rating --- .../icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt index 1669e3a1..73f4e354 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt @@ -59,13 +59,17 @@ fun ChusanController.chusanInit() { // musicId cannot be the same with the id in recMusicList val u = db.userData.findByCard_ExtId(uid)() ?: return@paged empty val list = (chusan.recommendedMusic[u.id] ?: ls()).filter { it != 1 } - + if (list.isEmpty()) empty else ls(mapOf("musicId" to 1, "recMusicList" to list.joinToString(";") { "$it,1" })) } "GetUserRecRating".paged("userRecRatingList") { - // ratingMin: int, ratingMax: int, recMusicList: string??? + // ratingMin: int, ratingMax: int, recMusicList: string + // This doesn't work +// listOf( +// mapOf("ratingMin" to 0, "ratingMax" to 30, "recMusicList" to "2387,1;2658,1") +// ) empty } // VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE VERSE From 9d8a3c51327fd3debe56e4ed38276b52c9facbc8 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Mon, 10 Mar 2025 02:41:30 -0400 Subject: [PATCH 14/20] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 3cccfdbb..4064094b 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Below is a list of games supported by this server. | Game | Ver | Codename | Thanks to | |------------------------|------|---------------------|--------------------------------------------| -| SDHD: CHUNITHM | 2.30 | VERSE¹ | [@rinsama](https://github.com/mxihan) | +| SDHD: CHUNITHM | 2.30 | VERSE | [@rinsama](https://github.com/mxihan) | | SDEZ: MaiMai DX | 1.50 | PRiSM | [@肥宅虾哥](https://github.com/FeiZhaixiage) | | SDGA: MaiMai DX (Intl) | 1.50 | PRiSM | [@Clansty](https://github.com/clansty) | | SDED: Card Maker | 1.39 | | [@Becods](https://github.com/Becods) | @@ -41,8 +41,6 @@ Below is a list of games supported by this server. | SBZV: Project DIVA | 7.10 | Future Tone | | | SDFE: Wacca (*ALPHA) | 3.07 | Reverse | | -* ¹: For VERSE, normal gameplay works, but events and new features might be missing. Luminous+ and older are fully supported. - Check out these docs for more information. * [Game specific notes](docs/game_specific_notes.md) * [Frequently asked questions](docs/frequently_asked_questions.md) From c2cd281efef65af514532769bdffb73b5a3abb2b Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Tue, 11 Mar 2025 01:51:22 -0400 Subject: [PATCH 15/20] [U] Automatic deploy docker every week --- .github/workflows/docker-image.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index ea81abf6..291a4fbb 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -6,6 +6,8 @@ on: branches: - main workflow_dispatch: + schedule: + - cron: '0 0 * * 0' # Runs at midnight UTC every Sunday jobs: build-and-push: From 0c891218b20279cf34ada217cc2b3debf6423e23 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Tue, 11 Mar 2025 08:03:10 -0400 Subject: [PATCH 16/20] [+] new rating list --- src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt b/src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt index c5889a11..7a7d8c0d 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt @@ -52,6 +52,7 @@ class Chusan( "best30" to (extra["rating_base_list"] ?: ""), "hot10" to (extra["rating_hot_list"] ?: ""), "next10" to (extra["rating_next_list"] ?: ""), + "new" to (extra["rating_new_list"] ?: ""), ) genericUserSummary(card, ratingComposition) From 1dcaddb4c4136557127a9ea38f3516da70edc1f9 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Tue, 11 Mar 2025 08:15:19 -0400 Subject: [PATCH 17/20] [+] New20 --- AquaNet/src/pages/UserHome.svelte | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/AquaNet/src/pages/UserHome.svelte b/AquaNet/src/pages/UserHome.svelte index 455b36e3..e8b9b645 100644 --- a/AquaNet/src/pages/UserHome.svelte +++ b/AquaNet/src/pages/UserHome.svelte @@ -318,7 +318,13 @@ - + + {#if d.user.ratingComposition.new} + + {:else} + + {/if} +

{t('UserHome.RecentScores')}

From 5bf017395c46f844d17378e4934cda478503b978 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Tue, 11 Mar 2025 23:33:23 -0400 Subject: [PATCH 18/20] [+] Return the trophy sub 1 2 for userbox --- src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt b/src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt index 7a7d8c0d..7cbbfa30 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt @@ -29,6 +29,8 @@ class Chusan( "nameplateId" to { u, v -> u.nameplateId = v.int }, "frameId" to { u, v -> u.frameId = v.int }, "trophyId" to { u, v -> u.trophyId = v.int }, + "trophyIdSub1" to { u, v -> u.trophyIdSub1 = v.int }, + "trophyIdSub2" to { u, v -> u.trophyIdSub2 = v.int }, "mapIconId" to { u, v -> u.mapIconId = v.int }, "voiceId" to { u, v -> u.voiceId = v.int }, "avatarWear" to { u, v -> u.avatarWear = v.int }, From 9b8a76349f8532762248e3d817437cbd2ec849c2 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Wed, 12 Mar 2025 01:29:01 -0400 Subject: [PATCH 19/20] [U] Update FAQ --- docs/chu3-national-matching.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/chu3-national-matching.md b/docs/chu3-national-matching.md index c766900c..2799064a 100644 --- a/docs/chu3-national-matching.md +++ b/docs/chu3-national-matching.md @@ -45,6 +45,10 @@ netsh advfirewall firewall add rule name="Chunithm National Matching Outbound" d ## Troubleshooting +**Q: Me and my friend are queuing but we can't join the same room** + +Make sure you both have the same ROM and options (e.g. it would not work if you have luminuous and they have verse, or if you have A121 while they don't). + **Q: Matching server BAD on network check** Make sure you have selected "Yukiotoko" as your matching server. From e54619da46776db993750cf70348885d1aab7f24 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Wed, 12 Mar 2025 01:32:38 -0400 Subject: [PATCH 20/20] [U] Update doc --- docs/chu3-national-matching.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/chu3-national-matching.md b/docs/chu3-national-matching.md index 2799064a..ddf23a4f 100644 --- a/docs/chu3-national-matching.md +++ b/docs/chu3-national-matching.md @@ -49,6 +49,9 @@ netsh advfirewall firewall add rule name="Chunithm National Matching Outbound" d Make sure you both have the same ROM and options (e.g. it would not work if you have luminuous and they have verse, or if you have A121 while they don't). +> [!NOTE] +> If you just updated your options, your matching will be disabled because of data version mismatch. You need to play for a session, save, and then restart your game for the server-side data version to update. + **Q: Matching server BAD on network check** Make sure you have selected "Yukiotoko" as your matching server.