diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaMetadata.java b/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaMetadata.java index edd24ac35..c2bcec77a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaMetadata.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaMetadata.java @@ -26,6 +26,7 @@ import org.jackhuang.hmcl.terracotta.provider.MacOSProvider; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.i18n.LocalizedText; import org.jackhuang.hmcl.util.io.FileUtils; +import org.jackhuang.hmcl.util.io.NetworkUtils; import org.jackhuang.hmcl.util.platform.Architecture; import org.jackhuang.hmcl.util.platform.OSVersion; import org.jackhuang.hmcl.util.platform.OperatingSystem; @@ -57,7 +58,6 @@ public final class TerracottaMetadata { @SerializedName("version_legacy") String legacy, @SerializedName("version_recent") List recent, @SerializedName("version_latest") String latest, - @SerializedName("feedback_url") String feedbackURL, @SerializedName("classifiers") Map classifiers, @SerializedName("downloads") List downloads, @@ -88,7 +88,10 @@ public final class TerracottaMetadata { public static final ITerracottaProvider PROVIDER; public static final String PACKAGE_NAME; public static final List PACKAGE_LINKS; - public static final String FEEDBACK_LINK; + public static final String FEEDBACK_LINK = NetworkUtils.withQuery("https://docs.hmcl.net/multiplayer/feedback.html", Map.of( + "v", "v1", + "launcher_version", Metadata.VERSION + )); private static final Pattern LEGACY; private static final List RECENT; @@ -105,7 +108,6 @@ public final class TerracottaMetadata { LEGACY = Pattern.compile(config.legacy); RECENT = config.recent; LATEST = config.latest; - FEEDBACK_LINK = config.feedbackURL; ProviderContext context = locateProvider(config); PROVIDER = context != null ? context.provider() : null; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaControllerPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaControllerPage.java index e70c7c4ac..04865585c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaControllerPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaControllerPage.java @@ -83,6 +83,7 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.concurrent.ThreadLocalRandom; import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.setting.ConfigHolder.globalConfig; @@ -284,7 +285,18 @@ public class TerracottaControllerPage extends StackPane { }); }); - nodesProperty.setAll(flow, host, guest); + if (ThreadLocalRandom.current().nextDouble() < 0.02D) { + LineButton feedback = LineButton.of(); + feedback.setLeftIcon(SVG.FEEDBACK); + feedback.setTitle(i18n("terracotta.feedback.title")); + feedback.setSubtitle(i18n("terracotta.feedback.desc")); + feedback.setRightIcon(SVG.OPEN_IN_NEW); + FXUtils.onClicked(feedback, () -> FXUtils.openLink(TerracottaMetadata.FEEDBACK_LINK)); + + nodesProperty.setAll(flow, host, guest, feedback); + } else { + nodesProperty.setAll(flow, host, guest); + } } else if (state instanceof TerracottaState.HostScanning) { statusProperty.set(i18n("terracotta.status.scanning")); progressProperty.set(-1); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaPage.java index 6a0fbae74..392cef640 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/terracotta/TerracottaPage.java @@ -20,6 +20,7 @@ package org.jackhuang.hmcl.ui.terracotta; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.property.ReadOnlyObjectWrapper; import org.jackhuang.hmcl.Metadata; +import org.jackhuang.hmcl.terracotta.TerracottaMetadata; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.ui.animation.ContainerAnimations; @@ -52,6 +53,12 @@ public class TerracottaPage extends DecoratorAnimatedPage implements DecoratorPa transitionPane.setContent(newValue.getNode(), ContainerAnimations.FADE); }); + AdvancedListItem feedback = new AdvancedListItem(); + feedback.setLeftGraphic(wrap(SVG.FEEDBACK)); + feedback.setActionButtonVisible(false); + feedback.setTitle(i18n("terracotta.feedback.title")); + feedback.setOnAction(e -> FXUtils.openLink(TerracottaMetadata.FEEDBACK_LINK)); + AdvancedListItem chatItem = new AdvancedListItem(); chatItem.setLeftGraphic(wrap(SVG.CHAT)); chatItem.setActionButtonVisible(false); @@ -67,6 +74,7 @@ public class TerracottaPage extends DecoratorAnimatedPage implements DecoratorPa AdvancedListBox sideBar = new AdvancedListBox() .addNavigationDrawerTab(tab, statusPage, i18n("terracotta.status"), SVG.TUNE) .startCategory(i18n("help").toUpperCase(Locale.ROOT)) + .add(feedback) .add(chatItem) .add(easytierItem); FXUtils.setLimitWidth(sideBar, 200); diff --git a/HMCL/src/main/resources/assets/terracotta.json b/HMCL/src/main/resources/assets/terracotta.json index 2d60870e3..77c46af6a 100644 --- a/HMCL/src/main/resources/assets/terracotta.json +++ b/HMCL/src/main/resources/assets/terracotta.json @@ -4,7 +4,6 @@ "0.3.9-rc.10" ], "version_latest": "0.3.10", - "feedback_url": "https://f.kdocs.cn/ksform/w/write/njMwdtgD?channel=n4awqa", "classifiers": { "linux-arm64": "sha256:001b6b1e220e98dffd84198a3e16855644cad27900562c78d610b0bf50138d17", "linux-x86_64": "sha256:b133ddb796ff52879fb0c38e68ef7ea968d3eaec77f27ea274c701888e795782",