From 2090a1b422ba17e309e5923a714f9ca74a752b93 Mon Sep 17 00:00:00 2001 From: SettingDust Date: Tue, 29 Oct 2024 22:20:09 +0800 Subject: [PATCH] chore: better naming & types --- .../pakku/api/models/mr/MrModpackModel.kt | 8 ++--- .../pakku/api/platforms/CurseForge.kt | 10 +++---- .../pakku/api/platforms/GitHub.kt | 2 +- .../pakku/api/platforms/Modrinth.kt | 30 +++++++++++-------- .../pakku/api/platforms/Platform.kt | 4 +-- .../pakku/api/platforms/Provider.kt | 2 +- .../kotlin/teksturepako/pakku/cli/cmd/Add.kt | 8 ++--- .../teksturepako/pakku/cli/cmd/AddPrj.kt | 10 +++---- 8 files changed, 40 insertions(+), 34 deletions(-) diff --git a/src/commonMain/kotlin/teksturepako/pakku/api/models/mr/MrModpackModel.kt b/src/commonMain/kotlin/teksturepako/pakku/api/models/mr/MrModpackModel.kt index 7f7c9812..5334382f 100644 --- a/src/commonMain/kotlin/teksturepako/pakku/api/models/mr/MrModpackModel.kt +++ b/src/commonMain/kotlin/teksturepako/pakku/api/models/mr/MrModpackModel.kt @@ -54,15 +54,15 @@ data class MrModpackModel( runBlocking { debug { println("CurseForge sub-import") } - val slugs = projects.mapNotNull { project -> + val projectToSlugs = projects.mapNotNull { project -> project.slug[Modrinth.serialName]?.let { project to it } } - val cfProjects = slugs.map { slug -> + val cfProjects = projectToSlugs.map { (project, slug) -> async { - CurseForge.requestProjectFromSlug(slug.second)?.apply { + CurseForge.requestProjectFromSlug(slug)?.apply { files += CurseForge.requestFilesForProject( - lockFile.getMcVersions(), lockFile.getLoaders(), this, projectType = slug.first.type + lockFile.getMcVersions(), lockFile.getLoaders(), this, projectType = project.type ) } } diff --git a/src/commonMain/kotlin/teksturepako/pakku/api/platforms/CurseForge.kt b/src/commonMain/kotlin/teksturepako/pakku/api/platforms/CurseForge.kt index 29a8929f..1393070b 100644 --- a/src/commonMain/kotlin/teksturepako/pakku/api/platforms/CurseForge.kt +++ b/src/commonMain/kotlin/teksturepako/pakku/api/platforms/CurseForge.kt @@ -129,7 +129,7 @@ object CurseForge : Platform( } ?: true // If no loaders found, accept model } - internal fun compareByLoaders(loaders: List) = { file: CfModModel.File -> + internal fun compareByLoaders(loaders: List): (CfModModel.File) -> Comparable<*> = { file: CfModModel.File -> val fileLoaders = file.sortableGameVersions.filter { it.gameVersionTypeId == LOADER_VERSION_TYPE_ID } .map { it.gameVersionName.lowercase() } loaders.indexOfFirst { it in fileLoaders }.let { if (it == -1) loaders.size else it } @@ -219,7 +219,7 @@ object CurseForge : Platform( } override suspend fun requestMultipleProjectFiles( - mcVersions: List, loaders: List, projectInfos: Map, ids: List + mcVersions: List, loaders: List, projectIdsToTypes: Map, ids: List ): MutableSet { // Handle mcVersions @@ -240,11 +240,11 @@ object CurseForge : Platform( } override suspend fun requestMultipleProjectsWithFiles( - mcVersions: List, loaders: List, projectInfos: Map, numberOfFiles: Int + mcVersions: List, loaders: List, projectIdsToTypes: Map, numberOfFiles: Int ): MutableSet { val response = json.decodeFromString( - this.requestProjectBody("mods", MultipleProjectsRequest(projectInfos.keys.map(String::toInt))) + this.requestProjectBody("mods", MultipleProjectsRequest(projectIdsToTypes.keys.map(String::toInt))) ?: return mutableSetOf() ).data @@ -252,7 +252,7 @@ object CurseForge : Platform( model.latestFilesIndexes.map { it.fileId.toString() } } - val projectFiles = requestMultipleProjectFiles(mcVersions, loaders, projectInfos, fileIds) + val projectFiles = requestMultipleProjectFiles(mcVersions, loaders, projectIdsToTypes, fileIds) val projects = response.mapNotNull { it.toProject() } projects.assignFiles(projectFiles, this) diff --git a/src/commonMain/kotlin/teksturepako/pakku/api/platforms/GitHub.kt b/src/commonMain/kotlin/teksturepako/pakku/api/platforms/GitHub.kt index a295706f..5ae51921 100644 --- a/src/commonMain/kotlin/teksturepako/pakku/api/platforms/GitHub.kt +++ b/src/commonMain/kotlin/teksturepako/pakku/api/platforms/GitHub.kt @@ -66,7 +66,7 @@ object GitHub : Http(), Provider loaders: List, input: String, fileId: String?, - numberOfFiles: Int , + numberOfFiles: Int, projectType: ProjectType? ): Project? { diff --git a/src/commonMain/kotlin/teksturepako/pakku/api/platforms/Modrinth.kt b/src/commonMain/kotlin/teksturepako/pakku/api/platforms/Modrinth.kt index a18bb91f..147294f1 100644 --- a/src/commonMain/kotlin/teksturepako/pakku/api/platforms/Modrinth.kt +++ b/src/commonMain/kotlin/teksturepako/pakku/api/platforms/Modrinth.kt @@ -144,7 +144,7 @@ object Modrinth : Platform( } ?: true // If no loaders found, accept model } - internal fun compareByLoaders(loaders: List) = if (loaders.size <= 1) + internal fun compareByLoaders(loaders: List): (MrVersionModel) -> Comparable<*> = if (loaders.size <= 1) { { 0 } } @@ -187,7 +187,12 @@ object Modrinth : Platform( mcVersions: List, loaders: List, projectId: String, fileId: String?, projectType: ProjectType? ): MutableSet { - val actualLoaders = projectType?.let { if (it == ProjectType.DATA_PACK) listOf(DATAPACK_LOADER) else null } ?: loaders + val actualLoaders = when (projectType) + { + ProjectType.DATA_PACK -> listOf(DATAPACK_LOADER) + else -> loaders + } + return if (fileId == null) { // Multiple files @@ -213,10 +218,10 @@ object Modrinth : Platform( } override suspend fun requestMultipleProjectFiles( - mcVersions: List, loaders: List, projectInfos: Map, ids: List + mcVersions: List, loaders: List, projectIdsToTypes: Map, ids: List ): MutableSet = coroutineScope { val loadersWithType = - (if (projectInfos.values.any { it == ProjectType.DATA_PACK }) listOf(DATAPACK_LOADER) else listOf()) + loaders + (if (projectIdsToTypes.values.any { it == ProjectType.DATA_PACK }) listOf(DATAPACK_LOADER) else listOf()) + loaders // Chunk requests if there are too many ids; Also do this in parallel return@coroutineScope ids.chunked(1_000).map { list -> async { @@ -233,11 +238,12 @@ object Modrinth : Platform( .sortedWith( compareByDescending { Instant.parse(it.datePublished) } .thenBy { file -> - compareByLoaders(projectInfos[file.projectId]?.let { - if (it == ProjectType.DATA_PACK) listOf( - DATAPACK_LOADER - ) - else null + compareByLoaders(projectIdsToTypes[file.projectId]?.let { + when (it) + { + ProjectType.DATA_PACK -> listOf(DATAPACK_LOADER) + else -> null + } } ?: loaders)(file) }) .flatMap { version -> version.toProjectFiles() } @@ -245,17 +251,17 @@ object Modrinth : Platform( } override suspend fun requestMultipleProjectsWithFiles( - mcVersions: List, loaders: List, projectInfos: Map, numberOfFiles: Int + mcVersions: List, loaders: List, projectIdsToTypes: Map, numberOfFiles: Int ): MutableSet { - val url = encode("projects?ids=${projectInfos.keys.map { "\"$it\"" }}".filterNot { it.isWhitespace() }, allow = "?=") + val url = encode("projects?ids=${projectIdsToTypes.keys.map { "\"$it\"" }}".filterNot { it.isWhitespace() }, allow = "?=") val response = json.decodeFromString>( this.requestProjectBody(url) ?: return mutableSetOf() ) val fileIds = response.flatMap { it.versions } - val projectFiles = requestMultipleProjectFiles(mcVersions, loaders, projectInfos, fileIds) + val projectFiles = requestMultipleProjectFiles(mcVersions, loaders, projectIdsToTypes, fileIds) val projects = response.mapNotNull { it.toProject() } projects.assignFiles(projectFiles, this) diff --git a/src/commonMain/kotlin/teksturepako/pakku/api/platforms/Platform.kt b/src/commonMain/kotlin/teksturepako/pakku/api/platforms/Platform.kt index 5a513c54..baa4f8fe 100644 --- a/src/commonMain/kotlin/teksturepako/pakku/api/platforms/Platform.kt +++ b/src/commonMain/kotlin/teksturepako/pakku/api/platforms/Platform.kt @@ -54,7 +54,7 @@ abstract class Platform( ): MutableSet abstract suspend fun requestMultipleProjectFiles( - mcVersions: List, loaders: List, projectInfos: Map, ids: List + mcVersions: List, loaders: List, projectIdsToTypes: Map, ids: List ): MutableSet @@ -95,7 +95,7 @@ abstract class Platform( } abstract suspend fun requestMultipleProjectsWithFiles( - mcVersions: List, loaders: List, projectInfos: Map, numberOfFiles: Int + mcVersions: List, loaders: List, projectIdsToTypes: Map, numberOfFiles: Int ): MutableSet companion object diff --git a/src/commonMain/kotlin/teksturepako/pakku/api/platforms/Provider.kt b/src/commonMain/kotlin/teksturepako/pakku/api/platforms/Provider.kt index e7e06150..defba31d 100644 --- a/src/commonMain/kotlin/teksturepako/pakku/api/platforms/Provider.kt +++ b/src/commonMain/kotlin/teksturepako/pakku/api/platforms/Provider.kt @@ -28,7 +28,7 @@ interface Provider val siteUrl: String? /** Requests a [project][Project] based on provided [input]. */ - suspend fun requestProject(input: String, projectType: ProjectType?): Project? + suspend fun requestProject(input: String, projectType: ProjectType? = null): Project? /** * Requests project with files for specified combinations of Minecraft versions and mod loaders. diff --git a/src/commonMain/kotlin/teksturepako/pakku/cli/cmd/Add.kt b/src/commonMain/kotlin/teksturepako/pakku/cli/cmd/Add.kt index cad2cd2f..630748cf 100644 --- a/src/commonMain/kotlin/teksturepako/pakku/cli/cmd/Add.kt +++ b/src/commonMain/kotlin/teksturepako/pakku/cli/cmd/Add.kt @@ -40,7 +40,7 @@ class Add : CliktCommand() private val noDepsFlag: Boolean by option("-D", "--no-deps", help = "Ignore resolving dependencies").flag() - private val type: ProjectType? by option( + private val projectTypeOpt: ProjectType? by option( "-t", "--type", help = "Project type of projects to add", @@ -82,7 +82,7 @@ class Add : CliktCommand() { suspend fun handleMissingProject(error: NotFoundOn, arg: ProjectArg) { - val prompt = promptForProject(error.provider, terminal, lockFile, arg.fold({it.fileId}, {it.tag}), type).onFailure { + val prompt = promptForProject(error.provider, terminal, lockFile, arg.fold({it.fileId}, {it.tag}), projectTypeOpt).onFailure { if (it is EmptyArg) return add(projectIn, arg, strict = false) }.getOrElse { return terminal.pError(it) @@ -132,12 +132,12 @@ class Add : CliktCommand() arg.fold( commonArg = { projectProvider.requestProjectWithFiles( - lockFile.getMcVersions(), lockFile.getLoaders(), it.input, it.fileId, projectType = type + lockFile.getMcVersions(), lockFile.getLoaders(), it.input, it.fileId, projectType = projectTypeOpt ) to it }, gitHubArg = { GitHub.requestProjectWithFiles( - listOf(), listOf(), "${it.owner}/${it.repo}", it.tag, projectType = type + listOf(), listOf(), "${it.owner}/${it.repo}", it.tag, projectType = projectTypeOpt ) to it } ) diff --git a/src/commonMain/kotlin/teksturepako/pakku/cli/cmd/AddPrj.kt b/src/commonMain/kotlin/teksturepako/pakku/cli/cmd/AddPrj.kt index 2eea14f2..7d0e1ea1 100644 --- a/src/commonMain/kotlin/teksturepako/pakku/cli/cmd/AddPrj.kt +++ b/src/commonMain/kotlin/teksturepako/pakku/cli/cmd/AddPrj.kt @@ -65,7 +65,7 @@ class AddPrj : CliktCommand("prj") } } - private val type: ProjectType? by option( + private val projectTypeOpt: ProjectType? by option( "-t", "--type", help = "Project type of project to add", @@ -100,7 +100,7 @@ class AddPrj : CliktCommand("prj") { suspend fun handleMissingProject(error: NotFoundOn) { - val prompt = promptForProject(error.provider, terminal, lockFile, projectType = type).onFailure { + val prompt = promptForProject(error.provider, terminal, lockFile, projectType = projectTypeOpt).onFailure { if (it is EmptyArg) return add(projectIn, strict = false) }.getOrElse { return terminal.pError(it) @@ -147,19 +147,19 @@ class AddPrj : CliktCommand("prj") val cf = cfOpt?.let { CurseForge.requestProjectWithFiles( - lockFile.getMcVersions(), lockFile.getLoaders(), it.input, it.fileId, projectType = type + lockFile.getMcVersions(), lockFile.getLoaders(), it.input, it.fileId, projectType = projectTypeOpt ) } val mr = mrOpt?.let { Modrinth.requestProjectWithFiles( - lockFile.getMcVersions(), lockFile.getLoaders(), it.input, it.fileId, projectType = type + lockFile.getMcVersions(), lockFile.getLoaders(), it.input, it.fileId, projectType = projectTypeOpt ) } val gh = ghOpt?.let { GitHub.requestProjectWithFiles( - listOf(), listOf(), "${it.owner}/${it.repo}", it.tag, projectType = type + listOf(), listOf(), "${it.owner}/${it.repo}", it.tag, projectType = projectTypeOpt ) }