From d8022cc1a43a66bb371a6962e3a66d927122579a Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Thu, 2 Jan 2025 07:12:46 -0500 Subject: [PATCH 01/67] [F] Fix userbox file logic #97 --- AquaNet/src/libs/userbox/userbox.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/AquaNet/src/libs/userbox/userbox.ts b/AquaNet/src/libs/userbox/userbox.ts index 2b3e7343..d46a76ef 100644 --- a/AquaNet/src/libs/userbox/userbox.ts +++ b/AquaNet/src/libs/userbox/userbox.ts @@ -25,7 +25,7 @@ const validateDirectories = async (base: FileSystemDirectoryEntry, path: string) let newDirectory = await getDirectory(directory, part).catch(_ => null); if (newDirectory && isDirectory(newDirectory)) { directory = newDirectory; - } else + } else return false; }; return true @@ -38,7 +38,7 @@ const getDirectoryFromPath = async (base: FileSystemDirectoryEntry, path: string let newDirectory = await getDirectory(directory, part).catch(_ => null); if (newDirectory && isDirectory(newDirectory)) { directory = newDirectory; - } else + } else return null; }; return directory; @@ -81,7 +81,7 @@ const DIRECTORY_PATHS = ([ processName: "Surfboard Textures", useFileName: true, path: "surfboard", - filter: (name: string) => + filter: (name: string) => ([ "CHU_UI_Common_Avatar_body_00.dds", "CHU_UI_Common_Avatar_face_00.dds", @@ -134,7 +134,7 @@ export const scanOptionFolder = async (optionFolder: FileSystemDirectoryEntry, p let objectStore = transaction.objectStore('dds'); for (let object of data) objectStore.put(object) - + // await transaction completion await new Promise(r => transaction.addEventListener("complete", r, {once: true})) }; @@ -163,7 +163,7 @@ export function initializeDb() : Promise { export async function userboxFileProcess(folder: FileSystemEntry, progressUpdate: (progress: number, progressString: string) => void): Promise { if (!isDirectory(folder)) return t("userbox.new.error.invalidFolder") - if (!(await validateDirectories(folder, "bin/option")) || !(await validateDirectories(folder, "data/A000"))) + if (!(await validateDirectories(folder, "bin/option")) && !(await validateDirectories(folder, "data/A000"))) return t("userbox.new.error.invalidFolder"); initializeDb(); @@ -177,4 +177,4 @@ export async function userboxFileProcess(folder: FileSystemEntry, progressUpdate location.reload(); return null -} \ No newline at end of file +} From a1b56f6e0b2c5b764e95f5bb034e8817a524c3ff Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Thu, 2 Jan 2025 07:13:06 -0500 Subject: [PATCH 02/67] [O] Do not log GetUserPortraitApi --- .../icu/samnyan/aqua/sega/maimai2/Maimai2ServletController.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2ServletController.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2ServletController.kt index 030d1c69..22e9d5f1 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2ServletController.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2ServletController.kt @@ -363,7 +363,7 @@ class Maimai2ServletController( return try { Metrics.timer("aquadx_maimai2_api_latency", "api" to api).recordCallable { handlers[api]!!.handle(request).let { if (it is String) it else it.toJson() }.also { - if (api !in setOf("GetUserItemApi", "GetGameEventApi")) + if (api !in setOf("GetUserItemApi", "GetGameEventApi", "GetUserPortraitApi")) logger.info("Mai2 > $api : $it") } } From d71af941b0e52b5481b27029acdc836e1ea40a6e Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Thu, 2 Jan 2025 10:44:06 -0500 Subject: [PATCH 03/67] [+] Add some get-only fields --- src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt | 4 +++- src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt b/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt index 59152ba2..fae5e98e 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt @@ -24,6 +24,7 @@ abstract class GameApiController(val name: String, userDataClass: abstract val playlogRepo: GenericPlaylogRepo<*> abstract val shownRanks: List> abstract val settableFields: Map Unit> + open val gettableFields: Set = setOf() @API("trend") abstract suspend fun trend(@RP username: String): List @@ -110,7 +111,8 @@ abstract class GameApiController(val name: String, userDataClass: fun playlog(@RP id: Long): IGenericGamePlaylog = playlogRepo.findById(id).getOrNull() ?: (404 - "Playlog not found") val userDetailFields by lazy { userDataClass.gettersMap().let { vm -> - settableFields.map { (k, _) -> k to (vm[k] ?: error("Field $k not found")) }.toMap() + (settableFields.keys.toSet() + gettableFields) + .associateWith { k -> (vm[k] ?: error("Field $k not found")) } } } @API("user-detail") 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 a72fc24c..7f84e917 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 @@ -38,6 +38,7 @@ class Chusan( "avatarFront" to { u, v -> u.avatarFront = v.int }, "avatarBack" to { u, v -> u.avatarBack = v.int }, ) } + override val gettableFields: Set = setOf("level", "playerRating") override suspend fun userSummary(@RP username: Str, @RP token: String?) = us.cardByName(username) { card -> // Summary values: total plays, player rating, server-wide ranking From a1be699ec537fc8471095d41f447b71f8b701737 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Thu, 2 Jan 2025 10:51:45 -0500 Subject: [PATCH 04/67] [+] characterId --- src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7f84e917..6c17864e 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 @@ -38,7 +38,7 @@ class Chusan( "avatarFront" to { u, v -> u.avatarFront = v.int }, "avatarBack" to { u, v -> u.avatarBack = v.int }, ) } - override val gettableFields: Set = setOf("level", "playerRating") + override val gettableFields: Set = setOf("level", "playerRating", "characterId") override suspend fun userSummary(@RP username: Str, @RP token: String?) = us.cardByName(username) { card -> // Summary values: total plays, player rating, server-wide ranking From 256aac8faf2e70d1914f5fb1ae615da08dfe75b8 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 3 Jan 2025 01:45:42 -0500 Subject: [PATCH 05/67] [+] Add error logging --- src/main/java/ext/Ext.kt | 15 ++++++++++++++ .../sega/general/filter/CompressionFilter.kt | 20 ++++++++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/java/ext/Ext.kt b/src/main/java/ext/Ext.kt index 9671ac8b..69c97184 100644 --- a/src/main/java/ext/Ext.kt +++ b/src/main/java/ext/Ext.kt @@ -6,6 +6,8 @@ import io.ktor.client.engine.cio.* import io.ktor.client.plugins.contentnegotiation.* import io.ktor.serialization.kotlinx.json.* import jakarta.persistence.Query +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.apache.tika.Tika @@ -44,6 +46,19 @@ typealias JavaSerializable = java.io.Serializable typealias JDict = Map typealias MutJDict = MutableMap +fun HttpServletRequest.details() = mapOf( + "method" to method, + "uri" to requestURI, + "query" to queryString, + "remote" to remoteAddr, + "headers" to headerNames.asSequence().associateWith { getHeader(it) } +) + +fun HttpServletResponse.details() = mapOf( + "status" to status, + "headers" to headerNames.asSequence().associateWith { getHeader(it) }, +) + @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.PROPERTY_GETTER) @Retention(AnnotationRetention.RUNTIME) annotation class Doc( diff --git a/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.kt b/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.kt index 4bae4d60..b71967e8 100644 --- a/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.kt +++ b/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.kt @@ -1,6 +1,8 @@ package icu.samnyan.aqua.sega.general.filter +import ext.details import ext.logger +import ext.toJson import icu.samnyan.aqua.sega.util.ZLib import jakarta.servlet.FilterChain import jakarta.servlet.http.HttpServletRequest @@ -35,9 +37,21 @@ class CompressionFilter : OncePerRequestFilter() { } // Handle request - val result = ContentCachingResponseWrapper(resp).run { - chain.doFilter(CompressRequestWrapper(req, reqSrc), this) - ZLib.compress(contentAsByteArray).let { if (isDfi) b64e.encode(it) else it } + val respW = ContentCachingResponseWrapper(resp) + val result = try { + chain.doFilter(CompressRequestWrapper(req, reqSrc), respW) + ZLib.compress(respW.contentAsByteArray).let { if (isDfi) b64e.encode(it) else it } + } finally { + if (respW.status != 200) { + val details = mapOf( + "req" to req.details(), + "resp" to respW.details(), + "body" to reqSrc.toString(Charsets.UTF_8), + "result" to respW.contentAsByteArray.toString(Charsets.UTF_8) + ).toJson() + + log.error("HTTP ${respW.status}: $details") + } } // Write response From f6489d5ac08072276b921041f17bbbb4439709c5 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 3 Jan 2025 02:19:11 -0500 Subject: [PATCH 06/67] [+] Add token to logging --- .../icu/samnyan/aqua/sega/general/filter/CompressionFilter.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.kt b/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.kt index b71967e8..fd39d901 100644 --- a/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.kt +++ b/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.kt @@ -3,6 +3,7 @@ package icu.samnyan.aqua.sega.general.filter import ext.details import ext.logger import ext.toJson +import icu.samnyan.aqua.sega.allnet.TokenChecker import icu.samnyan.aqua.sega.util.ZLib import jakarta.servlet.FilterChain import jakarta.servlet.http.HttpServletRequest @@ -47,7 +48,8 @@ class CompressionFilter : OncePerRequestFilter() { "req" to req.details(), "resp" to respW.details(), "body" to reqSrc.toString(Charsets.UTF_8), - "result" to respW.contentAsByteArray.toString(Charsets.UTF_8) + "result" to respW.contentAsByteArray.toString(Charsets.UTF_8), + "token" to TokenChecker.getCurrentSession()?.token ).toJson() log.error("HTTP ${respW.status}: $details") From 21e023e6093ee0e6c53e1f74ef125c16e2564c92 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 3 Jan 2025 03:09:53 -0500 Subject: [PATCH 07/67] Revert "[U] Upgrade dependencies" This reverts commit 332eacd2cc25be927ceccef9dac45295a9e762c3. --- build.gradle.kts | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index f9a0b612..9abbc98a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,8 +13,8 @@ plugins { kotlin("plugin.jpa") version ktVer kotlin("plugin.serialization") version ktVer kotlin("plugin.allopen") version ktVer - id("io.freefair.lombok") version "8.11" - id("org.springframework.boot") version "3.4.1" + id("io.freefair.lombok") version "8.6" + id("org.springframework.boot") version "3.2.3" id("com.github.ben-manes.versions") version "0.51.0" id("org.hibernate.orm") version "6.4.4.Final" application @@ -38,13 +38,13 @@ dependencies { implementation("io.netty:netty-all") implementation("org.apache.commons:commons-lang3:3.14.0") implementation("org.apache.httpcomponents.client5:httpclient5") - implementation("org.flywaydb:flyway-core:11.1.0") - implementation("org.flywaydb:flyway-mysql:11.1.0") + implementation("org.flywaydb:flyway-core:10.10.0") + implementation("org.flywaydb:flyway-mysql:10.10.0") testImplementation("org.springframework.boot:spring-boot-starter-test") { exclude(group = "org.junit.vintage", module = "junit-vintage-engine") } testImplementation("org.springframework.security:spring-security-test") - implementation("net.logstash.logback:logstash-logback-encoder:8.0") + implementation("net.logstash.logback:logstash-logback-encoder:7.4") // Metrics implementation("org.springframework.boot:spring-boot-starter-actuator") @@ -64,11 +64,11 @@ dependencies { // ============================= // Network - implementation("io.ktor:ktor-client-core:2.3.13") - implementation("io.ktor:ktor-client-cio:2.3.13") - implementation("io.ktor:ktor-client-content-negotiation:2.3.13") - implementation("io.ktor:ktor-client-encoding:2.3.13") - implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.13") + implementation("io.ktor:ktor-client-core:2.3.8") + implementation("io.ktor:ktor-client-cio:2.3.8") + implementation("io.ktor:ktor-client-content-negotiation:2.3.8") + implementation("io.ktor:ktor-client-encoding:2.3.8") + implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.8") implementation("org.jetbrains.kotlin:kotlin-reflect") // Somehow these are needed for ktor even though they're not in the documentation @@ -76,16 +76,16 @@ dependencies { runtimeOnly("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.8.0") // Email - implementation("org.simplejavamail:simple-java-mail:8.12.4") - implementation("org.simplejavamail:spring-module:8.12.4") + implementation("org.simplejavamail:simple-java-mail:8.6.3") + implementation("org.simplejavamail:spring-module:8.6.3") // GeoIP - implementation("com.maxmind.geoip2:geoip2:4.2.1") + implementation("com.maxmind.geoip2:geoip2:4.2.0") // JWT Authentication - implementation("io.jsonwebtoken:jjwt-api:0.12.6") - runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.6") - runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.6") + implementation("io.jsonwebtoken:jjwt-api:0.12.5") + runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.5") + runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.5") // Content validation implementation("org.apache.tika:tika-core:2.9.1") @@ -94,8 +94,7 @@ dependencies { implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.0") // Serialization - // DO NOT UPDATE THIS TO >2.18.0: https://github.com/FasterXML/jackson-module-kotlin/issues/874 - implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.17.3") + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") // Testing testImplementation("io.kotest:kotest-runner-junit5-jvm:5.8.1") From 2edad4efdb76edd1ebf74493e10f4d78b987a335 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 3 Jan 2025 10:17:21 -0500 Subject: [PATCH 08/67] [F] Fix rank --- AquaNet/src/pages/UserHome.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AquaNet/src/pages/UserHome.svelte b/AquaNet/src/pages/UserHome.svelte index ab506021..26bada40 100644 --- a/AquaNet/src/pages/UserHome.svelte +++ b/AquaNet/src/pages/UserHome.svelte @@ -148,7 +148,7 @@
{t('UserHome.ServerRank')} - #{+d.user.serverRank.toLocaleString() + 1} + #{(d.user.serverRank + 1).toLocaleString()}
From 4ded3d9752e0d0bc064887f034bf9267243bad95 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 3 Jan 2025 16:10:01 -0500 Subject: [PATCH 09/67] [+] TODO --- docs/chu3-national-matching.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 docs/chu3-national-matching.md diff --git a/docs/chu3-national-matching.md b/docs/chu3-national-matching.md new file mode 100644 index 00000000..c74fce09 --- /dev/null +++ b/docs/chu3-national-matching.md @@ -0,0 +1,4 @@ +# Chunithm National Matching Guide + +TODO + From 54bed879a50658eeafc9e54d4966c5c5152018af Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 3 Jan 2025 16:30:06 -0500 Subject: [PATCH 10/67] [+] Matching server options --- AquaNet/src/libs/config.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/AquaNet/src/libs/config.ts b/AquaNet/src/libs/config.ts index 8162b443..a39d9f30 100644 --- a/AquaNet/src/libs/config.ts +++ b/AquaNet/src/libs/config.ts @@ -17,3 +17,25 @@ export const DEFAULT_PFP = '/assets/imgs/no_profile.png' // USERBOX_ASSETS export const HAS_USERBOX_ASSETS = true + +// Meow meow meow + +// Matching servers +export const CHU3_MATCHINGS = [ + { + name: "林国对战", + ui: "https://chu3-match.sega.ink/rooms", + guide: "https://performai.evilleaker.com/manual/games/chunithm/national_battle/", + matching: "https://chu3-match.sega.ink/", + reflector: "http://reflector.naominet.live:18080/", + coop: ["RinNET", "MysteriaNET"], + }, + { + name: "Yukiotoko", + ui: "https://yukiotoko.metatable.sh/", + guide: "https://github.com/MewoLab/AquaDX/blob/v1-dev/docs/chu3-national-matching.md", + matching: "http://yukiotoko.chara.lol:9004/", + reflector: "http://yukiotoko.chara.lol:50201/", + coop: ["Missless"] + } +] From bfb269b378e1779809186e5796c967fa893cde98 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 3 Jan 2025 16:31:25 -0500 Subject: [PATCH 11/67] [+] option i18n --- AquaNet/src/libs/i18n/en_ref.ts | 14 ++++++++++++-- AquaNet/src/libs/i18n/zh.ts | 12 +++++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/AquaNet/src/libs/i18n/en_ref.ts b/AquaNet/src/libs/i18n/en_ref.ts index 40a07673..5e79e482 100644 --- a/AquaNet/src/libs/i18n/en_ref.ts +++ b/AquaNet/src/libs/i18n/en_ref.ts @@ -138,10 +138,14 @@ export const EN_REF_SETTINGS = { 'settings.fields.waccaInfiniteWp.desc': 'Set WP to 999999', 'settings.fields.waccaAlwaysVip.name': 'Wacca: Always VIP', 'settings.fields.waccaAlwaysVip.desc': 'Set VIP expiration date to 2077-01-01', - 'settings.fields.chusanTeamName.name': 'Chuni: Team Name', + 'settings.fields.chusanTeamName.name': 'Team Name', 'settings.fields.chusanTeamName.desc': 'Customize the text displayed on the top of your profile.', - 'settings.fields.chusanInfinitePenguins.name': 'Chuni: Infinite Penguins', + 'settings.fields.chusanInfinitePenguins.name': 'Infinite Penguins', 'settings.fields.chusanInfinitePenguins.desc': 'Set penguin statues for character level prompting to 999.', + 'settings.fields.chusanMatchingReflector.name': 'Matching Server Reflector', + 'settings.fields.chusanMatchingReflector.desc': 'URL of the national matching server\'s UDP reflector.', + 'settings.fields.chusanMatchingServer.name': 'Matching Server', + 'settings.fields.chusanMatchingServer.desc': 'URL of the national matching server.', 'settings.fields.rounding.name': 'Score Rounding', 'settings.fields.rounding.desc': 'Round the score to one decimal place', 'settings.fields.optOutOfLeaderboard.name': 'Opt Out of Leaderboard', @@ -158,10 +162,12 @@ export const EN_REF_SETTINGS = { 'settings.profile.unset': 'Unset', 'settings.profile.unchanged': 'Unchanged', 'settings.export': 'Export Player Data', + 'settings.cabNotice': "Note: These settings will only affect your own cab/setup. If you're playing on someone else's setup, please contact them to change these settings." } export const EN_REF_USERBOX = { 'userbox.header.general': 'General Settings', + 'userbox.header.matching': 'National Matching', 'userbox.header.userbox': 'UserBox Settings', 'userbox.header.preview': 'UserBox Preview', 'userbox.nameplateId': 'Nameplate', @@ -180,6 +186,10 @@ export const EN_REF_USERBOX = { 'userbox.preview.url': 'Image URL', 'userbox.error.nodata': 'Chuni data not found', + 'userbox.matching.select': 'Select Matching Server', + 'userbox.matching.option.ui': 'Rooms', + 'userbox.matching.option.guide': 'Guide', + 'userbox.new.name': 'AquaBox', 'userbox.new.setup': 'Drag and drop your Chuni game folder (Lumi or newer) into the box below to display UserBoxes with their nameplate & avatar. All files are handled in-browser.', 'userbox.new.setup.processing_file': 'Processing', diff --git a/AquaNet/src/libs/i18n/zh.ts b/AquaNet/src/libs/i18n/zh.ts index 8eaae91e..095d65fe 100644 --- a/AquaNet/src/libs/i18n/zh.ts +++ b/AquaNet/src/libs/i18n/zh.ts @@ -148,10 +148,14 @@ const zhSettings: typeof EN_REF_SETTINGS = { 'settings.fields.waccaInfiniteWp.desc': '将 WP 设置为 999999', 'settings.fields.waccaAlwaysVip.name': 'Wacca: 永久会员', 'settings.fields.waccaAlwaysVip.desc': '将 VIP 到期时间设置为 2077-01-01', - 'settings.fields.chusanTeamName.name': '中二: 队伍名称', + 'settings.fields.chusanTeamName.name': '队伍名称', 'settings.fields.chusanTeamName.desc': '自定义显示在个人资料顶部的文本。', - 'settings.fields.chusanInfinitePenguins.name': '中二: 无限企鹅', + 'settings.fields.chusanInfinitePenguins.name': '我是桐谷遥', 'settings.fields.chusanInfinitePenguins.desc': '将角色界限突破的企鹅雕像数量设置为 999。', + 'settings.fields.chusanMatchingReflector.name': '全国对战 Reflector', + 'settings.fields.chusanMatchingReflector.desc': '全国对战服务器的 UDP 反射服务器的 URL', + 'settings.fields.chusanMatchingServer.name': '全国对战服务器', + 'settings.fields.chusanMatchingServer.desc': '全国对战服务器的 URL', 'settings.fields.rounding.name': '分数舍入', 'settings.fields.rounding.desc': '把分数四舍五入到一位小数', 'settings.fields.optOutOfLeaderboard.name': '不参与排行榜', @@ -168,10 +172,12 @@ const zhSettings: typeof EN_REF_SETTINGS = { 'settings.profile.unset': '未设置', 'settings.profile.unchanged': '未更改', 'settings.export': '导出玩家数据', + 'settings.cabNotice': '注意:下面这些设置只会影响你自己的机器,如果你是在其他人的机器上玩的话,请联系机主来改设置' } export const zhUserbox: typeof EN_REF_USERBOX = { 'userbox.header.general': '游戏设置', + 'userbox.header.matching': '全国对战', 'userbox.header.userbox': 'UserBox 设置', 'userbox.header.preview': 'UserBox 预览', 'userbox.nameplateId': '名牌', @@ -189,7 +195,7 @@ export const zhUserbox: typeof EN_REF_USERBOX = { 'userbox.preview.notice': '「生存战略」:为了尊重版权,我们不会提供游戏内物品的图片。但是如果你认识其他愿意提供图床的人,在这里输入 URL 就可以显示出预览。', 'userbox.preview.url': '图床 URL', 'userbox.error.nodata': '未找到中二数据', - + 'userbox.new.name': 'AquaBox', 'userbox.new.setup': '将 Chuni(Lumi 或更高版本)的游戏文件夹拖放到下方区域,以显示带有名牌和头像的 UserBox。所有文件都在浏览器中处理。', 'userbox.new.setup.processing_file': '正在处理文件', From 256b48a0add71153fb05833c6957048e84850b45 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 3 Jan 2025 16:31:42 -0500 Subject: [PATCH 12/67] [+] Matching server in game option table --- src/main/java/icu/samnyan/aqua/net/db/AquaGameOptions.kt | 6 ++++++ .../db/migration/mariadb/V1000_26__chusan_matching.sql | 2 ++ 2 files changed, 8 insertions(+) create mode 100644 src/main/resources/db/migration/mariadb/V1000_26__chusan_matching.sql diff --git a/src/main/java/icu/samnyan/aqua/net/db/AquaGameOptions.kt b/src/main/java/icu/samnyan/aqua/net/db/AquaGameOptions.kt index 4dae0883..7e7022e1 100644 --- a/src/main/java/icu/samnyan/aqua/net/db/AquaGameOptions.kt +++ b/src/main/java/icu/samnyan/aqua/net/db/AquaGameOptions.kt @@ -37,6 +37,12 @@ class AquaGameOptions( @SettingField("chu3") var chusanInfinitePenguins: Boolean = false, + + @SettingField("chu3-matching") + var chusanMatchingServer: String = "", + + @SettingField("chu3-matching") + var chusanMatchingReflector: String = "", ) interface AquaGameOptionsRepo : JpaRepository diff --git a/src/main/resources/db/migration/mariadb/V1000_26__chusan_matching.sql b/src/main/resources/db/migration/mariadb/V1000_26__chusan_matching.sql new file mode 100644 index 00000000..4e872945 --- /dev/null +++ b/src/main/resources/db/migration/mariadb/V1000_26__chusan_matching.sql @@ -0,0 +1,2 @@ +ALTER TABLE aqua_game_options ADD chusan_matching_server VARCHAR(200) NULL; +ALTER TABLE aqua_game_options ADD chusan_matching_reflector VARCHAR(200) NULL; From d5a1a26091ae12ffd106639ee84ccef68fad814f Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 3 Jan 2025 16:31:58 -0500 Subject: [PATCH 13/67] [+] Return matching api --- .../samnyan/aqua/sega/chusan/ChusanApis.kt | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanApis.kt index a5541874..c9b6bb95 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanApis.kt @@ -1,6 +1,7 @@ package icu.samnyan.aqua.sega.chusan import ext.* +import icu.samnyan.aqua.sega.allnet.TokenChecker import icu.samnyan.aqua.sega.chusan.model.request.UserCMissionResp import icu.samnyan.aqua.sega.chusan.model.response.data.UserEmoney import icu.samnyan.aqua.sega.chusan.model.userdata.UserCharge @@ -193,19 +194,16 @@ fun ChusanController.chusanInit() { // Special thanks to skogaby // Hardcode so that the reboot time always started 3 hours ago and ended 2 hours ago val fmt = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss") - - // Get the request url as te address - val addr = (req.getHeader("wrapper original url") ?: req.requestURL.toString()) - .removeSuffix("GetGameSettingApi").removeSuffix("ChuniServlet/") val now = jstNow() - val matching = if (!props.externalMatching.isNullOrBlank() && !props.proxiedMatching) mapOf( - "matchingUri" to props.externalMatching, - "matchingUriX" to props.externalMatching, - ) else mapOf( - "matchingUri" to addr, - "matchingUriX" to addr - ) + // Set the matching & reflector to the one set in the game options, or the external matching server + val opts = TokenChecker.getCurrentSession()?.user?.gameOptions + val matching = opts?.chusanMatchingServer?.ifBlank { null } ?: + props.externalMatching?.ifBlank { null } ?: + (req.getHeader("wrapper original url") ?: req.requestURL.toString()) + .removeSuffix("GetGameSettingApi").removeSuffix("ChuniServlet/") + val reflector = opts?.chusanMatchingReflector?.ifBlank { null } ?: + props.reflectorUrl mapOf( "gameSetting" to mapOf( @@ -223,11 +221,11 @@ fun ChusanController.chusanInit() { "matchEndTime" to now.plusHours(7).format(fmt), "matchTimeLimit" to 10, "matchErrorLimit" to 10, - "matchingUri" to addr, - "matchingUriX" to addr, - "udpHolePunchUri" to props.reflectorUrl, - "reflectorUri" to props.reflectorUrl, - ) + matching, + "matchingUri" to matching.ensureEndingSlash(), + "matchingUriX" to matching.ensureEndingSlash(), + "udpHolePunchUri" to reflector?.ensureEndingSlash(), + "reflectorUri" to reflector?.ensureEndingSlash(), + ), "isDumpUpload" to false, "isAou" to false ) From 85b5910ea986caf711ae9898592d870a7e88b5d3 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 3 Jan 2025 16:32:13 -0500 Subject: [PATCH 14/67] [-] Remove proxied matching, not very useful --- .../aqua/sega/chusan/ChusanMatchingApis.kt | 61 ++++--------------- 1 file changed, 13 insertions(+), 48 deletions(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanMatchingApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanMatchingApis.kt index 25b9d4e0..b7ca820b 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanMatchingApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanMatchingApis.kt @@ -2,14 +2,25 @@ package icu.samnyan.aqua.sega.chusan -import ext.* +import ext.JDict +import ext.int +import ext.millis +import ext.parsing import icu.samnyan.aqua.sega.chusan.model.response.data.MatchingWaitState import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3MatchingMemberReq +import kotlin.collections.MutableList +import kotlin.collections.find +import kotlin.collections.indices +import kotlin.collections.listOf +import kotlin.collections.map +import kotlin.collections.mapOf +import kotlin.collections.mutableListOf +import kotlin.collections.mutableMapOf +import kotlin.collections.set fun ChusanController.matchingApiInit() { if (props.externalMatching.isNullOrBlank()) serverOnlyMatching() - else if (props.proxiedMatching) proxyMatching() } /** @@ -56,49 +67,3 @@ fun ChusanController.serverOnlyMatching() { ) } } - -/** - * Matching implementation - */ -fun ChusanController.proxyMatching() { - val ext = props.externalMatching!! - - // ID Cache is used to obfuscate the user ID - val processedCache = mutableSetOf() - val idCache = mutableMapOf() - - fun Chu3MatchingMemberReq.checkFromAquaDX(): Boolean { - if (userId in idCache) return true - if (userId in processedCache) return false - - // Check if this user is from our server - val user = db.userData.findByCard_ExtId(userId)() - if (user == null) { - // User is from another server, check if they have been checked in - if (db.matchingMember.existsByUserIdAndUserName(userId, userName)) { - // Check in - db.matchingMember.save(this) - log.info("[Matching] User $userId ($userName) not found, checking in.") - } - processedCache.add(userId) - } - else { - // Is from our server, obfuscate the user ID to enhance security - val randomId = (0..Int.MAX_VALUE).random().toLong() - idCache[randomId] = userId - userId = randomId - log.info("[Matching] User $userId ($userName) is from our server, obfuscated to $randomId.") - } - return user != null - } - - "BeginMatching" { - val member = parsing { mapper.convert(data["matchingMemberInfo"] as JDict) } - member.checkFromAquaDX() - - // Forward BeginMatching to external server -// val res = - } - - TODO("The external matching API is not implemented yet.") -} From cb0f46c5db7f39979b9c5fc7f0a17b94330c4261 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 3 Jan 2025 16:32:26 -0500 Subject: [PATCH 15/67] [F] Fix logging? --- .../java/icu/samnyan/aqua/sega/chusan/ChusanController.kt | 4 ++-- 1 file changed, 2 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 aab260a3..c5a92404 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanController.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanController.kt @@ -72,6 +72,8 @@ class ChusanController( } if (api.startsWith("CM") && api !in handlers) api = api.removePrefix("CM") + val token = TokenChecker.getCurrentSession()?.token?.substring(0, 6) ?: "NO-TOKEN" + log.info("Chu3 < $api : ${data.toJson()} : [$token]") if (api !in noopEndpoint && !handlers.containsKey(api)) { log.warn("Chu3 > $api not found") @@ -84,8 +86,6 @@ class ChusanController( log.info("Chu3 > $api no-op") return """{"returnCode":"1"}""" } - val token = TokenChecker.getCurrentSession()?.token?.substring(0, 6) ?: "NO-TOKEN" - log.info("Chu3 < $api : ${data.toJson()} : [$token]") return try { Metrics.timer("aquadx_chusan_api_latency", "api" to api).recordCallable { From 80fc8417dcd9ad34e385cbd3441007e7815179cf Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 3 Jan 2025 16:33:03 -0500 Subject: [PATCH 16/67] [-] Remove proxied matching prop --- config/application.properties | 3 --- src/main/java/icu/samnyan/aqua/sega/chusan/ChusanProps.kt | 1 - 2 files changed, 4 deletions(-) diff --git a/config/application.properties b/config/application.properties index 807b8ec1..0340d592 100644 --- a/config/application.properties +++ b/config/application.properties @@ -53,9 +53,6 @@ game.chusan.reflector-url=http://reflector.naominet.live:18080/ ## This sets the matching server url. ## When this is set, we will sync with the external matching url so that we can match with more players. game.chusan.external-matching=https://chu3-match.sega.ink/ -## When this is set to true, we will proxy all matching requests sent to the external matching server. -## This option enhances security by masking the user ID and keychip. -game.chusan.proxied-matching=false ## This enables user use login bonus function if set to true. ## NOTE: THIS IS NOT TESTED, it's implemented by someone very inexperienced and might not work. game.chusan.loginbonus-enable=false diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanProps.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanProps.kt index f4bce972..c94b0786 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanProps.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanProps.kt @@ -10,5 +10,4 @@ class ChusanProps { var loginBonusEnable = false var externalMatching: String? = null var reflectorUrl: String? = null - var proxiedMatching: Boolean = false } \ No newline at end of file From 9489151bc1bc7e96456d86206cd6f667a8cbb704 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 3 Jan 2025 16:33:38 -0500 Subject: [PATCH 17/67] [+] UI Matching settings --- .../settings/ChuniMatchingSettings.svelte | 112 ++++++++++++++++++ .../components/settings/ChuniSettings.svelte | 21 ++-- 2 files changed, 124 insertions(+), 9 deletions(-) create mode 100644 AquaNet/src/components/settings/ChuniMatchingSettings.svelte diff --git a/AquaNet/src/components/settings/ChuniMatchingSettings.svelte b/AquaNet/src/components/settings/ChuniMatchingSettings.svelte new file mode 100644 index 00000000..343ae76f --- /dev/null +++ b/AquaNet/src/components/settings/ChuniMatchingSettings.svelte @@ -0,0 +1,112 @@ + + +
+

