From 1772fa65411adafe548ccbff1f66b9b2b86e2a4f Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Sun, 6 Jul 2025 11:57:25 +0800 Subject: [PATCH 1/3] try update if possible --- .../relauncher/download/CleanroomRelease.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cleanroommc/relauncher/download/CleanroomRelease.java b/src/main/java/com/cleanroommc/relauncher/download/CleanroomRelease.java index 6b001fb..82af99d 100644 --- a/src/main/java/com/cleanroommc/relauncher/download/CleanroomRelease.java +++ b/src/main/java/com/cleanroommc/relauncher/download/CleanroomRelease.java @@ -13,25 +13,38 @@ import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.Arrays; +import java.util.ArrayList; import java.util.List; +import java.util.HashMap; public class CleanroomRelease { private static final Path CACHE_FILE = CleanroomRelauncher.CACHE_DIR.resolve("releases.json"); - public static List queryAll() throws IOException { + public static List queryAll(boolean force) throws IOException { + HashMap map = new HashMap<>(); + // Check if the cache file exists and is not outdated if (Files.exists(CACHE_FILE)) { CleanroomRelauncher.LOGGER.info("Loading releases from cached releases.json"); try { - return fetchReleasesFromCache(CACHE_FILE); + for(CleanroomRelease cleanroomRelease : fetchReleasesFromCache(CACHE_FILE)){ + map.put(cleanroomRelease.name, cleanroomRelease); + } } catch (IOException e) { Files.deleteIfExists(CACHE_FILE); CleanroomRelauncher.LOGGER.error("Unable to read cached releases.json, attempting to connect to GitHub and rebuild.", e); } + } else { + CleanroomRelauncher.LOGGER.info("No cache found, fetching releases..."); + } + + if (!Files.exists(CACHE_FILE) || force) { + for(CleanroomRelease cleanroomRelease : fetchReleasesFromGithub()){ + map.put(cleanroomRelease.name, cleanroomRelease); + } } - CleanroomRelauncher.LOGGER.info("No cache found, fetching releases..."); - List releases = fetchReleasesFromGithub(); + List releases = new ArrayList<>(map.values()); // After fetching releases, save them to the cache saveReleasesToCache(CACHE_FILE, releases); @@ -39,6 +52,10 @@ public static List queryAll() throws IOException { return releases; } + public static List queryAll() throws IOException { + return queryAll(true); + } + private static List fetchReleasesFromGithub() throws IOException { try { URL url = new URL("https://api.github.com/repos/CleanroomMC/Cleanroom/releases"); From 53af6c583c72142753b5ffc25e6bc69b12d0a6f7 Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Sun, 6 Jul 2025 11:59:54 +0800 Subject: [PATCH 2/3] try? --- .../relauncher/download/CleanroomRelease.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/cleanroommc/relauncher/download/CleanroomRelease.java b/src/main/java/com/cleanroommc/relauncher/download/CleanroomRelease.java index 82af99d..f208901 100644 --- a/src/main/java/com/cleanroommc/relauncher/download/CleanroomRelease.java +++ b/src/main/java/com/cleanroommc/relauncher/download/CleanroomRelease.java @@ -21,7 +21,7 @@ public class CleanroomRelease { private static final Path CACHE_FILE = CleanroomRelauncher.CACHE_DIR.resolve("releases.json"); - public static List queryAll(boolean force) throws IOException { + public static List queryAll() throws IOException { HashMap map = new HashMap<>(); // Check if the cache file exists and is not outdated @@ -39,9 +39,13 @@ public static List queryAll(boolean force) throws IOException CleanroomRelauncher.LOGGER.info("No cache found, fetching releases..."); } - if (!Files.exists(CACHE_FILE) || force) { - for(CleanroomRelease cleanroomRelease : fetchReleasesFromGithub()){ - map.put(cleanroomRelease.name, cleanroomRelease); + if (!Files.exists(CACHE_FILE)) { + try { + for(CleanroomRelease cleanroomRelease : fetchReleasesFromGithub()){ + map.put(cleanroomRelease.name, cleanroomRelease); + } + } catch (Throwable t) { + } } List releases = new ArrayList<>(map.values()); @@ -52,10 +56,6 @@ public static List queryAll(boolean force) throws IOException return releases; } - public static List queryAll() throws IOException { - return queryAll(true); - } - private static List fetchReleasesFromGithub() throws IOException { try { URL url = new URL("https://api.github.com/repos/CleanroomMC/Cleanroom/releases"); From f682aad20b1b4ac314b18cd1a5f60c30cbc5341d Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Sun, 6 Jul 2025 12:21:45 +0800 Subject: [PATCH 3/3] update a reflesh botton --- .../relauncher/download/CleanroomRelease.java | 32 +++--- .../relauncher/gui/RelauncherGUI.java | 99 +++++++++++-------- 2 files changed, 81 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/cleanroommc/relauncher/download/CleanroomRelease.java b/src/main/java/com/cleanroommc/relauncher/download/CleanroomRelease.java index f208901..9c0454c 100644 --- a/src/main/java/com/cleanroommc/relauncher/download/CleanroomRelease.java +++ b/src/main/java/com/cleanroommc/relauncher/download/CleanroomRelease.java @@ -21,8 +21,9 @@ public class CleanroomRelease { private static final Path CACHE_FILE = CleanroomRelauncher.CACHE_DIR.resolve("releases.json"); - public static List queryAll() throws IOException { + public static List queryAll(boolean update) throws IOException { HashMap map = new HashMap<>(); + boolean updated = false; // Check if the cache file exists and is not outdated if (Files.exists(CACHE_FILE)) { @@ -35,27 +36,36 @@ public static List queryAll() throws IOException { Files.deleteIfExists(CACHE_FILE); CleanroomRelauncher.LOGGER.error("Unable to read cached releases.json, attempting to connect to GitHub and rebuild.", e); } + if (update) { + try { + updated = true; + for(CleanroomRelease cleanroomRelease : fetchReleasesFromGithub()){ + map.put(cleanroomRelease.name, cleanroomRelease); + } + } catch (IOException e) { + CleanroomRelauncher.LOGGER.error("Unable to fetch from GitHub", e); + } + } } else { CleanroomRelauncher.LOGGER.info("No cache found, fetching releases..."); - } - - if (!Files.exists(CACHE_FILE)) { - try { - for(CleanroomRelease cleanroomRelease : fetchReleasesFromGithub()){ - map.put(cleanroomRelease.name, cleanroomRelease); - } - } catch (Throwable t) { - + updated = true; + for(CleanroomRelease cleanroomRelease : fetchReleasesFromGithub()){ + map.put(cleanroomRelease.name, cleanroomRelease); } } List releases = new ArrayList<>(map.values()); // After fetching releases, save them to the cache - saveReleasesToCache(CACHE_FILE, releases); + if (updated) + saveReleasesToCache(CACHE_FILE, releases); return releases; } + public static List queryAll() throws IOException { + return queryAll(false); + } + private static List fetchReleasesFromGithub() throws IOException { try { URL url = new URL("https://api.github.com/repos/CleanroomMC/Cleanroom/releases"); diff --git a/src/main/java/com/cleanroommc/relauncher/gui/RelauncherGUI.java b/src/main/java/com/cleanroommc/relauncher/gui/RelauncherGUI.java index 4b0bd23..eb14ba2 100644 --- a/src/main/java/com/cleanroommc/relauncher/gui/RelauncherGUI.java +++ b/src/main/java/com/cleanroommc/relauncher/gui/RelauncherGUI.java @@ -191,7 +191,7 @@ public void windowClosing(WindowEvent e) { JLabel cleanroomLogo = new JLabel(new ImageIcon(frame.getIconImage().getScaledInstance(80, 80, Image.SCALE_SMOOTH))); - JPanel cleanroomPickerPanel = this.initializeCleanroomPicker(eligibleReleases); + JPanel cleanroomPickerPanel = new CleanroomPickerPanel(eligibleReleases); mainPanel.add(cleanroomPickerPanel); JPanel javaPickerPanel = this.initializeJavaPicker(); @@ -227,49 +227,70 @@ public void windowClosing(WindowEvent e) { this.setAutoRequestFocus(true); } - private JPanel initializeCleanroomPicker(List eligibleReleases) { - // Main Panel - JPanel cleanroomPicker = new JPanel(new BorderLayout(5, 0)); - cleanroomPicker.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + private class CleanroomPickerPanel extends JPanel { - JPanel select = new JPanel(); - select.setLayout(new BoxLayout(select, BoxLayout.Y_AXIS)); - cleanroomPicker.add(select); + private DefaultComboBoxModel releasesList; - // Title label - JLabel title = new JLabel("Select Cleanroom Version:"); - title.setAlignmentX(Component.LEFT_ALIGNMENT); - select.add(title); - select.add(Box.createRigidArea(new Dimension(0, 5))); - - // Create dropdown panel - JPanel dropdown = new JPanel(new BorderLayout(5, 5)); - dropdown.setAlignmentX(Component.LEFT_ALIGNMENT); - select.add(dropdown); - - // Create the dropdown with release versions - JComboBox releaseBox = new JComboBox<>(); - DefaultComboBoxModel releaseModel = new DefaultComboBoxModel<>(); - for (CleanroomRelease release : eligibleReleases) { - releaseModel.addElement(release); - } - releaseBox.setModel(releaseModel); - releaseBox.setRenderer(new DefaultListCellRenderer() { - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (value instanceof CleanroomRelease) { - setText(((CleanroomRelease) value).name); + public CleanroomPickerPanel(List eligibleReleases) { + super(new BorderLayout(5, 0)); + + JPanel select = new JPanel(); + select.setLayout(new BoxLayout(select, BoxLayout.Y_AXIS)); + CleanroomPickerPanel.this.add(select); + + // Title label + JLabel title = new JLabel("Select Cleanroom Version:"); + title.setAlignmentX(Component.LEFT_ALIGNMENT); + select.add(title); + select.add(Box.createRigidArea(new Dimension(0, 5))); + + // Create dropdown panel + JPanel dropdown = new JPanel(new BorderLayout(5, 5)); + dropdown.setAlignmentX(Component.LEFT_ALIGNMENT); + select.add(dropdown); + + // Create the dropdown with release versions + JComboBox releaseBox = new JComboBox<>(); + DefaultComboBoxModel releaseModel = CleanroomPickerPanel.this.releasesList = new DefaultComboBoxModel<>(); + for (CleanroomRelease release : eligibleReleases) { + releaseModel.addElement(release); + } + releaseBox.setModel(releaseModel); + releaseBox.setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value instanceof CleanroomRelease) { + setText(((CleanroomRelease) value).name); + } + return this; } - return this; + }); + releaseBox.setSelectedItem(RelauncherGUI.this.selected); + releaseBox.setMaximumRowCount(5); + releaseBox.addActionListener(e -> RelauncherGUI.this.selected = (CleanroomRelease) releaseBox.getSelectedItem()); + dropdown.add(releaseBox, BorderLayout.CENTER); + + JButton refreshButton = new JButton("⟳"); + refreshButton.setFont(refreshButton.getFont().deriveFont(16f)); + refreshButton.setPreferredSize(new Dimension(32, 28)); + refreshButton.addActionListener(e -> { + updateReleases(CleanroomRelease.queryAll(true)); + }); + dropdown.add(refreshButton, BorderLayout.EAST); + } + + public void addReleases(CleanroomRelease element) { + CleanroomPickerPanel.this.releasesList.addElement(element); + } + + public void updateReleases(List eligibleReleases) { + CleanroomPickerPanel.this.releasesList.removeAllElements(); + for (CleanroomRelease release : eligibleReleases) { + CleanroomPickerPanel.this.releasesList.addElement(release); } - }); - releaseBox.setSelectedItem(selected); - releaseBox.setMaximumRowCount(5); - releaseBox.addActionListener(e -> selected = (CleanroomRelease) releaseBox.getSelectedItem()); - dropdown.add(releaseBox, BorderLayout.CENTER); + } - return cleanroomPicker; } private JPanel initializeJavaPicker() {