feat: add redirect to Removed Config

This commit is contained in:
Helvetica Volubi
2025-05-18 12:58:13 +08:00
parent 72f49cfafe
commit 897ee50d29
5 changed files with 75 additions and 46 deletions

View File

@@ -1,9 +1,9 @@
--- /dev/null
+++ b/src/main/java/me/earthme/luminol/config/BasicTransferLogic.java
+++ b/src/main/java/me/earthme/luminol/config/DefaultTransferLogic.java
@@ -1,0 +_,7 @@
+package me.earthme.luminol.config;
+
+public class BasicTransferLogic {
+public class DefaultTransferLogic {
+ public Object transform(Object obj) {
+ return obj;
+ }

View File

@@ -1,6 +1,6 @@
--- /dev/null
+++ b/src/main/java/me/earthme/luminol/config/EnumConfigCategory.java
@@ -1,0 +_,19 @@
@@ -1,0 +_,20 @@
+package me.earthme.luminol.config;
+
+public enum EnumConfigCategory {
@@ -8,7 +8,8 @@
+ FIXES("fixes"),
+ MISC("misc"),
+ GAMEPLAY("gameplay"),
+ EXPERIMENT("experiment");
+ EXPERIMENT("experiment"),
+ REMOVED("removed");
+
+ private final String baseKeyName;
+

View File

@@ -1,15 +1,18 @@
--- /dev/null
+++ b/src/main/java/me/earthme/luminol/config/LuminolConfig.java
@@ -1,0 +_,268 @@
@@ -1,0 +_,269 @@
+package me.earthme.luminol.config;
+
+import com.electronwill.nightconfig.core.UnmodifiableConfig;
+import com.electronwill.nightconfig.core.file.CommentedFileConfig;
+import io.papermc.paper.threadedregions.RegionizedServer;
+import me.earthme.luminol.commands.LuminolConfigCommand;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.bukkit.Bukkit;
+import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Field;
@@ -23,46 +26,44 @@
+import java.util.concurrent.CompletableFuture;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class LuminolConfig {
+ public static final Logger logger = LogManager.getLogger();
+ private static final File baseConfigFolder = new File("luminol_config");
+ private static final File baseConfigFile = new File(baseConfigFolder,"luminol_global_config.toml");
+ private static final File baseConfigFile = new File(baseConfigFolder, "luminol_global_config.toml");
+ private static final Set<IConfigModule> allInstanced = new HashSet<>();
+ private static CommentedFileConfig configFileInstance;
+ public static boolean alreadyInited = false;
+ private static CommentedFileConfig configFileInstance;
+
+ public static void setupLatch(){
+ Bukkit.getCommandMap().register("luminolconfig","luminol",new LuminolConfigCommand());
+ public static void setupLatch() {
+ Bukkit.getCommandMap().register("luminolconfig", "luminol", new LuminolConfigCommand());
+ alreadyInited = true;
+ }
+
+ public static void reload(){
+ public static void reload() {
+ RegionizedServer.ensureGlobalTickThread("Reload luminol config off global region thread!");
+
+ dropAllInstanced();
+ try {
+ preLoadConfig();
+ finalizeLoadConfig();
+ }catch (Exception e){
+ } catch (Exception e) {
+ logger.error(e);
+ }
+ }
+
+ @Contract(" -> new")
+ public static @NotNull CompletableFuture<Void> reloadAsync(){
+ return CompletableFuture.runAsync(LuminolConfig::reload,task -> RegionizedServer.getInstance().addTask(() -> {
+ try{
+ public static @NotNull CompletableFuture<Void> reloadAsync() {
+ return CompletableFuture.runAsync(LuminolConfig::reload, task -> RegionizedServer.getInstance().addTask(() -> {
+ try {
+ task.run();
+ }catch (Exception e){
+ } catch (Exception e) {
+ logger.error(e);
+ }
+ }));
+ }
+
+ public static void dropAllInstanced(){
+ public static void dropAllInstanced() {
+ allInstanced.clear();
+ }
+
@@ -75,7 +76,7 @@
+ public static void preLoadConfig() throws IOException {
+ baseConfigFolder.mkdirs();
+
+ if (!baseConfigFile.exists()){
+ if (!baseConfigFile.exists()) {
+ baseConfigFile.createNewFile();
+ }
+
@@ -86,8 +87,8 @@
+ try {
+ instanceAllModule();
+ loadAllModules();
+ }catch (Exception e){
+ logger.error("Failed to load config modules!",e);
+ } catch (Exception e) {
+ logger.error("Failed to load config modules!", e);
+ throw new RuntimeException(e);
+ }
+
@@ -95,14 +96,14 @@
+ }
+
+ private static void loadAllModules() throws IllegalAccessException {
+ for (IConfigModule instanced : allInstanced){
+ for (IConfigModule instanced : allInstanced) {
+ loadForSingle(instanced);
+ }
+ }
+
+ private static void instanceAllModule() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
+ for (Class<?> clazz : getClasses("me.earthme.luminol.config.modules")){
+ if (IConfigModule.class.isAssignableFrom(clazz)){
+ for (Class<?> clazz : getClasses("me.earthme.luminol.config.modules")) {
+ if (IConfigModule.class.isAssignableFrom(clazz)) {
+ allInstanced.add((IConfigModule) clazz.getConstructor().newInstance());
+ }
+ }
@@ -119,7 +120,7 @@
+ boolean skipLoad = field.getAnnotation(DoNotLoad.class) != null || (alreadyInited && field.getAnnotation(HotReloadUnsupported.class) != null);
+ ConfigInfo configInfo = field.getAnnotation(ConfigInfo.class);
+
+ if (skipLoad || configInfo == null){
+ if (skipLoad || configInfo == null) {
+ continue;
+ }
+
@@ -127,16 +128,17 @@
+
+ field.setAccessible(true);
+ final Object currentValue = field.get(null);
+ boolean removed = fullConfigKeyName.equals("removed.removed_config.removed");
+
+ if (!configFileInstance.contains(fullConfigKeyName)){
+ if (!configFileInstance.contains(fullConfigKeyName) || removed) {
+ for (TransferringConfig transferringConfig : field.getAnnotationsByType(TransferringConfig.class)) {
+ final String oldConfigKeyName = String.join(".", transferringConfig.category()) + "." + transferringConfig.name();
+ Object oldValue = configFileInstance.get(oldConfigKeyName);
+ if (oldValue != null) {
+ boolean success = true;
+ if (transferringConfig.transfer()) {
+ if (transferringConfig.transfer() && !removed) {
+ try {
+ Object oldValueTransferred = ((BasicTransferLogic) transferringConfig.transferLogic().getDeclaredConstructor().newInstance()).transform(oldValue);
+ Object oldValueTransferred = ((DefaultTransferLogic) transferringConfig.transferLogic().getDeclaredConstructor().newInstance()).transform(oldValue);
+ configFileInstance.add(fullConfigKeyName, oldValueTransferred);
+ } catch (Exception e) {
+ success = false;
@@ -144,48 +146,47 @@
+ }
+ }
+
+ if (success) {
+ removeConfig(oldConfigKeyName, transferringConfig.category());
+ }
+ if (success) removeConfig(oldConfigKeyName, transferringConfig.category());
+ final String comments = configInfo.comments();
+
+ if (!comments.isBlank()){
+ configFileInstance.setComment(fullConfigKeyName,comments);
+ }
+ if (configFileInstance.get(fullConfigKeyName) != null) break;
+ if (!comments.isBlank()) configFileInstance.setComment(fullConfigKeyName, comments);
+
+ if (!removed && configFileInstance.get(fullConfigKeyName) != null) break;
+ }
+ }
+ if (configFileInstance.get(fullConfigKeyName) != null) continue;
+ if (currentValue == null){
+ if (currentValue == null) {
+ throw new UnsupportedOperationException("Config " + singleConfigModule.getBaseName() + "tried to add an null default value!");
+ }
+
+ final String comments = configInfo.comments();
+
+ if (!comments.isBlank()){
+ configFileInstance.setComment(fullConfigKeyName,comments);
+ if (!comments.isBlank()) {
+ configFileInstance.setComment(fullConfigKeyName, comments);
+ }
+
+ configFileInstance.add(fullConfigKeyName,currentValue);
+ configFileInstance.add(fullConfigKeyName, currentValue);
+ continue;
+ }
+
+ final Object actuallyValue = configFileInstance.get(fullConfigKeyName);
+ field.set(null,actuallyValue);
+ field.set(null, actuallyValue);
+ }
+ }
+ }
+
+ public static void removeConfig(String name,String[] keys) {
+ public static void removeConfig(String name, String[] keys) {
+ configFileInstance.remove(name);
+ if (configFileInstance.get(String.join(".", keys)) instanceof UnmodifiableConfig) {
+ Object configAtPath = configFileInstance.get(String.join(".", keys));
+ if (configAtPath instanceof UnmodifiableConfig && ((UnmodifiableConfig) configAtPath).isEmpty()) {
+ removeConfig(keys);
+ }
+ }
+
+ public static void removeConfig(String[] keys) {
+ configFileInstance.remove(String.join(".", keys));
+ if (configFileInstance.get(String.join(".", Arrays.copyOfRange(keys, 1, keys.length))) instanceof UnmodifiableConfig) {
+ Object configAtPath = configFileInstance.get(String.join(".", Arrays.copyOfRange(keys, 1, keys.length)));
+ if (configAtPath instanceof UnmodifiableConfig && ((UnmodifiableConfig) configAtPath).isEmpty()) {
+ removeConfig(Arrays.copyOfRange(keys, 1, keys.length));
+ }
+ }

View File

@@ -1,9 +1,11 @@
--- /dev/null
+++ b/src/main/java/me/earthme/luminol/config/TransferringConfig.java
@@ -1,0 +_,20 @@
@@ -1,0 +_,22 @@
+package me.earthme.luminol.config;
+
+import java.lang.annotation.*;
+import java.lang.annotation.Repeatable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Repeatable(TransferringConfig.List.class)
@@ -14,7 +16,7 @@
+
+ boolean transfer() default true;
+
+ Class<?> transferLogic() default BasicTransferLogic.class;
+ Class<?> transferLogic() default DefaultTransferLogic.class;
+
+ @Retention(RetentionPolicy.RUNTIME)
+ @interface List {

View File

@@ -0,0 +1,25 @@
--- /dev/null
+++ b/src/main/java/me/earthme/luminol/config/modules/removed/RemovedConfig.java
@@ -1,0 +_,22 @@
+package me.earthme.luminol.config.modules.removed;
+
+import me.earthme.luminol.config.*;
+
+public class RemovedConfig implements IConfigModule {
+ @TransferringConfig(name = "example", category = {"removed", "example"}, transfer = false)
+ @DoNotLoad
+ @ConfigInfo(baseName = "removed", comments =
+ """
+ RemovedConfig redirect to here, no any function.""")
+ public static boolean enabled = true;
+
+ @Override
+ public EnumConfigCategory getCategory() {
+ return EnumConfigCategory.REMOVED;
+ }
+
+ @Override
+ public String getBaseName() {
+ return "removed_config";
+ }
+}