From 0b9ad30ad671efbf1fbf38ef1543c63b9c5a1123 Mon Sep 17 00:00:00 2001 From: glowredman Date: Tue, 28 Jun 2022 22:15:29 +0200 Subject: [PATCH] sync remote/local `allowDeletions=true`: If a remote location has updated its default server list, add the new entries to the local list too. --- .../glowredman/defaultserverlist/Config.java | 67 ++++++++++++------- .../mixins/ServerListMixin.java | 17 ++--- 2 files changed, 51 insertions(+), 33 deletions(-) diff --git a/src/main/java/glowredman/defaultserverlist/Config.java b/src/main/java/glowredman/defaultserverlist/Config.java index 176b931..1891951 100644 --- a/src/main/java/glowredman/defaultserverlist/Config.java +++ b/src/main/java/glowredman/defaultserverlist/Config.java @@ -3,6 +3,7 @@ import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.annotations.SerializedName; import cpw.mods.fml.common.FMLLog; import java.io.File; import java.io.IOException; @@ -13,17 +14,16 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; +import java.util.Collection; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import net.minecraft.client.multiplayer.ServerData; import org.apache.commons.io.IOUtils; public class Config { - public static boolean allowDeletions; - public static String url; + public static ConfigObj config = new ConfigObj(); public static final List SERVERS = new ArrayList<>(); private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private static Path configPath; @@ -32,7 +32,6 @@ public static void preInit(File configDir) { Reader fileReader = null; try { configPath = configDir.toPath().resolve("defaultserverlist.json"); - ConfigObj config = new ConfigObj(); if (!Files.exists(configPath)) { saveConfig(config); @@ -41,27 +40,46 @@ public static void preInit(File configDir) { config = GSON.fromJson(fileReader, ConfigObj.class); } - allowDeletions = config.allowDeletions; - url = config.url; - - Map servers; if (config.useURL) { - servers = GSON.fromJson( - IOUtils.toString(new URL(config.url), StandardCharsets.UTF_8), - new TypeToken>() { - private static final long serialVersionUID = -1786059589535074931L; - }.getType()); - ConfigObj newConfig = new ConfigObj(servers); - newConfig.useURL = !allowDeletions; - saveConfig(newConfig); - } else { - servers = config.servers; - } + try { + // servers that are currently at the remote location + Map remoteDefaultServers = GSON.fromJson( + IOUtils.toString(new URL(config.url), StandardCharsets.UTF_8), + new TypeToken>() { + private static final long serialVersionUID = -1786059589535074931L; + }.getType()); + + if (config.allowDeletions) { + // servers that were added to the remote location since the last time the list was fetched + Map diff = new LinkedHashMap<>(); - for (Entry e : servers.entrySet()) { - SERVERS.add(new ServerData(e.getKey(), e.getValue())); + // calculate diff + remoteDefaultServers.forEach((name, ip) -> { + if (!config.prevDefaultServers.contains(ip)) { + diff.put(name, ip); + } + }); + + // save if the remote location was updated + if (!diff.isEmpty()) { + config.servers.putAll(diff); + config.prevDefaultServers = remoteDefaultServers.values(); + saveConfig(config); + } + + } else { + config.servers = remoteDefaultServers; + saveConfig(config); + } + } catch (Exception e) { + FMLLog.warning( + "Could not get default server list from default location! Are you connected to the internet?"); + e.printStackTrace(); + } } + config.servers.forEach((name, ip) -> SERVERS.add(new ServerData(name, ip))); + } catch (Exception e) { FMLLog.severe("Could not parse default server list!"); e.printStackTrace(); @@ -83,7 +101,10 @@ public static final class ConfigObj { public boolean useURL = false; public boolean allowDeletions = true; public String url = ""; - public Map servers = new HashMap<>(); + public Map servers = new LinkedHashMap<>(); + + @SerializedName("DO_NOT_EDIT_prevDefaultServers") + public Collection prevDefaultServers = new ArrayList<>(); public ConfigObj() {} diff --git a/src/main/java/glowredman/defaultserverlist/mixins/ServerListMixin.java b/src/main/java/glowredman/defaultserverlist/mixins/ServerListMixin.java index 7b11e64..cbe16ff 100644 --- a/src/main/java/glowredman/defaultserverlist/mixins/ServerListMixin.java +++ b/src/main/java/glowredman/defaultserverlist/mixins/ServerListMixin.java @@ -1,8 +1,7 @@ package glowredman.defaultserverlist.mixins; import glowredman.defaultserverlist.Config; -import glowredman.defaultserverlist.Config.ConfigObj; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import net.minecraft.client.multiplayer.ServerData; @@ -54,14 +53,12 @@ private void removeDuplicateServers(CallbackInfo ci) { */ @Inject(at = @At("TAIL"), method = "saveServerList()V") private void saveDefaultServerList(CallbackInfo ci) { - if (Config.allowDeletions) { + if (Config.config.allowDeletions) { try { - Map map = new HashMap<>(); - Config.SERVERS.forEach(sd -> map.put(sd.serverName, sd.serverIP)); - ConfigObj newConfig = new ConfigObj(map); - newConfig.allowDeletions = Config.allowDeletions; - newConfig.url = Config.url; - Config.saveConfig(newConfig); + Map newServers = new LinkedHashMap<>(); + Config.SERVERS.forEach(serverData -> newServers.put(serverData.serverName, serverData.serverIP)); + Config.config.servers = newServers; + Config.saveConfig(Config.config); } catch (Exception e) { e.printStackTrace(); } @@ -90,7 +87,7 @@ public ServerData getServerData(int index) { public void removeServerData(int index) { if (index < servers.size()) { servers.remove(index); - } else if (Config.allowDeletions) { + } else if (Config.config.allowDeletions) { Config.SERVERS.remove(index - servers.size()); } }