From 4a48e1a3a32f9a3b0b72be897377443c65ea55e8 Mon Sep 17 00:00:00 2001
From: sowgro <tpoke.ferrari@gmail.com>
Date: Sat, 29 Jun 2024 23:45:42 -0400
Subject: Make file writing actually work, reorganize managers

---
 src/main/java/com/MylesAndMore/Tumble/Main.java    |  9 +--
 .../com/MylesAndMore/Tumble/commands/Remove.java   |  2 +-
 .../MylesAndMore/Tumble/config/ArenaManager.java   | 93 ++++++++++------------
 .../MylesAndMore/Tumble/config/ConfigManager.java  | 10 +--
 .../MylesAndMore/Tumble/config/CustomConfig.java   | 56 +++++++++++++
 .../Tumble/config/LanguageManager.java             | 30 +------
 6 files changed, 110 insertions(+), 90 deletions(-)
 create mode 100644 src/main/java/com/MylesAndMore/Tumble/config/CustomConfig.java

(limited to 'src/main/java')

diff --git a/src/main/java/com/MylesAndMore/Tumble/Main.java b/src/main/java/com/MylesAndMore/Tumble/Main.java
index 6e2123c..eff7a10 100644
--- a/src/main/java/com/MylesAndMore/Tumble/Main.java
+++ b/src/main/java/com/MylesAndMore/Tumble/Main.java
@@ -18,15 +18,14 @@ public class Main extends JavaPlugin{
     @Override
     public void onEnable() {
         plugin = this;
-        ArenaManager.loadConfig();
-        ConfigManager.loadConfig();
-        LanguageManager.loadConfig();
+
+        LanguageManager.init();
+        ArenaManager.init();
+        ConfigManager.init();
 
         Objects.requireNonNull(this.getCommand("tumble")).setExecutor(new Tumble());
         new Metrics(this, 16940);
 
-        this.saveDefaultConfig(); // Saves the default config file (packaged in the JAR) if we haven't already
-
         Bukkit.getServer().getLogger().info("[Tumble] Tumble successfully enabled!");
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/MylesAndMore/Tumble/commands/Remove.java b/src/main/java/com/MylesAndMore/Tumble/commands/Remove.java
index 1d28993..32ee232 100644
--- a/src/main/java/com/MylesAndMore/Tumble/commands/Remove.java
+++ b/src/main/java/com/MylesAndMore/Tumble/commands/Remove.java
@@ -39,7 +39,7 @@ public class Remove implements SubCommand, CommandExecutor, TabCompleter {
 
         ArenaManager.arenas.remove(arenaName);
         ArenaManager.WriteConfig();
-        sender.sendMessage(LanguageManager.fromKey("set-success"));
+        sender.sendMessage(LanguageManager.fromKey("remove-success"));
         return true;
     }
 
diff --git a/src/main/java/com/MylesAndMore/Tumble/config/ArenaManager.java b/src/main/java/com/MylesAndMore/Tumble/config/ArenaManager.java
index 4d5b782..911b02e 100644
--- a/src/main/java/com/MylesAndMore/Tumble/config/ArenaManager.java
+++ b/src/main/java/com/MylesAndMore/Tumble/config/ArenaManager.java
@@ -7,42 +7,24 @@ import org.bukkit.Bukkit;
 import org.bukkit.Location;
 import org.bukkit.World;
 import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.configuration.InvalidConfigurationException;
 import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
 import org.bukkit.entity.Player;
 import org.jetbrains.annotations.Nullable;
 
-import java.io.File;
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.Objects;
 
 import static com.MylesAndMore.Tumble.Main.plugin;
 
 public class ArenaManager {
-    private static FileConfiguration config;
+
     public static HashMap<String, Arena> arenas;
 
-    public static void loadConfig() {
-        String fileName = "arenas.yml";
-        // create config
-        File customConfigFile = new File(plugin.getDataFolder(), fileName);
-        if (!customConfigFile.exists()) {
-            customConfigFile.getParentFile().mkdirs();
-            plugin.saveResource(fileName, false);
-        }
+    private static final CustomConfig customConfig = new CustomConfig("arenas.yml");
+    private static final FileConfiguration config = customConfig.getConfig();
 
-        config = new YamlConfiguration();
-        try {
-            config.load(customConfigFile);
-        } catch (IOException | InvalidConfigurationException e) {
-            e.printStackTrace();
-        }
-        /* User Edit:
-            Instead of the above Try/Catch, you can also use
-            YamlConfiguration.loadConfiguration(customConfigFile)
-        */
+    public static void init() {
+        customConfig.saveDefaultConfig();
         readConfig();
     }
 
@@ -50,6 +32,7 @@ public class ArenaManager {
      * Reads config file and populates values above
      */
     public static void readConfig() {
+
         // arenas
         ConfigurationSection arenasSection = config.getConfigurationSection("arenas");
         if (arenasSection == null) {
@@ -96,15 +79,43 @@ public class ArenaManager {
         }
     }
 
+    public static void WriteConfig() {
+        config.set("arenas", null); // clear everything
+
+        for (Arena arena: arenas.values()) {
+            WriteWorld("arenas." + arena.name + ".game-spawn", arena.gameSpawn);
+            WriteWorld("arenas." + arena.name + ".lobby", arena.lobby);
+            WriteWorld("arenas." + arena.name + ".winner-lobby", arena.winnerLobby);
+            WriteWorld("arenas." + arena.name + ".wait-area", arena.waitArea);
+        }
+
+        customConfig.saveConfig();
+
+    }
+
+    /**
+     * Searches all arenas for a game that player p is in
+     * @param p Player to search for
+     * @return the game the player is in, or null if not found
+     */
+    public static Game findGamePlayerIsIn(Player p) {
+        for (Arena a : arenas.values()) {
+            if (a.game != null && a.game.gamePlayers.contains(p)) {
+                return a.game;
+            }
+        }
+        return null;
+    }
+
     /**
      * tries to convert a config section in the following format to a world
      * section:
-     *   x: 
-     *   y: 
+     *   x:
+     *   y:
      *   z:
      *   world:
      * @param section the section in the yaml with x, y, z, and world as its children
-     * @return result of either: 
+     * @return result of either:
      *   success = true and a world
      *   success = false and an error string
      */
@@ -134,43 +145,21 @@ public class ArenaManager {
         return new Result<>(new Location(world,x,y,z));
     }
 
-    public static void WriteConfig() {
-
-        for (Arena arena: arenas.values()) {
-            WriteWorld("arenas."+arena.name+".game-spawn", arena.gameSpawn);
-            WriteWorld("arenas."+arena.name+".lobby", arena.lobby);
-            WriteWorld("arenas."+arena.name+".winner-lobby", arena.winnerLobby);
-            WriteWorld("arenas."+arena.name+".wait-area", arena.waitArea);
+    private static void WriteWorld(String path, @Nullable Location location) {
+        if (location == null) {
+            return;
         }
 
-        plugin.saveConfig();
-
-    }
-
-    private static void WriteWorld(String path, Location location) {
         ConfigurationSection section = config.getConfigurationSection(path);
 
         if (section == null) {
-            section = plugin.getConfig().createSection(path);
+            section = config.createSection(path);
         }
 
         section.set("x", location.getX());
         section.set("y", location.getY());
         section.set("z", location.getZ());
         section.set("world", Objects.requireNonNull(location.getWorld()).getName());
-    }
 
-    /**
-     * Searches all arenas for a game that player p is in
-     * @param p Player to search for
-     * @return the game the player is in, or null if not found
-     */
-    public static Game findGamePlayerIsIn(Player p) {
-        for (Arena a : arenas.values()) {
-            if (a.game != null && a.game.gamePlayers.contains(p)) {
-                return a.game;
-            }
-        }
-        return null;
     }
 }
diff --git a/src/main/java/com/MylesAndMore/Tumble/config/ConfigManager.java b/src/main/java/com/MylesAndMore/Tumble/config/ConfigManager.java
index 9dfce99..322f949 100644
--- a/src/main/java/com/MylesAndMore/Tumble/config/ConfigManager.java
+++ b/src/main/java/com/MylesAndMore/Tumble/config/ConfigManager.java
@@ -2,16 +2,15 @@ package com.MylesAndMore.Tumble.config;
 
 import org.bukkit.configuration.file.FileConfiguration;
 
-import static com.MylesAndMore.Tumble.Main.plugin;
-
 public class ConfigManager {
-    private static FileConfiguration config;
+    private static final CustomConfig customConfig = new CustomConfig("config.yml");
+    private static final FileConfiguration config = customConfig.getConfig();
 
     public static boolean HideLeaveJoin;
     public static int waitDuration;
 
-    public static void loadConfig() {
-        config = plugin.getConfig();
+    public static void init() {
+        customConfig.saveDefaultConfig();
         readConfig();
     }
 
@@ -20,5 +19,4 @@ public class ConfigManager {
         waitDuration = config.getInt("wait-duration", 15);
     }
 
-
 }
diff --git a/src/main/java/com/MylesAndMore/Tumble/config/CustomConfig.java b/src/main/java/com/MylesAndMore/Tumble/config/CustomConfig.java
new file mode 100644
index 0000000..20a0aa5
--- /dev/null
+++ b/src/main/java/com/MylesAndMore/Tumble/config/CustomConfig.java
@@ -0,0 +1,56 @@
+package com.MylesAndMore.Tumble.config;
+
+import com.google.common.base.Charsets;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.logging.Level;
+
+import static com.MylesAndMore.Tumble.Main.plugin;
+
+public class CustomConfig {
+    private FileConfiguration newConfig = null;
+    private final File configFile;
+    private final String fileName;
+
+    public CustomConfig(String fileName) {
+        this.fileName = fileName;
+        this.configFile = new File(plugin.getDataFolder(), fileName);
+    }
+
+    public FileConfiguration getConfig() {
+        if (newConfig == null) {
+            reloadConfig();
+        }
+        return newConfig;
+    }
+
+    public void reloadConfig() {
+        newConfig = YamlConfiguration.loadConfiguration(configFile);
+
+        final InputStream defConfigStream = plugin.getResource(fileName);
+        if (defConfigStream == null) {
+            return;
+        }
+
+        newConfig.setDefaults(YamlConfiguration.loadConfiguration(new InputStreamReader(defConfigStream, Charsets.UTF_8)));
+    }
+
+    public void saveConfig() {
+        try {
+            getConfig().save(configFile);
+        } catch (IOException ex) {
+            plugin.getLogger().log(Level.SEVERE, "Could not save config to " + configFile, ex);
+        }
+    }
+
+    public void saveDefaultConfig() {
+        if (!configFile.exists()) {
+            plugin.saveResource(fileName, false);
+        }
+    }
+}
diff --git a/src/main/java/com/MylesAndMore/Tumble/config/LanguageManager.java b/src/main/java/com/MylesAndMore/Tumble/config/LanguageManager.java
index dc49aa5..f214902 100644
--- a/src/main/java/com/MylesAndMore/Tumble/config/LanguageManager.java
+++ b/src/main/java/com/MylesAndMore/Tumble/config/LanguageManager.java
@@ -1,40 +1,18 @@
 package com.MylesAndMore.Tumble.config;
 
 import org.bukkit.ChatColor;
-import org.bukkit.configuration.InvalidConfigurationException;
 import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
-
-import java.io.File;
-import java.io.IOException;
 
 import static com.MylesAndMore.Tumble.Main.plugin;
 
 public class LanguageManager {
-    private static FileConfiguration config;
-
-    public static void loadConfig() {
-        String fileName = "language.yml";
-        // create config
-        File customConfigFile = new File(plugin.getDataFolder(), fileName);
-        if (!customConfigFile.exists()) {
-            customConfigFile.getParentFile().mkdirs();
-            plugin.saveResource(fileName, false);
-        }
+    private static final CustomConfig customConfig = new CustomConfig("language.yml");
+    private static final FileConfiguration config = customConfig.getConfig();
 
-        config = new YamlConfiguration();
-        try {
-            config.load(customConfigFile);
-        } catch (IOException | InvalidConfigurationException e) {
-            e.printStackTrace();
-        }
-        /* User Edit:
-            Instead of the above Try/Catch, you can also use
-            YamlConfiguration.loadConfiguration(customConfigFile)
-        */
+    public static void init() {
+        customConfig.saveDefaultConfig();
     }
 
-
     public static String fromKey(String key) {
         return fromKeyNoPrefix("prefix") + fromKeyNoPrefix(key);
     }
-- 
cgit v1.2.3