From c98dbe6694ef483699454571e8ef8869ef5cd712 Mon Sep 17 00:00:00 2001 From: Burning_TNT Date: Sun, 5 Oct 2025 20:35:49 +0800 Subject: [PATCH] Feature: Display feedback form when updating Terracotta. (#4611) --- .../hmcl/terracotta/TerracottaMetadata.java | 9 ++++----- .../ui/terracotta/TerracottaControllerPage.java | 15 ++++++++++++++- .../main/resources/assets/lang/I18N.properties | 2 ++ .../main/resources/assets/lang/I18N_zh.properties | 2 ++ .../resources/assets/lang/I18N_zh_CN.properties | 2 ++ HMCL/src/main/resources/assets/terracotta.json | 1 + 6 files changed, 25 insertions(+), 6 deletions(-) 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 883ff6793..edd24ac35 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaMetadata.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaMetadata.java @@ -57,6 +57,7 @@ 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, @@ -86,7 +87,8 @@ public final class TerracottaMetadata { public static final ITerracottaProvider PROVIDER; public static final String PACKAGE_NAME; - private static final List PACKAGE_LINKS; + public static final List PACKAGE_LINKS; + public static final String FEEDBACK_LINK; private static final Pattern LEGACY; private static final List RECENT; @@ -103,6 +105,7 @@ 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; @@ -131,10 +134,6 @@ public final class TerracottaMetadata { } } - public static List getPackageLinks() { - return PACKAGE_LINKS; - } - @Nullable private static ProviderContext locateProvider(Config config) { String architecture = switch (Architecture.SYSTEM_ARCH) { 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 eb79487e6..6b48d70db 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 @@ -84,10 +84,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; +import static org.jackhuang.hmcl.setting.ConfigHolder.config; import static org.jackhuang.hmcl.setting.ConfigHolder.globalConfig; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class TerracottaControllerPage extends StackPane { + private static final String FEEDBACK_TIP = "terracotta-feedback"; private static final ObjectProperty UI_STATE = new SimpleObjectProperty<>(); static { @@ -187,6 +189,17 @@ public class TerracottaControllerPage extends StackPane { if (s != null) { UI_STATE.set(s); } + + if (uninitialized.hasLegacy() && I18n.isUseChinese()) { + Object feedback = config().getShownTips().get(FEEDBACK_TIP); + if (!(feedback instanceof Number number) || number.intValue() < 1) { + Controllers.confirm(i18n("terracotta.feedback.desc"), i18n("terracotta.feedback.title"), () -> { + FXUtils.openLink(TerracottaMetadata.FEEDBACK_LINK); + config().getShownTips().put(FEEDBACK_TIP, 1); + }, () -> { + }); + } + } } else { Controllers.confirmActionDanger(i18n("terracotta.confirm.desc"), i18n("terracotta.confirm.title"), () -> { globalConfig().setTerracottaAgreementVersion(1); @@ -552,7 +565,7 @@ public class TerracottaControllerPage extends StackPane { header.setSubtitle(i18n("terracotta.from_local.desc")); locals.setHeaderLeft(header); - for (TerracottaMetadata.Link link : TerracottaMetadata.getPackageLinks()) { + for (TerracottaMetadata.Link link : TerracottaMetadata.PACKAGE_LINKS) { HBox node = new HBox(); node.setAlignment(Pos.CENTER_LEFT); node.setPadding(new Insets(10, 16, 10, 16)); diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index f2680d271..1888f063b 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -1418,6 +1418,8 @@ terracotta.easytier=About EasyTier terracotta.terracotta=Terracotta | Multiplayer terracotta.status=Lobby terracotta.back=Exit +terracotta.feedback.title=Fill Out Feedback Form +terracotta.feedback.desc=As HMCL updates Multiplayer Core, we hope you can take 10 seconds to fill out the feedback form. terracotta.sudo_installing=HMCL must verify your password before installing Multiplayer Core terracotta.from_local.title=Third-party download channels for Multiplayer Core terracotta.from_local.desc=In some areas, the built-in default download channel may be unstable. diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 6d1270efc..4f1eb445c 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -1206,6 +1206,8 @@ terracotta.easytier=關於 EasyTier terracotta.terracotta=Terracotta | 陶瓦聯機 terracotta.status=聯機大廳 terracotta.back=退出 +terracotta.feedback.title=填寫回饋表 +terracotta.feedback.desc=在 HMCL 更新聯機核心時,我們歡迎您用 10 秒時間填寫聯機品質回饋收集表。 terracotta.sudo_installing=HMCL 需要驗證您的密碼才能安裝線上核心 terracotta.from_local.title=線上核心第三方下載管道 terracotta.from_local.desc=在部分地區,內建的預設下載管道可能不穩定或連線緩慢 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index b3800bf5e..c45a6aa12 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -1216,6 +1216,8 @@ terracotta.easytier=关于 EasyTier terracotta.terracotta=Terracotta | 陶瓦联机 terracotta.status=联机大厅 terracotta.back=退出 +terracotta.feedback.title=填写反馈表 +terracotta.feedback.desc=在 HMCL 更新联机核心时,我们欢迎您用 10 秒时间填写联机质量反馈收集表。 terracotta.sudo_installing=HMCL 需要验证您的密码才能安装联机核心 terracotta.from_local.title=联机核心第三方下载渠道 terracotta.from_local.desc=在部分地区,HMCL 内置的默认下载渠道可能不稳定或连接缓慢 diff --git a/HMCL/src/main/resources/assets/terracotta.json b/HMCL/src/main/resources/assets/terracotta.json index 77c46af6a..2d60870e3 100644 --- a/HMCL/src/main/resources/assets/terracotta.json +++ b/HMCL/src/main/resources/assets/terracotta.json @@ -4,6 +4,7 @@ "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",