18 Commits
Author SHA1 Message Date
Azalea f082f4190d chore: update gradlew wrapper to latest version 2026-03-29 22:09:04 +00:00
Azalea 205f3cc973 Merge branch 'cosmos' of https://github.com/MewoLab/AquaDX into cosmos 2026-03-29 22:08:27 +00:00
Azalea e86a7b59fd Merge branch 'v1-dev' and resolve all conflicts 2026-03-29 21:21:28 +00:00
Azalea a5a1d61050 Merge branch 'v1-dev' and resolve all conflicts 2026-03-29 21:17:58 +00:00
Azalea 48efafdc44 [-] QueryDSL 2026-03-29 13:42:36 -04:00
Azalea 8d4a027d48 [M] Move package name 2026-03-29 13:24:20 -04:00
Azalea 0985f73753 [M] Move common models to shared 2026-03-29 13:08:12 -04:00
Azalea 3dbb0095bf [M] Move core extensions to shared 2026-03-28 13:50:38 -04:00
Azalea adaa255dd3 [O] Split extensions 2026-03-28 12:53:30 -04:00
Azalea fb5ea51d92 [M] Move existing code 2026-03-28 12:46:09 -04:00
Azalea 3497dd2329 [+] Subrepos 2026-03-28 12:45:53 -04:00
Azalea 7e5d75a221 [F] Fix run 2026-03-28 06:05:26 -04:00
Azalea afa9564392 [+] Use data jsons instead of db 2026-03-28 05:49:56 -04:00
Azalea 78b48c0f5c [+] Data jsons 2026-03-28 05:43:49 -04:00
Azalea fa068b7172 [+] Drop tables 2026-03-28 04:59:29 -04:00
Azalea a6fad6aa46 [F] Fix devtainer 2026-03-28 04:59:07 -04:00
Azalea af136b906d [F] Fix devtainer 2026-03-28 03:47:42 -04:00
Azalea e334ada5b4 [+] devtainer 2026-03-28 03:44:05 -04:00
539 changed files with 80932 additions and 12042 deletions
+5
View File
@@ -0,0 +1,5 @@
---
trigger: always_on
---
Make sure `./gradlew build` compiles before you say you're done.
Executable → Regular
View File
+24 -177
View File
@@ -1,189 +1,36 @@
import java.time.Instant
import java.time.ZoneId
import java.time.format.DateTimeFormatter
plugins { plugins {
val ktVer = "2.1.10" kotlin("jvm") version "2.1.10" apply false
kotlin("plugin.spring") version "2.1.10" apply false
java kotlin("plugin.jpa") version "2.1.10" apply false
kotlin("jvm") version ktVer kotlin("plugin.serialization") version "2.1.10" apply false
kotlin("plugin.spring") version ktVer kotlin("plugin.allopen") version "2.1.10" apply false
kotlin("plugin.jpa") version ktVer id("org.springframework.boot") version "3.2.3" apply false
kotlin("plugin.serialization") version ktVer id("io.spring.dependency-management") version "1.1.4" apply false
kotlin("plugin.allopen") version ktVer
kotlin("kapt") version ktVer
id("org.springframework.boot") version "3.2.3"
id("com.github.ben-manes.versions") version "0.51.0" id("com.github.ben-manes.versions") version "0.51.0"
id("org.hibernate.orm") version "6.4.4.Final"
application
} }
apply(plugin = "io.spring.dependency-management") allprojects {
group = "icu.samnyan.aqua"
version = "1.0.0"
repositories { repositories {
mavenLocal() mavenLocal()
mavenCentral() mavenCentral()
}
dependencies {
// Spring boot
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-web") {
exclude(group = "org.springframework.boot", module = "spring-boot-starter-tomcat")
}
implementation("org.springframework.boot:spring-boot-starter-jetty")
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: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:7.4")
// Metrics
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("io.micrometer:micrometer-registry-prometheus")
// Database
runtimeOnly("org.mariadb.jdbc:mariadb-java-client:3.3.3")
runtimeOnly("org.xerial:sqlite-jdbc:3.45.2.0")
implementation("org.hibernate.orm:hibernate-core:6.4.4.Final")
implementation("org.hibernate.orm:hibernate-community-dialects:6.4.4.Final")
implementation("io.github.openfeign.querydsl:querydsl-jpa:6.10.1")
kapt("io.github.openfeign.querydsl:querydsl-apt:6.10.1:jpa")
// JSR305 for nullable
implementation("com.google.code.findbugs:jsr305:3.0.2")
// =============================
// AquaNet Specific Dependencies
// =============================
// Network
implementation("io.ktor:ktor-client-core:3.0.3")
implementation("io.ktor:ktor-client-cio:3.0.3")
implementation("io.ktor:ktor-client-content-negotiation:3.0.3")
implementation("io.ktor:ktor-client-encoding:3.0.3")
implementation("io.ktor:ktor-serialization-kotlinx-json:3.0.3")
implementation("org.jetbrains.kotlin:kotlin-reflect")
// Somehow these are needed for ktor even though they're not in the documentation
runtimeOnly("org.reactivestreams:reactive-streams:1.0.4")
runtimeOnly("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.8.0")
// Email
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.0")
// JWT Authentication
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")
// Import: DateTime Parsing
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.0")
// Serialization
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
// Testing
testImplementation("io.kotest:kotest-runner-junit5-jvm:5.8.1")
testImplementation("io.kotest:kotest-assertions-core")
}
group = "icu.samnya"
version = "1.0.0"
description = "AquaDX Arcade Server"
java.sourceCompatibility = JavaVersion.VERSION_21
kotlin {
jvmToolchain(21)
}
springBoot {
mainClass.set("icu.samnyan.aqua.EntryKt")
}
application {
mainClass = "icu.samnyan.aqua.EntryKt"
}
hibernate {
enhancement {
enableLazyInitialization = true
enableAssociationManagement = false
enableExtendedEnhancement = false
} }
} }
kapt { subprojects {
includeCompileClasspath = false apply(plugin = "org.jetbrains.kotlin.jvm")
keepJavacAnnotationProcessors = true
}
allOpen { // Use configure to access the extension safely in subprojects
annotation("jakarta.persistence.Entity") configure<org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension> {
annotation("jakarta.persistence.MappedSuperclass") jvmToolchain(21)
annotation("jakarta.persistence.Embeddable") }
}
val buildTime: String by extra(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z").withZone(ZoneId.of("UTC")).format(Instant.now())) tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
compilerOptions {
tasks.processResources { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_21)
filesMatching("**/application.properties") { freeCompilerArgs.add("-Xjsr305=strict")
expand(project.properties) }
} }
} }
tasks.test {
enabled = project.hasProperty("runTests")
useJUnitPlatform()
jvmArgs("-Dkotest.assertions.collection.print.size=100")
}
tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
}
tasks.withType<Javadoc> {
options.encoding = "UTF-8"
}
tasks.getByName<Jar>("jar") {
enabled = false
}
sourceSets {
main {
java.srcDir("${layout.buildDirectory.get()}/generated/source/kapt/main")
}
}
val copyDependencies by tasks.registering(Copy::class) {
from(configurations.runtimeClasspath)
into("${layout.buildDirectory.get()}/libs/lib")
}
val packageThin by tasks.registering(Jar::class) {
group = "build"
from(sourceSets.main.get().output)
manifest {
attributes(
"Main-Class" to "icu.samnyan.aqua.EntryKt",
"Class-Path" to configurations.runtimeClasspath.get().files.joinToString(" ") { "lib/${it.name}" }
)
}
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
dependsOn(copyDependencies)
}
+26
View File
@@ -0,0 +1,26 @@
plugins {
kotlin("jvm")
kotlin("plugin.serialization")
id("application")
}
dependencies {
implementation(project(":shared"))
// Network
implementation("io.ktor:ktor-client-core:3.0.3")
implementation("io.ktor:ktor-client-cio:3.0.3")
implementation("io.ktor:ktor-client-content-negotiation:3.0.3")
implementation("io.ktor:ktor-serialization-kotlinx-json:3.0.3")
// Serialization
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.0")
// Testing
testImplementation("io.kotest:kotest-runner-junit5-jvm:5.8.1")
}
application {
mainClass = "icu.samnyan.aqua.comet.EntryKt"
}
+1 -1
View File
@@ -1,7 +1,7 @@
FROM archlinux:latest FROM archlinux:latest
RUN pacman -Syu --noconfirm \ RUN pacman -Syu --noconfirm \
&& pacman -S --noconfirm openssh sudo jdk21-openjdk wget which procps-ng zsh git curlie micro ripgrep python3 exa \ && pacman -S --noconfirm openssh sudo jdk21-openjdk wget which procps-ng zsh git curlie micro ripgrep python3 exa diffutils \
&& rm -rf /var/cache/pacman/pkg/* \ && rm -rf /var/cache/pacman/pkg/* \
&& mkdir -p /var/run/sshd \ && mkdir -p /var/run/sshd \
&& chsh -s /bin/zsh root \ && chsh -s /bin/zsh root \
+168
View File
@@ -0,0 +1,168 @@
import java.time.ZonedDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
plugins {
val ktVer = "2.1.10"
java
kotlin("jvm") version ktVer
kotlin("plugin.spring") version ktVer
kotlin("plugin.jpa") version ktVer
kotlin("plugin.serialization") version ktVer
kotlin("plugin.allopen") version ktVer
id("org.springframework.boot") version "3.2.3"
id("io.spring.dependency-management") version "1.1.4"
id("com.github.ben-manes.versions") version "0.51.0"
id("org.hibernate.orm") version "6.4.4.Final"
application
}
dependencies {
implementation(project(":shared"))
// Spring boot
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-web") {
exclude(group = "org.springframework.boot", module = "spring-boot-starter-tomcat")
}
implementation("org.springframework.boot:spring-boot-starter-jetty")
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: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:7.4")
// Metrics
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("io.micrometer:micrometer-registry-prometheus")
// Database
runtimeOnly("org.mariadb.jdbc:mariadb-java-client:3.3.3")
runtimeOnly("org.xerial:sqlite-jdbc:3.45.2.0")
implementation("org.hibernate.orm:hibernate-core:6.4.4.Final")
implementation("org.hibernate.orm:hibernate-community-dialects:6.4.4.Final")
// JSR305 for nullable
implementation("com.google.code.findbugs:jsr305:3.0.2")
// Network
implementation("io.ktor:ktor-client-core:3.0.3")
implementation("io.ktor:ktor-client-cio:3.0.3")
implementation("io.ktor:ktor-client-content-negotiation:3.0.3")
implementation("io.ktor:ktor-client-encoding:3.0.3")
implementation("io.ktor:ktor-serialization-kotlinx-json:3.0.3")
implementation("org.jetbrains.kotlin:kotlin-reflect")
runtimeOnly("org.reactivestreams:reactive-streams:1.0.4")
runtimeOnly("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.8.0")
// Email
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.0")
// JWT Authentication
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")
// Import: DateTime Parsing
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.0")
// Serialization
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
// Testing
testImplementation("io.kotest:kotest-runner-junit5-jvm:5.8.1")
testImplementation("io.kotest:kotest-assertions-core")
}
group = "icu.samnyan.aqua"
version = "1.0.0"
description = "AquaDX Planet Server"
java.sourceCompatibility = JavaVersion.VERSION_21
kotlin {
jvmToolchain(21)
}
springBoot {
mainClass.set("icu.samnyan.aqua.EntryKt")
}
application {
mainClass = "icu.samnyan.aqua.EntryKt"
}
hibernate {
enhancement {
enableLazyInitialization = true
enableAssociationManagement = false
enableExtendedEnhancement = false
}
}
allOpen {
annotation("jakarta.persistence.Entity")
annotation("jakarta.persistence.MappedSuperclass")
annotation("jakarta.persistence.Embeddable")
}
tasks.processResources {
val buildTime = ZonedDateTime.now(ZoneId.of("UTC"))
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z"))
inputs.property("buildTime", buildTime)
inputs.property("version", project.version)
filesMatching("**/application.properties") {
expand(mapOf("project" to project, "buildTime" to buildTime, "version" to project.version, "ext" to mapOf("buildTime" to buildTime)))
}
}
tasks.test {
enabled = false
useJUnitPlatform()
jvmArgs("-Dkotest.assertions.collection.print.size=100")
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
compilerOptions {
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_21)
freeCompilerArgs.add("-Xjsr305=strict")
}
}
tasks.getByName<Jar>("jar") {
enabled = false
}
val copyDependencies by tasks.registering(Copy::class) {
from(configurations.runtimeClasspath)
into("${layout.buildDirectory.get()}/libs/lib")
}
val packageThin by tasks.registering(Jar::class) {
group = "build"
from(sourceSets.main.get().output)
manifest {
attributes(
"Main-Class" to "icu.samnyan.aqua.EntryKt",
"Class-Path" to configurations.runtimeClasspath.get().files.joinToString(" ") { "lib/${it.name}" }
)
}
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
dependsOn(copyDependencies)
}
@@ -1,7 +1,7 @@
package icu.samnyan.aqua package aquadx
import icu.samnyan.aqua.sega.aimedb.AimeDbServer import aquadx.sega.aimedb.AimeDbServer
import icu.samnyan.aqua.spring.AutoChecker import aquadx.spring.AutoChecker
import org.springframework.boot.SpringApplication import org.springframework.boot.SpringApplication
import org.springframework.boot.ansi.AnsiOutput import org.springframework.boot.ansi.AnsiOutput
import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.autoconfigure.SpringBootApplication
@@ -1,13 +1,13 @@
package icu.samnyan.aqua.net package aquadx.net
import ext.* import ext.*
import icu.samnyan.aqua.net.db.AquaUserServices import aquadx.net.db.AquaUserServices
import icu.samnyan.aqua.net.utils.SUCCESS import aquadx.net.utils.SUCCESS
import icu.samnyan.aqua.sega.chusan.model.Chu3Repos import aquadx.sega.chusan.model.Chu3Repos
import icu.samnyan.aqua.sega.general.model.Card import aquadx.sega.general.model.Card
import icu.samnyan.aqua.sega.general.model.CardStatus import aquadx.sega.general.model.CardStatus
import icu.samnyan.aqua.sega.general.model.sensitiveInfo import aquadx.sega.general.model.sensitiveInfo
import icu.samnyan.aqua.sega.maimai2.model.Mai2Repos import aquadx.sega.maimai2.model.Mai2Repos
import jakarta.transaction.Transactional import jakarta.transaction.Transactional
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.boot.context.properties.ConfigurationProperties
@@ -1,20 +1,20 @@
package icu.samnyan.aqua.net package aquadx.net
import ext.* import ext.*
import icu.samnyan.aqua.net.components.JWT import aquadx.net.components.JWT
import icu.samnyan.aqua.net.db.AquaUserServices import aquadx.net.db.AquaUserServices
import icu.samnyan.aqua.net.games.GenericUserDataRepo import aquadx.net.games.GenericUserDataRepo
import icu.samnyan.aqua.net.games.IUserData import aquadx.net.games.IUserData
import icu.samnyan.aqua.net.utils.AquaNetProps import aquadx.net.utils.AquaNetProps
import icu.samnyan.aqua.net.utils.SUCCESS import aquadx.net.utils.SUCCESS
import icu.samnyan.aqua.sega.chusan.model.Chu3UserDataRepo import aquadx.sega.chusan.model.Chu3UserDataRepo
import icu.samnyan.aqua.sega.diva.PlayerProfileRepository import aquadx.sega.diva.PlayerProfileRepository
import icu.samnyan.aqua.sega.general.dao.CardRepository import aquadx.sega.general.dao.CardRepository
import icu.samnyan.aqua.sega.general.model.Card import aquadx.sega.general.model.Card
import icu.samnyan.aqua.sega.general.service.CardService import aquadx.sega.general.service.CardService
import icu.samnyan.aqua.sega.maimai2.model.Mai2UserDataRepo import aquadx.sega.maimai2.model.Mai2UserDataRepo
import icu.samnyan.aqua.sega.ongeki.OgkUserDataRepo import aquadx.sega.ongeki.OgkUserDataRepo
import icu.samnyan.aqua.sega.wacca.model.db.WcUserRepo import aquadx.sega.wacca.model.db.WcUserRepo
import jakarta.persistence.EntityManager import jakarta.persistence.EntityManager
import org.springframework.scheduling.annotation.Scheduled import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
@@ -1,25 +1,25 @@
package icu.samnyan.aqua.net package aquadx.net
import ext.* import ext.*
import icu.samnyan.aqua.net.components.EmailProperties import aquadx.net.components.EmailProperties
import icu.samnyan.aqua.net.components.JWT import aquadx.net.components.JWT
import icu.samnyan.aqua.net.db.AquaGameOptions import aquadx.net.db.AquaGameOptions
import icu.samnyan.aqua.net.db.AquaNetUser import aquadx.net.db.AquaNetUser
import icu.samnyan.aqua.net.db.AquaUserServices import aquadx.net.db.AquaUserServices
import icu.samnyan.aqua.net.games.ExportOptions import aquadx.net.games.ExportOptions
import icu.samnyan.aqua.net.games.GenericUserDataRepo import aquadx.net.games.GenericUserDataRepo
import icu.samnyan.aqua.net.games.IUserData import aquadx.net.games.IUserData
import icu.samnyan.aqua.net.games.mai2.Mai2Import import aquadx.net.games.mai2.Mai2Import
import icu.samnyan.aqua.net.utils.ApiException import aquadx.net.utils.ApiException
import icu.samnyan.aqua.net.utils.PathProps import aquadx.net.utils.PathProps
import icu.samnyan.aqua.net.utils.SUCCESS import aquadx.net.utils.SUCCESS
import icu.samnyan.aqua.sega.chusan.model.Chu3UserDataRepo import aquadx.sega.chusan.model.Chu3UserDataRepo
import icu.samnyan.aqua.sega.general.dao.CardRepository import aquadx.sega.general.dao.CardRepository
import icu.samnyan.aqua.sega.general.model.Card import aquadx.sega.general.model.Card
import icu.samnyan.aqua.sega.general.service.CardService import aquadx.sega.general.service.CardService
import icu.samnyan.aqua.sega.maimai2.model.Mai2UserDataRepo import aquadx.sega.maimai2.model.Mai2UserDataRepo
import icu.samnyan.aqua.sega.ongeki.OgkUserDataRepo import aquadx.sega.ongeki.OgkUserDataRepo
import icu.samnyan.aqua.sega.wacca.model.db.WcUserRepo import aquadx.sega.wacca.model.db.WcUserRepo
import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Configuration
import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.PlatformTransactionManager
@@ -33,8 +33,8 @@ import java.util.concurrent.CompletableFuture
import kotlin.io.path.getLastModifiedTime import kotlin.io.path.getLastModifiedTime
import kotlin.io.path.isRegularFile import kotlin.io.path.isRegularFile
import kotlin.io.path.writeBytes import kotlin.io.path.writeBytes
import icu.samnyan.aqua.sega.maimai2.handler.UploadUserPlaylogHandler as Mai2UploadUserPlaylogHandler import aquadx.sega.maimai2.handler.UploadUserPlaylogHandler as Mai2UploadUserPlaylogHandler
import icu.samnyan.aqua.sega.maimai2.handler.UpsertUserAllHandler as Mai2UpsertUserAllHandler import aquadx.sega.maimai2.handler.UpsertUserAllHandler as Mai2UpsertUserAllHandler
@Configuration @Configuration
@ConfigurationProperties(prefix = "aqua-net.fedy") @ConfigurationProperties(prefix = "aqua-net.fedy")
@@ -179,14 +179,14 @@ class Fedy(
val card = cardRepo.findByExtId(req.extId) val card = cardRepo.findByExtId(req.extId)
?: (404 - "Card with extId ${req.extId} not found") ?: (404 - "Card with extId ${req.extId} not found")
val cardTimestamp = cardService.getCardTimestamp(card, req.game) val cardTimestamp = cardService.getCardTimestamp(card, req.game)
if (cardTimestamp.updatedAt.toEpochMilli() == req.updatedAtMs) return@handleFedy DataPullRes(error = null, result = null) // No changes if (cardTimestamp.updatedAt == req.updatedAtMs) return@handleFedy DataPullRes(error = null, result = null) // No changes
val isRebased = req.createdAtMs > 0 && cardTimestamp.createdAt.toEpochMilli() > req.createdAtMs val isRebased = req.createdAtMs > 0 && cardTimestamp.createdAt > req.createdAtMs
val exportOptions = if (!isRebased) { req.exportOptions } else { req.exportOptions.copy(playlogAfter = null) } val exportOptions = if (!isRebased) { req.exportOptions } else { req.exportOptions.copy(playlogAfter = null) }
{ {
DataPullRes(result = DataPullResult(data = when (req.game) { DataPullRes(result = DataPullResult(data = when (req.game) {
"mai2" -> mai2Import.export(card, exportOptions) "mai2" -> mai2Import.export(card, exportOptions)
else -> 406 - "Unsupported game" else -> 406 - "Unsupported game"
}, createdAtMs = cardTimestamp.createdAt.toEpochMilli(), updatedAtMs = cardTimestamp.updatedAt.toEpochMilli(), isRebased = isRebased)) }, createdAtMs = cardTimestamp.createdAt, updatedAtMs = cardTimestamp.updatedAt, isRebased = isRebased))
} caught { DataPullRes(error = it) } } caught { DataPullRes(error = it) }
} }
@@ -1,7 +1,7 @@
package icu.samnyan.aqua.net package aquadx.net
import ext.* import ext.*
import icu.samnyan.aqua.sega.general.service.CardService import aquadx.sega.general.service.CardService
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Configuration
@@ -1,12 +1,12 @@
package icu.samnyan.aqua.net package aquadx.net
import ext.JACKSON import ext.JACKSON
import ext.logger import ext.logger
import ext.parse import ext.parse
import icu.samnyan.aqua.net.db.AquaNetUserRepo import aquadx.net.db.AquaNetUserRepo
import icu.samnyan.aqua.sega.general.dao.CardRepository import aquadx.sega.general.dao.CardRepository
import icu.samnyan.aqua.sega.general.dao.PropertyEntryRepository import aquadx.sega.general.dao.PropertyEntryRepository
import icu.samnyan.aqua.sega.general.model.PropertyEntry import aquadx.sega.general.model.PropertyEntry
import jakarta.annotation.PostConstruct import jakarta.annotation.PostConstruct
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
@@ -0,0 +1,22 @@
package aquadx.net
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
import org.springframework.stereotype.Service
@Repository
interface SafetyRepo : JpaRepository<Safety, Long> {
fun findBySafetyId(safetyId: String): Safety?
}
@Service
class AquaNetSafetyService(val safetyRepo: SafetyRepo) {
fun isSafe(safetyId: String): Boolean {
val safety = safetyRepo.findBySafetyId(safetyId)
return safety == null || safety.status == 0
}
fun isSafeBatch(safetyIds: List<String>): List<Boolean> {
return safetyIds.map { isSafe(it) }
}
}
@@ -1,10 +1,10 @@
package icu.samnyan.aqua.net package aquadx.net
import ext.* import ext.*
import icu.samnyan.aqua.net.db.AquaGameOptions import aquadx.net.db.AquaGameOptions
import icu.samnyan.aqua.net.db.AquaGameOptionsRepo import aquadx.net.db.AquaGameOptionsRepo
import icu.samnyan.aqua.net.db.AquaNetUserRepo import aquadx.net.db.AquaNetUserRepo
import icu.samnyan.aqua.net.db.AquaUserServices import aquadx.net.db.AquaUserServices
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
import kotlin.reflect.full.findAnnotation import kotlin.reflect.full.findAnnotation
import kotlin.reflect.jvm.jvmErasure import kotlin.reflect.jvm.jvmErasure
@@ -1,15 +1,15 @@
package icu.samnyan.aqua.net package aquadx.net
import ext.* import ext.*
import icu.samnyan.aqua.net.components.* import aquadx.net.components.*
import icu.samnyan.aqua.net.db.AquaNetUserRepo import aquadx.net.db.AquaNetUserRepo
import icu.samnyan.aqua.net.db.AquaUserServices import aquadx.net.db.AquaUserServices
import icu.samnyan.aqua.net.db.EmailConfirmationRepo import aquadx.net.db.EmailConfirmationRepo
import icu.samnyan.aqua.net.db.ResetPasswordRepo import aquadx.net.db.ResetPasswordRepo
import icu.samnyan.aqua.net.utils.PathProps import aquadx.net.utils.PathProps
import icu.samnyan.aqua.net.utils.SUCCESS import aquadx.net.utils.SUCCESS
import icu.samnyan.aqua.sega.general.dao.CardRepository import aquadx.sega.general.dao.CardRepository
import icu.samnyan.aqua.sega.general.model.CardStatus import aquadx.sega.general.model.CardStatus
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.security.crypto.password.PasswordEncoder import org.springframework.security.crypto.password.PasswordEncoder
@@ -1,9 +1,9 @@
package icu.samnyan.aqua.net.components package aquadx.net.components
import ext.Bool import ext.Bool
import ext.Str import ext.Str
import ext.logger import ext.logger
import icu.samnyan.aqua.net.db.* import aquadx.net.db.*
import org.simplejavamail.api.mailer.Mailer import org.simplejavamail.api.mailer.Mailer
import org.simplejavamail.email.EmailBuilder import org.simplejavamail.email.EmailBuilder
import org.simplejavamail.springsupport.SimpleJavaMailSpringSupport import org.simplejavamail.springsupport.SimpleJavaMailSpringSupport
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.net.components package aquadx.net.components
import com.maxmind.geoip2.DatabaseReader import com.maxmind.geoip2.DatabaseReader
import com.maxmind.geoip2.exception.AddressNotFoundException import com.maxmind.geoip2.exception.AddressNotFoundException
@@ -1,8 +1,8 @@
package icu.samnyan.aqua.net.components package aquadx.net.components
import ext.Str import ext.Str
import ext.minus import ext.minus
import icu.samnyan.aqua.net.db.* import aquadx.net.db.*
import io.jsonwebtoken.JwtParser import io.jsonwebtoken.JwtParser
import io.jsonwebtoken.Jwts import io.jsonwebtoken.Jwts
import io.jsonwebtoken.security.Keys import io.jsonwebtoken.security.Keys
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.net.components package aquadx.net.components
import ext.Bool import ext.Bool
import ext.HTTP import ext.HTTP
@@ -0,0 +1,10 @@
package aquadx.net.db
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface EmailConfirmationRepo : JpaRepository<EmailConfirmation, Long> {
fun findByToken(token: String): EmailConfirmation?
fun findByAquaNetUserAuId(auId: Long): List<EmailConfirmation>
}
@@ -0,0 +1,10 @@
package aquadx.net.db
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface ResetPasswordRepo : JpaRepository<ResetPassword, Long> {
fun findByToken(token: String): ResetPassword?
fun findByAquaNetUserAuId(auId: Long): List<ResetPassword>
}
@@ -0,0 +1,7 @@
package aquadx.net.db
import org.springframework.data.jpa.repository.JpaRepository
// Entity AquaGameOptions is now in :shared
interface AquaGameOptionsRepo : JpaRepository<AquaGameOptions, Long>
@@ -0,0 +1,10 @@
package aquadx.net.db
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface SessionTokenRepo : JpaRepository<SessionToken, String> {
fun findByToken(token: String): SessionToken?
fun findByAquaNetUserAuId(auId: Long): List<SessionToken>
}
@@ -1,105 +1,24 @@
package icu.samnyan.aqua.net.db package aquadx.net.db
import com.fasterxml.jackson.annotation.JsonIgnore
import ext.* import ext.*
import icu.samnyan.aqua.net.UserRegistrar.Companion.cardExtIdEnd import aquadx.net.UserRegistrar.Companion.cardExtIdEnd
import icu.samnyan.aqua.net.UserRegistrar.Companion.cardExtIdStart import aquadx.net.UserRegistrar.Companion.cardExtIdStart
import icu.samnyan.aqua.net.components.JWT import aquadx.net.components.JWT
import icu.samnyan.aqua.sega.allnet.AllNetProps import aquadx.sega.allnet.AllNetProps
import icu.samnyan.aqua.sega.allnet.KeyChipRepo import aquadx.sega.allnet.KeyChipRepo
import icu.samnyan.aqua.sega.allnet.KeychipSession import aquadx.sega.general.GameMusicPopularity
import icu.samnyan.aqua.sega.general.GameMusicPopularity import aquadx.sega.general.dao.CardRepository
import icu.samnyan.aqua.sega.general.dao.CardRepository import aquadx.sega.general.model.Card
import icu.samnyan.aqua.sega.general.model.Card import aquadx.sega.general.service.CardService
import icu.samnyan.aqua.sega.general.service.CardService
import jakarta.persistence.* import jakarta.persistence.*
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.security.crypto.password.PasswordEncoder import org.springframework.security.crypto.password.PasswordEncoder
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
import java.io.Serializable
import java.time.LocalDateTime import java.time.LocalDateTime
import kotlin.jvm.optionals.getOrNull
import kotlin.reflect.KFunction
import kotlin.reflect.KMutableProperty import kotlin.reflect.KMutableProperty
import kotlin.reflect.full.functions import kotlin.reflect.full.functions
@Entity // Entity AquaNetUser and SettingField are now in :shared
class AquaNetUser(
@JsonIgnore
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
var auId: Long = 0,
@Column(nullable = false, unique = true, length = 32)
var username: String = "",
// Login credentials
@Column(nullable = false, unique = true)
var email: String = "",
@JsonIgnore
@Column(nullable = false)
var pwHash: String = "",
@Column(nullable = true, length = 32)
var displayName: String = "",
// Country code at most 3 characters
@Column(length = 3)
var country: String = "",
// Region code at most 2 characters
@Column(length = 2)
var region: String = "",
// Last login time
var lastLogin: Long = 0L,
// Registration time
var regTime: Long = 0L,
// Profile fields
var profileLocation: String? = "",
var profileBio: String? = "",
var profilePicture: String? = "",
var optOutOfLeaderboard: Boolean = false,
// Email confirmation
var emailConfirmed: Boolean = false,
@OneToOne(cascade = [CascadeType.ALL])
@JoinColumn(name = "ghostCard", unique = true, nullable = false)
var ghostCard: Card = Card(),
// One user can have multiple cards
@OneToMany(mappedBy = "aquaUser", cascade = [CascadeType.ALL])
var cards: MutableList<Card> = mutableListOf(),
// Each user can have one keychip (if the user owns a cabinet)
@JsonIgnore
@Column(nullable = true, length = 32, unique = true)
var keychip: Str? = null,
// Each user's keychip can have multiple sessions
@JsonIgnore
@OneToMany(mappedBy = "user", cascade = [CascadeType.ALL])
var keychipSessions: MutableList<KeychipSession> = mutableListOf(),
@OneToOne(cascade = [CascadeType.ALL])
@JoinColumn(name = "gameOptions", unique = true, nullable = true)
var gameOptions: AquaGameOptions? = null,
) : Serializable {
val computedName get() = displayName.ifEmpty { username }
val publicFields get() = mapOf(
"username" to username,
"displayName" to displayName,
"country" to country,
"regTime" to regTime,
"profileLocation" to profileLocation,
"profileBio" to profileBio,
"profilePicture" to profilePicture,
)
}
interface AquaNetUserRepo : JpaRepository<AquaNetUser, Long> { interface AquaNetUserRepo : JpaRepository<AquaNetUser, Long> {
fun findByAuId(auId: Long): AquaNetUser? fun findByAuId(auId: Long): AquaNetUser?
@@ -109,15 +28,8 @@ interface AquaNetUserRepo : JpaRepository<AquaNetUser, Long> {
fun findByGhostCardExtId(extId: Long): AquaNetUser? fun findByGhostCardExtId(extId: Long): AquaNetUser?
} }
data class SettingField(
val name: Str,
val checker: KFunction<*>,
val setter: KMutableProperty.Setter<*>,
)
/** /**
* This class is a validator for user fields. It will return the parsed value if the field is valid, or * User services (formerly inside AquaNetUser.kt in the monolithic setup).
* throw an ApiException if the field is invalid.
*/ */
@Service @Service
class AquaUserServices( class AquaUserServices(
@@ -1,11 +1,11 @@
package icu.samnyan.aqua.net.games package aquadx.net.games
import ext.* import ext.*
import icu.samnyan.aqua.net.BotProps import aquadx.net.BotProps
import icu.samnyan.aqua.net.db.AquaUserServices import aquadx.net.db.AquaUserServices
import icu.samnyan.aqua.net.utils.SUCCESS import aquadx.net.utils.SUCCESS
import icu.samnyan.aqua.sega.general.model.Card import aquadx.sega.general.model.Card
import icu.samnyan.aqua.sega.general.service.CardService import aquadx.sega.general.service.CardService
import jakarta.annotation.PostConstruct import jakarta.annotation.PostConstruct
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Autowired
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.net.games package aquadx.net.games
import ext.isoDate import ext.isoDate
import ext.minus import ext.minus
@@ -1,13 +1,13 @@
package icu.samnyan.aqua.net.games package aquadx.net.games
import ext.* import ext.*
import icu.samnyan.aqua.net.Fedy import aquadx.net.Fedy
import icu.samnyan.aqua.net.db.AquaNetUser import aquadx.net.db.AquaNetUser
import icu.samnyan.aqua.net.db.AquaUserServices import aquadx.net.db.AquaUserServices
import icu.samnyan.aqua.net.utils.AquaNetProps import aquadx.net.utils.AquaNetProps
import icu.samnyan.aqua.net.utils.SUCCESS import aquadx.net.utils.SUCCESS
import icu.samnyan.aqua.sega.general.model.Card import aquadx.sega.general.model.Card
import icu.samnyan.aqua.sega.general.service.CardService import aquadx.sega.general.service.CardService
import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Lazy import org.springframework.context.annotation.Lazy
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.net.games package aquadx.net.games
import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.DeserializationContext import com.fasterxml.jackson.databind.DeserializationContext
@@ -0,0 +1,29 @@
package aquadx.net.games
import aquadx.sega.general.model.Card
import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query
import org.springframework.data.repository.NoRepositoryBean
@NoRepositoryBean
interface GenericUserDataRepo<T : IUserData> : JpaRepository<T, Long> {
fun findByCard(card: Card): T?
fun findByCard_ExtId(extId: Long): T?
@Query("select e from #{'#'}{#entityName} e where e.card.rankingBanned = false")
fun findAllNonBanned(): List<T>
}
@NoRepositoryBean
interface GenericPlaylogRepo<T: IGenericGamePlaylog> : JpaRepository<T, Long> {
fun findByUserCardExtId(extId: Long): List<T>
fun findByUserCardExtId(extId: Long, page: Pageable): Page<T>
}
@NoRepositoryBean
interface GenericUserMusicRepo<T: IGenericUserMusic> : JpaRepository<T, Long> {
fun findByUserCardExtId(extId: Long): List<T>
fun findByUser_Card_ExtIdAndMusicIdIn(userId: Long, musicId: List<Int>): List<T>
}
@@ -1,14 +1,14 @@
package icu.samnyan.aqua.net.games.chu3 package aquadx.net.games.chu3
import ext.API import ext.API
import ext.returns import ext.returns
import ext.vars import ext.vars
import icu.samnyan.aqua.net.games.IExportClass import aquadx.net.games.IExportClass
import icu.samnyan.aqua.net.games.ImportClass import aquadx.net.games.ImportClass
import icu.samnyan.aqua.net.games.ImportController import aquadx.net.games.ImportController
import icu.samnyan.aqua.sega.chusan.model.Chu3Repos import aquadx.sega.chusan.model.Chu3Repos
import icu.samnyan.aqua.sega.chusan.model.Chu3UserLinked import aquadx.sega.chusan.model.Chu3UserLinked
import icu.samnyan.aqua.sega.chusan.model.userdata.* import aquadx.sega.chusan.model.userdata.*
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
import kotlin.reflect.full.declaredMembers import kotlin.reflect.full.declaredMembers
@@ -1,15 +1,15 @@
package icu.samnyan.aqua.net.games.chu3 package aquadx.net.games.chu3
import ext.* import ext.*
import icu.samnyan.aqua.net.db.AquaUserServices import aquadx.net.db.AquaUserServices
import icu.samnyan.aqua.net.games.* import aquadx.net.games.*
import icu.samnyan.aqua.net.utils.chu3Scores import aquadx.net.utils.chu3Scores
import icu.samnyan.aqua.sega.chusan.model.Chu3Repos import aquadx.sega.chusan.model.Chu3Repos
import icu.samnyan.aqua.sega.chusan.model.Chu3UserDataRepo import aquadx.sega.chusan.model.Chu3UserDataRepo
import icu.samnyan.aqua.sega.chusan.model.Chu3UserMusicDetailRepo import aquadx.sega.chusan.model.Chu3UserMusicDetailRepo
import icu.samnyan.aqua.sega.chusan.model.Chu3UserPlaylogRepo import aquadx.sega.chusan.model.Chu3UserPlaylogRepo
import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData import aquadx.sega.chusan.model.userdata.Chu3UserData
import icu.samnyan.aqua.sega.chusan.model.userdata.UserGameOption import aquadx.sega.chusan.model.userdata.UserGameOption
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
import kotlin.jvm.optionals.getOrNull import kotlin.jvm.optionals.getOrNull
import kotlin.reflect.KMutableProperty1 import kotlin.reflect.KMutableProperty1
@@ -1,16 +1,16 @@
package icu.samnyan.aqua.net.games.mai2 package aquadx.net.games.mai2
import ext.API import ext.API
import ext.returns import ext.returns
import ext.vars import ext.vars
import icu.samnyan.aqua.net.games.ExportOptions import aquadx.net.games.ExportOptions
import icu.samnyan.aqua.net.games.IExportClass import aquadx.net.games.IExportClass
import icu.samnyan.aqua.net.games.ImportClass import aquadx.net.games.ImportClass
import icu.samnyan.aqua.net.games.ImportController import aquadx.net.games.ImportController
import icu.samnyan.aqua.sega.maimai2.model.Mai2Repos import aquadx.sega.maimai2.model.Mai2Repos
import icu.samnyan.aqua.sega.maimai2.model.Mai2UserLinked import aquadx.sega.maimai2.model.Mai2UserLinked
import icu.samnyan.aqua.sega.maimai2.model.request.Mai2UserFavoriteItem import aquadx.sega.maimai2.model.request.Mai2UserFavoriteItem
import icu.samnyan.aqua.sega.maimai2.model.userdata.* import aquadx.sega.maimai2.model.userdata.*
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
import kotlin.reflect.full.declaredMembers import kotlin.reflect.full.declaredMembers
@@ -1,14 +1,14 @@
package icu.samnyan.aqua.net.games.mai2 package aquadx.net.games.mai2
import ext.API import ext.API
import ext.RB import ext.RB
import ext.RP import ext.RP
import ext.minus import ext.minus
import icu.samnyan.aqua.net.db.AquaUserServices import aquadx.net.db.AquaUserServices
import icu.samnyan.aqua.net.utils.SUCCESS import aquadx.net.utils.SUCCESS
import icu.samnyan.aqua.sega.general.service.CardService import aquadx.sega.general.service.CardService
import icu.samnyan.aqua.sega.maimai2.model.Mai2Repos import aquadx.sega.maimai2.model.Mai2Repos
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserMusicDetail import aquadx.sega.maimai2.model.userdata.Mai2UserMusicDetail
import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
@@ -1,19 +1,19 @@
package icu.samnyan.aqua.net.games.mai2 package aquadx.net.games.mai2
import ext.* import ext.*
import icu.samnyan.aqua.net.db.AquaUserServices import aquadx.net.db.AquaUserServices
import icu.samnyan.aqua.net.games.* import aquadx.net.games.*
import icu.samnyan.aqua.net.utils.SUCCESS import aquadx.net.utils.SUCCESS
import icu.samnyan.aqua.net.utils.mai2Scores import aquadx.net.utils.mai2Scores
import icu.samnyan.aqua.sega.maimai2.handler.UploadUserPhotoHandler import aquadx.sega.maimai2.handler.UploadUserPhotoHandler
import icu.samnyan.aqua.sega.maimai2.model.Mai2Repos import aquadx.sega.maimai2.model.Mai2Repos
import icu.samnyan.aqua.sega.maimai2.model.Mai2UserDataRepo import aquadx.sega.maimai2.model.Mai2UserDataRepo
import icu.samnyan.aqua.sega.maimai2.model.Mai2UserMusicDetailRepo import aquadx.sega.maimai2.model.Mai2UserMusicDetailRepo
import icu.samnyan.aqua.sega.maimai2.model.Mai2UserPlaylogRepo import aquadx.sega.maimai2.model.Mai2UserPlaylogRepo
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserDetail import aquadx.sega.maimai2.model.userdata.Mai2UserDetail
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserGeneralData import aquadx.sega.maimai2.model.userdata.Mai2UserGeneralData
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserLoginBonus import aquadx.sega.maimai2.model.userdata.Mai2UserLoginBonus
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserOption import aquadx.sega.maimai2.model.userdata.Mai2UserOption
import org.springframework.http.MediaType import org.springframework.http.MediaType
import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
@@ -1,20 +1,19 @@
package icu.samnyan.aqua.net.games.ongeki package aquadx.net.games.ongeki
import ext.API import ext.API
import ext.RP import ext.RP
import ext.minus import ext.minus
import icu.samnyan.aqua.net.db.AquaUserServices import aquadx.net.db.AquaUserServices
import icu.samnyan.aqua.net.games.* import aquadx.net.games.*
import icu.samnyan.aqua.net.utils.ongekiScores import aquadx.net.utils.ongekiScores
import icu.samnyan.aqua.sega.ongeki.OgkUserDataRepo import aquadx.sega.ongeki.OgkUserDataRepo
import icu.samnyan.aqua.sega.ongeki.OgkUserGeneralDataRepo import aquadx.sega.ongeki.OgkUserGeneralDataRepo
import icu.samnyan.aqua.sega.ongeki.OgkUserMusicDetailRepo import aquadx.sega.ongeki.OgkUserMusicDetailRepo
import icu.samnyan.aqua.sega.ongeki.OgkUserOptionRepo import aquadx.sega.ongeki.OgkUserOptionRepo
import icu.samnyan.aqua.sega.ongeki.OgkUserPlaylogRepo import aquadx.sega.ongeki.OgkUserPlaylogRepo
import icu.samnyan.aqua.sega.ongeki.model.UserData import aquadx.sega.ongeki.model.UserData
import icu.samnyan.aqua.sega.ongeki.model.UserOption import aquadx.sega.ongeki.model.UserOption
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
import kotlin.jvm.optionals.getOrNull
import kotlin.reflect.KMutableProperty1 import kotlin.reflect.KMutableProperty1
import kotlin.reflect.full.memberProperties import kotlin.reflect.full.memberProperties
@@ -1,16 +1,16 @@
package icu.samnyan.aqua.net.games.wacca package aquadx.net.games.wacca
import ext.API import ext.API
import ext.RP import ext.RP
import ext.isoDate import ext.isoDate
import ext.utc import ext.utc
import icu.samnyan.aqua.net.db.AquaUserServices import aquadx.net.db.AquaUserServices
import icu.samnyan.aqua.net.games.* import aquadx.net.games.*
import icu.samnyan.aqua.net.utils.waccaScores import aquadx.net.utils.waccaScores
import icu.samnyan.aqua.sega.wacca.model.db.WaccaUser import aquadx.sega.wacca.model.db.WaccaUser
import icu.samnyan.aqua.sega.wacca.model.db.WcUserBestScoreRepo import aquadx.sega.wacca.model.db.WcUserBestScoreRepo
import icu.samnyan.aqua.sega.wacca.model.db.WcUserPlayLogRepo import aquadx.sega.wacca.model.db.WcUserPlayLogRepo
import icu.samnyan.aqua.sega.wacca.model.db.WcUserRepo import aquadx.sega.wacca.model.db.WcUserRepo
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
@RestController @RestController
@@ -1,11 +1,11 @@
package icu.samnyan.aqua.net.transfer package aquadx.net.transfer
import ext.header import ext.header
import ext.post import ext.post
import ext.request import ext.request
import icu.samnyan.aqua.sega.aimedb.AimeDbClient import aquadx.sega.aimedb.AimeDbClient
import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder import aquadx.sega.allnet.AllNetBillingDecoder
import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder.decodeAllNetResp import aquadx.sega.allnet.AllNetBillingDecoder.decodeAllNetResp
import java.net.URI import java.net.URI
val keychipPattern = Regex("([A-Z\\d]{4}-[A-Z\\d]{11}|[A-Z\\d]{11})") val keychipPattern = Regex("([A-Z\\d]{4}-[A-Z\\d]{11}|[A-Z\\d]{11})")
@@ -1,19 +1,19 @@
package icu.samnyan.aqua.net.transfer package aquadx.net.transfer
import ext.* import ext.*
import icu.samnyan.aqua.sega.chusan.model.request.Chu3UserAll import aquadx.sega.chusan.model.request.Chu3UserAll
import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserActivity import aquadx.sega.chusan.model.userdata.Chu3UserActivity
import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserItem import aquadx.sega.chusan.model.userdata.Chu3UserItem
import icu.samnyan.aqua.sega.chusan.model.userdata.UserMusicDetail import aquadx.sega.chusan.model.userdata.UserMusicDetail
import icu.samnyan.aqua.sega.maimai2.model.request.Mai2UserAll import aquadx.sega.maimai2.model.request.Mai2UserAll
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserFavorite import aquadx.sega.maimai2.model.userdata.Mai2UserFavorite
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserItem import aquadx.sega.maimai2.model.userdata.Mai2UserItem
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserMusicDetail import aquadx.sega.maimai2.model.userdata.Mai2UserMusicDetail
import icu.samnyan.aqua.sega.ongeki.model.OngekiUpsertUserAll import aquadx.sega.ongeki.model.OngekiUpsertUserAll
import icu.samnyan.aqua.sega.ongeki.model.UserItem import aquadx.sega.ongeki.model.UserItem
import icu.samnyan.aqua.sega.util.BasicMapper import aquadx.sega.util.BasicMapper
import icu.samnyan.aqua.sega.util.IMapper import aquadx.sega.util.IMapper
import icu.samnyan.aqua.sega.util.StringMapper import aquadx.sega.util.StringMapper
abstract class DataBroker( abstract class DataBroker(
@@ -131,7 +131,7 @@ class OngekiDataBroker(allNet: AllNetClient, log: (String) -> Unit): DataBroker(
override val mapper = BasicMapper() override val mapper = BasicMapper()
override val url by lazy { allNet.gameUrl.ensureNoEndingSlash() } override val url by lazy { allNet.gameUrl.ensureNoEndingSlash() }
class UserMusicWrapper(var userMusicDetailList: List<icu.samnyan.aqua.sega.ongeki.model.UserMusicDetail>) class UserMusicWrapper(var userMusicDetailList: List<aquadx.sega.ongeki.model.UserMusicDetail>)
override fun pull(): String { override fun pull(): String {
val (userId, paged) = prePull() val (userId, paged) = prePull()
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.net.transfer package aquadx.net.transfer
import ext.* import ext.*
import jakarta.servlet.http.HttpServletResponse import jakarta.servlet.http.HttpServletResponse
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.net.utils package aquadx.net.utils
import jakarta.annotation.PostConstruct import jakarta.annotation.PostConstruct
import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.boot.context.properties.ConfigurationProperties
@@ -1,21 +1,13 @@
package icu.samnyan.aqua.net.utils package aquadx.net.utils
import ext.Str
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.ControllerAdvice import org.springframework.web.bind.annotation.ControllerAdvice
import org.springframework.web.bind.annotation.ExceptionHandler import org.springframework.web.bind.annotation.ExceptionHandler
val SUCCESS = ResponseEntity.ok().body(mapOf("status" to "ok")) val SUCCESS: ResponseEntity<Map<String, String>> = ResponseEntity.ok().body(mapOf("status" to "ok"))
class ApiException(val code: Int, message: Str) : RuntimeException(message) { fun ApiException.resp(): ResponseEntity<String> = ResponseEntity.status(code).body(message.toString())
companion object {
val log = LoggerFactory.getLogger(ApiException::class.java)
}
fun resp() = ResponseEntity.status(code).body(message.toString())
}
fun Exception.simpleDescribe(): String = if (this is ApiException) "E${code}" else javaClass.simpleName fun Exception.simpleDescribe(): String = if (this is ApiException) "E${code}" else javaClass.simpleName
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.net.utils package aquadx.net.utils
val mai2Scores = listOf( val mai2Scores = listOf(
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.net.utils package aquadx.net.utils
import ext.ensureEndingSlash import ext.ensureEndingSlash
import ext.path import ext.path
@@ -1,12 +1,12 @@
package icu.samnyan.aqua.sega.aimedb package aquadx.sega.aimedb
import ext.logger import ext.logger
import ext.toHex import ext.toHex
import icu.samnyan.aqua.net.Fedy import aquadx.net.Fedy
import icu.samnyan.aqua.net.db.AquaUserServices import aquadx.net.db.AquaUserServices
import icu.samnyan.aqua.sega.allnet.AllNetProps import aquadx.sega.allnet.AllNetProps
import icu.samnyan.aqua.sega.general.model.Card import aquadx.sega.general.model.Card
import icu.samnyan.aqua.sega.general.service.CardService import aquadx.sega.general.service.CardService
import io.netty.buffer.ByteBuf import io.netty.buffer.ByteBuf
import io.netty.buffer.ByteBufUtil import io.netty.buffer.ByteBufUtil
import io.netty.buffer.Unpooled import io.netty.buffer.Unpooled
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.sega.aimedb package aquadx.sega.aimedb
import ext.minus import ext.minus
import io.netty.buffer.ByteBuf import io.netty.buffer.ByteBuf
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.sega.aimedb package aquadx.sega.aimedb
import io.netty.buffer.ByteBuf import io.netty.buffer.ByteBuf
import io.netty.channel.ChannelHandlerContext import io.netty.channel.ChannelHandlerContext
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.sega.aimedb package aquadx.sega.aimedb
import io.netty.buffer.ByteBuf import io.netty.buffer.ByteBuf
import io.netty.channel.ChannelHandlerContext import io.netty.channel.ChannelHandlerContext
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.sega.aimedb package aquadx.sega.aimedb
import io.netty.buffer.ByteBuf import io.netty.buffer.ByteBuf
import io.netty.buffer.Unpooled.copiedBuffer import io.netty.buffer.Unpooled.copiedBuffer
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.sega.aimedb package aquadx.sega.aimedb
import ext.logger import ext.logger
import io.netty.bootstrap.ServerBootstrap import io.netty.bootstrap.ServerBootstrap
@@ -1,8 +1,8 @@
package icu.samnyan.aqua.sega.allnet package aquadx.sega.allnet
import ext.* import ext.*
import icu.samnyan.aqua.net.db.AquaNetUserRepo import aquadx.net.db.AquaNetUserRepo
import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder.decodeAllNet import aquadx.sega.allnet.AllNetBillingDecoder.decodeAllNet
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse import jakarta.servlet.http.HttpServletResponse
import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.boot.context.properties.ConfigurationProperties
@@ -1,8 +1,8 @@
package icu.samnyan.aqua.sega.allnet package aquadx.sega.allnet
import ext.bodyString import ext.bodyString
import ext.header import ext.header
import icu.samnyan.aqua.sega.util.ZLib import aquadx.sega.util.ZLib
import java.net.http.HttpResponse import java.net.http.HttpResponse
import java.util.* import java.util.*
import kotlin.text.Charsets.UTF_8 import kotlin.text.Charsets.UTF_8
@@ -1,8 +1,8 @@
package icu.samnyan.aqua.sega.allnet package aquadx.sega.allnet
import ext.Str import ext.Str
import icu.samnyan.aqua.net.FrontierProps import aquadx.net.FrontierProps
import icu.samnyan.aqua.net.components.GeoIP import aquadx.net.components.GeoIP
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletRequestWrapper import jakarta.servlet.http.HttpServletRequestWrapper
import jakarta.servlet.http.HttpServletResponse import jakarta.servlet.http.HttpServletResponse
@@ -0,0 +1,10 @@
package aquadx.sega.allnet
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface KeyChipRepo : JpaRepository<Keychip, Long> {
fun findByKeychipId(keychipId: String): Keychip?
fun existsByKeychipId(keychipId: String): Boolean
}
@@ -1,48 +1,17 @@
package icu.samnyan.aqua.sega.allnet package aquadx.sega.allnet
import ext.async import ext.async
import icu.samnyan.aqua.net.db.AquaNetUser import aquadx.net.db.AquaNetUser
import jakarta.persistence.*
import jakarta.transaction.Transactional import jakarta.transaction.Transactional
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.scheduling.annotation.Scheduled import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Repository import org.springframework.stereotype.Repository
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
import java.security.SecureRandom
/** /**
* This is a one-to-many mapping of keychip to session token. * Repository and Service for KeychipSession (Entity is located in :shared module).
*/ */
@Entity
@Table(name = "allnet_keychip_sessions", indexes = [
Index(name = "idx_last_use", columnList = "lastUse")
])
class KeychipSession(
@ManyToOne
@JoinColumn(name = "au_id")
var user: AquaNetUser? = null,
@Column(length = 4)
val gameId: String,
@Id
@Column(length = 32)
val token: String = genUrlSafeToken(32),
@Column(nullable = false)
var lastUse: Long = System.currentTimeMillis()
)
val urlSafeChars = ('a'..'z') + ('A'..'Z') + ('0'..'9') + listOf('-', '_', '.', '~')
fun genUrlSafeToken(length: Int): String {
val random = SecureRandom()
return (1..length)
.map { urlSafeChars[random.nextInt(urlSafeChars.size)] }
.joinToString("")
}
@Repository("KeychipSessionRepo") @Repository("KeychipSessionRepo")
interface KeychipSessionRepo : JpaRepository<KeychipSession, String> { interface KeychipSessionRepo : JpaRepository<KeychipSession, String> {
@@ -1,8 +1,8 @@
package icu.samnyan.aqua.sega.billing package aquadx.sega.billing
import aquadx.sega.allnet.AllNetBillingDecoder
import ext.logger import ext.logger
import ext.toUrl import ext.toUrl
import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder.decodeBilling
import jakarta.annotation.PostConstruct import jakarta.annotation.PostConstruct
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
import org.eclipse.jetty.http.HttpVersion import org.eclipse.jetty.http.HttpVersion
@@ -55,7 +55,7 @@ class Billing(
@PostMapping("/request", produces = ["text/plain"]) @PostMapping("/request", produces = ["text/plain"])
fun powerOn(dataStream: InputStream, req: HttpServletRequest?): String { fun powerOn(dataStream: InputStream, req: HttpServletRequest?): String {
val bytes = dataStream.readAllBytes() val bytes = dataStream.readAllBytes()
val reqMap = decodeBilling(bytes) val reqMap = AllNetBillingDecoder.decodeBilling(bytes)
logger.info("Billing : $reqMap") logger.info("Billing : $reqMap")
@@ -1,11 +1,11 @@
package icu.samnyan.aqua.sega.cardmaker package aquadx.sega.cardmaker
import aquadx.sega.allnet.TokenChecker
import aquadx.sega.util.BasicMapper
import ext.API import ext.API
import ext.logger import ext.logger
import ext.long import ext.long
import ext.parsing import ext.parsing
import icu.samnyan.aqua.sega.allnet.TokenChecker
import icu.samnyan.aqua.sega.util.BasicMapper
import org.springframework.beans.factory.annotation.Value import org.springframework.beans.factory.annotation.Value
import org.springframework.web.bind.annotation.ModelAttribute import org.springframework.web.bind.annotation.ModelAttribute
import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestMapping
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.sega.cardmaker package aquadx.sega.cardmaker
import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.core.type.TypeReference
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectMapper
@@ -11,7 +11,7 @@ import java.nio.charset.StandardCharsets
/** /**
* @author samnyan (privateamusement@protonmail.com) * @author samnyan (privateamusement@protonmail.com)
*/ */
@RestControllerAdvice(basePackages = ["icu.samnyan.aqua.sega.cardmaker"]) @RestControllerAdvice(basePackages = ["aquadx.sega.cardmaker"])
class CardMakerControllerAdvice { class CardMakerControllerAdvice {
val logger = logger() val logger = logger()
val mapper = ObjectMapper() val mapper = ObjectMapper()
@@ -1,19 +1,19 @@
package icu.samnyan.aqua.sega.chusan package aquadx.sega.chusan
import ext.* import ext.*
import icu.samnyan.aqua.net.db.AquaUserServices import aquadx.net.db.AquaUserServices
import icu.samnyan.aqua.net.games.chu3.Chusan import aquadx.net.games.chu3.Chusan
import icu.samnyan.aqua.net.utils.simpleDescribe import aquadx.net.utils.simpleDescribe
import icu.samnyan.aqua.sega.allnet.TokenChecker import aquadx.sega.allnet.TokenChecker
import icu.samnyan.aqua.sega.chusan.handler.chusanInit import aquadx.sega.chusan.handler.chusanInit
import icu.samnyan.aqua.sega.chusan.model.Chu3Repos import aquadx.sega.chusan.model.Chu3Repos
import icu.samnyan.aqua.sega.general.GameMusicPopularity import aquadx.sega.general.GameMusicPopularity
import icu.samnyan.aqua.sega.general.MeowApi import aquadx.sega.general.MeowApi
import icu.samnyan.aqua.sega.general.RequestContext import aquadx.sega.general.RequestContext
import icu.samnyan.aqua.sega.general.service.CardService import aquadx.sega.general.service.CardService
import icu.samnyan.aqua.sega.util.BasicMapper import aquadx.sega.util.BasicMapper
import icu.samnyan.aqua.sega.util.StringMapper import aquadx.sega.util.StringMapper
import icu.samnyan.aqua.spring.Metrics import aquadx.spring.Metrics
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
@@ -83,7 +83,7 @@ class ChusanController(
if (api !in setOf("GetUserItemApi", "GetGameEventApi")) if (api !in setOf("GetUserItemApi", "GetGameEventApi"))
log.info("$token : $api > ${it.truncate(500)}") log.info("$token : $api > ${it.truncate(500)}")
} }
} }!!
} catch (e: Exception) { } catch (e: Exception) {
Metrics.counter("aquadx_chusan_api_error", "api" to api, "error" to e.simpleDescribe()).increment() Metrics.counter("aquadx_chusan_api_error", "api" to api, "error" to e.simpleDescribe()).increment()
throw e throw e
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.sega.chusan package aquadx.sega.chusan
object ChusanData { object ChusanData {
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.sega.chusan package aquadx.sega.chusan
import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Configuration
@@ -1,7 +1,7 @@
package icu.samnyan.aqua.sega.chusan package aquadx.sega.chusan
import ext.logger import ext.logger
import icu.samnyan.aqua.sega.chusan.model.Chu3Repos import aquadx.sega.chusan.model.Chu3Repos
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
@@ -1,14 +1,14 @@
package icu.samnyan.aqua.sega.chusan.handler package aquadx.sega.chusan.handler
import ext.* import ext.*
import icu.samnyan.aqua.sega.allnet.TokenChecker import aquadx.sega.allnet.TokenChecker
import icu.samnyan.aqua.sega.chusan.ChusanController import aquadx.sega.chusan.ChusanController
import icu.samnyan.aqua.sega.chusan.ChusanData import aquadx.sega.chusan.ChusanData
import icu.samnyan.aqua.sega.chusan.model.request.UserCMissionResp import aquadx.sega.chusan.model.request.UserCMissionResp
import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserItem import aquadx.sega.chusan.model.userdata.Chu3UserItem
import icu.samnyan.aqua.sega.chusan.model.userdata.UserMusicDetail import aquadx.sega.chusan.model.userdata.UserMusicDetail
import icu.samnyan.aqua.sega.general.model.CardStatus import aquadx.sega.general.model.CardStatus
import icu.samnyan.aqua.sega.general.model.UserRecentRating import aquadx.sega.general.model.UserRecentRating
import org.springframework.data.repository.findByIdOrNull import org.springframework.data.repository.findByIdOrNull
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter
@@ -1,11 +1,11 @@
package icu.samnyan.aqua.sega.chusan.handler package aquadx.sega.chusan.handler
import ext.* import ext.*
import icu.samnyan.aqua.sega.chusan.ChusanController import aquadx.sega.chusan.ChusanController
import icu.samnyan.aqua.sega.chusan.model.request.UpsertUserGacha import aquadx.sega.chusan.model.request.UpsertUserGacha
import icu.samnyan.aqua.sega.chusan.model.request.UserEmoney import aquadx.sega.chusan.model.request.UserEmoney
import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserItem import aquadx.sega.chusan.model.userdata.Chu3UserItem
import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState import aquadx.sega.chusan.model.userdata.UserCardPrintState
import java.time.LocalDateTime import java.time.LocalDateTime
fun ChusanController.cmApiInit() { fun ChusanController.cmApiInit() {
@@ -1,14 +1,14 @@
@file:Suppress("UNCHECKED_CAST") @file:Suppress("UNCHECKED_CAST")
package icu.samnyan.aqua.sega.chusan.handler package aquadx.sega.chusan.handler
import ext.JDict import ext.JDict
import ext.int import ext.int
import ext.millis import ext.millis
import ext.parsing import ext.parsing
import icu.samnyan.aqua.sega.chusan.ChusanController import aquadx.sega.chusan.ChusanController
import icu.samnyan.aqua.sega.chusan.model.request.MatchingWaitState import aquadx.sega.chusan.model.request.MatchingWaitState
import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3MatchingMemberReq import aquadx.sega.chusan.model.userdata.Chu3MatchingMemberReq
fun ChusanController.matchingApiInit() { fun ChusanController.matchingApiInit() {
@@ -1,11 +1,11 @@
package icu.samnyan.aqua.sega.chusan.handler package aquadx.sega.chusan.handler
import ext.* import ext.*
import icu.samnyan.aqua.sega.chusan.ChusanController import aquadx.sega.chusan.ChusanController
import icu.samnyan.aqua.sega.chusan.model.request.Chu3UserAll import aquadx.sega.chusan.model.request.Chu3UserAll
import icu.samnyan.aqua.sega.chusan.model.userdata.* import aquadx.sega.chusan.model.userdata.*
import icu.samnyan.aqua.sega.general.model.CardStatus import aquadx.sega.general.model.CardStatus
import icu.samnyan.aqua.sega.general.model.UserRecentRating import aquadx.sega.general.model.UserRecentRating
import kotlinx.serialization.encodeToString import kotlinx.serialization.encodeToString
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@@ -1,20 +1,20 @@
@file:Suppress("FunctionName") @file:Suppress("FunctionName")
package icu.samnyan.aqua.sega.chusan.model package aquadx.sega.chusan.model
import icu.samnyan.aqua.net.games.GenericPlaylogRepo import aquadx.net.games.GenericPlaylogRepo
import icu.samnyan.aqua.net.games.GenericUserDataRepo import aquadx.net.games.GenericUserDataRepo
import icu.samnyan.aqua.net.games.GenericUserMusicRepo import aquadx.net.games.GenericUserMusicRepo
import icu.samnyan.aqua.net.games.IUserRepo import aquadx.net.games.IUserRepo
import icu.samnyan.aqua.sega.chusan.model.userdata.* import aquadx.sega.chusan.model.userdata.*
import org.springframework.data.domain.Page import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable import org.springframework.data.domain.Pageable
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query import org.springframework.data.jpa.repository.Query
import org.springframework.data.repository.NoRepositoryBean import org.springframework.data.repository.NoRepositoryBean
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import icu.samnyan.aqua.sega.util.GameDataService import aquadx.sega.util.GameDataService
import icu.samnyan.aqua.sega.util.StaticRepo import aquadx.sega.util.StaticRepo
@NoRepositoryBean @NoRepositoryBean
@@ -1,22 +1,22 @@
package icu.samnyan.aqua.sega.diva package aquadx.sega.diva
import ext.JDict import ext.JDict
import ext.MutJDict import ext.MutJDict
import ext.emptyMap import ext.emptyMap
import ext.logger import ext.logger
import icu.samnyan.aqua.sega.diva.handler.AttendHandler import aquadx.sega.diva.handler.AttendHandler
import icu.samnyan.aqua.sega.diva.handler.PingHandler import aquadx.sega.diva.handler.PingHandler
import icu.samnyan.aqua.sega.diva.handler.card.CardProcedureHandler import aquadx.sega.diva.handler.card.CardProcedureHandler
import icu.samnyan.aqua.sega.diva.handler.card.ChangeNameHandler import aquadx.sega.diva.handler.card.ChangeNameHandler
import icu.samnyan.aqua.sega.diva.handler.card.ChangePasswdHandler import aquadx.sega.diva.handler.card.ChangePasswdHandler
import icu.samnyan.aqua.sega.diva.handler.card.RegistrationHandler import aquadx.sega.diva.handler.card.RegistrationHandler
import icu.samnyan.aqua.sega.diva.handler.databank.* import aquadx.sega.diva.handler.databank.*
import icu.samnyan.aqua.sega.diva.handler.ingame.* import aquadx.sega.diva.handler.ingame.*
import icu.samnyan.aqua.sega.diva.handler.user.* import aquadx.sega.diva.handler.user.*
import icu.samnyan.aqua.sega.diva.model.* import aquadx.sega.diva.model.*
import icu.samnyan.aqua.sega.diva.util.DivaMapper import aquadx.sega.diva.util.DivaMapper
import icu.samnyan.aqua.sega.diva.util.DivaTime import aquadx.sega.diva.util.DivaTime
import icu.samnyan.aqua.sega.diva.util.URIEncoder.encode import aquadx.sega.diva.util.URIEncoder.encode
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
import org.springframework.http.MediaType import org.springframework.http.MediaType
import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PostMapping
@@ -1,12 +1,12 @@
package icu.samnyan.aqua.sega.diva package aquadx.sega.diva
import ext.invoke import ext.invoke
import icu.samnyan.aqua.sega.diva.model.common.Difficulty import aquadx.sega.diva.model.common.Difficulty
import icu.samnyan.aqua.sega.diva.model.common.Edition import aquadx.sega.diva.model.common.Edition
import icu.samnyan.aqua.sega.diva.model.db.gamedata.* import aquadx.sega.diva.model.db.gamedata.*
import icu.samnyan.aqua.sega.diva.model.db.userdata.* import aquadx.sega.diva.model.db.userdata.*
import icu.samnyan.aqua.sega.diva.util.ProfileNotFoundException import aquadx.sega.diva.util.ProfileNotFoundException
import icu.samnyan.aqua.sega.diva.util.SessionNotFoundException import aquadx.sega.diva.util.SessionNotFoundException
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query import org.springframework.data.jpa.repository.Query
import org.springframework.data.repository.query.Param import org.springframework.data.repository.query.Param
@@ -1,9 +1,9 @@
package icu.samnyan.aqua.sega.diva package aquadx.sega.diva
import icu.samnyan.aqua.sega.diva.model.RegistrationRequest import aquadx.sega.diva.model.RegistrationRequest
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerCustomize import aquadx.sega.diva.model.db.userdata.PlayerCustomize
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerModule import aquadx.sega.diva.model.db.userdata.PlayerModule
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerProfile import aquadx.sega.diva.model.db.userdata.PlayerProfile
import org.apache.commons.lang3.StringUtils import org.apache.commons.lang3.StringUtils
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
@@ -1,10 +1,10 @@
package icu.samnyan.aqua.sega.diva.handler package aquadx.sega.diva.handler
import ext.csv import ext.csv
import icu.samnyan.aqua.sega.diva.model.BaseRequest import aquadx.sega.diva.model.BaseRequest
import icu.samnyan.aqua.sega.diva.model.PingResponse import aquadx.sega.diva.model.PingResponse
import icu.samnyan.aqua.sega.general.dao.PropertyEntryRepository import aquadx.sega.general.dao.PropertyEntryRepository
import icu.samnyan.aqua.sega.general.model.PropertyEntry import aquadx.sega.general.model.PropertyEntry
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.time.LocalDateTime import java.time.LocalDateTime
import java.util.* import java.util.*
@@ -1,11 +1,11 @@
package icu.samnyan.aqua.sega.diva.handler.card package aquadx.sega.diva.handler.card
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.CardProcedureRequest import aquadx.sega.diva.model.CardProcedureRequest
import icu.samnyan.aqua.sega.diva.model.CardProcedureResponse import aquadx.sega.diva.model.CardProcedureResponse
import icu.samnyan.aqua.sega.diva.model.common.Result import aquadx.sega.diva.model.common.Result
import icu.samnyan.aqua.sega.diva.model.common.StartMode import aquadx.sega.diva.model.common.StartMode
import icu.samnyan.aqua.sega.diva.model.db.userdata.GameSession import aquadx.sega.diva.model.db.userdata.GameSession
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.time.LocalDateTime import java.time.LocalDateTime
import java.util.concurrent.ThreadLocalRandom import java.util.concurrent.ThreadLocalRandom
@@ -1,9 +1,9 @@
package icu.samnyan.aqua.sega.diva.handler.card package aquadx.sega.diva.handler.card
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.ChangeNameRequest import aquadx.sega.diva.model.ChangeNameRequest
import icu.samnyan.aqua.sega.diva.model.ChangeNameResponse import aquadx.sega.diva.model.ChangeNameResponse
import icu.samnyan.aqua.sega.diva.model.common.Result import aquadx.sega.diva.model.common.Result
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
/** /**
@@ -1,10 +1,10 @@
package icu.samnyan.aqua.sega.diva.handler.card package aquadx.sega.diva.handler.card
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.ChangePasswdRequest import aquadx.sega.diva.model.ChangePasswdRequest
import icu.samnyan.aqua.sega.diva.model.ChangePasswdResponse import aquadx.sega.diva.model.ChangePasswdResponse
import icu.samnyan.aqua.sega.diva.model.common.PassStat import aquadx.sega.diva.model.common.PassStat
import icu.samnyan.aqua.sega.diva.model.common.Result import aquadx.sega.diva.model.common.Result
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
/** /**
@@ -1,9 +1,9 @@
package icu.samnyan.aqua.sega.diva.handler.card package aquadx.sega.diva.handler.card
import icu.samnyan.aqua.sega.diva.PlayerProfileService import aquadx.sega.diva.PlayerProfileService
import icu.samnyan.aqua.sega.diva.model.RegistrationRequest import aquadx.sega.diva.model.RegistrationRequest
import icu.samnyan.aqua.sega.diva.model.RegistrationResponse import aquadx.sega.diva.model.RegistrationResponse
import icu.samnyan.aqua.sega.diva.model.common.Result import aquadx.sega.diva.model.common.Result
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
/** /**
@@ -1,10 +1,10 @@
package icu.samnyan.aqua.sega.diva.handler.databank package aquadx.sega.diva.handler.databank
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.BaseRequest import aquadx.sega.diva.model.BaseRequest
import icu.samnyan.aqua.sega.diva.model.ContestInfoResponse import aquadx.sega.diva.model.ContestInfoResponse
import icu.samnyan.aqua.sega.diva.model.db.gamedata.Contest import aquadx.sega.diva.model.db.gamedata.Contest
import icu.samnyan.aqua.sega.diva.util.URIEncoder.encode import aquadx.sega.diva.util.URIEncoder.encode
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.time.LocalDateTime import java.time.LocalDateTime
import java.util.function.Consumer import java.util.function.Consumer
@@ -1,9 +1,9 @@
package icu.samnyan.aqua.sega.diva.handler.databank package aquadx.sega.diva.handler.databank
import icu.samnyan.aqua.sega.diva.FestaRepository import aquadx.sega.diva.FestaRepository
import icu.samnyan.aqua.sega.diva.model.BaseRequest import aquadx.sega.diva.model.BaseRequest
import icu.samnyan.aqua.sega.diva.model.FestaInfoResponse import aquadx.sega.diva.model.FestaInfoResponse
import icu.samnyan.aqua.sega.diva.model.common.collection.FestaCollection import aquadx.sega.diva.model.common.collection.FestaCollection
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
/** /**
@@ -1,7 +1,7 @@
package icu.samnyan.aqua.sega.diva.handler.databank package aquadx.sega.diva.handler.databank
import icu.samnyan.aqua.sega.diva.model.BaseRequest import aquadx.sega.diva.model.BaseRequest
import icu.samnyan.aqua.sega.diva.model.NvRankingResponse import aquadx.sega.diva.model.NvRankingResponse
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
/** /**
@@ -1,13 +1,13 @@
package icu.samnyan.aqua.sega.diva.handler.databank package aquadx.sega.diva.handler.databank
import ext.csv import ext.csv
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.PsRankingRequest import aquadx.sega.diva.model.PsRankingRequest
import icu.samnyan.aqua.sega.diva.model.PsRankingResponse import aquadx.sega.diva.model.PsRankingResponse
import icu.samnyan.aqua.sega.diva.model.common.Difficulty import aquadx.sega.diva.model.common.Difficulty
import icu.samnyan.aqua.sega.diva.model.common.Edition import aquadx.sega.diva.model.common.Edition
import icu.samnyan.aqua.sega.diva.model.common.collection.PsRankingCollection import aquadx.sega.diva.model.common.collection.PsRankingCollection
import icu.samnyan.aqua.sega.diva.util.URIEncoder.encode import aquadx.sega.diva.util.URIEncoder.encode
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.time.LocalDateTime import java.time.LocalDateTime
import java.util.* import java.util.*
@@ -1,11 +1,11 @@
package icu.samnyan.aqua.sega.diva.handler.databank package aquadx.sega.diva.handler.databank
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.BaseRequest import aquadx.sega.diva.model.BaseRequest
import icu.samnyan.aqua.sega.diva.model.PvListResponse import aquadx.sega.diva.model.PvListResponse
import icu.samnyan.aqua.sega.diva.model.common.Difficulty import aquadx.sega.diva.model.common.Difficulty
import icu.samnyan.aqua.sega.diva.model.db.gamedata.PvEntry import aquadx.sega.diva.model.db.gamedata.PvEntry
import icu.samnyan.aqua.sega.diva.util.URIEncoder.encode import aquadx.sega.diva.util.URIEncoder.encode
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.time.LocalDateTime import java.time.LocalDateTime
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter
@@ -1,9 +1,9 @@
package icu.samnyan.aqua.sega.diva.handler.databank package aquadx.sega.diva.handler.databank
import icu.samnyan.aqua.sega.diva.DivaModuleRepository import aquadx.sega.diva.DivaModuleRepository
import icu.samnyan.aqua.sega.diva.model.BaseRequest import aquadx.sega.diva.model.BaseRequest
import icu.samnyan.aqua.sega.diva.model.ShopCatalogResponse import aquadx.sega.diva.model.ShopCatalogResponse
import icu.samnyan.aqua.sega.diva.util.URIEncoder.encode import aquadx.sega.diva.util.URIEncoder.encode
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.time.LocalDateTime import java.time.LocalDateTime
@@ -1,10 +1,10 @@
package icu.samnyan.aqua.sega.diva.handler.ingame package aquadx.sega.diva.handler.ingame
import ext.invoke import ext.invoke
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.BuyCstmzItmRequest import aquadx.sega.diva.model.BuyCstmzItmRequest
import icu.samnyan.aqua.sega.diva.model.BuyCstmzItmResponse import aquadx.sega.diva.model.BuyCstmzItmResponse
import icu.samnyan.aqua.sega.diva.model.common.Result import aquadx.sega.diva.model.common.Result
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
/** /**
@@ -1,9 +1,9 @@
package icu.samnyan.aqua.sega.diva.handler.ingame package aquadx.sega.diva.handler.ingame
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.BuyModuleRequest import aquadx.sega.diva.model.BuyModuleRequest
import icu.samnyan.aqua.sega.diva.model.BuyModuleResponse import aquadx.sega.diva.model.BuyModuleResponse
import icu.samnyan.aqua.sega.diva.model.common.Result import aquadx.sega.diva.model.common.Result
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
/** /**
@@ -1,14 +1,14 @@
package icu.samnyan.aqua.sega.diva.handler.ingame package aquadx.sega.diva.handler.ingame
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.GetPvPdRequest import aquadx.sega.diva.model.GetPvPdRequest
import icu.samnyan.aqua.sega.diva.model.GetPvPdResponse import aquadx.sega.diva.model.GetPvPdResponse
import icu.samnyan.aqua.sega.diva.model.common.Difficulty import aquadx.sega.diva.model.common.Difficulty
import icu.samnyan.aqua.sega.diva.model.common.Edition import aquadx.sega.diva.model.common.Edition
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerPvCustomize import aquadx.sega.diva.model.db.userdata.PlayerPvCustomize
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerPvRecord import aquadx.sega.diva.model.db.userdata.PlayerPvRecord
import icu.samnyan.aqua.sega.diva.util.DivaTime import aquadx.sega.diva.util.DivaTime
import icu.samnyan.aqua.sega.diva.util.URIEncoder.encode import aquadx.sega.diva.util.URIEncoder.encode
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.util.function.Supplier import java.util.function.Supplier
@@ -1,11 +1,11 @@
package icu.samnyan.aqua.sega.diva.handler.ingame package aquadx.sega.diva.handler.ingame
import ext.csv import ext.csv
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.ShopExitRequest import aquadx.sega.diva.model.ShopExitRequest
import icu.samnyan.aqua.sega.diva.model.ShopExitResponse import aquadx.sega.diva.model.ShopExitResponse
import icu.samnyan.aqua.sega.diva.model.common.Result import aquadx.sega.diva.model.common.Result
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerPvCustomize import aquadx.sega.diva.model.db.userdata.PlayerPvCustomize
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.util.function.Supplier import java.util.function.Supplier
@@ -1,12 +1,12 @@
package icu.samnyan.aqua.sega.diva.handler.ingame package aquadx.sega.diva.handler.ingame
import ext.logger import ext.logger
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.StageResultRequest import aquadx.sega.diva.model.StageResultRequest
import icu.samnyan.aqua.sega.diva.model.StageResultResponse import aquadx.sega.diva.model.StageResultResponse
import icu.samnyan.aqua.sega.diva.model.common.* import aquadx.sega.diva.model.common.*
import icu.samnyan.aqua.sega.diva.model.db.userdata.* import aquadx.sega.diva.model.db.userdata.*
import icu.samnyan.aqua.sega.diva.util.DivaCalculator import aquadx.sega.diva.util.DivaCalculator
import org.apache.commons.lang3.StringUtils import org.apache.commons.lang3.StringUtils
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.lang.String import java.lang.String
@@ -1,8 +1,8 @@
package icu.samnyan.aqua.sega.diva.handler.ingame package aquadx.sega.diva.handler.ingame
import ext.emptyMap import ext.emptyMap
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.StageStartRequest import aquadx.sega.diva.model.StageStartRequest
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
/** /**
@@ -1,12 +1,12 @@
package icu.samnyan.aqua.sega.diva.handler.ingame package aquadx.sega.diva.handler.ingame
import ext.csv import ext.csv
import ext.logger import ext.logger
import icu.samnyan.aqua.sega.diva.DIVA_BAD import aquadx.sega.diva.DIVA_BAD
import icu.samnyan.aqua.sega.diva.DIVA_OK import aquadx.sega.diva.DIVA_OK
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.StoreSsRequest import aquadx.sega.diva.model.StoreSsRequest
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerScreenShot import aquadx.sega.diva.model.db.userdata.PlayerScreenShot
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import org.springframework.web.multipart.MultipartFile import org.springframework.web.multipart.MultipartFile
import java.io.IOException import java.io.IOException
@@ -1,15 +1,15 @@
package icu.samnyan.aqua.sega.diva.handler.user package aquadx.sega.diva.handler.user
import icu.samnyan.aqua.sega.diva.DIVA_OK import aquadx.sega.diva.DIVA_OK
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.StageResultRequest import aquadx.sega.diva.model.StageResultRequest
import icu.samnyan.aqua.sega.diva.model.common.ContestBorder import aquadx.sega.diva.model.common.ContestBorder
import icu.samnyan.aqua.sega.diva.model.common.Difficulty import aquadx.sega.diva.model.common.Difficulty
import icu.samnyan.aqua.sega.diva.model.common.Edition import aquadx.sega.diva.model.common.Edition
import icu.samnyan.aqua.sega.diva.model.common.SortMode import aquadx.sega.diva.model.common.SortMode
import icu.samnyan.aqua.sega.diva.model.db.gamedata.Contest import aquadx.sega.diva.model.db.gamedata.Contest
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerContest import aquadx.sega.diva.model.db.userdata.PlayerContest
import icu.samnyan.aqua.sega.diva.util.DivaStringUtils import aquadx.sega.diva.util.DivaStringUtils
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.lang.String import java.lang.String
import java.time.LocalDateTime import java.time.LocalDateTime
@@ -1,8 +1,8 @@
package icu.samnyan.aqua.sega.diva.handler.user package aquadx.sega.diva.handler.user
import icu.samnyan.aqua.sega.diva.DIVA_OK import aquadx.sega.diva.DIVA_OK
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.PdUnlockRequest import aquadx.sega.diva.model.PdUnlockRequest
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
@Component @Component
@@ -1,13 +1,13 @@
package icu.samnyan.aqua.sega.diva.handler.user package aquadx.sega.diva.handler.user
import ext.invoke import ext.invoke
import ext.logger import ext.logger
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.PreStartRequest import aquadx.sega.diva.model.PreStartRequest
import icu.samnyan.aqua.sega.diva.model.PreStartResponse import aquadx.sega.diva.model.PreStartResponse
import icu.samnyan.aqua.sega.diva.model.common.PreStartResult import aquadx.sega.diva.model.common.PreStartResult
import icu.samnyan.aqua.sega.diva.model.common.StartMode import aquadx.sega.diva.model.common.StartMode
import icu.samnyan.aqua.sega.diva.model.db.userdata.GameSession import aquadx.sega.diva.model.db.userdata.GameSession
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.time.LocalDateTime import java.time.LocalDateTime
import java.util.concurrent.ThreadLocalRandom import java.util.concurrent.ThreadLocalRandom
@@ -1,8 +1,8 @@
package icu.samnyan.aqua.sega.diva.handler.user package aquadx.sega.diva.handler.user
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.SpendCreditRequest import aquadx.sega.diva.model.SpendCreditRequest
import icu.samnyan.aqua.sega.diva.model.SpendCreditResponse import aquadx.sega.diva.model.SpendCreditResponse
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
/** /**
@@ -1,15 +1,15 @@
package icu.samnyan.aqua.sega.diva.handler.user package aquadx.sega.diva.handler.user
import icu.samnyan.aqua.sega.diva.DivaRepos import aquadx.sega.diva.DivaRepos
import icu.samnyan.aqua.sega.diva.model.StartRequest import aquadx.sega.diva.model.StartRequest
import icu.samnyan.aqua.sega.diva.model.StartResponse import aquadx.sega.diva.model.StartResponse
import icu.samnyan.aqua.sega.diva.model.common.* import aquadx.sega.diva.model.common.*
import icu.samnyan.aqua.sega.diva.model.common.collection.ClearTally import aquadx.sega.diva.model.common.collection.ClearTally
import icu.samnyan.aqua.sega.diva.model.db.userdata.GameSession import aquadx.sega.diva.model.db.userdata.GameSession
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerContest import aquadx.sega.diva.model.db.userdata.PlayerContest
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerProfile import aquadx.sega.diva.model.db.userdata.PlayerProfile
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerPvRecord import aquadx.sega.diva.model.db.userdata.PlayerPvRecord
import icu.samnyan.aqua.sega.diva.util.PvRecordDataException import aquadx.sega.diva.util.PvRecordDataException
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.time.LocalDateTime import java.time.LocalDateTime
import java.util.* import java.util.*
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.sega.diva.util package aquadx.sega.diva.util
import com.fasterxml.jackson.core.json.JsonWriteFeature import com.fasterxml.jackson.core.json.JsonWriteFeature
import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.core.type.TypeReference
@@ -8,9 +8,9 @@ import com.fasterxml.jackson.databind.json.JsonMapper
import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.module.SimpleModule
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer
import ext.JDict import ext.JDict
import icu.samnyan.aqua.sega.util.BooleanNumberDeserializer import aquadx.sega.util.BooleanNumberDeserializer
import icu.samnyan.aqua.sega.util.BooleanNumberSerializer import aquadx.sega.util.BooleanNumberSerializer
import icu.samnyan.aqua.sega.util.ZonedDateTimeDeserializer import aquadx.sega.util.ZonedDateTimeDeserializer
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.time.LocalDateTime import java.time.LocalDateTime
import java.time.ZonedDateTime import java.time.ZonedDateTime
@@ -0,0 +1,24 @@
package aquadx.sega.diva.util
import aquadx.sega.diva.PlayerPvRecordRepository
import aquadx.sega.diva.model.common.Edition
import aquadx.sega.diva.model.common.LevelInfo
import aquadx.sega.diva.model.db.userdata.PlayerProfile
import org.springframework.stereotype.Component
import kotlin.math.roundToInt
@Component
class DivaCalculator(private val playerPvRecordRepository: PlayerPvRecordRepository) {
fun getLevelInfo(profile: PlayerProfile): LevelInfo {
val recordList = playerPvRecordRepository.findByPdIdAndEdition(profile, Edition.ORIGINAL)
var totalAttain = 0
for (record in recordList) {
totalAttain += record.maxAttain
}
val level = totalAttain / 13979
val exp = ((totalAttain % 13979) / 13979.0f * 100.0f).roundToInt()
return LevelInfo(level + 1, exp)
}
}
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.sega.diva.util package aquadx.sega.diva.util
class PvRecordDataException(message: String?) : RuntimeException(message) class PvRecordDataException(message: String?) : RuntimeException(message)
class SessionNotFoundException : RuntimeException() class SessionNotFoundException : RuntimeException()
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.sega.general package aquadx.sega.general
import com.fasterxml.jackson.core.JsonProcessingException import com.fasterxml.jackson.core.JsonProcessingException
import ext.* import ext.*
@@ -1,4 +1,4 @@
package icu.samnyan.aqua.sega.general package aquadx.sega.general
import ext.* import ext.*
import jakarta.persistence.EntityManager import jakarta.persistence.EntityManager
@@ -1,6 +1,6 @@
package icu.samnyan.aqua.sega.general.dao package aquadx.sega.general.dao
import icu.samnyan.aqua.sega.general.model.Card import aquadx.sega.general.model.Card
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository import org.springframework.stereotype.Repository
@@ -1,6 +1,6 @@
package icu.samnyan.aqua.sega.general.dao package aquadx.sega.general.dao
import icu.samnyan.aqua.sega.general.model.PropertyEntry import aquadx.sega.general.model.PropertyEntry
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository import org.springframework.stereotype.Repository
import java.util.* import java.util.*

Some files were not shown because too many files have changed in this diff Show More