{t("userbox.header.matching")}

+

{t("settings.cabNotice")}

+ +
+ +
+ +
+
+
+

{t('userbox.header.matching')}

+

Choose the matching server you want to use.

+
+
+ + {#each CHU3_MATCHINGS as option} +
+ {option.name} + + +
+ +
+ Collaborators +
+ {#each option.coop as coop} + {coop} + {/each} +
+
+
+ {/each} + + +
+ Custom +

Enter your own URL

+
+
+
+
+ + {#if custom} + + {/if} +
+ + diff --git a/AquaNet/src/components/settings/ChuniSettings.svelte b/AquaNet/src/components/settings/ChuniSettings.svelte index 2a5f2c33..b57a0c8b 100644 --- a/AquaNet/src/components/settings/ChuniSettings.svelte +++ b/AquaNet/src/components/settings/ChuniSettings.svelte @@ -23,6 +23,7 @@ import useLocalStorage from "../../libs/hooks/useLocalStorage.svelte"; import { DDS } from "../../libs/userbox/dds"; + import ChuniMatchingSettings from "./ChuniMatchingSettings.svelte"; let user: AquaNetUser let [loading, error, submitting, preview] = [true, "", "", ""] @@ -91,7 +92,7 @@ user = u return fetchData() }).catch((e) => { loading = false; error = e.message }); - + let DDSreader: DDS | undefined; let USERBOX_PROGRESS = 0; @@ -155,10 +156,10 @@ {:else}
- userboxSelected = "nameplateId"} chuniCharacter={userbox.characterId} chuniLevel={userbox.level} chuniRating={userbox.playerRating / 100} + userboxSelected = "nameplateId"} chuniCharacter={userbox.characterId} chuniLevel={userbox.level} chuniRating={userbox.playerRating / 100} chuniNameplate={userbox.nameplateId} chuniName={userbox.userName} chuniTrophyName={allItems.trophy[userbox.trophyId].name}> -
@@ -224,7 +225,7 @@

