mirror of
https://github.com/MewoLab/AquaDX.git
synced 2026-10-06 21:57:59 +03:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f082f4190d | ||
|
|
205f3cc973 | ||
|
|
e86a7b59fd | ||
|
|
a5a1d61050 | ||
|
|
48efafdc44 | ||
|
|
8d4a027d48 | ||
|
|
0985f73753 | ||
|
|
3dbb0095bf | ||
|
|
adaa255dd3 | ||
|
|
fb5ea51d92 | ||
|
|
3497dd2329 | ||
|
|
7e5d75a221 | ||
|
|
afa9564392 | ||
|
|
78b48c0f5c | ||
|
|
fa068b7172 | ||
|
|
a6fad6aa46 | ||
|
|
af136b906d | ||
|
|
e334ada5b4 |
@@ -0,0 +1,5 @@
|
||||
---
|
||||
trigger: always_on
|
||||
---
|
||||
|
||||
Make sure `./gradlew build` compiles before you say you're done.
|
||||
Executable → Regular
+24
-177
@@ -1,189 +1,36 @@
|
||||
|
||||
import java.time.Instant
|
||||
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
|
||||
kotlin("kapt") version ktVer
|
||||
id("org.springframework.boot") version "3.2.3"
|
||||
kotlin("jvm") version "2.1.10" apply false
|
||||
kotlin("plugin.spring") version "2.1.10" apply false
|
||||
kotlin("plugin.jpa") version "2.1.10" apply false
|
||||
kotlin("plugin.serialization") version "2.1.10" apply false
|
||||
kotlin("plugin.allopen") version "2.1.10" apply false
|
||||
id("org.springframework.boot") version "3.2.3" apply false
|
||||
id("io.spring.dependency-management") version "1.1.4" apply false
|
||||
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 {
|
||||
mavenLocal()
|
||||
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
|
||||
repositories {
|
||||
mavenLocal()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
kapt {
|
||||
includeCompileClasspath = false
|
||||
keepJavacAnnotationProcessors = true
|
||||
}
|
||||
subprojects {
|
||||
apply(plugin = "org.jetbrains.kotlin.jvm")
|
||||
|
||||
allOpen {
|
||||
annotation("jakarta.persistence.Entity")
|
||||
annotation("jakarta.persistence.MappedSuperclass")
|
||||
annotation("jakarta.persistence.Embeddable")
|
||||
}
|
||||
// Use configure to access the extension safely in subprojects
|
||||
configure<org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension> {
|
||||
jvmToolchain(21)
|
||||
}
|
||||
|
||||
val buildTime: String by extra(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z").withZone(ZoneId.of("UTC")).format(Instant.now()))
|
||||
|
||||
tasks.processResources {
|
||||
filesMatching("**/application.properties") {
|
||||
expand(project.properties)
|
||||
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
|
||||
compilerOptions {
|
||||
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_21)
|
||||
freeCompilerArgs.add("-Xjsr305=strict")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
@@ -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,7 +1,7 @@
|
||||
FROM archlinux:latest
|
||||
|
||||
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/* \
|
||||
&& mkdir -p /var/run/sshd \
|
||||
&& chsh -s /bin/zsh root \
|
||||
|
||||
@@ -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 icu.samnyan.aqua.spring.AutoChecker
|
||||
import aquadx.sega.aimedb.AimeDbServer
|
||||
import aquadx.spring.AutoChecker
|
||||
import org.springframework.boot.SpringApplication
|
||||
import org.springframework.boot.ansi.AnsiOutput
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication
|
||||
+8
-8
@@ -1,13 +1,13 @@
|
||||
package icu.samnyan.aqua.net
|
||||
package aquadx.net
|
||||
|
||||
import ext.*
|
||||
import icu.samnyan.aqua.net.db.AquaUserServices
|
||||
import icu.samnyan.aqua.net.utils.SUCCESS
|
||||
import icu.samnyan.aqua.sega.chusan.model.Chu3Repos
|
||||
import icu.samnyan.aqua.sega.general.model.Card
|
||||
import icu.samnyan.aqua.sega.general.model.CardStatus
|
||||
import icu.samnyan.aqua.sega.general.model.sensitiveInfo
|
||||
import icu.samnyan.aqua.sega.maimai2.model.Mai2Repos
|
||||
import aquadx.net.db.AquaUserServices
|
||||
import aquadx.net.utils.SUCCESS
|
||||
import aquadx.sega.chusan.model.Chu3Repos
|
||||
import aquadx.sega.general.model.Card
|
||||
import aquadx.sega.general.model.CardStatus
|
||||
import aquadx.sega.general.model.sensitiveInfo
|
||||
import aquadx.sega.maimai2.model.Mai2Repos
|
||||
import jakarta.transaction.Transactional
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties
|
||||
+15
-15
@@ -1,20 +1,20 @@
|
||||
package icu.samnyan.aqua.net
|
||||
package aquadx.net
|
||||
|
||||
import ext.*
|
||||
import icu.samnyan.aqua.net.components.JWT
|
||||
import icu.samnyan.aqua.net.db.AquaUserServices
|
||||
import icu.samnyan.aqua.net.games.GenericUserDataRepo
|
||||
import icu.samnyan.aqua.net.games.IUserData
|
||||
import icu.samnyan.aqua.net.utils.AquaNetProps
|
||||
import icu.samnyan.aqua.net.utils.SUCCESS
|
||||
import icu.samnyan.aqua.sega.chusan.model.Chu3UserDataRepo
|
||||
import icu.samnyan.aqua.sega.diva.PlayerProfileRepository
|
||||
import icu.samnyan.aqua.sega.general.dao.CardRepository
|
||||
import icu.samnyan.aqua.sega.general.model.Card
|
||||
import icu.samnyan.aqua.sega.general.service.CardService
|
||||
import icu.samnyan.aqua.sega.maimai2.model.Mai2UserDataRepo
|
||||
import icu.samnyan.aqua.sega.ongeki.OgkUserDataRepo
|
||||
import icu.samnyan.aqua.sega.wacca.model.db.WcUserRepo
|
||||
import aquadx.net.components.JWT
|
||||
import aquadx.net.db.AquaUserServices
|
||||
import aquadx.net.games.GenericUserDataRepo
|
||||
import aquadx.net.games.IUserData
|
||||
import aquadx.net.utils.AquaNetProps
|
||||
import aquadx.net.utils.SUCCESS
|
||||
import aquadx.sega.chusan.model.Chu3UserDataRepo
|
||||
import aquadx.sega.diva.PlayerProfileRepository
|
||||
import aquadx.sega.general.dao.CardRepository
|
||||
import aquadx.sega.general.model.Card
|
||||
import aquadx.sega.general.service.CardService
|
||||
import aquadx.sega.maimai2.model.Mai2UserDataRepo
|
||||
import aquadx.sega.ongeki.OgkUserDataRepo
|
||||
import aquadx.sega.wacca.model.db.WcUserRepo
|
||||
import jakarta.persistence.EntityManager
|
||||
import org.springframework.scheduling.annotation.Scheduled
|
||||
import org.springframework.stereotype.Service
|
||||
+25
-25
@@ -1,25 +1,25 @@
|
||||
package icu.samnyan.aqua.net
|
||||
package aquadx.net
|
||||
|
||||
import ext.*
|
||||
import icu.samnyan.aqua.net.components.EmailProperties
|
||||
import icu.samnyan.aqua.net.components.JWT
|
||||
import icu.samnyan.aqua.net.db.AquaGameOptions
|
||||
import icu.samnyan.aqua.net.db.AquaNetUser
|
||||
import icu.samnyan.aqua.net.db.AquaUserServices
|
||||
import icu.samnyan.aqua.net.games.ExportOptions
|
||||
import icu.samnyan.aqua.net.games.GenericUserDataRepo
|
||||
import icu.samnyan.aqua.net.games.IUserData
|
||||
import icu.samnyan.aqua.net.games.mai2.Mai2Import
|
||||
import icu.samnyan.aqua.net.utils.ApiException
|
||||
import icu.samnyan.aqua.net.utils.PathProps
|
||||
import icu.samnyan.aqua.net.utils.SUCCESS
|
||||
import icu.samnyan.aqua.sega.chusan.model.Chu3UserDataRepo
|
||||
import icu.samnyan.aqua.sega.general.dao.CardRepository
|
||||
import icu.samnyan.aqua.sega.general.model.Card
|
||||
import icu.samnyan.aqua.sega.general.service.CardService
|
||||
import icu.samnyan.aqua.sega.maimai2.model.Mai2UserDataRepo
|
||||
import icu.samnyan.aqua.sega.ongeki.OgkUserDataRepo
|
||||
import icu.samnyan.aqua.sega.wacca.model.db.WcUserRepo
|
||||
import aquadx.net.components.EmailProperties
|
||||
import aquadx.net.components.JWT
|
||||
import aquadx.net.db.AquaGameOptions
|
||||
import aquadx.net.db.AquaNetUser
|
||||
import aquadx.net.db.AquaUserServices
|
||||
import aquadx.net.games.ExportOptions
|
||||
import aquadx.net.games.GenericUserDataRepo
|
||||
import aquadx.net.games.IUserData
|
||||
import aquadx.net.games.mai2.Mai2Import
|
||||
import aquadx.net.utils.ApiException
|
||||
import aquadx.net.utils.PathProps
|
||||
import aquadx.net.utils.SUCCESS
|
||||
import aquadx.sega.chusan.model.Chu3UserDataRepo
|
||||
import aquadx.sega.general.dao.CardRepository
|
||||
import aquadx.sega.general.model.Card
|
||||
import aquadx.sega.general.service.CardService
|
||||
import aquadx.sega.maimai2.model.Mai2UserDataRepo
|
||||
import aquadx.sega.ongeki.OgkUserDataRepo
|
||||
import aquadx.sega.wacca.model.db.WcUserRepo
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties
|
||||
import org.springframework.context.annotation.Configuration
|
||||
import org.springframework.transaction.PlatformTransactionManager
|
||||
@@ -33,8 +33,8 @@ import java.util.concurrent.CompletableFuture
|
||||
import kotlin.io.path.getLastModifiedTime
|
||||
import kotlin.io.path.isRegularFile
|
||||
import kotlin.io.path.writeBytes
|
||||
import icu.samnyan.aqua.sega.maimai2.handler.UploadUserPlaylogHandler as Mai2UploadUserPlaylogHandler
|
||||
import icu.samnyan.aqua.sega.maimai2.handler.UpsertUserAllHandler as Mai2UpsertUserAllHandler
|
||||
import aquadx.sega.maimai2.handler.UploadUserPlaylogHandler as Mai2UploadUserPlaylogHandler
|
||||
import aquadx.sega.maimai2.handler.UpsertUserAllHandler as Mai2UpsertUserAllHandler
|
||||
|
||||
@Configuration
|
||||
@ConfigurationProperties(prefix = "aqua-net.fedy")
|
||||
@@ -179,14 +179,14 @@ class Fedy(
|
||||
val card = cardRepo.findByExtId(req.extId)
|
||||
?: (404 - "Card with extId ${req.extId} not found")
|
||||
val cardTimestamp = cardService.getCardTimestamp(card, req.game)
|
||||
if (cardTimestamp.updatedAt.toEpochMilli() == req.updatedAtMs) return@handleFedy DataPullRes(error = null, result = null) // No changes
|
||||
val isRebased = req.createdAtMs > 0 && cardTimestamp.createdAt.toEpochMilli() > req.createdAtMs
|
||||
if (cardTimestamp.updatedAt == req.updatedAtMs) return@handleFedy DataPullRes(error = null, result = null) // No changes
|
||||
val isRebased = req.createdAtMs > 0 && cardTimestamp.createdAt > req.createdAtMs
|
||||
val exportOptions = if (!isRebased) { req.exportOptions } else { req.exportOptions.copy(playlogAfter = null) }
|
||||
{
|
||||
DataPullRes(result = DataPullResult(data = when (req.game) {
|
||||
"mai2" -> mai2Import.export(card, exportOptions)
|
||||
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) }
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
package icu.samnyan.aqua.net
|
||||
package aquadx.net
|
||||
|
||||
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.context.properties.ConfigurationProperties
|
||||
import org.springframework.context.annotation.Configuration
|
||||
+5
-5
@@ -1,12 +1,12 @@
|
||||
package icu.samnyan.aqua.net
|
||||
package aquadx.net
|
||||
|
||||
import ext.JACKSON
|
||||
import ext.logger
|
||||
import ext.parse
|
||||
import icu.samnyan.aqua.net.db.AquaNetUserRepo
|
||||
import icu.samnyan.aqua.sega.general.dao.CardRepository
|
||||
import icu.samnyan.aqua.sega.general.dao.PropertyEntryRepository
|
||||
import icu.samnyan.aqua.sega.general.model.PropertyEntry
|
||||
import aquadx.net.db.AquaNetUserRepo
|
||||
import aquadx.sega.general.dao.CardRepository
|
||||
import aquadx.sega.general.dao.PropertyEntryRepository
|
||||
import aquadx.sega.general.model.PropertyEntry
|
||||
import jakarta.annotation.PostConstruct
|
||||
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) }
|
||||
}
|
||||
}
|
||||
+5
-5
@@ -1,10 +1,10 @@
|
||||
package icu.samnyan.aqua.net
|
||||
package aquadx.net
|
||||
|
||||
import ext.*
|
||||
import icu.samnyan.aqua.net.db.AquaGameOptions
|
||||
import icu.samnyan.aqua.net.db.AquaGameOptionsRepo
|
||||
import icu.samnyan.aqua.net.db.AquaNetUserRepo
|
||||
import icu.samnyan.aqua.net.db.AquaUserServices
|
||||
import aquadx.net.db.AquaGameOptions
|
||||
import aquadx.net.db.AquaGameOptionsRepo
|
||||
import aquadx.net.db.AquaNetUserRepo
|
||||
import aquadx.net.db.AquaUserServices
|
||||
import org.springframework.web.bind.annotation.RestController
|
||||
import kotlin.reflect.full.findAnnotation
|
||||
import kotlin.reflect.jvm.jvmErasure
|
||||
+10
-10
@@ -1,15 +1,15 @@
|
||||
package icu.samnyan.aqua.net
|
||||
package aquadx.net
|
||||
|
||||
import ext.*
|
||||
import icu.samnyan.aqua.net.components.*
|
||||
import icu.samnyan.aqua.net.db.AquaNetUserRepo
|
||||
import icu.samnyan.aqua.net.db.AquaUserServices
|
||||
import icu.samnyan.aqua.net.db.EmailConfirmationRepo
|
||||
import icu.samnyan.aqua.net.db.ResetPasswordRepo
|
||||
import icu.samnyan.aqua.net.utils.PathProps
|
||||
import icu.samnyan.aqua.net.utils.SUCCESS
|
||||
import icu.samnyan.aqua.sega.general.dao.CardRepository
|
||||
import icu.samnyan.aqua.sega.general.model.CardStatus
|
||||
import aquadx.net.components.*
|
||||
import aquadx.net.db.AquaNetUserRepo
|
||||
import aquadx.net.db.AquaUserServices
|
||||
import aquadx.net.db.EmailConfirmationRepo
|
||||
import aquadx.net.db.ResetPasswordRepo
|
||||
import aquadx.net.utils.PathProps
|
||||
import aquadx.net.utils.SUCCESS
|
||||
import aquadx.sega.general.dao.CardRepository
|
||||
import aquadx.sega.general.model.CardStatus
|
||||
import jakarta.servlet.http.HttpServletRequest
|
||||
import org.slf4j.LoggerFactory
|
||||
import org.springframework.security.crypto.password.PasswordEncoder
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
package icu.samnyan.aqua.net.components
|
||||
package aquadx.net.components
|
||||
|
||||
import ext.Bool
|
||||
import ext.Str
|
||||
import ext.logger
|
||||
import icu.samnyan.aqua.net.db.*
|
||||
import aquadx.net.db.*
|
||||
import org.simplejavamail.api.mailer.Mailer
|
||||
import org.simplejavamail.email.EmailBuilder
|
||||
import org.simplejavamail.springsupport.SimpleJavaMailSpringSupport
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.net.components
|
||||
package aquadx.net.components
|
||||
|
||||
import com.maxmind.geoip2.DatabaseReader
|
||||
import com.maxmind.geoip2.exception.AddressNotFoundException
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
package icu.samnyan.aqua.net.components
|
||||
package aquadx.net.components
|
||||
|
||||
import ext.Str
|
||||
import ext.minus
|
||||
import icu.samnyan.aqua.net.db.*
|
||||
import aquadx.net.db.*
|
||||
import io.jsonwebtoken.JwtParser
|
||||
import io.jsonwebtoken.Jwts
|
||||
import io.jsonwebtoken.security.Keys
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.net.components
|
||||
package aquadx.net.components
|
||||
|
||||
import ext.Bool
|
||||
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>
|
||||
}
|
||||
+163
-251
@@ -1,251 +1,163 @@
|
||||
package icu.samnyan.aqua.net.db
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore
|
||||
import ext.*
|
||||
import icu.samnyan.aqua.net.UserRegistrar.Companion.cardExtIdEnd
|
||||
import icu.samnyan.aqua.net.UserRegistrar.Companion.cardExtIdStart
|
||||
import icu.samnyan.aqua.net.components.JWT
|
||||
import icu.samnyan.aqua.sega.allnet.AllNetProps
|
||||
import icu.samnyan.aqua.sega.allnet.KeyChipRepo
|
||||
import icu.samnyan.aqua.sega.allnet.KeychipSession
|
||||
import icu.samnyan.aqua.sega.general.GameMusicPopularity
|
||||
import icu.samnyan.aqua.sega.general.dao.CardRepository
|
||||
import icu.samnyan.aqua.sega.general.model.Card
|
||||
import icu.samnyan.aqua.sega.general.service.CardService
|
||||
import jakarta.persistence.*
|
||||
import org.springframework.data.jpa.repository.JpaRepository
|
||||
import org.springframework.security.crypto.password.PasswordEncoder
|
||||
import org.springframework.stereotype.Service
|
||||
import java.io.Serializable
|
||||
import java.time.LocalDateTime
|
||||
import kotlin.jvm.optionals.getOrNull
|
||||
import kotlin.reflect.KFunction
|
||||
import kotlin.reflect.KMutableProperty
|
||||
import kotlin.reflect.full.functions
|
||||
|
||||
@Entity
|
||||
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> {
|
||||
fun findByAuId(auId: Long): AquaNetUser?
|
||||
fun findByEmailIgnoreCase(email: String): AquaNetUser?
|
||||
fun findByUsernameIgnoreCase(username: String): AquaNetUser?
|
||||
fun findByKeychip(keychip: String): 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
|
||||
* throw an ApiException if the field is invalid.
|
||||
*/
|
||||
@Service
|
||||
class AquaUserServices(
|
||||
val userRepo: AquaNetUserRepo,
|
||||
val cardRepo: CardRepository,
|
||||
val hasher: PasswordEncoder,
|
||||
val keyChipRepo: KeyChipRepo,
|
||||
val allNetProps: AllNetProps,
|
||||
val jwt: JWT,
|
||||
val em: EntityManager,
|
||||
val pop: GameMusicPopularity,
|
||||
val cardService: CardService,
|
||||
val sessionRepo: SessionTokenRepo,
|
||||
) {
|
||||
companion object {
|
||||
val SETTING_FIELDS = AquaUserServices::class.functions
|
||||
.filter { it.name.startsWith("check") }
|
||||
.map {
|
||||
val name = it.name.removePrefix("check").replaceFirstChar { c -> c.lowercase() }
|
||||
val prop = AquaNetUser::class.members.find { m -> m.name == name } as KMutableProperty<*>
|
||||
SettingField(name, it, prop.setter)
|
||||
}
|
||||
}
|
||||
|
||||
fun create(username: Str, email: Str, password: Str, country: Str, emailConfirmed: Boolean = false): AquaNetUser {
|
||||
// Create user
|
||||
val u = AquaNetUser(
|
||||
username = checkUsername(username),
|
||||
email = validateEmail(email),
|
||||
pwHash = checkPwHash(password),
|
||||
regTime = millis(), lastLogin = millis(), country = country,
|
||||
emailConfirmed = emailConfirmed
|
||||
)
|
||||
|
||||
// Create a ghost card
|
||||
val card = Card().apply {
|
||||
extId = cardService.randExtID(cardExtIdStart, cardExtIdEnd)
|
||||
luid = extId.toString()
|
||||
registerTime = LocalDateTime.now()
|
||||
accessTime = registerTime
|
||||
aquaUser = u
|
||||
isGhost = true
|
||||
}
|
||||
u.ghostCard = card
|
||||
|
||||
// Save the user
|
||||
userRepo.save(u)
|
||||
cardRepo.save(card)
|
||||
|
||||
return u
|
||||
}
|
||||
|
||||
fun update(user: AquaNetUser, key: Str, value: Str) {
|
||||
// Check if the key is a settable field
|
||||
val field = SETTING_FIELDS.find { it.name == key } ?: (400 - "Invalid setting")
|
||||
// Set the validated field
|
||||
field.setter.call(user, field.checker.call(this, value))
|
||||
}
|
||||
|
||||
fun clearAllSessions(user: AquaNetUser) = sessionRepo.deleteAll(sessionRepo.findByAquaNetUserAuId(user.auId))
|
||||
|
||||
suspend fun <T> byName(username: Str, callback: suspend (AquaNetUser) -> T) =
|
||||
async { userRepo.findByUsernameIgnoreCase(username) }?.let { callback(it) } ?: (404 - "User not found")
|
||||
|
||||
suspend fun cardByName(username: Str) =
|
||||
if (username.startsWith("user")) username.substring(4).toLongOrNull()
|
||||
?.let { cardRepo.findById(it)() } ?: (404 - "Card not found")
|
||||
else byName(username) { it.ghostCard }
|
||||
|
||||
suspend fun <T> cardByName(username: Str, callback: suspend (Card) -> T) = callback(cardByName(username))
|
||||
|
||||
fun validKeychip(keychipId: Str): Bool {
|
||||
if (!allNetProps.checkKeychip) return true
|
||||
if (keychipId.isBlank()) return false
|
||||
if (userRepo.findByKeychip(keychipId) != null || keyChipRepo.existsByKeychipId(keychipId)) return true
|
||||
return false
|
||||
}
|
||||
|
||||
fun checkUsername(username: Str) = username.apply {
|
||||
// Check if username is valid
|
||||
if (length < 2) 400 - "Username must be at least 2 letters"
|
||||
if (length > 32) 400 - "Username too long (max 32 letters)"
|
||||
if (contains(" ")) 400 - "Username cannot contain spaces"
|
||||
|
||||
// card{id} is a reserved format
|
||||
if (startsWith("user") && substring(4).toLongOrNull() != null)
|
||||
400 - "Username cannot be 'user' + a number. This format is reserved for user IDs."
|
||||
|
||||
// Check if username is within A-Za-z0-9_-~.
|
||||
find { !it.isLetterOrDigit() && it != '_' && it != '-' && it != '~' && it != '.' }?.let {
|
||||
400 - "Username cannot contain `$it`. Please only use letters (A-Z), numbers (0-9), and `_-~.` characters. You can set a display name later."
|
||||
}
|
||||
|
||||
// Check if user with the same username exists
|
||||
if (userRepo.findByUsernameIgnoreCase(this) != null)
|
||||
400 - "User with username `$this` already exists"
|
||||
}
|
||||
|
||||
fun validateEmail(email: Str) = email.apply {
|
||||
// Check if email is valid
|
||||
if (!isValidEmail()) 400 - "Invalid email"
|
||||
|
||||
// Check if user with the same email exists
|
||||
if (userRepo.findByEmailIgnoreCase(email) != null)
|
||||
400 - "User with email `$email` already exists"
|
||||
}
|
||||
|
||||
fun checkPwHash(password: Str) = password.run {
|
||||
// Validate password
|
||||
if (length < 8) 400 - "Password must be at least 8 characters"
|
||||
|
||||
hasher.encode(this)
|
||||
}
|
||||
|
||||
fun checkDisplayName(displayName: Str) = displayName.apply {
|
||||
// Check if display name is valid
|
||||
if (length > 32) 400 - "Display name too long (max 32 letters)"
|
||||
}
|
||||
|
||||
fun checkProfileLocation(profileLocation: Str) = profileLocation.apply {
|
||||
// Check if profile location is valid
|
||||
if (length > 64) 400 - "Profile location too long (max 64 letters)"
|
||||
}
|
||||
|
||||
fun checkProfileBio(profileBio: Str) = profileBio.apply {
|
||||
// Check if profile bio is valid
|
||||
if (length > 255) 400 - "Profile bio too long (max 255 letters)"
|
||||
}
|
||||
|
||||
fun checkOptOutOfLeaderboard(optOutOfLeaderboard: Str) = optOutOfLeaderboard.toBoolean()
|
||||
}
|
||||
package aquadx.net.db
|
||||
|
||||
import ext.*
|
||||
import aquadx.net.UserRegistrar.Companion.cardExtIdEnd
|
||||
import aquadx.net.UserRegistrar.Companion.cardExtIdStart
|
||||
import aquadx.net.components.JWT
|
||||
import aquadx.sega.allnet.AllNetProps
|
||||
import aquadx.sega.allnet.KeyChipRepo
|
||||
import aquadx.sega.general.GameMusicPopularity
|
||||
import aquadx.sega.general.dao.CardRepository
|
||||
import aquadx.sega.general.model.Card
|
||||
import aquadx.sega.general.service.CardService
|
||||
import jakarta.persistence.*
|
||||
import org.springframework.data.jpa.repository.JpaRepository
|
||||
import org.springframework.security.crypto.password.PasswordEncoder
|
||||
import org.springframework.stereotype.Service
|
||||
import java.time.LocalDateTime
|
||||
import kotlin.reflect.KMutableProperty
|
||||
import kotlin.reflect.full.functions
|
||||
|
||||
// Entity AquaNetUser and SettingField are now in :shared
|
||||
|
||||
interface AquaNetUserRepo : JpaRepository<AquaNetUser, Long> {
|
||||
fun findByAuId(auId: Long): AquaNetUser?
|
||||
fun findByEmailIgnoreCase(email: String): AquaNetUser?
|
||||
fun findByUsernameIgnoreCase(username: String): AquaNetUser?
|
||||
fun findByKeychip(keychip: String): AquaNetUser?
|
||||
fun findByGhostCardExtId(extId: Long): AquaNetUser?
|
||||
}
|
||||
|
||||
/**
|
||||
* User services (formerly inside AquaNetUser.kt in the monolithic setup).
|
||||
*/
|
||||
@Service
|
||||
class AquaUserServices(
|
||||
val userRepo: AquaNetUserRepo,
|
||||
val cardRepo: CardRepository,
|
||||
val hasher: PasswordEncoder,
|
||||
val keyChipRepo: KeyChipRepo,
|
||||
val allNetProps: AllNetProps,
|
||||
val jwt: JWT,
|
||||
val em: EntityManager,
|
||||
val pop: GameMusicPopularity,
|
||||
val cardService: CardService,
|
||||
val sessionRepo: SessionTokenRepo,
|
||||
) {
|
||||
companion object {
|
||||
val SETTING_FIELDS = AquaUserServices::class.functions
|
||||
.filter { it.name.startsWith("check") }
|
||||
.map {
|
||||
val name = it.name.removePrefix("check").replaceFirstChar { c -> c.lowercase() }
|
||||
val prop = AquaNetUser::class.members.find { m -> m.name == name } as KMutableProperty<*>
|
||||
SettingField(name, it, prop.setter)
|
||||
}
|
||||
}
|
||||
|
||||
fun create(username: Str, email: Str, password: Str, country: Str, emailConfirmed: Boolean = false): AquaNetUser {
|
||||
// Create user
|
||||
val u = AquaNetUser(
|
||||
username = checkUsername(username),
|
||||
email = validateEmail(email),
|
||||
pwHash = checkPwHash(password),
|
||||
regTime = millis(), lastLogin = millis(), country = country,
|
||||
emailConfirmed = emailConfirmed
|
||||
)
|
||||
|
||||
// Create a ghost card
|
||||
val card = Card().apply {
|
||||
extId = cardService.randExtID(cardExtIdStart, cardExtIdEnd)
|
||||
luid = extId.toString()
|
||||
registerTime = LocalDateTime.now()
|
||||
accessTime = registerTime
|
||||
aquaUser = u
|
||||
isGhost = true
|
||||
}
|
||||
u.ghostCard = card
|
||||
|
||||
// Save the user
|
||||
userRepo.save(u)
|
||||
cardRepo.save(card)
|
||||
|
||||
return u
|
||||
}
|
||||
|
||||
fun update(user: AquaNetUser, key: Str, value: Str) {
|
||||
// Check if the key is a settable field
|
||||
val field = SETTING_FIELDS.find { it.name == key } ?: (400 - "Invalid setting")
|
||||
// Set the validated field
|
||||
field.setter.call(user, field.checker.call(this, value))
|
||||
}
|
||||
|
||||
fun clearAllSessions(user: AquaNetUser) = sessionRepo.deleteAll(sessionRepo.findByAquaNetUserAuId(user.auId))
|
||||
|
||||
suspend fun <T> byName(username: Str, callback: suspend (AquaNetUser) -> T) =
|
||||
async { userRepo.findByUsernameIgnoreCase(username) }?.let { callback(it) } ?: (404 - "User not found")
|
||||
|
||||
suspend fun cardByName(username: Str) =
|
||||
if (username.startsWith("user")) username.substring(4).toLongOrNull()
|
||||
?.let { cardRepo.findById(it)() } ?: (404 - "Card not found")
|
||||
else byName(username) { it.ghostCard }
|
||||
|
||||
suspend fun <T> cardByName(username: Str, callback: suspend (Card) -> T) = callback(cardByName(username))
|
||||
|
||||
fun validKeychip(keychipId: Str): Bool {
|
||||
if (!allNetProps.checkKeychip) return true
|
||||
if (keychipId.isBlank()) return false
|
||||
if (userRepo.findByKeychip(keychipId) != null || keyChipRepo.existsByKeychipId(keychipId)) return true
|
||||
return false
|
||||
}
|
||||
|
||||
fun checkUsername(username: Str) = username.apply {
|
||||
// Check if username is valid
|
||||
if (length < 2) 400 - "Username must be at least 2 letters"
|
||||
if (length > 32) 400 - "Username too long (max 32 letters)"
|
||||
if (contains(" ")) 400 - "Username cannot contain spaces"
|
||||
|
||||
// card{id} is a reserved format
|
||||
if (startsWith("user") && substring(4).toLongOrNull() != null)
|
||||
400 - "Username cannot be 'user' + a number. This format is reserved for user IDs."
|
||||
|
||||
// Check if username is within A-Za-z0-9_-~.
|
||||
find { !it.isLetterOrDigit() && it != '_' && it != '-' && it != '~' && it != '.' }?.let {
|
||||
400 - "Username cannot contain `$it`. Please only use letters (A-Z), numbers (0-9), and `_-~.` characters. You can set a display name later."
|
||||
}
|
||||
|
||||
// Check if user with the same username exists
|
||||
if (userRepo.findByUsernameIgnoreCase(this) != null)
|
||||
400 - "User with username `$this` already exists"
|
||||
}
|
||||
|
||||
fun validateEmail(email: Str) = email.apply {
|
||||
// Check if email is valid
|
||||
if (!isValidEmail()) 400 - "Invalid email"
|
||||
|
||||
// Check if user with the same email exists
|
||||
if (userRepo.findByEmailIgnoreCase(email) != null)
|
||||
400 - "User with email `$email` already exists"
|
||||
}
|
||||
|
||||
fun checkPwHash(password: Str) = password.run {
|
||||
// Validate password
|
||||
if (length < 8) 400 - "Password must be at least 8 characters"
|
||||
|
||||
hasher.encode(this)
|
||||
}
|
||||
|
||||
fun checkDisplayName(displayName: Str) = displayName.apply {
|
||||
// Check if display name is valid
|
||||
if (length > 32) 400 - "Display name too long (max 32 letters)"
|
||||
}
|
||||
|
||||
fun checkProfileLocation(profileLocation: Str) = profileLocation.apply {
|
||||
// Check if profile location is valid
|
||||
if (length > 64) 400 - "Profile location too long (max 64 letters)"
|
||||
}
|
||||
|
||||
fun checkProfileBio(profileBio: Str) = profileBio.apply {
|
||||
// Check if profile bio is valid
|
||||
if (length > 255) 400 - "Profile bio too long (max 255 letters)"
|
||||
}
|
||||
|
||||
fun checkOptOutOfLeaderboard(optOutOfLeaderboard: Str) = optOutOfLeaderboard.toBoolean()
|
||||
}
|
||||
+6
-6
@@ -1,11 +1,11 @@
|
||||
package icu.samnyan.aqua.net.games
|
||||
package aquadx.net.games
|
||||
|
||||
import ext.*
|
||||
import icu.samnyan.aqua.net.BotProps
|
||||
import icu.samnyan.aqua.net.db.AquaUserServices
|
||||
import icu.samnyan.aqua.net.utils.SUCCESS
|
||||
import icu.samnyan.aqua.sega.general.model.Card
|
||||
import icu.samnyan.aqua.sega.general.service.CardService
|
||||
import aquadx.net.BotProps
|
||||
import aquadx.net.db.AquaUserServices
|
||||
import aquadx.net.utils.SUCCESS
|
||||
import aquadx.sega.general.model.Card
|
||||
import aquadx.sega.general.service.CardService
|
||||
import jakarta.annotation.PostConstruct
|
||||
import org.slf4j.LoggerFactory
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.net.games
|
||||
package aquadx.net.games
|
||||
|
||||
import ext.isoDate
|
||||
import ext.minus
|
||||
+8
-8
@@ -1,13 +1,13 @@
|
||||
package icu.samnyan.aqua.net.games
|
||||
package aquadx.net.games
|
||||
|
||||
import ext.*
|
||||
import icu.samnyan.aqua.net.Fedy
|
||||
import icu.samnyan.aqua.net.db.AquaNetUser
|
||||
import icu.samnyan.aqua.net.db.AquaUserServices
|
||||
import icu.samnyan.aqua.net.utils.AquaNetProps
|
||||
import icu.samnyan.aqua.net.utils.SUCCESS
|
||||
import icu.samnyan.aqua.sega.general.model.Card
|
||||
import icu.samnyan.aqua.sega.general.service.CardService
|
||||
import aquadx.net.Fedy
|
||||
import aquadx.net.db.AquaNetUser
|
||||
import aquadx.net.db.AquaUserServices
|
||||
import aquadx.net.utils.AquaNetProps
|
||||
import aquadx.net.utils.SUCCESS
|
||||
import aquadx.sega.general.model.Card
|
||||
import aquadx.sega.general.service.CardService
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
import org.springframework.context.annotation.Lazy
|
||||
import org.springframework.data.jpa.repository.JpaRepository
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.net.games
|
||||
package aquadx.net.games
|
||||
|
||||
import com.fasterxml.jackson.core.JsonParser
|
||||
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>
|
||||
}
|
||||
+7
-7
@@ -1,14 +1,14 @@
|
||||
package icu.samnyan.aqua.net.games.chu3
|
||||
package aquadx.net.games.chu3
|
||||
|
||||
import ext.API
|
||||
import ext.returns
|
||||
import ext.vars
|
||||
import icu.samnyan.aqua.net.games.IExportClass
|
||||
import icu.samnyan.aqua.net.games.ImportClass
|
||||
import icu.samnyan.aqua.net.games.ImportController
|
||||
import icu.samnyan.aqua.sega.chusan.model.Chu3Repos
|
||||
import icu.samnyan.aqua.sega.chusan.model.Chu3UserLinked
|
||||
import icu.samnyan.aqua.sega.chusan.model.userdata.*
|
||||
import aquadx.net.games.IExportClass
|
||||
import aquadx.net.games.ImportClass
|
||||
import aquadx.net.games.ImportController
|
||||
import aquadx.sega.chusan.model.Chu3Repos
|
||||
import aquadx.sega.chusan.model.Chu3UserLinked
|
||||
import aquadx.sega.chusan.model.userdata.*
|
||||
import org.springframework.web.bind.annotation.RestController
|
||||
import kotlin.reflect.full.declaredMembers
|
||||
|
||||
+10
-10
@@ -1,15 +1,15 @@
|
||||
package icu.samnyan.aqua.net.games.chu3
|
||||
package aquadx.net.games.chu3
|
||||
|
||||
import ext.*
|
||||
import icu.samnyan.aqua.net.db.AquaUserServices
|
||||
import icu.samnyan.aqua.net.games.*
|
||||
import icu.samnyan.aqua.net.utils.chu3Scores
|
||||
import icu.samnyan.aqua.sega.chusan.model.Chu3Repos
|
||||
import icu.samnyan.aqua.sega.chusan.model.Chu3UserDataRepo
|
||||
import icu.samnyan.aqua.sega.chusan.model.Chu3UserMusicDetailRepo
|
||||
import icu.samnyan.aqua.sega.chusan.model.Chu3UserPlaylogRepo
|
||||
import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData
|
||||
import icu.samnyan.aqua.sega.chusan.model.userdata.UserGameOption
|
||||
import aquadx.net.db.AquaUserServices
|
||||
import aquadx.net.games.*
|
||||
import aquadx.net.utils.chu3Scores
|
||||
import aquadx.sega.chusan.model.Chu3Repos
|
||||
import aquadx.sega.chusan.model.Chu3UserDataRepo
|
||||
import aquadx.sega.chusan.model.Chu3UserMusicDetailRepo
|
||||
import aquadx.sega.chusan.model.Chu3UserPlaylogRepo
|
||||
import aquadx.sega.chusan.model.userdata.Chu3UserData
|
||||
import aquadx.sega.chusan.model.userdata.UserGameOption
|
||||
import org.springframework.web.bind.annotation.RestController
|
||||
import kotlin.jvm.optionals.getOrNull
|
||||
import kotlin.reflect.KMutableProperty1
|
||||
+9
-9
@@ -1,16 +1,16 @@
|
||||
package icu.samnyan.aqua.net.games.mai2
|
||||
package aquadx.net.games.mai2
|
||||
|
||||
import ext.API
|
||||
import ext.returns
|
||||
import ext.vars
|
||||
import icu.samnyan.aqua.net.games.ExportOptions
|
||||
import icu.samnyan.aqua.net.games.IExportClass
|
||||
import icu.samnyan.aqua.net.games.ImportClass
|
||||
import icu.samnyan.aqua.net.games.ImportController
|
||||
import icu.samnyan.aqua.sega.maimai2.model.Mai2Repos
|
||||
import icu.samnyan.aqua.sega.maimai2.model.Mai2UserLinked
|
||||
import icu.samnyan.aqua.sega.maimai2.model.request.Mai2UserFavoriteItem
|
||||
import icu.samnyan.aqua.sega.maimai2.model.userdata.*
|
||||
import aquadx.net.games.ExportOptions
|
||||
import aquadx.net.games.IExportClass
|
||||
import aquadx.net.games.ImportClass
|
||||
import aquadx.net.games.ImportController
|
||||
import aquadx.sega.maimai2.model.Mai2Repos
|
||||
import aquadx.sega.maimai2.model.Mai2UserLinked
|
||||
import aquadx.sega.maimai2.model.request.Mai2UserFavoriteItem
|
||||
import aquadx.sega.maimai2.model.userdata.*
|
||||
import org.springframework.web.bind.annotation.RestController
|
||||
import kotlin.reflect.full.declaredMembers
|
||||
|
||||
+6
-6
@@ -1,14 +1,14 @@
|
||||
package icu.samnyan.aqua.net.games.mai2
|
||||
package aquadx.net.games.mai2
|
||||
|
||||
import ext.API
|
||||
import ext.RB
|
||||
import ext.RP
|
||||
import ext.minus
|
||||
import icu.samnyan.aqua.net.db.AquaUserServices
|
||||
import icu.samnyan.aqua.net.utils.SUCCESS
|
||||
import icu.samnyan.aqua.sega.general.service.CardService
|
||||
import icu.samnyan.aqua.sega.maimai2.model.Mai2Repos
|
||||
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserMusicDetail
|
||||
import aquadx.net.db.AquaUserServices
|
||||
import aquadx.net.utils.SUCCESS
|
||||
import aquadx.sega.general.service.CardService
|
||||
import aquadx.sega.maimai2.model.Mai2Repos
|
||||
import aquadx.sega.maimai2.model.userdata.Mai2UserMusicDetail
|
||||
import org.springframework.web.bind.annotation.PostMapping
|
||||
import org.springframework.web.bind.annotation.RestController
|
||||
|
||||
+14
-14
@@ -1,19 +1,19 @@
|
||||
package icu.samnyan.aqua.net.games.mai2
|
||||
package aquadx.net.games.mai2
|
||||
|
||||
import ext.*
|
||||
import icu.samnyan.aqua.net.db.AquaUserServices
|
||||
import icu.samnyan.aqua.net.games.*
|
||||
import icu.samnyan.aqua.net.utils.SUCCESS
|
||||
import icu.samnyan.aqua.net.utils.mai2Scores
|
||||
import icu.samnyan.aqua.sega.maimai2.handler.UploadUserPhotoHandler
|
||||
import icu.samnyan.aqua.sega.maimai2.model.Mai2Repos
|
||||
import icu.samnyan.aqua.sega.maimai2.model.Mai2UserDataRepo
|
||||
import icu.samnyan.aqua.sega.maimai2.model.Mai2UserMusicDetailRepo
|
||||
import icu.samnyan.aqua.sega.maimai2.model.Mai2UserPlaylogRepo
|
||||
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserDetail
|
||||
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserGeneralData
|
||||
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserLoginBonus
|
||||
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserOption
|
||||
import aquadx.net.db.AquaUserServices
|
||||
import aquadx.net.games.*
|
||||
import aquadx.net.utils.SUCCESS
|
||||
import aquadx.net.utils.mai2Scores
|
||||
import aquadx.sega.maimai2.handler.UploadUserPhotoHandler
|
||||
import aquadx.sega.maimai2.model.Mai2Repos
|
||||
import aquadx.sega.maimai2.model.Mai2UserDataRepo
|
||||
import aquadx.sega.maimai2.model.Mai2UserMusicDetailRepo
|
||||
import aquadx.sega.maimai2.model.Mai2UserPlaylogRepo
|
||||
import aquadx.sega.maimai2.model.userdata.Mai2UserDetail
|
||||
import aquadx.sega.maimai2.model.userdata.Mai2UserGeneralData
|
||||
import aquadx.sega.maimai2.model.userdata.Mai2UserLoginBonus
|
||||
import aquadx.sega.maimai2.model.userdata.Mai2UserOption
|
||||
import org.springframework.http.MediaType
|
||||
import org.springframework.web.bind.annotation.PostMapping
|
||||
import org.springframework.web.bind.annotation.RestController
|
||||
+11
-12
@@ -1,20 +1,19 @@
|
||||
package icu.samnyan.aqua.net.games.ongeki
|
||||
package aquadx.net.games.ongeki
|
||||
|
||||
import ext.API
|
||||
import ext.RP
|
||||
import ext.minus
|
||||
import icu.samnyan.aqua.net.db.AquaUserServices
|
||||
import icu.samnyan.aqua.net.games.*
|
||||
import icu.samnyan.aqua.net.utils.ongekiScores
|
||||
import icu.samnyan.aqua.sega.ongeki.OgkUserDataRepo
|
||||
import icu.samnyan.aqua.sega.ongeki.OgkUserGeneralDataRepo
|
||||
import icu.samnyan.aqua.sega.ongeki.OgkUserMusicDetailRepo
|
||||
import icu.samnyan.aqua.sega.ongeki.OgkUserOptionRepo
|
||||
import icu.samnyan.aqua.sega.ongeki.OgkUserPlaylogRepo
|
||||
import icu.samnyan.aqua.sega.ongeki.model.UserData
|
||||
import icu.samnyan.aqua.sega.ongeki.model.UserOption
|
||||
import aquadx.net.db.AquaUserServices
|
||||
import aquadx.net.games.*
|
||||
import aquadx.net.utils.ongekiScores
|
||||
import aquadx.sega.ongeki.OgkUserDataRepo
|
||||
import aquadx.sega.ongeki.OgkUserGeneralDataRepo
|
||||
import aquadx.sega.ongeki.OgkUserMusicDetailRepo
|
||||
import aquadx.sega.ongeki.OgkUserOptionRepo
|
||||
import aquadx.sega.ongeki.OgkUserPlaylogRepo
|
||||
import aquadx.sega.ongeki.model.UserData
|
||||
import aquadx.sega.ongeki.model.UserOption
|
||||
import org.springframework.web.bind.annotation.RestController
|
||||
import kotlin.jvm.optionals.getOrNull
|
||||
import kotlin.reflect.KMutableProperty1
|
||||
import kotlin.reflect.full.memberProperties
|
||||
|
||||
+8
-8
@@ -1,16 +1,16 @@
|
||||
package icu.samnyan.aqua.net.games.wacca
|
||||
package aquadx.net.games.wacca
|
||||
|
||||
import ext.API
|
||||
import ext.RP
|
||||
import ext.isoDate
|
||||
import ext.utc
|
||||
import icu.samnyan.aqua.net.db.AquaUserServices
|
||||
import icu.samnyan.aqua.net.games.*
|
||||
import icu.samnyan.aqua.net.utils.waccaScores
|
||||
import icu.samnyan.aqua.sega.wacca.model.db.WaccaUser
|
||||
import icu.samnyan.aqua.sega.wacca.model.db.WcUserBestScoreRepo
|
||||
import icu.samnyan.aqua.sega.wacca.model.db.WcUserPlayLogRepo
|
||||
import icu.samnyan.aqua.sega.wacca.model.db.WcUserRepo
|
||||
import aquadx.net.db.AquaUserServices
|
||||
import aquadx.net.games.*
|
||||
import aquadx.net.utils.waccaScores
|
||||
import aquadx.sega.wacca.model.db.WaccaUser
|
||||
import aquadx.sega.wacca.model.db.WcUserBestScoreRepo
|
||||
import aquadx.sega.wacca.model.db.WcUserPlayLogRepo
|
||||
import aquadx.sega.wacca.model.db.WcUserRepo
|
||||
import org.springframework.web.bind.annotation.RestController
|
||||
|
||||
@RestController
|
||||
+4
-4
@@ -1,11 +1,11 @@
|
||||
package icu.samnyan.aqua.net.transfer
|
||||
package aquadx.net.transfer
|
||||
|
||||
import ext.header
|
||||
import ext.post
|
||||
import ext.request
|
||||
import icu.samnyan.aqua.sega.aimedb.AimeDbClient
|
||||
import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder
|
||||
import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder.decodeAllNetResp
|
||||
import aquadx.sega.aimedb.AimeDbClient
|
||||
import aquadx.sega.allnet.AllNetBillingDecoder
|
||||
import aquadx.sega.allnet.AllNetBillingDecoder.decodeAllNetResp
|
||||
import java.net.URI
|
||||
|
||||
val keychipPattern = Regex("([A-Z\\d]{4}-[A-Z\\d]{11}|[A-Z\\d]{11})")
|
||||
+15
-15
@@ -1,19 +1,19 @@
|
||||
package icu.samnyan.aqua.net.transfer
|
||||
package aquadx.net.transfer
|
||||
|
||||
import ext.*
|
||||
import icu.samnyan.aqua.sega.chusan.model.request.Chu3UserAll
|
||||
import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserActivity
|
||||
import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserItem
|
||||
import icu.samnyan.aqua.sega.chusan.model.userdata.UserMusicDetail
|
||||
import icu.samnyan.aqua.sega.maimai2.model.request.Mai2UserAll
|
||||
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserFavorite
|
||||
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserItem
|
||||
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserMusicDetail
|
||||
import icu.samnyan.aqua.sega.ongeki.model.OngekiUpsertUserAll
|
||||
import icu.samnyan.aqua.sega.ongeki.model.UserItem
|
||||
import icu.samnyan.aqua.sega.util.BasicMapper
|
||||
import icu.samnyan.aqua.sega.util.IMapper
|
||||
import icu.samnyan.aqua.sega.util.StringMapper
|
||||
import aquadx.sega.chusan.model.request.Chu3UserAll
|
||||
import aquadx.sega.chusan.model.userdata.Chu3UserActivity
|
||||
import aquadx.sega.chusan.model.userdata.Chu3UserItem
|
||||
import aquadx.sega.chusan.model.userdata.UserMusicDetail
|
||||
import aquadx.sega.maimai2.model.request.Mai2UserAll
|
||||
import aquadx.sega.maimai2.model.userdata.Mai2UserFavorite
|
||||
import aquadx.sega.maimai2.model.userdata.Mai2UserItem
|
||||
import aquadx.sega.maimai2.model.userdata.Mai2UserMusicDetail
|
||||
import aquadx.sega.ongeki.model.OngekiUpsertUserAll
|
||||
import aquadx.sega.ongeki.model.UserItem
|
||||
import aquadx.sega.util.BasicMapper
|
||||
import aquadx.sega.util.IMapper
|
||||
import aquadx.sega.util.StringMapper
|
||||
|
||||
|
||||
abstract class DataBroker(
|
||||
@@ -131,7 +131,7 @@ class OngekiDataBroker(allNet: AllNetClient, log: (String) -> Unit): DataBroker(
|
||||
override val mapper = BasicMapper()
|
||||
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 {
|
||||
val (userId, paged) = prePull()
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.net.transfer
|
||||
package aquadx.net.transfer
|
||||
|
||||
import ext.*
|
||||
import jakarta.servlet.http.HttpServletResponse
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.net.utils
|
||||
package aquadx.net.utils
|
||||
|
||||
import jakarta.annotation.PostConstruct
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties
|
||||
+20
-28
@@ -1,29 +1,21 @@
|
||||
package icu.samnyan.aqua.net.utils
|
||||
|
||||
import ext.Str
|
||||
import org.slf4j.LoggerFactory
|
||||
import org.springframework.http.ResponseEntity
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler
|
||||
|
||||
|
||||
val SUCCESS = ResponseEntity.ok().body(mapOf("status" to "ok"))
|
||||
|
||||
class ApiException(val code: Int, message: Str) : RuntimeException(message) {
|
||||
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
|
||||
|
||||
@ControllerAdvice(basePackages = ["icu.samnyan"])
|
||||
class GlobalExceptionHandler {
|
||||
@ExceptionHandler(ApiException::class)
|
||||
fun handleCustomApiException(e: ApiException): ResponseEntity<String> {
|
||||
// On error, return the error code and message
|
||||
return e.resp()
|
||||
}
|
||||
package aquadx.net.utils
|
||||
|
||||
import org.springframework.http.ResponseEntity
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler
|
||||
|
||||
|
||||
val SUCCESS: ResponseEntity<Map<String, String>> = ResponseEntity.ok().body(mapOf("status" to "ok"))
|
||||
|
||||
fun ApiException.resp(): ResponseEntity<String> = ResponseEntity.status(code).body(message.toString())
|
||||
|
||||
fun Exception.simpleDescribe(): String = if (this is ApiException) "E${code}" else javaClass.simpleName
|
||||
|
||||
@ControllerAdvice(basePackages = ["icu.samnyan"])
|
||||
class GlobalExceptionHandler {
|
||||
@ExceptionHandler(ApiException::class)
|
||||
fun handleCustomApiException(e: ApiException): ResponseEntity<String> {
|
||||
// On error, return the error code and message
|
||||
return e.resp()
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.net.utils
|
||||
package aquadx.net.utils
|
||||
|
||||
|
||||
val mai2Scores = listOf(
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.net.utils
|
||||
package aquadx.net.utils
|
||||
|
||||
import ext.ensureEndingSlash
|
||||
import ext.path
|
||||
+6
-6
@@ -1,12 +1,12 @@
|
||||
package icu.samnyan.aqua.sega.aimedb
|
||||
package aquadx.sega.aimedb
|
||||
|
||||
import ext.logger
|
||||
import ext.toHex
|
||||
import icu.samnyan.aqua.net.Fedy
|
||||
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 aquadx.net.Fedy
|
||||
import aquadx.net.db.AquaUserServices
|
||||
import aquadx.sega.allnet.AllNetProps
|
||||
import aquadx.sega.general.model.Card
|
||||
import aquadx.sega.general.service.CardService
|
||||
import io.netty.buffer.ByteBuf
|
||||
import io.netty.buffer.ByteBufUtil
|
||||
import io.netty.buffer.Unpooled
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.sega.aimedb
|
||||
package aquadx.sega.aimedb
|
||||
|
||||
import ext.minus
|
||||
import io.netty.buffer.ByteBuf
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.sega.aimedb
|
||||
package aquadx.sega.aimedb
|
||||
|
||||
import io.netty.buffer.ByteBuf
|
||||
import io.netty.channel.ChannelHandlerContext
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.sega.aimedb
|
||||
package aquadx.sega.aimedb
|
||||
|
||||
import io.netty.buffer.ByteBuf
|
||||
import io.netty.channel.ChannelHandlerContext
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.sega.aimedb
|
||||
package aquadx.sega.aimedb
|
||||
|
||||
import io.netty.buffer.ByteBuf
|
||||
import io.netty.buffer.Unpooled.copiedBuffer
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.sega.aimedb
|
||||
package aquadx.sega.aimedb
|
||||
|
||||
import ext.logger
|
||||
import io.netty.bootstrap.ServerBootstrap
|
||||
+3
-3
@@ -1,8 +1,8 @@
|
||||
package icu.samnyan.aqua.sega.allnet
|
||||
package aquadx.sega.allnet
|
||||
|
||||
import ext.*
|
||||
import icu.samnyan.aqua.net.db.AquaNetUserRepo
|
||||
import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder.decodeAllNet
|
||||
import aquadx.net.db.AquaNetUserRepo
|
||||
import aquadx.sega.allnet.AllNetBillingDecoder.decodeAllNet
|
||||
import jakarta.servlet.http.HttpServletRequest
|
||||
import jakarta.servlet.http.HttpServletResponse
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
package icu.samnyan.aqua.sega.allnet
|
||||
package aquadx.sega.allnet
|
||||
|
||||
import ext.bodyString
|
||||
import ext.header
|
||||
import icu.samnyan.aqua.sega.util.ZLib
|
||||
import aquadx.sega.util.ZLib
|
||||
import java.net.http.HttpResponse
|
||||
import java.util.*
|
||||
import kotlin.text.Charsets.UTF_8
|
||||
+3
-3
@@ -1,8 +1,8 @@
|
||||
package icu.samnyan.aqua.sega.allnet
|
||||
package aquadx.sega.allnet
|
||||
|
||||
import ext.Str
|
||||
import icu.samnyan.aqua.net.FrontierProps
|
||||
import icu.samnyan.aqua.net.components.GeoIP
|
||||
import aquadx.net.FrontierProps
|
||||
import aquadx.net.components.GeoIP
|
||||
import jakarta.servlet.http.HttpServletRequest
|
||||
import jakarta.servlet.http.HttpServletRequestWrapper
|
||||
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
|
||||
}
|
||||
+60
-91
@@ -1,91 +1,60 @@
|
||||
package icu.samnyan.aqua.sega.allnet
|
||||
|
||||
import ext.async
|
||||
import icu.samnyan.aqua.net.db.AquaNetUser
|
||||
import jakarta.persistence.*
|
||||
import jakarta.transaction.Transactional
|
||||
import org.slf4j.LoggerFactory
|
||||
import org.springframework.data.jpa.repository.JpaRepository
|
||||
import org.springframework.scheduling.annotation.Scheduled
|
||||
import org.springframework.stereotype.Repository
|
||||
import org.springframework.stereotype.Service
|
||||
import java.security.SecureRandom
|
||||
|
||||
/**
|
||||
* This is a one-to-many mapping of keychip to session token.
|
||||
*/
|
||||
@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")
|
||||
interface KeychipSessionRepo : JpaRepository<KeychipSession, String> {
|
||||
fun findByToken(token: String): KeychipSession?
|
||||
|
||||
@Transactional
|
||||
fun deleteAllByLastUseBefore(expire: Long)
|
||||
}
|
||||
|
||||
@Service
|
||||
class KeychipSessionService(
|
||||
val repo: KeychipSessionRepo,
|
||||
val props: AllNetProps
|
||||
) {
|
||||
val logger = LoggerFactory.getLogger(KeychipSessionService::class.java)
|
||||
|
||||
/**
|
||||
* Delete sessions that are older than the expire time.
|
||||
*/
|
||||
@Scheduled(fixedDelayString = "\${allnet.server.keychip-ses-clean-interval}")
|
||||
suspend fun cleanup() = async {
|
||||
logger.info("!!! Keychip session cleanup !!!")
|
||||
val expire = System.currentTimeMillis() - props.keychipSesExpire
|
||||
repo.deleteAllByLastUseBefore(expire)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new session.
|
||||
*/
|
||||
fun new(user: AquaNetUser?, gameId: String): KeychipSession {
|
||||
val session = KeychipSession(user = user, gameId = gameId)
|
||||
return repo.save(session)
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a session. If found, renew the last use time.
|
||||
*/
|
||||
fun find(token: String) = repo.findByToken(token)?.apply {
|
||||
lastUse = System.currentTimeMillis()
|
||||
try {
|
||||
repo.save(this)
|
||||
} catch (_: Exception) {
|
||||
logger.error("Failed to update last use time for session $token")
|
||||
}
|
||||
}
|
||||
}
|
||||
package aquadx.sega.allnet
|
||||
|
||||
import ext.async
|
||||
import aquadx.net.db.AquaNetUser
|
||||
import jakarta.transaction.Transactional
|
||||
import org.slf4j.LoggerFactory
|
||||
import org.springframework.data.jpa.repository.JpaRepository
|
||||
import org.springframework.scheduling.annotation.Scheduled
|
||||
import org.springframework.stereotype.Repository
|
||||
import org.springframework.stereotype.Service
|
||||
|
||||
/**
|
||||
* Repository and Service for KeychipSession (Entity is located in :shared module).
|
||||
*/
|
||||
|
||||
@Repository("KeychipSessionRepo")
|
||||
interface KeychipSessionRepo : JpaRepository<KeychipSession, String> {
|
||||
fun findByToken(token: String): KeychipSession?
|
||||
|
||||
@Transactional
|
||||
fun deleteAllByLastUseBefore(expire: Long)
|
||||
}
|
||||
|
||||
@Service
|
||||
class KeychipSessionService(
|
||||
val repo: KeychipSessionRepo,
|
||||
val props: AllNetProps
|
||||
) {
|
||||
val logger = LoggerFactory.getLogger(KeychipSessionService::class.java)
|
||||
|
||||
/**
|
||||
* Delete sessions that are older than the expire time.
|
||||
*/
|
||||
@Scheduled(fixedDelayString = "\${allnet.server.keychip-ses-clean-interval}")
|
||||
suspend fun cleanup() = async {
|
||||
logger.info("!!! Keychip session cleanup !!!")
|
||||
val expire = System.currentTimeMillis() - props.keychipSesExpire
|
||||
repo.deleteAllByLastUseBefore(expire)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new session.
|
||||
*/
|
||||
fun new(user: AquaNetUser?, gameId: String): KeychipSession {
|
||||
val session = KeychipSession(user = user, gameId = gameId)
|
||||
return repo.save(session)
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a session. If found, renew the last use time.
|
||||
*/
|
||||
fun find(token: String) = repo.findByToken(token)?.apply {
|
||||
lastUse = System.currentTimeMillis()
|
||||
try {
|
||||
repo.save(this)
|
||||
} catch (_: Exception) {
|
||||
logger.error("Failed to update last use time for session $token")
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -1,8 +1,8 @@
|
||||
package icu.samnyan.aqua.sega.billing
|
||||
package aquadx.sega.billing
|
||||
|
||||
import aquadx.sega.allnet.AllNetBillingDecoder
|
||||
import ext.logger
|
||||
import ext.toUrl
|
||||
import icu.samnyan.aqua.sega.allnet.AllNetBillingDecoder.decodeBilling
|
||||
import jakarta.annotation.PostConstruct
|
||||
import jakarta.servlet.http.HttpServletRequest
|
||||
import org.eclipse.jetty.http.HttpVersion
|
||||
@@ -55,7 +55,7 @@ class Billing(
|
||||
@PostMapping("/request", produces = ["text/plain"])
|
||||
fun powerOn(dataStream: InputStream, req: HttpServletRequest?): String {
|
||||
val bytes = dataStream.readAllBytes()
|
||||
val reqMap = decodeBilling(bytes)
|
||||
val reqMap = AllNetBillingDecoder.decodeBilling(bytes)
|
||||
|
||||
logger.info("Billing : $reqMap")
|
||||
|
||||
+3
-3
@@ -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.logger
|
||||
import ext.long
|
||||
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.web.bind.annotation.ModelAttribute
|
||||
import org.springframework.web.bind.annotation.RequestMapping
|
||||
+2
-2
@@ -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.databind.ObjectMapper
|
||||
@@ -11,7 +11,7 @@ import java.nio.charset.StandardCharsets
|
||||
/**
|
||||
* @author samnyan (privateamusement@protonmail.com)
|
||||
*/
|
||||
@RestControllerAdvice(basePackages = ["icu.samnyan.aqua.sega.cardmaker"])
|
||||
@RestControllerAdvice(basePackages = ["aquadx.sega.cardmaker"])
|
||||
class CardMakerControllerAdvice {
|
||||
val logger = logger()
|
||||
val mapper = ObjectMapper()
|
||||
+15
-15
@@ -1,19 +1,19 @@
|
||||
package icu.samnyan.aqua.sega.chusan
|
||||
package aquadx.sega.chusan
|
||||
|
||||
import ext.*
|
||||
import icu.samnyan.aqua.net.db.AquaUserServices
|
||||
import icu.samnyan.aqua.net.games.chu3.Chusan
|
||||
import icu.samnyan.aqua.net.utils.simpleDescribe
|
||||
import icu.samnyan.aqua.sega.allnet.TokenChecker
|
||||
import icu.samnyan.aqua.sega.chusan.handler.chusanInit
|
||||
import icu.samnyan.aqua.sega.chusan.model.Chu3Repos
|
||||
import icu.samnyan.aqua.sega.general.GameMusicPopularity
|
||||
import icu.samnyan.aqua.sega.general.MeowApi
|
||||
import icu.samnyan.aqua.sega.general.RequestContext
|
||||
import icu.samnyan.aqua.sega.general.service.CardService
|
||||
import icu.samnyan.aqua.sega.util.BasicMapper
|
||||
import icu.samnyan.aqua.sega.util.StringMapper
|
||||
import icu.samnyan.aqua.spring.Metrics
|
||||
import aquadx.net.db.AquaUserServices
|
||||
import aquadx.net.games.chu3.Chusan
|
||||
import aquadx.net.utils.simpleDescribe
|
||||
import aquadx.sega.allnet.TokenChecker
|
||||
import aquadx.sega.chusan.handler.chusanInit
|
||||
import aquadx.sega.chusan.model.Chu3Repos
|
||||
import aquadx.sega.general.GameMusicPopularity
|
||||
import aquadx.sega.general.MeowApi
|
||||
import aquadx.sega.general.RequestContext
|
||||
import aquadx.sega.general.service.CardService
|
||||
import aquadx.sega.util.BasicMapper
|
||||
import aquadx.sega.util.StringMapper
|
||||
import aquadx.spring.Metrics
|
||||
import jakarta.servlet.http.HttpServletRequest
|
||||
import org.slf4j.LoggerFactory
|
||||
import org.springframework.web.bind.annotation.RestController
|
||||
@@ -83,7 +83,7 @@ class ChusanController(
|
||||
if (api !in setOf("GetUserItemApi", "GetGameEventApi"))
|
||||
log.info("$token : $api > ${it.truncate(500)}")
|
||||
}
|
||||
}
|
||||
}!!
|
||||
} catch (e: Exception) {
|
||||
Metrics.counter("aquadx_chusan_api_error", "api" to api, "error" to e.simpleDescribe()).increment()
|
||||
throw e
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.sega.chusan
|
||||
package aquadx.sega.chusan
|
||||
|
||||
|
||||
object ChusanData {
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.sega.chusan
|
||||
package aquadx.sega.chusan
|
||||
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties
|
||||
import org.springframework.context.annotation.Configuration
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
package icu.samnyan.aqua.sega.chusan
|
||||
package aquadx.sega.chusan
|
||||
|
||||
import ext.logger
|
||||
import icu.samnyan.aqua.sega.chusan.model.Chu3Repos
|
||||
import aquadx.sega.chusan.model.Chu3Repos
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
|
||||
+9
-9
@@ -1,14 +1,14 @@
|
||||
package icu.samnyan.aqua.sega.chusan.handler
|
||||
package aquadx.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.userdata.Chu3UserItem
|
||||
import icu.samnyan.aqua.sega.chusan.model.userdata.UserMusicDetail
|
||||
import icu.samnyan.aqua.sega.general.model.CardStatus
|
||||
import icu.samnyan.aqua.sega.general.model.UserRecentRating
|
||||
import aquadx.sega.allnet.TokenChecker
|
||||
import aquadx.sega.chusan.ChusanController
|
||||
import aquadx.sega.chusan.ChusanData
|
||||
import aquadx.sega.chusan.model.request.UserCMissionResp
|
||||
import aquadx.sega.chusan.model.userdata.Chu3UserItem
|
||||
import aquadx.sega.chusan.model.userdata.UserMusicDetail
|
||||
import aquadx.sega.general.model.CardStatus
|
||||
import aquadx.sega.general.model.UserRecentRating
|
||||
import org.springframework.data.repository.findByIdOrNull
|
||||
import java.time.format.DateTimeFormatter
|
||||
|
||||
+6
-6
@@ -1,11 +1,11 @@
|
||||
package icu.samnyan.aqua.sega.chusan.handler
|
||||
package aquadx.sega.chusan.handler
|
||||
|
||||
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.Chu3UserItem
|
||||
import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState
|
||||
import aquadx.sega.chusan.ChusanController
|
||||
import aquadx.sega.chusan.model.request.UpsertUserGacha
|
||||
import aquadx.sega.chusan.model.request.UserEmoney
|
||||
import aquadx.sega.chusan.model.userdata.Chu3UserItem
|
||||
import aquadx.sega.chusan.model.userdata.UserCardPrintState
|
||||
import java.time.LocalDateTime
|
||||
|
||||
fun ChusanController.cmApiInit() {
|
||||
+4
-4
@@ -1,14 +1,14 @@
|
||||
@file:Suppress("UNCHECKED_CAST")
|
||||
|
||||
package icu.samnyan.aqua.sega.chusan.handler
|
||||
package aquadx.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 aquadx.sega.chusan.ChusanController
|
||||
import aquadx.sega.chusan.model.request.MatchingWaitState
|
||||
import aquadx.sega.chusan.model.userdata.Chu3MatchingMemberReq
|
||||
|
||||
|
||||
fun ChusanController.matchingApiInit() {
|
||||
+6
-6
@@ -1,11 +1,11 @@
|
||||
package icu.samnyan.aqua.sega.chusan.handler
|
||||
package aquadx.sega.chusan.handler
|
||||
|
||||
import ext.*
|
||||
import icu.samnyan.aqua.sega.chusan.ChusanController
|
||||
import icu.samnyan.aqua.sega.chusan.model.request.Chu3UserAll
|
||||
import icu.samnyan.aqua.sega.chusan.model.userdata.*
|
||||
import icu.samnyan.aqua.sega.general.model.CardStatus
|
||||
import icu.samnyan.aqua.sega.general.model.UserRecentRating
|
||||
import aquadx.sega.chusan.ChusanController
|
||||
import aquadx.sega.chusan.model.request.Chu3UserAll
|
||||
import aquadx.sega.chusan.model.userdata.*
|
||||
import aquadx.sega.general.model.CardStatus
|
||||
import aquadx.sega.general.model.UserRecentRating
|
||||
import kotlinx.serialization.encodeToString
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
+8
-8
@@ -1,20 +1,20 @@
|
||||
@file:Suppress("FunctionName")
|
||||
|
||||
package icu.samnyan.aqua.sega.chusan.model
|
||||
package aquadx.sega.chusan.model
|
||||
|
||||
import icu.samnyan.aqua.net.games.GenericPlaylogRepo
|
||||
import icu.samnyan.aqua.net.games.GenericUserDataRepo
|
||||
import icu.samnyan.aqua.net.games.GenericUserMusicRepo
|
||||
import icu.samnyan.aqua.net.games.IUserRepo
|
||||
import icu.samnyan.aqua.sega.chusan.model.userdata.*
|
||||
import aquadx.net.games.GenericPlaylogRepo
|
||||
import aquadx.net.games.GenericUserDataRepo
|
||||
import aquadx.net.games.GenericUserMusicRepo
|
||||
import aquadx.net.games.IUserRepo
|
||||
import aquadx.sega.chusan.model.userdata.*
|
||||
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
|
||||
import org.springframework.stereotype.Component
|
||||
import icu.samnyan.aqua.sega.util.GameDataService
|
||||
import icu.samnyan.aqua.sega.util.StaticRepo
|
||||
import aquadx.sega.util.GameDataService
|
||||
import aquadx.sega.util.StaticRepo
|
||||
|
||||
|
||||
@NoRepositoryBean
|
||||
+14
-14
@@ -1,22 +1,22 @@
|
||||
package icu.samnyan.aqua.sega.diva
|
||||
package aquadx.sega.diva
|
||||
|
||||
import ext.JDict
|
||||
import ext.MutJDict
|
||||
import ext.emptyMap
|
||||
import ext.logger
|
||||
import icu.samnyan.aqua.sega.diva.handler.AttendHandler
|
||||
import icu.samnyan.aqua.sega.diva.handler.PingHandler
|
||||
import icu.samnyan.aqua.sega.diva.handler.card.CardProcedureHandler
|
||||
import icu.samnyan.aqua.sega.diva.handler.card.ChangeNameHandler
|
||||
import icu.samnyan.aqua.sega.diva.handler.card.ChangePasswdHandler
|
||||
import icu.samnyan.aqua.sega.diva.handler.card.RegistrationHandler
|
||||
import icu.samnyan.aqua.sega.diva.handler.databank.*
|
||||
import icu.samnyan.aqua.sega.diva.handler.ingame.*
|
||||
import icu.samnyan.aqua.sega.diva.handler.user.*
|
||||
import icu.samnyan.aqua.sega.diva.model.*
|
||||
import icu.samnyan.aqua.sega.diva.util.DivaMapper
|
||||
import icu.samnyan.aqua.sega.diva.util.DivaTime
|
||||
import icu.samnyan.aqua.sega.diva.util.URIEncoder.encode
|
||||
import aquadx.sega.diva.handler.AttendHandler
|
||||
import aquadx.sega.diva.handler.PingHandler
|
||||
import aquadx.sega.diva.handler.card.CardProcedureHandler
|
||||
import aquadx.sega.diva.handler.card.ChangeNameHandler
|
||||
import aquadx.sega.diva.handler.card.ChangePasswdHandler
|
||||
import aquadx.sega.diva.handler.card.RegistrationHandler
|
||||
import aquadx.sega.diva.handler.databank.*
|
||||
import aquadx.sega.diva.handler.ingame.*
|
||||
import aquadx.sega.diva.handler.user.*
|
||||
import aquadx.sega.diva.model.*
|
||||
import aquadx.sega.diva.util.DivaMapper
|
||||
import aquadx.sega.diva.util.DivaTime
|
||||
import aquadx.sega.diva.util.URIEncoder.encode
|
||||
import jakarta.servlet.http.HttpServletRequest
|
||||
import org.springframework.http.MediaType
|
||||
import org.springframework.web.bind.annotation.PostMapping
|
||||
+7
-7
@@ -1,12 +1,12 @@
|
||||
package icu.samnyan.aqua.sega.diva
|
||||
package aquadx.sega.diva
|
||||
|
||||
import ext.invoke
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Difficulty
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Edition
|
||||
import icu.samnyan.aqua.sega.diva.model.db.gamedata.*
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.*
|
||||
import icu.samnyan.aqua.sega.diva.util.ProfileNotFoundException
|
||||
import icu.samnyan.aqua.sega.diva.util.SessionNotFoundException
|
||||
import aquadx.sega.diva.model.common.Difficulty
|
||||
import aquadx.sega.diva.model.common.Edition
|
||||
import aquadx.sega.diva.model.db.gamedata.*
|
||||
import aquadx.sega.diva.model.db.userdata.*
|
||||
import aquadx.sega.diva.util.ProfileNotFoundException
|
||||
import aquadx.sega.diva.util.SessionNotFoundException
|
||||
import org.springframework.data.jpa.repository.JpaRepository
|
||||
import org.springframework.data.jpa.repository.Query
|
||||
import org.springframework.data.repository.query.Param
|
||||
+5
-5
@@ -1,9 +1,9 @@
|
||||
package icu.samnyan.aqua.sega.diva
|
||||
package aquadx.sega.diva
|
||||
|
||||
import icu.samnyan.aqua.sega.diva.model.RegistrationRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerCustomize
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerModule
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerProfile
|
||||
import aquadx.sega.diva.model.RegistrationRequest
|
||||
import aquadx.sega.diva.model.db.userdata.PlayerCustomize
|
||||
import aquadx.sega.diva.model.db.userdata.PlayerModule
|
||||
import aquadx.sega.diva.model.db.userdata.PlayerProfile
|
||||
import org.apache.commons.lang3.StringUtils
|
||||
import org.springframework.stereotype.Component
|
||||
import org.springframework.stereotype.Service
|
||||
+5
-5
@@ -1,10 +1,10 @@
|
||||
package icu.samnyan.aqua.sega.diva.handler
|
||||
package aquadx.sega.diva.handler
|
||||
|
||||
import ext.csv
|
||||
import icu.samnyan.aqua.sega.diva.model.BaseRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.PingResponse
|
||||
import icu.samnyan.aqua.sega.general.dao.PropertyEntryRepository
|
||||
import icu.samnyan.aqua.sega.general.model.PropertyEntry
|
||||
import aquadx.sega.diva.model.BaseRequest
|
||||
import aquadx.sega.diva.model.PingResponse
|
||||
import aquadx.sega.general.dao.PropertyEntryRepository
|
||||
import aquadx.sega.general.model.PropertyEntry
|
||||
import org.springframework.stereotype.Component
|
||||
import java.time.LocalDateTime
|
||||
import java.util.*
|
||||
+7
-7
@@ -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 icu.samnyan.aqua.sega.diva.model.CardProcedureRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.CardProcedureResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Result
|
||||
import icu.samnyan.aqua.sega.diva.model.common.StartMode
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.GameSession
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.CardProcedureRequest
|
||||
import aquadx.sega.diva.model.CardProcedureResponse
|
||||
import aquadx.sega.diva.model.common.Result
|
||||
import aquadx.sega.diva.model.common.StartMode
|
||||
import aquadx.sega.diva.model.db.userdata.GameSession
|
||||
import org.springframework.stereotype.Component
|
||||
import java.time.LocalDateTime
|
||||
import java.util.concurrent.ThreadLocalRandom
|
||||
+5
-5
@@ -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 icu.samnyan.aqua.sega.diva.model.ChangeNameRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.ChangeNameResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Result
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.ChangeNameRequest
|
||||
import aquadx.sega.diva.model.ChangeNameResponse
|
||||
import aquadx.sega.diva.model.common.Result
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
/**
|
||||
+6
-6
@@ -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 icu.samnyan.aqua.sega.diva.model.ChangePasswdRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.ChangePasswdResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.common.PassStat
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Result
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.ChangePasswdRequest
|
||||
import aquadx.sega.diva.model.ChangePasswdResponse
|
||||
import aquadx.sega.diva.model.common.PassStat
|
||||
import aquadx.sega.diva.model.common.Result
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
/**
|
||||
+5
-5
@@ -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 icu.samnyan.aqua.sega.diva.model.RegistrationRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.RegistrationResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Result
|
||||
import aquadx.sega.diva.PlayerProfileService
|
||||
import aquadx.sega.diva.model.RegistrationRequest
|
||||
import aquadx.sega.diva.model.RegistrationResponse
|
||||
import aquadx.sega.diva.model.common.Result
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
/**
|
||||
+6
-6
@@ -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 icu.samnyan.aqua.sega.diva.model.BaseRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.ContestInfoResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.db.gamedata.Contest
|
||||
import icu.samnyan.aqua.sega.diva.util.URIEncoder.encode
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.BaseRequest
|
||||
import aquadx.sega.diva.model.ContestInfoResponse
|
||||
import aquadx.sega.diva.model.db.gamedata.Contest
|
||||
import aquadx.sega.diva.util.URIEncoder.encode
|
||||
import org.springframework.stereotype.Component
|
||||
import java.time.LocalDateTime
|
||||
import java.util.function.Consumer
|
||||
+5
-5
@@ -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 icu.samnyan.aqua.sega.diva.model.BaseRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.FestaInfoResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.common.collection.FestaCollection
|
||||
import aquadx.sega.diva.FestaRepository
|
||||
import aquadx.sega.diva.model.BaseRequest
|
||||
import aquadx.sega.diva.model.FestaInfoResponse
|
||||
import aquadx.sega.diva.model.common.collection.FestaCollection
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
/**
|
||||
+3
-3
@@ -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 icu.samnyan.aqua.sega.diva.model.NvRankingResponse
|
||||
import aquadx.sega.diva.model.BaseRequest
|
||||
import aquadx.sega.diva.model.NvRankingResponse
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
/**
|
||||
+8
-8
@@ -1,13 +1,13 @@
|
||||
package icu.samnyan.aqua.sega.diva.handler.databank
|
||||
package aquadx.sega.diva.handler.databank
|
||||
|
||||
import ext.csv
|
||||
import icu.samnyan.aqua.sega.diva.DivaRepos
|
||||
import icu.samnyan.aqua.sega.diva.model.PsRankingRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.PsRankingResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Difficulty
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Edition
|
||||
import icu.samnyan.aqua.sega.diva.model.common.collection.PsRankingCollection
|
||||
import icu.samnyan.aqua.sega.diva.util.URIEncoder.encode
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.PsRankingRequest
|
||||
import aquadx.sega.diva.model.PsRankingResponse
|
||||
import aquadx.sega.diva.model.common.Difficulty
|
||||
import aquadx.sega.diva.model.common.Edition
|
||||
import aquadx.sega.diva.model.common.collection.PsRankingCollection
|
||||
import aquadx.sega.diva.util.URIEncoder.encode
|
||||
import org.springframework.stereotype.Component
|
||||
import java.time.LocalDateTime
|
||||
import java.util.*
|
||||
+7
-7
@@ -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 icu.samnyan.aqua.sega.diva.model.BaseRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.PvListResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Difficulty
|
||||
import icu.samnyan.aqua.sega.diva.model.db.gamedata.PvEntry
|
||||
import icu.samnyan.aqua.sega.diva.util.URIEncoder.encode
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.BaseRequest
|
||||
import aquadx.sega.diva.model.PvListResponse
|
||||
import aquadx.sega.diva.model.common.Difficulty
|
||||
import aquadx.sega.diva.model.db.gamedata.PvEntry
|
||||
import aquadx.sega.diva.util.URIEncoder.encode
|
||||
import org.springframework.stereotype.Component
|
||||
import java.time.LocalDateTime
|
||||
import java.time.format.DateTimeFormatter
|
||||
+5
-5
@@ -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 icu.samnyan.aqua.sega.diva.model.BaseRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.ShopCatalogResponse
|
||||
import icu.samnyan.aqua.sega.diva.util.URIEncoder.encode
|
||||
import aquadx.sega.diva.DivaModuleRepository
|
||||
import aquadx.sega.diva.model.BaseRequest
|
||||
import aquadx.sega.diva.model.ShopCatalogResponse
|
||||
import aquadx.sega.diva.util.URIEncoder.encode
|
||||
import org.springframework.stereotype.Component
|
||||
import java.time.LocalDateTime
|
||||
|
||||
+5
-5
@@ -1,10 +1,10 @@
|
||||
package icu.samnyan.aqua.sega.diva.handler.ingame
|
||||
package aquadx.sega.diva.handler.ingame
|
||||
|
||||
import ext.invoke
|
||||
import icu.samnyan.aqua.sega.diva.DivaRepos
|
||||
import icu.samnyan.aqua.sega.diva.model.BuyCstmzItmRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.BuyCstmzItmResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Result
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.BuyCstmzItmRequest
|
||||
import aquadx.sega.diva.model.BuyCstmzItmResponse
|
||||
import aquadx.sega.diva.model.common.Result
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
/**
|
||||
+5
-5
@@ -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 icu.samnyan.aqua.sega.diva.model.BuyModuleRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.BuyModuleResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Result
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.BuyModuleRequest
|
||||
import aquadx.sega.diva.model.BuyModuleResponse
|
||||
import aquadx.sega.diva.model.common.Result
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
/**
|
||||
+10
-10
@@ -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 icu.samnyan.aqua.sega.diva.model.GetPvPdRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.GetPvPdResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Difficulty
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Edition
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerPvCustomize
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerPvRecord
|
||||
import icu.samnyan.aqua.sega.diva.util.DivaTime
|
||||
import icu.samnyan.aqua.sega.diva.util.URIEncoder.encode
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.GetPvPdRequest
|
||||
import aquadx.sega.diva.model.GetPvPdResponse
|
||||
import aquadx.sega.diva.model.common.Difficulty
|
||||
import aquadx.sega.diva.model.common.Edition
|
||||
import aquadx.sega.diva.model.db.userdata.PlayerPvCustomize
|
||||
import aquadx.sega.diva.model.db.userdata.PlayerPvRecord
|
||||
import aquadx.sega.diva.util.DivaTime
|
||||
import aquadx.sega.diva.util.URIEncoder.encode
|
||||
import org.springframework.stereotype.Component
|
||||
import java.util.function.Supplier
|
||||
|
||||
+6
-6
@@ -1,11 +1,11 @@
|
||||
package icu.samnyan.aqua.sega.diva.handler.ingame
|
||||
package aquadx.sega.diva.handler.ingame
|
||||
|
||||
import ext.csv
|
||||
import icu.samnyan.aqua.sega.diva.DivaRepos
|
||||
import icu.samnyan.aqua.sega.diva.model.ShopExitRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.ShopExitResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Result
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerPvCustomize
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.ShopExitRequest
|
||||
import aquadx.sega.diva.model.ShopExitResponse
|
||||
import aquadx.sega.diva.model.common.Result
|
||||
import aquadx.sega.diva.model.db.userdata.PlayerPvCustomize
|
||||
import org.springframework.stereotype.Component
|
||||
import java.util.function.Supplier
|
||||
|
||||
+7
-7
@@ -1,12 +1,12 @@
|
||||
package icu.samnyan.aqua.sega.diva.handler.ingame
|
||||
package aquadx.sega.diva.handler.ingame
|
||||
|
||||
import ext.logger
|
||||
import icu.samnyan.aqua.sega.diva.DivaRepos
|
||||
import icu.samnyan.aqua.sega.diva.model.StageResultRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.StageResultResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.common.*
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.*
|
||||
import icu.samnyan.aqua.sega.diva.util.DivaCalculator
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.StageResultRequest
|
||||
import aquadx.sega.diva.model.StageResultResponse
|
||||
import aquadx.sega.diva.model.common.*
|
||||
import aquadx.sega.diva.model.db.userdata.*
|
||||
import aquadx.sega.diva.util.DivaCalculator
|
||||
import org.apache.commons.lang3.StringUtils
|
||||
import org.springframework.stereotype.Component
|
||||
import java.lang.String
|
||||
+3
-3
@@ -1,8 +1,8 @@
|
||||
package icu.samnyan.aqua.sega.diva.handler.ingame
|
||||
package aquadx.sega.diva.handler.ingame
|
||||
|
||||
import ext.emptyMap
|
||||
import icu.samnyan.aqua.sega.diva.DivaRepos
|
||||
import icu.samnyan.aqua.sega.diva.model.StageStartRequest
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.StageStartRequest
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
/**
|
||||
+6
-6
@@ -1,12 +1,12 @@
|
||||
package icu.samnyan.aqua.sega.diva.handler.ingame
|
||||
package aquadx.sega.diva.handler.ingame
|
||||
|
||||
import ext.csv
|
||||
import ext.logger
|
||||
import icu.samnyan.aqua.sega.diva.DIVA_BAD
|
||||
import icu.samnyan.aqua.sega.diva.DIVA_OK
|
||||
import icu.samnyan.aqua.sega.diva.DivaRepos
|
||||
import icu.samnyan.aqua.sega.diva.model.StoreSsRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerScreenShot
|
||||
import aquadx.sega.diva.DIVA_BAD
|
||||
import aquadx.sega.diva.DIVA_OK
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.StoreSsRequest
|
||||
import aquadx.sega.diva.model.db.userdata.PlayerScreenShot
|
||||
import org.springframework.stereotype.Component
|
||||
import org.springframework.web.multipart.MultipartFile
|
||||
import java.io.IOException
|
||||
+11
-11
@@ -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 icu.samnyan.aqua.sega.diva.DivaRepos
|
||||
import icu.samnyan.aqua.sega.diva.model.StageResultRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.common.ContestBorder
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Difficulty
|
||||
import icu.samnyan.aqua.sega.diva.model.common.Edition
|
||||
import icu.samnyan.aqua.sega.diva.model.common.SortMode
|
||||
import icu.samnyan.aqua.sega.diva.model.db.gamedata.Contest
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerContest
|
||||
import icu.samnyan.aqua.sega.diva.util.DivaStringUtils
|
||||
import aquadx.sega.diva.DIVA_OK
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.StageResultRequest
|
||||
import aquadx.sega.diva.model.common.ContestBorder
|
||||
import aquadx.sega.diva.model.common.Difficulty
|
||||
import aquadx.sega.diva.model.common.Edition
|
||||
import aquadx.sega.diva.model.common.SortMode
|
||||
import aquadx.sega.diva.model.db.gamedata.Contest
|
||||
import aquadx.sega.diva.model.db.userdata.PlayerContest
|
||||
import aquadx.sega.diva.util.DivaStringUtils
|
||||
import org.springframework.stereotype.Component
|
||||
import java.lang.String
|
||||
import java.time.LocalDateTime
|
||||
+4
-4
@@ -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 icu.samnyan.aqua.sega.diva.DivaRepos
|
||||
import icu.samnyan.aqua.sega.diva.model.PdUnlockRequest
|
||||
import aquadx.sega.diva.DIVA_OK
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.PdUnlockRequest
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
@Component
|
||||
+7
-7
@@ -1,13 +1,13 @@
|
||||
package icu.samnyan.aqua.sega.diva.handler.user
|
||||
package aquadx.sega.diva.handler.user
|
||||
|
||||
import ext.invoke
|
||||
import ext.logger
|
||||
import icu.samnyan.aqua.sega.diva.DivaRepos
|
||||
import icu.samnyan.aqua.sega.diva.model.PreStartRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.PreStartResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.common.PreStartResult
|
||||
import icu.samnyan.aqua.sega.diva.model.common.StartMode
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.GameSession
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.PreStartRequest
|
||||
import aquadx.sega.diva.model.PreStartResponse
|
||||
import aquadx.sega.diva.model.common.PreStartResult
|
||||
import aquadx.sega.diva.model.common.StartMode
|
||||
import aquadx.sega.diva.model.db.userdata.GameSession
|
||||
import org.springframework.stereotype.Component
|
||||
import java.time.LocalDateTime
|
||||
import java.util.concurrent.ThreadLocalRandom
|
||||
+4
-4
@@ -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 icu.samnyan.aqua.sega.diva.model.SpendCreditRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.SpendCreditResponse
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.SpendCreditRequest
|
||||
import aquadx.sega.diva.model.SpendCreditResponse
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
/**
|
||||
+11
-11
@@ -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 icu.samnyan.aqua.sega.diva.model.StartRequest
|
||||
import icu.samnyan.aqua.sega.diva.model.StartResponse
|
||||
import icu.samnyan.aqua.sega.diva.model.common.*
|
||||
import icu.samnyan.aqua.sega.diva.model.common.collection.ClearTally
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.GameSession
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerContest
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerProfile
|
||||
import icu.samnyan.aqua.sega.diva.model.db.userdata.PlayerPvRecord
|
||||
import icu.samnyan.aqua.sega.diva.util.PvRecordDataException
|
||||
import aquadx.sega.diva.DivaRepos
|
||||
import aquadx.sega.diva.model.StartRequest
|
||||
import aquadx.sega.diva.model.StartResponse
|
||||
import aquadx.sega.diva.model.common.*
|
||||
import aquadx.sega.diva.model.common.collection.ClearTally
|
||||
import aquadx.sega.diva.model.db.userdata.GameSession
|
||||
import aquadx.sega.diva.model.db.userdata.PlayerContest
|
||||
import aquadx.sega.diva.model.db.userdata.PlayerProfile
|
||||
import aquadx.sega.diva.model.db.userdata.PlayerPvRecord
|
||||
import aquadx.sega.diva.util.PvRecordDataException
|
||||
import org.springframework.stereotype.Component
|
||||
import java.time.LocalDateTime
|
||||
import java.util.*
|
||||
+4
-4
@@ -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.type.TypeReference
|
||||
@@ -8,9 +8,9 @@ import com.fasterxml.jackson.databind.json.JsonMapper
|
||||
import com.fasterxml.jackson.databind.module.SimpleModule
|
||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer
|
||||
import ext.JDict
|
||||
import icu.samnyan.aqua.sega.util.BooleanNumberDeserializer
|
||||
import icu.samnyan.aqua.sega.util.BooleanNumberSerializer
|
||||
import icu.samnyan.aqua.sega.util.ZonedDateTimeDeserializer
|
||||
import aquadx.sega.util.BooleanNumberDeserializer
|
||||
import aquadx.sega.util.BooleanNumberSerializer
|
||||
import aquadx.sega.util.ZonedDateTimeDeserializer
|
||||
import org.springframework.stereotype.Component
|
||||
import java.time.LocalDateTime
|
||||
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
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.sega.diva.util
|
||||
package aquadx.sega.diva.util
|
||||
|
||||
class PvRecordDataException(message: String?) : RuntimeException(message)
|
||||
class SessionNotFoundException : RuntimeException()
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.sega.general
|
||||
package aquadx.sega.general
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException
|
||||
import ext.*
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package icu.samnyan.aqua.sega.general
|
||||
package aquadx.sega.general
|
||||
|
||||
import ext.*
|
||||
import jakarta.persistence.EntityManager
|
||||
+2
-2
@@ -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.stereotype.Repository
|
||||
|
||||
+2
-2
@@ -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.stereotype.Repository
|
||||
import java.util.*
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user