Skip to content

Commit 600419c

Browse files
committed
fix: 过滤掉不公开可见的远端项目
1 parent 4ee7bef commit 600419c

6 files changed

Lines changed: 39 additions & 9 deletions

File tree

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/download/assets/platform/curseforge/CurseForgeSearchResult.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.movtery.zalithlauncher.game.download.assets.platform.PlatformClasses
2222
import com.movtery.zalithlauncher.game.download.assets.platform.PlatformSearchResult
2323
import com.movtery.zalithlauncher.game.download.assets.platform.curseforge.models.CurseForgeData
2424
import com.movtery.zalithlauncher.game.download.assets.platform.curseforge.models.CurseForgePagination
25+
import com.movtery.zalithlauncher.game.download.assets.platform.curseforge.models.isApproved
2526
import com.movtery.zalithlauncher.game.download.assets.platform.searchRankWithChineseBias
2627
import com.movtery.zalithlauncher.game.download.assets.utils.getTranslations
2728
import com.movtery.zalithlauncher.ui.screens.content.download.assets.elements.AssetsPage
@@ -34,17 +35,18 @@ class CurseForgeSearchResult(
3435
* 响应数据
3536
*/
3637
@SerialName("data")
37-
val data: Array<CurseForgeData>,
38+
private val data: Array<CurseForgeData>,
3839

3940
/**
4041
* 响应分页信息
4142
*/
4243
@SerialName("pagination")
43-
val pagination: CurseForgePagination
44+
private val pagination: CurseForgePagination
4445
): PlatformSearchResult {
4546
override fun getAssetsPage(classes: PlatformClasses): AssetsPage {
46-
val mcmodData = data.map {
47-
it to classes.getTranslations().getModBySlugId(it.slug)
47+
val mcmodData = data.mapNotNull { data0 ->
48+
if (!data0.isApproved()) return@mapNotNull null
49+
data0 to classes.getTranslations().getModBySlugId(data0.slug)
4850
}
4951
val pageSize = pagination.pageSize
5052
val isLastPage = pagination.resultCount < pageSize ||
@@ -63,7 +65,7 @@ class CurseForgeSearchResult(
6365
searchFilter: String,
6466
classes: PlatformClasses
6567
): PlatformSearchResult {
66-
val newData = data.toList()
68+
val newData = data.filter { it.isApproved() }
6769
.searchRankWithChineseBias(searchFilter, classes) { it.slug }
6870
.toTypedArray()
6971
return CurseForgeSearchResult(newData, pagination)

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/download/assets/platform/curseforge/CurseForgeSearcher.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@ import com.movtery.zalithlauncher.game.download.assets.platform.curseforge.model
2828
import com.movtery.zalithlauncher.game.download.assets.platform.curseforge.models.CurseForgeProject
2929
import com.movtery.zalithlauncher.game.download.assets.platform.curseforge.models.CurseForgeVersion
3030
import com.movtery.zalithlauncher.game.download.assets.platform.curseforge.models.CurseForgeVersions
31+
import com.movtery.zalithlauncher.game.download.assets.platform.curseforge.models.isApproved
3132
import com.movtery.zalithlauncher.utils.file.MurmurHash2Incremental
3233
import com.movtery.zalithlauncher.utils.network.httpGetJson
3334
import com.movtery.zalithlauncher.utils.network.httpPostJson
3435
import io.ktor.http.Parameters
36+
import io.ktor.server.plugins.NotFoundException
3537
import kotlinx.coroutines.async
3638
import kotlinx.coroutines.coroutineScope
3739
import kotlinx.coroutines.sync.Semaphore
@@ -62,10 +64,12 @@ class CurseForgeSearcher(
6264
}
6365

6466
override suspend fun getProject(projectID: String): CurseForgeProject {
65-
return httpGetJson(
67+
val project = httpGetJson<CurseForgeProject>(
6668
url = "$api/mods/$projectID",
6769
headers = listOf("x-api-key" to apiKey)
6870
)
71+
if (!project.isApproved()) throw NotFoundException("The project {$projectID} is not in a publicly available state.")
72+
return project
6973
}
7074

7175
/**

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/download/assets/platform/curseforge/models/CurseForgeData.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,4 +353,9 @@ class CurseForgeData(
353353
}.toSet().takeIf { it.isNotEmpty() }
354354
?.sortedWith { o1, o2 -> o1.index() - o2.index() }
355355
}
356-
}
356+
}
357+
358+
/**
359+
* @return 该模组是否可见
360+
*/
361+
fun CurseForgeData.isApproved(): Boolean = this.status == 4

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/download/assets/platform/curseforge/models/CurseForgeProject.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,9 @@ class CurseForgeProject(
8686
)
8787
}
8888
}
89-
}
89+
}
90+
91+
/**
92+
* @return 该项目是否可见
93+
*/
94+
fun CurseForgeProject.isApproved(): Boolean = this.data.isApproved()

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/download/assets/platform/modrinth/ModrinthSearcher.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ import com.movtery.zalithlauncher.game.download.assets.platform.PlatformClasses
2424
import com.movtery.zalithlauncher.game.download.assets.platform.PlatformSearchFilter
2525
import com.movtery.zalithlauncher.game.download.assets.platform.modrinth.models.ModrinthSingleProject
2626
import com.movtery.zalithlauncher.game.download.assets.platform.modrinth.models.ModrinthVersion
27+
import com.movtery.zalithlauncher.game.download.assets.platform.modrinth.models.isPublic
2728
import com.movtery.zalithlauncher.utils.network.httpGetJson
2829
import io.ktor.client.plugins.ClientRequestException
2930
import io.ktor.http.Parameters
31+
import io.ktor.server.plugins.NotFoundException
3032
import java.io.File
3133

3234
class ModrinthSearcher(
@@ -51,9 +53,11 @@ class ModrinthSearcher(
5153
}
5254

5355
override suspend fun getProject(projectID: String): ModrinthSingleProject {
54-
return httpGetJson(
56+
val project = httpGetJson<ModrinthSingleProject>(
5557
url = "$api/project/$projectID"
5658
)
59+
if (!project.isPublic()) throw NotFoundException("The project {$projectID} is not in a publicly available state.")
60+
return project
5761
}
5862

5963
/**

ZalithLauncher/src/main/java/com/movtery/zalithlauncher/game/download/assets/platform/modrinth/models/ModrinthSingleProject.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,4 +304,14 @@ class ModrinthSingleProject(
304304
)
305305
}
306306
}
307+
}
308+
309+
/**
310+
* @return 该项目是否公开可见
311+
*/
312+
fun ModrinthSingleProject.isPublic(): Boolean {
313+
return when (this.status) {
314+
"approved", "archived" -> true
315+
else -> false
316+
}
307317
}

0 commit comments

Comments
 (0)