Added Minecraft Service

Added PagedList
This commit is contained in:
2022-06-18 11:01:28 +08:00
parent 0558bbfd07
commit 75bea8e6ce
3 changed files with 154 additions and 1 deletions

View File

@ -158,7 +158,7 @@ class CurseforgeApi(apiKey: String) {
parameter("sortField", sortField)
parameter("sortOrder", when(sortOrder){
ASC -> "asc"
DESC -> "asc"
DESC -> "desc"
null -> null
})
parameter("modLoaderType", modLoaderType)

View File

@ -0,0 +1,113 @@
package top.jie65535.jcf
import top.jie65535.jcf.model.file.File
import top.jie65535.jcf.model.mod.Mod
import top.jie65535.jcf.model.request.ModsSearchSortField
import top.jie65535.jcf.model.request.SortOrder
import top.jie65535.jcf.util.PagedList
class MinecraftService(apiKey: String) {
companion object {
private const val GAME_ID_MINECRAFT = 432
private const val CLASS_ID_WORLDS = 17
private const val CLASS_ID_BUKKIT_PLUGINS = 5
private const val CLASS_ID_CUSTOMIZATION = 4546
private const val CLASS_ID_MODPACKS = 4471
private const val CLASS_ID_RESOURCE_PACKS = 12
private const val CLASS_ID_ADDONS = 4559
private const val CLASS_ID_MODS = 6
private const val DEFAULT_PAGE_SIZE = 20
private val DEFAULT_SORT_FIELD = ModsSearchSortField.Popularity
}
/**
* api客户端实例
*/
private val api = CurseforgeApi(apiKey)
/**
* 搜索存档
*/
suspend fun searchWords(filter: String): PagedList<Mod> =
doSearch(CLASS_ID_WORLDS, filter)
/**
* 搜索资源包材质包光影之类的
*/
suspend fun searchResourcePacks(filter: String): PagedList<Mod> =
doSearch(CLASS_ID_RESOURCE_PACKS, filter)
/**
* 搜索整合包
*/
suspend fun searchModPacks(filter: String): PagedList<Mod> =
doSearch(CLASS_ID_MODPACKS, filter)
/**
* 搜索mod
*/
suspend fun searchMods(filter: String): PagedList<Mod> =
doSearch(CLASS_ID_MODS, filter)
/**
* 根据分类与过滤器进行搜索返回分页的列表
* @param classId 类别ID
* @param filter 过滤器
* @return 模组分页列表
*/
private suspend fun doSearch(classId: Int, filter: String): PagedList<Mod> =
PagedList(DEFAULT_PAGE_SIZE) { index ->
val response = api.searchMods(
GAME_ID_MINECRAFT,
classId,
searchFilter = filter,
sortField = DEFAULT_SORT_FIELD,
sortOrder = SortOrder.DESC,
index = index,
pageSize = DEFAULT_PAGE_SIZE
)
response.data
}
/**
* 根据模组ID获取指定模组
*/
suspend fun getMod(modId: Int) = api.getMod(modId)
/**
* 根据模组Id列表获取指定模组列表
*/
suspend fun getMods(modIds: IntArray) = api.getMods(modIds)
/**
* 获取指定模组文件
*/
suspend fun getModFile(modId: Int, fileId: Int) = api.getModFile(modId, fileId)
/**
* 获取模组文件列表返回分页的列表
* @return 分页的列表
*/
suspend fun getModFiles(modId: Int): PagedList<File> =
PagedList(DEFAULT_PAGE_SIZE) { index ->
val response = api.getModFiles(
modId,
index = index,
pageSize = DEFAULT_PAGE_SIZE
)
response.data
}
/**
* 获取文件更改日志结果为HTML文本
* @return Changelog HTML
*/
suspend fun getModFileChangelog(modId: Int, fileId: Int) =
api.getModFileChangelog(modId, fileId)
/**
* 获取文件下载地址
*/
suspend fun getModFileDownloadURL(modId: Int, fileId: Int) =
api.getModFileDownloadURL(modId, fileId)
}

View File

@ -0,0 +1,40 @@
package top.jie65535.jcf.util
/**
* 分页的列表
* @param getPageData 搜索新数据方法
*/
class PagedList<T>(
private val pageSize: Int,
private val getPageData: suspend (pageIndex: Int) -> Array<T>
) {
private val pages = mutableListOf<Array<T>>()
private var pageIndex = 0
private var hasNext = false
fun getHasNext() = hasNext
suspend fun prev(): Array<T> {
if (pageIndex > 0) {
pageIndex--
}
return current()
}
suspend fun next(): Array<T> {
if (hasNext) {
pageIndex++
}
return current()
}
suspend fun current(): Array<T> {
return if (pageIndex < pages.size) {
pages[pageIndex]
} else {
val data = getPageData(pageIndex)
hasNext = data.size == pageSize
pages.add(data)
data
}
}
}