export options

This commit is contained in:
Menci 2025-06-25 01:03:19 +08:00 committed by Azalea
parent 155202dab9
commit 5c1f659437
4 changed files with 31 additions and 6 deletions

View File

@ -30,7 +30,7 @@ allnet.server.redirect=https://aquadx.net
## Http Server Port
## Only change this if you have a reverse proxy running.
## The game rely on 80 port for boot up command
server.port=80
server.port=8080
## Static file server
## This is used to server static files in /web/ directory, which is Aquaviewer

View File

@ -16,6 +16,10 @@ import kotlin.io.path.Path
import kotlin.io.path.writeText
import kotlin.reflect.KClass
data class ExportOptions(
val playlogSince: String? = null
)
// Import class with renaming
data class ImportClass<T : Any>(
val type: KClass<T>,
@ -54,6 +58,7 @@ abstract class ImportController<ExportModel: IExportClass<UserModel>, UserModel:
val exportFields: Map<String, Var<ExportModel, Any>>,
val exportRepos: Map<Var<ExportModel, Any>, IUserRepo<UserModel, *>>,
val artemisRenames: Map<String, ImportClass<*>>,
val customExporters: Map<Var<ExportModel, Any>, (UserModel, ExportOptions) -> Any?> = emptyMap()
) {
abstract fun createEmpty(): ExportModel
abstract val userDataRepo: GenericUserDataRepo<UserModel>
@ -72,12 +77,19 @@ abstract class ImportController<ExportModel: IExportClass<UserModel>, UserModel:
val listRepos = exportRepos.filter { it.key returns List::class }
val singleRepos = exportRepos.filter { !(it.key returns List::class) }
fun export(u: AquaNetUser) = createEmpty().apply {
fun export(u: AquaNetUser): ExportModel = export(u, ExportOptions())
fun export(u: AquaNetUser, options: ExportOptions) = createEmpty().apply {
gameId = game
userData = userDataRepo.findByCard(u.ghostCard) ?: (404 - "User not found")
exportRepos.forEach { (f, u) ->
if (f returns List::class) f.set(this, u.findByUser(userData))
else u.findSingleByUser(userData)()?.let { f.set(this, it) }
val customExporter = customExporters[f]
if (customExporter != null) {
customExporter(userData, options)?.let { f.set(this, it) }
} else {
if (f returns List::class) f.set(this, u.findByUser(userData))
else u.findSingleByUser(userData)()?.let { f.set(this, it) }
}
}
}

View File

@ -3,6 +3,7 @@ package icu.samnyan.aqua.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
@ -44,7 +45,18 @@ class Mai2Import(
"mai2_profile_option" to ImportClass(Mai2UserOption::class, mapOf("version" to null)),
"mai2_score_best" to ImportClass(Mai2UserMusicDetail::class),
"mai2_score_course" to ImportClass(Mai2UserCourse::class),
)
),
customExporters = run {
mapOf(
Maimai2DataExport::userPlaylogList to { user: Mai2UserDetail, options: ExportOptions ->
if (options.playlogSince != null) {
repos.userPlaylog.findByUserAndUserPlayDateAfter(user, options.playlogSince)
} else {
repos.userPlaylog.findByUser(user)
}
}
) as Map<kotlin.reflect.KMutableProperty1<Maimai2DataExport, Any>, (Mai2UserDetail, ExportOptions) -> Any?>
}
) {
override fun createEmpty() = Maimai2DataExport()
override val userDataRepo = repos.userData
@ -74,4 +86,4 @@ data class Maimai2DataExport(
mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(),
mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(),
mutableListOf())
}
}

View File

@ -104,6 +104,7 @@ interface Mai2UserPlaylogRepo : GenericPlaylogRepo<Mai2UserPlaylog>, Mai2UserLin
musicId: Int,
userPlayDate: String
): MutableList<Mai2UserPlaylog>
fun findByUserAndUserPlayDateAfter(user: Mai2UserDetail, userPlayDate: String): List<Mai2UserPlaylog>
}
interface Mai2UserPrintDetailRepo : JpaRepository<Mai2UserPrintDetail, Long>