Skip to content

Commit 538a9a1

Browse files
Add caching and fallback for modal data
1 parent 11d35d3 commit 538a9a1

File tree

5 files changed

+50
-9
lines changed

5 files changed

+50
-9
lines changed

src/main/java/gg/essential/ad/EssentialAPI.java

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.apache.commons.io.IOUtils;
77

88
import java.io.BufferedReader;
9+
import java.io.BufferedWriter;
910
import java.io.IOException;
1011
import java.io.InputStream;
1112
import java.net.HttpURLConnection;
@@ -14,6 +15,7 @@
1415
import java.nio.file.Files;
1516
import java.nio.file.Path;
1617
import java.util.Base64;
18+
import java.util.Objects;
1719
import java.util.concurrent.CompletableFuture;
1820

1921
public class EssentialAPI {
@@ -26,6 +28,8 @@ public class EssentialAPI {
2628

2729
private static final String USER_AGENT = "EssentialAd/" + EssentialAdLoader.OUR_VERSION + " (" + EssentialAdLoader.OUR_PKG + ")";
2830

31+
private static final Path API_CACHE_FILE = AdConfig.CONFIG_FOLDER.resolve("data.cache.json");
32+
2933
private static final Path API_OVERRIDE_FILE = AdConfig.CONFIG_FOLDER.resolve("data.override.json");
3034
private static final Path MODAL_OVERRIDE_FOLDER = AdConfig.CONFIG_FOLDER.resolve("override");
3135
private static final Path MODAL_OVERRIDE_FILE = MODAL_OVERRIDE_FOLDER.resolve("mod-partner-modal-metadata.json");
@@ -40,6 +44,8 @@ public static CompletableFuture<AdData> fetchAdData() {
4044
AdData data = EssentialAd.GSON.fromJson(reader, AdData.class);
4145
future.complete(data);
4246
return;
47+
} catch (Exception e) {
48+
EssentialAd.LOGGER.error("Failed to load api override", e);
4349
}
4450
}
4551

@@ -55,10 +61,16 @@ public static CompletableFuture<AdData> fetchAdData() {
5561
response = IOUtils.toString(is, StandardCharsets.UTF_8);
5662
}
5763

64+
try (BufferedWriter writer = Files.newBufferedWriter(API_CACHE_FILE)) {
65+
writer.write(response);
66+
} catch (Exception e) {
67+
EssentialAd.LOGGER.error("Failed to write cached response", e);
68+
}
69+
5870
AdData data = EssentialAd.GSON.fromJson(response, AdData.class);
5971

6072
if (Files.exists(MODAL_OVERRIDE_FILE)) {
61-
EssentialAd.LOGGER.info("Using modal override file");
73+
EssentialAd.LOGGER.info("Using modal override folder");
6274
try (BufferedReader reader = Files.newBufferedReader(MODAL_OVERRIDE_FILE)) {
6375
ModalData modalData = EssentialAd.GSON.fromJson(reader, ModalData.class);
6476
// Replace image paths with base64 representation
@@ -74,15 +86,42 @@ public static CompletableFuture<AdData> fetchAdData() {
7486
}
7587

7688
data = new AdData(modalData, data.getPartneredMods());
89+
} catch (Exception e) {
90+
EssentialAd.LOGGER.error("Failed to load modal override", e);
7791
}
7892
}
7993

8094
future.complete(data);
8195
} catch (Exception e) {
8296
EssentialAd.LOGGER.error("Failed to fetch modal data", e);
83-
future.completeExceptionally(e);
97+
98+
try {
99+
future.complete(getFallbackData());
100+
} catch (Exception e2) {
101+
EssentialAd.LOGGER.error("Failed to load fallback modal data", e2);
102+
future.completeExceptionally(e2);
103+
}
84104
}
85105
});
86106
return future;
87107
}
108+
109+
private static AdData getFallbackData() throws IOException {
110+
if (Files.exists(API_CACHE_FILE)) {
111+
try (BufferedReader reader = Files.newBufferedReader(API_CACHE_FILE)) {
112+
AdData data = EssentialAd.GSON.fromJson(reader, AdData.class);
113+
EssentialAd.LOGGER.info("Loaded cached response");
114+
return data;
115+
} catch (Exception e) {
116+
EssentialAd.LOGGER.error("Failed to load cached response", e);
117+
}
118+
}
119+
120+
try (InputStream is = EssentialAd.class.getResourceAsStream("assets/data.fallback.json")) {
121+
Objects.requireNonNull(is, "Fallback data missing!");
122+
AdData data = EssentialAd.GSON.fromJson(IOUtils.toString(is, StandardCharsets.UTF_8), AdData.class);
123+
EssentialAd.LOGGER.info("Loaded fallback data");
124+
return data;
125+
}
126+
}
88127
}

