Skip to content

Commit 17d9e9a

Browse files
committed
update
# Conflicts: # HMCL/src/main/java/org/jackhuang/hmcl/game/LocalizedRemoteModRepository.java # HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadListPage.java # HMCLCore/src/main/java/org/jackhuang/hmcl/mod/RemoteModRepository.java # HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java # HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java
1 parent 5b14144 commit 17d9e9a

File tree

8 files changed

+95
-24
lines changed

8 files changed

+95
-24
lines changed

HMCL/src/main/java/org/jackhuang/hmcl/game/LocalizedRemoteModRepository.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ public abstract class LocalizedRemoteModRepository implements RemoteModRepositor
4242
protected abstract SortType getBackedRemoteModRepositorySortOrder();
4343

4444
@Override
45-
public SearchResult search(DownloadProvider downloadProvider, String gameVersion, Category category, int pageOffset, int pageSize, String searchFilter, SortType sort, SortOrder sortOrder) throws IOException {
45+
public SearchResult search(DownloadProvider downloadProvider, String gameVersion, Category category, int pageOffset, int pageSize, String searchFilter, SortType sort, SortOrder sortOrder, LoaderType loaderType) throws IOException {
4646
if (!StringUtils.containsChinese(searchFilter)) {
47-
return getBackedRemoteModRepository().search(downloadProvider, gameVersion, category, pageOffset, pageSize, searchFilter, sort, sortOrder);
47+
return getBackedRemoteModRepository().search(downloadProvider, gameVersion, category, pageOffset, pageSize, searchFilter, sort, sortOrder, loaderType);
4848
}
4949

5050
Set<String> englishSearchFiltersSet = new HashSet<>(INITIAL_CAPACITY);
@@ -66,7 +66,7 @@ public SearchResult search(DownloadProvider downloadProvider, String gameVersion
6666
RemoteMod[] searchResultArray = new RemoteMod[pageSize];
6767
int totalPages, chineseIndex = 0, englishIndex = pageSize - 1;
6868
{
69-
SearchResult searchResult = getBackedRemoteModRepository().search(downloadProvider, gameVersion, category, pageOffset, pageSize, String.join(" ", englishSearchFiltersSet), getBackedRemoteModRepositorySortOrder(), sortOrder);
69+
SearchResult searchResult = getBackedRemoteModRepository().search(downloadProvider, gameVersion, category, pageOffset, pageSize, String.join(" ", englishSearchFiltersSet), getBackedRemoteModRepositorySortOrder(), sortOrder, loaderType);
7070
for (Iterator<RemoteMod> iterator = searchResult.getUnsortedResults().iterator(); iterator.hasNext(); ) {
7171
if (chineseIndex > englishIndex) {
7272
LOG.warning("Too many search results! Are the backed remote mod repository broken? Or are the API broken?");

HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadListPage.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public void loadVersion(Profile profile, String version) {
119119

120120
if (!searchInitialized) {
121121
searchInitialized = true;
122-
search("", null, 0, "", RemoteModRepository.SortType.POPULARITY);
122+
search("", null, 0, "", RemoteModRepository.SortType.POPULARITY, RemoteModRepository.LoaderType.ALL);
123123
}
124124

125125
if (versionSelection) {
@@ -158,7 +158,7 @@ public void selectVersion(String versionID) {
158158
FXUtils.runInFX(() -> selectedVersion.set(versionID));
159159
}
160160

161-
private void search(String userGameVersion, RemoteModRepository.Category category, int pageOffset, String searchFilter, RemoteModRepository.SortType sort) {
161+
private void search(String userGameVersion, RemoteModRepository.Category category, int pageOffset, String searchFilter, RemoteModRepository.SortType sort, RemoteModRepository.LoaderType loader) {
162162
retrySearch = null;
163163
setLoading(true);
164164
setFailed(false);
@@ -174,7 +174,7 @@ private void search(String userGameVersion, RemoteModRepository.Category categor
174174
: "";
175175
}
176176
}).thenApplyAsync(
177-
gameVersion -> repository.search(downloadProvider, gameVersion, category, pageOffset, 50, searchFilter, sort, RemoteModRepository.SortOrder.DESC)
177+
gameVersion -> repository.search(downloadProvider, gameVersion, category, pageOffset, 50, searchFilter, sort, RemoteModRepository.SortOrder.DESC, loader)
178178
).whenComplete(Schedulers.javafx(), (result, exception) -> {
179179
if (searchID != currentSearchID) {
180180
return;
@@ -188,7 +188,7 @@ private void search(String userGameVersion, RemoteModRepository.Category categor
188188
} else {
189189
failed.set(true);
190190
pageCount.set(-1);
191-
retrySearch = () -> search(userGameVersion, category, pageOffset, searchFilter, sort);
191+
retrySearch = () -> search(userGameVersion, category, pageOffset, searchFilter, sort, loader);
192192
}
193193
}).executor(true);
194194
}
@@ -361,6 +361,16 @@ protected ModDownloadListPageSkin(DownloadListPage control) {
361361
sortComboBox.getSelectionModel().select(0);
362362
searchPane.addRow(rowIndex++, new Label(i18n("mods.category")), categoryStackPane, new Label(i18n("search.sort")), sortStackPane);
363363

364+
StackPane loaderStackPane = new StackPane();
365+
JFXComboBox<RemoteModRepository.LoaderType> loaderComboBox = new JFXComboBox<>();
366+
loaderStackPane.getChildren().setAll(loaderComboBox);
367+
loaderComboBox.prefWidthProperty().bind(loaderStackPane.widthProperty());
368+
loaderComboBox.getStyleClass().add("fit-width");
369+
loaderComboBox.setConverter(stringConverter(loaderType -> i18n("mods.loader." + loaderType.name().toLowerCase(Locale.ROOT))));
370+
loaderComboBox.getItems().setAll(RemoteModRepository.LoaderType.values());
371+
loaderComboBox.getSelectionModel().select(0);
372+
searchPane.addRow(rowIndex++, new Label(i18n("mods.loader")), loaderStackPane);
373+
364374
IntegerProperty filterID = new SimpleIntegerProperty(this, "Filter ID", 0);
365375
IntegerProperty currentFilterID = new SimpleIntegerProperty(this, "Current Filter ID", -1);
366376
EventHandler<ActionEvent> searchAction = e -> {
@@ -376,7 +386,8 @@ protected ModDownloadListPageSkin(DownloadListPage control) {
376386
.orElse(null),
377387
pageOffset == -1 ? 0 : pageOffset,
378388
nameField.getText(),
379-
sortComboBox.getSelectionModel().getSelectedItem());
389+
sortComboBox.getSelectionModel().getSelectedItem(),
390+
loaderComboBox.getSelectionModel().getSelectedItem());
380391
};
381392

382393
control.listenerHolder.add(FXUtils.observeWeak(
@@ -386,7 +397,8 @@ protected ModDownloadListPageSkin(DownloadListPage control) {
386397
gameVersionField.getSelectionModel().selectedItemProperty(),
387398
categoryComboBox.getSelectionModel().selectedItemProperty(),
388399
nameField.textProperty(),
389-
sortComboBox.getSelectionModel().selectedItemProperty()
400+
sortComboBox.getSelectionModel().selectedItemProperty(),
401+
loaderComboBox.getSelectionModel().selectedItemProperty()
390402
));
391403

392404
HBox actionsBox = new HBox(8);
@@ -493,6 +505,7 @@ protected ModDownloadListPageSkin(DownloadListPage control) {
493505
gameVersionField.setOnAction(searchAction);
494506
categoryComboBox.setOnAction(searchAction);
495507
sortComboBox.setOnAction(searchAction);
508+
loaderComboBox.setOnAction(searchAction);
496509
}
497510

498511
SpinnerPane spinnerPane = new SpinnerPane();

HMCL/src/main/resources/assets/lang/I18N.properties

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,6 +1092,12 @@ mods.url=Official Page
10921092
mods.update_modpack_mod.warning=Updating mods in a modpack can lead to irreparable results, possibly corrupting the modpack so that it cannot launch. Are you sure you want to update?
10931093
mods.install=Install
10941094
mods.save_as=Save As
1095+
mods.loader=Loader
1096+
mods.loader.all=All
1097+
mods.loader.fabric=Fabric
1098+
mods.loader.forge=Forge
1099+
mods.loader.neoforge=NeoForge
1100+
mods.loader.quilt=Quilt
10951101

10961102
nbt.entries=%s entries
10971103
nbt.open.failed=Failed to open file

HMCL/src/main/resources/assets/lang/I18N_zh.properties

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,12 @@ mods.url=官方頁面
889889
mods.update_modpack_mod.warning=更新模組包中的模組可能導致模組包損壞,使模組包無法正常啟動。該操作不可逆,確定要更新嗎?
890890
mods.install=安裝到目前實例
891891
mods.save_as=下載到本機目錄
892+
mods.loader=加載器
893+
mods.loader.all=全部
894+
mods.loader.fabric=Fabric
895+
mods.loader.forge=Forge
896+
mods.loader.neoforge=NeoForge
897+
mods.loader.quilt=Quilt
892898

893899
nbt.entries=%s 個條目
894900
nbt.open.failed=開啟檔案失敗

HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,12 @@ mods.url=官方页面
899899
mods.update_modpack_mod.warning=更新整合包中的模组可能导致整合包损坏,使整合包无法正常启动。该操作不可逆,确定要更新吗?
900900
mods.install=安装到当前实例
901901
mods.save_as=下载到本地文件夹
902+
mods.loader=加载器
903+
mods.loader.all=全部
904+
mods.loader.fabric=Fabric
905+
mods.loader.forge=Forge
906+
mods.loader.neoforge=NeoForge
907+
mods.loader.quilt=Quilt
902908

903909
nbt.entries=%s 个条目
904910
nbt.open.failed=打开文件失败

HMCLCore/src/main/java/org/jackhuang/hmcl/mod/RemoteModRepository.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ enum SortType {
4747
TOTAL_DOWNLOADS
4848
}
4949

50+
enum LoaderType {
51+
ALL,
52+
FORGE,
53+
NEOFORGE,
54+
FABRIC,
55+
QUILT
56+
}
57+
5058
enum SortOrder {
5159
ASC,
5260
DESC
@@ -84,8 +92,7 @@ public int getTotalPages() {
8492
}
8593
}
8694

87-
SearchResult search(DownloadProvider downloadProvider, String gameVersion, @Nullable Category category, int pageOffset, int pageSize, String searchFilter, SortType sortType, SortOrder sortOrder)
88-
throws IOException;
95+
SearchResult search(DownloadProvider downloadProvider, String gameVersion, @Nullable Category category, int pageOffset, int pageSize, String searchFilter, SortType sortType, SortOrder sortOrder, LoaderType loaderType) throws IOException;
8996

9097
Optional<RemoteMod.Version> getRemoteVersionByLocalFile(LocalModFile localModFile, Path file) throws IOException;
9198

HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,22 @@ private int toModsSearchSortField(SortType sort) {
9393
}
9494
}
9595

96+
private int toModsSearchModloaderField(LoaderType sort) {
97+
https://docs.curseforge.com/rest-api/#tocS_MinecraftModLoaderIndex
98+
switch (sort) {
99+
case FORGE:
100+
return 1;
101+
case FABRIC:
102+
return 4;
103+
case QUILT:
104+
return 5;
105+
case NEOFORGE:
106+
return 6;
107+
default:
108+
return 0;
109+
}
110+
}
111+
96112
private String toSortOrder(SortOrder sortOrder) {
97113
// https://docs.curseforge.com/#tocS_SortOrder
98114
switch (sortOrder) {
@@ -109,21 +125,28 @@ private int calculateTotalPages(Response<List<CurseAddon>> response, int pageSiz
109125
}
110126

111127
@Override
112-
public SearchResult search(DownloadProvider downloadProvider, String gameVersion, @Nullable RemoteModRepository.Category category, int pageOffset, int pageSize, String searchFilter, SortType sortType, SortOrder sortOrder) throws IOException {
128+
public SearchResult search(DownloadProvider downloadProvider, String gameVersion, @Nullable RemoteModRepository.Category category, int pageOffset, int pageSize, String searchFilter, SortType sortType, SortOrder sortOrder, LoaderType loaderType) throws IOException {
113129
int categoryId = 0;
114130
if (category != null && category.getSelf() instanceof CurseAddon.Category) {
115131
categoryId = ((CurseAddon.Category) category.getSelf()).getId();
116132
}
117-
Response<List<CurseAddon>> response = withApiKey(HttpRequest.GET(downloadProvider.injectURL(NetworkUtils.withQuery(PREFIX + "/v1/mods/search", mapOf(
118-
pair("gameId", "432"),
119-
pair("classId", Integer.toString(section)),
120-
pair("categoryId", Integer.toString(categoryId)),
121-
pair("gameVersion", gameVersion),
122-
pair("searchFilter", searchFilter),
123-
pair("sortField", Integer.toString(toModsSearchSortField(sortType))),
124-
pair("sortOrder", toSortOrder(sortOrder)),
125-
pair("index", Integer.toString(pageOffset * pageSize)),
126-
pair("pageSize", Integer.toString(pageSize)))))))
133+
134+
Map<String,String> params = new HashMap<>(Map.of(
135+
"gameId", "432",
136+
"classId",Integer.toString(section),
137+
"categoryId",Integer.toString(categoryId),
138+
"gameVersion", gameVersion,
139+
"searchFilter", searchFilter,
140+
"sortField", Integer.toString(toModsSearchSortField(sortType)),
141+
"sortOrder", toSortOrder(sortOrder),
142+
"index", Integer.toString(pageOffset * pageSize),
143+
"pageSize", Integer.toString(pageSize)));
144+
145+
if (loaderType != LoaderType.ALL) {
146+
params.put("modLoaderTypes", String.format("[%s]", toModsSearchModloaderField(loaderType)));
147+
}
148+
149+
Response<List<CurseAddon>> response = withApiKey(HttpRequest.GET(downloadProvider.injectURL(NetworkUtils.withQuery(PREFIX + "/v1/mods/search", params))))
127150
.getJson(Response.typeOf(listTypeOf(CurseAddon.class)));
128151
if (searchFilter.isEmpty()) {
129152
return new SearchResult(response.getData().stream().map(CurseAddon::toMod), calculateTotalPages(response, pageSize));

HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,25 @@ private static String convertSortType(SortType sortType) {
8080
}
8181

8282
@Override
83-
public SearchResult search(DownloadProvider downloadProvider, String gameVersion, @Nullable RemoteModRepository.Category category, int pageOffset, int pageSize, String searchFilter, SortType sort, SortOrder sortOrder) throws IOException {
83+
public SearchResult search(DownloadProvider downloadProvider, String gameVersion, @Nullable RemoteModRepository.Category category, int pageOffset, int pageSize, String searchFilter, SortType sort, SortOrder sortOrder, LoaderType loaderType) throws IOException {
8484
List<List<String>> facets = new ArrayList<>();
8585
facets.add(Collections.singletonList("project_type:" + projectType));
8686
if (StringUtils.isNotBlank(gameVersion)) {
8787
facets.add(Collections.singletonList("versions:" + gameVersion));
8888
}
89+
List<String> categorys = new ArrayList<>();
90+
8991
if (category != null && StringUtils.isNotBlank(category.getId())) {
90-
facets.add(Collections.singletonList("categories:" + category.getId()));
92+
categorys.add(category.getId());
93+
}
94+
if (loaderType != null && loaderType != LoaderType.ALL) {
95+
categorys.add(loaderType.name());
9196
}
97+
98+
if (!categorys.isEmpty()) {
99+
facets.add(Collections.singletonList("categories:" + String.join(",", categorys)));
100+
}
101+
92102
Map<String, String> query = mapOf(
93103
pair("query", searchFilter),
94104
pair("facets", JsonUtils.UGLY_GSON.toJson(facets)),

0 commit comments

Comments
 (0)