diff --git a/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/BetterStatsConfig.java b/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/BetterStatsConfig.java index b8705bd..fb6cfa1 100644 --- a/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/BetterStatsConfig.java +++ b/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/BetterStatsConfig.java @@ -7,8 +7,6 @@ public class BetterStatsConfig extends AutoConfig { - // ================================================== - private static @NonSerialized boolean FULL_VERSION = false; // ================================================== public static @NonSerialized boolean DEBUG_MODE = false; // -------------------------------------------------- @@ -22,20 +20,5 @@ public class BetterStatsConfig extends AutoConfig public @SerializedAs("server-sasConfig") SASConfig sasConfig = new SASConfig(); // ================================================== public BetterStatsConfig(String name) { super(name); } - static - { - //check for the "full version" file's presence - try - { - final var s = BetterStats.class.getResourceAsStream("/betterstats.full.txt"); - if(s != null) { s.close(); FULL_VERSION = true; } - } - catch(Exception e) { FULL_VERSION = true; } - } - // ================================================== - /** - * Returns {@code true} if all features should always be available. - */ - public final boolean isFullVersion() { return FULL_VERSION || this.forceFullVersion; } // ================================================== } \ No newline at end of file diff --git a/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareDownloadScreen.java b/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareDownloadScreen.java index 400a904..b20bebd 100644 --- a/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareDownloadScreen.java +++ b/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareDownloadScreen.java @@ -9,6 +9,7 @@ import java.time.Instant; import java.util.Locale; import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; import org.apache.commons.io.IOUtils; import org.apache.http.Header; @@ -24,8 +25,10 @@ import io.github.thecsdev.betterstats.api.client.gui.screen.BetterStatsScreen; import io.github.thecsdev.betterstats.api.util.io.RAMStatsProvider; +import io.github.thecsdev.betterstats.util.BST; import io.github.thecsdev.betterstats.util.io.BetterStatsWebApiUtils; -import io.github.thecsdev.tcdcommons.api.util.TextUtils; +import io.github.thecsdev.tcdcommons.api.client.gui.other.TLabelElement; +import io.github.thecsdev.tcdcommons.api.util.enumerations.HorizontalAlignment; import io.github.thecsdev.tcdcommons.api.util.io.HttpUtils.FetchOptions; import io.github.thecsdev.tcdcommons.api.util.io.cache.CachedResource; import io.github.thecsdev.tcdcommons.api.util.io.cache.CachedResourceManager; @@ -39,16 +42,18 @@ public class QuickShareDownloadScreen extends QuickShareScreen { // ================================================== - private @Internal final String quickShareCode; + private @Nullable Screen bssParent; + private final String quickShareCode; // -------------------------------------------------- private @Internal volatile boolean __started = false; private @Internal volatile int __stage = 0; private @Internal volatile Throwable __error = null; // ================================================== - public QuickShareDownloadScreen(@Nullable Screen parent, String quickShareCode) + public QuickShareDownloadScreen(@Nullable Screen bssParent, @Nullable Screen parent, String quickShareCode) throws NullPointerException { - super(parent, TextUtils.translatable("betterstats.gui.qs_screen.download.title")); + super(parent, BST.gui_qsscreen_download_title()); + this.bssParent = bssParent; Objects.requireNonNull(quickShareCode); quickShareCode = quickShareCode.toLowerCase(Locale.ENGLISH); if(!quickShareCode.endsWith(QSC_SUFFIX)) quickShareCode += QSC_SUFFIX; @@ -60,7 +65,22 @@ public QuickShareDownloadScreen(@Nullable Screen parent, String quickShareCode) //start the operation __start__stage1(); - //FIXME - IMPLEMENT GUI + //the primary label + final var lbl = new TLabelElement(0, 0, getWidth(), getHeight()); + lbl.setTextHorizontalAlignment(HorizontalAlignment.CENTER); + lbl.setTextColor(0xffffff00); + addChild(lbl, false); + + //the primary label text + switch(this.__stage) + { + case 0: lbl.setText(BST.gui_qsscreen_download_stage0()); break; + case 1: lbl.setText(BST.gui_qsscreen_download_stage1()); break; + case 2: lbl.setText(BST.gui_qsscreen_download_stage2()); break; + case 3: lbl.setText(BST.gui_qsscreen_download_stage3()); break; + case 4: lbl.setText(BST.gui_qsscreen_download_stage4()); break; + default: break; + } } // ================================================== private @Internal void __start_onError(@Nullable Exception exception) @@ -82,12 +102,11 @@ public QuickShareDownloadScreen(@Nullable Screen parent, String quickShareCode) //fetch the API links BetterStatsWebApiUtils.fetchBssApiLinksAsync(MC_CLIENT, - json -> __start__stage2(json), + json -> __start__stage2and3(json), error -> __start_onError(error)); } - - private @Internal void __start__stage2(final JsonObject links) + private @Internal void __start__stage2and3(final JsonObject links) { //prepare this.__stage = 2; @@ -106,47 +125,79 @@ public QuickShareDownloadScreen(@Nullable Screen parent, String quickShareCode) public final @Override CachedResource fetchResourceSync() throws Exception { //fetch the download link - @Nullable JsonObject downloadUrlData = null; - @Nullable CloseableHttpResponse response = null; - try + final AtomicReference du_ready = new AtomicReference(); + final AtomicReference du_error = new AtomicReference(); + CachedResourceManager.getResourceSync( //NOTE: MUST BE SYNCHRONOUS! + Identifier.of( + getModID(), + "quick_share/download_urls/" + + QuickShareDownloadScreen.this.quickShareCode + ".json"), + new IResourceFetchTask() { - //perform the http request - response = fetchSync(links.get("quickshare_gdu").getAsString(), new FetchOptions() + public final @Override ThreadExecutor getMinecraftClientOrServer() { return MC_CLIENT; } + public final @Override Class getResourceType() { return JsonObject.class; } + public final @Override CachedResource fetchResourceSync() throws Exception { - public final @Override String method() { return "POST"; } - public final @Override Object body() + //check if the API is available + if(!links.has("quickshare_gdu")) + throw new NullPointerException("Quick-share download API is unavailable."); + + //perform the request + @Nullable CloseableHttpResponse response = null; + try { - final var json = new JsonObject(); - json.addProperty("file", QuickShareDownloadScreen.this.quickShareCode); - return json; + response = fetchSync(links.get("quickshare_gdu").getAsString(), new FetchOptions() + { + public final @Override String method() { return "POST"; } + public final @Override Object body() + { + final var json = new JsonObject(); + json.addProperty("file", QuickShareDownloadScreen.this.quickShareCode); + return json; + } + }); + + //collect the response message + String responseMessage = ""; + if(response.getEntity() != null) + responseMessage = EntityUtils.toString(response.getEntity()); + + //handle the response status code + final var statusCode = response.getStatusLine().getStatusCode(); + final var statusMessage = response.getStatusLine().getReasonPhrase(); + if(statusCode != 200) + throw new HttpException( + "BSS API server response message:\n----------\n" + responseMessage + "\n----------", + new HttpResponseException(statusCode, statusMessage)); + + //parse the response + final var json = GSON.fromJson(responseMessage, JsonObject.class); + @Nullable Instant expires = null; + try { expires = Instant.parse(json.get("expires").getAsString()); } + catch(Exception parseExc) { expires = Instant.now().plusSeconds(30); } + + //return the response json + return new CachedResource(json, responseMessage.length(), expires); } - }); - - //collect the response message - String responseMessage = ""; - if(response.getEntity() != null) - responseMessage = EntityUtils.toString(response.getEntity()); - - //handle the response status code - final var statusCode = response.getStatusLine().getStatusCode(); - final var statusMessage = response.getStatusLine().getReasonPhrase(); - if(statusCode != 200) - throw new HttpException( - "BSS API server response message:\n----------\n" + responseMessage + "\n----------", - new HttpResponseException(statusCode, statusMessage)); - - //parse the response json - downloadUrlData = GSON.fromJson(responseMessage, JsonObject.class); - } - finally { if(response != null) IOUtils.closeQuietly(response); } + finally { if(response != null) IOUtils.closeQuietly(response); } + } + public final @Override void onError(Exception error) { du_error.set(error); } + public final @Override void onReady(JsonObject result) { du_ready.set(result); } + }); + + //handle the download link fetch outcome + if(du_error.get() != null) + throw du_error.get(); + else if(du_ready.get() == null) + throw new NullPointerException("Failed to obtain quick-share download URL."); //prepare to download the MCBS file QuickShareDownloadScreen.this.__stage = 3; QuickShareDownloadScreen.this.refresh(); + final var downloadUrlData = du_ready.get(); final var url = downloadUrlData.get("url").getAsString(); - final var method = downloadUrlData.get("method").getAsString(); - //final var expires = Instant.parse(downloadUrlData.get("expires").getAsString()); -- download url expiration is ignored for now + final var method = downloadUrlData.get("method").getAsString().toUpperCase(Locale.ENGLISH); final var headers = downloadUrlData.get("headers").getAsJsonObject() .entrySet().stream() .map(entry -> new BasicHeader(entry.getKey(), entry.getValue().getAsString())) @@ -158,6 +209,7 @@ public QuickShareDownloadScreen(@Nullable Screen parent, String quickShareCode) " to download the quick-share file, but I only support HTTP GET."); //perform the download + @Nullable CloseableHttpResponse response = null; try { //fetch @@ -193,24 +245,26 @@ public QuickShareDownloadScreen(@Nullable Screen parent, String quickShareCode) //finally, conclude @Nullable Instant expires_file = null; try { expires_file = Instant.parse(downloadUrlData.get("expires_file").getAsString()); } - catch(Exception parseExc) { expires_file = Instant.now().plus(Duration.ofHours(48)); } + catch(Exception parseExc) { expires_file = Instant.now().plus(Duration.ofDays(1)); } return new CachedResource(responseBody, responseBody.length, expires_file); } finally { if(response != null) IOUtils.closeQuietly(response); } } public final @Override void onError(Exception error) { __start_onError(error); } - public final @Override void onReady(byte[] result) { __start__stage3(result); } + public final @Override void onReady(byte[] result) { __start__stage4(result); } }); } - private @Internal void __start__stage3(final byte[] mcbs) + private @Internal void __start__stage4(final byte[] mcbs) { + this.__stage = 4; + refresh(); try { final var buffer = new PacketByteBuf(Unpooled.wrappedBuffer(mcbs)); final var stats = new RAMStatsProvider(buffer, true); - final var bss = new BetterStatsScreen(null, stats); + final var bss = new BetterStatsScreen(this.bssParent, stats); MC_CLIENT.setScreen(bss.getAsScreen()); } catch(Exception exc) { __start_onError(exc); } diff --git a/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareScreen.java b/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareScreen.java index 811b45d..8bda92e 100644 --- a/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareScreen.java +++ b/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareScreen.java @@ -32,9 +32,14 @@ public QuickShareScreen(@Nullable Screen parent, Text title) } // -------------------------------------------------- public final @Override Screen getParentScreen() { return this.parent; } + public @Virtual @Override void close() { MC_CLIENT.setScreen(getParentScreen()); } // ================================================== protected final void refresh() { MC_CLIENT.executeSync(() -> { if(!isOpen()) return; clearChildren(); init(); }); } // -------------------------------------------------- - public @Virtual @Override void renderBackground(TDrawContext pencil) { pencil.drawTFill(COLOR_BACKGROUND); } + public @Virtual @Override void renderBackground(TDrawContext pencil) + { + super.renderBackground(pencil); + pencil.drawTFill(COLOR_BACKGROUND); + } // ================================================== } \ No newline at end of file diff --git a/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareUploadScreen.java b/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareUploadScreen.java index cdb1737..60b6c2f 100644 --- a/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareUploadScreen.java +++ b/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareUploadScreen.java @@ -1,5 +1,7 @@ package io.github.thecsdev.betterstats.client.gui.screen; +import static io.github.thecsdev.tcdcommons.api.util.TextUtils.translatable; +import static io.github.thecsdev.tcdcommons.api.util.TextUtils.literal; import static io.github.thecsdev.betterstats.BetterStats.getModID; import static io.github.thecsdev.betterstats.client.BetterStatsClient.MC_CLIENT; import static io.github.thecsdev.betterstats.util.io.BetterStatsWebApiUtils.GSON; @@ -12,6 +14,7 @@ import java.util.Objects; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.Header; import org.apache.http.HttpException; import org.apache.http.client.HttpResponseException; @@ -28,8 +31,11 @@ import io.github.thecsdev.betterstats.api.util.io.IStatsProvider; import io.github.thecsdev.betterstats.api.util.io.StatsProviderIO; +import io.github.thecsdev.betterstats.util.BST; import io.github.thecsdev.betterstats.util.io.BetterStatsWebApiUtils; -import io.github.thecsdev.tcdcommons.api.util.TextUtils; +import io.github.thecsdev.tcdcommons.api.client.gui.other.TLabelElement; +import io.github.thecsdev.tcdcommons.api.client.gui.widget.TButtonWidget; +import io.github.thecsdev.tcdcommons.api.util.enumerations.HorizontalAlignment; import io.github.thecsdev.tcdcommons.api.util.io.HttpUtils.FetchOptions; import io.github.thecsdev.tcdcommons.api.util.io.cache.CachedResource; import io.github.thecsdev.tcdcommons.api.util.io.cache.CachedResourceManager; @@ -38,6 +44,7 @@ import io.netty.buffer.Unpooled; import net.minecraft.client.gui.screen.Screen; import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import net.minecraft.util.thread.ThreadExecutor; @@ -56,7 +63,7 @@ public final class QuickShareUploadScreen extends QuickShareScreen public QuickShareUploadScreen(@Nullable Screen parent, IStatsProvider stats) throws NullPointerException { - super(parent, TextUtils.translatable("betterstats.gui.qs_screen.upload.title")); + super(parent, BST.gui_qsscreen_upload_title()); this.stats = Objects.requireNonNull(stats); } // ================================================== @@ -65,7 +72,34 @@ public QuickShareUploadScreen(@Nullable Screen parent, IStatsProvider stats) //start the operation __start__stage1(); - //FIXME - IMPLEMENT GUI + //the primary label + final var lbl = new TLabelElement(0, 0, getWidth(), getHeight()); + lbl.setTextHorizontalAlignment(HorizontalAlignment.CENTER); + lbl.setTextColor(0xffffff00); + addChild(lbl, false); + + //the primary label text + switch(this.__stage) + { + case 0: lbl.setText(BST.gui_qsscreen_upload_stage0()); break; + case 1: lbl.setText(BST.gui_qsscreen_upload_stage1()); break; + case 2: lbl.setText(BST.gui_qsscreen_upload_stage2()); break; + case 3: lbl.setText(BST.gui_qsscreen_upload_stage3()); break; + case 4: + //set final stage label text + final var codeStr = StringUtils.removeEnd("" + this.__quickShareCode, QSC_SUFFIX) + .toUpperCase(Locale.ENGLISH); + final var codeTxt = literal(codeStr).formatted(Formatting.WHITE); + lbl.setText(BST.gui_qsscreen_upload_stage4(codeTxt)); + + //add a "Done" button + final var btn_done = new TButtonWidget((getWidth() / 2) - 75, getHeight() - 30, 150, 20); + btn_done.setText(translatable("gui.done")); + btn_done.setOnClick(__ -> close()); + addChild(btn_done, false); + break; + default: break; + } } // ================================================== private @Internal void __start_onError(@Nullable Exception exception) @@ -98,7 +132,7 @@ public QuickShareUploadScreen(@Nullable Screen parent, IStatsProvider stats) //fetch the upload link CachedResourceManager.getResourceAsync( - Identifier.of(getModID(), "quick_share/upload_url.json"), + Identifier.of(getModID(), "quick_share/latest_upload_url.json"), new IResourceFetchTask() { public ThreadExecutor getMinecraftClientOrServer() { return MC_CLIENT; } diff --git a/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/stats/tabs/BSStatsSharingTab.java b/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/stats/tabs/BSStatsSharingTab.java index 6cc3e96..00bf6c7 100644 --- a/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/stats/tabs/BSStatsSharingTab.java +++ b/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/client/gui/stats/tabs/BSStatsSharingTab.java @@ -11,7 +11,6 @@ import org.apache.commons.lang3.StringUtils; -import io.github.thecsdev.betterstats.BetterStats; import io.github.thecsdev.betterstats.BetterStatsProperties; import io.github.thecsdev.betterstats.api.client.gui.screen.BetterStatsScreen; import io.github.thecsdev.betterstats.api.client.gui.util.StatsTabUtils; @@ -33,7 +32,6 @@ import io.github.thecsdev.tcdcommons.api.util.TextUtils; import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.text.Text; -import net.minecraft.util.Formatting; public class BSStatsSharingTab extends StatsTab { @@ -43,12 +41,7 @@ public class BSStatsSharingTab extends StatsTab // -------------------------------------------------- private static boolean LEGAL_QS_CONSENT = false; // ================================================== - public final @Override Text getName() - { - final var txt = BST.menu_statsSharing(); - return BetterStats.getInstance().getConfig().isFullVersion() ? - txt : txt.formatted(Formatting.YELLOW); - } + public final @Override Text getName() { return BST.menu_statsSharing(); } public final boolean isAvailable() { return false; } // ================================================== public final @Override void initFilters(FiltersInitContext initContext) @@ -101,7 +94,7 @@ private final void init_ssps(StatsInitContext initContext) //the input and submit widgets final var n1 = UILayout.nextChildVerticalRect(panel); n1.y += 3; - final var a = BetterStats.getInstance().getConfig().isFullVersion() && cpnh.isPresent() && cpnh.get().comms(); + final var a = cpnh.isPresent() && cpnh.get().comms(); final var in_name = new TTextFieldWidget(n1.x, n1.y, n1.width - 25, 20); in_name.setPlaceholderText(translatable("gui.abuseReport.type.name")); @@ -197,7 +190,11 @@ private final void init_quickShare_download(StatsInitContext initContext) { final var input = in_qscode.getInput().trim(); if(StringUtils.isBlank(input)) return; - MC_CLIENT.setScreen(new QuickShareDownloadScreen(MC_CLIENT.currentScreen, input).getAsScreen()); + MC_CLIENT.setScreen(new QuickShareDownloadScreen( + GuiUtils.getCurrentScreenParent(), + MC_CLIENT.currentScreen, + input + ).getAsScreen()); }); panel.addChild(btn_submit, false); } diff --git a/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/util/BST.java b/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/util/BST.java index 747aa6d..23d3691 100644 --- a/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/util/BST.java +++ b/betterstats-3-fabric-1.20.5/src/main/java/io/github/thecsdev/betterstats/util/BST.java @@ -117,5 +117,19 @@ private BST() {} public static final MutableText gui_tpsbs_qs_step1() { return translatable("betterstats.gui.tpsbs.tab.qs.step_1"); } public static final MutableText gui_tpsbs_qs_step2() { return translatable("betterstats.gui.tpsbs.tab.qs.step_2"); } public static final MutableText gui_tpsbs_qs_step2_entrqscode() { return translatable("betterstats.gui.tpsbs.tab.qs.step_2.enter_qscode"); } + // -------------------------------------------------- + public static final MutableText gui_qsscreen_upload_title() { return translatable("betterstats.gui.qs_screen.upload.title"); } + public static final MutableText gui_qsscreen_upload_stage0() { return translatable("betterstats.gui.qs_screen.upload.stage_0"); } + public static final MutableText gui_qsscreen_upload_stage1() { return translatable("betterstats.gui.qs_screen.upload.stage_1"); } + public static final MutableText gui_qsscreen_upload_stage2() { return translatable("betterstats.gui.qs_screen.upload.stage_2"); } + public static final MutableText gui_qsscreen_upload_stage3() { return translatable("betterstats.gui.qs_screen.upload.stage_3"); } + public static final MutableText gui_qsscreen_upload_stage4(Text qsCode) { return translatable("betterstats.gui.qs_screen.upload.stage_4", qsCode); } + // + public static final MutableText gui_qsscreen_download_title() { return translatable("betterstats.gui.qs_screen.download.title"); } + public static final MutableText gui_qsscreen_download_stage0() { return translatable("betterstats.gui.qs_screen.download.stage_0"); } + public static final MutableText gui_qsscreen_download_stage1() { return translatable("betterstats.gui.qs_screen.download.stage_1"); } + public static final MutableText gui_qsscreen_download_stage2() { return translatable("betterstats.gui.qs_screen.download.stage_2"); } + public static final MutableText gui_qsscreen_download_stage3() { return translatable("betterstats.gui.qs_screen.download.stage_3"); } + public static final MutableText gui_qsscreen_download_stage4() { return translatable("betterstats.gui.qs_screen.download.stage_4"); } // ================================================== } \ No newline at end of file diff --git a/betterstats-3-fabric-1.20.5/src/main/resources/META-INF/jarjar-excluded/tcdcommons-3.12+fabric-1.20.6.jar b/betterstats-3-fabric-1.20.5/src/main/resources/META-INF/jarjar-excluded/tcdcommons-3.12+fabric-1.20.6.jar index aa9c7d9..6d02264 100644 Binary files a/betterstats-3-fabric-1.20.5/src/main/resources/META-INF/jarjar-excluded/tcdcommons-3.12+fabric-1.20.6.jar and b/betterstats-3-fabric-1.20.5/src/main/resources/META-INF/jarjar-excluded/tcdcommons-3.12+fabric-1.20.6.jar differ diff --git a/betterstats-3-fabric-1.20.5/src/main/resources/assets/betterstats/lang/en_us.json b/betterstats-3-fabric-1.20.5/src/main/resources/assets/betterstats/lang/en_us.json index d6b0254..a31dc99 100644 --- a/betterstats-3-fabric-1.20.5/src/main/resources/assets/betterstats/lang/en_us.json +++ b/betterstats-3-fabric-1.20.5/src/main/resources/assets/betterstats/lang/en_us.json @@ -114,6 +114,16 @@ "betterstats.gui.qs_screen.upload.title": "Uploading quick-share statistics...", - - "betterstats.gui.qs_screen.download.title": "Uploading quick-share statistics..." + "betterstats.gui.qs_screen.upload.stage_0": "Preparting to upload the statistics...", + "betterstats.gui.qs_screen.upload.stage_1": "Fetching better-stats API endpoint URLs...", + "betterstats.gui.qs_screen.upload.stage_2": "Fetching cloud upload API endpoint URL...", + "betterstats.gui.qs_screen.upload.stage_3": "Uploading statistics to the cloud...", + "betterstats.gui.qs_screen.upload.stage_4": "Done. Your quick-share code is: %s", + + "betterstats.gui.qs_screen.download.title": "Downloading quick-share statistics...", + "betterstats.gui.qs_screen.download.stage_0": "Preparting to download the statistics...", + "betterstats.gui.qs_screen.download.stage_1": "Fetching better-stats API endpoint URLs...", + "betterstats.gui.qs_screen.download.stage_2": "Fetching cloud download API endpoint URL...", + "betterstats.gui.qs_screen.download.stage_3": "Downloading statistics from the cloud...", + "betterstats.gui.qs_screen.download.stage_4": "Done. Loading the downloaded statistics..." } \ No newline at end of file diff --git a/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/BetterStatsConfig.java b/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/BetterStatsConfig.java index b8705bd..fb6cfa1 100644 --- a/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/BetterStatsConfig.java +++ b/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/BetterStatsConfig.java @@ -7,8 +7,6 @@ public class BetterStatsConfig extends AutoConfig { - // ================================================== - private static @NonSerialized boolean FULL_VERSION = false; // ================================================== public static @NonSerialized boolean DEBUG_MODE = false; // -------------------------------------------------- @@ -22,20 +20,5 @@ public class BetterStatsConfig extends AutoConfig public @SerializedAs("server-sasConfig") SASConfig sasConfig = new SASConfig(); // ================================================== public BetterStatsConfig(String name) { super(name); } - static - { - //check for the "full version" file's presence - try - { - final var s = BetterStats.class.getResourceAsStream("/betterstats.full.txt"); - if(s != null) { s.close(); FULL_VERSION = true; } - } - catch(Exception e) { FULL_VERSION = true; } - } - // ================================================== - /** - * Returns {@code true} if all features should always be available. - */ - public final boolean isFullVersion() { return FULL_VERSION || this.forceFullVersion; } // ================================================== } \ No newline at end of file diff --git a/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareDownloadScreen.java b/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareDownloadScreen.java index 400a904..b20bebd 100644 --- a/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareDownloadScreen.java +++ b/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareDownloadScreen.java @@ -9,6 +9,7 @@ import java.time.Instant; import java.util.Locale; import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; import org.apache.commons.io.IOUtils; import org.apache.http.Header; @@ -24,8 +25,10 @@ import io.github.thecsdev.betterstats.api.client.gui.screen.BetterStatsScreen; import io.github.thecsdev.betterstats.api.util.io.RAMStatsProvider; +import io.github.thecsdev.betterstats.util.BST; import io.github.thecsdev.betterstats.util.io.BetterStatsWebApiUtils; -import io.github.thecsdev.tcdcommons.api.util.TextUtils; +import io.github.thecsdev.tcdcommons.api.client.gui.other.TLabelElement; +import io.github.thecsdev.tcdcommons.api.util.enumerations.HorizontalAlignment; import io.github.thecsdev.tcdcommons.api.util.io.HttpUtils.FetchOptions; import io.github.thecsdev.tcdcommons.api.util.io.cache.CachedResource; import io.github.thecsdev.tcdcommons.api.util.io.cache.CachedResourceManager; @@ -39,16 +42,18 @@ public class QuickShareDownloadScreen extends QuickShareScreen { // ================================================== - private @Internal final String quickShareCode; + private @Nullable Screen bssParent; + private final String quickShareCode; // -------------------------------------------------- private @Internal volatile boolean __started = false; private @Internal volatile int __stage = 0; private @Internal volatile Throwable __error = null; // ================================================== - public QuickShareDownloadScreen(@Nullable Screen parent, String quickShareCode) + public QuickShareDownloadScreen(@Nullable Screen bssParent, @Nullable Screen parent, String quickShareCode) throws NullPointerException { - super(parent, TextUtils.translatable("betterstats.gui.qs_screen.download.title")); + super(parent, BST.gui_qsscreen_download_title()); + this.bssParent = bssParent; Objects.requireNonNull(quickShareCode); quickShareCode = quickShareCode.toLowerCase(Locale.ENGLISH); if(!quickShareCode.endsWith(QSC_SUFFIX)) quickShareCode += QSC_SUFFIX; @@ -60,7 +65,22 @@ public QuickShareDownloadScreen(@Nullable Screen parent, String quickShareCode) //start the operation __start__stage1(); - //FIXME - IMPLEMENT GUI + //the primary label + final var lbl = new TLabelElement(0, 0, getWidth(), getHeight()); + lbl.setTextHorizontalAlignment(HorizontalAlignment.CENTER); + lbl.setTextColor(0xffffff00); + addChild(lbl, false); + + //the primary label text + switch(this.__stage) + { + case 0: lbl.setText(BST.gui_qsscreen_download_stage0()); break; + case 1: lbl.setText(BST.gui_qsscreen_download_stage1()); break; + case 2: lbl.setText(BST.gui_qsscreen_download_stage2()); break; + case 3: lbl.setText(BST.gui_qsscreen_download_stage3()); break; + case 4: lbl.setText(BST.gui_qsscreen_download_stage4()); break; + default: break; + } } // ================================================== private @Internal void __start_onError(@Nullable Exception exception) @@ -82,12 +102,11 @@ public QuickShareDownloadScreen(@Nullable Screen parent, String quickShareCode) //fetch the API links BetterStatsWebApiUtils.fetchBssApiLinksAsync(MC_CLIENT, - json -> __start__stage2(json), + json -> __start__stage2and3(json), error -> __start_onError(error)); } - - private @Internal void __start__stage2(final JsonObject links) + private @Internal void __start__stage2and3(final JsonObject links) { //prepare this.__stage = 2; @@ -106,47 +125,79 @@ public QuickShareDownloadScreen(@Nullable Screen parent, String quickShareCode) public final @Override CachedResource fetchResourceSync() throws Exception { //fetch the download link - @Nullable JsonObject downloadUrlData = null; - @Nullable CloseableHttpResponse response = null; - try + final AtomicReference du_ready = new AtomicReference(); + final AtomicReference du_error = new AtomicReference(); + CachedResourceManager.getResourceSync( //NOTE: MUST BE SYNCHRONOUS! + Identifier.of( + getModID(), + "quick_share/download_urls/" + + QuickShareDownloadScreen.this.quickShareCode + ".json"), + new IResourceFetchTask() { - //perform the http request - response = fetchSync(links.get("quickshare_gdu").getAsString(), new FetchOptions() + public final @Override ThreadExecutor getMinecraftClientOrServer() { return MC_CLIENT; } + public final @Override Class getResourceType() { return JsonObject.class; } + public final @Override CachedResource fetchResourceSync() throws Exception { - public final @Override String method() { return "POST"; } - public final @Override Object body() + //check if the API is available + if(!links.has("quickshare_gdu")) + throw new NullPointerException("Quick-share download API is unavailable."); + + //perform the request + @Nullable CloseableHttpResponse response = null; + try { - final var json = new JsonObject(); - json.addProperty("file", QuickShareDownloadScreen.this.quickShareCode); - return json; + response = fetchSync(links.get("quickshare_gdu").getAsString(), new FetchOptions() + { + public final @Override String method() { return "POST"; } + public final @Override Object body() + { + final var json = new JsonObject(); + json.addProperty("file", QuickShareDownloadScreen.this.quickShareCode); + return json; + } + }); + + //collect the response message + String responseMessage = ""; + if(response.getEntity() != null) + responseMessage = EntityUtils.toString(response.getEntity()); + + //handle the response status code + final var statusCode = response.getStatusLine().getStatusCode(); + final var statusMessage = response.getStatusLine().getReasonPhrase(); + if(statusCode != 200) + throw new HttpException( + "BSS API server response message:\n----------\n" + responseMessage + "\n----------", + new HttpResponseException(statusCode, statusMessage)); + + //parse the response + final var json = GSON.fromJson(responseMessage, JsonObject.class); + @Nullable Instant expires = null; + try { expires = Instant.parse(json.get("expires").getAsString()); } + catch(Exception parseExc) { expires = Instant.now().plusSeconds(30); } + + //return the response json + return new CachedResource(json, responseMessage.length(), expires); } - }); - - //collect the response message - String responseMessage = ""; - if(response.getEntity() != null) - responseMessage = EntityUtils.toString(response.getEntity()); - - //handle the response status code - final var statusCode = response.getStatusLine().getStatusCode(); - final var statusMessage = response.getStatusLine().getReasonPhrase(); - if(statusCode != 200) - throw new HttpException( - "BSS API server response message:\n----------\n" + responseMessage + "\n----------", - new HttpResponseException(statusCode, statusMessage)); - - //parse the response json - downloadUrlData = GSON.fromJson(responseMessage, JsonObject.class); - } - finally { if(response != null) IOUtils.closeQuietly(response); } + finally { if(response != null) IOUtils.closeQuietly(response); } + } + public final @Override void onError(Exception error) { du_error.set(error); } + public final @Override void onReady(JsonObject result) { du_ready.set(result); } + }); + + //handle the download link fetch outcome + if(du_error.get() != null) + throw du_error.get(); + else if(du_ready.get() == null) + throw new NullPointerException("Failed to obtain quick-share download URL."); //prepare to download the MCBS file QuickShareDownloadScreen.this.__stage = 3; QuickShareDownloadScreen.this.refresh(); + final var downloadUrlData = du_ready.get(); final var url = downloadUrlData.get("url").getAsString(); - final var method = downloadUrlData.get("method").getAsString(); - //final var expires = Instant.parse(downloadUrlData.get("expires").getAsString()); -- download url expiration is ignored for now + final var method = downloadUrlData.get("method").getAsString().toUpperCase(Locale.ENGLISH); final var headers = downloadUrlData.get("headers").getAsJsonObject() .entrySet().stream() .map(entry -> new BasicHeader(entry.getKey(), entry.getValue().getAsString())) @@ -158,6 +209,7 @@ public QuickShareDownloadScreen(@Nullable Screen parent, String quickShareCode) " to download the quick-share file, but I only support HTTP GET."); //perform the download + @Nullable CloseableHttpResponse response = null; try { //fetch @@ -193,24 +245,26 @@ public QuickShareDownloadScreen(@Nullable Screen parent, String quickShareCode) //finally, conclude @Nullable Instant expires_file = null; try { expires_file = Instant.parse(downloadUrlData.get("expires_file").getAsString()); } - catch(Exception parseExc) { expires_file = Instant.now().plus(Duration.ofHours(48)); } + catch(Exception parseExc) { expires_file = Instant.now().plus(Duration.ofDays(1)); } return new CachedResource(responseBody, responseBody.length, expires_file); } finally { if(response != null) IOUtils.closeQuietly(response); } } public final @Override void onError(Exception error) { __start_onError(error); } - public final @Override void onReady(byte[] result) { __start__stage3(result); } + public final @Override void onReady(byte[] result) { __start__stage4(result); } }); } - private @Internal void __start__stage3(final byte[] mcbs) + private @Internal void __start__stage4(final byte[] mcbs) { + this.__stage = 4; + refresh(); try { final var buffer = new PacketByteBuf(Unpooled.wrappedBuffer(mcbs)); final var stats = new RAMStatsProvider(buffer, true); - final var bss = new BetterStatsScreen(null, stats); + final var bss = new BetterStatsScreen(this.bssParent, stats); MC_CLIENT.setScreen(bss.getAsScreen()); } catch(Exception exc) { __start_onError(exc); } diff --git a/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareScreen.java b/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareScreen.java index 811b45d..8bda92e 100644 --- a/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareScreen.java +++ b/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareScreen.java @@ -32,9 +32,14 @@ public QuickShareScreen(@Nullable Screen parent, Text title) } // -------------------------------------------------- public final @Override Screen getParentScreen() { return this.parent; } + public @Virtual @Override void close() { MC_CLIENT.setScreen(getParentScreen()); } // ================================================== protected final void refresh() { MC_CLIENT.executeSync(() -> { if(!isOpen()) return; clearChildren(); init(); }); } // -------------------------------------------------- - public @Virtual @Override void renderBackground(TDrawContext pencil) { pencil.drawTFill(COLOR_BACKGROUND); } + public @Virtual @Override void renderBackground(TDrawContext pencil) + { + super.renderBackground(pencil); + pencil.drawTFill(COLOR_BACKGROUND); + } // ================================================== } \ No newline at end of file diff --git a/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareUploadScreen.java b/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareUploadScreen.java index cdb1737..60b6c2f 100644 --- a/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareUploadScreen.java +++ b/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/screen/QuickShareUploadScreen.java @@ -1,5 +1,7 @@ package io.github.thecsdev.betterstats.client.gui.screen; +import static io.github.thecsdev.tcdcommons.api.util.TextUtils.translatable; +import static io.github.thecsdev.tcdcommons.api.util.TextUtils.literal; import static io.github.thecsdev.betterstats.BetterStats.getModID; import static io.github.thecsdev.betterstats.client.BetterStatsClient.MC_CLIENT; import static io.github.thecsdev.betterstats.util.io.BetterStatsWebApiUtils.GSON; @@ -12,6 +14,7 @@ import java.util.Objects; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.Header; import org.apache.http.HttpException; import org.apache.http.client.HttpResponseException; @@ -28,8 +31,11 @@ import io.github.thecsdev.betterstats.api.util.io.IStatsProvider; import io.github.thecsdev.betterstats.api.util.io.StatsProviderIO; +import io.github.thecsdev.betterstats.util.BST; import io.github.thecsdev.betterstats.util.io.BetterStatsWebApiUtils; -import io.github.thecsdev.tcdcommons.api.util.TextUtils; +import io.github.thecsdev.tcdcommons.api.client.gui.other.TLabelElement; +import io.github.thecsdev.tcdcommons.api.client.gui.widget.TButtonWidget; +import io.github.thecsdev.tcdcommons.api.util.enumerations.HorizontalAlignment; import io.github.thecsdev.tcdcommons.api.util.io.HttpUtils.FetchOptions; import io.github.thecsdev.tcdcommons.api.util.io.cache.CachedResource; import io.github.thecsdev.tcdcommons.api.util.io.cache.CachedResourceManager; @@ -38,6 +44,7 @@ import io.netty.buffer.Unpooled; import net.minecraft.client.gui.screen.Screen; import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import net.minecraft.util.thread.ThreadExecutor; @@ -56,7 +63,7 @@ public final class QuickShareUploadScreen extends QuickShareScreen public QuickShareUploadScreen(@Nullable Screen parent, IStatsProvider stats) throws NullPointerException { - super(parent, TextUtils.translatable("betterstats.gui.qs_screen.upload.title")); + super(parent, BST.gui_qsscreen_upload_title()); this.stats = Objects.requireNonNull(stats); } // ================================================== @@ -65,7 +72,34 @@ public QuickShareUploadScreen(@Nullable Screen parent, IStatsProvider stats) //start the operation __start__stage1(); - //FIXME - IMPLEMENT GUI + //the primary label + final var lbl = new TLabelElement(0, 0, getWidth(), getHeight()); + lbl.setTextHorizontalAlignment(HorizontalAlignment.CENTER); + lbl.setTextColor(0xffffff00); + addChild(lbl, false); + + //the primary label text + switch(this.__stage) + { + case 0: lbl.setText(BST.gui_qsscreen_upload_stage0()); break; + case 1: lbl.setText(BST.gui_qsscreen_upload_stage1()); break; + case 2: lbl.setText(BST.gui_qsscreen_upload_stage2()); break; + case 3: lbl.setText(BST.gui_qsscreen_upload_stage3()); break; + case 4: + //set final stage label text + final var codeStr = StringUtils.removeEnd("" + this.__quickShareCode, QSC_SUFFIX) + .toUpperCase(Locale.ENGLISH); + final var codeTxt = literal(codeStr).formatted(Formatting.WHITE); + lbl.setText(BST.gui_qsscreen_upload_stage4(codeTxt)); + + //add a "Done" button + final var btn_done = new TButtonWidget((getWidth() / 2) - 75, getHeight() - 30, 150, 20); + btn_done.setText(translatable("gui.done")); + btn_done.setOnClick(__ -> close()); + addChild(btn_done, false); + break; + default: break; + } } // ================================================== private @Internal void __start_onError(@Nullable Exception exception) @@ -98,7 +132,7 @@ public QuickShareUploadScreen(@Nullable Screen parent, IStatsProvider stats) //fetch the upload link CachedResourceManager.getResourceAsync( - Identifier.of(getModID(), "quick_share/upload_url.json"), + Identifier.of(getModID(), "quick_share/latest_upload_url.json"), new IResourceFetchTask() { public ThreadExecutor getMinecraftClientOrServer() { return MC_CLIENT; } diff --git a/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/stats/tabs/BSStatsSharingTab.java b/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/stats/tabs/BSStatsSharingTab.java index 6cc3e96..00bf6c7 100644 --- a/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/stats/tabs/BSStatsSharingTab.java +++ b/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/client/gui/stats/tabs/BSStatsSharingTab.java @@ -11,7 +11,6 @@ import org.apache.commons.lang3.StringUtils; -import io.github.thecsdev.betterstats.BetterStats; import io.github.thecsdev.betterstats.BetterStatsProperties; import io.github.thecsdev.betterstats.api.client.gui.screen.BetterStatsScreen; import io.github.thecsdev.betterstats.api.client.gui.util.StatsTabUtils; @@ -33,7 +32,6 @@ import io.github.thecsdev.tcdcommons.api.util.TextUtils; import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.text.Text; -import net.minecraft.util.Formatting; public class BSStatsSharingTab extends StatsTab { @@ -43,12 +41,7 @@ public class BSStatsSharingTab extends StatsTab // -------------------------------------------------- private static boolean LEGAL_QS_CONSENT = false; // ================================================== - public final @Override Text getName() - { - final var txt = BST.menu_statsSharing(); - return BetterStats.getInstance().getConfig().isFullVersion() ? - txt : txt.formatted(Formatting.YELLOW); - } + public final @Override Text getName() { return BST.menu_statsSharing(); } public final boolean isAvailable() { return false; } // ================================================== public final @Override void initFilters(FiltersInitContext initContext) @@ -101,7 +94,7 @@ private final void init_ssps(StatsInitContext initContext) //the input and submit widgets final var n1 = UILayout.nextChildVerticalRect(panel); n1.y += 3; - final var a = BetterStats.getInstance().getConfig().isFullVersion() && cpnh.isPresent() && cpnh.get().comms(); + final var a = cpnh.isPresent() && cpnh.get().comms(); final var in_name = new TTextFieldWidget(n1.x, n1.y, n1.width - 25, 20); in_name.setPlaceholderText(translatable("gui.abuseReport.type.name")); @@ -197,7 +190,11 @@ private final void init_quickShare_download(StatsInitContext initContext) { final var input = in_qscode.getInput().trim(); if(StringUtils.isBlank(input)) return; - MC_CLIENT.setScreen(new QuickShareDownloadScreen(MC_CLIENT.currentScreen, input).getAsScreen()); + MC_CLIENT.setScreen(new QuickShareDownloadScreen( + GuiUtils.getCurrentScreenParent(), + MC_CLIENT.currentScreen, + input + ).getAsScreen()); }); panel.addChild(btn_submit, false); } diff --git a/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/util/BST.java b/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/util/BST.java index 747aa6d..23d3691 100644 --- a/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/util/BST.java +++ b/betterstats-3-fabric-1.21/src/main/java/io/github/thecsdev/betterstats/util/BST.java @@ -117,5 +117,19 @@ private BST() {} public static final MutableText gui_tpsbs_qs_step1() { return translatable("betterstats.gui.tpsbs.tab.qs.step_1"); } public static final MutableText gui_tpsbs_qs_step2() { return translatable("betterstats.gui.tpsbs.tab.qs.step_2"); } public static final MutableText gui_tpsbs_qs_step2_entrqscode() { return translatable("betterstats.gui.tpsbs.tab.qs.step_2.enter_qscode"); } + // -------------------------------------------------- + public static final MutableText gui_qsscreen_upload_title() { return translatable("betterstats.gui.qs_screen.upload.title"); } + public static final MutableText gui_qsscreen_upload_stage0() { return translatable("betterstats.gui.qs_screen.upload.stage_0"); } + public static final MutableText gui_qsscreen_upload_stage1() { return translatable("betterstats.gui.qs_screen.upload.stage_1"); } + public static final MutableText gui_qsscreen_upload_stage2() { return translatable("betterstats.gui.qs_screen.upload.stage_2"); } + public static final MutableText gui_qsscreen_upload_stage3() { return translatable("betterstats.gui.qs_screen.upload.stage_3"); } + public static final MutableText gui_qsscreen_upload_stage4(Text qsCode) { return translatable("betterstats.gui.qs_screen.upload.stage_4", qsCode); } + // + public static final MutableText gui_qsscreen_download_title() { return translatable("betterstats.gui.qs_screen.download.title"); } + public static final MutableText gui_qsscreen_download_stage0() { return translatable("betterstats.gui.qs_screen.download.stage_0"); } + public static final MutableText gui_qsscreen_download_stage1() { return translatable("betterstats.gui.qs_screen.download.stage_1"); } + public static final MutableText gui_qsscreen_download_stage2() { return translatable("betterstats.gui.qs_screen.download.stage_2"); } + public static final MutableText gui_qsscreen_download_stage3() { return translatable("betterstats.gui.qs_screen.download.stage_3"); } + public static final MutableText gui_qsscreen_download_stage4() { return translatable("betterstats.gui.qs_screen.download.stage_4"); } // ================================================== } \ No newline at end of file diff --git a/betterstats-3-fabric-1.21/src/main/resources/META-INF/jarjar-excluded/tcdcommons-3.12+fabric-1.21.jar b/betterstats-3-fabric-1.21/src/main/resources/META-INF/jarjar-excluded/tcdcommons-3.12+fabric-1.21.jar index d3a52f6..c437c2b 100644 Binary files a/betterstats-3-fabric-1.21/src/main/resources/META-INF/jarjar-excluded/tcdcommons-3.12+fabric-1.21.jar and b/betterstats-3-fabric-1.21/src/main/resources/META-INF/jarjar-excluded/tcdcommons-3.12+fabric-1.21.jar differ diff --git a/betterstats-3-fabric-1.21/src/main/resources/assets/betterstats/lang/en_us.json b/betterstats-3-fabric-1.21/src/main/resources/assets/betterstats/lang/en_us.json index f66bace..a31dc99 100644 --- a/betterstats-3-fabric-1.21/src/main/resources/assets/betterstats/lang/en_us.json +++ b/betterstats-3-fabric-1.21/src/main/resources/assets/betterstats/lang/en_us.json @@ -110,5 +110,20 @@ "betterstats.gui.tpsbs.tab.qs.abuse_notice": "To prevent spam and abuse, rate-limits and other limitations may apply.", "betterstats.gui.tpsbs.tab.qs.step_1": "§eStep 1:\n§7Click the button to quickly share the statistics file you are currently viewing. After that, the stats get uploaded, and you are given a 'quick-share code'.", "betterstats.gui.tpsbs.tab.qs.step_2": "§eStep 2:\n§7The person intended to view the shared statistics then types in the 'quick-share code', and clicks on the button to download and view the shared statistics.", - "betterstats.gui.tpsbs.tab.qs.step_2.enter_qscode": "Enter the quick-share code here" + "betterstats.gui.tpsbs.tab.qs.step_2.enter_qscode": "Enter the quick-share code here", + + + "betterstats.gui.qs_screen.upload.title": "Uploading quick-share statistics...", + "betterstats.gui.qs_screen.upload.stage_0": "Preparting to upload the statistics...", + "betterstats.gui.qs_screen.upload.stage_1": "Fetching better-stats API endpoint URLs...", + "betterstats.gui.qs_screen.upload.stage_2": "Fetching cloud upload API endpoint URL...", + "betterstats.gui.qs_screen.upload.stage_3": "Uploading statistics to the cloud...", + "betterstats.gui.qs_screen.upload.stage_4": "Done. Your quick-share code is: %s", + + "betterstats.gui.qs_screen.download.title": "Downloading quick-share statistics...", + "betterstats.gui.qs_screen.download.stage_0": "Preparting to download the statistics...", + "betterstats.gui.qs_screen.download.stage_1": "Fetching better-stats API endpoint URLs...", + "betterstats.gui.qs_screen.download.stage_2": "Fetching cloud download API endpoint URL...", + "betterstats.gui.qs_screen.download.stage_3": "Downloading statistics from the cloud...", + "betterstats.gui.qs_screen.download.stage_4": "Done. Loading the downloaded statistics..." } \ No newline at end of file