src/main/java/gg/essential/ad/EssentialAd.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,8 @@ private void createButton(
198198
try {
199199
data = adDataFuture.join();
200200
} catch (CompletionException e) {
201-
ModalManager.INSTANCE.setModal(TwoButtonModal.errorModal()); // fixme, replace with better wording
201+
// This should only happen if the fallback data fails to load, which shouldn't happen.
202+
ModalManager.INSTANCE.setModal(TwoButtonModal.installFailed());
202203
return;
203204
}
204205
ModalManager.INSTANCE.setModal(new AdModal(data.getModal(), getPartnerMods(data)));

src/main/java/gg/essential/ad/modal/AdModal.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public void init() {
6969
if (success) {
7070
ModalManager.INSTANCE.setModal(TwoButtonModal.postInstall());
7171
} else {
72-
ModalManager.INSTANCE.setModal(TwoButtonModal.errorModal());
72+
ModalManager.INSTANCE.setModal(TwoButtonModal.installFailed());
7373
}
7474
}));
7575

src/main/java/gg/essential/ad/modal/TwoButtonModal.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,14 @@ public static TwoButtonModal removeAds() {
6666
);
6767
}
6868

69-
public static TwoButtonModal errorModal() {
69+
public static TwoButtonModal installFailed() {
7070
return new TwoButtonModal(
71-
"Something went wrong\ninstalling Essential.",
72-
(x, y, width) -> new ModalButton(x, y, width, ButtonColor.BLUE, "Install Manually", () -> {
73-
UDesktop.browse("https://essential.gg");
71+
"Essential Mod failed to install.\nSomething went wrong.",
72+
(x, y, width) -> new ModalButton(x, y, width, ButtonColor.GRAY, "Okay", () -> {
7473
ModalManager.INSTANCE.setModal(null);
7574
}),
76-
(x, y, width) -> new ModalButton(x, y, width, ButtonColor.GRAY, "Okay", () -> {
75+
(x, y, width) -> new ModalButton(x, y, width, ButtonColor.BLUE, "Download", () -> {
76+
UDesktop.browse("https://essential.gg/download");
7777
ModalManager.INSTANCE.setModal(null);
7878
})
7979
);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"modal":{"subtitle":{"en_us":"Enhanced Minecraft features\nin one simple mod."},"features":[{"icon":"iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAdnJLH8AAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABxJREFUeNpjIA38BwMcUhgqITSGOoQgE1SAmgAAnF0T74BR+HYAAAAASUVORK5CYII\u003d","text":{"en_us":"Host worlds for free"}},{"icon":"iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAdnJLH8AAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAB1JREFUeNpjIAX8BwKsggSk4QwMFQhBBIuJgSIAAFXcJ9u/0PnYAAAAAElFTkSuQmCC","text":{"en_us":"Chat with friends"}},{"icon":"iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAdnJLH8AAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAACJJREFUeNpjwAn+AwGMhgmhAYQQpjBCCsJDNQIhQFiQRAAAQKhPseGsT84AAAAASUVORK5CYII\u003d","text":{"en_us":"Create custom outfits"}},{"icon":"iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAdnJLH8AAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAB9JREFUeNpjwAn+AwGERAihABIEYQBVCE0YiwsYyAAA8LFDvSmEnMMAAAAASUVORK5CYII\u003d","text":{"en_us":"React with emotes"}},{"icon":"iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAAH0lEQVR42mPAC/7/Jyz4HwVgCKOpxiEEIVEE4TSJAAAK4S3TgTZ+bwAAAABJRU5ErkJggg\u003d\u003d","text":{"en_us":"Support __mod makers__"},"tooltip":{"en_us":"MOD_PARTNERS"}}],"links":{"learn_more":"https://essential.gg/mod-partners"}},"partnered_mods":[]}

0 commit comments

Comments
 (0)