- {/if} + {/if} {#if !USERBOX_SUPPORT || !USERBOX_INSTALLED || !USERBOX_ENABLED.value}

{t("userbox.header.preview")}

{t("userbox.preview.notice")}

@@ -241,9 +242,11 @@ {/if} {/if} {/if} + +
{/if} - + {#if USERBOX_SETUP_RUN && !error}
@@ -282,7 +285,7 @@ p.notice opacity: 0.6 margin-top: 0 -.progress +.progress width: 100% height: 10px box-shadow: 0 0 1px 1px vars.$ov-lighter @@ -415,10 +418,10 @@ p.notice &.focused filter: brightness(75%) -.chuni-userbox +.chuni-userbox width: calc(100% - 20px) height: 350px - + display: flex flex-direction: row flex-wrap: wrap From 0bda8406c32122bf586791a84e2bd2a0e050896d Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Fri, 3 Jan 2025 16:51:03 -0500 Subject: [PATCH 18/67] [+] Submit matching settings --- .../settings/ChuniMatchingSettings.svelte | 135 ++++++++++++------ AquaNet/src/libs/config.ts | 3 +- AquaNet/src/libs/generalTypes.ts | 9 ++ 3 files changed, 103 insertions(+), 44 deletions(-) diff --git a/AquaNet/src/components/settings/ChuniMatchingSettings.svelte b/AquaNet/src/components/settings/ChuniMatchingSettings.svelte index 343ae76f..6ceb6a2a 100644 --- a/AquaNet/src/components/settings/ChuniMatchingSettings.svelte +++ b/AquaNet/src/components/settings/ChuniMatchingSettings.svelte @@ -1,56 +1,53 @@ + +

{t("userbox.header.matching")}

{t("settings.cabNotice")}

- -
- -
-
-
-

{t('userbox.header.matching')}

-

Choose the matching server you want to use.

-
-
- - {#each CHU3_MATCHINGS as option} -
- {option.name} - - -
- -
- Collaborators -
- {#each option.coop as coop} - {coop} - {/each} -
-
-
- {/each} - - -
- Custom -

Enter your own URL

-
-
-
+
{#if custom} @@ -58,6 +55,52 @@ import { t } from "../../libs/i18n.js"; {/if}
+{#if overlay} +
+
+
+

{t('userbox.header.matching')}

+

Choose the matching server you want to use.

+
+
+ + {#each CHU3_MATCHINGS as option} +
clickOption(option)} + role="button" tabindex="0" on:keypress={e => e.key === 'Enter' && clickOption(option)} + class:selected={!custom && existingUrl === option.matching}> + + {option.name} + + +
+ +
+ Collaborators +
+ {#each option.coop as coop} + {coop} + {/each} +
+
+
+ {/each} + + +
e.key === 'Enter' && clickCustom()} + class:selected={custom}> + + Custom +

Enter your own URL

+
+
+
+
+{/if} + + + +
+
+

AquaNet

+ {#if state === "home"} +
+ + +
+ {:else if state === "login" || state === "signup"} + + {:else if state === "verify"} + + {/if} +
+ +
+
+
+
+
+
+ + From 8203a70b60548a15b555e665ab45ddfa3d866ae7 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sat, 4 Jan 2025 19:49:36 -0500 Subject: [PATCH 43/67] [O] Rewrite CM chusan apis --- .../aqua/sega/chusan/ChusanController.kt | 10 +- .../handler/CMUpsertUserGachaHandler.java | 101 ------------------ .../CMUpsertUserPrintCancelHandler.java | 57 ---------- .../CMUpsertUserPrintSubtractHandler.java | 81 -------------- .../sega/chusan/{ => handler}/ChusanApis.kt | 5 +- .../aqua/sega/chusan/handler/ChusanCMApis.kt | 86 +++++++++++++++ .../{ => handler}/ChusanMatchingApis.kt | 3 +- .../model/userdata/UserCardPrintState.kt | 15 +-- .../sega/chusan/service/UserDataService.java | 37 ------- .../sega/chusan/service/UserItemService.java | 60 ----------- 10 files changed, 104 insertions(+), 351 deletions(-) delete mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserGachaHandler.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserPrintCancelHandler.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserPrintSubtractHandler.java rename src/main/java/icu/samnyan/aqua/sega/chusan/{ => handler}/ChusanApis.kt (98%) create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanCMApis.kt rename src/main/java/icu/samnyan/aqua/sega/chusan/{ => handler}/ChusanMatchingApis.kt (96%) delete mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/service/UserDataService.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/service/UserItemService.java 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 c5a92404..114c285e 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanController.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanController.kt @@ -4,7 +4,9 @@ import ext.* import icu.samnyan.aqua.net.db.AquaUserServices import icu.samnyan.aqua.net.utils.simpleDescribe import icu.samnyan.aqua.sega.allnet.TokenChecker -import icu.samnyan.aqua.sega.chusan.handler.* +import icu.samnyan.aqua.sega.chusan.handler.GameLoginHandler +import icu.samnyan.aqua.sega.chusan.handler.UpsertUserAllHandler +import icu.samnyan.aqua.sega.chusan.handler.chusanInit import icu.samnyan.aqua.sega.chusan.model.Chu3Repos import icu.samnyan.aqua.sega.general.* import icu.samnyan.aqua.sega.util.jackson.BasicMapper @@ -25,9 +27,6 @@ import kotlin.reflect.full.declaredMemberProperties class ChusanController( val gameLogin: GameLoginHandler, val upsertUserAll: UpsertUserAllHandler, - val cmUpsertUserGacha: CMUpsertUserGachaHandler, - val cmUpsertUserPrintSubtract: CMUpsertUserPrintSubtractHandler, - val cmUpsertUserPrintCancel: CMUpsertUserPrintCancelHandler, val mapper: StringMapper, val cmMapper: BasicMapper, @@ -42,8 +41,7 @@ class ChusanController( val log = LoggerFactory.getLogger(ChusanController::class.java) // Below are code related to handling the handlers - val externalHandlers = mutableListOf("GameLoginApi", "UpsertUserAllApi", - "CMUpsertUserGachaApi", "CMUpsertUserPrintCancelApi", "CMUpsertUserPrintSubtractApi") + val externalHandlers = mutableListOf("GameLoginApi", "UpsertUserAllApi") val noopEndpoint = setOf("UpsertClientBookkeepingApi", "UpsertClientDevelopApi", "UpsertClientErrorApi", "UpsertClientSettingApi", "UpsertClientTestmodeApi", "CreateTokenApi", "RemoveTokenApi", "UpsertClientUploadApi", diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserGachaHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserGachaHandler.java deleted file mode 100644 index cbd8449c..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserGachaHandler.java +++ /dev/null @@ -1,101 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.handler; - -import com.fasterxml.jackson.core.JsonProcessingException; -import icu.samnyan.aqua.sega.chusan.model.Chu3UserCardPrintStateRepo; -import icu.samnyan.aqua.sega.chusan.model.Chu3UserGachaRepo; -import icu.samnyan.aqua.sega.general.BaseHandler; -import icu.samnyan.aqua.sega.chusan.model.gamedata.GameGachaCard; -import icu.samnyan.aqua.sega.chusan.model.request.UpsertUserGacha; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState; -import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserGacha; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem; -import icu.samnyan.aqua.sega.chusan.service.UserDataService; -import icu.samnyan.aqua.sega.chusan.service.UserItemService; -import icu.samnyan.aqua.sega.util.jackson.BasicMapper; -import lombok.AllArgsConstructor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.util.*; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@AllArgsConstructor -@Component("ChusanCMUpsertUserGachaHandler") -public class CMUpsertUserGachaHandler implements BaseHandler { - - private static final Logger logger = LoggerFactory.getLogger(CMUpsertUserGachaHandler.class); - private final Chu3UserCardPrintStateRepo userCardPrintStateRepository; - private final Chu3UserGachaRepo userGachaRepository; - private final UserDataService userDataService; - private final UserItemService userItemService; - private final BasicMapper mapper; - - @Override - public Object handle(Map request) throws JsonProcessingException { - String userId = String.valueOf(request.get("userId")); - int gachaId = ((Number) request.get("gachaId")).intValue(); - int placeId = ((Number) request.get("placeId")).intValue(); - - UpsertUserGacha upsertUserGacha = mapper.convert(request.get("cmUpsertUserGacha"), UpsertUserGacha.class); - List userCardPrintStateList = new ArrayList<>(); - Chu3UserData userData; - - Optional userOptional = userDataService.getUserByExtId(userId); - if (userOptional.isPresent()) { - userData = userOptional.get(); - } else { - logger.error("User not found. userId: {}", userId); - return null; - } - - if (upsertUserGacha.getGameGachaCardList() != null) { - for (GameGachaCard gameGachaCard : upsertUserGacha.getGameGachaCardList()) { - UserCardPrintState userCardPrintState = new UserCardPrintState(); - userCardPrintState.setHasCompleted(false); - userCardPrintState.setLimitDate(LocalDateTime.of(2029, 01, 01, 0, 0)); - userCardPrintState.setPlaceId(placeId); - userCardPrintState.setCardId(gameGachaCard.getCardId()); - userCardPrintState.setGachaId(gachaId); - userCardPrintState.setUser(userData); - userCardPrintStateRepository.save(userCardPrintState); - } - } - - List userItemListToSave = new ArrayList<>(); - List userItemList = upsertUserGacha.getUserItemList(); - - userItemList.forEach(newUserItem -> { - int itemId = newUserItem.getItemId(); - int itemKind = newUserItem.getItemKind(); - - Optional userItemOptional = userItemService.getByUserAndItemIdAndKind(userData, itemId, itemKind); - UserItem userItem = userItemOptional.orElseGet(() -> new UserItem()); - - newUserItem.setId(userItem.getId()); - newUserItem.setUser(userItem.getUser()); - - userItemListToSave.add(newUserItem); - }); - userItemService.saveAll(userItemListToSave); - - if (upsertUserGacha.getUserGacha() != null) { - UserGacha newUserGacha = upsertUserGacha.getUserGacha(); - newUserGacha.setUser(userData); - userGachaRepository.save(newUserGacha); - } - - userCardPrintStateList = userCardPrintStateRepository.findByUserAndGachaIdAndHasCompleted(userData, gachaId, false); - Map resultMap = new LinkedHashMap<>(); - resultMap.put("returnCode", 1); - resultMap.put("apiName", "CMUpsertUserGachaApi"); - resultMap.put("userCardPrintStateList", userCardPrintStateList); - - return resultMap; - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserPrintCancelHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserPrintCancelHandler.java deleted file mode 100644 index 33717613..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserPrintCancelHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.handler; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import icu.samnyan.aqua.sega.chusan.model.Chu3UserCardPrintStateRepo; -import icu.samnyan.aqua.sega.general.BaseHandler; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState; -import icu.samnyan.aqua.sega.util.jackson.BasicMapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Component("ChusanCMUpsertUserPrintCancelHandler") -public class CMUpsertUserPrintCancelHandler implements BaseHandler { - - private static final Logger logger = LoggerFactory.getLogger(CMUpsertUserPrintCancelHandler.class); - private final Chu3UserCardPrintStateRepo userCardPrintStateRepository; - private final BasicMapper mapper; - - @Autowired - public CMUpsertUserPrintCancelHandler(Chu3UserCardPrintStateRepo userCardPrintStateRepository, BasicMapper mapper) { - this.userCardPrintStateRepository = userCardPrintStateRepository; - this.mapper = mapper; - } - - @Override - public String handle(Map request) throws JsonProcessingException { - String userId = String.valueOf(request.get("userId")); - List orderIdList = mapper.convert(request.get("orderIdList"), new TypeReference>() {}); - - for (Integer orderId : orderIdList) { - Optional userCardPrintStateOptional = userCardPrintStateRepository.findById(orderId.longValue()); - if (userCardPrintStateOptional.isPresent()) { - UserCardPrintState newUserCardPrintState = userCardPrintStateOptional.get(); - newUserCardPrintState.setHasCompleted(true); - userCardPrintStateRepository.save(newUserCardPrintState); - } - } - - Map resultMap = new LinkedHashMap<>(); - resultMap.put("returnCode", 1); - resultMap.put("apiName", "CMUpsertUserPrintCancelApi"); - - String json = mapper.write(resultMap); - logger.info("Response: " + json); - return json; - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserPrintSubtractHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserPrintSubtractHandler.java deleted file mode 100644 index 50323ade..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserPrintSubtractHandler.java +++ /dev/null @@ -1,81 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.handler; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import icu.samnyan.aqua.sega.chusan.model.Chu3UserCardPrintStateRepo; -import icu.samnyan.aqua.sega.general.BaseHandler; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState; -import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem; -import icu.samnyan.aqua.sega.chusan.service.UserDataService; -import icu.samnyan.aqua.sega.chusan.service.UserItemService; -import icu.samnyan.aqua.sega.util.jackson.BasicMapper; -import lombok.AllArgsConstructor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.*; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@AllArgsConstructor -@Component("ChusanCMUpsertUserPrintSubtractHandler") -public class CMUpsertUserPrintSubtractHandler implements BaseHandler { - - private static final Logger logger = LoggerFactory.getLogger(CMUpsertUserPrintSubtractHandler.class); - private final Chu3UserCardPrintStateRepo userCardPrintStateRepository; - private final UserItemService userItemService; - private final UserDataService userDataService; - private final BasicMapper mapper; - - @Override - public String handle(Map request) throws JsonProcessingException { - String userId = String.valueOf(request.get("userId")); - UserCardPrintState userCardPrintState = mapper.convert(request.get("userCardPrintState"), UserCardPrintState.class); - List userItemList = mapper.convert(request.get("userItemList"), new TypeReference>() {}); - - Chu3UserData userData; - - Optional userOptional = userDataService.getUserByExtId(userId); - if (userOptional.isPresent()) { - userData = userOptional.get(); - } else { - logger.error("User not found. userId: {}", userId); - return null; - } - - List userItemListToSave = new ArrayList<>(); - - userItemList.forEach(newUserItem -> { - int itemId = newUserItem.getItemId(); - int itemKind = newUserItem.getItemKind(); - - Optional userItemOptional = userItemService.getByUserAndItemIdAndKind(userData, itemId, itemKind); - UserItem userItem = userItemOptional.orElseGet(() -> new UserItem()); - - newUserItem.setId(userItem.getId()); - newUserItem.setUser(userItem.getUser()); - - userItemListToSave.add(newUserItem); - }); - userItemService.saveAll(userItemListToSave); - - Optional userCardPrintStateOptional = userCardPrintStateRepository.findById(userCardPrintState.getId()); - if (userCardPrintStateOptional.isPresent()) { - UserCardPrintState newUserCardPrintState = userCardPrintStateOptional.get(); - newUserCardPrintState.setHasCompleted(true); - userCardPrintStateRepository.save(newUserCardPrintState); - } - - Map resultMap = new LinkedHashMap<>(); - resultMap.put("returnCode", 1); - resultMap.put("apiName", "CMUpsertUserPrintSubtractApi"); - - String json = mapper.write(resultMap); - logger.info("Response: " + json); - return json; - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt similarity index 98% rename from src/main/java/icu/samnyan/aqua/sega/chusan/ChusanApis.kt rename to src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt index ac59b974..1c4c0ffa 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt @@ -1,7 +1,9 @@ -package icu.samnyan.aqua.sega.chusan +package icu.samnyan.aqua.sega.chusan.handler import ext.* import icu.samnyan.aqua.sega.allnet.TokenChecker +import icu.samnyan.aqua.sega.chusan.ChusanController +import icu.samnyan.aqua.sega.chusan.ChusanData import icu.samnyan.aqua.sega.chusan.model.request.UserCMissionResp import icu.samnyan.aqua.sega.chusan.model.request.UserEmoney import icu.samnyan.aqua.sega.chusan.model.userdata.UserCharge @@ -13,6 +15,7 @@ import java.time.format.DateTimeFormatter @Suppress("UNCHECKED_CAST") fun ChusanController.chusanInit() { matchingApiInit() + cmApiInit() // Stub handlers "GetGameRanking" { """{"type":"${data["type"]}","length":"0","gameRankingList":[]}""" } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanCMApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanCMApis.kt new file mode 100644 index 00000000..3b510834 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanCMApis.kt @@ -0,0 +1,86 @@ +package icu.samnyan.aqua.sega.chusan.handler + +import com.fasterxml.jackson.core.type.TypeReference +import ext.int +import ext.invoke +import ext.mapApply +import ext.parsing +import icu.samnyan.aqua.sega.chusan.ChusanController +import icu.samnyan.aqua.sega.chusan.model.request.UpsertUserGacha +import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState +import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem +import java.time.LocalDateTime + +fun ChusanController.cmApiInit() { + "CMUpsertUserGacha" api@ { + val (gachaId, placeId) = parsing { data["gachaId"]!!.int to data["placeId"]!!.int } + + val u = db.userData.findByCard_ExtId(uid)() ?: return@api null + val upsertUserGacha = parsing { mapper.convert(data["cmUpsertUserGacha"], UpsertUserGacha::class.java) } + + upsertUserGacha.gameGachaCardList?.let { lst -> + db.userCardPrintState.saveAll(lst.map { + UserCardPrintState( + hasCompleted = false, + limitDate = LocalDateTime.of(2029, 1, 1, 0, 0), + placeId = placeId, + cardId = it.cardId, + gachaId = gachaId + ).apply { user = u } + }) + } + + upsertUserGacha.userItemList?.let { + db.userItem.saveAll(it.mapApply { + user = u + id = db.userItem.findByUserAndItemIdAndItemKind(u, itemId, itemKind)?.id ?: 0 + }) + } + + upsertUserGacha.userGacha?.let { + it.user = u + db.userGacha.save(it) + } + + mapOf( + "returnCode" to 1, + "apiName" to "CMUpsertUserGachaApi", + "userCardPrintStateList" to db.userCardPrintState.findByUserAndGachaIdAndHasCompleted(u, gachaId, false) + ) + } + + "CMUpsertUserPrintCancel" { + val orderIdList: List = cmMapper.convert(data["orderIdList"], object : TypeReference>() {}) + + db.userCardPrintState.saveAll(orderIdList.mapNotNull { + // TODO: The original code by Eori writes findById but I don't think that is correct... + db.userCardPrintState.findById(it)()?.apply { + hasCompleted = true + } + }) + + mapOf("returnCode" to 1, "apiName" to "CMUpsertUserPrintCancelApi") + } + + "CMUpsertUserPrintSubtract" api@ { + val userCardPrintState = cmMapper.convert(data["userCardPrintState"], UserCardPrintState::class.java) + val userItemList = cmMapper.convert(data["userItemList"], object : TypeReference>() {}) + + val u = db.userData.findByCard_ExtId(uid)() ?: return@api null + + db.userItem.saveAll( + userItemList.mapApply { + id = db.userItem.findByUserAndItemIdAndItemKind(u, itemId, itemKind)?.id ?: 0 + user = u + } + ) + + // TODO: I also doubt this is correct... it shouldn't be ID + db.userCardPrintState.findById(userCardPrintState.id)()?.apply { + hasCompleted = true + db.userCardPrintState.save(this) + } + + mapOf("returnCode" to 1, "apiName" to "CMUpsertUserPrintSubtractApi") + } +} \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanMatchingApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanMatchingApis.kt similarity index 96% rename from src/main/java/icu/samnyan/aqua/sega/chusan/ChusanMatchingApis.kt rename to src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanMatchingApis.kt index 7a19baad..87eaabb3 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanMatchingApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanMatchingApis.kt @@ -1,11 +1,12 @@ @file:Suppress("UNCHECKED_CAST") -package icu.samnyan.aqua.sega.chusan +package icu.samnyan.aqua.sega.chusan.handler import ext.JDict import ext.int import ext.millis import ext.parsing +import icu.samnyan.aqua.sega.chusan.ChusanController import icu.samnyan.aqua.sega.chusan.model.request.MatchingWaitState import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3MatchingMemberReq import kotlin.collections.MutableList diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCardPrintState.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCardPrintState.kt index 51759369..faa2e1d6 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCardPrintState.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCardPrintState.kt @@ -6,10 +6,11 @@ import java.time.LocalDateTime @Entity(name = "ChusanUserCardPrintState") @Table(name = "chusan_user_print_state") -class UserCardPrintState : Chu3UserEntity() { - var hasCompleted = false - var limitDate: LocalDateTime = LocalDateTime.now() - var placeId = 0 - var cardId = 0 - var gachaId = 0 -} +class UserCardPrintState( + var hasCompleted: Boolean = false, + var limitDate: LocalDateTime = LocalDateTime.now(), + var placeId: Int = 0, + var cardId: Int = 0, + var gachaId: Int = 0 +) : Chu3UserEntity() + diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserDataService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserDataService.java deleted file mode 100644 index ff9477bd..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserDataService.java +++ /dev/null @@ -1,37 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.service; - -import icu.samnyan.aqua.sega.chusan.model.Chu3UserDataRepo; -import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; -import icu.samnyan.aqua.sega.general.model.Card; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.Optional; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Service("ChusanUserDataService") -public class UserDataService { - - private final Chu3UserDataRepo userDataRepository; - - @Autowired - public UserDataService(Chu3UserDataRepo userDataRepository) { - this.userDataRepository = userDataRepository; - } - - public Chu3UserData saveUserData(Chu3UserData userData) { - return userDataRepository.save(userData); - } - - public Optional getUserByExtId(String aimeId) { - return userDataRepository.findByCard_ExtId(Long.parseLong(aimeId)); - } - - public void updateLoginTime(Chu3UserData userData) { - userData.setLastLoginDate(LocalDateTime.now()); - userDataRepository.save(userData); - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserItemService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserItemService.java deleted file mode 100644 index 7f257ab6..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserItemService.java +++ /dev/null @@ -1,60 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.service; - -import icu.samnyan.aqua.sega.chusan.model.Chu3UserItemRepo; -import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; - -import java.util.Comparator; -import java.util.List; -import java.util.Optional; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Service("ChusanUserItemService") -public class UserItemService { - private final Chu3UserItemRepo userItemRepository; - - @Autowired - public UserItemService(Chu3UserItemRepo userItemRepository) { - this.userItemRepository = userItemRepository; - } - - public UserItem save(UserItem userItem) { - return userItemRepository.save(userItem); - } - - public List saveAll(Iterable userItem) { - return userItemRepository.saveAll(userItem); - } - - public List getByUserId(String userId) { - List userItemList = userItemRepository.findByUser_Card_ExtId(Long.parseLong(userId)); - userItemList.sort(Comparator.comparingInt(UserItem::getItemId)); - return userItemList; - } - - public Optional getByUserAndItemIdAndKind(Chu3UserData user, int itemId, int itemKind) { - return userItemRepository.findTopByUserAndItemIdAndItemKindOrderByIdDesc(user, itemId, itemKind); - } - - public Page getByUserAndItemKind(String userId, int kind, int pageNumber, int maxCount) { - Pageable page = PageRequest.of(pageNumber, maxCount); - return userItemRepository.findAllByUser_Card_ExtIdAndItemKind(Long.parseLong(userId), kind, page); - } - - public List getByUserAndItemKind(String userId, int kind) { - List userItemList = userItemRepository.findAllByUser_Card_ExtIdAndItemKind(Long.parseLong(userId), kind); - userItemList.sort(Comparator.comparingInt(UserItem::getItemId)); - return userItemList; - } - - public Page getByUserId(String userId, int page, int size) { - return userItemRepository.findByUser_Card_ExtId(Long.parseLong(userId), PageRequest.of(page, size)); - } -} From af9cd81220715836057068825111404d21f7b6fe Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sat, 4 Jan 2025 19:59:46 -0500 Subject: [PATCH 44/67] [O] Complete kt rewrite --- .../aqua/sega/chusan/ChusanController.kt | 21 +-- .../aqua/sega/chusan/handler/ChusanApis.kt | 76 ++++++--- .../aqua/sega/chusan/handler/ChusanCMApis.kt | 21 ++- .../sega/chusan/handler/ChusanUpsertApis.kt | 139 ++++++++++++++++ .../sega/chusan/handler/GameLoginHandler.kt | 76 --------- .../chusan/handler/UpsertUserAllHandler.kt | 153 ------------------ 6 files changed, 212 insertions(+), 274 deletions(-) create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt delete mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/GameLoginHandler.kt delete mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserAllHandler.kt 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 114c285e..ecf317e0 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanController.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/ChusanController.kt @@ -4,11 +4,10 @@ import ext.* import icu.samnyan.aqua.net.db.AquaUserServices import icu.samnyan.aqua.net.utils.simpleDescribe import icu.samnyan.aqua.sega.allnet.TokenChecker -import icu.samnyan.aqua.sega.chusan.handler.GameLoginHandler -import icu.samnyan.aqua.sega.chusan.handler.UpsertUserAllHandler import icu.samnyan.aqua.sega.chusan.handler.chusanInit import icu.samnyan.aqua.sega.chusan.model.Chu3Repos -import icu.samnyan.aqua.sega.general.* +import icu.samnyan.aqua.sega.general.MeowApi +import icu.samnyan.aqua.sega.general.RequestContext import icu.samnyan.aqua.sega.util.jackson.BasicMapper import icu.samnyan.aqua.sega.util.jackson.StringMapper import icu.samnyan.aqua.spring.Metrics @@ -16,7 +15,6 @@ import jakarta.servlet.http.HttpServletRequest import org.slf4j.LoggerFactory import org.springframework.web.bind.annotation.RestController import kotlin.collections.set -import kotlin.reflect.full.declaredMemberProperties /** * @author samnyan (privateamusement@protonmail.com) @@ -25,9 +23,6 @@ import kotlin.reflect.full.declaredMemberProperties @RestController @API(value = ["/g/chu3/{version}/ChuniServlet", "/g/chu3/{version}"]) class ChusanController( - val gameLogin: GameLoginHandler, - val upsertUserAll: UpsertUserAllHandler, - val mapper: StringMapper, val cmMapper: BasicMapper, val db: Chu3Repos, @@ -40,22 +35,12 @@ class ChusanController( }) { val log = LoggerFactory.getLogger(ChusanController::class.java) - // Below are code related to handling the handlers - val externalHandlers = mutableListOf("GameLoginApi", "UpsertUserAllApi") - val noopEndpoint = setOf("UpsertClientBookkeepingApi", "UpsertClientDevelopApi", "UpsertClientErrorApi", "UpsertClientSettingApi", "UpsertClientTestmodeApi", "CreateTokenApi", "RemoveTokenApi", "UpsertClientUploadApi", "PrinterLoginApi", "PrinterLogoutApi", "Ping", "GameLogoutApi", "RemoveMatchingMemberApi") init { chusanInit() } - - val members = this::class.declaredMemberProperties - val handlers: Map = initH + externalHandlers.associateWith { api -> - val name = api.replace("Api", "").lowercase() - (members.find { it.name.lowercase() == name } ?: members.find { it.name.lowercase() == name.replace("cm", "") }) - ?.let { (it.call(this) as BaseHandler).toSpecial() } - ?: throw IllegalArgumentException("Chu3: No handler found for $api") - } + val handlers = initH @API("/{endpoint}", "/MatchingServer/{endpoint}") fun handle(@PV endpoint: Str, @RB data: MutableMap, @PV version: Str, req: HttpServletRequest): Any { 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 1c4c0ffa..d0544720 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 @@ -5,17 +5,19 @@ import icu.samnyan.aqua.sega.allnet.TokenChecker import icu.samnyan.aqua.sega.chusan.ChusanController import icu.samnyan.aqua.sega.chusan.ChusanData import icu.samnyan.aqua.sega.chusan.model.request.UserCMissionResp -import icu.samnyan.aqua.sega.chusan.model.request.UserEmoney -import icu.samnyan.aqua.sega.chusan.model.userdata.UserCharge import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem +import icu.samnyan.aqua.sega.chusan.model.userdata.UserLoginBonus import icu.samnyan.aqua.sega.chusan.model.userdata.UserMusicDetail import icu.samnyan.aqua.sega.general.model.response.UserRecentRating +import java.time.LocalDateTime +import java.time.ZoneOffset import java.time.format.DateTimeFormatter @Suppress("UNCHECKED_CAST") fun ChusanController.chusanInit() { matchingApiInit() cmApiInit() + upsertApiInit() // Stub handlers "GetGameRanking" { """{"type":"${data["type"]}","length":"0","gameRankingList":[]}""" } @@ -32,9 +34,6 @@ fun ChusanController.chusanInit() { "GetUserNetBattleData" { """{"userId":"${data["userId"]}","userNetBattleData":{"recentNBSelectMusicList":[],"recentNBMusicList":[]}}""" } "GetUserNetBattleRankingInfo" { """{"userId":"${data["userId"]}","length":"0","userNetBattleRankingInfoList":{}}""" } - "CMUpsertUserPrint" { """{"returnCode":1,"orderId":"0","serialId":"FAKECARDIMAG12345678","apiName":"CMUpsertUserPrintApi"}""" } - "CMUpsertUserPrintlog" { """{"returnCode":1,"orderId":"0","serialId":"FAKECARDIMAG12345678","apiName":"CMUpsertUserPrintlogApi"}""" } - // User handlers "GetUserData" { db.userData.findByCard_ExtId(uid)()?.let{ u -> mapOf("userId" to uid, "userData" to u) } @@ -233,29 +232,60 @@ fun ChusanController.chusanInit() { ) } - // Upserts - "UpsertUserChargelog" { - val charge = parsing { mapper.convert(data["userCharge"] as JDict) } - charge.user = db.userData.findByCard_ExtId(uid)() ?: (400 - "User not found") - charge.id = db.userCharge.findByUser_Card_ExtIdAndChargeId(uid, charge.chargeId)?.id ?: 0 - db.userCharge.save(charge) - """{"returnCode":"1"}""" - } - // Static "GetGameEvent" static { db.gameEvent.findByEnable(true).let { mapOf("type" to 1, "length" to it.size, "gameEventList" to it) } } "GetGameCharge" static { db.gameCharge.findAll().let { mapOf("length" to it.size, "gameChargeList" to it) } } "GetGameGacha" static { db.gameGacha.findAll().let { mapOf("length" to it.size, "gameGachaList" to it, "registIdList" to empty) } } "GetGameMapAreaCondition" static { ChusanData.mapAreaCondition } - // CardMaker (TODO: Somebody test this, I don't have a card maker) - "CMGetUserData" { - val user = db.userData.findByCard_ExtId(uid)() ?: (400 - "User not found") - user.userEmoney = UserEmoney() - mapOf("userId" to uid, "userData" to user, "userEmoney" to user.userEmoney) - } - "CMGetUserPreview" { - val user = db.userData.findByCard_ExtId(uid)() ?: (400 - "User not found") - mapOf("userName" to user.userName, "level" to user.level, "medal" to user.medal, "lastDataVersion" to user.lastDataVersion, "isLogin" to false) + // TODO: Test login bonus + "GameLogin" { + fun process() { + val u = db.userData.findByCard_ExtId(uid)() ?: return + db.userData.save(u.apply { lastLoginDate = LocalDateTime.now() }) + + if (!props.loginBonusEnable) return + val bonusList = db.gameLoginBonusPresets.findLoginBonusPresets(1, 1) + + bonusList.forEach { preset -> + // Check if a user already has some progress and if not, add the login bonus entry + val bonus = db.userLoginBonus.findLoginBonus(uid.int, 1, preset.id)() + ?: UserLoginBonus(1, uid.int, preset.id).let { db.userLoginBonus.save(it) } + if (bonus.isFinished) return@forEach + + // last login is 24 hours+ ago + if (bonus.lastUpdateDate.toEpochSecond(ZoneOffset.ofHours(0)) < + (LocalDateTime.now().minusHours(24).toEpochSecond(ZoneOffset.ofHours(0))) + ) { + var bCount = bonus.bonusCount + 1 + val lastUpdate = LocalDateTime.now() + val allLoginBonus = db.gameLoginBonus.findGameLoginBonus(1, preset.id) + .ifEmpty { return@forEach } + val maxNeededDays = allLoginBonus[0].needLoginDayCount + + // if all items are redeemed, then don't show the login bonuses. + var finished = false + if (bCount > maxNeededDays) { + if (preset.id < 3000) bCount = 1 + else finished = true + } + db.gameLoginBonus.findByRequiredDays(1, preset.id, bCount)()?.let { + db.userItem.save(UserItem(6, it.presentId, it.itemNum).apply { user = u }) + } + val toSave = db.userLoginBonus.findLoginBonus(uid.int, 1, preset.id)() + ?: UserLoginBonus().apply { user = uid.int; presetId = preset.id; version = 1 } + + db.userLoginBonus.save(toSave.apply { + bonusCount = bCount + lastUpdateDate = lastUpdate + isWatched = false + isFinished = finished + }) + } + } + } + process() + + """{"returnCode":"1"}""" } } \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanCMApis.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanCMApis.kt index 3b510834..ad983f78 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanCMApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanCMApis.kt @@ -1,17 +1,30 @@ package icu.samnyan.aqua.sega.chusan.handler import com.fasterxml.jackson.core.type.TypeReference -import ext.int -import ext.invoke -import ext.mapApply -import ext.parsing +import ext.* import icu.samnyan.aqua.sega.chusan.ChusanController import icu.samnyan.aqua.sega.chusan.model.request.UpsertUserGacha +import icu.samnyan.aqua.sega.chusan.model.request.UserEmoney import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem import java.time.LocalDateTime fun ChusanController.cmApiInit() { + "CMUpsertUserPrint" { """{"returnCode":1,"orderId":"0","serialId":"FAKECARDIMAG12345678","apiName":"CMUpsertUserPrintApi"}""" } + "CMUpsertUserPrintlog" { """{"returnCode":1,"orderId":"0","serialId":"FAKECARDIMAG12345678","apiName":"CMUpsertUserPrintlogApi"}""" } + + // CardMaker (TODO: Somebody test this, I don't have a card maker) + "CMGetUserData" { + val user = db.userData.findByCard_ExtId(uid)() ?: (400 - "User not found") + user.userEmoney = UserEmoney() + mapOf("userId" to uid, "userData" to user, "userEmoney" to user.userEmoney) + } + + "CMGetUserPreview" { + val user = db.userData.findByCard_ExtId(uid)() ?: (400 - "User not found") + mapOf("userName" to user.userName, "level" to user.level, "medal" to user.medal, "lastDataVersion" to user.lastDataVersion, "isLogin" to false) + } + "CMUpsertUserGacha" api@ { val (gachaId, placeId) = parsing { data["gachaId"]!!.int to data["placeId"]!!.int } 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 new file mode 100644 index 00000000..03f6a2e5 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt @@ -0,0 +1,139 @@ +package icu.samnyan.aqua.sega.chusan.handler + +import ext.* +import icu.samnyan.aqua.sega.chusan.ChusanController +import icu.samnyan.aqua.sega.chusan.model.request.UpsertUserAll +import icu.samnyan.aqua.sega.chusan.model.userdata.* +import icu.samnyan.aqua.sega.general.model.response.UserRecentRating +import java.nio.charset.StandardCharsets +import java.time.LocalDateTime + +@Suppress("UNCHECKED_CAST") +fun ChusanController.upsertApiInit() { + "UpsertUserChargelog" { + val charge = parsing { mapper.convert(data["userCharge"] as JDict) } + charge.user = db.userData.findByCard_ExtId(uid)() ?: (400 - "User not found") + charge.id = db.userCharge.findByUser_Card_ExtIdAndChargeId(uid, charge.chargeId)?.id ?: 0 + db.userCharge.save(charge) + """{"returnCode":"1"}""" + } + + "UpsertUserAll" api@ { + val req = mapper.convert(data["upsertUserAll"], UpsertUserAll::class.java) + + req.run { + // UserData + val oldUser = db.userData.findByCard_ExtId(uid)() + val u = (userData?.get(0) ?: return@api null).apply { + id = oldUser?.id ?: 0 + card = oldUser?.card ?: us.cardRepo.findByExtId(uid).expect("Card not found") + userName = String(userName.toByteArray(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8) + userNameEx = "" + }.also { db.userData.saveAndFlush(it) } + + versionHelper[u.lastClientId] = u.lastDataVersion + + // Set users + listOfNotNull( + userPlaylogList, userGameOption, userMapAreaList, userCharacterList, userItemList, + userMusicDetailList, userActivityList, userChargeList, userCourseList, userDuelList, + ).flatten().forEach { it.user = u } + + // Ratings + 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", + ).filter { it.first != null }.forEach { (list, key) -> + val d = db.userGeneralData.findByUserAndPropertyKey(u, key)() + ?: UserGeneralData().apply { user = u; propertyKey = key } + db.userGeneralData.save(d.apply { propertyValue = list!!.str() }) + } + + userFavoriteMusicList?.filter { it.musicId != -1 }?.let { list -> + val d = db.userGeneralData.findByUserAndPropertyKey(u, "favorite_music")() + ?: UserGeneralData().apply { user = u; propertyKey = "favorite_music" } + db.userGeneralData.save(d.apply { + propertyValue = list.distinct().joinToString(",") { it.musicId.toString() } }) + } + + // Playlog + userPlaylogList?.let { db.userPlaylog.saveAll(it) } + + // List data + userGameOption?.get(0)?.let { obj -> + db.userGameOption.saveAndFlush(obj.apply { + id = db.userGameOption.findSingleByUser(u)()?.id ?: 0 }) } + + userMapAreaList?.let { list -> + db.userMap.saveAll(list.distinctBy { it.mapAreaId }.mapApply { + id = db.userMap.findByUserAndMapAreaId(u, mapAreaId)?.id ?: 0 }) } + + userCharacterList?.let { list -> + db.userCharacter.saveAll(list.distinctBy { it.characterId }.mapApply { + id = db.userCharacter.findByUserAndCharacterId(u, characterId)?.id ?: 0 }) } + + userItemList?.let { list -> + db.userItem.saveAll(list.distinctBy { it.itemId to it.itemKind }.mapApply { + id = db.userItem.findByUserAndItemIdAndItemKind(u, itemId, itemKind)?.id ?: 0 }) } + + userMusicDetailList?.let { list -> + db.userMusicDetail.saveAll(list.distinctBy { it.musicId to it.level }.mapApply { + id = db.userMusicDetail.findByUserAndMusicIdAndLevel(u, musicId, level)?.id ?: 0 }) } + + userActivityList?.let { list -> + db.userActivity.saveAll(list.distinctBy { it.activityId to it.kind }.mapApply { + id = db.userActivity.findByUserAndActivityIdAndKind(u, activityId, kind)?.id ?: 0 }) } + + userChargeList?.let { list -> + db.userCharge.saveAll(list.distinctBy { it.chargeId }.mapApply { + id = db.userCharge.findByUserAndChargeId(u, chargeId)()?.id ?: 0 }) } + + userCourseList?.let { list -> + db.userCourse.saveAll(list.distinctBy { it.courseId }.mapApply { + id = db.userCourse.findByUserAndCourseId(u, courseId)?.id ?: 0 }) } + + userDuelList?.let { list -> + db.userDuel.saveAll(list.distinctBy { it.duelId }.mapApply { + id = db.userDuel.findByUserAndDuelId(u, duelId)?.id ?: 0 }) } + + // Need testing + userLoginBonusList?.let { list -> + db.userLoginBonus.saveAll(list.distinctBy { it["presetId"] as String }.map { + val id = it["presetId"]!!.int + (db.userLoginBonus.findLoginBonus(uid.int, 1, id)() ?: UserLoginBonus()).apply { + user = u.id.toInt() + presetId = id + lastUpdateDate = LocalDateTime.now() + isWatched = true + } + }) + } + + req.userCMissionList?.forEach { d -> + (db.userCMission.findByUser_Card_ExtIdAndMissionId(uid, d.missionId)() + ?: UserCMission().apply { + missionId = d.missionId + user = u + } + ).apply { point = d.point }.also { db.userCMission.save(it) } + + d.userCMissionProgressList?.forEach inner@ { p -> + (db.userCMissionProgress.findByUser_Card_ExtIdAndMissionIdAndOrder(uid, d.missionId, p.order)() + ?: UserCMissionProgress().apply { + missionId = d.missionId + order = p.order + user = u + } + ).apply { + progress = p.progress + stage = p.stage + }.also { db.userCMissionProgress.save(it) } + } + } + } + + """{"returnCode":1}""" + } +} \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GameLoginHandler.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GameLoginHandler.kt deleted file mode 100644 index a98a1935..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GameLoginHandler.kt +++ /dev/null @@ -1,76 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.handler - -import ext.int -import ext.invoke -import ext.long -import icu.samnyan.aqua.sega.chusan.ChusanProps -import icu.samnyan.aqua.sega.chusan.model.Chu3Repos -import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem -import icu.samnyan.aqua.sega.chusan.model.userdata.UserLoginBonus -import icu.samnyan.aqua.sega.general.BaseHandler -import lombok.AllArgsConstructor -import org.springframework.stereotype.Component -import java.time.LocalDateTime -import java.time.ZoneOffset - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@AllArgsConstructor -@Component("ChusanGameLoginHandler") -class GameLoginHandler( - val props: ChusanProps, - val db: Chu3Repos -) : BaseHandler { - - override fun handle(request: Map): Any? { - val uid = request["userId"]!!.long - fun process() { - val u = db.userData.findByCard_ExtId(uid)() ?: return - db.userData.save(u.apply { lastLoginDate = LocalDateTime.now() }) - - if (!props.loginBonusEnable) return - val bonusList = db.gameLoginBonusPresets.findLoginBonusPresets(1, 1) - - bonusList.forEach { preset -> - // Check if a user already has some progress and if not, add the login bonus entry - val bonus = db.userLoginBonus.findLoginBonus(uid.int, 1, preset.id)() - ?: UserLoginBonus(1, uid.int, preset.id).let { db.userLoginBonus.save(it) } - if (bonus.isFinished) return@forEach - - // last login is 24 hours+ ago - if (bonus.lastUpdateDate.toEpochSecond(ZoneOffset.ofHours(0)) < - (LocalDateTime.now().minusHours(24).toEpochSecond(ZoneOffset.ofHours(0))) - ) { - var bCount = bonus.bonusCount + 1 - val lastUpdate = LocalDateTime.now() - val allLoginBonus = db.gameLoginBonus.findGameLoginBonus(1, preset.id) - .ifEmpty { return@forEach } - val maxNeededDays = allLoginBonus[0].needLoginDayCount - - // if all items are redeemed, then don't show the login bonuses. - var finished = false - if (bCount > maxNeededDays) { - if (preset.id < 3000) bCount = 1 - else finished = true - } - db.gameLoginBonus.findByRequiredDays(1, preset.id, bCount)()?.let { - db.userItem.save(UserItem(6, it.presentId, it.itemNum).apply { user = u }) - } - val toSave = db.userLoginBonus.findLoginBonus(uid.int, 1, preset.id)() - ?: UserLoginBonus().apply { user = uid.int; presetId = preset.id; version = 1 } - - db.userLoginBonus.save(toSave.apply { - bonusCount = bCount - lastUpdateDate = lastUpdate - isWatched = false - isFinished = finished - }) - } - } - } - process() - - return """{"returnCode":"1"}""" - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserAllHandler.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserAllHandler.kt deleted file mode 100644 index bab81dae..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserAllHandler.kt +++ /dev/null @@ -1,153 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.handler - -import ext.* -import icu.samnyan.aqua.sega.chusan.ChusanVersionHelper -import icu.samnyan.aqua.sega.chusan.model.Chu3Repos -import icu.samnyan.aqua.sega.chusan.model.request.UpsertUserAll -import icu.samnyan.aqua.sega.chusan.model.userdata.UserCMission -import icu.samnyan.aqua.sega.chusan.model.userdata.UserCMissionProgress -import icu.samnyan.aqua.sega.chusan.model.userdata.UserGeneralData -import icu.samnyan.aqua.sega.chusan.model.userdata.UserLoginBonus -import icu.samnyan.aqua.sega.general.BaseHandler -import icu.samnyan.aqua.sega.general.dao.CardRepository -import icu.samnyan.aqua.sega.general.model.response.UserRecentRating -import icu.samnyan.aqua.sega.util.jackson.StringMapper -import lombok.AllArgsConstructor -import org.springframework.stereotype.Component -import java.nio.charset.StandardCharsets -import java.time.LocalDateTime - -/** - * The handler for save user data. Only send in the end of the session. - * - * @author samnyan (privateamusement@protonmail.com) - */ -@AllArgsConstructor -@Component("ChusanUpsertUserAllHandler") -class UpsertUserAllHandler( - val mapper: StringMapper, - val rp: Chu3Repos, - val cardRepo: CardRepository, - val versionHelper: ChusanVersionHelper, -) : BaseHandler { - val logger = logger() - - override fun handle(request: Map): Any? { - val ext = request["userId"]?.long ?: return null - val req = mapper.convert(request["upsertUserAll"], UpsertUserAll::class.java) - - req.run { - // UserData - val oldUser = rp.userData.findByCard_ExtId(ext)() - val u = (userData?.get(0) ?: return null).apply { - id = oldUser?.id ?: 0 - card = oldUser?.card ?: cardRepo.findByExtId(ext).expect("Card not found") - userName = String(userName.toByteArray(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8) - userNameEx = "" - }.also { rp.userData.saveAndFlush(it) } - - versionHelper[u.lastClientId] = u.lastDataVersion - - // Set users - listOfNotNull( - userPlaylogList, userGameOption, userMapAreaList, userCharacterList, userItemList, - userMusicDetailList, userActivityList, userChargeList, userCourseList, userDuelList, - ).flatten().forEach { it.user = u } - - // Ratings - 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", - ).filter { it.first != null }.forEach { (list, key) -> - val d = rp.userGeneralData.findByUserAndPropertyKey(u, key)() - ?: UserGeneralData().apply { user = u; propertyKey = key } - rp.userGeneralData.save(d.apply { propertyValue = list!!.str() }) - } - - userFavoriteMusicList?.let { list -> - val d = rp.userGeneralData.findByUserAndPropertyKey(u, "favorite_music")() - ?: UserGeneralData().apply { user = u; propertyKey = "favorite_music" } - rp.userGeneralData.save(d.apply { propertyValue = list.joinToString(",") { it.musicId.toString() } }) - } - - // Playlog - userPlaylogList?.let { rp.userPlaylog.saveAll(it) } - - // List data - userGameOption?.get(0)?.let { obj -> - rp.userGameOption.saveAndFlush(obj.apply { - id = rp.userGameOption.findSingleByUser(u)()?.id ?: 0 }) } - - userMapAreaList?.let { list -> - rp.userMap.saveAll(list.distinctBy { it.mapAreaId }.mapApply { - id = rp.userMap.findByUserAndMapAreaId(u, mapAreaId)?.id ?: 0 }) } - - userCharacterList?.let { list -> - rp.userCharacter.saveAll(list.distinctBy { it.characterId }.mapApply { - id = rp.userCharacter.findByUserAndCharacterId(u, characterId)?.id ?: 0 }) } - - userItemList?.let { list -> - rp.userItem.saveAll(list.distinctBy { it.itemId to it.itemKind }.mapApply { - id = rp.userItem.findByUserAndItemIdAndItemKind(u, itemId, itemKind)?.id ?: 0 }) } - - userMusicDetailList?.let { list -> - rp.userMusicDetail.saveAll(list.distinctBy { it.musicId to it.level }.mapApply { - id = rp.userMusicDetail.findByUserAndMusicIdAndLevel(u, musicId, level)?.id ?: 0 }) } - - userActivityList?.let { list -> - rp.userActivity.saveAll(list.distinctBy { it.activityId to it.kind }.mapApply { - id = rp.userActivity.findByUserAndActivityIdAndKind(u, activityId, kind)?.id ?: 0 }) } - - userChargeList?.let { list -> - rp.userCharge.saveAll(list.distinctBy { it.chargeId }.mapApply { - id = rp.userCharge.findByUserAndChargeId(u, chargeId)()?.id ?: 0 }) } - - userCourseList?.let { list -> - rp.userCourse.saveAll(list.distinctBy { it.courseId }.mapApply { - id = rp.userCourse.findByUserAndCourseId(u, courseId)?.id ?: 0 }) } - - userDuelList?.let { list -> - rp.userDuel.saveAll(list.distinctBy { it.duelId }.mapApply { - id = rp.userDuel.findByUserAndDuelId(u, duelId)?.id ?: 0 }) } - - // Need testing - userLoginBonusList?.let { list -> - rp.userLoginBonus.saveAll(list.distinctBy { it["presetId"] as String }.map { - val id = it["presetId"]!!.int - (rp.userLoginBonus.findLoginBonus(ext.int, 1, id)() ?: UserLoginBonus()).apply { - user = u.id.toInt() - presetId = id - lastUpdateDate = LocalDateTime.now() - isWatched = true - } - }) - } - - req.userCMissionList?.forEach { d -> - (rp.userCMission.findByUser_Card_ExtIdAndMissionId(ext, d.missionId)() - ?: UserCMission().apply { - missionId = d.missionId - user = u - } - ).apply { point = d.point }.also { rp.userCMission.save(it) } - - d.userCMissionProgressList?.forEach inner@ { p -> - (rp.userCMissionProgress.findByUser_Card_ExtIdAndMissionIdAndOrder(ext, d.missionId, p.order)() - ?: UserCMissionProgress().apply { - missionId = d.missionId - order = p.order - user = u - } - ).apply { - progress = p.progress - stage = p.stage - }.also { rp.userCMissionProgress.save(it) } - } - } - } - - return """{"returnCode":1}""" - } -} From 01a064f1ab4508ddaa7fa666b372e0e61ac52494 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sat, 4 Jan 2025 20:07:16 -0500 Subject: [PATCH 45/67] [O] Game entities --- .../aqua/sega/chusan/model/Chu3GameData.kt | 88 +++++++++++++++++++ .../chusan/model/gamedata/GameCharge.java | 46 ---------- .../sega/chusan/model/gamedata/GameEvent.java | 37 -------- .../sega/chusan/model/gamedata/GameGacha.java | 42 --------- .../chusan/model/gamedata/GameGachaCard.java | 34 ------- .../chusan/model/gamedata/GameLoginBonus.java | 31 ------- .../model/gamedata/GameLoginBonusPreset.java | 27 ------ .../chusan/model/request/UpsertUserGacha.java | 50 ----------- .../chusan/model/request/UpsertUserGacha.kt | 22 +++++ 9 files changed, 110 insertions(+), 267 deletions(-) create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3GameData.kt delete mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameCharge.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameEvent.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGacha.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGachaCard.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameLoginBonus.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameLoginBonusPreset.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.kt diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3GameData.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3GameData.kt new file mode 100644 index 00000000..b3a36250 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3GameData.kt @@ -0,0 +1,88 @@ +package icu.samnyan.aqua.sega.chusan.model + +import com.fasterxml.jackson.annotation.JsonIgnore +import com.fasterxml.jackson.annotation.JsonProperty +import icu.samnyan.aqua.net.games.BaseEntity +import jakarta.persistence.Column +import jakarta.persistence.Entity +import jakarta.persistence.Table +import java.time.LocalDateTime + +@Entity(name = "ChusanGameCharge") +@Table(name = "chusan_game_charge") +class GameCharge: BaseEntity() { + var orderId = 0 + + @Column(unique = true) + var chargeId = 0 + var price = 0 + var startDate: LocalDateTime? = null + var endDate: LocalDateTime? = null + var salePrice = 0 + var saleStartDate: LocalDateTime? = null + var saleEndDate: LocalDateTime? = null +} + +@Entity(name = "ChusanGameEvent") +@Table(name = "chusan_game_event") +class GameEvent: BaseEntity() { + val type = 0 + val startDate: LocalDateTime? = null + val endDate: LocalDateTime? = null + + @JsonIgnore + val enable = false +} + +@Entity(name = "ChusanGameGacha") +@Table(name = "chusan_game_gacha") +class GameGacha : BaseEntity() { + var gachaId = 0 + var gachaName: String? = null + var type = 0 + var kind = 0 + + @JsonProperty("isCeiling") + var isCeiling = false + var ceilingCnt = 0 + var changeRateCnt1 = 0 + var changeRateCnt2 = 0 + var startDate: LocalDateTime? = null + var endDate: LocalDateTime? = null + var noticeStartDate: LocalDateTime? = null + var noticeEndDate: LocalDateTime? = null +} + +@Entity(name = "ChusanGameGachaCard") +@Table(name = "chusan_game_gacha_card") +class GameGachaCard : BaseEntity() { + var gachaId = 0 + var cardId = 0 + var rarity = 0 + var weight = 0 + + @JsonProperty("isPickup") + var isPickup = false +} + +@Entity(name = "ChusanGameLoginBonus") +@Table(name = "chusan_game_login_bonus") +class GameLoginBonus : BaseEntity() { + var version = 0 + var presetId = 0 + var loginBonusId = 0 + var loginBonusName: String? = null + var presentId = 0 + var presentName: String? = null + var itemNum = 0 + var needLoginDayCount = 0 + var loginBonusCategoryType = 0 +} + +@Entity(name = "ChusanGameLoginBonusPreset") +@Table(name = "chusan_game_login_bonus_preset") +class GameLoginBonusPreset : BaseEntity() { + var version = 0 + var presetName: String? = null + var isEnabled = false +} \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameCharge.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameCharge.java deleted file mode 100644 index 07c630a1..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameCharge.java +++ /dev/null @@ -1,46 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.model.gamedata; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Entity(name = "ChusanGameCharge") -@Table(name = "chusan_game_charge") -@Data -@AllArgsConstructor -@NoArgsConstructor -public class GameCharge implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @JsonIgnore - private long id; - - private int orderId; - - @Column(unique = true) - private int chargeId; - - private int price; - - private LocalDateTime startDate; - - private LocalDateTime endDate; - - private int salePrice; - - private LocalDateTime saleStartDate; - - private LocalDateTime saleEndDate; - -} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameEvent.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameEvent.java deleted file mode 100644 index 1d4c38bd..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.model.gamedata; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Entity(name = "ChusanGameEvent") -@Table(name = "chusan_game_event") -@Data -@AllArgsConstructor -@NoArgsConstructor -public class GameEvent implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - private int id; - - private int type; - - private LocalDateTime startDate; - - private LocalDateTime endDate; - - @JsonIgnore - private boolean enable; -} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGacha.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGacha.java deleted file mode 100644 index 62aefdef..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGacha.java +++ /dev/null @@ -1,42 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.model.gamedata; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Entity(name = "ChusanGameGacha") -@Table(name = "chusan_game_gacha") -@Data -@AllArgsConstructor -@NoArgsConstructor -public class GameGacha implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @JsonIgnore - private int id; - private int gachaId; - private String gachaName; - private int type; - private int kind; // 0 - @JsonProperty("isCeiling") - private boolean isCeiling; - private int ceilingCnt; - private int changeRateCnt1; - private int changeRateCnt2; - private LocalDateTime startDate; - private LocalDateTime endDate; - private LocalDateTime noticeStartDate; - private LocalDateTime noticeEndDate; -} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGachaCard.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGachaCard.java deleted file mode 100644 index 50104f82..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGachaCard.java +++ /dev/null @@ -1,34 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.model.gamedata; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Entity(name = "ChusanGameGachaCard") -@Table(name = "chusan_game_gacha_card") -@Data -@AllArgsConstructor -@NoArgsConstructor -public class GameGachaCard implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @JsonIgnore - private int id; - private int gachaId; - private int cardId; - private int rarity; - private int weight; - @JsonProperty("isPickup") - private boolean isPickup; -} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameLoginBonus.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameLoginBonus.java deleted file mode 100644 index 764e4836..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameLoginBonus.java +++ /dev/null @@ -1,31 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.model.gamedata; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -@Entity(name = "ChusanGameLoginBonus") -@Table(name = "chusan_game_login_bonus") -@Data -@AllArgsConstructor -@NoArgsConstructor -public class GameLoginBonus implements Serializable { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @JsonIgnore - private int id; - private int version; - private int presetId; - private int loginBonusId; - private String loginBonusName; - private int presentId; - private String presentName; - private int itemNum; - private int needLoginDayCount; - private int loginBonusCategoryType; -} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameLoginBonusPreset.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameLoginBonusPreset.java deleted file mode 100644 index 8e9754b5..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameLoginBonusPreset.java +++ /dev/null @@ -1,27 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.model.gamedata; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -@Entity(name = "ChusanGameLoginBonusPreset") -@Table(name = "chusan_game_login_bonus_preset") -@Data -@AllArgsConstructor -@NoArgsConstructor -public class GameLoginBonusPreset implements Serializable { - // No one cares about chuni lol - // Maimai and Ongeki all got their login bonus but nothing for chunithm - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @JsonIgnore - private int id; - private int version; - private String presetName; - private boolean isEnabled; -} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.java deleted file mode 100644 index 5e8c2aba..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.java +++ /dev/null @@ -1,50 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.model.request; - -import com.fasterxml.jackson.annotation.JsonProperty; -import icu.samnyan.aqua.sega.chusan.model.gamedata.GameGachaCard; -import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserGacha; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.springframework.lang.Nullable; - -import java.io.Serializable; -import java.util.List; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class UpsertUserGacha implements Serializable { - - @Nullable - private Chu3UserData userData; - - @Nullable - private UserGacha userGacha; - - @Nullable - private List userCharacterList; - - @Nullable - private List userCardList; - - @Nullable - private List gameGachaCardList; - - @Nullable - private List userItemList; - - @Nullable - @JsonProperty("isNewCharacterList") - private String isNewCharacterList; - - @Nullable - @JsonProperty("isNewCardList") - private String isNewCardList; - -} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.kt new file mode 100644 index 00000000..0a5dd488 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.kt @@ -0,0 +1,22 @@ +package icu.samnyan.aqua.sega.chusan.model.request + +import com.fasterxml.jackson.annotation.JsonProperty +import icu.samnyan.aqua.sega.chusan.model.gamedata.GameGachaCard +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData +import icu.samnyan.aqua.sega.chusan.model.userdata.UserGacha +import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem +import java.io.Serializable + +class UpsertUserGacha : Serializable { + var userData: Chu3UserData? = null + var userGacha: UserGacha? = null + var userCharacterList: List? = null + var userCardList: List? = null + var gameGachaCardList: List? = null + var userItemList: List? = null + + @JsonProperty("isNewCharacterList") + var isNewCharacterList: String? = null + @JsonProperty("isNewCardList") + var isNewCardList: String? = null +} From 9197b3ca930501185f5db8ee238132f34daa9b0c Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sat, 4 Jan 2025 20:14:38 -0500 Subject: [PATCH 46/67] [O] Todo :( --- .../aqua/sega/chusan/handler/ChusanApis.kt | 93 +++++++++---------- .../sega/chusan/handler/ChusanUpsertApis.kt | 28 +++--- .../aqua/sega/chusan/model/Chu3Repos.kt | 5 +- .../chusan/model/request/UpsertUserGacha.kt | 2 +- .../chusan/model/userdata/UserLoginBonus.kt | 1 + 5 files changed, 64 insertions(+), 65 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 d0544720..030b6299 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 @@ -6,11 +6,8 @@ import icu.samnyan.aqua.sega.chusan.ChusanController import icu.samnyan.aqua.sega.chusan.ChusanData import icu.samnyan.aqua.sega.chusan.model.request.UserCMissionResp import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem -import icu.samnyan.aqua.sega.chusan.model.userdata.UserLoginBonus import icu.samnyan.aqua.sega.chusan.model.userdata.UserMusicDetail import icu.samnyan.aqua.sega.general.model.response.UserRecentRating -import java.time.LocalDateTime -import java.time.ZoneOffset import java.time.format.DateTimeFormatter @Suppress("UNCHECKED_CAST") @@ -240,51 +237,51 @@ fun ChusanController.chusanInit() { // TODO: Test login bonus "GameLogin" { - fun process() { - val u = db.userData.findByCard_ExtId(uid)() ?: return - db.userData.save(u.apply { lastLoginDate = LocalDateTime.now() }) - - if (!props.loginBonusEnable) return - val bonusList = db.gameLoginBonusPresets.findLoginBonusPresets(1, 1) - - bonusList.forEach { preset -> - // Check if a user already has some progress and if not, add the login bonus entry - val bonus = db.userLoginBonus.findLoginBonus(uid.int, 1, preset.id)() - ?: UserLoginBonus(1, uid.int, preset.id).let { db.userLoginBonus.save(it) } - if (bonus.isFinished) return@forEach - - // last login is 24 hours+ ago - if (bonus.lastUpdateDate.toEpochSecond(ZoneOffset.ofHours(0)) < - (LocalDateTime.now().minusHours(24).toEpochSecond(ZoneOffset.ofHours(0))) - ) { - var bCount = bonus.bonusCount + 1 - val lastUpdate = LocalDateTime.now() - val allLoginBonus = db.gameLoginBonus.findGameLoginBonus(1, preset.id) - .ifEmpty { return@forEach } - val maxNeededDays = allLoginBonus[0].needLoginDayCount - - // if all items are redeemed, then don't show the login bonuses. - var finished = false - if (bCount > maxNeededDays) { - if (preset.id < 3000) bCount = 1 - else finished = true - } - db.gameLoginBonus.findByRequiredDays(1, preset.id, bCount)()?.let { - db.userItem.save(UserItem(6, it.presentId, it.itemNum).apply { user = u }) - } - val toSave = db.userLoginBonus.findLoginBonus(uid.int, 1, preset.id)() - ?: UserLoginBonus().apply { user = uid.int; presetId = preset.id; version = 1 } - - db.userLoginBonus.save(toSave.apply { - bonusCount = bCount - lastUpdateDate = lastUpdate - isWatched = false - isFinished = finished - }) - } - } - } - process() +// fun process() { +// val u = db.userData.findByCard_ExtId(uid)() ?: return +// db.userData.save(u.apply { lastLoginDate = LocalDateTime.now() }) +// +// if (!props.loginBonusEnable) return +// val bonusList = db.gameLoginBonusPresets.findLoginBonusPresets(1, 1) +// +// bonusList.forEach { preset -> +// // Check if a user already has some progress and if not, add the login bonus entry +// val bonus = db.userLoginBonus.findLoginBonus(uid.int, 1, preset.id)() +// ?: UserLoginBonus(1, uid.int, preset.id).let { db.userLoginBonus.save(it) } +// if (bonus.isFinished) return@forEach +// +// // last login is 24 hours+ ago +// if (bonus.lastUpdateDate.toEpochSecond(ZoneOffset.ofHours(0)) < +// (LocalDateTime.now().minusHours(24).toEpochSecond(ZoneOffset.ofHours(0))) +// ) { +// var bCount = bonus.bonusCount + 1 +// val lastUpdate = LocalDateTime.now() +// val allLoginBonus = db.gameLoginBonus.findGameLoginBonus(1, preset.id) +// .ifEmpty { return@forEach } +// val maxNeededDays = allLoginBonus[0].needLoginDayCount +// +// // if all items are redeemed, then don't show the login bonuses. +// var finished = false +// if (bCount > maxNeededDays) { +// if (preset.id < 3000) bCount = 1 +// else finished = true +// } +// db.gameLoginBonus.findByRequiredDays(1, preset.id, bCount)()?.let { +// db.userItem.save(UserItem(6, it.presentId, it.itemNum).apply { user = u }) +// } +// val toSave = db.userLoginBonus.findLoginBonus(uid.int, 1, preset.id)() +// ?: UserLoginBonus().apply { user = uid.int; presetId = preset.id; version = 1 } +// +// db.userLoginBonus.save(toSave.apply { +// bonusCount = bCount +// lastUpdateDate = lastUpdate +// isWatched = false +// isFinished = finished +// }) +// } +// } +// } +// process() """{"returnCode":"1"}""" } 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 03f6a2e5..e5c7f58d 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 @@ -3,10 +3,12 @@ package icu.samnyan.aqua.sega.chusan.handler import ext.* import icu.samnyan.aqua.sega.chusan.ChusanController import icu.samnyan.aqua.sega.chusan.model.request.UpsertUserAll -import icu.samnyan.aqua.sega.chusan.model.userdata.* +import icu.samnyan.aqua.sega.chusan.model.userdata.UserCMission +import icu.samnyan.aqua.sega.chusan.model.userdata.UserCMissionProgress +import icu.samnyan.aqua.sega.chusan.model.userdata.UserCharge +import icu.samnyan.aqua.sega.chusan.model.userdata.UserGeneralData import icu.samnyan.aqua.sega.general.model.response.UserRecentRating import java.nio.charset.StandardCharsets -import java.time.LocalDateTime @Suppress("UNCHECKED_CAST") fun ChusanController.upsertApiInit() { @@ -99,17 +101,17 @@ fun ChusanController.upsertApiInit() { id = db.userDuel.findByUserAndDuelId(u, duelId)?.id ?: 0 }) } // Need testing - userLoginBonusList?.let { list -> - db.userLoginBonus.saveAll(list.distinctBy { it["presetId"] as String }.map { - val id = it["presetId"]!!.int - (db.userLoginBonus.findLoginBonus(uid.int, 1, id)() ?: UserLoginBonus()).apply { - user = u.id.toInt() - presetId = id - lastUpdateDate = LocalDateTime.now() - isWatched = true - } - }) - } +// userLoginBonusList?.let { list -> +// db.userLoginBonus.saveAll(list.distinctBy { it["presetId"] as String }.map { +// val id = it["presetId"]!!.int +// (db.userLoginBonus.findLoginBonus(uid.int, 1, id)() ?: UserLoginBonus()).apply { +// user = u.id.toInt() +// presetId = id +// lastUpdateDate = LocalDateTime.now() +// isWatched = true +// } +// }) +// } req.userCMissionList?.forEach { d -> (db.userCMission.findByUser_Card_ExtIdAndMissionId(uid, d.missionId)() 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 23f7c946..cc080c63 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 @@ -5,7 +5,6 @@ package icu.samnyan.aqua.sega.chusan.model import icu.samnyan.aqua.net.games.GenericPlaylogRepo import icu.samnyan.aqua.net.games.GenericUserDataRepo import icu.samnyan.aqua.net.games.IUserRepo -import icu.samnyan.aqua.sega.chusan.model.gamedata.* import icu.samnyan.aqua.sega.chusan.model.userdata.* import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable @@ -37,7 +36,7 @@ interface Chu3UserLoginBonusRepo : JpaRepository { value = "select * from chusan_user_login_bonus where user = ?1 and version = ?2 and preset_id = ?3 limit 1", nativeQuery = true ) - fun findLoginBonus(userId: Int, version: Int, presetId: Int): Optional + fun findLoginBonus(userId: Int, version: Int, presetId: Long): Optional } interface Chu3UserActivityRepo : Chu3UserLinked { @@ -144,7 +143,7 @@ interface Chu3GameGachaCardRepo : JpaRepository { interface Chu3GameGachaRepo : JpaRepository -interface Chu3GameLoginBonusPresetsRepo : JpaRepository { +interface Chu3GameLoginBonusPresetsRepo : JpaRepository { @Query( value = "select * from chusan_game_login_bonus_preset where version = ?1 and is_enabled = ?2", nativeQuery = true diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.kt index 0a5dd488..92c3ab39 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.kt @@ -1,7 +1,7 @@ package icu.samnyan.aqua.sega.chusan.model.request import com.fasterxml.jackson.annotation.JsonProperty -import icu.samnyan.aqua.sega.chusan.model.gamedata.GameGachaCard +import icu.samnyan.aqua.sega.chusan.model.GameGachaCard import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData import icu.samnyan.aqua.sega.chusan.model.userdata.UserGacha import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserLoginBonus.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserLoginBonus.kt index f95489ef..996da40f 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserLoginBonus.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserLoginBonus.kt @@ -10,6 +10,7 @@ import java.time.LocalDateTime @Table(name = "chusan_user_login_bonus") class UserLoginBonus( var version: Int = 0, + // TODO: Fix this (should be User linked) var user: Int = 0, var presetId: Int = 0, var bonusCount: Int = 0, From aed5c20700f870e6aca277c80ab0cc5b9e030dd0 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sat, 4 Jan 2025 21:48:11 -0500 Subject: [PATCH 47/67] [F] Fix event return data type mismatch --- .../aqua/sega/chusan/model/Chu3GameData.kt | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3GameData.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3GameData.kt index b3a36250..2397e94e 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3GameData.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3GameData.kt @@ -3,11 +3,17 @@ package icu.samnyan.aqua.sega.chusan.model import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonProperty import icu.samnyan.aqua.net.games.BaseEntity -import jakarta.persistence.Column -import jakarta.persistence.Entity -import jakarta.persistence.Table +import jakarta.persistence.* import java.time.LocalDateTime + +// BaseEntity does not expose id to json, but IdExposedEntity does +@MappedSuperclass +class IdExposedEntity { + @Id + var id: Long = 0 +} + @Entity(name = "ChusanGameCharge") @Table(name = "chusan_game_charge") class GameCharge: BaseEntity() { @@ -25,7 +31,7 @@ class GameCharge: BaseEntity() { @Entity(name = "ChusanGameEvent") @Table(name = "chusan_game_event") -class GameEvent: BaseEntity() { +class GameEvent: IdExposedEntity() { val type = 0 val startDate: LocalDateTime? = null val endDate: LocalDateTime? = null @@ -36,7 +42,7 @@ class GameEvent: BaseEntity() { @Entity(name = "ChusanGameGacha") @Table(name = "chusan_game_gacha") -class GameGacha : BaseEntity() { +class GameGacha : IdExposedEntity() { var gachaId = 0 var gachaName: String? = null var type = 0 @@ -55,7 +61,7 @@ class GameGacha : BaseEntity() { @Entity(name = "ChusanGameGachaCard") @Table(name = "chusan_game_gacha_card") -class GameGachaCard : BaseEntity() { +class GameGachaCard : IdExposedEntity() { var gachaId = 0 var cardId = 0 var rarity = 0 @@ -67,7 +73,7 @@ class GameGachaCard : BaseEntity() { @Entity(name = "ChusanGameLoginBonus") @Table(name = "chusan_game_login_bonus") -class GameLoginBonus : BaseEntity() { +class GameLoginBonus : IdExposedEntity() { var version = 0 var presetId = 0 var loginBonusId = 0 @@ -81,7 +87,7 @@ class GameLoginBonus : BaseEntity() { @Entity(name = "ChusanGameLoginBonusPreset") @Table(name = "chusan_game_login_bonus_preset") -class GameLoginBonusPreset : BaseEntity() { +class GameLoginBonusPreset : IdExposedEntity() { var version = 0 var presetName: String? = null var isEnabled = false From 877c23b9d7eba4e4020d27e76fd7c1fe4dfda666 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sat, 4 Jan 2025 21:55:13 -0500 Subject: [PATCH 48/67] [+] Fav music fix --- .../migration/mariadb/V1000_29__chusan_favorite_music_fix.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/main/resources/db/migration/mariadb/V1000_29__chusan_favorite_music_fix.sql diff --git a/src/main/resources/db/migration/mariadb/V1000_29__chusan_favorite_music_fix.sql b/src/main/resources/db/migration/mariadb/V1000_29__chusan_favorite_music_fix.sql new file mode 100644 index 00000000..f45951fe --- /dev/null +++ b/src/main/resources/db/migration/mariadb/V1000_29__chusan_favorite_music_fix.sql @@ -0,0 +1,3 @@ +DELETE FROM chusan_user_general_data WHERE property_key = 'favorite_music' AND property_value = '-1'; +DELETE FROM chusan_user_general_data WHERE property_key = 'favorite_music' AND property_value = '0'; +DELETE FROM chusan_user_general_data WHERE property_key = 'favorite_music' AND property_value = ''; From 73792e4294f0aec52ea7ebdcdd51ca304cf21b20 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sat, 4 Jan 2025 22:12:41 -0500 Subject: [PATCH 49/67] [+] Store net battle log at upsert --- .../icu/samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt | 2 ++ src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3Repos.kt | 3 +++ 2 files changed, 5 insertions(+) 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 e5c7f58d..9ddd8b2d 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 @@ -39,6 +39,7 @@ fun ChusanController.upsertApiInit() { listOfNotNull( userPlaylogList, userGameOption, userMapAreaList, userCharacterList, userItemList, userMusicDetailList, userActivityList, userChargeList, userCourseList, userDuelList, + userNetBattlelogList ).flatten().forEach { it.user = u } // Ratings @@ -62,6 +63,7 @@ fun ChusanController.upsertApiInit() { // Playlog userPlaylogList?.let { db.userPlaylog.saveAll(it) } + userNetBattlelogList?.let { db.netBattleLog.saveAll(it) } // List data userGameOption?.get(0)?.let { obj -> 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 cc080c63..f9b82448 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 @@ -127,6 +127,8 @@ interface Chu3UserCMissionProgressRepo : Chu3UserLinked { fun findByUser_Card_ExtIdAndMissionIdAndOrder(extId: Long, missionId: Int, order: Int): Optional } +interface Chu3NetBattleLogRepo : Chu3UserLinked + interface Chu3MatchingMemberRepo : JpaRepository { fun existsByUserIdAndUserName(userId: Long, userName: String): Boolean } @@ -184,6 +186,7 @@ class Chu3Repos( val userPlaylog: Chu3UserPlaylogRepo, val userCMission: Chu3UserCMissionRepo, val userCMissionProgress: Chu3UserCMissionProgressRepo, + val netBattleLog: Chu3NetBattleLogRepo, val matchingMember: Chu3MatchingMemberRepo, val gameCharge: Chu3GameChargeRepo, val gameEvent: Chu3GameEventRepo, From 8b2518a25d851e5f2a8323b279b1bc25da0b4a3e Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 00:38:54 -0500 Subject: [PATCH 50/67] [+] More docs on matching --- docs/chu3-national-matching.md | 24 +++++++++++++++++++++++- docs/img/chu3-matching-error.png | Bin 0 -> 303793 bytes docs/{ => img}/chu3-matching.png | Bin 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 docs/img/chu3-matching-error.png rename docs/{ => img}/chu3-matching.png (100%) diff --git a/docs/chu3-national-matching.md b/docs/chu3-national-matching.md index ee9602ff..c20c9d5c 100644 --- a/docs/chu3-national-matching.md +++ b/docs/chu3-national-matching.md @@ -14,7 +14,7 @@ This is tested on Chusan 2.27. ## Setting Up -![](chu3-matching.png) +![](img/chu3-matching.png) 1. Go to the AquaNet website and set your matching server to "Yukiotoko" (To go to the settings page, click on the gear icon in the top right corner of your profile, switch to chuni tab, scroll down, click "Select Matching Server") @@ -38,6 +38,28 @@ netsh advfirewall firewall add rule name="Chunithm National Matching Inbound" di netsh advfirewall firewall add rule name="Chunithm National Matching Outbound" dir=out action=allow profile=any program="%gamedirectory%" enable=yes ``` +## Troubleshooting + +**Q: Game crashes when entering match mode** + +Make sure you are using Dniel97's segatools. + +**Q: After matching, timer shows 999 seconds and nobody can start** + +Make sure you have patched your `chusanApp.exe` correctly. + +**Q: Online battle icon gray / "Unable to select after the event time"** + +Make sure your time zone is set to JST (UTC+9). + +**Q: This window show up when joining.** + +![](img/chu3-matching-error.png) + +If there is only one player, then yea it's because there are not enough players. +Otherwise, it's because one of the players has a bad network environment (e.g. Symmetric NAT). +Try again with someone who played this mode before, if it still doesn't work, then it's probably you. + ## How to Play When you enter the matching mode, it will assign to you a matching room if other people are online, or create a new room otherwise. diff --git a/docs/img/chu3-matching-error.png b/docs/img/chu3-matching-error.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb0a43c52881196966c6c7d064b287d95d10879 GIT binary patch literal 303793 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

-BeE{fEf?^ZG^_=>6`jQB|AT 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%0AXI^Yi{qkC~k4`h&rQB$}4dAl(arXFvTW$S@ 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 m!c%Yiz4e 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

r$DTvyDl0Iu6I*HdTFO=ZN)G*OSDJDtaG#fuu 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

+Xz^bJ+Kk|g6;dBP)X8HY09Gi1N0-qNF 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 z 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

R6Kp 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 literal 0 HcmV?d00001 diff --git a/docs/chu3-matching.png b/docs/img/chu3-matching.png similarity index 100% rename from docs/chu3-matching.png rename to docs/img/chu3-matching.png From 41636b09dbf60c23efa70eb39ae8e6c860214abc Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 01:14:50 -0500 Subject: [PATCH 51/67] [+] ARRR --- docs/chu3-national-matching.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/chu3-national-matching.md b/docs/chu3-national-matching.md index c20c9d5c..eafd6639 100644 --- a/docs/chu3-national-matching.md +++ b/docs/chu3-national-matching.md @@ -22,11 +22,12 @@ This is tested on Chusan 2.27. If you're using fufubot segatools, please override it with Dniel97's version (don't forget to update `segatools.ini`). 3. Patch your `chusanApp.exe` using [Two-Torial's open-source patcher](https://patcher.two-torial.xyz/) (Make sure you disable "Set all timer to 999", enable "No encryption", "No TLS", "Patch for head-to-head play") -4. Make sure you only have official options. +4. Make sure you only have official options, but add the option [ARRR](https://pixeldrain.com/u/D2jjN3of). (Remove things like A999, AOMN, etc.) 5. Pet your cat 🐈 6. Launch! + ### Firewall Rules Below is a simple command to add firewall rules for Chunithm. From 96fb815bd8174379ad1dea957477a7b2329cb9ad Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 01:20:09 -0500 Subject: [PATCH 52/67] [F] Fix username encoding in net battle log --- src/main/java/ext/Ext.kt | 2 ++ .../aqua/sega/chusan/handler/ChusanUpsertApis.kt | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/ext/Ext.kt b/src/main/java/ext/Ext.kt index 4ec7ee41..d9480486 100644 --- a/src/main/java/ext/Ext.kt +++ b/src/main/java/ext/Ext.kt @@ -18,6 +18,7 @@ import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity.BodyBuilder import org.springframework.web.bind.annotation.* import java.lang.reflect.Field +import java.nio.charset.StandardCharsets import java.nio.file.Path import java.security.MessageDigest import java.time.LocalDate @@ -211,6 +212,7 @@ fun Str.center(width: Int, padChar: Char = ' ') = padStart((length + width) / 2, fun Str.splitLines() = replace("\r\n", "\n").split('\n') @OptIn(ExperimentalStdlibApi::class) fun Str.md5() = MD5.digest(toByteArray(Charsets.UTF_8)).toHexString() +fun Str.fromChusanUsername() = String(this.toByteArray(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8) // Coroutine suspend fun async(block: suspend kotlinx.coroutines.CoroutineScope.() -> T): T = withContext(Dispatchers.IO) { block() } 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 9ddd8b2d..73bdc10c 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 @@ -8,7 +8,6 @@ import icu.samnyan.aqua.sega.chusan.model.userdata.UserCMissionProgress import icu.samnyan.aqua.sega.chusan.model.userdata.UserCharge import icu.samnyan.aqua.sega.chusan.model.userdata.UserGeneralData import icu.samnyan.aqua.sega.general.model.response.UserRecentRating -import java.nio.charset.StandardCharsets @Suppress("UNCHECKED_CAST") fun ChusanController.upsertApiInit() { @@ -29,7 +28,7 @@ fun ChusanController.upsertApiInit() { val u = (userData?.get(0) ?: return@api null).apply { id = oldUser?.id ?: 0 card = oldUser?.card ?: us.cardRepo.findByExtId(uid).expect("Card not found") - userName = String(userName.toByteArray(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8) + userName = userName.fromChusanUsername() userNameEx = "" }.also { db.userData.saveAndFlush(it) } @@ -63,7 +62,12 @@ fun ChusanController.upsertApiInit() { // Playlog userPlaylogList?.let { db.userPlaylog.saveAll(it) } - userNetBattlelogList?.let { db.netBattleLog.saveAll(it) } + userNetBattlelogList?.let { db.netBattleLog.saveAll(it.mapApply { + selectUserName = selectUserName.fromChusanUsername() + opponentUserName1 = opponentUserName1.fromChusanUsername() + opponentUserName2 = opponentUserName2.fromChusanUsername() + opponentUserName3 = opponentUserName3.fromChusanUsername() + }) } // List data userGameOption?.get(0)?.let { obj -> From 56e424c29bb52d072336816d6567dc7380213602 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 02:13:55 -0500 Subject: [PATCH 53/67] [+] Mut --- src/main/java/ext/Ext.kt | 6 +++++- src/main/java/icu/samnyan/aqua/net/Bot.kt | 4 ++-- src/main/java/icu/samnyan/aqua/net/Safety.kt | 5 +++-- .../java/icu/samnyan/aqua/net/games/GameApiController.kt | 4 ++-- src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt | 3 ++- src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt | 2 +- src/main/java/icu/samnyan/aqua/sega/allnet/AllNet.kt | 2 +- .../icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt | 4 ++-- .../java/icu/samnyan/aqua/sega/general/BaseHandler.kt | 2 +- .../icu/samnyan/aqua/sega/general/IntegerListConverter.kt | 5 +++-- .../samnyan/aqua/sega/maimai2/Maimai2ServletController.kt | 8 ++++---- src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt | 8 ++++---- .../samnyan/aqua/sega/wacca/model/db/WaccaUserModels.kt | 2 +- 13 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/main/java/ext/Ext.kt b/src/main/java/ext/Ext.kt index d9480486..a94651df 100644 --- a/src/main/java/ext/Ext.kt +++ b/src/main/java/ext/Ext.kt @@ -190,7 +190,7 @@ val Any?.truthy get() = when (this) { fun ls(vararg args: T) = args.toList() inline fun arr(vararg args: T) = arrayOf(*args) operator fun Map.plus(map: Map) = - (if (this is MutableMap) this else toMutableMap()).apply { putAll(map) } + (if (this is MutableMap) this else mut).apply { putAll(map) } operator fun MutableMap.plusAssign(map: Map) { putAll(map) } fun Map.vNotNull(): Map = filterValues { it != null }.mapValues { it.value!! } fun MutableList.popAll(list: List) = list.also { removeAll(it) } @@ -201,6 +201,10 @@ fun Map.recursiveNotNull(): Map = mapNotNull { (k, v) - k to if (v is Map<*, *>) (v as Map).recursiveNotNull() else v }.toMap() as Map +val List.mut get() = toMutableList() +val Map.mut get() = toMutableMap() +val Set.mut get() = toMutableSet() + // Optionals operator fun Optional.invoke(): T? = orElse(null) fun Optional.expect(message: Str = "Value is not present") = orElseGet { (400 - message) } diff --git a/src/main/java/icu/samnyan/aqua/net/Bot.kt b/src/main/java/icu/samnyan/aqua/net/Bot.kt index c7f0bd5b..96b9b8d6 100644 --- a/src/main/java/icu/samnyan/aqua/net/Bot.kt +++ b/src/main/java/icu/samnyan/aqua/net/Bot.kt @@ -57,11 +57,11 @@ class BotController( us.cardRepo.findByExtId(cardId.long)(), us.cardRepo.findByLuid(cardId)(), us.cardRepo.findById(cardId.long)(), - ).toMutableList() + ).mut cards += cards.flatMap { (it.aquaUser?.cards ?: emptyList()) + listOfNotNull(it.aquaUser?.ghostCard) } - cards = cards.distinctBy { it.id }.toMutableList() + cards = cards.distinctBy { it.id }.mut return cards.map { card -> // Find all games played by this card diff --git a/src/main/java/icu/samnyan/aqua/net/Safety.kt b/src/main/java/icu/samnyan/aqua/net/Safety.kt index ecf6bf6a..04588caf 100644 --- a/src/main/java/icu/samnyan/aqua/net/Safety.kt +++ b/src/main/java/icu/samnyan/aqua/net/Safety.kt @@ -1,6 +1,7 @@ package icu.samnyan.aqua.net import ext.HTTP +import ext.mut import ext.toJson import icu.samnyan.aqua.net.games.BaseEntity import io.ktor.client.call.* @@ -54,8 +55,8 @@ class AquaNetSafetyService( */ suspend fun isSafeBatch(rawContents: List): List { val contents = rawContents.map { Normalizer.normalize(it, Normalizer.Form.NFKC) } - val origMap = safety.findAll().associateBy { it.content }.toMutableMap() - val map = safety.findAll().associateBy { it.content.lowercase().trim() }.toMutableMap() + val origMap = safety.findAll().associateBy { it.content }.mut + val map = safety.findAll().associateBy { it.content.lowercase().trim() }.mut // Process unseen content with OpenAI val news = contents.filter { it.lowercase().trim() !in map && it !in contents }.map { inp -> diff --git a/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt b/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt index fae5e98e..e37d2569 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt @@ -146,13 +146,13 @@ abstract class GameApiController(val name: String, userDataClass: plays.forEach { play -> val lvl = musicMapping[play.musicId]?.notes?.getOrNull(if (play.level == 10) 0 else play.level)?.lv ?: return@forEach shownRanks.find { (s, _) -> play.achievement > s }?.let { (_, v) -> - val ranks = detailedRanks.getOrPut(lvl.toInt()) { rankMap.toMutableMap() } + val ranks = detailedRanks.getOrPut(lvl.toInt()) { rankMap.mut } ranks[v] = ranks[v]!! + 1 } } // Collapse detailed ranks to get non-detailed ranks map - val ranks = shownRanks.associate { (_, v) -> v to 0 }.toMutableMap().also { ranks -> + val ranks = shownRanks.associate { (_, v) -> v to 0 }.mut.also { ranks -> plays.forEach { play -> shownRanks.find { (s, _) -> play.achievement > s }?.let { (_, v) -> ranks[v] = ranks[v]!! + 1 } } diff --git a/src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt b/src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt index 0bd09f87..095823eb 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt @@ -2,6 +2,7 @@ package icu.samnyan.aqua.net.games import ext.isoDate import ext.minus +import ext.mut import java.time.LocalDate const val LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + @@ -60,7 +61,7 @@ fun findTrend(log: List): List { val trend = d.distinctBy { it.date } .map { TrendOut(it.date, maxRating[it.date] ?: 0, playCounts[it.date] ?: 0) } - .sortedBy { it.date }.toMutableList() + .sortedBy { it.date }.mut // Fill in the missing dates (min date and current date) trend[0].let { if (it.date > minDate) trend.add(0, TrendOut(minDate, 0, 0)) } diff --git a/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt b/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt index cbab54ed..d51eabc4 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt @@ -127,7 +127,7 @@ class Maimai2( user = repos.userData.findByCardExtId(myCard.extId).orElse(null) ?: (404 - "User not found") propertyKey = "favorite_rival" } - val myRivalList = myRival.propertyValue.split(',').filter { it.isNotEmpty() }.toMutableSet() + val myRivalList = myRival.propertyValue.split(',').filter { it.isNotEmpty() }.mut if (isAdd && myRivalList.size >= 4) { (400 - "Rival list is full") diff --git a/src/main/java/icu/samnyan/aqua/sega/allnet/AllNet.kt b/src/main/java/icu/samnyan/aqua/sega/allnet/AllNet.kt index f7375110..d02fd4be 100644 --- a/src/main/java/icu/samnyan/aqua/sega/allnet/AllNet.kt +++ b/src/main/java/icu/samnyan/aqua/sega/allnet/AllNet.kt @@ -139,7 +139,7 @@ class AllNet( val ver = reqMap["ver"] ?: "1.0" val formatVer = reqMap["format_ver"] ?: "" - val resp = props.map.toMutableMap() + mapOf( + val resp = props.map.mut + mapOf( "uri" to switchUri(localAddr, localPort, gameId, ver, session), "host" to props.host.ifBlank { localAddr }, ) 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 030b6299..e446975e 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 @@ -91,7 +91,7 @@ fun ChusanController.chusanInit() { data["nextIndex"] = rawIndex % 10000000000L mapOf("itemKind" to kind) grabs { // TODO: All unlock - val items = db.userItem.findAllByUser_Card_ExtIdAndItemKind(uid, kind).toMutableList() + val items = db.userItem.findAllByUser_Card_ExtIdAndItemKind(uid, kind).mut // Check game options db.userData.findByCard_ExtId(uid)()?.card?.aquaUser?.gameOptions?.let { @@ -146,7 +146,7 @@ fun ChusanController.chusanInit() { // Compatibility: Older chusan uses boolean for isSuccess fun checkAncient(d: List) = data["version"]?.double?.let { if (it >= 2.15) d else d.map { - d.toJson().jsonMap().toMutableMap().apply { this["isSuccess"] = this["isSuccess"].truthy } + d.toJson().jsonMap().mut.apply { this["isSuccess"] = this["isSuccess"].truthy } } } ?: d db.userMusicDetail.findByUser_Card_ExtId(uid).groupBy { it.musicId } diff --git a/src/main/java/icu/samnyan/aqua/sega/general/BaseHandler.kt b/src/main/java/icu/samnyan/aqua/sega/general/BaseHandler.kt index 50726065..1b0d6e88 100644 --- a/src/main/java/icu/samnyan/aqua/sega/general/BaseHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/general/BaseHandler.kt @@ -62,7 +62,7 @@ abstract class MeowApi(val serialize: (String, Any?) -> String) { } else pageCache[cacheKey] = millis() to list - (mapOf("userId" to uid, "length" to lst.size, "nextIndex" to iAfter, key to lst) + add).toMutableMap() + (mapOf("userId" to uid, "length" to lst.size, "nextIndex" to iAfter, key to lst) + add).mut .also { p.post?.invoke(it) } } fun String.paged(key: String, fn: PagedHandler) = pagedWithKind(key) { PagedProcessor(null, fn) } diff --git a/src/main/java/icu/samnyan/aqua/sega/general/IntegerListConverter.kt b/src/main/java/icu/samnyan/aqua/sega/general/IntegerListConverter.kt index ad047057..74adde13 100644 --- a/src/main/java/icu/samnyan/aqua/sega/general/IntegerListConverter.kt +++ b/src/main/java/icu/samnyan/aqua/sega/general/IntegerListConverter.kt @@ -1,11 +1,12 @@ package icu.samnyan.aqua.sega.general +import ext.ls import jakarta.persistence.AttributeConverter import jakarta.persistence.Converter @Converter class IntegerListConverter : AttributeConverter, String> { override fun convertToDatabaseColumn(lst: List?) = lst?.joinToString(";") ?: "" - override fun convertToEntityAttribute(str: String?) = if (str.isNullOrBlank()) mutableListOf() else - str.split(';').map { it.toInt() }.toMutableList() + override fun convertToEntityAttribute(str: String?) = if (str.isNullOrBlank()) ls() else + str.split(';').map { it.toInt() } } diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2ServletController.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2ServletController.kt index 22e9d5f1..6834233a 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2ServletController.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/Maimai2ServletController.kt @@ -319,17 +319,17 @@ class Maimai2ServletController( "GetUserScoreRankingApi", "UpsertClientBookkeepingApi", "UpsertClientSettingApi", "UpsertClientTestmodeApi", "UpsertClientUploadApi", "Ping", "RemoveTokenApi", "CMLoginApi", "CMLogoutApi", "CMUpsertBuyCardApi", "GetGameSettingApi", "GetGameKaleidxScopeApi", "GetGameMusicScoreApi", - "GetUserKaleidxScopeApi", "GetUserNewItemApi", "GetUserNewItemListApi").toMutableList() + "GetUserKaleidxScopeApi", "GetUserNewItemApi", "GetUserNewItemListApi").mut - val noopEndpoint = endpointList.popAll("GetUserScoreRankingApi", "UpsertClientBookkeepingApi", + val noopEndpoint = setOf("GetUserScoreRankingApi", "UpsertClientBookkeepingApi", "UpsertClientSettingApi", "UpsertClientTestmodeApi", "UpsertClientUploadApi", "Ping", "RemoveTokenApi", "CMLoginApi", "CMLogoutApi", "CMUpsertBuyCardApi", "UserLogoutApi", "GetGameMapAreaConditionApi", - "UpsertUserChargelogApi") + "UpsertUserChargelogApi").also { endpointList.removeAll(it) } val staticEndpoint = mapOf( "CreateTokenApi" to """{"Bearer":"meow"}""", "CMUpsertUserPrintlogApi" to """{"returnCode":1,"orderId":"0","serialId":"FAKECARDIMAG12345678"}""", - ).also { endpointList.popAll(it.keys.toList()) } + ).also { endpointList.removeAll(it.keys.toSet()) } val members = this::class.declaredMemberProperties val handlers: Map = endpointList.associateWith { api -> 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 c5cb14e4..a1496ab2 100644 --- a/src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt +++ b/src/main/java/icu/samnyan/aqua/sega/wacca/WaccaServer.kt @@ -196,7 +196,7 @@ fun WaccaServer.init() { "user/status/GetDetail" api@ { _, (uid) -> val u = user(uid) ?: return@api "[]" val o = options(u) - val items = rp.item.findByUser(u).groupBy { it.type }.toMutableMap() + val items = rp.item.findByUser(u).groupBy { it.type }.mut val scores = rp.bestScore.findByUser(u) val scoreMap = scores.associateBy { it.musicId to it.level } val gates = rp.gate.findByUser(u) @@ -343,7 +343,7 @@ fun WaccaServer.init() { ?: WcUserScore().apply { user = u; musicId = pl.musicId; level = pl.level }).apply { grades[WaccaGrades.valueMap[pl.grade]?.ordinal ?: (400 - "Grade ${pl.grade} invalid")]++ - clears = clears.zip(pl.clears()) { a, b -> a + b }.toMutableList() + clears = clears.zip(pl.clears()) { a, b -> a + b }.mut achievement = max(achievement, pl.achievement) bestCombo = max(bestCombo, pl.maxCombo) lowestMissCt = min(lowestMissCt, pl.judgements[3]) @@ -425,7 +425,7 @@ fun WaccaServer.init() { "user/status/update" empty { req, (uid, playType, items, isContinue, isFirstPlayFree, itemsUsed, lastSong) -> val u = user(uid) ?: (404 - "User not found") - u.lastSongInfo = (lastSong as List).toMutableList() + u.lastSongInfo = (lastSong as List).mut afterPlay(u, items as List>, playType.int(), req.appVersion) } @@ -462,7 +462,7 @@ fun WaccaServer.init() { clearStatus = clearType.int() // 0..3: Fail, Blue, Silver, Gold clearSongCt = clearCt.int() playCt++ - if (scores.sum() > s.songScores.sum()) songScores = scores.toMutableList() + if (scores.sum() > s.songScores.sum()) songScores = scores.mut }) if (dan.int() > u.danLevel || (dan.int() == u.danLevel && clearType.int() > u.danType)) { diff --git a/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUserModels.kt b/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUserModels.kt index bc68ea9e..349e3e17 100644 --- a/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUserModels.kt +++ b/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUserModels.kt @@ -101,7 +101,7 @@ class WcUserScore : WaccaUserEntity() { var clears: MutableList = mutableListOf(0, 0, 0, 0, 0) // Played, Clear, Full Combo, Missless, All Marv @Convert(converter = IntegerListConverter::class) - var grades: MutableList = (1..13).map { 0 }.toMutableList() // From D to SSS+ + var grades: MutableList = (1..13).map { 0 }.mut // From D to SSS+ var bestCombo = 0 var lowestMissCt = Int.MAX_VALUE var rating = 0 From d25678d7b42f41c9d23bf39304db7ca8c9a9d82b Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 02:14:16 -0500 Subject: [PATCH 54/67] [+] UserMisc --- .../aqua/sega/chusan/model/Chu3Repos.kt | 6 ++---- .../sega/chusan/model/request/UpsertUserAll.kt | 4 ++-- .../model/userdata/Chu3MatchingMember.kt | 7 +------ .../sega/chusan/model/userdata/Chu3UserMisc.kt | 18 ++++++++++++++++++ .../mariadb/V1000_30__chusan_user_misc.sql | 17 +++++++++++++++++ 5 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserMisc.kt create mode 100644 src/main/resources/db/migration/mariadb/V1000_30__chusan_user_misc.sql 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 f9b82448..51d4b597 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 @@ -129,9 +129,7 @@ interface Chu3UserCMissionProgressRepo : Chu3UserLinked { interface Chu3NetBattleLogRepo : Chu3UserLinked -interface Chu3MatchingMemberRepo : JpaRepository { - fun existsByUserIdAndUserName(userId: Long, userName: String): Boolean -} +interface Chu3UserMiscRepo : Chu3UserLinked interface Chu3GameChargeRepo : JpaRepository @@ -187,7 +185,7 @@ class Chu3Repos( val userCMission: Chu3UserCMissionRepo, val userCMissionProgress: Chu3UserCMissionProgressRepo, val netBattleLog: Chu3NetBattleLogRepo, - val matchingMember: Chu3MatchingMemberRepo, + val userMisc: Chu3UserMiscRepo, 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 dafe9bc8..99be8f6f 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 @@ -25,7 +25,7 @@ class UpsertTeamPoint( ) data class UpsertNetBattleData( - val recentNBSelectMusicList: List = emptyList(), + val recentNBSelectMusicList: List = emptyList(), val isRankUpChallengeFailed: Boolean = false, val highestBattleRankId: Long = 0, val battleIconId: Long = 0, @@ -33,7 +33,7 @@ data class UpsertNetBattleData( val avatarEffectPoint: Long = 0, ) -data class UpsertNBSelectMusic( +data class MusicIdWrapper( val musicId: Int = 0, ) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3MatchingMember.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3MatchingMember.kt index 2c64e57e..fd3a40c5 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3MatchingMember.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3MatchingMember.kt @@ -1,13 +1,8 @@ package icu.samnyan.aqua.sega.chusan.model.userdata import com.fasterxml.jackson.annotation.JsonProperty -import icu.samnyan.aqua.net.games.BaseEntity -import jakarta.persistence.Entity -import jakarta.persistence.Table -@Entity(name = "ChusanMatchingMember") -@Table(name = "chusan_matching_member") -class Chu3MatchingMember : BaseEntity() { +open class Chu3MatchingMember { var userId: Long = 0 var regionId = 0 var placeId = 0 diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserMisc.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserMisc.kt new file mode 100644 index 00000000..c767cb1f --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserMisc.kt @@ -0,0 +1,18 @@ +package icu.samnyan.aqua.sega.chusan.model.userdata + +import icu.samnyan.aqua.sega.general.IntegerListConverter +import jakarta.persistence.Convert +import jakarta.persistence.Entity + + +@Entity(name = "ChusanUserMisc") +class Chu3UserMisc( + @Convert(converter = IntegerListConverter::class) + var recentNbSelect: MutableList = mutableListOf(), + + @Convert(converter = IntegerListConverter::class) + var recentNbMusic: MutableList = mutableListOf(), + + @Convert(converter = IntegerListConverter::class) + var favMusic: MutableList = mutableListOf() +): Chu3UserEntity() \ No newline at end of file diff --git a/src/main/resources/db/migration/mariadb/V1000_30__chusan_user_misc.sql b/src/main/resources/db/migration/mariadb/V1000_30__chusan_user_misc.sql new file mode 100644 index 00000000..d75433f2 --- /dev/null +++ b/src/main/resources/db/migration/mariadb/V1000_30__chusan_user_misc.sql @@ -0,0 +1,17 @@ +CREATE TABLE chusan_user_misc +( + id BIGINT AUTO_INCREMENT NOT NULL, + user_id BIGINT NULL, + recent_nb_select VARCHAR(1023) NULL, + recent_nb_music VARCHAR(1023) NULL, + fav_music VARCHAR(1023) NULL, + CONSTRAINT pk_chusanusermisc PRIMARY KEY (id) +); + +ALTER TABLE chusan_user_misc + ADD CONSTRAINT FK_CHUSANUSERMISC_ON_USER FOREIGN KEY (user_id) REFERENCES chusan_user_data (id); + +ALTER TABLE chusan_user_misc + ADD CONSTRAINT UNQ_CHUSANUSERMISC_ON_USER UNIQUE (user_id); + +DROP TABLE chusan_matching_member From 89e682df3d18ca12cb73e921c2fc8a0d8466d121 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 02:14:30 -0500 Subject: [PATCH 55/67] [+] Store userMisc at upsert --- .../sega/chusan/handler/ChusanUpsertApis.kt | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 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 73bdc10c..58790dc6 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 @@ -3,10 +3,7 @@ package icu.samnyan.aqua.sega.chusan.handler import ext.* import icu.samnyan.aqua.sega.chusan.ChusanController import icu.samnyan.aqua.sega.chusan.model.request.UpsertUserAll -import icu.samnyan.aqua.sega.chusan.model.userdata.UserCMission -import icu.samnyan.aqua.sega.chusan.model.userdata.UserCMissionProgress -import icu.samnyan.aqua.sega.chusan.model.userdata.UserCharge -import icu.samnyan.aqua.sega.chusan.model.userdata.UserGeneralData +import icu.samnyan.aqua.sega.chusan.model.userdata.* import icu.samnyan.aqua.sega.general.model.response.UserRecentRating @Suppress("UNCHECKED_CAST") @@ -53,13 +50,25 @@ fun ChusanController.upsertApiInit() { db.userGeneralData.save(d.apply { propertyValue = list!!.str() }) } - userFavoriteMusicList?.filter { it.musicId != -1 }?.let { list -> - val d = db.userGeneralData.findByUserAndPropertyKey(u, "favorite_music")() - ?: UserGeneralData().apply { user = u; propertyKey = "favorite_music" } - db.userGeneralData.save(d.apply { - propertyValue = list.distinct().joinToString(",") { it.musicId.toString() } }) + val misc = db.userMisc.findSingleByUser(u)() ?: Chu3UserMisc().apply { user = u } + + // Favorites + userFavoriteMusicList?.filter { it.musicId != -1 }?.ifEmpty { null }?.let { list -> + misc.favMusic = list.map { it.musicId }.mut } + // Net battle data + userNetBattleData?.getOrNull(0)?.let { + misc.recentNbSelect = it.recentNBSelectMusicList.map { it.musicId }.mut + } + + // Add the battle log songs to misc + if (userNetBattlelogList != null) { + val music = userMusicDetailList?.map { it.musicId } ?: emptyList() + misc.recentNbMusic = (misc.recentNbMusic + music).distinct().takeLast(10).mut + } + db.userMisc.save(misc) + // Playlog userPlaylogList?.let { db.userPlaylog.saveAll(it) } userNetBattlelogList?.let { db.netBattleLog.saveAll(it.mapApply { From 4820c38bceb677410742cd2db3cb90d565ceafbb Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 02:20:15 -0500 Subject: [PATCH 56/67] [+] Implement GetUserNetBattleData --- .../aqua/sega/chusan/handler/ChusanApis.kt | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 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 e446975e..5613152b 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 @@ -28,7 +28,15 @@ fun ChusanController.chusanInit() { "GetUserRegion" { """{"userId":"${data["userId"]}","length":"0","userRegionList":[]}""" } "GetUserPrintedCard" { """{"userId":"${data["userId"]}","length":0,"nextIndex":-1,"userPrintedCardList":[]}""" } "GetUserSymbolChatSetting" { """{"userId":"${data["userId"]}","length":"0","symbolChatInfoList":[]}""" } - "GetUserNetBattleData" { """{"userId":"${data["userId"]}","userNetBattleData":{"recentNBSelectMusicList":[],"recentNBMusicList":[]}}""" } + + // Net battle data + "GetUserNetBattleData" { + val misc = db.userMisc.findSingleByUser_Card_ExtId(uid)() + mapOf("userId" to uid, "userNetBattleData" to mapOf( + "recentNBSelectMusicList" to (misc?.recentNbSelect ?: empty), + "recentNBMusicList" to (misc?.recentNbMusic ?: empty), + )) + } "GetUserNetBattleRankingInfo" { """{"userId":"${data["userId"]}","length":"0","userNetBattleRankingInfoList":{}}""" } // User handlers @@ -111,14 +119,12 @@ fun ChusanController.chusanInit() { "GetUserFavoriteItem".pagedWithKind("userFavoriteItemList") { val kind = parsing { data["kind"]!!.int } mapOf("kind" to kind) grabs { - // TODO: Actually store this info at UpsertUserAll - val fav = when (kind) { - 1 -> "favorite_music" - 3 -> "favorite_chara" - else -> null - }?.let { db.userGeneralData.findByUser_Card_ExtIdAndPropertyKey(uid, it)() }?.propertyValue - - fav?.ifBlank { null }?.split(",")?.map { it.int } ?: emptyList() + val misc = db.userMisc.findSingleByUser_Card_ExtId(uid)() + when (kind) { + 1 -> misc?.favMusic ?: empty + 3 -> empty // TODO: Favorite character + else -> empty + } } } From 7e2cc100e6d87e0b22a017412181c6e86fc40094 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 03:17:42 -0500 Subject: [PATCH 57/67] [+] More docs --- docs/chu3-national-matching.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/chu3-national-matching.md b/docs/chu3-national-matching.md index eafd6639..b5cbc1a0 100644 --- a/docs/chu3-national-matching.md +++ b/docs/chu3-national-matching.md @@ -22,8 +22,8 @@ This is tested on Chusan 2.27. If you're using fufubot segatools, please override it with Dniel97's version (don't forget to update `segatools.ini`). 3. Patch your `chusanApp.exe` using [Two-Torial's open-source patcher](https://patcher.two-torial.xyz/) (Make sure you disable "Set all timer to 999", enable "No encryption", "No TLS", "Patch for head-to-head play") -4. Make sure you only have official options, but add the option [ARRR](https://pixeldrain.com/u/D2jjN3of). - (Remove things like A999, AOMN, etc.) +4. Add the option [ARRR](https://pixeldrain.com/u/D2jjN3of). + If you're playing with friends, make sure they have the same options as you. 5. Pet your cat 🐈 6. Launch! @@ -61,6 +61,12 @@ If there is only one player, then yea it's because there are not enough players. Otherwise, it's because one of the players has a bad network environment (e.g. Symmetric NAT). Try again with someone who played this mode before, if it still doesn't work, then it's probably you. +**Q: Why did I play two of the same songs in a row?** + +When other people picked a song that you don't have, the game will play the same song as the previous one. +Make sure you have up-to-date options in your game. +(Or they might have selected a custom chart, in that case there's not much you can do) + ## How to Play When you enter the matching mode, it will assign to you a matching room if other people are online, or create a new room otherwise. From 9ff07f9f2b158f55310bd045a99c39ec407ff163 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 03:29:42 -0500 Subject: [PATCH 58/67] [F] Fix fav item list/ --- .../java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt | 2 +- 1 file changed, 1 insertion(+), 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 5613152b..c7a3136b 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 @@ -124,7 +124,7 @@ fun ChusanController.chusanInit() { 1 -> misc?.favMusic ?: empty 3 -> empty // TODO: Favorite character else -> empty - } + }.map { "id" to it } } } From e16bb5a34fa7a66b921604c1ec476f9b714ca4ef Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 04:13:20 -0500 Subject: [PATCH 59/67] [+] Add playlog fields to net battle log table --- .../chusan/model/userdata/Chu3NetBattleLog.kt | 10 ++++++++-- .../mariadb/V1000_27__chusan_net_battle_log.sql | 16 +++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3NetBattleLog.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3NetBattleLog.kt index 1aa0488e..c7f3e7b8 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3NetBattleLog.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3NetBattleLog.kt @@ -7,7 +7,13 @@ import jakarta.persistence.Table @Table(name = "chusan_net_battle_log") class Chu3NetBattleLog( var roomId: Long = 0, - var track: Long = 0, + var track: Int = 0, + + // From playlog + var musicId: Int = 0, + var difficultyId: Int = 0, + var score: Int = 0, + var selectUserId: Long = 0, var selectUserName: String = "", var opponentUserId1: Long = 0, @@ -46,4 +52,4 @@ class Chu3NetBattleLog( var battleRuleId: Int = 0, var monthPoLong: Int = 0, var eventPoLong: Int = 0 -) : Chu3UserEntity() +) : Chu3UserEntity() { diff --git a/src/main/resources/db/migration/mariadb/V1000_27__chusan_net_battle_log.sql b/src/main/resources/db/migration/mariadb/V1000_27__chusan_net_battle_log.sql index 636c8af5..755a18a8 100644 --- a/src/main/resources/db/migration/mariadb/V1000_27__chusan_net_battle_log.sql +++ b/src/main/resources/db/migration/mariadb/V1000_27__chusan_net_battle_log.sql @@ -3,15 +3,18 @@ CREATE TABLE chusan_net_battle_log id BIGINT AUTO_INCREMENT NOT NULL, user_id BIGINT NULL, room_id BIGINT NOT NULL, - track BIGINT NOT NULL, + track INT NOT NULL, + music_id INT NOT NULL, + difficulty_id INT NOT NULL, + score INT NOT NULL, select_user_id BIGINT NOT NULL, - select_user_name VARCHAR(255) NULL, + select_user_name VARCHAR(64) NULL, opponent_user_id1 BIGINT NOT NULL, opponent_user_id2 BIGINT NOT NULL, opponent_user_id3 BIGINT NOT NULL, - opponent_user_name1 VARCHAR(255) NULL, - opponent_user_name2 VARCHAR(255) NULL, - opponent_user_name3 VARCHAR(255) NULL, + opponent_user_name1 VARCHAR(64) NULL, + opponent_user_name2 VARCHAR(64) NULL, + opponent_user_name3 VARCHAR(64) NULL, opponent_region_id1 INT NOT NULL, opponent_region_id2 INT NOT NULL, opponent_region_id3 INT NOT NULL, @@ -45,5 +48,8 @@ CREATE TABLE chusan_net_battle_log CONSTRAINT pk_chusan_net_battle_log PRIMARY KEY (id) ); +ALTER TABLE chusan_net_battle_log + ADD CONSTRAINT FK_CHUSAN_NET_BATTLE_LOG_ON_USER FOREIGN KEY (user_id) REFERENCES chusan_user_data (id); + ALTER TABLE chusan_net_battle_log ADD CONSTRAINT FK_CHUSAN_NET_BATTLE_LOG_ON_USER FOREIGN KEY (user_id) REFERENCES chusan_user_data (id); \ No newline at end of file From 250d92d225cdd944a7c329e86ad7bd539ef2b466 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 04:13:27 -0500 Subject: [PATCH 60/67] [+] toDict --- .../chusan/model/userdata/Chu3NetBattleLog.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3NetBattleLog.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3NetBattleLog.kt index c7f3e7b8..93fd5207 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3NetBattleLog.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3NetBattleLog.kt @@ -53,3 +53,24 @@ class Chu3NetBattleLog( var monthPoLong: Int = 0, var eventPoLong: Int = 0 ) : Chu3UserEntity() { + + // musicId, difficultyId, userName, score, memberName{1-3}, memberScore{1-3}, selectedMemberNum + fun toDict() = mapOf( + "musicId" to musicId, + "difficultyId" to difficultyId, + "score" to score, + "userName" to selectUserName, + "memberName1" to opponentUserName1, + "memberScore1" to opponentScore1, + "memberName2" to opponentUserName2, + "memberScore2" to opponentScore2, + "memberName3" to opponentUserName3, + "memberScore3" to opponentScore3, + "selectedMemberNum" to listOf( + true, + selectUserId == opponentUserId1, + selectUserId == opponentUserId2, + selectUserId == opponentUserId3 + ).lastIndexOf(true) + ) +} From 4c3ed1d0da29fce3b6b59d38d80e639c38dda9f1 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 04:13:38 -0500 Subject: [PATCH 61/67] [F] Fix recentNBMusicList return --- .../icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt | 8 +++++--- .../java/icu/samnyan/aqua/sega/chusan/model/Chu3Repos.kt | 4 +++- 2 files changed, 8 insertions(+), 4 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 c7a3136b..0345fd79 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 @@ -30,11 +30,13 @@ fun ChusanController.chusanInit() { "GetUserSymbolChatSetting" { """{"userId":"${data["userId"]}","length":"0","symbolChatInfoList":[]}""" } // Net battle data - "GetUserNetBattleData" { - val misc = db.userMisc.findSingleByUser_Card_ExtId(uid)() + "GetUserNetBattleData" api@ { + val u = db.userData.findByCard_ExtId(uid)() ?: return@api null + val misc = db.userMisc.findSingleByUser(u)() + val recent = db.netBattleLog.findTop20ByUserOrderByIdDesc(u) mapOf("userId" to uid, "userNetBattleData" to mapOf( "recentNBSelectMusicList" to (misc?.recentNbSelect ?: empty), - "recentNBMusicList" to (misc?.recentNbMusic ?: empty), + "recentNBMusicList" to recent.map { it.toDict() }, )) } "GetUserNetBattleRankingInfo" { """{"userId":"${data["userId"]}","length":"0","userNetBattleRankingInfoList":{}}""" } 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 51d4b597..4396b026 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 @@ -127,7 +127,9 @@ interface Chu3UserCMissionProgressRepo : Chu3UserLinked { fun findByUser_Card_ExtIdAndMissionIdAndOrder(extId: Long, missionId: Int, order: Int): Optional } -interface Chu3NetBattleLogRepo : Chu3UserLinked +interface Chu3NetBattleLogRepo : Chu3UserLinked { + fun findTop20ByUserOrderByIdDesc(user: Chu3UserData): List +} interface Chu3UserMiscRepo : Chu3UserLinked From 01cb0c4b9002daa476bd4239482d6b5285d54323 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 04:23:41 -0500 Subject: [PATCH 62/67] [+] Add playlog info to battle log when upsert --- src/main/java/ext/Ext.kt | 1 + .../samnyan/aqua/sega/chusan/handler/ChusanUpsertApis.kt | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/ext/Ext.kt b/src/main/java/ext/Ext.kt index a94651df..0fdcfe53 100644 --- a/src/main/java/ext/Ext.kt +++ b/src/main/java/ext/Ext.kt @@ -196,6 +196,7 @@ fun Map.vNotNull(): Map = filterValues { it != null }.m fun MutableList.popAll(list: List) = list.also { removeAll(it) } fun MutableList.popAll(vararg items: T) = popAll(items.toList()) inline fun Iterable.mapApply(block: T.() -> Unit) = map { it.apply(block) } +inline fun Iterable.mapApplyI(block: T.(Int) -> Unit) = mapIndexed { i, e -> e.apply { block(i) } } @Suppress("UNCHECKED_CAST") fun Map.recursiveNotNull(): Map = mapNotNull { (k, v) -> k to if (v is Map<*, *>) (v as Map).recursiveNotNull() else v 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 58790dc6..e8bb3664 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 @@ -71,7 +71,13 @@ fun ChusanController.upsertApiInit() { // Playlog userPlaylogList?.let { db.userPlaylog.saveAll(it) } - userNetBattlelogList?.let { db.netBattleLog.saveAll(it.mapApply { + userNetBattlelogList?.let { db.netBattleLog.saveAll(it.mapApplyI { i -> + userPlaylogList?.getOrNull(i)?.let { + musicId = it.musicId + difficultyId = it.level + score = it.score + } + selectUserName = selectUserName.fromChusanUsername() opponentUserName1 = opponentUserName1.fromChusanUsername() opponentUserName2 = opponentUserName2.fromChusanUsername() From a70e9130f5366d07b6e6e613cb5f5da6d0a2c5d2 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 04:25:11 -0500 Subject: [PATCH 63/67] [F] Fix duplicate key --- .../db/migration/mariadb/V1000_27__chusan_net_battle_log.sql | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/resources/db/migration/mariadb/V1000_27__chusan_net_battle_log.sql b/src/main/resources/db/migration/mariadb/V1000_27__chusan_net_battle_log.sql index 755a18a8..97342bba 100644 --- a/src/main/resources/db/migration/mariadb/V1000_27__chusan_net_battle_log.sql +++ b/src/main/resources/db/migration/mariadb/V1000_27__chusan_net_battle_log.sql @@ -50,6 +50,3 @@ CREATE TABLE chusan_net_battle_log ALTER TABLE chusan_net_battle_log ADD CONSTRAINT FK_CHUSAN_NET_BATTLE_LOG_ON_USER FOREIGN KEY (user_id) REFERENCES chusan_user_data (id); - -ALTER TABLE chusan_net_battle_log - ADD CONSTRAINT FK_CHUSAN_NET_BATTLE_LOG_ON_USER FOREIGN KEY (user_id) REFERENCES chusan_user_data (id); \ No newline at end of file From 6cfd0a91fc498af40f891880b2aa22166c43855c Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 04:39:11 -0500 Subject: [PATCH 64/67] [F] Fix username mismatch --- .../java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt | 2 +- .../aqua/sega/chusan/model/userdata/Chu3NetBattleLog.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 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 0345fd79..989cc68a 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 @@ -36,7 +36,7 @@ fun ChusanController.chusanInit() { val recent = db.netBattleLog.findTop20ByUserOrderByIdDesc(u) mapOf("userId" to uid, "userNetBattleData" to mapOf( "recentNBSelectMusicList" to (misc?.recentNbSelect ?: empty), - "recentNBMusicList" to recent.map { it.toDict() }, + "recentNBMusicList" to recent.map { it.toDict(u.userName) }, )) } "GetUserNetBattleRankingInfo" { """{"userId":"${data["userId"]}","length":"0","userNetBattleRankingInfoList":{}}""" } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3NetBattleLog.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3NetBattleLog.kt index 93fd5207..3d6e15e6 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3NetBattleLog.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3NetBattleLog.kt @@ -55,11 +55,11 @@ class Chu3NetBattleLog( ) : Chu3UserEntity() { // musicId, difficultyId, userName, score, memberName{1-3}, memberScore{1-3}, selectedMemberNum - fun toDict() = mapOf( + fun toDict(username: String) = mapOf( "musicId" to musicId, "difficultyId" to difficultyId, "score" to score, - "userName" to selectUserName, + "userName" to username, "memberName1" to opponentUserName1, "memberScore1" to opponentScore1, "memberName2" to opponentUserName2, From 7ad4bc2ba5856ddb46dee4681cc3175634f030fd Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 05:02:25 -0500 Subject: [PATCH 65/67] [F] Fix favorite --- .../java/icu/samnyan/aqua/sega/chusan/handler/ChusanApis.kt | 2 +- 1 file changed, 1 insertion(+), 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 989cc68a..44d2adc5 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 @@ -126,7 +126,7 @@ fun ChusanController.chusanInit() { 1 -> misc?.favMusic ?: empty 3 -> empty // TODO: Favorite character else -> empty - }.map { "id" to it } + }.map { mapOf("id" to it) } } } From 51af357c5a5b630c52e2617f2e85c36be84ef329 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 05:21:47 -0500 Subject: [PATCH 66/67] [F] Fix username check --- AquaNet/src/libs/sdk.ts | 2 ++ src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt | 2 +- src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt | 4 +--- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/AquaNet/src/libs/sdk.ts b/AquaNet/src/libs/sdk.ts index b6363c5f..e88f5891 100644 --- a/AquaNet/src/libs/sdk.ts +++ b/AquaNet/src/libs/sdk.ts @@ -310,4 +310,6 @@ export const SETTING = { post('/api/v2/settings/get', {}), set: (key: string, value: any) => post('/api/v2/settings/set', { key, value: `${value}` }), + detailSet: (game: string, field: string, value: any) => + post(`/api/v2/game/${game}/user-detail-set`, { field, value }), } diff --git a/src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt b/src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt index 095823eb..7bed80c0 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/GameHelper.kt @@ -21,7 +21,7 @@ fun usernameCheck(chars: String): (IUserData, String) -> Unit = { u, v -> u.userName = v if (v.isBlank()) { 400 - "Username cannot be blank" } if (v.length > 8) { 400 - "Username too long" } - v.find { it !in chars }?.let { 400 - "Invalid character '$it' in username" } +// v.find { it !in chars }?.let { 400 - "Invalid character '$it' in username" } } fun toFullWidth(input: String): String { diff --git a/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt b/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt index d51eabc4..03113c50 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt @@ -26,9 +26,7 @@ class Maimai2( // Only show > S rank override val shownRanks = mai2Scores.filter { it.first >= 97 * 10000 } override val settableFields: Map Unit> by lazy { - mapOf( - "userName" to usernameCheck(SEGA_USERNAME_CAHRS), - ) + mapOf("userName" to usernameCheck(SEGA_USERNAME_CAHRS)) } override suspend fun userSummary(@RP username: Str, @RP token: String?) = us.cardByName(username) { card -> From 7083e1a11796b2b3cc13a2df8edd237336def95a Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 5 Jan 2025 05:59:54 -0500 Subject: [PATCH 67/67] [F] Fix duolinguo integration --- src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDB.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDB.kt b/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDB.kt index 40b691c9..216393cf 100644 --- a/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDB.kt +++ b/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDB.kt @@ -2,9 +2,9 @@ package icu.samnyan.aqua.sega.aimedb import ext.toHex import icu.samnyan.aqua.net.db.AquaUserServices +import icu.samnyan.aqua.sega.allnet.AllNetProps import icu.samnyan.aqua.sega.general.model.Card import icu.samnyan.aqua.sega.general.service.CardService -import icu.samnyan.aqua.sega.allnet.AllNetProps import io.netty.buffer.ByteBuf import io.netty.buffer.ByteBufUtil import io.netty.buffer.Unpooled @@ -67,7 +67,8 @@ class AimeDB( logger.info("AimeDB /${handler.name} : (game ${base.gameId}, keychip ${base.keychipId})") // Check keychip - if (!us.validKeychip(base.keychipId)) { + // We do not check for type 0x13 because of a bug in duolinguo.dll + if (!us.validKeychip(base.keychipId) && type != 0x13) { if (allNetProps.keychipPermissiveForTesting) { logger.warn("> Accepted invalid keychip ${base.keychipId} in permissive mode") } else {