Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public SearchResult search(DownloadProvider downloadProvider, String gameVersion

int count = 0;
for (ModTranslations.Mod mod : ModTranslations.getTranslationsByRepositoryType(getType()).searchMod(searchFilter)) {
String englishSearchFilter = String.join(" ", StringUtils.tokenize(StringUtils.isNotBlank(mod.getSubname()) ? mod.getSubname() : mod.getName()));
String englishSearchFilter = String.join(" ", StringUtils.tokenize(StringUtils.isNotBlank(mod.subname()) ? mod.subname() : mod.name()));
if (StringUtils.isNotBlank(englishSearchFilter)) {
englishSearchFiltersSet.add(englishSearchFilter);
}
Expand Down Expand Up @@ -83,7 +83,7 @@ public SearchResult search(DownloadProvider downloadProvider, String gameVersion
}

ModTranslations.Mod chineseTranslation = ModTranslations.getTranslationsByRepositoryType(getType()).getModByCurseForgeId(remoteAddon.slug());
if (chineseTranslation != null && !StringUtils.isBlank(chineseTranslation.getName()) && StringUtils.containsChinese(chineseTranslation.getName())) {
if (chineseTranslation != null && !StringUtils.isBlank(chineseTranslation.name()) && StringUtils.containsChinese(chineseTranslation.name())) {
searchResultArray[chineseIndex++] = remoteAddon;
} else {
searchResultArray[englishIndex--] = remoteAddon;
Expand All @@ -95,10 +95,10 @@ public SearchResult search(DownloadProvider downloadProvider, String gameVersion
StringUtils.LevCalculator levCalculator = new StringUtils.LevCalculator();
return new SearchResult(Stream.concat(Arrays.stream(searchResultArray, 0, chineseIndex).map(remoteMod -> {
ModTranslations.Mod chineseRemoteMod = ModTranslations.getTranslationsByRepositoryType(getType()).getModByCurseForgeId(remoteMod.slug());
if (chineseRemoteMod == null || StringUtils.isBlank(chineseRemoteMod.getName()) || !StringUtils.containsChinese(chineseRemoteMod.getName())) {
if (chineseRemoteMod == null || StringUtils.isBlank(chineseRemoteMod.name()) || !StringUtils.containsChinese(chineseRemoteMod.name())) {
return Pair.pair(remoteMod, Integer.MAX_VALUE);
}
String chineseRemoteModName = chineseRemoteMod.getName();
String chineseRemoteModName = chineseRemoteMod.name();
if (searchFilter.isEmpty() || chineseRemoteModName.isEmpty()) {
return Pair.pair(remoteMod, Math.max(searchFilter.length(), chineseRemoteModName.length()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,7 @@ final class ModInfoDialog extends JFXDialogLayout {
getActions().add(officialPageButton);
}

if (modInfo.getModTranslations() == null || StringUtils.isBlank(modInfo.getModTranslations().getMcmod())) {
if (modInfo.getModTranslations() == null || StringUtils.isBlank(modInfo.getModTranslations().mcmod())) {
JFXHyperlink searchButton = new JFXHyperlink(i18n("mods.mcmod.search"));
searchButton.setOnAction(e -> {
fireEvent(new DialogCloseEvent());
Expand Down Expand Up @@ -576,7 +576,7 @@ protected void updateControl(ModInfoObject dataItem, boolean empty) {

String displayName = modInfo.getName();
if (modTranslations != null && I18n.isUseChinese()) {
String chineseName = modTranslations.getName();
String chineseName = modTranslations.name();
if (StringUtils.containsChinese(chineseName)) {
if (StringUtils.containsEmoji(chineseName)) {
StringBuilder builder = new StringBuilder();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,13 @@ public enum ModTranslations {
MOD("/assets/mod_data.txt") {
@Override
public String getMcmodUrl(Mod mod) {
return String.format("https://www.mcmod.cn/class/%s.html", mod.getMcmod());
return String.format("https://www.mcmod.cn/class/%s.html", mod.mcmod());
}
},
MODPACK("/assets/modpack_data.txt") {
@Override
public String getMcmodUrl(Mod mod) {
return String.format("https://www.mcmod.cn/modpack/%s.html", mod.getMcmod());
return String.format("https://www.mcmod.cn/modpack/%s.html", mod.mcmod());
}
},
EMPTY("") {
Expand Down Expand Up @@ -118,7 +118,7 @@ private static String cleanSubname(String subname) {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(
ModTranslations.class.getResourceAsStream(resourceName), StandardCharsets.UTF_8))) {
return this.mods = reader.lines().filter(line -> !line.startsWith("#")).map(Mod::new).toList();
return this.mods = reader.lines().filter(line -> !line.startsWith("#")).map(Mod::fromLine).toList();
} catch (Exception e) {
LOG.warning("Failed to load " + resourceName, e);
return this.mods = List.of();
Expand All @@ -138,7 +138,7 @@ private static String cleanSubname(String subname) {
List<Mod> mods = getMods();
modIdMap = new HashMap<>(mods.size());
for (Mod mod : mods) {
for (String id : mod.getModIds()) {
for (String id : mod.modIds()) {
if (StringUtils.isNotBlank(id)) {
modIdMap.putIfAbsent(id, mod);
}
Expand All @@ -162,7 +162,7 @@ private static String cleanSubname(String subname) {

List<Mod> mods = getMods();
for (Mod mod : mods) {
String subname = cleanSubname(mod.getSubname());
String subname = cleanSubname(mod.subname());
if (StringUtils.isNotBlank(subname)) {
subnameMap.putIfAbsent(subname, mod);
}
Expand All @@ -185,8 +185,8 @@ private static String cleanSubname(String subname) {
List<Mod> mods = getMods();
curseForgeMap = new HashMap<>(mods.size());
for (Mod mod : mods) {
if (StringUtils.isNotBlank(mod.getCurseforge())) {
curseForgeMap.putIfAbsent(mod.getCurseforge(), mod);
if (StringUtils.isNotBlank(mod.curseforge())) {
curseForgeMap.putIfAbsent(mod.curseforge(), mod);
}
}

Expand All @@ -209,17 +209,17 @@ private static String cleanSubname(String subname) {
keywords = new ArrayList<>();
int maxKeywordLength = -1;
for (Mod mod : mods) {
if (StringUtils.isNotBlank(mod.getName())) {
keywords.add(pair(mod.getName(), mod));
maxKeywordLength = Math.max(maxKeywordLength, mod.getName().length());
if (StringUtils.isNotBlank(mod.name())) {
keywords.add(pair(mod.name(), mod));
maxKeywordLength = Math.max(maxKeywordLength, mod.name().length());
}
if (StringUtils.isNotBlank(mod.getSubname())) {
keywords.add(pair(mod.getSubname(), mod));
maxKeywordLength = Math.max(maxKeywordLength, mod.getSubname().length());
if (StringUtils.isNotBlank(mod.subname())) {
keywords.add(pair(mod.subname(), mod));
maxKeywordLength = Math.max(maxKeywordLength, mod.subname().length());
}
if (StringUtils.isNotBlank(mod.getAbbr())) {
keywords.add(pair(mod.getAbbr(), mod));
maxKeywordLength = Math.max(maxKeywordLength, mod.getAbbr().length());
if (StringUtils.isNotBlank(mod.abbr())) {
keywords.add(pair(mod.abbr(), mod));
maxKeywordLength = Math.max(maxKeywordLength, mod.abbr().length());
}
}

Expand Down Expand Up @@ -250,7 +250,7 @@ public Mod getMod(String id, String subname) {
subname = cleanSubname(subname);
if (StringUtils.isNotBlank(subname)) {
Mod mod = getSubnameMap().get(subname);
if (mod != null && (StringUtils.isBlank(id) || mod.getModIds().contains(id)))
if (mod != null && (StringUtils.isBlank(id) || mod.modIds().contains(id)))
return mod;
}

Expand Down Expand Up @@ -282,35 +282,15 @@ public List<Mod> searchMod(String query) {
.toList();
}

public static final class Mod {
private final String curseforge;
private final String mcmod;
private final List<String> modIds;
private final String name;
private final String subname;
private final String abbr;
public record Mod(String curseforge, String mcmod, List<String> modIds, String name, String subname, String abbr) {

public Mod(String line) {
public static Mod fromLine(String line) {
String[] items = line.split(";", -1);
if (items.length != 6) {
throw new IllegalArgumentException("Illegal mod data line, 6 items expected " + line);
}

curseforge = items[0];
mcmod = items[1];
modIds = List.of(items[2].split(","));
name = items[3];
subname = items[4];
abbr = items[5];
}

public Mod(String curseforge, String mcmod, List<String> modIds, String name, String subname, String abbr) {
this.curseforge = curseforge;
this.mcmod = mcmod;
this.modIds = modIds;
this.name = name;
this.subname = subname;
this.abbr = abbr;
return new Mod(items[0], items[1], List.of(items[2].split(",")), items[3], items[4], items[5]);
}

public String getDisplayName() {
Expand All @@ -324,29 +304,5 @@ public String getDisplayName() {
}
return builder.toString();
}

public String getCurseforge() {
return curseforge;
}

public String getMcmod() {
return mcmod;
}

public List<String> getModIds() {
return modIds;
}

public String getName() {
return name;
}

public String getSubname() {
return subname;
}

public String getAbbr() {
return abbr;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,7 @@ private void search() {
LocalAddonFile.Description description = resourcePack.getDescription();
Stream<String> descriptionParts = description == null
? Stream.empty()
: description.getParts().stream().map(LocalAddonFile.Description.Part::getText);
: description.parts().stream().map(LocalAddonFile.Description.Part::text);
if (predicate.test(resourcePack.getFileNameWithExtension())
|| predicate.test(resourcePack.getFileName())
|| descriptionParts.anyMatch(predicate)) {
Expand Down
41 changes: 10 additions & 31 deletions HMCLCore/src/main/java/org/jackhuang/hmcl/addon/LocalAddonFile.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@
import org.jackhuang.hmcl.download.DownloadProvider;
import org.jackhuang.hmcl.util.StringUtils;
import org.jackhuang.hmcl.util.io.FileUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/// Sub-classes should implement `Comparable`
Expand Down Expand Up @@ -63,26 +63,16 @@ public record AddonUpdate(
) {
}

public static class Description {
private final List<LocalAddonFile.Description.Part> parts;
public record Description(List<Part> parts) {

public Description(String text) {
this.parts = new ArrayList<>();
this.parts.add(new LocalAddonFile.Description.Part(text, "black"));
}

public Description(List<LocalAddonFile.Description.Part> parts) {
this.parts = parts;
}

public List<LocalAddonFile.Description.Part> getParts() {
return parts;
this(new ArrayList<>(List.of(new Part(text, "black"))));
}

@Override
public String toString() {
public @NotNull String toString() {
StringBuilder builder = new StringBuilder();
for (LocalAddonFile.Description.Part part : parts) {
for (Part part : parts) {
builder.append(part.text);
}
return builder.toString();
Expand All @@ -92,25 +82,14 @@ public String toStringSingleLine() {
return toString().lines().map(String::trim).filter(StringUtils::isNotBlank).collect(Collectors.joining(" | "));
}

public static class Part {
private final String text;
private final String color;

public Part(String text) {
this(text, "");
}

public Part(String text, String color) {
this.text = Objects.requireNonNull(text);
this.color = Objects.requireNonNull(color);
}
public record Part(String text, String color) {

public String getText() {
return text;
public Part {
if (text == null || color == null) throw new NullPointerException();
}

public String getColor() {
return color;
public Part(String text) {
this(text, "");
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,35 +19,21 @@

import org.jackhuang.hmcl.util.Immutable;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
*
* @author huangyuhui
*/
@Immutable
public final class LibrariesDownloadInfo {
public record LibrariesDownloadInfo(LibraryDownloadInfo artifact, Map<String, LibraryDownloadInfo> classifiers) {

private final LibraryDownloadInfo artifact;
private final Map<String, LibraryDownloadInfo> classifiers;
public LibrariesDownloadInfo {
classifiers = classifiers == null ? Map.of() : Map.copyOf(classifiers);
}

public LibrariesDownloadInfo(LibraryDownloadInfo artifact) {
this(artifact, null);
}

public LibrariesDownloadInfo(LibraryDownloadInfo artifact, Map<String, LibraryDownloadInfo> classifiers) {
this.artifact = artifact;
this.classifiers = classifiers == null ? null : new HashMap<>(classifiers);
}

public LibraryDownloadInfo getArtifact() {
return artifact;
}

public Map<String, LibraryDownloadInfo> getClassifiers() {
return classifiers == null ? Collections.emptyMap() : Collections.unmodifiableMap(classifiers);
}

}
10 changes: 5 additions & 5 deletions HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java
Original file line number Diff line number Diff line change
Expand Up @@ -134,9 +134,9 @@ public String getClassifier() {
return nd.replace("${arch}", Architecture.SYSTEM_ARCH.getBits().getBit());
}
}
} else if (downloads != null && downloads.getClassifiers() != null) {
} else if (downloads != null && downloads.classifiers() != null) {
for (String nativeDescriptor : POSSIBLE_NATIVE_DESCRIPTORS) {
LibraryDownloadInfo info = downloads.getClassifiers().get(nativeDescriptor);
LibraryDownloadInfo info = downloads.classifiers().get(nativeDescriptor);
if (info != null) {
return nativeDescriptor;
}
Expand Down Expand Up @@ -165,15 +165,15 @@ public boolean isNative() {
return true;
}

return downloads != null && downloads.getClassifiers().keySet().stream().anyMatch(s -> s.startsWith("native"));
return downloads != null && downloads.classifiers().keySet().stream().anyMatch(s -> s.startsWith("native"));
}

public LibraryDownloadInfo getRawDownloadInfo() {
if (downloads != null) {
if (isNative())
return downloads.getClassifiers().get(getClassifier());
return downloads.classifiers().get(getClassifier());
else
return downloads.getArtifact();
return downloads.artifact();
} else {
return null;
}
Expand Down